diff options
Diffstat (limited to 'src')
40 files changed, 334 insertions, 306 deletions
diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index 8a518169353..d3d850454bf 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -552,11 +552,11 @@ class NETLIB_NAME(sound_out) : public netlist::device_t public: NETLIB_NAME(sound_out)(netlist::netlist_t &anetlist, const pstring &name) : netlist::device_t(anetlist, name) + , m_channel(*this, "CHAN", 0) + , m_mult(*this, "MULT", 1000.0) + , m_offset(*this, "OFFSET", 0.0) { enregister("IN", m_in); - register_param("CHAN", m_channel, 0); - register_param("MULT", m_mult, 1000.0); - register_param("OFFSET", m_offset, 0.0); m_sample = netlist::netlist_time::from_hz(1); //sufficiently big enough save(NAME(m_last_buffer)); } @@ -636,9 +636,9 @@ public: for (int i = 0; i < MAX_INPUT_CHANNELS; i++) { - register_param(pfmt("CHAN{1}")(i), m_param_name[i], ""); - register_param(pfmt("MULT{1}")(i), m_param_mult[i], 1.0); - register_param(pfmt("OFFSET{1}")(i), m_param_offset[i], 0.0); + m_param_name[i] = std::make_unique<netlist::param_str_t>(*this, pfmt("CHAN{1}")(i), ""); + m_param_mult[i] = std::make_unique<netlist::param_double_t>(*this, pfmt("MULT{1}")(i), 1.0); + m_param_offset[i] = std::make_unique<netlist::param_double_t>(*this, pfmt("OFFSET{1}")(i), 0.0); } m_num_channel = 0; } @@ -657,12 +657,12 @@ public: m_pos = 0; for (int i = 0; i < MAX_INPUT_CHANNELS; i++) { - if (m_param_name[i].Value() != "") + if (m_param_name[i]->Value() != "") { if (i != m_num_channel) netlist().log().fatal("sound input numbering has to be sequential!"); m_num_channel++; - m_param[i] = dynamic_cast<netlist::param_double_t *>(setup().find_param(m_param_name[i].Value(), true)); + m_param[i] = dynamic_cast<netlist::param_double_t *>(setup().find_param(m_param_name[i]->Value(), true)); } } return m_num_channel; @@ -675,7 +675,7 @@ public: if (m_buffer[i] == nullptr) break; // stop, called outside of stream_update const nl_double v = m_buffer[i][m_pos]; - m_param[i]->setTo(v * m_param_mult[i].Value() + m_param_offset[i].Value()); + m_param[i]->setTo(v * m_param_mult[i]->Value() + m_param_offset[i]->Value()); } m_pos++; OUTLOGIC(m_Q, !m_Q.net().as_logic().new_Q(), m_inc ); @@ -687,11 +687,11 @@ public: m_pos = 0; } - netlist::param_str_t m_param_name[MAX_INPUT_CHANNELS]; + std::unique_ptr<netlist::param_str_t> m_param_name[MAX_INPUT_CHANNELS]; netlist::param_double_t *m_param[MAX_INPUT_CHANNELS]; stream_sample_t *m_buffer[MAX_INPUT_CHANNELS]; - netlist::param_double_t m_param_mult[MAX_INPUT_CHANNELS]; - netlist::param_double_t m_param_offset[MAX_INPUT_CHANNELS]; + std::unique_ptr<netlist::param_double_t> m_param_mult[MAX_INPUT_CHANNELS]; + std::unique_ptr<netlist::param_double_t> m_param_offset[MAX_INPUT_CHANNELS]; netlist::netlist_time m_inc; private: diff --git a/src/lib/netlist/analog/nld_bjt.h b/src/lib/netlist/analog/nld_bjt.h index 0ccd3d57c76..c7811d590d5 100644 --- a/src/lib/netlist/analog/nld_bjt.h +++ b/src/lib/netlist/analog/nld_bjt.h @@ -41,9 +41,9 @@ public: }; NETLIB_CONSTRUCTOR(Q) + , m_model(*this, "MODEL", "") , m_qtype(BJT_NPN) { - register_param("MODEL", m_model, ""); } NETLIB_DYNAMIC() diff --git a/src/lib/netlist/analog/nld_fourterm.cpp b/src/lib/netlist/analog/nld_fourterm.cpp index f882460e933..2f8eb3c0e6f 100644 --- a/src/lib/netlist/analog/nld_fourterm.cpp +++ b/src/lib/netlist/analog/nld_fourterm.cpp @@ -15,32 +15,6 @@ NETLIB_NAMESPACE_DEVICES_START() // nld_VCCS // ---------------------------------------------------------------------------------------- -void NETLIB_NAME(VCCS)::start_internal(const nl_double def_RI) -{ - register_param("G", m_G, 1.0); - register_param("RI", m_RI, def_RI); - - enregister("IP", m_IP); - enregister("IN", m_IN); - enregister("OP", m_OP); - enregister("ON", m_ON); - - enregister("_OP1", m_OP1); - enregister("_ON1", m_ON1); - - m_IP.m_otherterm = &m_IN; // <= this should be NULL and terminal be filtered out prior to solving... - m_IN.m_otherterm = &m_IP; // <= this should be NULL and terminal be filtered out prior to solving... - - m_OP.m_otherterm = &m_IP; - m_OP1.m_otherterm = &m_IN; - - m_ON.m_otherterm = &m_IP; - m_ON1.m_otherterm = &m_IN; - - connect_late(m_OP, m_OP1); - connect_late(m_ON, m_ON1); -} - NETLIB_RESET(VCCS) { const nl_double m_mult = m_G.Value() * m_gfac; // 1.0 ==> 1V ==> 1A diff --git a/src/lib/netlist/analog/nld_fourterm.h b/src/lib/netlist/analog/nld_fourterm.h index 26d1ad0e4dc..801f4c0fd49 100644 --- a/src/lib/netlist/analog/nld_fourterm.h +++ b/src/lib/netlist/analog/nld_fourterm.h @@ -55,9 +55,30 @@ NETLIB_OBJECT(VCCS) { public: NETLIB_CONSTRUCTOR(VCCS) + , m_G(*this, "G", 1.0) + , m_RI(*this, "RI", NL_FCONST(1.0) / netlist().gmin()) , m_gfac(1.0) { - start_internal(NL_FCONST(1.0) / netlist().gmin()); + + enregister("IP", m_IP); + enregister("IN", m_IN); + enregister("OP", m_OP); + enregister("ON", m_ON); + + enregister("_OP1", m_OP1); + enregister("_ON1", m_ON1); + + m_IP.m_otherterm = &m_IN; // <= this should be NULL and terminal be filtered out prior to solving... + m_IN.m_otherterm = &m_IP; // <= this should be NULL and terminal be filtered out prior to solving... + + m_OP.m_otherterm = &m_IP; + m_OP1.m_otherterm = &m_IN; + + m_ON.m_otherterm = &m_IP; + m_ON1.m_otherterm = &m_IN; + + connect_late(m_OP, m_OP1); + connect_late(m_ON, m_ON1); m_gfac = NL_FCONST(1.0); } @@ -72,8 +93,6 @@ protected: NETLIB_NAME(VCCS)::reset(); } - ATTR_COLD void start_internal(const nl_double def_RI); - terminal_t m_OP; terminal_t m_ON; @@ -92,9 +111,9 @@ NETLIB_OBJECT_DERIVED(LVCCS, VCCS) { public: NETLIB_CONSTRUCTOR_DERIVED(LVCCS, VCCS) + , m_cur_limit(*this, "CURLIM", 1000.0) , m_vi(0.0) { - register_param("CURLIM", m_cur_limit, 1000.0); } NETLIB_DYNAMIC() @@ -183,8 +202,8 @@ NETLIB_OBJECT_DERIVED(VCVS, VCCS) { public: NETLIB_CONSTRUCTOR_DERIVED(VCVS, VCCS) + , m_RO(*this, "RO",1.0) { - register_param("RO", m_RO, 1.0); enregister("_OP2", m_OP2); enregister("_ON2", m_ON2); diff --git a/src/lib/netlist/analog/nld_opamps.h b/src/lib/netlist/analog/nld_opamps.h index 4aafb25e748..a4ff22bbb90 100644 --- a/src/lib/netlist/analog/nld_opamps.h +++ b/src/lib/netlist/analog/nld_opamps.h @@ -39,8 +39,8 @@ NETLIB_OBJECT(OPAMP) NETLIB_CONSTRUCTOR(OPAMP) , m_RP(*this, "RP1") , m_G1(*this, "G1") + , m_model(*this, "MODEL", "") { - register_param("MODEL", m_model, ""); m_type = m_model.model_value("TYPE"); diff --git a/src/lib/netlist/analog/nld_switches.h b/src/lib/netlist/analog/nld_switches.h index 63afb47bdd1..b6a49cbd951 100644 --- a/src/lib/netlist/analog/nld_switches.h +++ b/src/lib/netlist/analog/nld_switches.h @@ -33,8 +33,8 @@ NETLIB_OBJECT(switch1) { NETLIB_CONSTRUCTOR(switch1) , m_R(*this, "R") + , m_POS(*this, "POS", 0) { - register_param("POS", m_POS, 0); register_subalias("1", m_R.m_P); register_subalias("2", m_R.m_N); } @@ -52,9 +52,8 @@ NETLIB_OBJECT(switch2) NETLIB_CONSTRUCTOR(switch2) , m_R1(*this, "R1") , m_R2(*this, "R2") + , m_POS(*this, "POS", 0) { - register_param("POS", m_POS, 0); - connect_late(m_R1.m_N, m_R2.m_N); register_subalias("1", m_R1.m_P); diff --git a/src/lib/netlist/analog/nld_twoterm.h b/src/lib/netlist/analog/nld_twoterm.h index 4e885666c9f..7879baa6cde 100644 --- a/src/lib/netlist/analog/nld_twoterm.h +++ b/src/lib/netlist/analog/nld_twoterm.h @@ -175,8 +175,8 @@ protected: NETLIB_OBJECT_DERIVED(R, R_base) { NETLIB_CONSTRUCTOR_DERIVED(R, R_base) + , m_R(*this, "R", 1.0 / netlist().gmin()) { - register_param("R", m_R, 1.0 / netlist().gmin()); } param_double_t m_R; @@ -205,6 +205,9 @@ NETLIB_OBJECT(POT) NETLIB_CONSTRUCTOR(POT) , m_R1(*this, "R1") , m_R2(*this, "R2") + , m_R(*this, "R", 1.0 / netlist().gmin()) + , m_Dial(*this, "DIAL", 0.5) + , m_DialIsLog(*this, "DIALLOG", 0) { register_subalias("1", m_R1.m_P); register_subalias("2", m_R1.m_N); @@ -212,9 +215,6 @@ NETLIB_OBJECT(POT) connect_late(m_R2.m_P, m_R1.m_N); - register_param("R", m_R, 1.0 / netlist().gmin()); - register_param("DIAL", m_Dial, 0.5); - register_param("DIALLOG", m_DialIsLog, 0); } //NETLIB_UPDATEI(); @@ -234,14 +234,14 @@ NETLIB_OBJECT(POT2) { NETLIB_CONSTRUCTOR(POT2) , m_R1(*this, "R1") + , m_R(*this, "R", 1.0 / netlist().gmin()) + , m_Dial(*this, "DIAL", 0.5) + , m_DialIsLog(*this, "DIALLOG", 0) + , m_Reverse(*this, "REVERSE", 0) { register_subalias("1", m_R1.m_P); register_subalias("2", m_R1.m_N); - register_param("R", m_R, 1.0 / netlist().gmin()); - register_param("DIAL", m_Dial, 0.5); - register_param("REVERSE", m_Reverse, 0); - register_param("DIALLOG", m_DialIsLog, 0); } //NETLIB_UPDATEI(); @@ -266,13 +266,11 @@ NETLIB_OBJECT_DERIVED(C, twoterm) { public: NETLIB_CONSTRUCTOR_DERIVED(C, twoterm) + , m_C(*this, "C", 1e-6) , m_GParallel(0.0) { enregister("1", m_P); enregister("2", m_N); - - register_param("C", m_C, 1e-6); - } NETLIB_TIMESTEP() @@ -377,10 +375,10 @@ NETLIB_OBJECT_DERIVED(D, twoterm) { public: NETLIB_CONSTRUCTOR_DERIVED(D, twoterm) + , m_model(*this, "MODEL", "") { enregister("A", m_P); enregister("K", m_N); - register_param("MODEL", m_model, ""); m_D.save("m_D", *this); } @@ -410,9 +408,9 @@ NETLIB_OBJECT_DERIVED(VS, twoterm) { public: NETLIB_CONSTRUCTOR_DERIVED(VS, twoterm) + , m_R(*this, "R", 0.1) + , m_V(*this, "V", 0.0) { - register_param("R", m_R, 0.1); - register_param("V", m_V, 0.0); enregister("P", m_P); enregister("N", m_N); @@ -434,9 +432,8 @@ NETLIB_OBJECT_DERIVED(CS, twoterm) { public: NETLIB_CONSTRUCTOR_DERIVED(CS, twoterm) + , m_I(*this, "I", 1.0) { - register_param("I", m_I, 1.0); - enregister("P", m_P); enregister("N", m_N); } diff --git a/src/lib/netlist/devices/nld_4020.h b/src/lib/netlist/devices/nld_4020.h index de6f654fcfb..491bef29c21 100644 --- a/src/lib/netlist/devices/nld_4020.h +++ b/src/lib/netlist/devices/nld_4020.h @@ -91,6 +91,7 @@ NETLIB_OBJECT(CD4020) , m_sub(*this, "sub") , m_supply(*this, "supply") { + enregister("RESET", m_RESET); register_subalias("IP", m_sub.m_IP); register_subalias("Q1", m_sub.m_Q[0]); diff --git a/src/lib/netlist/devices/nld_4066.h b/src/lib/netlist/devices/nld_4066.h index 4387694436e..ca1f1bd66cc 100644 --- a/src/lib/netlist/devices/nld_4066.h +++ b/src/lib/netlist/devices/nld_4066.h @@ -38,8 +38,8 @@ NETLIB_OBJECT(CD4066_GATE) NETLIB_FAMILY("CD4XXX") , m_supply(*this, "PS") , m_R(*this, "R") + , m_base_r(*this, "BASER", 270.0) { - register_param("BASER", m_base_r, 270.0); enregister("CTL", m_control); } diff --git a/src/lib/netlist/devices/nld_74107.cpp b/src/lib/netlist/devices/nld_74107.cpp index c8bf6d7462b..399f596d91d 100644 --- a/src/lib/netlist/devices/nld_74107.cpp +++ b/src/lib/netlist/devices/nld_74107.cpp @@ -12,8 +12,8 @@ NETLIB_NAMESPACE_DEVICES_START() NETLIB_RESET(74107Asub) { m_clk.set_state(logic_t::STATE_INP_HL); - m_Q.initial(0); - m_QQ.initial(1); + //m_Q.initial(0); + //m_QQ.initial(1); m_Q1 = 0; m_Q2 = 0; diff --git a/src/lib/netlist/devices/nld_74107.h b/src/lib/netlist/devices/nld_74107.h index 10f0bf71224..8023f1103fd 100644 --- a/src/lib/netlist/devices/nld_74107.h +++ b/src/lib/netlist/devices/nld_74107.h @@ -115,6 +115,7 @@ NETLIB_OBJECT(74107A) NETLIB_CONSTRUCTOR(74107A) , m_sub(*this, "sub") { + register_subalias("CLK", m_sub.m_clk); enregister("J", m_J); enregister("K", m_K); @@ -147,6 +148,7 @@ NETLIB_OBJECT(74107_dip) , m_1(*this, "1") , m_2(*this, "2") { + register_subalias("1", m_1.m_J); register_subalias("2", m_1.m_sub.m_QQ); register_subalias("3", m_1.m_sub.m_Q); diff --git a/src/lib/netlist/devices/nld_74123.h b/src/lib/netlist/devices/nld_74123.h index c1483c89c0c..70f0bf05a67 100644 --- a/src/lib/netlist/devices/nld_74123.h +++ b/src/lib/netlist/devices/nld_74123.h @@ -64,6 +64,8 @@ NETLIB_OBJECT(74123) , m_dev_type(dev_type) , m_RP(*this, "RP") , m_RN(*this, "RN") + , m_K(*this, "K", (m_dev_type == 4538) ? 0.4 : 0.4) + , m_RI(*this, "RI", 400.0) // around 250 for HC series, 400 on LS/TTL, estimated from datasheets { if ((m_dev_type != 9602) && (m_dev_type != 4538) ) m_dev_type = 74123; @@ -84,12 +86,6 @@ NETLIB_OBJECT(74123) register_subalias("C", m_RN.m_R.m_N); register_subalias("RC", m_RN.m_R.m_P); - if (m_dev_type == 4538) - register_param("K", m_K, 0.4); - else - register_param("K", m_K, 0.4); - - register_param("RI", m_RI, 400.0); // around 250 for HC series, 400 on LS/TTL, estimated from datasheets connect_late(m_RP_Q, m_RP.m_I); connect_late(m_RN_Q, m_RN.m_I); diff --git a/src/lib/netlist/devices/nld_74153.h b/src/lib/netlist/devices/nld_74153.h index 30d76cb051e..dc7753c28c6 100644 --- a/src/lib/netlist/devices/nld_74153.h +++ b/src/lib/netlist/devices/nld_74153.h @@ -95,6 +95,7 @@ NETLIB_OBJECT(74153) NETLIB_CONSTRUCTOR(74153) , m_sub(*this, "sub") { + register_subalias("C0", m_sub.m_C[0]); register_subalias("C1", m_sub.m_C[1]); register_subalias("C2", m_sub.m_C[2]); @@ -119,6 +120,7 @@ NETLIB_OBJECT(74153_dip) , m_1(*this, "1") , m_2(*this, "2") { + register_subalias("1", m_1.m_G); enregister("2", m_B); // m_2.m_B register_subalias("3", m_1.m_C[3]); diff --git a/src/lib/netlist/devices/nld_7448.h b/src/lib/netlist/devices/nld_7448.h index b20dde552a3..c9de0af5cc6 100644 --- a/src/lib/netlist/devices/nld_7448.h +++ b/src/lib/netlist/devices/nld_7448.h @@ -46,7 +46,7 @@ NETLIB_NAMESPACE_DEVICES_START() * FIXME: Using truthtable is a lot slower than the explicit device */ -#define USE_TRUTHTABLE_7448 (0) +#define USE_TRUTHTABLE_7448 (0) #if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE) @@ -100,6 +100,7 @@ NETLIB_OBJECT(7448) NETLIB_CONSTRUCTOR(7448) , m_sub(*this, "sub") { + register_subalias("A", m_sub.m_A); register_subalias("B", m_sub.m_B); register_subalias("C", m_sub.m_C); diff --git a/src/lib/netlist/devices/nld_7450.h b/src/lib/netlist/devices/nld_7450.h index c0db52f4b22..0b10b35e1ed 100644 --- a/src/lib/netlist/devices/nld_7450.h +++ b/src/lib/netlist/devices/nld_7450.h @@ -65,6 +65,7 @@ NETLIB_OBJECT(7450_dip) , m_1(*this, "1") , m_2(*this, "2") { + register_subalias("1", m_1.m_A); register_subalias("2", m_2.m_A); register_subalias("3", m_2.m_B); diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp index ee2dc56b327..d1f2e11cd8a 100644 --- a/src/lib/netlist/devices/nld_7474.cpp +++ b/src/lib/netlist/devices/nld_7474.cpp @@ -68,7 +68,7 @@ NETLIB_RESET(7474sub) NETLIB_RESET(7474_dip) { -// m_1.do_reset(); +// m_1.do_reset(); //m_2.do_reset(); } diff --git a/src/lib/netlist/devices/nld_7474.h b/src/lib/netlist/devices/nld_7474.h index 6caad4d68f3..1de0838b9c9 100644 --- a/src/lib/netlist/devices/nld_7474.h +++ b/src/lib/netlist/devices/nld_7474.h @@ -115,6 +115,7 @@ NETLIB_OBJECT(7474_dip) , m_1(*this, "1") , m_2(*this, "2") { + register_subalias("1", m_1.m_CLRQ); register_subalias("2", m_1.m_D); register_subalias("3", m_1.sub.m_CLK); diff --git a/src/lib/netlist/devices/nld_74ls629.h b/src/lib/netlist/devices/nld_74ls629.h index c88be6f1e66..f2aa6e8a6d8 100644 --- a/src/lib/netlist/devices/nld_74ls629.h +++ b/src/lib/netlist/devices/nld_74ls629.h @@ -83,6 +83,7 @@ NETLIB_OBJECT(SN74LS629) , m_clock(*this, "OSC") , m_R_FC(*this, "R_FC") , m_R_RNG(*this, "R_RNG") + , m_CAP(*this, "CAP", 1e-6) { enregister("ENQ", m_ENQ); enregister("RNG", m_RNG); @@ -94,7 +95,6 @@ NETLIB_OBJECT(SN74LS629) connect_late(m_R_FC.m_N, m_R_RNG.m_N); register_subalias("Y", m_clock.m_Y); - register_param("CAP", m_CAP, 1e-6); } NETLIB_RESETI() diff --git a/src/lib/netlist/devices/nld_legacy.cpp b/src/lib/netlist/devices/nld_legacy.cpp index 0bba0067f72..387330d8e95 100644 --- a/src/lib/netlist/devices/nld_legacy.cpp +++ b/src/lib/netlist/devices/nld_legacy.cpp @@ -32,7 +32,7 @@ NETLIB_UPDATE(nicRSFF) NETLIB_RESET(nicDelay) { - m_Q.initial(0); + //m_Q.initial(0); } NETLIB_UPDATE(nicDelay) diff --git a/src/lib/netlist/devices/nld_legacy.h b/src/lib/netlist/devices/nld_legacy.h index e6b8385a03c..5e7410254e3 100644 --- a/src/lib/netlist/devices/nld_legacy.h +++ b/src/lib/netlist/devices/nld_legacy.h @@ -56,14 +56,13 @@ protected: NETLIB_OBJECT(nicDelay) { NETLIB_CONSTRUCTOR(nicDelay) + , m_L_to_H(*this, "L_TO_H", 10) + , m_H_to_L(*this, "H_TO_L", 10) , m_last(0) { enregister("1", m_I); enregister("2", m_Q); - register_param("L_TO_H", m_L_to_H, 10); - register_param("H_TO_L", m_H_to_L, 10); - save(NLNAME(m_last)); } diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp index ba426bdb439..c8e5ca23b44 100644 --- a/src/lib/netlist/devices/nld_mm5837.cpp +++ b/src/lib/netlist/devices/nld_mm5837.cpp @@ -16,8 +16,8 @@ NETLIB_NAMESPACE_DEVICES_START() NETLIB_RESET(MM5837_dip) { - m_V0.initial(0.0); - m_RV.do_reset(); + //m_V0.initial(0.0); + //m_RV.do_reset(); m_RV.set(NL_FCONST(1.0) / R_LOW, 0.0, 0.0); m_shift = 0x1ffff; diff --git a/src/lib/netlist/devices/nld_ne555.h b/src/lib/netlist/devices/nld_ne555.h index 73413796fd7..9963b83546e 100644 --- a/src/lib/netlist/devices/nld_ne555.h +++ b/src/lib/netlist/devices/nld_ne555.h @@ -37,6 +37,7 @@ NETLIB_OBJECT(NE555) , m_last_out(false) , m_ff(false) { + register_subalias("GND", m_R3.m_N); // Pin 1 enregister("TRIG", m_TRIG); // Pin 2 enregister("OUT", m_OUT); // Pin 3 diff --git a/src/lib/netlist/devices/nld_r2r_dac.h b/src/lib/netlist/devices/nld_r2r_dac.h index 32429a550d4..6e7ec44d604 100644 --- a/src/lib/netlist/devices/nld_r2r_dac.h +++ b/src/lib/netlist/devices/nld_r2r_dac.h @@ -60,13 +60,13 @@ NETLIB_NAMESPACE_DEVICES_START() NETLIB_OBJECT_DERIVED(r2r_dac, twoterm) { NETLIB_CONSTRUCTOR_DERIVED(r2r_dac, twoterm) + , m_VIN(*this, "VIN", 1.0) + , m_R(*this, "R", 1.0) + , m_num(*this, "N", 1) + , m_val(*this, "VAL", 1) { enregister("VOUT", m_P); enregister("VGND", m_N); - register_param("R", m_R, 1.0); - register_param("VIN", m_VIN, 1.0); - register_param("N", m_num, 1); - register_param("VAL", m_val, 1); } NETLIB_UPDATE_PARAMI(); diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp index bde6c43206e..d2cdc5a3aca 100644 --- a/src/lib/netlist/devices/nld_system.cpp +++ b/src/lib/netlist/devices/nld_system.cpp @@ -38,7 +38,7 @@ NETLIB_RESET(extclock) { m_cnt = 0; m_off = netlist_time::from_double(m_offset.Value()); - m_Q.initial(0); + //m_Q.initial(0); } NETLIB_UPDATE(extclock) @@ -66,6 +66,12 @@ NETLIB_UPDATE(extclock) // logic_input // ---------------------------------------------------------------------------------------- +NETLIB_RESET(logic_input) +{ + //FIXME: causes issues in breakout (lots of pings after first player 1 start) + //m_Q.initial(m_IN.Value() & 1); +} + NETLIB_UPDATE(logic_input) { OUTLOGIC(m_Q, m_IN.Value() & 1, netlist_time::from_nsec(1)); @@ -73,13 +79,17 @@ NETLIB_UPDATE(logic_input) NETLIB_UPDATE_PARAM(logic_input) { - update(); } // ---------------------------------------------------------------------------------------- // analog_input // ---------------------------------------------------------------------------------------- +NETLIB_RESET(analog_input) +{ +// m_Q.initial(m_IN.Value() * 0.999); +} + NETLIB_UPDATE(analog_input) { OUTANALOG(m_Q, m_IN.Value()); @@ -87,7 +97,6 @@ NETLIB_UPDATE(analog_input) NETLIB_UPDATE_PARAM(analog_input) { - update(); } // ---------------------------------------------------------------------------------------- @@ -96,7 +105,7 @@ NETLIB_UPDATE_PARAM(analog_input) void nld_d_to_a_proxy::reset() { - m_Q.initial(0.0); + //m_Q.initial(0.0); m_last_state = -1; m_RV.do_reset(); m_is_timestep = m_RV.m_P.net().solver()->has_timestep_devices(); @@ -152,18 +161,13 @@ NETLIB_UPDATE(res_sw) } } -NETLIB_UPDATE_PARAM(res_sw) -{ - // nothing, not intended to be called -} - /* ----------------------------------------------------------------------------- * nld_function * ----------------------------------------------------------------------------- */ NETLIB_RESET(function) { - m_Q.initial(0.0); + //m_Q.initial(0.0); } NETLIB_UPDATE(function) diff --git a/src/lib/netlist/devices/nld_system.h b/src/lib/netlist/devices/nld_system.h index 1b22ae3e9dd..4ca2a8cf84e 100644 --- a/src/lib/netlist/devices/nld_system.h +++ b/src/lib/netlist/devices/nld_system.h @@ -84,12 +84,12 @@ NETLIB_NAMESPACE_DEVICES_START() NETLIB_OBJECT(netlistparams) { NETLIB_CONSTRUCTOR(netlistparams) + , m_use_deactivate(*this, "USE_DEACTIVATE", 0) { - register_param("USE_DEACTIVATE", m_use_deactivate, 0); } NETLIB_UPDATEI() { } //NETLIB_RESETI() { } - NETLIB_UPDATE_PARAMI() { } + //NETLIB_UPDATE_PARAMI() { } public: param_logic_t m_use_deactivate; }; @@ -101,10 +101,10 @@ public: NETLIB_OBJECT(mainclock) { NETLIB_CONSTRUCTOR(mainclock) + , m_freq(*this, "FREQ", 7159000.0 * 5) { enregister("Q", m_Q); - register_param("FREQ", m_freq, 7159000.0 * 5); m_inc = netlist_time::from_hz(m_freq.Value()*2); } @@ -142,11 +142,12 @@ public: NETLIB_OBJECT(clock) { NETLIB_CONSTRUCTOR(clock) + , m_freq(*this, "FREQ", 7159000.0 * 5.0) + { enregister("Q", m_Q); enregister("FB", m_feedback); - register_param("FREQ", m_freq, 7159000.0 * 5.0); m_inc = netlist_time::from_hz(m_freq.Value()*2); connect_late(m_feedback, m_Q); @@ -170,13 +171,13 @@ protected: NETLIB_OBJECT(extclock) { NETLIB_CONSTRUCTOR(extclock) + , m_freq(*this, "FREQ", 7159000.0 * 5.0) + , m_pattern(*this, "PATTERN", "1,1") + , m_offset(*this, "OFFSET", 0.0) { enregister("Q", m_Q); enregister("FB", m_feedback); - register_param("FREQ", m_freq, 7159000.0 * 5.0); - register_param("PATTERN", m_pattern, "1,1"); - register_param("OFFSET", m_offset, 0.0); m_inc[0] = netlist_time::from_hz(m_freq.Value()*2); connect_late(m_feedback, m_Q); @@ -228,16 +229,18 @@ protected: NETLIB_OBJECT(logic_input) { NETLIB_CONSTRUCTOR(logic_input) + , m_IN(*this, "IN", 0) + /* make sure we get the family first */ + , m_FAMILY(*this, "FAMILY", "FAMILY(TYPE=TTL)") { - /* make sure we get the family first */ - register_param("FAMILY", m_FAMILY, "FAMILY(TYPE=TTL)"); set_logic_family(netlist().setup().family_from_model(m_FAMILY.Value())); enregister("Q", m_Q); - register_param("IN", m_IN, 0); } + NETLIB_UPDATE_AFTER_PARAM_CHANGE() + NETLIB_UPDATEI(); - //NETLIB_RESETI(); + NETLIB_RESETI(); NETLIB_UPDATE_PARAMI(); protected: @@ -250,12 +253,14 @@ protected: NETLIB_OBJECT(analog_input) { NETLIB_CONSTRUCTOR(analog_input) + , m_IN(*this, "IN", 0.0) { enregister("Q", m_Q); - register_param("IN", m_IN, 0.0); } + NETLIB_UPDATE_AFTER_PARAM_CHANGE() + NETLIB_UPDATEI(); - //NETLIB_RESETI(); + NETLIB_RESETI(); NETLIB_UPDATE_PARAMI(); protected: analog_output_t m_Q; @@ -313,10 +318,10 @@ public: NETLIB_CONSTRUCTOR_DERIVED(frontier, base_dummy) , m_RIN(netlist(), "m_RIN") , m_ROUT(netlist(), "m_ROUT") - { - register_param("RIN", m_p_RIN, 1.0e6); - register_param("ROUT", m_p_ROUT, 50.0); + , m_p_RIN(*this, "RIN", 1.0e6) + , m_p_ROUT(*this, "ROUT", 50.0) + { enregister("_I", m_I); enregister("I",m_RIN.m_P); enregister("G",m_RIN.m_N); @@ -358,9 +363,9 @@ private: NETLIB_OBJECT(function) { NETLIB_CONSTRUCTOR(function) + , m_N(*this, "N", 2) + , m_func(*this, "FUNC", "") { - register_param("N", m_N, 2); - register_param("FUNC", m_func, ""); enregister("Q", m_Q); for (int i=0; i < m_N; i++) @@ -441,10 +446,11 @@ NETLIB_OBJECT(res_sw) public: NETLIB_CONSTRUCTOR(res_sw) , m_R(*this, "R") + , m_RON(*this, "RON", 1.0) + , m_ROFF(*this, "ROFF", 1.0E20) + , m_last_state(0) { enregister("I", m_I); - register_param("RON", m_RON, 1.0); - register_param("ROFF", m_ROFF, 1.0E20); register_subalias("1", m_R.m_P); register_subalias("2", m_R.m_N); @@ -453,21 +459,20 @@ public: } NETLIB_SUB(R) m_R; + logic_input_t m_I; param_double_t m_RON; param_double_t m_ROFF; - logic_input_t m_I; - -protected: NETLIB_RESETI() { m_last_state = 0; m_R.set_R(m_ROFF.Value()); } - NETLIB_UPDATE_PARAMI(); + //NETLIB_UPDATE_PARAMI(); NETLIB_UPDATEI(); private: + UINT8 m_last_state; }; @@ -525,7 +530,7 @@ public: protected: - NETLIB_RESETI() { } + NETLIB_RESETI() { } NETLIB_UPDATEI() { diff --git a/src/lib/netlist/macro/nlm_ttl74xx.cpp b/src/lib/netlist/macro/nlm_ttl74xx.cpp index b21b388ba58..fc589231b19 100644 --- a/src/lib/netlist/macro/nlm_ttl74xx.cpp +++ b/src/lib/netlist/macro/nlm_ttl74xx.cpp @@ -79,7 +79,7 @@ NETLIST_START(TTL_7402_DIP) s2.A, /* A2 |5 10| Y3 */ s3.Q, s2.B, /* B2 |6 9| B3 */ s3.B, GND.I, /* GND |7 8| A3 */ s3.A - /* +--------------+ */ + /* +--------------+ */ ) NETLIST_END() @@ -117,7 +117,7 @@ NETLIST_START(TTL_7404_DIP) s3.A, /* A3 |5 10| Y5 */ s5.Q, s3.Q, /* Y3 |6 9| A4 */ s4.A, GND.I, /* GND |7 8| Y4 */ s4.Q - /* +--------------+ */ + /* +--------------+ */ ) NETLIST_END() @@ -156,7 +156,7 @@ NETLIST_START(TTL_7408_DIP) s2.B, /* B2 |5 10| B3 */ s3.B, s2.Q, /* Y2 |6 9| A3 */ s3.A, GND.I, /* GND |7 8| Y3 */ s3.Q - /* +--------------+ */ + /* +--------------+ */ ) NETLIST_END() @@ -193,7 +193,7 @@ NETLIST_START(TTL_7410_DIP) s2.C, /* C2 |5 10| B3 */ s3.B, s2.Q, /* Y2 |6 9| A3 */ s3.A, GND.I, /* GND |7 8| Y3 */ s3.Q - /* +--------------+ */ + /* +--------------+ */ ) NETLIST_END() @@ -230,7 +230,7 @@ NETLIST_START(TTL_7411_DIP) s2.C, /* C2 |5 10| B3 */ s3.B, s2.Q, /* Y2 |6 9| A3 */ s3.A, GND.I, /* GND |7 8| Y3 */ s3.Q - /* +--------------+ */ + /* +--------------+ */ ) NETLIST_END() @@ -297,7 +297,7 @@ NETLIST_START(TTL_7420_DIP) s1.D, /* D1 |5 10| B2 */ s2.B, s1.Q, /* Y1 |6 9| A2 */ s2.A, GND.I, /* GND |7 8| Y2 */ s2.Q - /* +--------------+ */ + /* +--------------+ */ ) NETLIST_END() @@ -334,12 +334,12 @@ NETLIST_START(TTL_7425_DIP) DIPPINS( /* +--------------+ */ s1.A, /* A1 |1 ++ 14| VCC */ VCC.I, s1.B, /* B1 |2 13| D2 */ s2.D, - X.I, /* X1 |3 12| C2 */ s2.C, + X.I, /* X1 |3 12| C2 */ s2.C, s1.C, /* C1 |4 7425 11| X2 */ X.I, s1.D, /* D1 |5 10| B2 */ s2.B, s1.Q, /* Y1 |6 9| A2 */ s2.A, GND.I, /* GND |7 8| Y2 */ s2.Q - /* +--------------+ */ + /* +--------------+ */ ) NETLIST_END() @@ -377,7 +377,7 @@ NETLIST_START(TTL_7427_DIP) s2.C, /* C2 |5 10| B3 */ s3.B, s2.Q, /* Y2 |6 9| A3 */ s3.A, GND.I, /* GND |7 8| Y3 */ s3.Q - /* +--------------+ */ + /* +--------------+ */ ) NETLIST_END() @@ -417,7 +417,7 @@ NETLIST_START(TTL_7430_DIP) s1.E, /* E |5 10| NC */ NC.I, s1.F, /* F |6 9| NC */ NC.I, GND.I, /* GND |7 8| Y */ s1.Q - /* +--------------+ */ + /* +--------------+ */ ) NETLIST_END() @@ -456,7 +456,7 @@ NETLIST_START(TTL_7432_DIP) s2.B, /* B2 |5 10| B3 */ s3.B, s2.Q, /* Y2 |6 9| A3 */ s3.A, GND.I, /* GND |7 8| Y3 */ s3.Q - /* +--------------+ */ + /* +--------------+ */ ) NETLIST_END() diff --git a/src/lib/netlist/macro/nlm_ttl74xx.h b/src/lib/netlist/macro/nlm_ttl74xx.h index 924b2c31093..541a9932fb5 100644 --- a/src/lib/netlist/macro/nlm_ttl74xx.h +++ b/src/lib/netlist/macro/nlm_ttl74xx.h @@ -15,8 +15,8 @@ NET_REGISTER_DEV(TTL_7400_GATE, _name) #define TTL_7400_NAND(_name, _A, _B) \ - NET_REGISTER_DEV(TTL_7400_NAND, _name) \ - NET_CONNECT(_name, A, _A) \ + NET_REGISTER_DEV(TTL_7400_NAND, _name) \ + NET_CONNECT(_name, A, _A) \ NET_CONNECT(_name, B, _B) #define TTL_7400_DIP(_name) \ @@ -50,8 +50,8 @@ NET_REGISTER_DEV(TTL_7408_GATE, _name) #define TTL_7408_AND(_name, _A, _B) \ - NET_REGISTER_DEV(TTL_7408_AND, _name) \ - NET_CONNECT(_name, A, _A) \ + NET_REGISTER_DEV(TTL_7408_AND, _name) \ + NET_CONNECT(_name, A, _A) \ NET_CONNECT(_name, B, _B) #define TTL_7408_DIP(_name) \ @@ -166,8 +166,8 @@ NET_REGISTER_DEV(TTL_7437_GATE, _name) #define TTL_7437_NAND(_name, _A, _B) \ - NET_REGISTER_DEV(TTL_7437_NAND, _name) \ - NET_CONNECT(_name, A, _A) \ + NET_REGISTER_DEV(TTL_7437_NAND, _name) \ + NET_CONNECT(_name, A, _A) \ NET_CONNECT(_name, B, _B) #define TTL_7437_DIP(_name) \ diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 0bd92b6d28d..556e346cfa0 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -20,6 +20,7 @@ const netlist::netlist_time netlist::netlist_time::zero = netlist::netlist_time( namespace netlist { + #if 0 static pmempool p(65536, 16); @@ -30,8 +31,8 @@ void * object_t::operator new (size_t size) void object_t::operator delete (void * mem) { - if (mem) - p.free(mem); + if (mem) + p.free(mem); } #else void * object_t::operator new (size_t size) @@ -41,8 +42,8 @@ void * object_t::operator new (size_t size) void object_t::operator delete (void * mem) { - if (mem) - ::operator delete(mem); + if (mem) + ::operator delete(mem); } #endif @@ -233,6 +234,7 @@ netlist_t::netlist_t(const pstring &aname) netlist_t::~netlist_t() { + m_nets.clear(); m_devices.clear(); @@ -323,18 +325,20 @@ ATTR_COLD void netlist_t::reset() m_queue.clear(); if (m_mainclock != nullptr) m_mainclock->m_Q.net().set_time(netlist_time::zero); - if (m_solver != nullptr) - m_solver->do_reset(); + //if (m_solver != nullptr) + // m_solver->do_reset(); // Reset all nets once ! for (std::size_t i = 0; i < m_nets.size(); i++) m_nets[i]->do_reset(); // Reset all devices once ! - for (std::size_t i = 0; i < m_devices.size(); i++) - { - m_devices[i]->do_reset(); - } + for (auto & dev : m_devices) + dev->do_reset(); + + // Make sure everything depending on parameters is set + for (auto & dev : m_devices) + dev->update_param(); // Step all devices once ! #if 0 @@ -350,13 +354,6 @@ ATTR_COLD void netlist_t::reset() for (int i = m_devices.size() - 1; i >= 0; i--) m_devices[i]->update_dev(); #endif - - // FIXME: some const devices rely on this - /* make sure params are set now .. */ - for (auto & dev : m_devices) - { - dev->update_param(); - } } @@ -429,9 +426,44 @@ void netlist_t::print_stats() const } // ---------------------------------------------------------------------------------------- -// Default netlist elements ... +// Parameters ... // ---------------------------------------------------------------------------------------- +template <typename C, param_t::param_type_t T> +param_template_t<C, T>::param_template_t(device_t &device, const pstring name, const C val) +: param_t(T, device, device.name() + "." + name) +, m_param(val) +{ + /* pstrings not yet supported, these need special logic */ + if (T != param_t::STRING && T != param_t::MODEL) + save(NLNAME(m_param)); + device.setup().register_and_set_param(device.name() + "." + name, *this); +} + +template class param_template_t<double, param_t::DOUBLE>; +template class param_template_t<int, param_t::INTEGER>; +template class param_template_t<int, param_t::LOGIC>; +template class param_template_t<pstring, param_t::STRING>; +template class param_template_t<pstring, param_t::MODEL>; + +#if 0 +template <class C, class T> +ATTR_COLD void device_t::register_param(const pstring &sname, C ¶m, const T initialVal) +{ + pstring fullname = this->name() + "." + sname; + param.init_object(*this, fullname); + param.initial(initialVal); + setup().register_object(*this, fullname, param); +} + +template ATTR_COLD void device_t::register_param(const pstring &sname, param_double_t ¶m, const double initialVal); +template ATTR_COLD void device_t::register_param(const pstring &sname, param_double_t ¶m, const float initialVal); +template ATTR_COLD void device_t::register_param(const pstring &sname, param_int_t ¶m, const int initialVal); +template ATTR_COLD void device_t::register_param(const pstring &sname, param_logic_t ¶m, const int initialVal); +template ATTR_COLD void device_t::register_param(const pstring &sname, param_str_t ¶m, const char * const initialVal); +template ATTR_COLD void device_t::register_param(const pstring &sname, param_str_t ¶m, const pstring &initialVal); +template ATTR_COLD void device_t::register_param(const pstring &sname, param_model_t ¶m, const char * const initialVal); +#endif // ---------------------------------------------------------------------------------------- @@ -462,7 +494,7 @@ ATTR_COLD core_device_t::core_device_t(core_device_t &owner, const pstring &name set_logic_family(owner.logic_family()); if (logic_family() == nullptr) set_logic_family(family_TTL()); - init_object(owner.netlist(), owner.name() +"." + name); + init_object(owner.netlist(), owner.name() + "." + name); owner.netlist().m_devices.push_back(powned_ptr<core_device_t>(this, false)); } @@ -570,23 +602,6 @@ ATTR_COLD void device_t::connect_post_start(core_terminal_t &t1, core_terminal_t } -template <class C, class T> -ATTR_COLD void device_t::register_param(const pstring &sname, C ¶m, const T initialVal) -{ - pstring fullname = this->name() + "." + sname; - param.init_object(*this, fullname); - param.initial(initialVal); - setup().register_object(*this, fullname, param); -} - -template ATTR_COLD void device_t::register_param(const pstring &sname, param_double_t ¶m, const double initialVal); -template ATTR_COLD void device_t::register_param(const pstring &sname, param_double_t ¶m, const float initialVal); -template ATTR_COLD void device_t::register_param(const pstring &sname, param_int_t ¶m, const int initialVal); -template ATTR_COLD void device_t::register_param(const pstring &sname, param_logic_t ¶m, const int initialVal); -template ATTR_COLD void device_t::register_param(const pstring &sname, param_str_t ¶m, const char * const initialVal); -template ATTR_COLD void device_t::register_param(const pstring &sname, param_str_t ¶m, const pstring &initialVal); -template ATTR_COLD void device_t::register_param(const pstring &sname, param_model_t ¶m, const char * const initialVal); - // ----------------------------------------------------------------------------- // family_setter_t // ----------------------------------------------------------------------------- @@ -626,7 +641,7 @@ ATTR_COLD net_t::~net_t() // FIXME: move somewhere central struct do_nothing_deleter{ - template<typename T> void operator()(T*){} + template<typename T> void operator()(T*){} }; ATTR_COLD void net_t::init_object(netlist_t &nl, const pstring &aname, core_terminal_t *mr) @@ -991,7 +1006,8 @@ ATTR_COLD analog_output_t::analog_output_t(core_device_t &dev, const pstring &an this->set_net(&m_my_net); set_state(STATE_OUT); - net().m_cur_Analog = NL_FCONST(0.99); + //net().m_cur_Analog = NL_FCONST(0.99); + net().m_cur_Analog = NL_FCONST(0.0); analog_t::init_object(dev, aname); net().init_object(dev.netlist(), aname + ".net", this); @@ -1003,7 +1019,8 @@ ATTR_COLD analog_output_t::analog_output_t() this->set_net(&m_my_net); set_state(STATE_OUT); - net().m_cur_Analog = NL_FCONST(0.99); + //net().m_cur_Analog = NL_FCONST(0.99); + net().m_cur_Analog = NL_FCONST(0.0); } ATTR_COLD void analog_output_t::init_object(core_device_t &dev, const pstring &aname) @@ -1021,10 +1038,11 @@ ATTR_COLD void analog_output_t::initial(const nl_double val) // param_t & friends // ---------------------------------------------------------------------------------------- -ATTR_COLD param_t::param_t(const param_type_t atype) +ATTR_COLD param_t::param_t(const param_type_t atype, device_t &device, const pstring &name) : device_object_t(PARAM) , m_param_type(atype) { + init_object(device, name); } ATTR_COLD const pstring param_model_t::model_type() @@ -1065,3 +1083,4 @@ ATTR_HOT /* inline */ void NETLIB_NAME(mainclock)::mc_update(logic_net_t &net) NETLIB_NAMESPACE_DEVICES_END() + diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 4fd71b8a2c1..135d6ed1ab1 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -176,9 +176,9 @@ */ using netlist_sig_t = std::uint32_t; - //============================================================ - // MACROS / New Syntax - //============================================================ + //============================================================ + // MACROS / New Syntax + //============================================================ #define NETLIB_NAMESPACE_DEVICES_START() namespace netlist { namespace devices { #define NETLIB_NAMESPACE_DEVICES_END() }} @@ -203,18 +203,21 @@ class NETLIB_NAME(_name) : public device_t #define NETLIB_DESTRUCTOR(_name) public: ATTR_HOT virtual ~NETLIB_NAME(_name)() -#define NETLIB_CONSTRUCTOR_EX(_name, ...) \ +#define NETLIB_CONSTRUCTOR_EX(_name, ...) \ private: family_setter_t m_famsetter; \ public: template <class _CLASS> ATTR_COLD NETLIB_NAME(_name)(_CLASS &owner, const pstring name, __VA_ARGS__) \ : device_t(owner, name) -#define NETLIB_DYNAMIC() \ +#define NETLIB_DYNAMIC() \ public: ATTR_HOT virtual bool is_dynamic1() const override { return true; } -#define NETLIB_TIMESTEP() \ - public: ATTR_HOT virtual bool is_timestep() const override { return true; } \ +#define NETLIB_TIMESTEP() \ + public: ATTR_HOT virtual bool is_timestep() const override { return true; } \ public: ATTR_HOT virtual void step_time(const nl_double step) override +#define NETLIB_UPDATE_AFTER_PARAM_CHANGE() \ + public: ATTR_HOT virtual bool needs_update_after_param_change() const override { return true; } + #define NETLIB_FAMILY(_family) , m_famsetter(*this, _family) #define NETLIB_UPDATE_TERMINALSI() public: ATTR_HOT virtual void update_terminals() override @@ -403,8 +406,8 @@ namespace netlist #if 1 public: - void * operator new (size_t size); - void operator delete (void * mem); + void * operator new (size_t size); + void operator delete (void * mem); #endif }; @@ -896,9 +899,11 @@ namespace netlist }; // ----------------------------------------------------------------------------- - // net_param_t + // param_t // ----------------------------------------------------------------------------- + class device_t; + class param_t : public device_object_t { P_PREVENT_COPYING(param_t) @@ -912,7 +917,7 @@ namespace netlist LOGIC }; - ATTR_COLD param_t(const param_type_t atype); + ATTR_COLD param_t(const param_type_t atype, device_t &device, const pstring &name); ATTR_HOT param_type_t param_type() const { return m_param_type; } @@ -924,16 +929,12 @@ namespace netlist const param_type_t m_param_type; }; - template <class C, param_t::param_type_t T> + template <typename C, param_t::param_type_t T> class param_template_t : public param_t { P_PREVENT_COPYING(param_template_t) public: - ATTR_COLD param_template_t() - : param_t(T) - , m_param(C(0)) - { - } + param_template_t(device_t &device, const pstring name, const C val); operator const C() const { return Value(); } @@ -942,14 +943,6 @@ namespace netlist ATTR_HOT C Value() const { return m_param; } protected: - virtual void save_register() override - { - /* pstrings not yet supported, these need special logic */ - if (T != param_t::STRING && T != param_t::MODEL) - save(NLNAME(m_param)); - param_t::save_register(); - } - virtual void changed() { } C m_param; private: @@ -959,18 +952,13 @@ namespace netlist using param_int_t = param_template_t<int, param_t::INTEGER>; using param_str_t = param_template_t<pstring, param_t::STRING>; - class param_logic_t : public param_int_t - { - P_PREVENT_COPYING(param_logic_t) - public: - ATTR_COLD param_logic_t() : param_int_t() { }; - }; + using param_logic_t = param_template_t<int, param_t::INTEGER>; - class param_model_t : public param_template_t<pstring, param_t::MODEL> + class param_model_t : public param_str_t { - P_PREVENT_COPYING(param_model_t) public: - ATTR_COLD param_model_t() : param_template_t<pstring, param_t::MODEL>() { } + ATTR_COLD param_model_t(device_t &device, const pstring name, const pstring val) + : param_str_t(device, name, val) { } /* these should be cached! */ ATTR_COLD nl_double model_value(const pstring &entity); @@ -1001,8 +989,6 @@ namespace netlist virtual ~core_device_t(); - ATTR_HOT virtual void update_param() {} - ATTR_HOT void update_dev() { begin_timing(stat_total_time); @@ -1060,14 +1046,17 @@ namespace netlist protected: - /*ATTR_HOT*/ virtual void update() NOEXCEPT { } + ATTR_HOT virtual void update() NOEXCEPT { } ATTR_HOT virtual void stop() { } public: ATTR_HOT virtual void step_time(ATTR_UNUSED const nl_double st) { } ATTR_HOT virtual void update_terminals() { } + + ATTR_HOT virtual void update_param() {} ATTR_HOT virtual bool is_dynamic1() const { return false; } ATTR_HOT virtual bool is_timestep() const { return false; } + ATTR_HOT virtual bool needs_update_after_param_change() const { return false; } private: @@ -1083,6 +1072,22 @@ namespace netlist }; // ----------------------------------------------------------------------------- + // param_ref_t + // ----------------------------------------------------------------------------- + + struct param_ref_t + { + param_ref_t(const pstring name, core_device_t &device, param_t ¶m) + : m_name(name) + , m_device(device) + , m_param(param) + { } + pstring m_name; + core_device_t &m_device; + param_t &m_param; + }; + + // ----------------------------------------------------------------------------- // device_t // ----------------------------------------------------------------------------- @@ -1318,6 +1323,8 @@ protected: m_param = param; changed(); device().update_param(); + if (device().needs_update_after_param_change()) + device().update_dev(); } } diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index 0bd668b475d..6eaca97906f 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -33,19 +33,23 @@ namespace netlist public: ATTR_HOT entry_t() : m_exec_time(), m_object() {} +#if 0 ATTR_HOT entry_t(entry_t &&right) NOEXCEPT : m_exec_time(right.m_exec_time), m_object(right.m_object) {} ATTR_HOT entry_t(const entry_t &right) NOEXCEPT : m_exec_time(right.m_exec_time), m_object(right.m_object) {} +#endif ATTR_HOT entry_t(const _Time &atime, const _Element &elem) NOEXCEPT : m_exec_time(atime), m_object(elem) {} ATTR_HOT const _Time &exec_time() const { return m_exec_time; } ATTR_HOT const _Element &object() const { return m_object; } +#if 0 ATTR_HOT entry_t &operator=(const entry_t &right) NOEXCEPT { m_exec_time = right.m_exec_time; m_object = right.m_object; return *this; } +#endif private: _Time m_exec_time; _Element m_object; @@ -70,7 +74,7 @@ namespace netlist /* Lock */ while (m_lock.exchange(1)) { } #endif -#if 0 +#if 1 const _Time t = e.exec_time(); entry_t * i = m_end++; for (; t > (i - 1)->exec_time(); i--) diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 78adefff6f8..53cb1f45a85 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -206,6 +206,44 @@ pstring setup_t::objtype_as_astr(object_t &in) const return "Error"; } +void setup_t::register_and_set_param(pstring name, param_t ¶m) +{ + if (m_param_values.contains(name)) + { + const pstring val = m_param_values[name]; + log().debug("Found parameter ... {1} : {1}\n", name, val); + switch (param.param_type()) + { + case param_t::DOUBLE: + { + double vald = 0; + if (sscanf(val.cstr(), "%lf", &vald) != 1) + log().fatal("Invalid number conversion {1} : {2}\n", name, val); + dynamic_cast<param_double_t &>(param).initial(vald); + } + break; + case param_t::INTEGER: + case param_t::LOGIC: + { + double vald = 0; + if (sscanf(val.cstr(), "%lf", &vald) != 1) + log().fatal("Invalid number conversion {1} : {2}\n", name, val); + dynamic_cast<param_int_t &>(param).initial((int) vald); + } + break; + case param_t::STRING: + case param_t::MODEL: + { + dynamic_cast<param_str_t &>(param).initial(val); + } + break; + default: + log().fatal("Parameter is not supported {1} : {2}\n", name, val); + } + } + if (!m_params.add(param.name(), param_ref_t(param.name(), param.device(), param))) + log().fatal("Error adding parameter {1} to parameter list\n", name); +} void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj) { @@ -254,46 +292,8 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj) break; case terminal_t::PARAM: { - param_t ¶m = dynamic_cast<param_t &>(obj); - if (m_param_values.contains(name)) - { - const pstring val = m_param_values[name]; - switch (param.param_type()) - { - case param_t::DOUBLE: - { - log().debug("Found parameter ... {1} : {1}\n", name, val); - double vald = 0; - if (sscanf(val.cstr(), "%lf", &vald) != 1) - log().fatal("Invalid number conversion {1} : {2}\n", name, val); - dynamic_cast<param_double_t &>(param).initial(vald); - } - break; - case param_t::INTEGER: - case param_t::LOGIC: - { - log().debug("Found parameter ... {1} : {2}\n", name, val); - double vald = 0; - if (sscanf(val.cstr(), "%lf", &vald) != 1) - log().fatal("Invalid number conversion {1} : {2}\n", name, val); - dynamic_cast<param_int_t &>(param).initial((int) vald); - } - break; - case param_t::STRING: - { - dynamic_cast<param_str_t &>(param).initial(val); - } - break; - case param_t::MODEL: - //dynamic_cast<param_model_t &>(param).initial(val); - dynamic_cast<param_model_t &>(param).initial(val); - break; - default: - log().fatal("Parameter is not supported {1} : {2}\n", name, val); - } - } - if (!m_params.add(param.name(), ¶m)) - log().fatal("Error adding parameter {1} to parameter list\n", name); + //register_and_set_param(name, dynamic_cast<param_t &>(obj)); + log().fatal("should use register_param"); } break; case terminal_t::DEVICE: @@ -482,7 +482,7 @@ param_t *setup_t::find_param(const pstring ¶m_in, bool required) log().fatal("parameter {1}({2}) not found!\n", param_in_fqn, outname); if (ret != -1) log().debug("Found parameter {1}\n", outname); - return (ret == -1 ? nullptr : m_params.value_at(ret)); + return (ret == -1 ? nullptr : &m_params.value_at(ret).m_param); } // FIXME avoid dynamic cast here diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index 44569a40cbd..c795cba818b 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -111,6 +111,8 @@ namespace netlist pstring build_fqn(const pstring &obj_name) const; + void register_and_set_param(pstring name, param_t ¶m); + void register_object(device_t &dev, const pstring &name, object_t &obj); template<class NETLIST_X> @@ -208,7 +210,7 @@ namespace netlist netlist_t &m_netlist; phashmap_t<pstring, pstring> m_alias; - phashmap_t<pstring, param_t *> m_params; + phashmap_t<pstring, param_ref_t> m_params; phashmap_t<pstring, pstring> m_param_values; phashmap_t<pstring, core_terminal_t *> m_terminals; diff --git a/src/lib/netlist/nl_util.h b/src/lib/netlist/nl_util.h index 69ffb10ecdd..f25a0d13320 100644 --- a/src/lib/netlist/nl_util.h +++ b/src/lib/netlist/nl_util.h @@ -182,7 +182,7 @@ public: } bool is_owned() const { return m_is_owned; } - + template<typename _DC> powned_ptr<_DC> & operator =(powned_ptr<_DC> &r) { diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index 7b4be017c33..a4e046125d5 100644 --- a/src/lib/netlist/plib/palloc.h +++ b/src/lib/netlist/plib/palloc.h @@ -95,13 +95,16 @@ inline void pfree_array_t(T *p) pfree_raw(s); } +#if 0 #define palloc(T) new(ppool) T #define pfree(_ptr) pfree_t(_ptr) -#if 1 #define palloc_array(T, N) palloc_array_t<T>(N) #define pfree_array(_ptr) pfree_array_t(_ptr) #else +#define palloc(T) new T +#define pfree(_ptr) delete _ptr + #define palloc_array(T, N) new T[N] #define pfree_array(_ptr) delete[] _ptr #endif diff --git a/src/lib/netlist/plib/pdynlib.cpp b/src/lib/netlist/plib/pdynlib.cpp index 743ea7705f4..d08f194a137 100644 --- a/src/lib/netlist/plib/pdynlib.cpp +++ b/src/lib/netlist/plib/pdynlib.cpp @@ -41,7 +41,7 @@ pdynlib::pdynlib(const pstring libname) pdynlib::pdynlib(const pstring path, const pstring libname) : m_isLoaded(false), m_lib(nullptr) { - // printf("win: loading <%s>\n", libname.cstr()); + // printf("win: loading <%s>\n", libname.cstr()); #ifdef _WIN32 if (libname != "") m_lib = LoadLibrary(libname.cstr()); diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index 93d01c962f2..ab6364cb2d3 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -87,7 +87,7 @@ public: matrix_solver_t(netlist_t &anetlist, const pstring &name, const eSortType sort, const solver_parameters_t *params) : device_t(anetlist, name), - m_stat_calculations(0), + m_stat_calculations(0), m_stat_newton_raphson(0), m_stat_vsolver_calls(0), m_iterative_fail(0), diff --git a/src/lib/netlist/solver/nld_ms_sm.h b/src/lib/netlist/solver/nld_ms_sm.h index c5d0e1105b6..1a3c50b4a27 100644 --- a/src/lib/netlist/solver/nld_ms_sm.h +++ b/src/lib/netlist/solver/nld_ms_sm.h @@ -13,9 +13,9 @@ * In this specific implementation, u is a unit vector specifying the row which * changed. Thus v contains the changed column. * - * Than z = A^-1 u , w = transpose(A^-1) v , lambda = v z + * Than z = A⁻¹ u , w = transpose(A⁻¹) v , lambda = v z * - * A^-1 <- 1.0 / (1.0 + lambda) * (z x w) + * A⁻¹ <- 1.0 / (1.0 + lambda) * (z x w) * * The approach is iterative and applied for each row changed. * diff --git a/src/lib/netlist/solver/nld_ms_w.h b/src/lib/netlist/solver/nld_ms_w.h index e976fcf3184..f61c2b1b616 100644 --- a/src/lib/netlist/solver/nld_ms_w.h +++ b/src/lib/netlist/solver/nld_ms_w.h @@ -15,7 +15,7 @@ * Whilst the book proposes to invert the matrix R=(I+transpose(V)*Z) we define * * w = transpose(V)*y - * a = R^-1 * w + * a = R⁻¹ * w * * and consequently * diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index a6c55e1cebe..33b1bb9bb5d 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -567,12 +567,6 @@ NETLIB_RESET(solver) m_mat_solvers[i]->do_reset(); } - -NETLIB_UPDATE_PARAM(solver) -{ - //m_inc = time::from_hz(m_freq.Value()); -} - NETLIB_STOP(solver) { for (std::size_t i = 0; i < m_mat_solvers.size(); i++) diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h index 8e594e621f6..8b1e674cbdd 100644 --- a/src/lib/netlist/solver/nld_solver.h +++ b/src/lib/netlist/solver/nld_solver.h @@ -54,34 +54,31 @@ class matrix_solver_t; NETLIB_OBJECT(solver) { NETLIB_CONSTRUCTOR(solver) + , m_sync_delay(*this, "SYNC_DELAY", NLTIME_FROM_NS(10).as_double()) + , m_freq(*this, "FREQ", 48000.0) + + /* iteration parameters */ + , m_sor(*this, "SOR_FACTOR", 1.059) + , m_iterative_solver(*this, "ITERATIVE", "SOR") + , m_accuracy(*this, "ACCURACY", 1e-7) + , m_gs_threshold(*this, "GS_THRESHOLD", 6) // below this value, gaussian elimination is used + , m_gs_loops(*this, "GS_LOOPS",9) // Gauss-Seidel loops + + /* general parameters */ + , m_gmin(*this, "GMIN", NETLIST_GMIN_DEFAULT) + , m_pivot(*this, "PIVOT", 0) // use pivoting - on supported solvers + , m_nr_loops(*this, "NR_LOOPS", 250) // Newton-Raphson loops + , m_parallel(*this, "PARALLEL", 0) + + /* automatic time step */ + , m_dynamic(*this, "DYNAMIC_TS", 0) + , m_lte(*this, "DYNAMIC_LTE", 5e-5) // diff/timestep + , m_min_timestep(*this, "MIN_TIMESTEP", 1e-6) // nl_double timestep resolution + + , m_log_stats(*this, "LOG_STATS", 1) // nl_double timestep resolution { enregister("Q_step", m_Q_step); - register_param("SYNC_DELAY", m_sync_delay, NLTIME_FROM_NS(10).as_double()); - - register_param("FREQ", m_freq, 48000.0); - - - /* iteration parameters */ - register_param("SOR_FACTOR", m_sor, 1.059); - register_param("ITERATIVE", m_iterative_solver, "SOR"); - register_param("ACCURACY", m_accuracy, 1e-7); - register_param("GS_THRESHOLD", m_gs_threshold, 6); // below this value, gaussian elimination is used - register_param("GS_LOOPS", m_gs_loops, 9); // Gauss-Seidel loops - - /* general parameters */ - register_param("GMIN", m_gmin, NETLIST_GMIN_DEFAULT); - register_param("PIVOT", m_pivot, 0); // use pivoting - on supported solvers - register_param("NR_LOOPS", m_nr_loops, 250); // Newton-Raphson loops - register_param("PARALLEL", m_parallel, 0); - - /* automatic time step */ - register_param("DYNAMIC_TS", m_dynamic, 0); - register_param("DYNAMIC_LTE", m_lte, 5e-5); // diff/timestep - register_param("MIN_TIMESTEP", m_min_timestep, 1e-6); // nl_double timestep resolution - - register_param("LOG_STATS", m_log_stats, 1); // nl_double timestep resolution - // internal staff enregister("FB_step", m_fb_step); @@ -99,27 +96,27 @@ NETLIB_OBJECT(solver) NETLIB_UPDATEI(); NETLIB_RESETI(); - NETLIB_UPDATE_PARAMI(); + // NETLIB_UPDATE_PARAMI(); protected: logic_input_t m_fb_step; logic_output_t m_Q_step; - param_logic_t m_pivot; - param_double_t m_freq; param_double_t m_sync_delay; + param_double_t m_freq; + param_double_t m_sor; + param_str_t m_iterative_solver; param_double_t m_accuracy; + param_int_t m_gs_threshold; + param_int_t m_gs_loops; param_double_t m_gmin; - param_double_t m_lte; - param_double_t m_sor; + param_logic_t m_pivot; + param_int_t m_nr_loops; + param_int_t m_parallel; param_logic_t m_dynamic; + param_double_t m_lte; param_double_t m_min_timestep; - param_str_t m_iterative_solver; - param_int_t m_nr_loops; - param_int_t m_gs_loops; - param_int_t m_gs_threshold; - param_int_t m_parallel; param_logic_t m_log_stats; |