diff options
33 files changed, 271 insertions, 212 deletions
diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index 49ed1e3fe05..75aa472e7e5 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -117,7 +117,7 @@ namespace { class NETLIB_NAME(analog_callback) : public netlist::device_t { public: - NETLIB_NAME(analog_callback)(netlist::netlist_t &anetlist, const pstring &name) + NETLIB_NAME(analog_callback)(netlist::netlist_base_t &anetlist, const pstring &name) : device_t(anetlist, name) , m_in(*this, "IN") , m_cpu_device(nullptr) @@ -165,7 +165,7 @@ private: class NETLIB_NAME(logic_callback) : public netlist::device_t { public: - NETLIB_NAME(logic_callback)(netlist::netlist_t &anetlist, const pstring &name) + NETLIB_NAME(logic_callback)(netlist::netlist_base_t &anetlist, const pstring &name) : device_t(anetlist, name) , m_in(*this, "IN") , m_cpu_device(nullptr) @@ -273,7 +273,7 @@ std::unique_ptr<plib::pistream> netlist_data_memregions_t::stream(const pstring class NETLIB_NAME(sound_out) : public netlist::device_t { public: - NETLIB_NAME(sound_out)(netlist::netlist_t &anetlist, const pstring &name) + NETLIB_NAME(sound_out)(netlist::netlist_base_t &anetlist, const pstring &name) : netlist::device_t(anetlist, name) , m_channel(*this, "CHAN", 0) , m_mult(*this, "MULT", 1000.0) @@ -311,7 +311,7 @@ public: NETLIB_UPDATEI() { nl_double val = m_in() * m_mult() + m_offset(); - sound_update(netlist().time()); + sound_update(exec().time()); /* ignore spikes */ if (std::abs(val) < 32767.0) m_cur = val; @@ -355,7 +355,7 @@ public: static const int MAX_INPUT_CHANNELS = 16; - NETLIB_NAME(sound_in)(netlist::netlist_t &anetlist, const pstring &name) + NETLIB_NAME(sound_in)(netlist::netlist_base_t &anetlist, const pstring &name) : netlist::device_t(anetlist, name) , m_inc(netlist::netlist_time::from_nsec(1)) , m_feedback(*this, "FB") // clock part diff --git a/src/lib/netlist/analog/nld_bjt.cpp b/src/lib/netlist/analog/nld_bjt.cpp index 83182847082..cf963465b09 100644 --- a/src/lib/netlist/analog/nld_bjt.cpp +++ b/src/lib/netlist/analog/nld_bjt.cpp @@ -185,8 +185,8 @@ NETLIB_OBJECT_DERIVED(QBJT_switch, QBJT) , m_RB(*this, "m_RB", true) , m_RC(*this, "m_RC", true) , m_BC_dummy(*this, "m_BC", true) - , m_gB(NETLIST_GMIN_DEFAULT) - , m_gC(NETLIST_GMIN_DEFAULT) + , m_gB(1e-9) + , m_gC(1e-9) , m_V(0.0) , m_state_on(*this, "m_state_on", 0) { @@ -299,10 +299,10 @@ NETLIB_RESET(QBJT_switch) m_state_on = 0; - m_RB.set(netlist().gmin(), 0.0, 0.0); - m_RC.set(netlist().gmin(), 0.0, 0.0); + m_RB.set(exec().gmin(), 0.0, 0.0); + m_RC.set(exec().gmin(), 0.0, 0.0); - m_BC_dummy.set(netlist().gmin() / 10.0, 0.0, 0.0); + m_BC_dummy.set(exec().gmin() / 10.0, 0.0, 0.0); } @@ -341,8 +341,8 @@ NETLIB_UPDATE_PARAM(QBJT_switch) //m_gB = d.gI(0.005 / alpha); - if (m_gB < netlist().gmin()) - m_gB = netlist().gmin(); + if (m_gB < exec().gmin()) + m_gB = exec().gmin(); m_gC = d.gI(0.005); // very rough estimate } @@ -353,8 +353,8 @@ NETLIB_UPDATE_TERMINALS(QBJT_switch) const unsigned new_state = (m_RB.deltaV() * m > m_V ) ? 1 : 0; if (m_state_on ^ new_state) { - const nl_double gb = new_state ? m_gB : netlist().gmin(); - const nl_double gc = new_state ? m_gC : netlist().gmin(); + const nl_double gb = new_state ? m_gB : exec().gmin(); + const nl_double gc = new_state ? m_gC : exec().gmin(); const nl_double v = new_state ? m_V * m : 0; m_RB.set(gb, v, 0.0); @@ -423,8 +423,8 @@ NETLIB_UPDATE_PARAM(QBJT_EB) m_alpha_f = BF / (1.0 + BF); m_alpha_r = BR / (1.0 + BR); - m_gD_BE.set_param(IS / m_alpha_f, NF, netlist().gmin()); - m_gD_BC.set_param(IS / m_alpha_r, NR, netlist().gmin()); + m_gD_BE.set_param(IS / m_alpha_f, NF, exec().gmin()); + m_gD_BC.set_param(IS / m_alpha_r, NR, exec().gmin()); } } //namespace analog diff --git a/src/lib/netlist/analog/nld_switches.cpp b/src/lib/netlist/analog/nld_switches.cpp index 1575551f260..042b61ce7e7 100644 --- a/src/lib/netlist/analog/nld_switches.cpp +++ b/src/lib/netlist/analog/nld_switches.cpp @@ -6,10 +6,13 @@ */ #include "nlid_twoterm.h" -#include "../nl_base.h" -#include "../nl_factory.h" +#include "netlist/nl_base.h" +#include "netlist/nl_factory.h" +#include "netlist/solver/nld_solver.h" -#define R_OFF (1.0 / netlist().gmin()) +/* FIXME : convert to parameters */ + +#define R_OFF (1.0 / exec().gmin()) #define R_ON 0.01 namespace netlist diff --git a/src/lib/netlist/analog/nlid_twoterm.cpp b/src/lib/netlist/analog/nlid_twoterm.cpp index f54c2b3e68f..0f6fc3688c2 100644 --- a/src/lib/netlist/analog/nlid_twoterm.cpp +++ b/src/lib/netlist/analog/nlid_twoterm.cpp @@ -100,7 +100,7 @@ NETLIB_UPDATE(twoterm) NETLIB_RESET(R_base) { NETLIB_NAME(twoterm)::reset(); - set_R(1.0 / netlist().gmin()); + set_R(1.0 / exec().gmin()); } NETLIB_UPDATE(R_base) @@ -115,13 +115,13 @@ NETLIB_UPDATE(R_base) NETLIB_UPDATE_PARAM(R) { update_dev(); - set_R(std::max(m_R(), netlist().gmin())); + set_R(std::max(m_R(), exec().gmin())); } NETLIB_RESET(R) { NETLIB_NAME(twoterm)::reset(); - set_R(std::max(m_R(), netlist().gmin())); + set_R(std::max(m_R(), exec().gmin())); } // ---------------------------------------------------------------------------------------- @@ -134,8 +134,8 @@ NETLIB_RESET(POT) if (m_DialIsLog()) v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0); - m_R1.set_R(std::max(m_R() * v, netlist().gmin())); - m_R2.set_R(std::max(m_R() * (NL_FCONST(1.0) - v), netlist().gmin())); + m_R1.set_R(std::max(m_R() * v, exec().gmin())); + m_R2.set_R(std::max(m_R() * (NL_FCONST(1.0) - v), exec().gmin())); } NETLIB_UPDATE_PARAM(POT) @@ -147,8 +147,8 @@ NETLIB_UPDATE_PARAM(POT) if (m_DialIsLog()) v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0); - m_R1.set_R(std::max(m_R() * v, netlist().gmin())); - m_R2.set_R(std::max(m_R() * (NL_FCONST(1.0) - v), netlist().gmin())); + m_R1.set_R(std::max(m_R() * v, exec().gmin())); + m_R2.set_R(std::max(m_R() * (NL_FCONST(1.0) - v), exec().gmin())); } @@ -164,7 +164,7 @@ NETLIB_RESET(POT2) v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0); if (m_Reverse()) v = 1.0 - v; - m_R1.set_R(std::max(m_R() * v, netlist().gmin())); + m_R1.set_R(std::max(m_R() * v, exec().gmin())); } @@ -178,7 +178,7 @@ NETLIB_UPDATE_PARAM(POT2) v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0); if (m_Reverse()) v = 1.0 - v; - m_R1.set_R(std::max(m_R() * v, netlist().gmin())); + m_R1.set_R(std::max(m_R() * v, exec().gmin())); } // ---------------------------------------------------------------------------------------- @@ -188,13 +188,13 @@ NETLIB_UPDATE_PARAM(POT2) NETLIB_RESET(C) { // FIXME: Startup conditions - set(netlist().gmin(), 0.0, -5.0 / netlist().gmin()); - //set(netlist().gmin(), 0.0, 0.0); + set(exec().gmin(), 0.0, -5.0 / exec().gmin()); + //set(exec().gmin(), 0.0, 0.0); } NETLIB_UPDATE_PARAM(C) { - m_GParallel = netlist().gmin(); + m_GParallel = exec().gmin(); } NETLIB_UPDATE(C) @@ -218,7 +218,7 @@ NETLIB_TIMESTEP(C) NETLIB_RESET(L) { - m_GParallel = netlist().gmin(); + m_GParallel = exec().gmin(); m_I = 0.0; m_G = m_GParallel; set_mat( m_G, -m_G, -m_I, @@ -254,7 +254,7 @@ NETLIB_RESET(D) nl_double Is = m_model.m_IS; nl_double n = m_model.m_N; - m_D.set_param(Is, n, netlist().gmin()); + m_D.set_param(Is, n, exec().gmin()); set(m_D.G(), 0.0, m_D.Ieq()); } @@ -263,7 +263,7 @@ NETLIB_UPDATE_PARAM(D) nl_double Is = m_model.m_IS; nl_double n = m_model.m_N; - m_D.set_param(Is, n, netlist().gmin()); + m_D.set_param(Is, n, exec().gmin()); } NETLIB_UPDATE(D) @@ -299,7 +299,7 @@ NETLIB_UPDATE(VS) NETLIB_TIMESTEP(VS) { this->set(1.0 / m_R(), - m_compiled.evaluate(std::vector<double>({netlist().time().as_double()})), + m_compiled.evaluate(std::vector<double>({exec().time().as_double()})), 0.0); } @@ -324,7 +324,7 @@ NETLIB_UPDATE(CS) NETLIB_TIMESTEP(CS) { - const double I = m_compiled.evaluate(std::vector<double>({netlist().time().as_double()})); + const double I = m_compiled.evaluate(std::vector<double>({exec().time().as_double()})); set_mat(0.0, 0.0, -I, 0.0, 0.0, I); } diff --git a/src/lib/netlist/analog/nlid_twoterm.h b/src/lib/netlist/analog/nlid_twoterm.h index 4ab5fcda89b..efb9a8dd929 100644 --- a/src/lib/netlist/analog/nlid_twoterm.h +++ b/src/lib/netlist/analog/nlid_twoterm.h @@ -55,7 +55,7 @@ namespace netlist return b ? *h : d2; } template<> - inline core_device_t &bselect(bool b, netlist_t &d1, core_device_t &d2) + inline core_device_t &bselect(bool b, netlist_base_t &d1, core_device_t &d2) { if (b) throw nl_exception("bselect with netlist and b==true"); diff --git a/src/lib/netlist/devices/nld_4066.cpp b/src/lib/netlist/devices/nld_4066.cpp index b5f3b2f6bf2..2871e4898ae 100644 --- a/src/lib/netlist/devices/nld_4066.cpp +++ b/src/lib/netlist/devices/nld_4066.cpp @@ -5,10 +5,12 @@ * */ -#include "nlid_cmos.h" -#include "../analog/nlid_twoterm.h" #include "nld_4066.h" +#include "nlid_cmos.h" +#include "netlist/analog/nlid_twoterm.h" +#include "netlist/solver/nld_solver.h" + namespace netlist { namespace devices @@ -39,7 +41,7 @@ namespace netlist { // Start in off condition // FIXME: is ROFF correct? - m_R.set_R(NL_FCONST(1.0) / netlist().gmin()); + m_R.set_R(NL_FCONST(1.0) / exec().gmin()); } @@ -54,7 +56,7 @@ namespace netlist if (in < low) { - R = NL_FCONST(1.0) / netlist().gmin(); + R = NL_FCONST(1.0) / exec().gmin(); } else if (in > high) { diff --git a/src/lib/netlist/devices/nld_4316.cpp b/src/lib/netlist/devices/nld_4316.cpp index 0bce54cc6c3..4290c65670c 100644 --- a/src/lib/netlist/devices/nld_4316.cpp +++ b/src/lib/netlist/devices/nld_4316.cpp @@ -5,9 +5,10 @@ * */ -#include "nlid_cmos.h" -#include "../analog/nlid_twoterm.h" #include "nld_4316.h" +#include "nlid_cmos.h" +#include "netlist/analog/nlid_twoterm.h" +#include "netlist/solver/nld_solver.h" namespace netlist { namespace devices { @@ -37,7 +38,7 @@ namespace netlist { namespace devices { NETLIB_RESET(CD4316_GATE) { - m_R.set_R(NL_FCONST(1.0) / netlist().gmin()); + m_R.set_R(NL_FCONST(1.0) / exec().gmin()); } NETLIB_UPDATE(CD4316_GATE) @@ -46,7 +47,7 @@ namespace netlist { namespace devices { if (m_S() && !m_E()) m_R.set_R(m_base_r()); else - m_R.set_R(NL_FCONST(1.0) / netlist().gmin()); + m_R.set_R(NL_FCONST(1.0) / exec().gmin()); m_R.m_P.schedule_solve_after(NLTIME_FROM_NS(1)); } diff --git a/src/lib/netlist/devices/nld_log.cpp b/src/lib/netlist/devices/nld_log.cpp index 1d3ea7b1b75..03f7cae779c 100644 --- a/src/lib/netlist/devices/nld_log.cpp +++ b/src/lib/netlist/devices/nld_log.cpp @@ -27,7 +27,7 @@ namespace netlist NETLIB_UPDATEI() { /* use pstring::sprintf, it is a LOT faster */ - m_writer.writeline(plib::pfmt("{1:.9} {2}").e(netlist().time().as_double()).e(static_cast<double>(m_I()))); + m_writer.writeline(plib::pfmt("{1:.9} {2}").e(exec().time().as_double()).e(static_cast<double>(m_I()))); } NETLIB_RESETI() { } @@ -46,7 +46,7 @@ namespace netlist NETLIB_UPDATEI() { - m_writer.writeline(plib::pfmt("{1:.9} {2}").e(netlist().time().as_double()).e(static_cast<double>(m_I() - m_I2()))); + m_writer.writeline(plib::pfmt("{1:.9} {2}").e(exec().time().as_double()).e(static_cast<double>(m_I() - m_I2()))); } NETLIB_RESETI() { } diff --git a/src/lib/netlist/devices/nlid_proxy.cpp b/src/lib/netlist/devices/nlid_proxy.cpp index 4c3ec6f67aa..c5ad63f3910 100644 --- a/src/lib/netlist/devices/nlid_proxy.cpp +++ b/src/lib/netlist/devices/nlid_proxy.cpp @@ -20,7 +20,7 @@ namespace netlist // nld_base_proxy // ----------------------------------------------------------------------------- - nld_base_proxy::nld_base_proxy(netlist_t &anetlist, const pstring &name, + nld_base_proxy::nld_base_proxy(netlist_base_t &anetlist, const pstring &name, logic_t *inout_proxied, detail::core_terminal_t *proxy_inout) : device_t(anetlist, name) { @@ -37,7 +37,7 @@ namespace netlist // nld_a_to_d_proxy // ---------------------------------------------------------------------------------------- - nld_base_a_to_d_proxy::nld_base_a_to_d_proxy(netlist_t &anetlist, const pstring &name, + nld_base_a_to_d_proxy::nld_base_a_to_d_proxy(netlist_base_t &anetlist, const pstring &name, logic_input_t *in_proxied, detail::core_terminal_t *in_proxy) : nld_base_proxy(anetlist, name, in_proxied, in_proxy) , m_Q(*this, "Q") @@ -46,7 +46,7 @@ namespace netlist nld_base_a_to_d_proxy::~nld_base_a_to_d_proxy() {} - nld_a_to_d_proxy::nld_a_to_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *in_proxied) + nld_a_to_d_proxy::nld_a_to_d_proxy(netlist_base_t &anetlist, const pstring &name, logic_input_t *in_proxied) : nld_base_a_to_d_proxy(anetlist, name, in_proxied, &m_I) , m_I(*this, "I") { @@ -81,7 +81,7 @@ namespace netlist // nld_d_to_a_proxy // ---------------------------------------------------------------------------------------- - nld_base_d_to_a_proxy::nld_base_d_to_a_proxy(netlist_t &anetlist, const pstring &name, + nld_base_d_to_a_proxy::nld_base_d_to_a_proxy(netlist_base_t &anetlist, const pstring &name, logic_output_t *out_proxied, detail::core_terminal_t &proxy_out) : nld_base_proxy(anetlist, name, out_proxied, &proxy_out) , m_I(*this, "I") @@ -92,7 +92,7 @@ namespace netlist { } - nld_d_to_a_proxy::nld_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied) + nld_d_to_a_proxy::nld_d_to_a_proxy(netlist_base_t &anetlist, const pstring &name, logic_output_t *out_proxied) : nld_base_d_to_a_proxy(anetlist, name, out_proxied, m_RV.m_P) , m_GNDHack(*this, "_Q") , m_RV(*this, "RV") diff --git a/src/lib/netlist/devices/nlid_proxy.h b/src/lib/netlist/devices/nlid_proxy.h index 821cfa56d9d..eb1f2b3fe87 100644 --- a/src/lib/netlist/devices/nlid_proxy.h +++ b/src/lib/netlist/devices/nlid_proxy.h @@ -26,7 +26,7 @@ namespace netlist NETLIB_OBJECT(base_proxy) { public: - nld_base_proxy(netlist_t &anetlist, const pstring &name, + nld_base_proxy(netlist_base_t &anetlist, const pstring &name, logic_t *inout_proxied, detail::core_terminal_t *proxy_inout); virtual ~nld_base_proxy(); @@ -55,7 +55,7 @@ namespace netlist protected: - nld_base_a_to_d_proxy(netlist_t &anetlist, const pstring &name, + nld_base_a_to_d_proxy(netlist_base_t &anetlist, const pstring &name, logic_input_t *in_proxied, detail::core_terminal_t *in_proxy); private: @@ -67,7 +67,7 @@ namespace netlist NETLIB_OBJECT_DERIVED(a_to_d_proxy, base_a_to_d_proxy) { public: - nld_a_to_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *in_proxied); + nld_a_to_d_proxy(netlist_base_t &anetlist, const pstring &name, logic_input_t *in_proxied); virtual ~nld_a_to_d_proxy() override; @@ -93,7 +93,7 @@ namespace netlist virtual logic_input_t &in() { return m_I; } protected: - nld_base_d_to_a_proxy(netlist_t &anetlist, const pstring &name, + nld_base_d_to_a_proxy(netlist_base_t &anetlist, const pstring &name, logic_output_t *out_proxied, detail::core_terminal_t &proxy_out); logic_input_t m_I; @@ -104,7 +104,7 @@ namespace netlist NETLIB_OBJECT_DERIVED(d_to_a_proxy, base_d_to_a_proxy) { public: - nld_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied); + nld_d_to_a_proxy(netlist_base_t &anetlist, const pstring &name, logic_output_t *out_proxied); virtual ~nld_d_to_a_proxy() override {} protected: diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index d1a8a04bb41..6acda365c8f 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -65,7 +65,7 @@ namespace netlist logic_net_t &net = m_Q.net(); // this is only called during setup ... net.toggle_new_Q(); - net.set_time(netlist().time() + m_inc); + net.set_time(exec().time() + m_inc); } public: diff --git a/src/lib/netlist/devices/nlid_truthtable.cpp b/src/lib/netlist/devices/nlid_truthtable.cpp index 0b53652df6c..4cebc8c1b4c 100644 --- a/src/lib/netlist/devices/nlid_truthtable.cpp +++ b/src/lib/netlist/devices/nlid_truthtable.cpp @@ -233,7 +233,7 @@ namespace netlist : netlist_base_factory_truthtable_t(name, classname, def_param, sourcefile) { } - plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override + plib::owned_ptr<device_t> Create(netlist_base_t &anetlist, const pstring &name) override { typedef nld_truthtable_t<m_NI, m_NO> tt_type; truthtable_parser desc_s(m_NO, m_NI, &m_ttbl.m_initialized, diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index d3de32d7d62..9c19d10f0c9 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -90,15 +90,15 @@ public: m_R_low = 1.0; m_R_high = 130.0; } - virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override; - virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override; + virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_base_t &anetlist, const pstring &name, logic_output_t *proxied) const override; + virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_base_t &anetlist, const pstring &name, logic_input_t *proxied) const override; }; -plib::owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_ttl_t::create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const +plib::owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_ttl_t::create_d_a_proxy(netlist_base_t &anetlist, const pstring &name, logic_output_t *proxied) const { return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied); } -plib::owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_ttl_t::create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const +plib::owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_ttl_t::create_a_d_proxy(netlist_base_t &anetlist, const pstring &name, logic_input_t *proxied) const { return plib::owned_ptr<devices::nld_base_a_to_d_proxy>::Create<devices::nld_a_to_d_proxy>(anetlist, name, proxied); } @@ -117,15 +117,15 @@ public: m_R_low = 10.0; m_R_high = 10.0; } - virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override; - virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override; + virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_base_t &anetlist, const pstring &name, logic_output_t *proxied) const override; + virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_base_t &anetlist, const pstring &name, logic_input_t *proxied) const override; }; -plib::owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_cd4xxx_t::create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const +plib::owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_cd4xxx_t::create_d_a_proxy(netlist_base_t &anetlist, const pstring &name, logic_output_t *proxied) const { return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied); } -plib::owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_cd4xxx_t::create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const +plib::owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_cd4xxx_t::create_a_d_proxy(netlist_base_t &anetlist, const pstring &name, logic_input_t *proxied) const { return plib::owned_ptr<devices::nld_base_a_to_d_proxy>::Create<devices::nld_a_to_d_proxy>(anetlist, name, proxied); } @@ -168,7 +168,7 @@ void detail::queue_t::on_pre_save() { netlist().log().debug("on_pre_save\n"); m_qsize = this->size(); - netlist().log().debug("current time {1} qsize {2}\n", netlist().time().as_double(), m_qsize); + netlist().log().debug("current time {1} qsize {2}\n", exec().time().as_double(), m_qsize); for (std::size_t i = 0; i < m_qsize; i++ ) { m_times[i] = this->listptr()[i].m_exec_time.as_raw(); @@ -180,7 +180,7 @@ void detail::queue_t::on_pre_save() void detail::queue_t::on_post_load() { this->clear(); - netlist().log().debug("current time {1} qsize {2}\n", netlist().time().as_double(), m_qsize); + netlist().log().debug("current time {1} qsize {2}\n", exec().time().as_double(), m_qsize); for (std::size_t i = 0; i < m_qsize; i++ ) { detail::net_t *n = netlist().nets()[m_net_ids[i]].get(); @@ -240,35 +240,43 @@ detail::terminal_type detail::core_terminal_t::type() const // ---------------------------------------------------------------------------------------- netlist_t::netlist_t(const pstring &aname, std::unique_ptr<callbacks_t> callbacks) - : m_time(netlist_time::zero()) - , m_queue(*this) + : netlist_base_t(aname, std::move(callbacks)) + , m_time(netlist_time::zero()) , m_mainclock(nullptr) + , m_queue(*this) , m_solver(nullptr) - , m_params(nullptr) +{ + state().save_item(this, static_cast<plib::state_manager_t::callback_t &>(m_queue), "m_queue"); + state().save_item(this, m_time, "m_time"); +} + +netlist_t::~netlist_t() +{ +} + +// ---------------------------------------------------------------------------------------- +// netlist_t +// ---------------------------------------------------------------------------------------- + +netlist_base_t::netlist_base_t(const pstring &aname, std::unique_ptr<callbacks_t> callbacks) + :m_params(nullptr) , m_name(aname) , m_lib(nullptr) , m_state() , m_callbacks(std::move(callbacks)) // Order is important here , m_log(*m_callbacks) { - state().save_item(this, static_cast<plib::state_manager_t::callback_t &>(m_queue), "m_queue"); - state().save_item(this, m_time, "m_time"); m_setup = plib::make_unique<setup_t>(*this); NETLIST_NAME(base)(*m_setup); } -netlist_t::~netlist_t() +netlist_base_t::~netlist_base_t() { m_nets.clear(); m_devices.clear(); } -nl_double netlist_t::gmin() const NL_NOEXCEPT -{ - return solver()->gmin(); -} - -void netlist_t::register_dev(plib::owned_ptr<core_device_t> dev) +void netlist_base_t::register_dev(plib::owned_ptr<core_device_t> dev) { for (auto & d : m_devices) if (d->name() == dev->name()) @@ -276,7 +284,7 @@ void netlist_t::register_dev(plib::owned_ptr<core_device_t> dev) m_devices.push_back(std::move(dev)); } -void netlist_t::remove_dev(core_device_t *dev) +void netlist_base_t::remove_dev(core_device_t *dev) { m_devices.erase( std::remove_if( @@ -290,7 +298,23 @@ void netlist_t::remove_dev(core_device_t *dev) ); } -void netlist_t::prepare_to_run() +void netlist_base_t::delete_empty_nets() +{ + m_nets.erase( + std::remove_if(m_nets.begin(), m_nets.end(), + [](plib::owned_ptr<detail::net_t> &x) + { + if (x->num_cons() == 0) + { + x->netlist().log().verbose("Deleting net {1} ...", x->name()); + return true; + } + else + return false; + }), m_nets.end()); +} + +void netlist_base_t::prepare_to_run() { setup().register_dynamic_log_devices(); @@ -310,7 +334,7 @@ void netlist_t::prepare_to_run() log().debug("Searching for solver and parameters ...\n"); - m_solver = get_single_device<devices::NETLIB_NAME(solver)>("solver"); + auto solver = get_single_device<devices::NETLIB_NAME(solver)>("solver"); m_params = get_single_device<devices::NETLIB_NAME(netlistparams)>("parameter"); /* create devices */ @@ -326,9 +350,6 @@ void netlist_t::prepare_to_run() } } - log().debug("Searching for mainclock\n"); - m_mainclock = get_single_device<devices::NETLIB_NAME(mainclock)>("mainclock"); - bool use_deactivate = (m_params->m_use_deactivate() ? true : false); for (auto &d : m_devices) @@ -370,14 +391,14 @@ void netlist_t::prepare_to_run() log().verbose("initialize solver ...\n"); - if (m_solver == nullptr) + if (solver == nullptr) { for (auto &p : m_nets) if (p->is_analog()) log().fatal(MF_0_NO_SOLVER); } else - m_solver->post_start(); + solver->post_start(); for (auto &n : m_nets) for (auto & term : n->m_core_terms) @@ -398,7 +419,7 @@ void netlist_t::stop() m_solver->stop(); } -detail::net_t *netlist_t::find_net(const pstring &name) const +detail::net_t *netlist_base_t::find_net(const pstring &name) const { for (auto & net : m_nets) if (net->name() == name) @@ -407,7 +428,7 @@ detail::net_t *netlist_t::find_net(const pstring &name) const return nullptr; } -std::size_t netlist_t::find_net_id(const detail::net_t *net) const +std::size_t netlist_base_t::find_net_id(const detail::net_t *net) const { for (std::size_t i = 0; i < m_nets.size(); i++) if (m_nets[i].get() == net) @@ -417,7 +438,7 @@ std::size_t netlist_t::find_net_id(const detail::net_t *net) const -void netlist_t::rebuild_lists() +void netlist_base_t::rebuild_lists() { for (auto & net : m_nets) net->rebuild_list(); @@ -426,6 +447,12 @@ void netlist_t::rebuild_lists() void netlist_t::reset() { + log().debug("Searching for mainclock\n"); + m_mainclock = get_single_device<devices::NETLIB_NAME(mainclock)>("mainclock"); + + log().debug("Searching for solver\n"); + m_solver = get_single_device<devices::NETLIB_NAME(solver)>("solver"); + m_time = netlist_time::zero(); m_queue.clear(); if (m_mainclock != nullptr) @@ -638,7 +665,7 @@ void netlist_t::print_stats() const } } -core_device_t *netlist_t::get_single_device(const pstring &classname, bool (*cc)(core_device_t *)) const +core_device_t *netlist_base_t::get_single_device(const pstring &classname, bool (*cc)(core_device_t *)) const { core_device_t *ret = nullptr; for (auto &d : m_devices) @@ -659,7 +686,7 @@ core_device_t *netlist_t::get_single_device(const pstring &classname, bool (*cc) // core_device_t // ---------------------------------------------------------------------------------------- -core_device_t::core_device_t(netlist_t &owner, const pstring &name) +core_device_t::core_device_t(netlist_base_t &owner, const pstring &name) : object_t(name) , logic_family_t() , netlist_ref(owner) @@ -700,7 +727,7 @@ log_type & core_device_t::log() // device_t // ---------------------------------------------------------------------------------------- -device_t::device_t(netlist_t &owner, const pstring &name) +device_t::device_t(netlist_base_t &owner, const pstring &name) : core_device_t(owner, name) { } @@ -780,7 +807,7 @@ detail::family_setter_t::family_setter_t(core_device_t &dev, const logic_family_ // net_t // ---------------------------------------------------------------------------------------- -detail::net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr) +detail::net_t::net_t(netlist_base_t &nl, const pstring &aname, core_terminal_t *mr) : object_t(aname) , netlist_ref(nl) , m_new_Q(*this, "m_new_Q", 0) @@ -805,10 +832,10 @@ void detail::net_t::add_to_active_list(core_terminal_t &term) NL_NOEXCEPT railterminal().device().do_inc_active(); if (m_in_queue == QS_DELAYED_DUE_TO_INACTIVE) { - if (m_time > netlist().time()) + if (m_time > exec().time()) { m_in_queue = QS_QUEUED; /* pending */ - netlist().queue().push({m_time, this}); + exec().queue().push({m_time, this}); } else { @@ -934,7 +961,7 @@ void detail::net_t::move_connections(detail::net_t &dest_net) // logic_net_t // ---------------------------------------------------------------------------------------- -logic_net_t::logic_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr) +logic_net_t::logic_net_t(netlist_base_t &nl, const pstring &aname, detail::core_terminal_t *mr) : net_t(nl, aname, mr) { } @@ -947,7 +974,7 @@ logic_net_t::~logic_net_t() // analog_net_t // ---------------------------------------------------------------------------------------- -analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr) +analog_net_t::analog_net_t(netlist_base_t &nl, const pstring &aname, detail::core_terminal_t *mr) : net_t(nl, aname, mr) , m_cur_Analog(*this, "m_cur_Analog", 0.0) , m_solver(nullptr) diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 9871da2a9d1..3d8ef2401d5 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -211,6 +211,7 @@ namespace netlist class net_t; class setup_t; class netlist_t; + class netlist_base_t; class core_device_t; class device_t; class callbacks_t; @@ -246,9 +247,9 @@ namespace netlist logic_family_desc_t(); virtual ~logic_family_desc_t(); - virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name, + virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_base_t &anetlist, const pstring &name, logic_output_t *proxied) const = 0; - virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name, + virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_base_t &anetlist, const pstring &name, logic_input_t *proxied) const = 0; double fixed_V() const { return m_fixed_V; } @@ -424,16 +425,19 @@ namespace netlist struct detail::netlist_ref { - explicit constexpr netlist_ref(netlist_t &nl) : m_netlist(nl) { } + explicit constexpr netlist_ref(netlist_base_t &nl) : m_netlist(nl) { } - C14CONSTEXPR netlist_t & netlist() NL_NOEXCEPT { return m_netlist; } - constexpr const netlist_t & netlist() const NL_NOEXCEPT { return m_netlist; } + C14CONSTEXPR netlist_base_t & netlist() NL_NOEXCEPT { return m_netlist; } + constexpr const netlist_base_t & netlist() const NL_NOEXCEPT { return m_netlist; } + + netlist_t & exec() NL_NOEXCEPT { return *reinterpret_cast<netlist_t *>(&m_netlist); } + const netlist_t & exec() const NL_NOEXCEPT { return *reinterpret_cast<const netlist_t *>(&m_netlist); } protected: ~netlist_ref() = default; // prohibit polymorphic destruction private: - netlist_t & m_netlist; + netlist_base_t & m_netlist; }; @@ -465,8 +469,11 @@ namespace netlist /*! The netlist owning the owner of this object. * \returns reference to netlist object. */ - netlist_t &netlist() NL_NOEXCEPT; - const netlist_t &netlist() const NL_NOEXCEPT; + netlist_base_t &netlist() NL_NOEXCEPT; + const netlist_base_t &netlist() const NL_NOEXCEPT; + + netlist_t &exec() NL_NOEXCEPT; + const netlist_t &exec() const NL_NOEXCEPT; private: core_device_t & m_device; @@ -709,7 +716,7 @@ namespace netlist QS_DELIVERED }; - net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); + net_t(netlist_base_t &nl, const pstring &aname, core_terminal_t *mr = nullptr); virtual ~net_t(); void reset(); @@ -769,7 +776,7 @@ namespace netlist { public: - logic_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr); + logic_net_t(netlist_base_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr); virtual ~logic_net_t(); const netlist_sig_t & Q() const NL_NOEXCEPT { return m_cur_Q; } @@ -820,7 +827,7 @@ namespace netlist friend class detail::net_t; - analog_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr); + analog_net_t(netlist_base_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr); virtual ~analog_net_t(); @@ -1069,7 +1076,7 @@ namespace netlist public detail::netlist_ref { public: - core_device_t(netlist_t &owner, const pstring &name); + core_device_t(netlist_base_t &owner, const pstring &name); core_device_t(core_device_t &owner, const pstring &name); virtual ~core_device_t(); @@ -1141,7 +1148,7 @@ namespace netlist { public: - device_t(netlist_t &owner, const pstring &name); + device_t(netlist_base_t &owner, const pstring &name); device_t(core_device_t &owner, const pstring &name); virtual ~device_t() override; @@ -1224,31 +1231,14 @@ namespace netlist // netlist_t // ----------------------------------------------------------------------------- - - class netlist_t : private plib::nocopyassignmove + class netlist_base_t : private plib::nocopyassignmove { public: using nets_collection_type = std::vector<plib::owned_ptr<detail::net_t>>; - explicit netlist_t(const pstring &aname, std::unique_ptr<callbacks_t> callbacks); - ~netlist_t(); - - /* run functions */ - - const netlist_time &time() const NL_NOEXCEPT { return m_time; } - devices::NETLIB_NAME(solver) *solver() const NL_NOEXCEPT { return m_solver; } - - /* never use this in constructors! */ - nl_double gmin() const NL_NOEXCEPT; - - void process_queue(const netlist_time &delta) NL_NOEXCEPT; - void abort_current_queue_slice() NL_NOEXCEPT { m_queue.retime(detail::queue_t::entry_t(m_time, nullptr)); } - - const detail::queue_t &queue() const NL_NOEXCEPT { return m_queue; } - detail::queue_t &queue() NL_NOEXCEPT { return m_queue; } - - /* setup functions - not needed by execute interface */ + explicit netlist_base_t(const pstring &aname, std::unique_ptr<callbacks_t> callbacks); + ~netlist_base_t(); /* Control functions */ @@ -1330,41 +1320,23 @@ namespace netlist m_nets.push_back(std::move(net)); } - void delete_empty_nets() - { - m_nets.erase( - std::remove_if(m_nets.begin(), m_nets.end(), - [](plib::owned_ptr<detail::net_t> &x) - { - if (x->num_cons() == 0) - { - x->netlist().log().verbose("Deleting net {1} ...", x->name()); - return true; - } - else - return false; - }), m_nets.end()); - } + void delete_empty_nets(); /* sole use is to manage lifetime of family objects */ std::vector<std::pair<pstring, std::unique_ptr<logic_family_desc_t>>> m_family_cache; protected: - void print_stats() const; + /* sole use is to manage lifetime of net objects */ + std::vector<plib::owned_ptr<core_device_t>> m_devices; + nets_collection_type m_nets; private: core_device_t *get_single_device(const pstring &classname, bool (*cc)(core_device_t *)) const; - /* mostly rw */ - netlist_time m_time; - detail::queue_t m_queue; - /* mostly ro */ - devices::NETLIB_NAME(mainclock) * m_mainclock; - devices::NETLIB_NAME(solver) * m_solver; devices::NETLIB_NAME(netlistparams) *m_params; pstring m_name; @@ -1372,17 +1344,62 @@ namespace netlist plib::state_manager_t m_state; - // performance - nperftime_t<NL_KEEP_STATISTICS> m_stat_mainloop; - nperfcount_t<NL_KEEP_STATISTICS> m_perf_out_processed; - /* sole use is to manage lifetime of net objects */ - std::vector<plib::owned_ptr<core_device_t>> m_devices; - nets_collection_type m_nets; - - std::unique_ptr<callbacks_t> m_callbacks; + std::unique_ptr<callbacks_t> m_callbacks; log_type m_log; std::unique_ptr<setup_t> m_setup; + }; + + + class netlist_t : public netlist_base_t + { + public: + + using nets_collection_type = std::vector<plib::owned_ptr<detail::net_t>>; + + explicit netlist_t(const pstring &aname, std::unique_ptr<callbacks_t> callbacks); + ~netlist_t(); + + /* run functions */ + + const netlist_time &time() const NL_NOEXCEPT { return m_time; } + + void process_queue(const netlist_time &delta) NL_NOEXCEPT; + void abort_current_queue_slice() NL_NOEXCEPT { m_queue.retime(detail::queue_t::entry_t(m_time, nullptr)); } + + const detail::queue_t &queue() const NL_NOEXCEPT { return m_queue; } + detail::queue_t &queue() NL_NOEXCEPT { return m_queue; } + + /* Control functions */ + + void stop(); + void reset(); + + /* only used by nltool to create static c-code */ + devices::NETLIB_NAME(solver) *solver() const NL_NOEXCEPT { return m_solver; } + + /* force late type resolution */ + template <typename X = devices::NETLIB_NAME(solver)> + nl_double gmin(X *solv = nullptr) const NL_NOEXCEPT + { + return static_cast<X *>(m_solver)->gmin(); + } + + protected: + + void print_stats() const; + + private: + /* mostly rw */ + netlist_time m_time; + devices::NETLIB_NAME(mainclock) * m_mainclock; + detail::queue_t m_queue; + + devices::NETLIB_NAME(solver) * m_solver; + + // performance + nperftime_t<NL_KEEP_STATISTICS> m_stat_mainloop; + nperfcount_t<NL_KEEP_STATISTICS> m_perf_out_processed; }; // ----------------------------------------------------------------------------- @@ -1482,11 +1499,11 @@ namespace netlist if ((num_cons() != 0)) { if (is_queued()) - netlist().queue().remove(this); - m_time = netlist().time() + delay; + exec().queue().remove(this); + m_time = exec().time() + delay; m_in_queue = (!m_list_active.empty()) ? QS_QUEUED : QS_DELAYED_DUE_TO_INACTIVE; /* queued ? */ if (m_in_queue == QS_QUEUED) - netlist().queue().push(queue_t::entry_t(m_time, this)); + exec().queue().push(queue_t::entry_t(m_time, this)); } } @@ -1532,16 +1549,26 @@ namespace netlist } } - inline netlist_t &detail::device_object_t::netlist() NL_NOEXCEPT + inline netlist_base_t &detail::device_object_t::netlist() NL_NOEXCEPT { return m_device.netlist(); } - inline const netlist_t &detail::device_object_t::netlist() const NL_NOEXCEPT + inline const netlist_base_t &detail::device_object_t::netlist() const NL_NOEXCEPT { return m_device.netlist(); } + inline netlist_t &detail::device_object_t::exec() NL_NOEXCEPT + { + return m_device.exec(); + } + + inline const netlist_t &detail::device_object_t::exec() const NL_NOEXCEPT + { + return m_device.exec(); + } + template <typename T> template <typename O> state_var<T>::state_var(O &owner, const pstring &name, const T &value) diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h index b72e0ee9944..dd94981d4ee 100644 --- a/src/lib/netlist/nl_config.h +++ b/src/lib/netlist/nl_config.h @@ -49,9 +49,8 @@ // savings are eaten up by effort // FIXME: Convert into solver parameter #define USE_LINEAR_PREDICTION (0) -#define NETLIST_GMIN_DEFAULT (1e-9) - +#define NETLIST_GMIN_DEFAULT (1e-9) //============================================================ // DEBUGGING diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp index bfefe5dd5e0..973b1b7814f 100644 --- a/src/lib/netlist/nl_factory.cpp +++ b/src/lib/netlist/nl_factory.cpp @@ -20,7 +20,7 @@ namespace netlist { namespace factory class NETLIB_NAME(wrapper) : public device_t { public: - NETLIB_NAME(wrapper)(netlist_t &anetlist, const pstring &name) + NETLIB_NAME(wrapper)(netlist_base_t &anetlist, const pstring &name) : device_t(anetlist, name) { } @@ -91,12 +91,12 @@ factory::element_t * list_t::factory_by_name(const pstring &devname) // factory_lib_entry_t: factory class to wrap macro based chips/elements // ----------------------------------------------------------------------------- -plib::owned_ptr<device_t> library_element_t::Create(netlist_t &anetlist, const pstring &name) +plib::owned_ptr<device_t> library_element_t::Create(netlist_base_t &anetlist, const pstring &name) { return plib::owned_ptr<device_t>::Create<NETLIB_NAME(wrapper)>(anetlist, name); } -void library_element_t::macro_actions(netlist_t &anetlist, const pstring &name) +void library_element_t::macro_actions(netlist_base_t &anetlist, const pstring &name) { anetlist.setup().namespace_push(name); anetlist.setup().include(this->name()); diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h index 2e5ba33c8b1..77da4193951 100644 --- a/src/lib/netlist/nl_factory.h +++ b/src/lib/netlist/nl_factory.h @@ -40,7 +40,7 @@ factory::constructor_ptr_t decl_ ## chip = NETLIB_NAME(chip ## _c); namespace netlist { - class netlist_t; + class netlist_base_t; class device_t; class setup_t; @@ -58,8 +58,8 @@ namespace factory { const pstring &def_param, const pstring &sourcefile); virtual ~element_t(); - virtual plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) = 0; - virtual void macro_actions(netlist_t &anetlist, const pstring &name) {} + virtual plib::owned_ptr<device_t> Create(netlist_base_t &anetlist, const pstring &name) = 0; + virtual void macro_actions(netlist_base_t &anetlist, const pstring &name) {} const pstring &name() const { return m_name; } const pstring &classname() const { return m_classname; } @@ -84,7 +84,7 @@ namespace factory { const pstring &def_param, const pstring &sourcefile) : element_t(name, classname, def_param, sourcefile) { } - plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override + plib::owned_ptr<device_t> Create(netlist_base_t &anetlist, const pstring &name) override { return plib::owned_ptr<device_t>::Create<C>(anetlist, name); } @@ -143,9 +143,9 @@ namespace factory { const pstring &def_param, const pstring &source) : element_t(name, classname, def_param, source) { } - plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override; + plib::owned_ptr<device_t> Create(netlist_base_t &anetlist, const pstring &name) override; - void macro_actions(netlist_t &anetlist, const pstring &name) override; + void macro_actions(netlist_base_t &anetlist, const pstring &name) override; private: }; diff --git a/src/lib/netlist/nl_parser.h b/src/lib/netlist/nl_parser.h index 872cfa11954..26f9179c040 100644 --- a/src/lib/netlist/nl_parser.h +++ b/src/lib/netlist/nl_parser.h @@ -39,7 +39,7 @@ namespace netlist void net_truthtable_start(const pstring &nlname); /* for debugging messages */ - netlist_t &netlist() { return m_setup.netlist(); } + netlist_base_t &netlist() { return m_setup.netlist(); } virtual void verror(const pstring &msg, int line_num, const pstring &line) override; private: diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 8d0ffc66bc9..9d004c76c28 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -25,7 +25,7 @@ namespace netlist { -setup_t::setup_t(netlist_t &netlist) +setup_t::setup_t(netlist_base_t &netlist) : m_netlist(netlist) , m_factory(*this) , m_proxy_cnt(0) @@ -841,17 +841,17 @@ class logic_family_std_proxy_t : public logic_family_desc_t { public: logic_family_std_proxy_t() { } - virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, + virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_base_t &anetlist, const pstring &name, logic_output_t *proxied) const override; - virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const override; + virtual plib::owned_ptr<devices::nld_base_a_to_d_proxy> create_a_d_proxy(netlist_base_t &anetlist, const pstring &name, logic_input_t *proxied) const override; }; -plib::owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_std_proxy_t::create_d_a_proxy(netlist_t &anetlist, +plib::owned_ptr<devices::nld_base_d_to_a_proxy> logic_family_std_proxy_t::create_d_a_proxy(netlist_base_t &anetlist, const pstring &name, logic_output_t *proxied) const { return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied); } -plib::owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_std_proxy_t::create_a_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *proxied) const +plib::owned_ptr<devices::nld_base_a_to_d_proxy> logic_family_std_proxy_t::create_a_d_proxy(netlist_base_t &anetlist, const pstring &name, logic_input_t *proxied) const { return plib::owned_ptr<devices::nld_base_a_to_d_proxy>::Create<devices::nld_a_to_d_proxy>(anetlist, name, proxied); } diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index 25342e933f6..3b2f5c874a6 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -127,7 +127,7 @@ namespace netlist class core_device_t; class param_t; class setup_t; - class netlist_t; + class netlist_base_t; class logic_family_desc_t; class terminal_t; @@ -204,11 +204,11 @@ namespace netlist using link_t = std::pair<pstring, pstring>; - explicit setup_t(netlist_t &netlist); + explicit setup_t(netlist_base_t &netlist); ~setup_t(); - netlist_t &netlist() { return m_netlist; } - const netlist_t &netlist() const { return m_netlist; } + netlist_base_t &netlist() { return m_netlist; } + const netlist_base_t &netlist() const { return m_netlist; } pstring build_fqn(const pstring &obj_name) const; @@ -319,7 +319,7 @@ namespace netlist devices::nld_base_proxy *get_d_a_proxy(detail::core_terminal_t &out); devices::nld_base_proxy *get_a_d_proxy(detail::core_terminal_t &inp); - netlist_t &m_netlist; + netlist_base_t &m_netlist; std::unordered_map<pstring, param_ref_t> m_params; std::vector<link_t> m_links; factory::list_t m_factory; diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp index 0b2e89df08f..fd76b88dee8 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.cpp +++ b/src/lib/netlist/solver/nld_matrix_solver.cpp @@ -74,7 +74,7 @@ void terms_for_net_t::set_pointers() // matrix_solver // ---------------------------------------------------------------------------------------- -matrix_solver_t::matrix_solver_t(netlist_t &anetlist, const pstring &name, +matrix_solver_t::matrix_solver_t(netlist_base_t &anetlist, const pstring &name, const eSortType sort, const solver_parameters_t *params) : device_t(anetlist, name) , m_params(*params) @@ -439,7 +439,7 @@ void matrix_solver_t::solve_base() const netlist_time matrix_solver_t::solve() { - const netlist_time now = netlist().time(); + const netlist_time now = exec().time(); const netlist_time delta = now - m_last_step; // We are already up to date. Avoid oscillations. @@ -545,7 +545,7 @@ void matrix_solver_t::log_stats() static_cast<double>(this->m_stat_newton_raphson) / static_cast<double>(this->m_stat_vsolver_calls)); log().verbose(" {1:10} invocations ({2:6.0} Hz) {3:10} gs fails ({4:6.2} %) {5:6.3} average", this->m_stat_calculations, - static_cast<double>(this->m_stat_calculations) / this->netlist().time().as_double(), + static_cast<double>(this->m_stat_calculations) / this->exec().time().as_double(), this->m_iterative_fail, 100.0 * static_cast<double>(this->m_iterative_fail) / static_cast<double>(this->m_stat_calculations), diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index 5cbbe59b8d0..044d431468b 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -144,7 +144,7 @@ public: protected: - matrix_solver_t(netlist_t &anetlist, const pstring &name, + matrix_solver_t(netlist_base_t &anetlist, const pstring &name, const eSortType sort, const solver_parameters_t *params); void setup_base(analog_net_t::list_t &nets); diff --git a/src/lib/netlist/solver/nld_ms_direct.h b/src/lib/netlist/solver/nld_ms_direct.h index defa03bc044..7414f16db4c 100644 --- a/src/lib/netlist/solver/nld_ms_direct.h +++ b/src/lib/netlist/solver/nld_ms_direct.h @@ -36,8 +36,8 @@ class matrix_solver_direct_t: public matrix_solver_t friend class matrix_solver_t; public: - matrix_solver_direct_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size); - matrix_solver_direct_t(netlist_t &anetlist, const pstring &name, const eSortType sort, const solver_parameters_t *params, const std::size_t size); + matrix_solver_direct_t(netlist_base_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size); + matrix_solver_direct_t(netlist_base_t &anetlist, const pstring &name, const eSortType sort, const solver_parameters_t *params, const std::size_t size); virtual ~matrix_solver_direct_t() override; @@ -253,7 +253,7 @@ unsigned matrix_solver_direct_t<m_N, storage_N>::vsolve_non_dynamic(const bool n } template <std::size_t m_N, std::size_t storage_N> -matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(netlist_t &anetlist, const pstring &name, +matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(netlist_base_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size) : matrix_solver_t(anetlist, name, ASCENDING, params) , m_dim(size) @@ -269,7 +269,7 @@ matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(netlist_t &anetli } template <std::size_t m_N, std::size_t storage_N> -matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(netlist_t &anetlist, const pstring &name, +matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(netlist_base_t &anetlist, const pstring &name, const eSortType sort, const solver_parameters_t *params, const std::size_t size) : matrix_solver_t(anetlist, name, sort, params) , m_dim(size) diff --git a/src/lib/netlist/solver/nld_ms_direct1.h b/src/lib/netlist/solver/nld_ms_direct1.h index 4967a9dc637..4ffbb833bc3 100644 --- a/src/lib/netlist/solver/nld_ms_direct1.h +++ b/src/lib/netlist/solver/nld_ms_direct1.h @@ -19,7 +19,7 @@ class matrix_solver_direct1_t: public matrix_solver_direct_t<1,1> { public: - matrix_solver_direct1_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params) + matrix_solver_direct1_t(netlist_base_t &anetlist, const pstring &name, const solver_parameters_t *params) : matrix_solver_direct_t<1, 1>(anetlist, name, params, 1) {} virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override; diff --git a/src/lib/netlist/solver/nld_ms_direct2.h b/src/lib/netlist/solver/nld_ms_direct2.h index 65cf30c0202..75bfd6e0803 100644 --- a/src/lib/netlist/solver/nld_ms_direct2.h +++ b/src/lib/netlist/solver/nld_ms_direct2.h @@ -19,7 +19,7 @@ class matrix_solver_direct2_t: public matrix_solver_direct_t<2,2> { public: - matrix_solver_direct2_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params) + matrix_solver_direct2_t(netlist_base_t &anetlist, const pstring &name, const solver_parameters_t *params) : matrix_solver_direct_t<2, 2>(anetlist, name, params, 2) {} virtual unsigned vsolve_non_dynamic(const bool newton_raphson) override; diff --git a/src/lib/netlist/solver/nld_ms_gcr.h b/src/lib/netlist/solver/nld_ms_gcr.h index dee76dd8281..b49d9e64602 100644 --- a/src/lib/netlist/solver/nld_ms_gcr.h +++ b/src/lib/netlist/solver/nld_ms_gcr.h @@ -28,7 +28,7 @@ class matrix_solver_GCR_t: public matrix_solver_t { public: - matrix_solver_GCR_t(netlist_t &anetlist, const pstring &name, + matrix_solver_GCR_t(netlist_base_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size) : matrix_solver_t(anetlist, name, matrix_solver_t::ASCENDING, params) , m_dim(size) diff --git a/src/lib/netlist/solver/nld_ms_gmres.h b/src/lib/netlist/solver/nld_ms_gmres.h index 2a73d45d3d1..4310af1b8de 100644 --- a/src/lib/netlist/solver/nld_ms_gmres.h +++ b/src/lib/netlist/solver/nld_ms_gmres.h @@ -29,7 +29,7 @@ class matrix_solver_GMRES_t: public matrix_solver_direct_t<m_N, storage_N> { public: - matrix_solver_GMRES_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size) + matrix_solver_GMRES_t(netlist_base_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size) : matrix_solver_direct_t<m_N, storage_N>(anetlist, name, matrix_solver_t::ASCENDING, params, size) , m_use_iLU_preconditioning(true) , m_use_more_precise_stop_condition(false) diff --git a/src/lib/netlist/solver/nld_ms_sm.h b/src/lib/netlist/solver/nld_ms_sm.h index 42d35e9b14c..4b0f6940798 100644 --- a/src/lib/netlist/solver/nld_ms_sm.h +++ b/src/lib/netlist/solver/nld_ms_sm.h @@ -54,7 +54,7 @@ class matrix_solver_sm_t: public matrix_solver_t public: - matrix_solver_sm_t(netlist_t &anetlist, const pstring &name, + matrix_solver_sm_t(netlist_base_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size); virtual ~matrix_solver_sm_t() override; @@ -307,7 +307,7 @@ unsigned matrix_solver_sm_t<m_N, storage_N>::vsolve_non_dynamic(const bool newto } template <std::size_t m_N, std::size_t storage_N> -matrix_solver_sm_t<m_N, storage_N>::matrix_solver_sm_t(netlist_t &anetlist, const pstring &name, +matrix_solver_sm_t<m_N, storage_N>::matrix_solver_sm_t(netlist_base_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size) : matrix_solver_t(anetlist, name, NOSORT, params) , m_dim(size) diff --git a/src/lib/netlist/solver/nld_ms_sor.h b/src/lib/netlist/solver/nld_ms_sor.h index eea692d6c47..1cc588a3e29 100644 --- a/src/lib/netlist/solver/nld_ms_sor.h +++ b/src/lib/netlist/solver/nld_ms_sor.h @@ -26,7 +26,7 @@ class matrix_solver_SOR_t: public matrix_solver_direct_t<m_N, storage_N> { public: - matrix_solver_SOR_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size) + matrix_solver_SOR_t(netlist_base_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size) : matrix_solver_direct_t<m_N, storage_N>(anetlist, name, matrix_solver_t::ASCENDING, params, size) , m_lp_fact(*this, "m_lp_fact", 0) { diff --git a/src/lib/netlist/solver/nld_ms_sor_mat.h b/src/lib/netlist/solver/nld_ms_sor_mat.h index 50bcac1a52d..7e80877d36e 100644 --- a/src/lib/netlist/solver/nld_ms_sor_mat.h +++ b/src/lib/netlist/solver/nld_ms_sor_mat.h @@ -29,7 +29,7 @@ class matrix_solver_SOR_mat_t: public matrix_solver_direct_t<m_N, storage_N> public: - matrix_solver_SOR_mat_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, std::size_t size) + matrix_solver_SOR_mat_t(netlist_base_t &anetlist, const pstring &name, const solver_parameters_t *params, std::size_t size) : matrix_solver_direct_t<m_N, storage_N>(anetlist, name, matrix_solver_t::DESCENDING, params, size) , m_Vdelta(*this, "m_Vdelta", 0.0) , m_omega(*this, "m_omega", params->m_gs_sor) diff --git a/src/lib/netlist/solver/nld_ms_w.h b/src/lib/netlist/solver/nld_ms_w.h index 4a2710a513d..ac7ea36a6a7 100644 --- a/src/lib/netlist/solver/nld_ms_w.h +++ b/src/lib/netlist/solver/nld_ms_w.h @@ -60,7 +60,7 @@ class matrix_solver_w_t: public matrix_solver_t friend class matrix_solver_t; public: - matrix_solver_w_t(netlist_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size); + matrix_solver_w_t(netlist_base_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size); virtual ~matrix_solver_w_t() override; @@ -374,7 +374,7 @@ unsigned matrix_solver_w_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton } template <std::size_t m_N, std::size_t storage_N> -matrix_solver_w_t<m_N, storage_N>::matrix_solver_w_t(netlist_t &anetlist, const pstring &name, +matrix_solver_w_t<m_N, storage_N>::matrix_solver_w_t(netlist_base_t &anetlist, const pstring &name, const solver_parameters_t *params, const std::size_t size) : matrix_solver_t(anetlist, name, NOSORT, params) ,m_cnt(0) diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 7373b2be963..f7a25fa7fcc 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -95,7 +95,7 @@ NETLIB_UPDATE(solver) /* force solving during start up if there are no time-step devices */ /* FIXME: Needs a more elegant solution */ - bool force_solve = (netlist().time() < netlist_time::from_double(2 * m_params.m_max_timestep)); + bool force_solve = (exec().time() < netlist_time::from_double(2 * m_params.m_max_timestep)); std::size_t nthreads = std::min(static_cast<std::size_t>(m_parallel()), plib::omp::get_max_threads()); @@ -128,7 +128,7 @@ NETLIB_UPDATE(solver) } template <class C> -matrix_solver_t * create_it(netlist_t &nl, pstring name, solver_parameters_t ¶ms, std::size_t size) +matrix_solver_t * create_it(netlist_base_t &nl, pstring name, solver_parameters_t ¶ms, std::size_t size) { return plib::palloc<C>(nl, name, ¶ms, size); } @@ -213,7 +213,7 @@ struct net_splitter } } - void run(netlist_t &netlist) + void run(netlist_base_t &netlist) { for (auto & net : netlist.nets()) { diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h index 8619f66f095..a52730773a7 100644 --- a/src/lib/netlist/solver/nld_solver.h +++ b/src/lib/netlist/solver/nld_solver.h @@ -68,7 +68,7 @@ NETLIB_OBJECT(solver) void post_start(); void stop(); - nl_double gmin() { return m_gmin(); } + nl_double gmin() const { return m_gmin(); } void create_solver_code(std::map<pstring, pstring> &mp); |