summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author couriersud <couriersud@arcor.de>2016-05-25 13:47:19 +0200
committer couriersud <couriersud@arcor.de>2016-05-25 14:31:43 +0200
commitcac1c41edfe85ab1350d77346cb490ee4c0c1298 (patch)
tree3a74fecbbc5ccea296d0ce372dd718638844c2a1 /src
parentc97c3ae855828dc0d04254c7d63131329ee123a6 (diff)
Moved all parameter definitions in constructors. (nw)
Diffstat (limited to 'src')
-rw-r--r--src/devices/machine/netlist.h24
-rw-r--r--src/lib/netlist/analog/nld_bjt.h2
-rw-r--r--src/lib/netlist/analog/nld_fourterm.cpp26
-rw-r--r--src/lib/netlist/analog/nld_fourterm.h29
-rw-r--r--src/lib/netlist/analog/nld_opamps.h2
-rw-r--r--src/lib/netlist/analog/nld_switches.h5
-rw-r--r--src/lib/netlist/analog/nld_twoterm.h29
-rw-r--r--src/lib/netlist/devices/nld_4020.h1
-rw-r--r--src/lib/netlist/devices/nld_4066.h2
-rw-r--r--src/lib/netlist/devices/nld_74107.cpp4
-rw-r--r--src/lib/netlist/devices/nld_74107.h2
-rw-r--r--src/lib/netlist/devices/nld_74123.h8
-rw-r--r--src/lib/netlist/devices/nld_74153.h2
-rw-r--r--src/lib/netlist/devices/nld_7448.h3
-rw-r--r--src/lib/netlist/devices/nld_7450.h1
-rw-r--r--src/lib/netlist/devices/nld_7474.cpp2
-rw-r--r--src/lib/netlist/devices/nld_7474.h1
-rw-r--r--src/lib/netlist/devices/nld_74ls629.h2
-rw-r--r--src/lib/netlist/devices/nld_legacy.cpp2
-rw-r--r--src/lib/netlist/devices/nld_legacy.h5
-rw-r--r--src/lib/netlist/devices/nld_mm5837.cpp4
-rw-r--r--src/lib/netlist/devices/nld_ne555.h1
-rw-r--r--src/lib/netlist/devices/nld_r2r_dac.h8
-rw-r--r--src/lib/netlist/devices/nld_system.cpp24
-rw-r--r--src/lib/netlist/devices/nld_system.h55
-rw-r--r--src/lib/netlist/macro/nlm_ttl74xx.cpp22
-rw-r--r--src/lib/netlist/macro/nlm_ttl74xx.h12
-rw-r--r--src/lib/netlist/nl_base.cpp99
-rw-r--r--src/lib/netlist/nl_base.h81
-rw-r--r--src/lib/netlist/nl_lists.h6
-rw-r--r--src/lib/netlist/nl_setup.cpp82
-rw-r--r--src/lib/netlist/nl_setup.h4
-rw-r--r--src/lib/netlist/nl_util.h2
-rw-r--r--src/lib/netlist/plib/palloc.h5
-rw-r--r--src/lib/netlist/plib/pdynlib.cpp2
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.h2
-rw-r--r--src/lib/netlist/solver/nld_ms_sm.h4
-rw-r--r--src/lib/netlist/solver/nld_ms_w.h2
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp6
-rw-r--r--src/lib/netlist/solver/nld_solver.h67
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 &param, 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 &param, const double initialVal);
+template ATTR_COLD void device_t::register_param(const pstring &sname, param_double_t &param, const float initialVal);
+template ATTR_COLD void device_t::register_param(const pstring &sname, param_int_t &param, const int initialVal);
+template ATTR_COLD void device_t::register_param(const pstring &sname, param_logic_t &param, const int initialVal);
+template ATTR_COLD void device_t::register_param(const pstring &sname, param_str_t &param, const char * const initialVal);
+template ATTR_COLD void device_t::register_param(const pstring &sname, param_str_t &param, const pstring &initialVal);
+template ATTR_COLD void device_t::register_param(const pstring &sname, param_model_t &param, 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 &param, 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 &param, const double initialVal);
-template ATTR_COLD void device_t::register_param(const pstring &sname, param_double_t &param, const float initialVal);
-template ATTR_COLD void device_t::register_param(const pstring &sname, param_int_t &param, const int initialVal);
-template ATTR_COLD void device_t::register_param(const pstring &sname, param_logic_t &param, const int initialVal);
-template ATTR_COLD void device_t::register_param(const pstring &sname, param_str_t &param, const char * const initialVal);
-template ATTR_COLD void device_t::register_param(const pstring &sname, param_str_t &param, const pstring &initialVal);
-template ATTR_COLD void device_t::register_param(const pstring &sname, param_model_t &param, 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 &param)
+ : 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 &param)
+{
+ 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 &param = 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(), &param))
- 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 &param_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 &param);
+
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;