summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/nl_setup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/nl_setup.cpp')
-rw-r--r--src/lib/netlist/nl_setup.cpp90
1 files changed, 76 insertions, 14 deletions
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp
index 5b7099a9e14..0582f8a9070 100644
--- a/src/lib/netlist/nl_setup.cpp
+++ b/src/lib/netlist/nl_setup.cpp
@@ -16,6 +16,7 @@
#include "nl_parser.h"
#include "nl_factory.h"
#include "devices/net_lib.h"
+#include "devices/nld_truthtable.h"
#include "devices/nlid_system.h"
#include "analog/nld_twoterm.h"
#include "solver/nld_solver.h"
@@ -99,15 +100,6 @@ void setup_t::namespace_pop()
m_namespace_stack.pop();
}
-
-void setup_t::register_dev(plib::owned_ptr<device_t> dev)
-{
- for (auto & d : netlist().m_devices)
- if (d->name() == dev->name())
- log().fatal("Error adding {1} to device list. Duplicate name \n", d->name());
- netlist().m_devices.push_back(std::move(dev));
-}
-
void setup_t::register_lib_entry(const pstring &name)
{
if (plib::container::contains(m_lib, name))
@@ -453,7 +445,7 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out)
proxy = new_proxy.get();
- register_dev(std::move(new_proxy));
+ netlist().register_dev(std::move(new_proxy));
}
return proxy;
}
@@ -471,7 +463,7 @@ void setup_t::connect_input_output(core_terminal_t &in, core_terminal_t &out)
proxy->m_Q.net().register_con(in);
out.net().register_con(proxy->m_I);
- register_dev(std::move(proxy));
+ netlist().register_dev(std::move(proxy));
}
else if (out.is_logic() && in.is_analog())
@@ -514,7 +506,7 @@ void setup_t::connect_terminal_input(terminal_t &term, core_terminal_t &inp)
else
proxy->m_Q.net().register_con(inp);
- register_dev(std::move(proxy));
+ netlist().register_dev(std::move(proxy));
}
else
{
@@ -781,13 +773,77 @@ void setup_t::start_devices()
auto nc = factory().factory_by_name("LOG")->Create(netlist(), name);
register_link(name + ".I", ll);
log().debug(" dynamic link {1}: <{2}>\n",ll, name);
- register_dev(std::move(nc));
+ netlist().register_dev(std::move(nc));
+ }
+ }
+
+ /* make sure the solver and parameters are started first! */
+
+ for (auto & e : m_device_factory)
+ {
+ if ( factory().is_class<devices::NETLIB_NAME(mainclock)>(e.second)
+ || factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
+ || factory().is_class<devices::NETLIB_NAME(gnd)>(e.second)
+ || factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
+ {
+ auto dev = plib::owned_ptr<device_t>(e.second->Create(netlist(), e.first));
+ netlist().register_dev(std::move(dev));
+ }
+ }
+
+ log().debug("Searching for mainclock and solver ...\n");
+
+ netlist().m_mainclock = netlist().get_single_device<devices::NETLIB_NAME(mainclock)>("mainclock");
+ netlist().m_solver = netlist().get_single_device<devices::NETLIB_NAME(solver)>("solver");
+ netlist().m_gnd = netlist().get_single_device<devices::NETLIB_NAME(gnd)>("gnd");
+ netlist().m_params = netlist().get_single_device<devices::NETLIB_NAME(netlistparams)>("parameter");
+
+ /* create devices */
+
+ for (auto & e : m_device_factory)
+ {
+ if ( !factory().is_class<devices::NETLIB_NAME(mainclock)>(e.second)
+ && !factory().is_class<devices::NETLIB_NAME(solver)>(e.second)
+ && !factory().is_class<devices::NETLIB_NAME(gnd)>(e.second)
+ && !factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
+ {
+ auto dev = plib::owned_ptr<device_t>(e.second->Create(netlist(), e.first));
+ netlist().register_dev(std::move(dev));
+ }
+ }
+
+ bool use_deactivate = (netlist().m_params->m_use_deactivate.Value() ? true : false);
+
+ for (auto &d : netlist().m_devices)
+ {
+ if (use_deactivate)
+ {
+ auto p = m_param_values.find(d->name() + ".HINT_NO_DEACTIVATE");
+ if (p != m_param_values.end())
+ {
+ //FIXME: Error checking
+ auto v = p->second.as_long();
+ d->set_hint_deactivate(!v);
+ }
}
+ else
+ d->set_hint_deactivate(false);
}
netlist().start();
+
}
+plib::plog_base<NL_DEBUG> &setup_t::log()
+{
+ return netlist().log();
+}
+const plib::plog_base<NL_DEBUG> &setup_t::log() const
+{
+ return netlist().log();
+}
+
+
// ----------------------------------------------------------------------------------------
// Model / family
// ----------------------------------------------------------------------------------------
@@ -926,13 +982,19 @@ nl_double setup_t::model_value(model_map_t &map, const pstring &entity)
return tmp.as_double() * factor;
}
+void setup_t::tt_factory_create(tt_desc &desc)
+{
+ devices::tt_factory_create(*this, desc);
+}
+
+
// ----------------------------------------------------------------------------------------
// Sources
// ----------------------------------------------------------------------------------------
void setup_t::include(const pstring &netlist_name)
{
- for (auto source : m_sources)
+ for (auto &source : m_sources)
{
if (source->parse(*this, netlist_name))
return;