summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist
diff options
context:
space:
mode:
author couriersud <couriersud@arcor.de>2016-05-29 19:30:05 +0200
committer couriersud <couriersud@arcor.de>2016-06-07 21:41:54 +0200
commit3d3f5761f0b0419581762f72ea0984e047d3e55c (patch)
tree9330381da7fef4e9c9013809bba28f2a272da505 /src/lib/netlist
parentb27790890530b658e178846e7da01045185f0fce (diff)
- Added constructors to prepare to move terminal setup into constructor.
- Reworked twoterm setup. Fixed some timebombs along the way. - Fix r2r dac. Remove dead code. - analog_outputs now created in constructor. - moved analog_input creation into constructor. - moved logic output creation to constructor. - moved all logic inputs into constructor. - Completely removed init_object. Finally. [Couriersud]
Diffstat (limited to 'src/lib/netlist')
-rw-r--r--src/lib/netlist/analog/nld_bjt.h38
-rw-r--r--src/lib/netlist/analog/nld_fourterm.h22
-rw-r--r--src/lib/netlist/analog/nld_opamps.h12
-rw-r--r--src/lib/netlist/analog/nld_twoterm.cpp4
-rw-r--r--src/lib/netlist/analog/nld_twoterm.h34
-rw-r--r--src/lib/netlist/devices/nld_4020.cpp27
-rw-r--r--src/lib/netlist/devices/nld_4066.cpp3
-rw-r--r--src/lib/netlist/devices/nld_74107.cpp14
-rw-r--r--src/lib/netlist/devices/nld_74123.cpp19
-rw-r--r--src/lib/netlist/devices/nld_74153.cpp21
-rw-r--r--src/lib/netlist/devices/nld_74175.cpp27
-rw-r--r--src/lib/netlist/devices/nld_74192.cpp28
-rw-r--r--src/lib/netlist/devices/nld_74193.cpp28
-rw-r--r--src/lib/netlist/devices/nld_7448.cpp26
-rw-r--r--src/lib/netlist/devices/nld_7450.cpp10
-rw-r--r--src/lib/netlist/devices/nld_7474.cpp13
-rw-r--r--src/lib/netlist/devices/nld_7483.cpp30
-rw-r--r--src/lib/netlist/devices/nld_7490.cpp25
-rw-r--r--src/lib/netlist/devices/nld_7493.cpp8
-rw-r--r--src/lib/netlist/devices/nld_74ls629.cpp11
-rw-r--r--src/lib/netlist/devices/nld_82S16.cpp62
-rw-r--r--src/lib/netlist/devices/nld_9310.cpp38
-rw-r--r--src/lib/netlist/devices/nld_9316.cpp30
-rw-r--r--src/lib/netlist/devices/nld_legacy.cpp14
-rw-r--r--src/lib/netlist/devices/nld_log.cpp4
-rw-r--r--src/lib/netlist/devices/nld_mm5837.cpp18
-rw-r--r--src/lib/netlist/devices/nld_ne555.cpp8
-rw-r--r--src/lib/netlist/devices/nld_r2r_dac.cpp4
-rw-r--r--src/lib/netlist/devices/nld_truthtable.h9
-rw-r--r--src/lib/netlist/devices/nlid_cmos.h5
-rw-r--r--src/lib/netlist/devices/nlid_system.h66
-rw-r--r--src/lib/netlist/nl_base.cpp215
-rw-r--r--src/lib/netlist/nl_base.h101
-rw-r--r--src/lib/netlist/nl_factory.cpp17
-rw-r--r--src/lib/netlist/nl_setup.cpp33
-rw-r--r--src/lib/netlist/nl_setup.h2
-rw-r--r--src/lib/netlist/plib/plists.h18
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.h4
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp1
-rw-r--r--src/lib/netlist/solver/nld_solver.h5
40 files changed, 420 insertions, 634 deletions
diff --git a/src/lib/netlist/analog/nld_bjt.h b/src/lib/netlist/analog/nld_bjt.h
index f61295ab14c..e8b80b94b4c 100644
--- a/src/lib/netlist/analog/nld_bjt.h
+++ b/src/lib/netlist/analog/nld_bjt.h
@@ -99,21 +99,21 @@ private:
NETLIB_OBJECT_DERIVED(QBJT_switch, QBJT)
{
NETLIB_CONSTRUCTOR_DERIVED(QBJT_switch, QBJT)
- , m_RB(owner, "m_RB")
- , m_RC(owner, "m_RC")
- , m_BC_dummy(owner, "m_BC")
+ , m_RB(*this, "m_RB", true)
+ , m_RC(*this, "m_RC", true)
+ , m_BC_dummy(*this, "m_BC", true)
, m_gB(NETLIST_GMIN_DEFAULT)
, m_gC(NETLIST_GMIN_DEFAULT)
, m_V(0.0)
, m_state_on(0)
{
- enregister("B", m_RB.m_P);
- enregister("E", m_RB.m_N);
- enregister("C", m_RC.m_P);
- enregister("_E1", m_RC.m_N);
+ register_subalias("B", m_RB.m_P);
+ register_subalias("E", m_RB.m_N);
+ register_subalias("C", m_RC.m_P);
+ //register_term("_E1", m_RC.m_N);
- enregister("_B1", m_BC_dummy.m_P);
- enregister("_C1", m_BC_dummy.m_N);
+ //register_term("_B1", m_BC_dummy.m_P);
+ //register_term("_C1", m_BC_dummy.m_N);
connect_late(m_RB.m_N, m_RC.m_N);
@@ -155,20 +155,20 @@ NETLIB_OBJECT_DERIVED(QBJT_EB, QBJT)
{
public:
NETLIB_CONSTRUCTOR_DERIVED(QBJT_EB, QBJT)
- , m_D_CB(owner, "m_D_CB")
- , m_D_EB(owner, "m_D_EB")
- , m_D_EC(owner, "m_D_EC")
+ , m_D_CB(*this, "m_D_CB", true)
+ , m_D_EB(*this, "m_D_EB", true)
+ , m_D_EC(*this, "m_D_EC", true)
, m_alpha_f(0)
, m_alpha_r(0)
{
- enregister("E", m_D_EB.m_P); // Cathode
- enregister("B", m_D_EB.m_N); // Anode
+ register_subalias("E", m_D_EB.m_P); // Cathode
+ register_subalias("B", m_D_EB.m_N); // Anode
- enregister("C", m_D_CB.m_P); // Cathode
- enregister("_B1", m_D_CB.m_N); // Anode
+ register_subalias("C", m_D_CB.m_P); // Cathode
+ //register_term("_B1", m_D_CB.m_N); // Anode
- enregister("_E1", m_D_EC.m_P);
- enregister("_C1", m_D_EC.m_N);
+ //register_term("_E1", m_D_EC.m_P);
+ //register_term("_C1", m_D_EC.m_N);
connect_late(m_D_EB.m_P, m_D_EC.m_P);
connect_late(m_D_EB.m_N, m_D_CB.m_N);
@@ -188,6 +188,7 @@ protected:
generic_diode m_gD_BC;
generic_diode m_gD_BE;
+private:
nld_twoterm m_D_CB; // gcc, gce - gcc, gec - gcc, gcc - gce | Ic
nld_twoterm m_D_EB; // gee, gec - gee, gce - gee, gee - gec | Ie
nld_twoterm m_D_EC; // 0, -gec, -gcc, 0 | 0
@@ -195,7 +196,6 @@ protected:
nl_double m_alpha_f;
nl_double m_alpha_r;
-private:
};
} //namespace devices
diff --git a/src/lib/netlist/analog/nld_fourterm.h b/src/lib/netlist/analog/nld_fourterm.h
index 7b9a86b405b..d87f4ab045d 100644
--- a/src/lib/netlist/analog/nld_fourterm.h
+++ b/src/lib/netlist/analog/nld_fourterm.h
@@ -60,17 +60,14 @@ public:
NETLIB_CONSTRUCTOR(VCCS)
, m_G(*this, "G", 1.0)
, m_RI(*this, "RI", NL_FCONST(1.0) / netlist().gmin())
+ , m_OP(*this, "OP")
+ , m_ON(*this, "ON")
+ , m_IP(*this, "IP")
+ , m_IN(*this, "IN")
+ , m_OP1(*this, "_OP1")
+ , m_ON1(*this, "_ON1")
, m_gfac(1.0)
{
-
- 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...
@@ -205,12 +202,11 @@ NETLIB_OBJECT_DERIVED(VCVS, VCCS)
{
public:
NETLIB_CONSTRUCTOR_DERIVED(VCVS, VCCS)
- , m_RO(*this, "RO",1.0)
+ , m_RO(*this, "RO", 1.0)
+ , m_OP2(*this, "_OP2")
+ , m_ON2(*this, "_ON2")
{
- enregister("_OP2", m_OP2);
- enregister("_ON2", m_ON2);
-
m_OP2.m_otherterm = &m_ON2;
m_ON2.m_otherterm = &m_OP2;
diff --git a/src/lib/netlist/analog/nld_opamps.h b/src/lib/netlist/analog/nld_opamps.h
index 2faab7f1312..850886b7a0e 100644
--- a/src/lib/netlist/analog/nld_opamps.h
+++ b/src/lib/netlist/analog/nld_opamps.h
@@ -42,18 +42,16 @@ NETLIB_OBJECT(OPAMP)
NETLIB_CONSTRUCTOR(OPAMP)
, m_RP(*this, "RP1")
, m_G1(*this, "G1")
+ , m_VCC(*this, "VCC")
+ , m_GND(*this, "GND")
, m_model(*this, "MODEL", "")
+ , m_VH(*this, "VH")
+ , m_VL(*this, "VL")
+ , m_VREF(*this, "VREF")
{
m_type = m_model.model_value("TYPE");
- enregister("VCC", m_VCC);
- enregister("GND", m_GND);
-
- enregister("VL", m_VL);
- enregister("VH", m_VH);
- enregister("VREF", m_VREF);
-
if (m_type == 1)
{
register_subalias("PLUS", "G1.IP");
diff --git a/src/lib/netlist/analog/nld_twoterm.cpp b/src/lib/netlist/analog/nld_twoterm.cpp
index e6294fda0fb..def0730b5aa 100644
--- a/src/lib/netlist/analog/nld_twoterm.cpp
+++ b/src/lib/netlist/analog/nld_twoterm.cpp
@@ -53,10 +53,6 @@ ATTR_COLD void generic_diode::save(pstring name, object_t &parent)
NETLIB_UPDATE(twoterm)
{
- /* FIXME: some proxies created seem to be disconnected again
- * or not even properly connected.
- * Example: pong proxy_da_c9c.Q_1.RV
- */
/* only called if connected to a rail net ==> notify the solver to recalculate */
/* we only need to call the non-rail terminal */
if (m_P.has_net() && !m_P.net().isRailNet())
diff --git a/src/lib/netlist/analog/nld_twoterm.h b/src/lib/netlist/analog/nld_twoterm.h
index fed385fcedb..5eecdb05299 100644
--- a/src/lib/netlist/analog/nld_twoterm.h
+++ b/src/lib/netlist/analog/nld_twoterm.h
@@ -105,8 +105,9 @@ namespace netlist
NETLIB_OBJECT(twoterm)
{
-public:
- NETLIB_CONSTRUCTOR(twoterm)
+ NETLIB_CONSTRUCTOR_EX(twoterm, bool terminals_owned = false)
+ , m_P(bselect(terminals_owned, owner, *this), (terminals_owned ? name + "." : "") + "1")
+ , m_N(bselect(terminals_owned, owner, *this), (terminals_owned ? name + "." : "") + "2")
{
m_P.m_otherterm = &m_N;
m_N.m_otherterm = &m_P;
@@ -115,8 +116,8 @@ public:
terminal_t m_P;
terminal_t m_N;
- NETLIB_UPDATE_TERMINALSI() { }
- NETLIB_RESETI() { }
+ //NETLIB_UPDATE_TERMINALSI() { }
+ //NETLIB_RESETI() { }
NETLIB_UPDATEI();
public:
@@ -140,8 +141,15 @@ public:
}
private:
+ template <class C>
+ static core_device_t &bselect(bool b, C &d1, core_device_t &d2)
+ {
+ core_device_t *h = dynamic_cast<core_device_t *>(&d1);
+ return b ? *h : d2;
+ }
};
+
// -----------------------------------------------------------------------------
// nld_R
// -----------------------------------------------------------------------------
@@ -150,8 +158,6 @@ NETLIB_OBJECT_DERIVED(R_base, twoterm)
{
NETLIB_CONSTRUCTOR_DERIVED(R_base, twoterm)
{
- enregister("1", m_P);
- enregister("2", m_N);
}
public:
@@ -272,8 +278,8 @@ public:
, m_C(*this, "C", 1e-6)
, m_GParallel(0.0)
{
- enregister("1", m_P);
- enregister("2", m_N);
+ //register_term("1", m_P);
+ //register_term("2", m_N);
}
NETLIB_TIMESTEP()
@@ -380,8 +386,8 @@ public:
NETLIB_CONSTRUCTOR_DERIVED(D, twoterm)
, m_model(*this, "MODEL", "")
{
- enregister("A", m_P);
- enregister("K", m_N);
+ register_subalias("A", m_P);
+ register_subalias("K", m_N);
m_D.save("m_D", *this);
}
@@ -415,8 +421,8 @@ public:
, m_V(*this, "V", 0.0)
{
- enregister("P", m_P);
- enregister("N", m_N);
+ register_subalias("P", m_P);
+ register_subalias("N", m_N);
}
protected:
@@ -437,8 +443,8 @@ public:
NETLIB_CONSTRUCTOR_DERIVED(CS, twoterm)
, m_I(*this, "I", 1.0)
{
- enregister("P", m_P);
- enregister("N", m_N);
+ register_subalias("P", m_P);
+ register_subalias("N", m_N);
}
NETLIB_UPDATEI();
diff --git a/src/lib/netlist/devices/nld_4020.cpp b/src/lib/netlist/devices/nld_4020.cpp
index 44083ad6ba5..31fd7ffae85 100644
--- a/src/lib/netlist/devices/nld_4020.cpp
+++ b/src/lib/netlist/devices/nld_4020.cpp
@@ -10,6 +10,8 @@
namespace netlist
{
+
+
namespace devices
{
@@ -17,23 +19,11 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(CD4020_sub)
NETLIB_FAMILY("CD4XXX")
+ , m_IP(*this, "IP")
+ , m_Q(*this, {"Q1", "_Q2", "_Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9",
+ "Q10", "Q11", "Q12", "Q13", "Q14"})
, m_cnt(0)
{
- enregister("IP", m_IP);
-
- enregister("Q1", m_Q[0]);
- enregister("Q4", m_Q[3]);
- enregister("Q5", m_Q[4]);
- enregister("Q6", m_Q[5]);
- enregister("Q7", m_Q[6]);
- enregister("Q8", m_Q[7]);
- enregister("Q9", m_Q[8]);
- enregister("Q10", m_Q[9]);
- enregister("Q11", m_Q[10]);
- enregister("Q12", m_Q[11]);
- enregister("Q13", m_Q[12]);
- enregister("Q14", m_Q[13]);
-
save(NLNAME(m_cnt));
}
@@ -49,7 +39,7 @@ namespace netlist
ATTR_HOT void update_outputs(const UINT16 cnt);
logic_input_t m_IP;
- logic_output_t m_Q[14];
+ object_array_t<logic_output_t, 14> m_Q;
UINT16 m_cnt;
};
@@ -60,9 +50,8 @@ namespace netlist
NETLIB_FAMILY("CD4XXX")
, m_sub(*this, "sub")
, m_supply(*this, "supply")
+ , m_RESET(*this, "RESET")
{
-
- enregister("RESET", m_RESET);
register_subalias("IP", m_sub.m_IP);
register_subalias("Q1", m_sub.m_Q[0]);
register_subalias("Q4", m_sub.m_Q[3]);
@@ -124,7 +113,7 @@ namespace netlist
NLTIME_FROM_NS(1380), NLTIME_FROM_NS(1480),
};
- OUTLOGIC(m_Q[0], 0, out_delayQn[0]);
+ OUTLOGIC(m_Q[0], cnt & 1, out_delayQn[0]);
for (int i=3; i<14; i++)
OUTLOGIC(m_Q[i], (cnt >> i) & 1, out_delayQn[i]);
}
diff --git a/src/lib/netlist/devices/nld_4066.cpp b/src/lib/netlist/devices/nld_4066.cpp
index 788704b617e..8aeac121b8c 100644
--- a/src/lib/netlist/devices/nld_4066.cpp
+++ b/src/lib/netlist/devices/nld_4066.cpp
@@ -6,6 +6,7 @@
*/
#include <devices/nlid_cmos.h>
+#include "analog/nld_twoterm.h"
#include "nld_4066.h"
namespace netlist
@@ -19,9 +20,9 @@ namespace netlist
NETLIB_FAMILY("CD4XXX")
, m_supply(*this, "PS")
, m_R(*this, "R")
+ , m_control(*this, "CTL")
, m_base_r(*this, "BASER", 270.0)
{
- enregister("CTL", m_control);
}
NETLIB_RESETI() { }
diff --git a/src/lib/netlist/devices/nld_74107.cpp b/src/lib/netlist/devices/nld_74107.cpp
index cc0746fe131..27b81e14beb 100644
--- a/src/lib/netlist/devices/nld_74107.cpp
+++ b/src/lib/netlist/devices/nld_74107.cpp
@@ -15,15 +15,14 @@ namespace netlist
NETLIB_OBJECT(74107Asub)
{
NETLIB_CONSTRUCTOR(74107Asub)
+ , m_clk(*this, "CLK")
+ , m_Q(*this, "Q")
+ , m_QQ(*this, "QQ")
, m_Q1(0)
, m_Q2(0)
, m_F(0)
{
- enregister("CLK", m_clk);
- enregister("Q", m_Q);
- enregister("QQ", m_QQ);
-
save(NLNAME(m_Q1));
save(NLNAME(m_Q2));
save(NLNAME(m_F));
@@ -50,12 +49,11 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(74107A)
, m_sub(*this, "sub")
+ , m_J(*this, "J")
+ , m_K(*this, "K")
+ , m_clrQ(*this, "CLRQ")
{
-
register_subalias("CLK", m_sub.m_clk);
- enregister("J", m_J);
- enregister("K", m_K);
- enregister("CLRQ", m_clrQ);
register_subalias("Q", m_sub.m_Q);
register_subalias("QQ", m_sub.m_QQ);
}
diff --git a/src/lib/netlist/devices/nld_74123.cpp b/src/lib/netlist/devices/nld_74123.cpp
index 1fc8ddd74a3..943fd3e14df 100644
--- a/src/lib/netlist/devices/nld_74123.cpp
+++ b/src/lib/netlist/devices/nld_74123.cpp
@@ -24,23 +24,20 @@ namespace netlist
, m_dev_type(dev_type)
, m_RP(*this, "RP")
, m_RN(*this, "RN")
+ , m_RP_Q(*this, "_RP_Q")
+ , m_RN_Q(*this, "_RN_Q")
+ , m_A(*this, "A")
+ , m_B(*this, "B")
+ , m_CLRQ(*this, "CLRQ")
+ , m_Q(*this, "Q")
+ , m_QQ(*this, "QQ")
+ , m_CV(*this, "_CV") // internal
, 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;
- enregister("A", m_A);
- enregister("B", m_B);
- enregister("CLRQ", m_CLRQ);
- enregister("Q", m_Q);
- enregister("QQ", m_QQ);
-
- enregister("_RP_Q", m_RP_Q); // internal
- enregister("_RN_Q", m_RN_Q); // internal
-
- enregister("_CV", m_CV); // internal
-
register_subalias("GND", m_RN.m_R.m_N);
register_subalias("VCC", m_RP.m_R.m_P);
register_subalias("C", m_RN.m_R.m_N);
diff --git a/src/lib/netlist/devices/nld_74153.cpp b/src/lib/netlist/devices/nld_74153.cpp
index 5b3408f1470..2dffd34e1ef 100644
--- a/src/lib/netlist/devices/nld_74153.cpp
+++ b/src/lib/netlist/devices/nld_74153.cpp
@@ -20,16 +20,11 @@ namespace netlist
NETLIB_OBJECT(74153sub)
{
NETLIB_CONSTRUCTOR(74153sub)
+ , m_C(*this, {"C0", "C1", "C2", "C3"})
+ , m_G(*this, "G")
+ , m_Y(*this, "AY") //FIXME: Change netlists
, m_chan(0)
{
- enregister("C0", m_C[0]);
- enregister("C1", m_C[1]);
- enregister("C2", m_C[2]);
- enregister("C3", m_C[3]);
- enregister("G", m_G);
-
- enregister("AY", m_Y); //FIXME: Change netlists
-
save(NLNAME(m_chan));
}
@@ -37,7 +32,7 @@ namespace netlist
NETLIB_UPDATEI();
public:
- logic_input_t m_C[4];
+ object_array_t<logic_input_t, 4> m_C;
logic_input_t m_G;
logic_output_t m_Y;
@@ -49,14 +44,14 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(74153)
, m_sub(*this, "sub")
+ , m_A(*this, "A")
+ , m_B(*this, "B")
{
register_subalias("C0", m_sub.m_C[0]);
register_subalias("C1", m_sub.m_C[1]);
register_subalias("C2", m_sub.m_C[2]);
register_subalias("C3", m_sub.m_C[3]);
- enregister("A", m_A);
- enregister("B", m_B);
register_subalias("G", m_sub.m_G);
register_subalias("AY", m_sub.m_Y); //FIXME: Change netlists
@@ -74,10 +69,11 @@ namespace netlist
NETLIB_CONSTRUCTOR(74153_dip)
, m_1(*this, "1")
, m_2(*this, "2")
+ , m_A(*this, "14") // m_2.m_B
+ , m_B(*this, "2") // m_2.m_B
{
register_subalias("1", m_1.m_G);
- enregister("2", m_B); // m_2.m_B
register_subalias("3", m_1.m_C[3]);
register_subalias("4", m_1.m_C[2]);
register_subalias("5", m_1.m_C[1]);
@@ -90,7 +86,6 @@ namespace netlist
register_subalias("12", m_2.m_C[2]);
register_subalias("13", m_2.m_C[3]);
- enregister("14", m_A); // m_2.m_B
register_subalias("15", m_2.m_G);
}
diff --git a/src/lib/netlist/devices/nld_74175.cpp b/src/lib/netlist/devices/nld_74175.cpp
index 53ef7bbe815..22edfb7d5ad 100644
--- a/src/lib/netlist/devices/nld_74175.cpp
+++ b/src/lib/netlist/devices/nld_74175.cpp
@@ -15,19 +15,11 @@ namespace netlist
NETLIB_OBJECT(74175_sub)
{
NETLIB_CONSTRUCTOR(74175_sub)
+ , m_CLK(*this, "CLK")
+ , m_Q(*this, {"Q1", "Q2", "Q3", "Q4"})
+ , m_QQ(*this, {"Q1Q", "Q2Q", "Q3Q", "Q4Q"})
, m_data(0)
{
- enregister("CLK", m_CLK);
-
- enregister("Q1", m_Q[0]);
- enregister("Q1Q", m_QQ[0]);
- enregister("Q2", m_Q[1]);
- enregister("Q2Q", m_QQ[1]);
- enregister("Q3", m_Q[2]);
- enregister("Q3Q", m_QQ[2]);
- enregister("Q4", m_Q[3]);
- enregister("Q4Q", m_QQ[3]);
-
save(NLNAME(m_clrq));
save(NLNAME(m_data));
}
@@ -37,8 +29,8 @@ namespace netlist
public:
logic_input_t m_CLK;
- logic_output_t m_Q[4];
- logic_output_t m_QQ[4];
+ object_array_t<logic_output_t, 4> m_Q;
+ object_array_t<logic_output_t, 4> m_QQ;
netlist_sig_t m_clrq;
UINT8 m_data;
@@ -48,24 +40,21 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(74175)
, m_sub(*this, "sub")
+ , m_D(*this, {"D1", "D2", "D3", "D4"})
+ , m_CLRQ(*this, "CLRQ")
{
register_subalias("CLK", m_sub.m_CLK);
- enregister("CLRQ", m_CLRQ);
- enregister("D1", m_D[0]);
register_subalias("Q1", m_sub.m_Q[0]);
register_subalias("Q1Q", m_sub.m_QQ[0]);
- enregister("D2", m_D[1]);
register_subalias("Q2", m_sub.m_Q[1]);
register_subalias("Q2Q", m_sub.m_QQ[1]);
- enregister("D3", m_D[2]);
register_subalias("Q3", m_sub.m_Q[2]);
register_subalias("Q3Q", m_sub.m_QQ[2]);
- enregister("D4", m_D[3]);
register_subalias("Q4", m_sub.m_Q[3]);
register_subalias("Q4Q", m_sub.m_QQ[3]);
}
@@ -75,7 +64,7 @@ namespace netlist
protected:
NETLIB_SUB(74175_sub) m_sub;
- logic_input_t m_D[4];
+ object_array_t<logic_input_t, 4> m_D;
logic_input_t m_CLRQ;
};
diff --git a/src/lib/netlist/devices/nld_74192.cpp b/src/lib/netlist/devices/nld_74192.cpp
index c9ddf77033a..3b4a15ea090 100644
--- a/src/lib/netlist/devices/nld_74192.cpp
+++ b/src/lib/netlist/devices/nld_74192.cpp
@@ -17,11 +17,11 @@ namespace netlist
NETLIB_OBJECT(74192_subABCD)
{
NETLIB_CONSTRUCTOR(74192_subABCD)
+ , m_A(*this, "A")
+ , m_B(*this, "B")
+ , m_C(*this, "C")
+ , m_D(*this, "D")
{
- enregister("A", m_A);
- enregister("B", m_B);
- enregister("C", m_C);
- enregister("D", m_D);
}
NETLIB_RESETI()
@@ -52,22 +52,18 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(74192)
, m_ABCD(*this, "subABCD")
+ , m_CLEAR(*this, "CLEAR")
+ , m_LOADQ(*this, "LOADQ")
+ , m_CU(*this, "CU")
+ , m_CD(*this, "CD")
+ , m_Q(*this, {"QA", "QB", "QC", "QD"})
+ , m_BORROWQ(*this, "BORROWQ")
+ , m_CARRYQ(*this, "CARRYQ")
{
register_subalias("A", m_ABCD.m_A);
register_subalias("B", m_ABCD.m_B);
register_subalias("C", m_ABCD.m_C);
register_subalias("D", m_ABCD.m_D);
- enregister("CLEAR", m_CLEAR);
- enregister("LOADQ", m_LOADQ);
- enregister("CU", m_CU);
- enregister("CD", m_CD);
-
- enregister("QA", m_Q[0]);
- enregister("QB", m_Q[1]);
- enregister("QC", m_Q[2]);
- enregister("QD", m_Q[3]);
- enregister("BORROWQ", m_BORROWQ);
- enregister("CARRYQ", m_CARRYQ);
save(NLNAME(m_cnt));
save(NLNAME(m_last_CU));
@@ -88,7 +84,7 @@ namespace netlist
UINT8 m_last_CU;
UINT8 m_last_CD;
- logic_output_t m_Q[4];
+ object_array_t<logic_output_t, 4> m_Q;
logic_output_t m_BORROWQ;
logic_output_t m_CARRYQ;
};
diff --git a/src/lib/netlist/devices/nld_74193.cpp b/src/lib/netlist/devices/nld_74193.cpp
index 7a706cdc435..da52e321a14 100644
--- a/src/lib/netlist/devices/nld_74193.cpp
+++ b/src/lib/netlist/devices/nld_74193.cpp
@@ -17,25 +17,21 @@ namespace netlist
NETLIB_OBJECT(74193)
{
NETLIB_CONSTRUCTOR(74193)
+ , m_A(*this, "A")
+ , m_B(*this, "B")
+ , m_C(*this, "C")
+ , m_D(*this, "D")
+ , m_CLEAR(*this, "CLEAR")
+ , m_LOADQ(*this, "LOADQ")
+ , m_CU(*this, "CU")
+ , m_CD(*this, "CD")
, m_cnt(0)
, m_last_CU(0)
, m_last_CD(0)
+ , m_Q(*this, {"QA", "QB", "QC", "QD"})
+ , m_BORROWQ(*this, "BORROWQ")
+ , m_CARRYQ(*this, "CARRYQ")
{
- enregister("A", m_A);
- enregister("B", m_B);
- enregister("C", m_C);
- enregister("D", m_D);
- enregister("CLEAR", m_CLEAR);
- enregister("LOADQ", m_LOADQ);
- enregister("CU", m_CU);
- enregister("CD", m_CD);
-
- enregister("QA", m_Q[0]);
- enregister("QB", m_Q[1]);
- enregister("QC", m_Q[2]);
- enregister("QD", m_Q[3]);
- enregister("BORROWQ", m_BORROWQ);
- enregister("CARRYQ", m_CARRYQ);
save(NLNAME(m_cnt));
save(NLNAME(m_last_CU));
@@ -59,7 +55,7 @@ namespace netlist
UINT8 m_last_CU;
UINT8 m_last_CD;
- logic_output_t m_Q[4];
+ object_array_t<logic_output_t, 4> m_Q;
logic_output_t m_BORROWQ;
logic_output_t m_CARRYQ;
};
diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp
index 31d019fc1c7..d34a0316eb6 100644
--- a/src/lib/netlist/devices/nld_7448.cpp
+++ b/src/lib/netlist/devices/nld_7448.cpp
@@ -28,24 +28,16 @@ namespace netlist
NETLIB_OBJECT(7448)
{
NETLIB_CONSTRUCTOR(7448)
+ , m_A(*this, "A")
+ , m_B(*this, "B")
+ , m_C(*this, "C")
+ , m_D(*this, "D")
+ , m_LTQ(*this, "LTQ")
+ , m_BIQ(*this, "BIQ")
+ , m_RBIQ(*this, "RBIQ")
, m_state(0)
+ , m_Q(*this, {"a", "b", "c", "d", "e", "f", "g"})
{
- enregister("A", m_A);
- enregister("B", m_B);
- enregister("C", m_C);
- enregister("D", m_D);
- enregister("LTQ", m_LTQ);
- enregister("BIQ", m_BIQ);
- enregister("RBIQ", m_RBIQ);
-
- enregister("a", m_Q[0]);
- enregister("b", m_Q[1]);
- enregister("c", m_Q[2]);
- enregister("d", m_Q[3]);
- enregister("e", m_Q[4]);
- enregister("f", m_Q[5]);
- enregister("g", m_Q[6]);
-
save(NLNAME(m_state));
}
@@ -66,7 +58,7 @@ namespace netlist
UINT8 m_state;
- logic_output_t m_Q[7]; /* a .. g */
+ object_array_t<logic_output_t, 7> m_Q; /* a .. g */
};
diff --git a/src/lib/netlist/devices/nld_7450.cpp b/src/lib/netlist/devices/nld_7450.cpp
index aa997256c5a..548a76c47d7 100644
--- a/src/lib/netlist/devices/nld_7450.cpp
+++ b/src/lib/netlist/devices/nld_7450.cpp
@@ -15,12 +15,12 @@ namespace netlist
NETLIB_OBJECT(7450)
{
NETLIB_CONSTRUCTOR(7450)
+ , m_A(*this, "A")
+ , m_B(*this, "B")
+ , m_C(*this, "C")
+ , m_D(*this, "D")
+ , m_Q(*this, "Q")
{
- enregister("A", m_A);
- enregister("B", m_B);
- enregister("C", m_C);
- enregister("D", m_D);
- enregister("Q", m_Q);
}
//NETLIB_RESETI();
NETLIB_UPDATEI();
diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp
index f3890f4105d..9d145e91899 100644
--- a/src/lib/netlist/devices/nld_7474.cpp
+++ b/src/lib/netlist/devices/nld_7474.cpp
@@ -15,12 +15,11 @@ namespace netlist
NETLIB_OBJECT(7474sub)
{
NETLIB_CONSTRUCTOR(7474sub)
+ , m_CLK(*this, "CLK")
+ , m_Q(*this, "Q")
+ , m_QQ(*this, "QQ")
, m_nextD(0)
{
- enregister("CLK", m_CLK);
-
- enregister("Q", m_Q);
- enregister("QQ", m_QQ);
save(NLNAME(m_nextD));
}
@@ -44,11 +43,11 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(7474)
, sub(*this, "sub")
+ , m_D(*this, "D")
+ , m_CLRQ(*this, "CLRQ")
+ , m_PREQ(*this, "PREQ")
{
register_subalias("CLK", sub.m_CLK);
- enregister("D", m_D);
- enregister("CLRQ", m_CLRQ);
- enregister("PREQ", m_PREQ);
register_subalias("Q", sub.m_Q);
register_subalias("QQ", sub.m_QQ);
diff --git a/src/lib/netlist/devices/nld_7483.cpp b/src/lib/netlist/devices/nld_7483.cpp
index 29c28121d8f..db23f26d563 100644
--- a/src/lib/netlist/devices/nld_7483.cpp
+++ b/src/lib/netlist/devices/nld_7483.cpp
@@ -15,24 +15,22 @@ namespace netlist
NETLIB_OBJECT(7483)
{
NETLIB_CONSTRUCTOR(7483)
+ , m_C0(*this, "C0")
+ , m_A1(*this, "A1")
+ , m_A2(*this, "A2")
+ , m_A3(*this, "A3")
+ , m_A4(*this, "A4")
+ , m_B1(*this, "B1")
+ , m_B2(*this, "B2")
+ , m_B3(*this, "B3")
+ , m_B4(*this, "B4")
, m_lastr(0)
+ , m_S1(*this, "S1")
+ , m_S2(*this, "S2")
+ , m_S3(*this, "S3")
+ , m_S4(*this, "S4")
+ , m_C4(*this, "C4")
{
- enregister("A1", m_A1);
- enregister("A2", m_A2);
- enregister("A3", m_A3);
- enregister("A4", m_A4);
- enregister("B1", m_B1);
- enregister("B2", m_B2);
- enregister("B3", m_B3);
- enregister("B4", m_B4);
- enregister("C0", m_C0);
-
- enregister("S1", m_S1);
- enregister("S2", m_S2);
- enregister("S3", m_S3);
- enregister("S4", m_S4);
- enregister("C4", m_C4);
-
save(NLNAME(m_lastr));
}
NETLIB_RESETI();
diff --git a/src/lib/netlist/devices/nld_7490.cpp b/src/lib/netlist/devices/nld_7490.cpp
index fbe0bda2443..4cb207e971b 100644
--- a/src/lib/netlist/devices/nld_7490.cpp
+++ b/src/lib/netlist/devices/nld_7490.cpp
@@ -15,22 +15,17 @@ namespace netlist
NETLIB_OBJECT(7490)
{
NETLIB_CONSTRUCTOR(7490)
+ , m_A(*this, "A")
+ , m_B(*this, "B")
+ , m_R1(*this, "R1")
+ , m_R2(*this, "R2")
+ , m_R91(*this, "R91")
+ , m_R92(*this, "R92")
, m_cnt(0)
, m_last_A(0)
, m_last_B(0)
+ , m_Q(*this, {"QA", "QB", "QC", "QD"})
{
- enregister("A", m_A);
- enregister("B", m_B);
- enregister("R1", m_R1);
- enregister("R2", m_R2);
- enregister("R91", m_R91);
- enregister("R92", m_R92);
-
- enregister("QA", m_Q[0]);
- enregister("QB", m_Q[1]);
- enregister("QC", m_Q[2]);
- enregister("QD", m_Q[3]);
-
save(NLNAME(m_cnt));
save(NLNAME(m_last_A));
save(NLNAME(m_last_B));
@@ -42,18 +37,18 @@ namespace netlist
protected:
ATTR_HOT void update_outputs();
+ logic_input_t m_A;
+ logic_input_t m_B;
logic_input_t m_R1;
logic_input_t m_R2;
logic_input_t m_R91;
logic_input_t m_R92;
- logic_input_t m_A;
- logic_input_t m_B;
UINT8 m_cnt;
UINT8 m_last_A;
UINT8 m_last_B;
- logic_output_t m_Q[4];
+ object_array_t<logic_output_t, 4> m_Q;
};
NETLIB_OBJECT_DERIVED(7490_dip, 7490)
diff --git a/src/lib/netlist/devices/nld_7493.cpp b/src/lib/netlist/devices/nld_7493.cpp
index 3ed976cfa86..b60972d8dad 100644
--- a/src/lib/netlist/devices/nld_7493.cpp
+++ b/src/lib/netlist/devices/nld_7493.cpp
@@ -17,9 +17,9 @@ namespace netlist
NETLIB_OBJECT(7493ff)
{
NETLIB_CONSTRUCTOR(7493ff)
+ , m_I(*this, "CLK")
+ , m_Q(*this, "Q")
{
- enregister("CLK", m_I);
- enregister("Q", m_Q);
save(NLNAME(m_reset));
save(NLNAME(m_state));
@@ -39,6 +39,8 @@ namespace netlist
NETLIB_OBJECT(7493)
{
NETLIB_CONSTRUCTOR(7493)
+ , m_R1(*this, "R1")
+ , m_R2(*this, "R2")
, A(*this, "A")
, B(*this, "B")
, C(*this, "C")
@@ -46,8 +48,6 @@ namespace netlist
{
register_subalias("CLKA", A.m_I);
register_subalias("CLKB", B.m_I);
- enregister("R1", m_R1);
- enregister("R2", m_R2);
register_subalias("QA", A.m_Q);
register_subalias("QB", B.m_Q);
diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp
index 909a862862f..fc847beda2d 100644
--- a/src/lib/netlist/devices/nld_74ls629.cpp
+++ b/src/lib/netlist/devices/nld_74ls629.cpp
@@ -50,13 +50,12 @@ namespace netlist
NETLIB_OBJECT(SN74LS629clk)
{
NETLIB_CONSTRUCTOR(SN74LS629clk)
+ , m_FB(*this, "FB")
+ , m_Y(*this, "Y")
, m_enableq(1)
, m_out(0)
, m_inc(netlist_time::zero)
{
- enregister("FB", m_FB);
- enregister("Y", m_Y);
-
connect_late(m_FB, m_Y);
save(NLNAME(m_enableq));
@@ -88,11 +87,11 @@ namespace netlist
, m_clock(*this, "OSC")
, m_R_FC(*this, "R_FC")
, m_R_RNG(*this, "R_RNG")
+ , m_ENQ(*this, "ENQ")
+ , m_RNG(*this, "RNG")
+ , m_FC(*this, "FC")
, m_CAP(*this, "CAP", 1e-6)
{
- enregister("ENQ", m_ENQ);
- enregister("RNG", m_RNG);
- enregister("FC", m_FC);
register_subalias("GND", m_R_FC.m_N);
connect_late(m_FC, m_R_FC.m_P);
diff --git a/src/lib/netlist/devices/nld_82S16.cpp b/src/lib/netlist/devices/nld_82S16.cpp
index 8fefb52e43c..7a766ff2004 100644
--- a/src/lib/netlist/devices/nld_82S16.cpp
+++ b/src/lib/netlist/devices/nld_82S16.cpp
@@ -15,34 +15,22 @@ namespace netlist
NETLIB_OBJECT(82S16)
{
NETLIB_CONSTRUCTOR(82S16)
+ , m_A(*this, { "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7" })
+ , m_CE1Q(*this, "CE1Q")
+ , m_CE2Q(*this, "CE2Q")
+ , m_CE3Q(*this, "CE3Q")
+ , m_WEQ(*this, "WEQ")
+ , m_DIN(*this, "DIN")
+ , m_DOUTQ(*this, "DOUTQ")
{
- enregister("A0", m_A[0]);
- enregister("A1", m_A[1]);
- enregister("A2", m_A[2]);
- enregister("A3", m_A[3]);
- enregister("A4", m_A[4]);
- enregister("A5", m_A[5]);
- enregister("A6", m_A[6]);
- enregister("A7", m_A[7]);
-
- enregister("CE1Q", m_CE1Q);
- enregister("CE2Q", m_CE2Q);
- enregister("CE3Q", m_CE3Q);
-
- enregister("WEQ", m_WEQ);
- enregister("DIN", m_DIN);
-
- enregister("DOUTQ",m_DOUTQ);
-
save(NLNAME(m_ram));
-
}
NETLIB_RESETI();
NETLIB_UPDATEI();
protected:
- logic_input_t m_A[8];
+ object_array_t<logic_input_t, 8> m_A;
logic_input_t m_CE1Q;
logic_input_t m_CE2Q;
logic_input_t m_CE3Q;
@@ -58,23 +46,23 @@ namespace netlist
{
NETLIB_CONSTRUCTOR_DERIVED(82S16_dip, 82S16)
{
- enregister("2", m_A[0]);
- enregister("1", m_A[1]);
- enregister("15", m_A[2]);
- enregister("14", m_A[3]);
- enregister("7", m_A[4]);
- enregister("9", m_A[5]);
- enregister("10", m_A[6]);
- enregister("11", m_A[7]);
-
- enregister("3", m_CE1Q);
- enregister("4", m_CE2Q);
- enregister("5", m_CE3Q);
-
- enregister("12", m_WEQ);
- enregister("13", m_DIN);
-
- enregister("6", m_DOUTQ);
+ register_subalias("2", m_A[0]);
+ register_subalias("1", m_A[1]);
+ register_subalias("15", m_A[2]);
+ register_subalias("14", m_A[3]);
+ register_subalias("7", m_A[4]);
+ register_subalias("9", m_A[5]);
+ register_subalias("10", m_A[6]);
+ register_subalias("11", m_A[7]);
+
+ register_subalias("3", m_CE1Q);
+ register_subalias("4", m_CE2Q);
+ register_subalias("5", m_CE3Q);
+
+ register_subalias("12", m_WEQ);
+ register_subalias("13", m_DIN);
+
+ register_subalias("6", m_DOUTQ);
}
};
diff --git a/src/lib/netlist/devices/nld_9310.cpp b/src/lib/netlist/devices/nld_9310.cpp
index 24a9a9c440c..06b5715090a 100644
--- a/src/lib/netlist/devices/nld_9310.cpp
+++ b/src/lib/netlist/devices/nld_9310.cpp
@@ -17,11 +17,11 @@ namespace netlist
NETLIB_OBJECT(9310_subABCD)
{
NETLIB_CONSTRUCTOR(9310_subABCD)
+ , m_A(*this, "A")
+ , m_B(*this, "B")
+ , m_C(*this, "C")
+ , m_D(*this, "D")
{
- enregister("A", m_A);
- enregister("B", m_B);
- enregister("C", m_C);
- enregister("D", m_D);
}
NETLIB_RESETI();
@@ -43,19 +43,17 @@ namespace netlist
NETLIB_OBJECT(9310_sub)
{
NETLIB_CONSTRUCTOR(9310_sub)
- , m_cnt(0)
+ , m_CLK(*this, "CLK")
, m_ABCD(nullptr)
+ , m_QA(*this, "QA")
+ , m_QB(*this, "QB")
+ , m_QC(*this, "QC")
+ , m_QD(*this, "QD")
+ , m_RC(*this, "RC")
+ , m_cnt(0)
, m_loadq(0)
, m_ent(0)
{
- enregister("CLK", m_CLK);
-
- enregister("QA", m_QA);
- enregister("QB", m_QB);
- enregister("QC", m_QC);
- enregister("QD", m_QD);
- enregister("RC", m_RC);
-
save(NLNAME(m_cnt));
save(NLNAME(m_loadq));
save(NLNAME(m_ent));
@@ -68,16 +66,16 @@ namespace netlist
logic_input_t m_CLK;
- UINT8 m_cnt;
NETLIB_NAME(9310_subABCD) *m_ABCD;
- netlist_sig_t m_loadq;
- netlist_sig_t m_ent;
logic_output_t m_QA;
logic_output_t m_QB;
logic_output_t m_QC;
logic_output_t m_QD;
logic_output_t m_RC;
+ UINT8 m_cnt;
+ netlist_sig_t m_loadq;
+ netlist_sig_t m_ent;
};
NETLIB_OBJECT(9310)
@@ -85,15 +83,15 @@ namespace netlist
NETLIB_CONSTRUCTOR(9310)
, subABCD(*this, "subABCD")
, sub(*this, "sub")
+ , m_ENP(*this, "ENP")
+ , m_ENT(*this, "ENT")
+ , m_CLRQ(*this, "CLRQ")
+ , m_LOADQ(*this, "LOADQ")
{
sub.m_ABCD = &(subABCD);
register_subalias("CLK", sub.m_CLK);
- enregister("ENP", m_ENP);
- enregister("ENT", m_ENT);
- enregister("CLRQ", m_CLRQ);
- enregister("LOADQ", m_LOADQ);
register_subalias("A", subABCD.m_A);
register_subalias("B", subABCD.m_B);
diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp
index bd36df284aa..0943a81be93 100644
--- a/src/lib/netlist/devices/nld_9316.cpp
+++ b/src/lib/netlist/devices/nld_9316.cpp
@@ -17,11 +17,11 @@ namespace netlist
NETLIB_OBJECT(9316_subABCD)
{
NETLIB_CONSTRUCTOR(9316_subABCD)
+ , m_A(*this, "A")
+ , m_B(*this, "B")
+ , m_C(*this, "C")
+ , m_D(*this, "D")
{
- enregister("A", m_A);
- enregister("B", m_B);
- enregister("C", m_C);
- enregister("D", m_D);
}
NETLIB_RESETI()
@@ -51,18 +51,17 @@ namespace netlist
NETLIB_OBJECT(9316_sub)
{
NETLIB_CONSTRUCTOR(9316_sub)
+ , m_CLK(*this, "CLK")
+ , m_QA(*this, "QA")
+ , m_QB(*this, "QB")
+ , m_QC(*this, "QC")
+ , m_QD(*this, "QD")
+ , m_RC(*this, "RC")
, m_cnt(0)
, m_ABCD(nullptr)
, m_loadq(0)
, m_ent(0)
{
- enregister("CLK", m_CLK);
-
- enregister("QA", m_QA);
- enregister("QB", m_QB);
- enregister("QC", m_QC);
- enregister("QD", m_QD);
- enregister("RC", m_RC);
save(NLNAME(m_cnt));
save(NLNAME(m_loadq));
@@ -95,16 +94,15 @@ namespace netlist
NETLIB_CONSTRUCTOR(9316)
, sub(*this, "sub")
, subABCD(*this, "subABCD")
+ , m_ENP(*this, "ENP")
+ , m_ENT(*this, "ENT")
+ , m_CLRQ(*this, "CLRQ")
+ , m_LOADQ(*this, "LOADQ")
{
sub.m_ABCD = &(subABCD);
register_subalias("CLK", sub.m_CLK);
- enregister("ENP", m_ENP);
- enregister("ENT", m_ENT);
- enregister("CLRQ", m_CLRQ);
- enregister("LOADQ", m_LOADQ);
-
register_subalias("A", subABCD.m_A);
register_subalias("B", subABCD.m_B);
register_subalias("C", subABCD.m_C);
diff --git a/src/lib/netlist/devices/nld_legacy.cpp b/src/lib/netlist/devices/nld_legacy.cpp
index f2ddf677d33..aaf7c9e25a3 100644
--- a/src/lib/netlist/devices/nld_legacy.cpp
+++ b/src/lib/netlist/devices/nld_legacy.cpp
@@ -16,11 +16,11 @@ namespace netlist
NETLIB_OBJECT(nicRSFF)
{
NETLIB_CONSTRUCTOR(nicRSFF)
+ , m_S(*this, "S")
+ , m_R(*this, "R")
+ , m_Q(*this, "Q")
+ , m_QQ(*this, "QQ")
{
- enregister("S", m_S);
- enregister("R", m_R);
- enregister("Q", m_Q);
- enregister("QQ", m_QQ);
}
NETLIB_RESETI();
@@ -38,13 +38,12 @@ namespace netlist
NETLIB_OBJECT(nicDelay)
{
NETLIB_CONSTRUCTOR(nicDelay)
+ , m_I(*this, "1")
+ , m_Q(*this, "2")
, 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);
-
save(NLNAME(m_last));
}
@@ -54,7 +53,6 @@ namespace netlist
protected:
logic_input_t m_I;
-
logic_output_t m_Q;
param_int_t m_L_to_H;
diff --git a/src/lib/netlist/devices/nld_log.cpp b/src/lib/netlist/devices/nld_log.cpp
index 839254f60d2..77d3560181b 100644
--- a/src/lib/netlist/devices/nld_log.cpp
+++ b/src/lib/netlist/devices/nld_log.cpp
@@ -20,8 +20,8 @@ namespace netlist
NETLIB_OBJECT(log)
{
NETLIB_CONSTRUCTOR(log)
+ , m_I(*this, "I")
{
- enregister("I", m_I);
pstring filename = plib::pfmt("{1}.log")(this->name());
m_strm = plib::make_unique<plib::pofilestream>(filename);
@@ -42,8 +42,8 @@ namespace netlist
NETLIB_OBJECT_DERIVED(logD, log)
{
NETLIB_CONSTRUCTOR_DERIVED(logD, log)
+ , m_I2(*this, "I2")
{
- enregister("I2", m_I2);
}
NETLIB_UPDATEI()
diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp
index 54d66dd17bb..b58cdff3374 100644
--- a/src/lib/netlist/devices/nld_mm5837.cpp
+++ b/src/lib/netlist/devices/nld_mm5837.cpp
@@ -21,25 +21,25 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(MM5837_dip)
, m_RV(*this, "RV")
+ , m_VDD(*this, "1")
+ , m_VGG(*this, "2")
+ , m_VSS(*this, "4")
+ , m_V0(*this, "_Q")
+ /* clock */
+ , m_feedback(*this, "FB")
+ , m_Q(*this, "Q")
, m_is_timestep(false)
{
- /* clock */
- enregister("Q", m_Q);
- enregister("FB", m_feedback);
m_inc = netlist_time::from_hz(56000);
connect_late(m_feedback, m_Q);
/* output */
- enregister("_RV1", m_RV.m_P);
- enregister("_RV2", m_RV.m_N);
- enregister("_Q", m_V0);
+ //register_term("_RV1", m_RV.m_P);
+ //register_term("_RV2", m_RV.m_N);
connect_late(m_RV.m_N, m_V0);
/* device */
- enregister("1", m_VDD);
- enregister("2", m_VGG);
register_subalias("3", m_RV.m_P);
- enregister("4", m_VSS);
save(NLNAME(m_shift));
diff --git a/src/lib/netlist/devices/nld_ne555.cpp b/src/lib/netlist/devices/nld_ne555.cpp
index 7f40497e2de..2197beea776 100644
--- a/src/lib/netlist/devices/nld_ne555.cpp
+++ b/src/lib/netlist/devices/nld_ne555.cpp
@@ -24,16 +24,16 @@ namespace netlist
, m_R2(*this, "R2")
, m_R3(*this, "R3")
, m_RDIS(*this, "RDIS")
+ , m_RESET(*this, "RESET") // Pin 4
+ , m_THRES(*this, "THRESH") // Pin 6
+ , m_TRIG(*this, "TRIG") // Pin 2
+ , m_OUT(*this, "OUT") // Pin 3
, 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
- enregister("RESET", m_RESET); // Pin 4
register_subalias("CONT", m_R1.m_N); // Pin 5
- enregister("THRESH", m_THRES); // Pin 6
register_subalias("DISCH", m_RDIS.m_P); // Pin 7
register_subalias("VCC", m_R1.m_P); // Pin 8
diff --git a/src/lib/netlist/devices/nld_r2r_dac.cpp b/src/lib/netlist/devices/nld_r2r_dac.cpp
index eb95058fa69..b9ff196f541 100644
--- a/src/lib/netlist/devices/nld_r2r_dac.cpp
+++ b/src/lib/netlist/devices/nld_r2r_dac.cpp
@@ -21,8 +21,8 @@ namespace netlist
, m_num(*this, "N", 1)
, m_val(*this, "VAL", 1)
{
- enregister("VOUT", m_P);
- enregister("VGND", m_N);
+ register_subalias("VOUT", m_P);
+ register_subalias("VGND", m_N);
}
NETLIB_UPDATE_PARAMI();
diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h
index 6aaaa73a698..5f9f1fc8cb1 100644
--- a/src/lib/netlist/devices/nld_truthtable.h
+++ b/src/lib/netlist/devices/nld_truthtable.h
@@ -165,15 +165,16 @@ public:
for (unsigned i=0; i < m_NI; i++)
{
- new (&m_I[i]) logic_input_t();
+ //new (&m_I[i]) logic_input_t();
inout[i] = inout[i].trim();
- enregister(inout[i], m_I[i]);
+ m_I.emplace(i, *this, inout[i]);
}
for (unsigned i=0; i < m_NO; i++)
{
- new (&m_Q[i]) logic_output_t();
+ //new (&m_Q[i]) logic_output_t();
out[i] = out[i].trim();
- enregister(out[i], m_Q[i]);
+ m_Q.emplace(i, *this, out[i]);
+ //enregister(out[i], m_Q[i]);
}
// Connect output "Q" to input "_Q" if this exists
// This enables timed state without having explicit state ....
diff --git a/src/lib/netlist/devices/nlid_cmos.h b/src/lib/netlist/devices/nlid_cmos.h
index 22dc7beb01d..7ca6cc29783 100644
--- a/src/lib/netlist/devices/nlid_cmos.h
+++ b/src/lib/netlist/devices/nlid_cmos.h
@@ -9,7 +9,6 @@
#define NLID_CMOS_H_
#include "nl_base.h"
-#include "analog/nld_twoterm.h"
namespace netlist
{
@@ -19,9 +18,9 @@ namespace netlist
NETLIB_OBJECT(vdd_vss)
{
NETLIB_CONSTRUCTOR(vdd_vss)
+ , m_vdd(*this, "VDD")
+ , m_vss(*this, "VSS")
{
- enregister("VDD", m_vdd);
- enregister("VSS", m_vss);
}
NETLIB_UPDATEI() {};
diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h
index 18a1a926fef..e650950bd17 100644
--- a/src/lib/netlist/devices/nlid_system.h
+++ b/src/lib/netlist/devices/nlid_system.h
@@ -45,9 +45,9 @@ namespace netlist
NETLIB_OBJECT(mainclock)
{
NETLIB_CONSTRUCTOR(mainclock)
+ , m_Q(*this, "Q")
, m_freq(*this, "FREQ", 7159000.0 * 5)
{
- enregister("Q", m_Q);
m_inc = netlist_time::from_hz(m_freq.Value()*2);
}
@@ -86,11 +86,10 @@ namespace netlist
NETLIB_OBJECT(clock)
{
NETLIB_CONSTRUCTOR(clock)
+ , m_feedback(*this, "FB")
+ , m_Q(*this, "Q")
, m_freq(*this, "FREQ", 7159000.0 * 5.0)
-
{
- enregister("Q", m_Q);
- enregister("FB", m_feedback);
m_inc = netlist_time::from_hz(m_freq.Value()*2);
@@ -118,10 +117,9 @@ namespace netlist
, m_freq(*this, "FREQ", 7159000.0 * 5.0)
, m_pattern(*this, "PATTERN", "1,1")
, m_offset(*this, "OFFSET", 0.0)
+ , m_feedback(*this, "FB")
+ , m_Q(*this, "Q")
{
- enregister("Q", m_Q);
- enregister("FB", m_feedback);
-
m_inc[0] = netlist_time::from_hz(m_freq.Value()*2);
connect_late(m_feedback, m_Q);
@@ -173,14 +171,14 @@ namespace netlist
NETLIB_OBJECT(logic_input)
{
NETLIB_CONSTRUCTOR(logic_input)
+ , m_Q(*this, "Q")
, m_IN(*this, "IN", 0)
/* make sure we get the family first */
, m_FAMILY(*this, "FAMILY", "FAMILY(TYPE=TTL)")
{
set_logic_family(netlist().setup().family_from_model(m_FAMILY.Value()));
-
- enregister("Q", m_Q);
}
+
NETLIB_UPDATE_AFTER_PARAM_CHANGE()
NETLIB_UPDATEI();
@@ -197,9 +195,9 @@ namespace netlist
NETLIB_OBJECT(analog_input)
{
NETLIB_CONSTRUCTOR(analog_input)
+ , m_Q(*this, "Q")
, m_IN(*this, "IN", 0.0)
{
- enregister("Q", m_Q);
}
NETLIB_UPDATE_AFTER_PARAM_CHANGE()
@@ -218,8 +216,8 @@ namespace netlist
NETLIB_OBJECT(gnd)
{
NETLIB_CONSTRUCTOR(gnd)
+ , m_Q(*this, "Q")
{
- enregister("Q", m_Q);
}
NETLIB_UPDATEI()
{
@@ -238,8 +236,8 @@ namespace netlist
{
public:
NETLIB_CONSTRUCTOR_DERIVED(dummy_input, base_dummy)
+ , m_I(*this, "I")
{
- enregister("I", m_I);
}
protected:
@@ -260,20 +258,20 @@ namespace netlist
{
public:
NETLIB_CONSTRUCTOR_DERIVED(frontier, base_dummy)
- , m_RIN(netlist(), "m_RIN")
- , m_ROUT(netlist(), "m_ROUT")
+ , m_RIN(*this, "m_RIN")
+ , m_ROUT(*this, "m_ROUT", true)
+ , m_I(*this, "_I")
+ , m_Q(*this, "_Q")
, 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);
+ register_subalias("I", m_RIN.m_P);
+ register_subalias("G", m_RIN.m_N);
connect_late(m_I, m_RIN.m_P);
- enregister("_Q", m_Q);
- enregister("_OP",m_ROUT.m_P);
- enregister("Q",m_ROUT.m_N);
+ register_subalias("_OP", m_ROUT.m_P);
+ register_subalias("Q", m_ROUT.m_N);
connect_late(m_Q, m_ROUT.m_P);
}
@@ -290,6 +288,7 @@ namespace netlist
private:
NETLIB_NAME(twoterm) m_RIN;
+ /* Fixme: only works if the device is time-stepped - need to rework */
NETLIB_NAME(twoterm) m_ROUT;
analog_input_t m_I;
analog_output_t m_Q;
@@ -309,11 +308,11 @@ namespace netlist
NETLIB_CONSTRUCTOR(function)
, m_N(*this, "N", 2)
, m_func(*this, "FUNC", "")
+ , m_Q(*this, "Q")
{
- enregister("Q", m_Q);
for (int i=0; i < m_N; i++)
- enregister(plib::pfmt("A{1}")(i), m_I[i]);
+ m_I.emplace(i, *this, plib::pfmt("A{1}")(i));
plib::pstring_vector_t cmds(m_func.Value(), " ");
m_precompiled.clear();
@@ -376,7 +375,7 @@ namespace netlist
param_int_t m_N;
param_str_t m_func;
analog_output_t m_Q;
- analog_input_t m_I[10];
+ plib::uninitialised_array_t<analog_input_t, 10> m_I;
plib::pvector_t<rpn_inst> m_precompiled;
};
@@ -390,12 +389,11 @@ namespace netlist
public:
NETLIB_CONSTRUCTOR(res_sw)
, m_R(*this, "R")
+ , m_I(*this, "I")
, m_RON(*this, "RON", 1.0)
, m_ROFF(*this, "ROFF", 1.0E20)
, m_last_state(0)
{
- enregister("I", m_I);
-
register_subalias("1", m_R.m_P);
register_subalias("2", m_R.m_N);
@@ -462,9 +460,9 @@ namespace netlist
public:
nld_a_to_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *in_proxied)
: nld_base_proxy(anetlist, name, in_proxied, &m_I)
+ , m_I(*this, "I")
+ , m_Q(*this, "Q")
{
- enregister("I", m_I);
- enregister("Q", m_Q);
}
virtual ~nld_a_to_d_proxy() {}
@@ -503,9 +501,9 @@ namespace netlist
protected:
nld_base_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied, core_terminal_t &proxy_out)
- : nld_base_proxy(anetlist, name, out_proxied, &proxy_out)
+ : nld_base_proxy(anetlist, name, out_proxied, &proxy_out)
+ , m_I(*this, "I")
{
- enregister("I", m_I);
}
logic_input_t m_I;
@@ -518,18 +516,18 @@ namespace netlist
public:
nld_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied)
: nld_base_d_to_a_proxy(anetlist, name, out_proxied, m_RV.m_P)
+ , m_GNDHack(*this, "_Q")
, m_RV(*this, "RV")
, m_last_state(-1)
, m_is_timestep(false)
{
//register_sub(m_RV);
- enregister("1", m_RV.m_P);
- enregister("2", m_RV.m_N);
+ //register_term("1", m_RV.m_P);
+ //register_term("2", m_RV.m_N);
- enregister("_Q", m_Q);
register_subalias("Q", m_RV.m_P);
- connect_late(m_RV.m_N, m_Q);
+ connect_late(m_RV.m_N, m_GNDHack);
save(NLNAME(m_last_state));
}
@@ -542,7 +540,7 @@ namespace netlist
NETLIB_UPDATEI();
private:
- analog_output_t m_Q;
+ analog_output_t m_GNDHack; // FIXME: LOng term, we need to connect proxy gnd to device gnd
NETLIB_SUB(twoterm) m_RV;
int m_last_state;
bool m_is_timestep;
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp
index c4ce27a71e4..dc610a99db9 100644
--- a/src/lib/netlist/nl_base.cpp
+++ b/src/lib/netlist/nl_base.cpp
@@ -154,16 +154,6 @@ void queue_t::on_post_load()
// object_t
// ----------------------------------------------------------------------------------------
-ATTR_COLD object_t::object_t(const type_t atype)
-: m_objtype(atype)
-, m_netlist(nullptr)
-{}
-
-ATTR_COLD object_t::object_t(netlist_t &nl, const type_t atype)
-: m_objtype(atype)
-, m_netlist(&nl)
-{}
-
ATTR_COLD object_t::object_t(netlist_t &nl, const pstring &aname, const type_t atype)
: m_name(aname)
, m_objtype(atype)
@@ -175,17 +165,8 @@ ATTR_COLD object_t::~object_t()
{
}
-ATTR_COLD void object_t::init_object(netlist_t &nl, const pstring &aname)
-{
- m_netlist = &nl;
- m_name = aname;
- save_register();
-}
-
ATTR_COLD const pstring &object_t::name() const
{
- if (m_name == "")
- netlist().log().fatal("object not initialized");
return m_name;
}
@@ -193,18 +174,12 @@ ATTR_COLD const pstring &object_t::name() const
// device_object_t
// ----------------------------------------------------------------------------------------
-ATTR_COLD device_object_t::device_object_t(const type_t atype)
-: object_t(atype)
-, m_device(nullptr)
+ATTR_COLD device_object_t::device_object_t(core_device_t &dev, const pstring &aname, const type_t atype)
+: object_t(dev.netlist(), aname, atype)
+, m_device(&dev)
{
}
-ATTR_COLD void device_object_t::init_object(core_device_t &dev,
- const pstring &aname)
-{
- object_t::init_object(dev.netlist(), aname);
- m_device = &dev;
-}
// ----------------------------------------------------------------------------------------
// netlist_t
@@ -443,32 +418,12 @@ 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
-
-
// ----------------------------------------------------------------------------------------
// core_device_t
// ----------------------------------------------------------------------------------------
ATTR_COLD core_device_t::core_device_t(netlist_t &owner, const pstring &name)
-: object_t(DEVICE), logic_family_t()
+: object_t(owner, name, DEVICE), logic_family_t()
#if (NL_KEEP_STATISTICS)
, stat_total_time(0)
, stat_update_count(0)
@@ -477,11 +432,11 @@ ATTR_COLD core_device_t::core_device_t(netlist_t &owner, const pstring &name)
{
if (logic_family() == nullptr)
set_logic_family(family_TTL());
- init_object(owner, name);
}
ATTR_COLD core_device_t::core_device_t(core_device_t &owner, const pstring &name)
-: object_t(DEVICE), logic_family_t()
+ : object_t(owner.netlist(), owner.name() + "." + name, DEVICE)
+ , logic_family_t()
#if (NL_KEEP_STATISTICS)
, stat_total_time(0)
, stat_update_count(0)
@@ -491,7 +446,6 @@ 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);
owner.netlist().m_devices.push_back(plib::owned_ptr<core_device_t>(this, false));
}
@@ -576,7 +530,7 @@ ATTR_COLD void device_t::register_subalias(const pstring &name, const pstring &a
ATTR_COLD void device_t::register_p(const pstring &name, object_t &obj)
{
- setup().register_object(*this, name, obj);
+ setup().register_object(obj);
}
ATTR_COLD void device_t::connect_late(core_terminal_t &t1, core_terminal_t &t2)
@@ -617,8 +571,15 @@ family_setter_t::family_setter_t(core_device_t &dev, const logic_family_desc_t *
// net_t
// ----------------------------------------------------------------------------------------
-ATTR_COLD net_t::net_t()
- : object_t(NET)
+// FIXME: move somewhere central
+
+struct do_nothing_deleter{
+ template<typename T> void operator()(T*){}
+};
+
+
+ATTR_COLD net_t::net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
+ : object_t(nl, aname, NET)
, m_new_Q(0)
, m_cur_Q (0)
, m_railterminal(nullptr)
@@ -627,28 +588,23 @@ ATTR_COLD net_t::net_t()
, m_in_queue(2)
, m_cur_Analog(0.0)
{
-}
-
-ATTR_COLD net_t::~net_t()
-{
- if (isInitialized())
- netlist().remove_save_items(this);
-}
-
-// FIXME: move somewhere central
-
-struct do_nothing_deleter{
- template<typename T> void operator()(T*){}
-};
-
-ATTR_COLD void net_t::init_object(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
-{
- object_t::init_object(nl, aname);
m_railterminal = mr;
if (mr != nullptr)
nl.m_nets.push_back(std::shared_ptr<net_t>(this, do_nothing_deleter()));
else
nl.m_nets.push_back(std::shared_ptr<net_t>(this));
+
+ save(NLNAME(m_time));
+ save(NLNAME(m_active));
+ save(NLNAME(m_in_queue));
+ save(NLNAME(m_cur_Analog));
+ save(NLNAME(m_cur_Q));
+ save(NLNAME(m_new_Q));
+}
+
+ATTR_COLD net_t::~net_t()
+{
+ netlist().remove_save_items(this);
}
ATTR_HOT void net_t::inc_active(core_terminal_t &term)
@@ -705,17 +661,6 @@ ATTR_COLD void net_t::rebuild_list()
m_active = cnt;
}
-ATTR_COLD void net_t::save_register()
-{
- save(NLNAME(m_time));
- save(NLNAME(m_active));
- save(NLNAME(m_in_queue));
- save(NLNAME(m_cur_Analog));
- save(NLNAME(m_cur_Q));
- save(NLNAME(m_new_Q));
- object_t::save_register();
-}
-
ATTR_HOT /* inline */ void net_t::update_devs()
{
//assert(m_num_cons != 0);
@@ -820,8 +765,8 @@ ATTR_COLD void net_t::merge_net(net_t *othernet)
// logic_net_t
// ----------------------------------------------------------------------------------------
-ATTR_COLD logic_net_t::logic_net_t()
- : net_t()
+ATTR_COLD logic_net_t::logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
+ : net_t(nl, aname, mr)
{
}
@@ -831,26 +776,14 @@ ATTR_COLD void logic_net_t::reset()
net_t::reset();
}
-ATTR_COLD void logic_net_t::save_register()
-{
- net_t::save_register();
-}
-
// ----------------------------------------------------------------------------------------
// analog_net_t
// ----------------------------------------------------------------------------------------
-ATTR_COLD analog_net_t::analog_net_t()
- : net_t()
- , m_solver(nullptr)
-{
-}
-
-ATTR_COLD analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname)
- : net_t()
+ATTR_COLD analog_net_t::analog_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr)
+ : net_t(nl, aname, mr)
, m_solver(nullptr)
{
- init_object(nl, aname);
}
ATTR_COLD void analog_net_t::reset()
@@ -858,11 +791,6 @@ ATTR_COLD void analog_net_t::reset()
net_t::reset();
}
-ATTR_COLD void analog_net_t::save_register()
-{
- net_t::save_register();
-}
-
ATTR_COLD bool analog_net_t::already_processed(plib::pvector_t<list_t> &groups)
{
if (isRailNet())
@@ -898,12 +826,13 @@ ATTR_COLD void analog_net_t::process_net(plib::pvector_t<list_t> &groups)
// core_terminal_t
// ----------------------------------------------------------------------------------------
-ATTR_COLD core_terminal_t::core_terminal_t(const type_t atype)
-: device_object_t(atype)
+ATTR_COLD core_terminal_t::core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype)
+: device_object_t(dev, dev.name() + "." + aname, atype)
, plinkedlist_element_t()
, m_net(nullptr)
, m_state(STATE_NONEX)
{
+ save(NLNAME(m_state));
}
ATTR_COLD void core_terminal_t::set_net(net_t::ptr_t anet)
@@ -921,13 +850,17 @@ ATTR_COLD void core_terminal_t::clear_net()
// terminal_t
// ----------------------------------------------------------------------------------------
-ATTR_COLD terminal_t::terminal_t()
-: analog_t(TERMINAL)
+ATTR_COLD terminal_t::terminal_t(core_device_t &dev, const pstring &aname)
+: analog_t(dev, aname, TERMINAL)
, m_otherterm(nullptr)
, m_Idr1(nullptr)
, m_go1(nullptr)
, m_gt1(nullptr)
{
+ netlist().setup().register_object(*this);
+ save(NLNAME(m_Idr1));
+ save(NLNAME(m_go1));
+ save(NLNAME(m_gt1));
}
@@ -953,14 +886,6 @@ ATTR_COLD void terminal_t::reset()
set_ptr(m_gt1, netlist().gmin());
}
-ATTR_COLD void terminal_t::save_register()
-{
- save(NLNAME(m_Idr1));
- save(NLNAME(m_go1));
- save(NLNAME(m_gt1));
- core_terminal_t::save_register();
-}
-
// ----------------------------------------------------------------------------------------
// net_input_t
@@ -974,17 +899,14 @@ ATTR_COLD void terminal_t::save_register()
// logic_output_t
// ----------------------------------------------------------------------------------------
-ATTR_COLD logic_output_t::logic_output_t()
- : logic_t(OUTPUT)
+ATTR_COLD logic_output_t::logic_output_t(core_device_t &dev, const pstring &aname)
+ : logic_t(dev, aname, OUTPUT)
+ , m_my_net(dev.netlist(), name() + ".net", this)
{
set_state(STATE_OUT);
this->set_net(&m_my_net);
-}
-
-ATTR_COLD void logic_output_t::init_object(core_device_t &dev, const pstring &aname)
-{
- core_terminal_t::init_object(dev, aname);
- net().init_object(dev.netlist(), aname + ".net", this);
+ set_logic_family(dev.logic_family());
+ netlist().setup().register_object(*this);
}
ATTR_COLD void logic_output_t::initial(const netlist_sig_t val)
@@ -992,43 +914,47 @@ ATTR_COLD void logic_output_t::initial(const netlist_sig_t val)
net().as_logic().initial(val);
}
+// ----------------------------------------------------------------------------------------
+// analog_input_t
+// ----------------------------------------------------------------------------------------
+
+ATTR_COLD analog_input_t::analog_input_t(core_device_t &dev, const pstring &aname)
+: analog_t(dev, aname, INPUT)
+{
+ set_state(STATE_INP_ACTIVE);
+ netlist().setup().register_object(*this);
+}
// ----------------------------------------------------------------------------------------
// analog_output_t
// ----------------------------------------------------------------------------------------
ATTR_COLD analog_output_t::analog_output_t(core_device_t &dev, const pstring &aname)
- : analog_t(OUTPUT), m_proxied_net(nullptr)
+ : analog_t(dev, aname, OUTPUT), m_proxied_net(nullptr)
+ , m_my_net(dev.netlist(), name() + ".net", this)
{
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.0);
-
- analog_t::init_object(dev, aname);
- net().init_object(dev.netlist(), aname + ".net", this);
+ netlist().setup().register_object(*this);
}
-ATTR_COLD analog_output_t::analog_output_t()
- : analog_t(OUTPUT), m_proxied_net(nullptr)
+ATTR_COLD void analog_output_t::initial(const nl_double val)
{
- 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.0);
+ net().m_cur_Analog = val;
}
-ATTR_COLD void analog_output_t::init_object(core_device_t &dev, const pstring &aname)
-{
- analog_t::init_object(dev, aname);
- net().init_object(dev.netlist(), aname + ".net", this);
-}
+// -----------------------------------------------------------------------------
+// logic_input_t
+// -----------------------------------------------------------------------------
-ATTR_COLD void analog_output_t::initial(const nl_double val)
+ATTR_COLD logic_input_t::logic_input_t(core_device_t &dev, const pstring &aname)
+ : logic_t(dev, aname, INPUT)
{
- net().m_cur_Analog = val;
+ set_state(STATE_INP_ACTIVE);
+ set_logic_family(dev.logic_family());
+ netlist().setup().register_object(*this);
}
// ----------------------------------------------------------------------------------------
@@ -1036,10 +962,9 @@ ATTR_COLD void analog_output_t::initial(const nl_double val)
// ----------------------------------------------------------------------------------------
ATTR_COLD param_t::param_t(const param_type_t atype, device_t &device, const pstring &name)
- : device_object_t(PARAM)
+ : device_object_t(device, name, PARAM)
, m_param_type(atype)
{
- init_object(device, name);
}
ATTR_COLD const pstring param_model_t::model_type()
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index 427fa100a22..14e0ad5bb54 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -359,15 +359,10 @@ namespace netlist
QUEUE = 6
};
- ATTR_COLD object_t(const type_t atype);
- ATTR_COLD object_t(netlist_t &nl, const type_t atype);
ATTR_COLD object_t(netlist_t &nl, const pstring &aname, const type_t atype);
virtual ~object_t();
- ATTR_COLD void init_object(netlist_t &nl, const pstring &aname);
- ATTR_COLD bool isInitialized() { return (m_netlist != nullptr); }
-
ATTR_COLD const pstring &name() const;
ATTR_COLD inline plib::pstate_manager_t *state_manager();
@@ -388,7 +383,7 @@ namespace netlist
virtual void reset() { }
// must call parent save_register !
- virtual void save_register() { }
+ //virtual void save_register() { }
private:
pstring m_name;
@@ -410,10 +405,7 @@ namespace netlist
{
P_PREVENT_COPYING(device_object_t)
public:
- ATTR_COLD device_object_t(const type_t atype);
-
- ATTR_COLD void init_object(core_device_t &dev, const pstring &aname);
-
+ ATTR_COLD device_object_t(core_device_t &dev, const pstring &aname, const type_t atype);
ATTR_HOT core_device_t &device() const { return *m_device; }
private:
core_device_t * m_device;
@@ -442,8 +434,7 @@ namespace netlist
STATE_NONEX = 256
};
-
- ATTR_COLD core_terminal_t(const type_t atype);
+ ATTR_COLD core_terminal_t(core_device_t &dev, const pstring &aname, const type_t atype);
ATTR_COLD void set_net(net_t *anet);
ATTR_COLD void clear_net();
@@ -463,13 +454,6 @@ namespace netlist
m_state = astate;
}
- protected:
- virtual void save_register() override
- {
- save(NLNAME(m_state));
- device_object_t::save_register();
- }
-
private:
net_t * m_net;
state_e m_state;
@@ -483,9 +467,8 @@ namespace netlist
{
public:
-
- ATTR_COLD analog_t(const type_t atype)
- : core_terminal_t(atype)
+ ATTR_COLD analog_t(core_device_t &dev, const pstring &aname, const type_t atype)
+ : core_terminal_t(dev, aname, atype)
{
}
@@ -512,7 +495,7 @@ namespace netlist
using list_t = plib::pvector_t<terminal_t *>;
- ATTR_COLD terminal_t();
+ ATTR_COLD terminal_t(core_device_t &dev, const pstring &aname);
terminal_t *m_otherterm;
@@ -548,8 +531,6 @@ namespace netlist
}
protected:
- virtual void save_register() override;
-
virtual void reset() override;
private:
ATTR_HOT void set_ptr(nl_double *ptr, const nl_double val)
@@ -574,10 +555,8 @@ namespace netlist
class logic_t : public core_terminal_t, public logic_family_t
{
public:
-
-
- ATTR_COLD logic_t(const type_t atype)
- : core_terminal_t(atype), logic_family_t(),
+ ATTR_COLD logic_t(core_device_t &dev, const pstring &aname, const type_t atype)
+ : core_terminal_t(dev, aname, atype), logic_family_t(),
m_proxy(nullptr)
{
}
@@ -603,14 +582,9 @@ namespace netlist
class logic_input_t : public logic_t
{
public:
- ATTR_COLD logic_input_t()
- : logic_t(INPUT)
- {
- set_state(STATE_INP_ACTIVE);
- }
+ ATTR_COLD logic_input_t(core_device_t &dev, const pstring &aname);
ATTR_HOT netlist_sig_t Q() const;
- ATTR_HOT netlist_sig_t last_Q() const;
ATTR_HOT void inactivate();
ATTR_HOT void activate();
@@ -633,12 +607,7 @@ namespace netlist
class analog_input_t : public analog_t
{
public:
- ATTR_COLD analog_input_t()
- : analog_t(INPUT)
- {
- set_state(STATE_INP_ACTIVE);
- }
-
+ ATTR_COLD analog_input_t(core_device_t &dev, const pstring &aname);
ATTR_HOT nl_double Q_Analog() const;
protected:
@@ -650,7 +619,7 @@ namespace netlist
};
// -----------------------------------------------------------------------------
- // net_net_t
+ // net_t
// -----------------------------------------------------------------------------
class net_t : public object_t
@@ -661,11 +630,9 @@ namespace netlist
using ptr_t = net_t *;
using list_t = plib::pvector_t<std::shared_ptr<net_t>>;
- ATTR_COLD net_t();
+ ATTR_COLD net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr);
virtual ~net_t();
- ATTR_COLD void init_object(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr);
-
ATTR_COLD void register_con(core_terminal_t &terminal);
ATTR_COLD void merge_net(net_t *othernet);
@@ -713,7 +680,6 @@ namespace netlist
protected: //FIXME: needed by current solver code
- virtual void save_register() override;
virtual void reset() override;
netlist_sig_t m_new_Q;
@@ -743,7 +709,7 @@ namespace netlist
using list_t = plib::pvector_t<logic_net_t *>;
- ATTR_COLD logic_net_t();
+ ATTR_COLD logic_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr);
virtual ~logic_net_t() { };
ATTR_HOT netlist_sig_t Q() const
@@ -786,10 +752,8 @@ namespace netlist
protected: //FIXME: needed by current solver code
- virtual void save_register() override;
virtual void reset() override;
-
private:
public:
@@ -803,8 +767,7 @@ namespace netlist
using list_t = plib::pvector_t<analog_net_t *>;
- ATTR_COLD analog_net_t();
- ATTR_COLD analog_net_t(netlist_t &nl, const pstring &aname);
+ ATTR_COLD analog_net_t(netlist_t &nl, const pstring &aname, core_terminal_t *mr = nullptr);
virtual ~analog_net_t() { };
@@ -825,7 +788,6 @@ namespace netlist
protected:
- virtual void save_register() override;
virtual void reset() override;
@@ -846,9 +808,8 @@ namespace netlist
P_PREVENT_COPYING(logic_output_t)
public:
- ATTR_COLD logic_output_t();
+ ATTR_COLD logic_output_t(core_device_t &dev, const pstring &aname);
- ATTR_COLD void init_object(core_device_t &dev, const pstring &aname);
virtual void reset() override
{
set_state(STATE_OUT);
@@ -871,9 +832,7 @@ namespace netlist
public:
ATTR_COLD analog_output_t(core_device_t &dev, const pstring &aname);
- ATTR_COLD analog_output_t();
- ATTR_COLD void init_object(core_device_t &dev, const pstring &aname);
virtual void reset() override
{
set_state(STATE_OUT);
@@ -1006,8 +965,6 @@ namespace netlist
ATTR_HOT netlist_sig_t INPLOGIC(const logic_input_t &inp) const
{
- //if (inp.state() == logic_t::STATE_INP_PASSIVE)
- // printf("argh input %s\n", inp.name().cstr());
nl_assert(inp.state() != logic_t::STATE_INP_PASSIVE);
return inp.Q();
}
@@ -1107,11 +1064,11 @@ namespace netlist
ATTR_COLD void register_subalias(const pstring &name, core_terminal_t &term);
ATTR_COLD void register_subalias(const pstring &name, const pstring &aliased);
- ATTR_COLD void enregister(const pstring &name, terminal_t &port) { register_p(name, port); }
- ATTR_COLD void enregister(const pstring &name, analog_output_t &out) { register_p(name, out); };
- ATTR_COLD void enregister(const pstring &name, logic_output_t &out) { register_p(name, out); };
- ATTR_COLD void enregister(const pstring &name, analog_input_t &in) { register_p(name, in); };
- ATTR_COLD void enregister(const pstring &name, logic_input_t &in) { register_p(name, in); };
+ //ATTR_COLD void register_term(const pstring &name, terminal_t &port) { register_p(name, port); }
+ //ATTR_COLD void enregister(const pstring &name, analog_output_t &out) { register_p(name, out); };
+ //ATTR_COLD void enregister(const pstring &name, logic_output_t &out) { register_p(name, out); };
+ //ATTR_COLD void enregister(const pstring &name, analog_input_t &in) { register_p(name, in); };
+ //ATTR_COLD void enregister(const pstring &name, logic_input_t &in) { register_p(name, in); };
ATTR_COLD void connect_late(const pstring &t1, const pstring &t2);
ATTR_COLD void connect_late(core_terminal_t &t1, core_terminal_t &t2);
@@ -1299,6 +1256,24 @@ protected:
plib::dynlib *m_lib; // external lib needs to be loaded as long as netlist exists
};
+ // -----------------------------------------------------------------------------
+ // Support classes for devices
+ // -----------------------------------------------------------------------------
+
+ template<class C, int N>
+ class object_array_t : public plib::uninitialised_array_t<C, N>
+ {
+ public:
+ struct init
+ {
+ const char *p[N];
+ };
+ object_array_t(core_device_t &dev, init names)
+ {
+ for (std::size_t i = 0; i<N; i++)
+ this->emplace(i, dev, names.p[i]);
+ }
+ };
// -----------------------------------------------------------------------------
// inline implementations
diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp
index ca349e7dd67..545e2c3a601 100644
--- a/src/lib/netlist/nl_factory.cpp
+++ b/src/lib/netlist/nl_factory.cpp
@@ -45,23 +45,6 @@ factory_list_t::~factory_list_t()
clear();
}
-#if 0
-device_t *factory_list_t::new_device_by_classname(const pstring &classname) const
-{
- for (std::size_t i=0; i < m_list.size(); i++)
- {
- base_factory_t *p = m_list[i];
- if (p->classname() == classname)
- {
- device_t *ret = p->Create();
- return ret;
- }
- p++;
- }
- return nullptr; // appease code analysis
-}
-#endif
-
void factory_list_t::error(const pstring &s)
{
m_setup.log().fatal("{1}", s);
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp
index 8fda3d2f8f4..c072e917240 100644
--- a/src/lib/netlist/nl_setup.cpp
+++ b/src/lib/netlist/nl_setup.cpp
@@ -105,7 +105,6 @@ void setup_t::register_dev(plib::owned_ptr<device_t> dev)
for (auto & d : netlist().m_devices)
if (d->name() == dev->name())
log().fatal("Error adding {1} to device list. Duplicate name \n", d->name());
-
netlist().m_devices.push_back(std::move(dev));
}
@@ -245,7 +244,7 @@ void setup_t::register_and_set_param(pstring name, param_t &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)
+void setup_t::register_object(object_t &obj)
{
switch (obj.type())
{
@@ -256,36 +255,18 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj)
core_terminal_t &term = dynamic_cast<core_terminal_t &>(obj);
if (term.isType(terminal_t::OUTPUT))
{
- if (term.is_logic())
- {
- logic_output_t &port = dynamic_cast<logic_output_t &>(term);
- port.set_logic_family(dev.logic_family());
- dynamic_cast<logic_output_t &>(term).init_object(dev, dev.name() + "." + name);
- }
- else if (term.is_analog())
- dynamic_cast<analog_output_t &>(term).init_object(dev, dev.name() + "." + name);
- else
- log().fatal("Error adding {1} {2} to terminal list, neither LOGIC nor ANALOG\n", objtype_as_astr(term), term.name());
}
else if (term.isType(terminal_t::INPUT))
{
- if (term.is_logic())
- {
- logic_input_t &port = dynamic_cast<logic_input_t &>(term);
- port.set_logic_family(dev.logic_family());
- }
- term.init_object(dev, dev.name() + "." + name);
- dev.m_terminals.push_back(obj.name());
+ static_cast<device_t &>(term.device()).m_terminals.push_back(obj.name());
}
else
{
- term.init_object(dev, dev.name() + "." + name);
- dev.m_terminals.push_back(obj.name());
+ static_cast<device_t &>(term.device()).m_terminals.push_back(obj.name());
}
-
if (!m_terminals.add(term.name(), &term))
- log().fatal("Error adding {1} {2} to terminal list\n", objtype_as_astr(term), term.name());
- log().debug("{1} {2}\n", objtype_as_astr(term), name);
+ log().fatal("Error adding {1} {2} to terminal list\n", objtype_as_astr(obj), obj.name());
+ log().debug("{1} {2}\n", objtype_as_astr(obj), obj.name());
}
break;
case terminal_t::NET:
@@ -297,10 +278,10 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj)
}
break;
case terminal_t::DEVICE:
- log().fatal("Device registration not yet supported - {1}\n", name);
+ log().fatal("Device registration not yet supported - {1}\n", obj.name());
break;
case terminal_t::QUEUE:
- log().fatal("QUEUE registration not yet supported - {1}\n", name);
+ log().fatal("QUEUE registration not yet supported - {1}\n", obj.name());
break;
}
}
diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h
index d7ab1723b79..f9f8721e911 100644
--- a/src/lib/netlist/nl_setup.h
+++ b/src/lib/netlist/nl_setup.h
@@ -113,7 +113,7 @@ namespace netlist
void register_and_set_param(pstring name, param_t &param);
- void register_object(device_t &dev, const pstring &name, object_t &obj);
+ void register_object(object_t &obj);
template<class NETLIST_X>
void register_dev_s(plib::owned_ptr<NETLIST_X> dev)
diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h
index 4e1454a7d30..718aab95cb8 100644
--- a/src/lib/netlist/plib/plists.h
+++ b/src/lib/netlist/plib/plists.h
@@ -13,6 +13,7 @@
#include <algorithm>
#include <stack>
#include <vector>
+#include <type_traits>
#include "palloc.h"
#include "pstring.h"
@@ -105,22 +106,25 @@ public:
~uninitialised_array_t()
{
for (std::size_t i=0; i<N; i++)
- {
- C &r = (*this)[i];
- r.~C();
- }
+ (*this)[i].~C();
}
size_t size() { return N; }
C& operator[](const std::size_t &index)
{
- return *reinterpret_cast<C *>(reinterpret_cast<char *>(m_buf) + index * sizeof(C));
+ return *reinterpret_cast<C *>(&m_buf[index]);
}
const C& operator[](const std::size_t &index) const
{
- return *reinterpret_cast<C *>(reinterpret_cast<char *>(m_buf) + index * sizeof(C));
+ return *reinterpret_cast<C *>(&m_buf[index]);
+ }
+
+ template<typename... Args>
+ void emplace(const std::size_t index, Args&&... args)
+ {
+ new (&m_buf[index]) C(std::forward<Args>(args)...);
}
protected:
@@ -128,7 +132,7 @@ protected:
private:
/* ensure proper alignment */
- UINT64 m_buf[(N * sizeof(C) + sizeof(UINT64) - 1) / sizeof(UINT64)];
+ typename std::aligned_storage<sizeof(C), alignof(C)>::type m_buf[N];
};
// ----------------------------------------------------------------------------------------
diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h
index 44db4d9e73a..fcd503daa08 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.h
+++ b/src/lib/netlist/solver/nld_matrix_solver.h
@@ -97,10 +97,10 @@ public:
m_iterative_total(0),
m_params(*params),
m_cur_ts(0),
+ m_fb_sync(*this, "FB_sync"),
+ m_Q_sync(*this, "Q_sync"),
m_sort(sort)
{
- enregister("Q_sync", m_Q_sync);
- enregister("FB_sync", m_fb_sync);
connect_post_start(m_fb_sync, m_Q_sync);
save(NLNAME(m_last_step));
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp
index 7d16bcbefc2..8a639db596a 100644
--- a/src/lib/netlist/solver/nld_solver.cpp
+++ b/src/lib/netlist/solver/nld_solver.cpp
@@ -31,7 +31,6 @@
#include <iostream>
#include <algorithm>
-//#include "nld_twoterm.h"
#include "nl_lists.h"
#if HAS_OPENMP
diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h
index 7b7aac2a1c1..ba604352aac 100644
--- a/src/lib/netlist/solver/nld_solver.h
+++ b/src/lib/netlist/solver/nld_solver.h
@@ -57,6 +57,8 @@ class matrix_solver_t;
NETLIB_OBJECT(solver)
{
NETLIB_CONSTRUCTOR(solver)
+ , m_fb_step(*this, "FB_step")
+ , m_Q_step(*this, "Q_step")
, m_sync_delay(*this, "SYNC_DELAY", NLTIME_FROM_NS(10).as_double())
, m_freq(*this, "FREQ", 48000.0)
@@ -80,11 +82,8 @@ NETLIB_OBJECT(solver)
, m_log_stats(*this, "LOG_STATS", 1) // nl_double timestep resolution
{
- enregister("Q_step", m_Q_step);
-
// internal staff
- enregister("FB_step", m_fb_step);
connect_late(m_fb_step, m_Q_step);
}