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