diff options
Diffstat (limited to 'src/lib/netlist/nl_setup.cpp')
-rw-r--r-- | src/lib/netlist/nl_setup.cpp | 70 |
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(); } |