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.cpp70
1 files changed, 57 insertions, 13 deletions
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp
index 830d9305327..9de53e2a45f 100644
--- a/src/lib/netlist/nl_setup.cpp
+++ b/src/lib/netlist/nl_setup.cpp
@@ -100,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))
@@ -454,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;
}
@@ -472,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())
@@ -515,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
{
@@ -782,10 +773,63 @@ 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();
}