From c6e6911aed7687b94fba52485d89f0903e102d0e Mon Sep 17 00:00:00 2001 From: couriersud Date: Thu, 23 Jun 2016 02:04:40 +0200 Subject: Netlist changes - Replaced shared_ptr by unique_ptr. - Better seperation of setup_t and netlist_t. - Fixed bugs in rdtsc code. Refactored timer code. - Simplify conditional activation/deactivation. - Introduced HINT(device, hint) to clarify that hints are inheritent and not specific to devices. - Added improved profiling support to netlist. Statistics output now proposes devices for which whole device activation/deactivation be disabled. No significant improvement for pong, but breakout experiences a 10% improvement. - Moved options code from include to cpp file. - Minor modifications to 7493 and 9316 - Introduced perftime_t and perfcount_t for gathering statistics. These templates do not create any code if statistics are not kept. - Make help2man ./nltool produce usuable output. - More truthtable refactoring. Removed half-finished code for internal state support. As implemented, this would have had no support for timing delays. [Couriersud] --- src/lib/netlist/nl_setup.cpp | 90 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 76 insertions(+), 14 deletions(-) (limited to 'src/lib/netlist/nl_setup.cpp') 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 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(e.second) + || factory().is_class(e.second) + || factory().is_class(e.second) + || factory().is_class(e.second)) + { + auto dev = plib::owned_ptr(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("mainclock"); + netlist().m_solver = netlist().get_single_device("solver"); + netlist().m_gnd = netlist().get_single_device("gnd"); + netlist().m_params = netlist().get_single_device("parameter"); + + /* create devices */ + + for (auto & e : m_device_factory) + { + if ( !factory().is_class(e.second) + && !factory().is_class(e.second) + && !factory().is_class(e.second) + && !factory().is_class(e.second)) + { + auto dev = plib::owned_ptr(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 &setup_t::log() +{ + return netlist().log(); +} +const plib::plog_base &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; -- cgit v1.2.3-70-g09d2