summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist
diff options
context:
space:
mode:
author balr0g <balrog032@gmail.com>2016-06-07 15:15:37 -0400
committer couriersud <couriersud@arcor.de>2016-06-07 21:40:30 +0200
commitb27790890530b658e178846e7da01045185f0fce (patch)
tree95c027c901b343de6600a65d8d8f1beda51cbcdf /src/lib/netlist
parent9137ace16ae5bed3f7164409a8622f61a9db2b80 (diff)
- Minor cosmetic refactoring. Added a "uninitialised array" template to
allow in-place creation (for increased locality) of netlist classes. Main use is in truthtable class. - Remove PLIB_NAMESPACE macros. - Remove namespace macros. Use explicit namespace declarations. - Moved device definitions into cpp files. - Moved more device definitions into cpp files. - New prefix "nlid" for include files flags purely internal include files not to be leaked into userland. - Fix factory code.
Diffstat (limited to 'src/lib/netlist')
-rw-r--r--src/lib/netlist/analog/nld_bjt.cpp8
-rw-r--r--src/lib/netlist/analog/nld_bjt.h8
-rw-r--r--src/lib/netlist/analog/nld_fourterm.cpp8
-rw-r--r--src/lib/netlist/analog/nld_fourterm.h8
-rw-r--r--src/lib/netlist/analog/nld_opamps.cpp8
-rw-r--r--src/lib/netlist/analog/nld_opamps.h8
-rw-r--r--src/lib/netlist/analog/nld_switches.cpp8
-rw-r--r--src/lib/netlist/analog/nld_switches.h8
-rw-r--r--src/lib/netlist/analog/nld_twoterm.cpp8
-rw-r--r--src/lib/netlist/analog/nld_twoterm.h8
-rw-r--r--src/lib/netlist/devices/net_lib.cpp135
-rw-r--r--src/lib/netlist/devices/nld_4020.cpp154
-rw-r--r--src/lib/netlist/devices/nld_4020.h94
-rw-r--r--src/lib/netlist/devices/nld_4066.cpp82
-rw-r--r--src/lib/netlist/devices/nld_4066.h31
-rw-r--r--src/lib/netlist/devices/nld_74107.cpp223
-rw-r--r--src/lib/netlist/devices/nld_74107.h122
-rw-r--r--src/lib/netlist/devices/nld_74123.cpp380
-rw-r--r--src/lib/netlist/devices/nld_74123.h187
-rw-r--r--src/lib/netlist/devices/nld_74153.cpp146
-rw-r--r--src/lib/netlist/devices/nld_74153.h113
-rw-r--r--src/lib/netlist/devices/nld_74175.cpp175
-rw-r--r--src/lib/netlist/devices/nld_74175.h97
-rw-r--r--src/lib/netlist/devices/nld_74192.cpp200
-rw-r--r--src/lib/netlist/devices/nld_74192.h78
-rw-r--r--src/lib/netlist/devices/nld_74193.cpp173
-rw-r--r--src/lib/netlist/devices/nld_74193.h83
-rw-r--r--src/lib/netlist/devices/nld_74279.cpp200
-rw-r--r--src/lib/netlist/devices/nld_74279.h51
-rw-r--r--src/lib/netlist/devices/nld_7448.cpp331
-rw-r--r--src/lib/netlist/devices/nld_7448.h131
-rw-r--r--src/lib/netlist/devices/nld_7450.cpp107
-rw-r--r--src/lib/netlist/devices/nld_7450.h69
-rw-r--r--src/lib/netlist/devices/nld_7474.cpp199
-rw-r--r--src/lib/netlist/devices/nld_7474.h102
-rw-r--r--src/lib/netlist/devices/nld_7483.cpp118
-rw-r--r--src/lib/netlist/devices/nld_7483.h103
-rw-r--r--src/lib/netlist/devices/nld_7490.cpp154
-rw-r--r--src/lib/netlist/devices/nld_7490.h73
-rw-r--r--src/lib/netlist/devices/nld_7493.cpp152
-rw-r--r--src/lib/netlist/devices/nld_7493.h98
-rw-r--r--src/lib/netlist/devices/nld_74ls629.cpp259
-rw-r--r--src/lib/netlist/devices/nld_74ls629.h131
-rw-r--r--src/lib/netlist/devices/nld_82S16.cpp125
-rw-r--r--src/lib/netlist/devices/nld_82S16.h72
-rw-r--r--src/lib/netlist/devices/nld_9310.cpp365
-rw-r--r--src/lib/netlist/devices/nld_9310.h157
-rw-r--r--src/lib/netlist/devices/nld_9312.cpp266
-rw-r--r--src/lib/netlist/devices/nld_9312.h88
-rw-r--r--src/lib/netlist/devices/nld_9316.cpp358
-rw-r--r--src/lib/netlist/devices/nld_9316.h139
-rw-r--r--src/lib/netlist/devices/nld_cmos.h37
-rw-r--r--src/lib/netlist/devices/nld_legacy.cpp121
-rw-r--r--src/lib/netlist/devices/nld_legacy.h60
-rw-r--r--src/lib/netlist/devices/nld_log.cpp113
-rw-r--r--src/lib/netlist/devices/nld_log.h48
-rw-r--r--src/lib/netlist/devices/nld_mm5837.cpp128
-rw-r--r--src/lib/netlist/devices/nld_mm5837.h58
-rw-r--r--src/lib/netlist/devices/nld_ne555.cpp171
-rw-r--r--src/lib/netlist/devices/nld_ne555.h74
-rw-r--r--src/lib/netlist/devices/nld_r2r_dac.cpp47
-rw-r--r--src/lib/netlist/devices/nld_r2r_dac.h39
-rw-r--r--src/lib/netlist/devices/nld_system.cpp338
-rw-r--r--src/lib/netlist/devices/nld_system.h627
-rw-r--r--src/lib/netlist/devices/nld_truthtable.cpp12
-rw-r--r--src/lib/netlist/devices/nld_truthtable.h25
-rw-r--r--src/lib/netlist/devices/nlid_cmos.h41
-rw-r--r--src/lib/netlist/devices/nlid_system.h591
-rw-r--r--src/lib/netlist/nl_base.cpp49
-rw-r--r--src/lib/netlist/nl_base.h20
-rw-r--r--src/lib/netlist/nl_config.h64
-rw-r--r--src/lib/netlist/nl_factory.cpp6
-rw-r--r--src/lib/netlist/nl_factory.h35
-rw-r--r--src/lib/netlist/nl_parser.cpp2
-rw-r--r--src/lib/netlist/nl_setup.cpp14
-rw-r--r--src/lib/netlist/nl_setup.h4
-rw-r--r--src/lib/netlist/nl_time.h4
-rw-r--r--src/lib/netlist/plib/palloc.cpp14
-rw-r--r--src/lib/netlist/plib/palloc.h38
-rw-r--r--src/lib/netlist/plib/pconfig.h105
-rw-r--r--src/lib/netlist/plib/pdynlib.cpp4
-rw-r--r--src/lib/netlist/plib/pdynlib.h4
-rw-r--r--src/lib/netlist/plib/pfmtlog.cpp4
-rw-r--r--src/lib/netlist/plib/pfmtlog.h4
-rw-r--r--src/lib/netlist/plib/plists.h52
-rw-r--r--src/lib/netlist/plib/poptions.h4
-rw-r--r--src/lib/netlist/plib/pparser.cpp4
-rw-r--r--src/lib/netlist/plib/pparser.h4
-rw-r--r--src/lib/netlist/plib/pstate.cpp8
-rw-r--r--src/lib/netlist/plib/pstate.h4
-rw-r--r--src/lib/netlist/plib/pstream.cpp4
-rw-r--r--src/lib/netlist/plib/pstream.h4
-rw-r--r--src/lib/netlist/plib/ptypes.h4
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.h12
-rw-r--r--src/lib/netlist/solver/nld_ms_direct.h8
-rw-r--r--src/lib/netlist/solver/nld_ms_direct1.h8
-rw-r--r--src/lib/netlist/solver/nld_ms_direct2.h8
-rw-r--r--src/lib/netlist/solver/nld_ms_direct_lu.h8
-rw-r--r--src/lib/netlist/solver/nld_ms_gcr.h8
-rw-r--r--src/lib/netlist/solver/nld_ms_gmres.h8
-rw-r--r--src/lib/netlist/solver/nld_ms_sm.h8
-rw-r--r--src/lib/netlist/solver/nld_ms_sor.h8
-rw-r--r--src/lib/netlist/solver/nld_ms_sor_mat.h8
-rw-r--r--src/lib/netlist/solver/nld_ms_w.h8
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp8
-rw-r--r--src/lib/netlist/solver/nld_solver.h8
-rw-r--r--src/lib/netlist/tools/nl_convert.cpp2
107 files changed, 4841 insertions, 4659 deletions
diff --git a/src/lib/netlist/analog/nld_bjt.cpp b/src/lib/netlist/analog/nld_bjt.cpp
index 0252831cb4b..a2fcc817371 100644
--- a/src/lib/netlist/analog/nld_bjt.cpp
+++ b/src/lib/netlist/analog/nld_bjt.cpp
@@ -9,7 +9,10 @@
#include "analog/nld_bjt.h"
#include "nl_setup.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
class diode
{
@@ -187,4 +190,5 @@ NETLIB_UPDATE_PARAM(QBJT_EB)
m_gD_BC.set_param(IS / m_alpha_r, NR, netlist().gmin());
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/analog/nld_bjt.h b/src/lib/netlist/analog/nld_bjt.h
index b829e8a22b2..f61295ab14c 100644
--- a/src/lib/netlist/analog/nld_bjt.h
+++ b/src/lib/netlist/analog/nld_bjt.h
@@ -24,7 +24,10 @@
NETDEV_PARAMI(name, MODEL, model)
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
// -----------------------------------------------------------------------------
// nld_Q - Base classes
@@ -195,6 +198,7 @@ protected:
private:
};
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_BJT_H_ */
diff --git a/src/lib/netlist/analog/nld_fourterm.cpp b/src/lib/netlist/analog/nld_fourterm.cpp
index 2f8eb3c0e6f..8fda95bc0f6 100644
--- a/src/lib/netlist/analog/nld_fourterm.cpp
+++ b/src/lib/netlist/analog/nld_fourterm.cpp
@@ -9,7 +9,10 @@
#include "nld_fourterm.h"
#include "nl_setup.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
// ----------------------------------------------------------------------------------------
// nld_VCCS
@@ -117,4 +120,5 @@ NETLIB_RESET(VCVS)
m_ON2.set(NL_FCONST(1.0) / m_RO.Value());
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/analog/nld_fourterm.h b/src/lib/netlist/analog/nld_fourterm.h
index 7b577fc1bde..7b9a86b405b 100644
--- a/src/lib/netlist/analog/nld_fourterm.h
+++ b/src/lib/netlist/analog/nld_fourterm.h
@@ -28,7 +28,10 @@
#define LVCCS(name) \
NET_REGISTER_DEV(LVCCS, name)
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
// ----------------------------------------------------------------------------------------
// nld_VCCS
@@ -227,7 +230,8 @@ protected:
};
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_FOURTERM_H_ */
diff --git a/src/lib/netlist/analog/nld_opamps.cpp b/src/lib/netlist/analog/nld_opamps.cpp
index 0ffd5d56a9c..60eccba7457 100644
--- a/src/lib/netlist/analog/nld_opamps.cpp
+++ b/src/lib/netlist/analog/nld_opamps.cpp
@@ -38,7 +38,10 @@ NETLIST_START(opamp_lm3900)
NETLIST_END()
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
/*
* Type = 0: Impedance changer
@@ -113,4 +116,5 @@ NETLIB_DEVICE_WITH_PARAMS(OPAMPx,
);
*/
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/analog/nld_opamps.h b/src/lib/netlist/analog/nld_opamps.h
index 0e7868de8af..2faab7f1312 100644
--- a/src/lib/netlist/analog/nld_opamps.h
+++ b/src/lib/netlist/analog/nld_opamps.h
@@ -32,7 +32,10 @@
NETLIST_EXTERNAL(opamp_lm3900)
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
NETLIB_OBJECT(OPAMP)
{
@@ -121,6 +124,7 @@ private:
unsigned m_type;
};
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_OPAMPS_H_ */
diff --git a/src/lib/netlist/analog/nld_switches.cpp b/src/lib/netlist/analog/nld_switches.cpp
index f3001e778ef..6c887aad569 100644
--- a/src/lib/netlist/analog/nld_switches.cpp
+++ b/src/lib/netlist/analog/nld_switches.cpp
@@ -11,7 +11,10 @@
#define R_OFF (1.0 / netlist().gmin())
#define R_ON 0.01
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
// ----------------------------------------------------------------------------------------
// SWITCH
@@ -74,4 +77,5 @@ NETLIB_UPDATE_PARAM(switch2)
update();
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/analog/nld_switches.h b/src/lib/netlist/analog/nld_switches.h
index 4f908b8564d..5355b5e13bf 100644
--- a/src/lib/netlist/analog/nld_switches.h
+++ b/src/lib/netlist/analog/nld_switches.h
@@ -27,7 +27,10 @@
// Devices ...
// ----------------------------------------------------------------------------------------
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
NETLIB_OBJECT(switch1)
{
@@ -71,6 +74,7 @@ NETLIB_OBJECT(switch2)
param_int_t m_POS;
};
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_SWITCHES_H_ */
diff --git a/src/lib/netlist/analog/nld_twoterm.cpp b/src/lib/netlist/analog/nld_twoterm.cpp
index 9c8b1ba9d21..e6294fda0fb 100644
--- a/src/lib/netlist/analog/nld_twoterm.cpp
+++ b/src/lib/netlist/analog/nld_twoterm.cpp
@@ -10,7 +10,10 @@
#include "nld_twoterm.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
// ----------------------------------------------------------------------------------------
// generic_diode
@@ -172,4 +175,5 @@ NETLIB_UPDATE(CS)
NETLIB_NAME(twoterm)::update();
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/analog/nld_twoterm.h b/src/lib/netlist/analog/nld_twoterm.h
index 029cc9e2bde..fed385fcedb 100644
--- a/src/lib/netlist/analog/nld_twoterm.h
+++ b/src/lib/netlist/analog/nld_twoterm.h
@@ -94,7 +94,10 @@
// Implementation
// -----------------------------------------------------------------------------
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
// -----------------------------------------------------------------------------
// nld_twoterm
@@ -446,6 +449,7 @@ protected:
};
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_TWOTERM_H_ */
diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp
index fe0a2d087ca..2a481daaf5d 100644
--- a/src/lib/netlist/devices/net_lib.cpp
+++ b/src/lib/netlist/devices/net_lib.cpp
@@ -61,7 +61,15 @@ NETLIST_END()
#define ENTRY1(nic, name, defparam) factory.register_device<nic>( # name, xstr(nic), defparam );
#define ENTRY(nic, name, defparam) ENTRY1(NETLIB_NAME(nic), name, defparam)
-NETLIB_NAMESPACE_DEVICES_START()
+#define NETLIB_DEVICE_DECL(chip) extern factory_creator_ptr_t decl_ ## chip;
+
+#define ENTRYX1(nic, name, defparam, decl) factory.register_device( decl (# name, xstr(nic), defparam) );
+#define ENTRYX(nic, name, defparam) { NETLIB_DEVICE_DECL(nic) ENTRYX1(NETLIB_NAME(nic), name, defparam, decl_ ## nic) }
+
+namespace netlist
+{
+ namespace devices
+ {
void initialize_factory(factory_list_t &factory)
{
@@ -77,78 +85,79 @@ void initialize_factory(factory_list_t &factory)
ENTRY(VS, VS, "V")
ENTRY(CS, CS, "I")
ENTRY(OPAMP, OPAMP, "MODEL")
- ENTRY(dummy_input, DUMMY_INPUT, "-")
- ENTRY(frontier, FRONTIER_DEV, "+I,G,Q") // not intended to be used directly
- ENTRY(function, AFUNC, "N,FUNC") // only for macro devices - NO FEEDBACK loops
+ ENTRYX(dummy_input, DUMMY_INPUT, "-")
+ ENTRYX(frontier, FRONTIER_DEV, "+I,G,Q") // not intended to be used directly
+ ENTRYX(function, AFUNC, "N,FUNC") // only for macro devices - NO FEEDBACK loops
ENTRY(QBJT_EB, QBJT_EB, "MODEL")
ENTRY(QBJT_switch, QBJT_SW, "MODEL")
- ENTRY(logic_input, TTL_INPUT, "IN")
- ENTRY(logic_input, LOGIC_INPUT, "IN,FAMILY")
- ENTRY(analog_input, ANALOG_INPUT, "IN")
- ENTRY(log, LOG, "+I")
- ENTRY(logD, LOGD, "+I,I2")
- ENTRY(clock, CLOCK, "FREQ")
- ENTRY(extclock, EXTCLOCK, "FREQ")
- ENTRY(mainclock, MAINCLOCK, "FREQ")
- ENTRY(gnd, GND, "-")
- ENTRY(netlistparams, PARAMETER, "-")
+ ENTRYX(logic_input, TTL_INPUT, "IN")
+ ENTRYX(logic_input, LOGIC_INPUT, "IN,FAMILY")
+ ENTRYX(analog_input, ANALOG_INPUT, "IN")
+ ENTRYX(log, LOG, "+I")
+ ENTRYX(logD, LOGD, "+I,I2")
+ ENTRYX(clock, CLOCK, "FREQ")
+ ENTRYX(extclock, EXTCLOCK, "FREQ")
+ ENTRYX(mainclock, MAINCLOCK, "FREQ")
+ ENTRYX(gnd, GND, "-")
+ ENTRYX(netlistparams, PARAMETER, "-")
ENTRY(solver, SOLVER, "FREQ")
- ENTRY(res_sw, RES_SWITCH, "+IN,P1,P2")
+ ENTRYX(res_sw, RES_SWITCH, "+IN,P1,P2")
ENTRY(switch1, SWITCH, "-")
ENTRY(switch2, SWITCH2, "-")
- ENTRY(nicRSFF, NETDEV_RSFF, "+S,R")
- ENTRY(nicDelay, NETDEV_DELAY, "-")
- ENTRY(7450, TTL_7450_ANDORINVERT, "+A,B,C,D")
- ENTRY(7448, TTL_7448, "+A,B,C,D,LTQ,BIQ,RBIQ")
- ENTRY(7474, TTL_7474, "+CLK,D,CLRQ,PREQ")
- ENTRY(7483, TTL_7483, "+A1,A2,A3,A4,B1,B2,B3,B4,C0")
- ENTRY(7490, TTL_7490, "+A,B,R1,R2,R91,R92")
- ENTRY(7493, TTL_7493, "+CLKA,CLKB,R1,R2")
- ENTRY(74107, TTL_74107, "+CLK,J,K,CLRQ")
- ENTRY(74107A, TTL_74107A, "+CLK,J,K,CLRQ")
- ENTRY(74123, TTL_74123, "-")
- ENTRY(74153, TTL_74153, "+C0,C1,C2,C3,A,B,G")
- ENTRY(74175, TTL_74175, "-")
- ENTRY(74192, TTL_74192, "-")
- ENTRY(74193, TTL_74193, "-")
+ ENTRYX(nicRSFF, NETDEV_RSFF, "+S,R")
+ ENTRYX(nicDelay, NETDEV_DELAY, "-")
+ ENTRYX(7450, TTL_7450_ANDORINVERT, "+A,B,C,D")
+ ENTRYX(7448, TTL_7448, "+A,B,C,D,LTQ,BIQ,RBIQ")
+ ENTRYX(7474, TTL_7474, "+CLK,D,CLRQ,PREQ")
+ ENTRYX(7483, TTL_7483, "+A1,A2,A3,A4,B1,B2,B3,B4,C0")
+ ENTRYX(7490, TTL_7490, "+A,B,R1,R2,R91,R92")
+ ENTRYX(7493, TTL_7493, "+CLKA,CLKB,R1,R2")
+ ENTRYX(74107, TTL_74107, "+CLK,J,K,CLRQ")
+ ENTRYX(74107A, TTL_74107A, "+CLK,J,K,CLRQ")
+ ENTRYX(74123, TTL_74123, "-")
+ ENTRYX(74153, TTL_74153, "+C0,C1,C2,C3,A,B,G")
+ ENTRYX(74175, TTL_74175, "-")
+ ENTRYX(74192, TTL_74192, "-")
+ ENTRYX(74193, TTL_74193, "-")
//ENTRY(74279, TTL_74279, "-") // only dip available
- ENTRY(SN74LS629, SN74LS629, "CAP")
- ENTRY(82S16, TTL_82S16, "-")
- ENTRY(9310, TTL_9310, "-")
- ENTRY(9312, TTL_9312, "-")
- ENTRY(9316, TTL_9316, "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D")
- ENTRY(CD4020, CD4020, "")
- ENTRY(CD4066_GATE, CD4066_GATE, "")
+ ENTRYX(SN74LS629, SN74LS629, "CAP")
+ ENTRYX(82S16, TTL_82S16, "-")
+ ENTRYX(9310, TTL_9310, "-")
+ ENTRYX(9312, TTL_9312, "-")
+ ENTRYX(9316, TTL_9316, "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D")
+ ENTRYX(CD4020, CD4020, "")
+ ENTRYX(CD4066_GATE, CD4066_GATE, "")
/* entries with suffix WI are legacy only */
- ENTRY(CD4020, CD4020_WI, "+IP,RESET,VDD,VSS")
+ ENTRYX(CD4020, CD4020_WI, "+IP,RESET,VDD,VSS")
//ENTRY(4066, CD_4066, "+A,B")
- ENTRY(NE555, NE555, "-")
- ENTRY(r2r_dac, R2R_DAC, "+VIN,R,N")
- ENTRY(4538_dip, CD4538_DIP, "-")
- ENTRY(7448_dip, TTL_7448_DIP, "-")
- ENTRY(7450_dip, TTL_7450_DIP, "-")
- ENTRY(7474_dip, TTL_7474_DIP, "-")
- ENTRY(7483_dip, TTL_7483_DIP, "-")
- ENTRY(7490_dip, TTL_7490_DIP, "-")
- ENTRY(7493_dip, TTL_7493_DIP, "-")
- ENTRY(74107_dip, TTL_74107_DIP, "-")
- ENTRY(74123_dip, TTL_74123_DIP, "-")
- ENTRY(74153_dip, TTL_74153_DIP, "-")
- ENTRY(74175_dip, TTL_74175_DIP, "-")
- ENTRY(74192_dip, TTL_74192_DIP, "-")
- ENTRY(74193_dip, TTL_74193_DIP, "-")
- ENTRY(74279_dip, TTL_74279_DIP, "-")
- ENTRY(82S16_dip, TTL_82S16_DIP, "-")
- ENTRY(9602_dip, TTL_9602_DIP, "-")
- ENTRY(9310_dip, TTL_9310_DIP, "-")
- ENTRY(9312_dip, TTL_9312_DIP, "-")
- ENTRY(9316_dip, TTL_9316_DIP, "-")
- ENTRY(SN74LS629_dip, SN74LS629_DIP, "1.CAP1,2.CAP2")
- ENTRY(NE555_dip, NE555_DIP, "-")
- ENTRY(MM5837_dip, MM5837_DIP, "-")
+ ENTRYX(NE555, NE555, "-")
+ ENTRYX(r2r_dac, R2R_DAC, "+VIN,R,N")
+ ENTRYX(4538_dip, CD4538_DIP, "-")
+ ENTRYX(7448_dip, TTL_7448_DIP, "-")
+ ENTRYX(7450_dip, TTL_7450_DIP, "-")
+ ENTRYX(7474_dip, TTL_7474_DIP, "-")
+ ENTRYX(7483_dip, TTL_7483_DIP, "-")
+ ENTRYX(7490_dip, TTL_7490_DIP, "-")
+ ENTRYX(7493_dip, TTL_7493_DIP, "-")
+ ENTRYX(74107_dip, TTL_74107_DIP, "-")
+ ENTRYX(74123_dip, TTL_74123_DIP, "-")
+ ENTRYX(74153_dip, TTL_74153_DIP, "-")
+ ENTRYX(74175_dip, TTL_74175_DIP, "-")
+ ENTRYX(74192_dip, TTL_74192_DIP, "-")
+ ENTRYX(74193_dip, TTL_74193_DIP, "-")
+ ENTRYX(74279_dip, TTL_74279_DIP, "-")
+ ENTRYX(82S16_dip, TTL_82S16_DIP, "-")
+ ENTRYX(9602_dip, TTL_9602_DIP, "-")
+ ENTRYX(9310_dip, TTL_9310_DIP, "-")
+ ENTRYX(9312_dip, TTL_9312_DIP, "-")
+ ENTRYX(9316_dip, TTL_9316_DIP, "-")
+ ENTRYX(SN74LS629_dip, SN74LS629_DIP, "1.CAP1,2.CAP2")
+ ENTRYX(NE555_dip, NE555_DIP, "-")
+ ENTRYX(MM5837_dip, MM5837_DIP, "-")
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
namespace netlist
{
diff --git a/src/lib/netlist/devices/nld_4020.cpp b/src/lib/netlist/devices/nld_4020.cpp
index db39a636e16..44083ad6ba5 100644
--- a/src/lib/netlist/devices/nld_4020.cpp
+++ b/src/lib/netlist/devices/nld_4020.cpp
@@ -5,49 +5,131 @@
*
*/
+#include <devices/nlid_cmos.h>
#include "nld_4020.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
+ NETLIB_OBJECT(CD4020_sub)
+ {
+ NETLIB_CONSTRUCTOR(CD4020_sub)
+ NETLIB_FAMILY("CD4XXX")
+ , m_cnt(0)
+ {
+ enregister("IP", m_IP);
-NETLIB_UPDATE(CD4020_sub)
-{
- UINT8 cnt = m_cnt;
- cnt = ( cnt + 1) & 0x3fff;
- update_outputs(cnt);
- m_cnt = cnt;
-}
+ 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]);
-NETLIB_UPDATE(CD4020)
-{
- if (INPLOGIC(m_RESET))
+ save(NLNAME(m_cnt));
+ }
+
+ NETLIB_RESETI()
+ {
+ m_IP.set_state(logic_t::STATE_INP_HL);
+ m_cnt = 0;
+ }
+
+ NETLIB_UPDATEI();
+
+ public:
+ ATTR_HOT void update_outputs(const UINT16 cnt);
+
+ logic_input_t m_IP;
+ logic_output_t m_Q[14];
+
+ UINT16 m_cnt;
+ };
+
+ NETLIB_OBJECT(CD4020)
{
- m_sub.m_cnt = 0;
- m_sub.m_IP.inactivate();
- /* static */ const netlist_time reset_time = netlist_time::from_nsec(140);
- OUTLOGIC(m_sub.m_Q[0], 0, reset_time);
- for (int i=3; i<14; i++)
- OUTLOGIC(m_sub.m_Q[i], 0, reset_time);
- }
- else
- m_sub.m_IP.activate_hl();
-}
+ NETLIB_CONSTRUCTOR(CD4020)
+ NETLIB_FAMILY("CD4XXX")
+ , m_sub(*this, "sub")
+ , m_supply(*this, "supply")
+ {
-inline NETLIB_FUNC_VOID(CD4020_sub, update_outputs, (const UINT16 cnt))
-{
- /* static */ const netlist_time out_delayQn[14] = {
- NLTIME_FROM_NS(180), NLTIME_FROM_NS(280),
- NLTIME_FROM_NS(380), NLTIME_FROM_NS(480),
- NLTIME_FROM_NS(580), NLTIME_FROM_NS(680),
- NLTIME_FROM_NS(780), NLTIME_FROM_NS(880),
- NLTIME_FROM_NS(980), NLTIME_FROM_NS(1080),
- NLTIME_FROM_NS(1180), NLTIME_FROM_NS(1280),
- NLTIME_FROM_NS(1380), NLTIME_FROM_NS(1480),
+ 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]);
+ register_subalias("Q5", m_sub.m_Q[4]);
+ register_subalias("Q6", m_sub.m_Q[5]);
+ register_subalias("Q7", m_sub.m_Q[6]);
+ register_subalias("Q8", m_sub.m_Q[7]);
+ register_subalias("Q9", m_sub.m_Q[8]);
+ register_subalias("Q10", m_sub.m_Q[9]);
+ register_subalias("Q11", m_sub.m_Q[10]);
+ register_subalias("Q12", m_sub.m_Q[11]);
+ register_subalias("Q13", m_sub.m_Q[12]);
+ register_subalias("Q14", m_sub.m_Q[13]);
+ register_subalias("VDD", m_supply.m_vdd);
+ register_subalias("VSS", m_supply.m_vss);
+ }
+ NETLIB_RESETI() { }
+ NETLIB_UPDATEI();
+
+ private:
+ NETLIB_SUB(CD4020_sub) m_sub;
+ NETLIB_SUB(vdd_vss) m_supply;
+ logic_input_t m_RESET;
};
- OUTLOGIC(m_Q[0], 0, out_delayQn[0]);
- for (int i=3; i<14; i++)
- OUTLOGIC(m_Q[i], (cnt >> i) & 1, out_delayQn[i]);
-}
-NETLIB_NAMESPACE_DEVICES_END()
+ NETLIB_UPDATE(CD4020_sub)
+ {
+ UINT8 cnt = m_cnt;
+ cnt = ( cnt + 1) & 0x3fff;
+ update_outputs(cnt);
+ m_cnt = cnt;
+ }
+
+ NETLIB_UPDATE(CD4020)
+ {
+ if (INPLOGIC(m_RESET))
+ {
+ m_sub.m_cnt = 0;
+ m_sub.m_IP.inactivate();
+ /* static */ const netlist_time reset_time = netlist_time::from_nsec(140);
+ OUTLOGIC(m_sub.m_Q[0], 0, reset_time);
+ for (int i=3; i<14; i++)
+ OUTLOGIC(m_sub.m_Q[i], 0, reset_time);
+ }
+ else
+ m_sub.m_IP.activate_hl();
+ }
+
+ inline NETLIB_FUNC_VOID(CD4020_sub, update_outputs, (const UINT16 cnt))
+ {
+ /* static */ const netlist_time out_delayQn[14] = {
+ NLTIME_FROM_NS(180), NLTIME_FROM_NS(280),
+ NLTIME_FROM_NS(380), NLTIME_FROM_NS(480),
+ NLTIME_FROM_NS(580), NLTIME_FROM_NS(680),
+ NLTIME_FROM_NS(780), NLTIME_FROM_NS(880),
+ NLTIME_FROM_NS(980), NLTIME_FROM_NS(1080),
+ NLTIME_FROM_NS(1180), NLTIME_FROM_NS(1280),
+ NLTIME_FROM_NS(1380), NLTIME_FROM_NS(1480),
+ };
+
+ OUTLOGIC(m_Q[0], 0, out_delayQn[0]);
+ for (int i=3; i<14; i++)
+ OUTLOGIC(m_Q[i], (cnt >> i) & 1, out_delayQn[i]);
+ }
+
+ NETLIB_DEVICE_IMPL(CD4020)
+
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_4020.h b/src/lib/netlist/devices/nld_4020.h
index 0ca252222b9..11b174e97f5 100644
--- a/src/lib/netlist/devices/nld_4020.h
+++ b/src/lib/netlist/devices/nld_4020.h
@@ -27,97 +27,17 @@
#ifndef NLD_4020_H_
#define NLD_4020_H_
-#include "nl_base.h"
-#include "nld_cmos.h"
+#include "nl_setup.h"
/* FIXME: only used in mario.c */
-#define CD4020_WI(name, cIP, cRESET, cVDD, cVSS) \
- NET_REGISTER_DEV(CD4020_WI, name) \
- NET_CONNECT(name, IP, cIP) \
- NET_CONNECT(name, RESET, cRESET) \
- NET_CONNECT(name, VDD, cVDD) \
+#define CD4020_WI(name, cIP, cRESET, cVDD, cVSS) \
+ NET_REGISTER_DEV(CD4020_WI, name) \
+ NET_CONNECT(name, IP, cIP) \
+ NET_CONNECT(name, RESET, cRESET) \
+ NET_CONNECT(name, VDD, cVDD) \
NET_CONNECT(name, VSS, cVSS)
-#define CD4020(name) \
+#define CD4020(name) \
NET_REGISTER_DEV(CD4020, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(CD4020_sub)
-{
- NETLIB_CONSTRUCTOR(CD4020_sub)
- NETLIB_FAMILY("CD4XXX")
- , 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));
- }
-
- NETLIB_RESETI()
- {
- m_IP.set_state(logic_t::STATE_INP_HL);
- m_cnt = 0;
- }
-
- NETLIB_UPDATEI();
-
-public:
- ATTR_HOT void update_outputs(const UINT16 cnt);
-
- logic_input_t m_IP;
- logic_output_t m_Q[14];
-
- UINT16 m_cnt;
-};
-
-NETLIB_OBJECT(CD4020)
-{
- NETLIB_CONSTRUCTOR(CD4020)
- NETLIB_FAMILY("CD4XXX")
- , 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]);
- register_subalias("Q4", m_sub.m_Q[3]);
- register_subalias("Q5", m_sub.m_Q[4]);
- register_subalias("Q6", m_sub.m_Q[5]);
- register_subalias("Q7", m_sub.m_Q[6]);
- register_subalias("Q8", m_sub.m_Q[7]);
- register_subalias("Q9", m_sub.m_Q[8]);
- register_subalias("Q10", m_sub.m_Q[9]);
- register_subalias("Q11", m_sub.m_Q[10]);
- register_subalias("Q12", m_sub.m_Q[11]);
- register_subalias("Q13", m_sub.m_Q[12]);
- register_subalias("Q14", m_sub.m_Q[13]);
- register_subalias("VDD", m_supply.m_vdd);
- register_subalias("VSS", m_supply.m_vss);
- }
- NETLIB_RESETI() { }
- NETLIB_UPDATEI();
-
-private:
- NETLIB_SUB(CD4020_sub) m_sub;
- NETLIB_SUB(vdd_vss) m_supply;
- logic_input_t m_RESET;
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_4020_H_ */
diff --git a/src/lib/netlist/devices/nld_4066.cpp b/src/lib/netlist/devices/nld_4066.cpp
index 890409bef92..788704b617e 100644
--- a/src/lib/netlist/devices/nld_4066.cpp
+++ b/src/lib/netlist/devices/nld_4066.cpp
@@ -5,43 +5,71 @@
*
*/
+#include <devices/nlid_cmos.h>
#include "nld_4066.h"
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_UPDATE(CD4066_GATE)
+namespace netlist
{
- nl_double sup = (m_supply.vdd() - m_supply.vss());
- nl_double low = NL_FCONST(0.45) * sup;
- nl_double high = NL_FCONST(0.55) * sup;
- nl_double in = INPANALOG(m_control) - m_supply.vss();
- nl_double rON = m_base_r * NL_FCONST(5.0) / sup;
- nl_double R = -1.0;
-
- if (in < low)
+ namespace devices
{
- R = NL_FCONST(1.0) / netlist().gmin();
- }
- else if (in > high)
+
+ NETLIB_OBJECT(CD4066_GATE)
{
- R = rON;
- }
- if (R > NL_FCONST(0.0))
+ NETLIB_CONSTRUCTOR(CD4066_GATE)
+ NETLIB_FAMILY("CD4XXX")
+ , m_supply(*this, "PS")
+ , m_R(*this, "R")
+ , m_base_r(*this, "BASER", 270.0)
+ {
+ enregister("CTL", m_control);
+ }
+
+ NETLIB_RESETI() { }
+ NETLIB_UPDATEI();
+
+ public:
+ NETLIB_SUB(vdd_vss) m_supply;
+ NETLIB_SUB(R) m_R;
+
+ analog_input_t m_control;
+ param_double_t m_base_r;
+ };
+
+ NETLIB_UPDATE(CD4066_GATE)
{
- // We only need to update the net first if this is a time stepping net
- if (1) // m_R.m_P.net().as_analog().solver().is_timestep())
+ nl_double sup = (m_supply.vdd() - m_supply.vss());
+ nl_double low = NL_FCONST(0.45) * sup;
+ nl_double high = NL_FCONST(0.55) * sup;
+ nl_double in = INPANALOG(m_control) - m_supply.vss();
+ nl_double rON = m_base_r * NL_FCONST(5.0) / sup;
+ nl_double R = -1.0;
+
+ if (in < low)
+ {
+ R = NL_FCONST(1.0) / netlist().gmin();
+ }
+ else if (in > high)
{
- m_R.update_dev();
- m_R.set_R(R);
- m_R.m_P.schedule_after(NLTIME_FROM_NS(1));
+ R = rON;
}
- else
+ if (R > NL_FCONST(0.0))
{
- m_R.set_R(R);
- m_R.update_dev();
+ // We only need to update the net first if this is a time stepping net
+ if (1) // m_R.m_P.net().as_analog().solver().is_timestep())
+ {
+ m_R.update_dev();
+ m_R.set_R(R);
+ m_R.m_P.schedule_after(NLTIME_FROM_NS(1));
+ }
+ else
+ {
+ m_R.set_R(R);
+ m_R.update_dev();
+ }
}
}
-}
+ NETLIB_DEVICE_IMPL(CD4066_GATE)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_4066.h b/src/lib/netlist/devices/nld_4066.h
index 87772264136..570f9ecf16d 100644
--- a/src/lib/netlist/devices/nld_4066.h
+++ b/src/lib/netlist/devices/nld_4066.h
@@ -24,36 +24,9 @@
#ifndef NLD_4066_H_
#define NLD_4066_H_
-#include "nl_base.h"
-#include "nld_cmos.h"
+#include "nl_setup.h"
-#define CD4066_GATE(name) \
+#define CD4066_GATE(name) \
NET_REGISTER_DEV(CD4066_GATE, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(CD4066_GATE)
-{
- NETLIB_CONSTRUCTOR(CD4066_GATE)
- NETLIB_FAMILY("CD4XXX")
- , m_supply(*this, "PS")
- , m_R(*this, "R")
- , m_base_r(*this, "BASER", 270.0)
- {
- enregister("CTL", m_control);
- }
-
- NETLIB_RESETI() { }
- NETLIB_UPDATEI();
-
-public:
- NETLIB_SUB(vdd_vss) m_supply;
- NETLIB_SUB(R) m_R;
-
- analog_input_t m_control;
- param_double_t m_base_r;
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_4066_H_ */
diff --git a/src/lib/netlist/devices/nld_74107.cpp b/src/lib/netlist/devices/nld_74107.cpp
index 399f596d91d..cc0746fe131 100644
--- a/src/lib/netlist/devices/nld_74107.cpp
+++ b/src/lib/netlist/devices/nld_74107.cpp
@@ -7,74 +7,183 @@
#include "nld_74107.h"
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_RESET(74107Asub)
+namespace netlist
{
- m_clk.set_state(logic_t::STATE_INP_HL);
- //m_Q.initial(0);
- //m_QQ.initial(1);
+ namespace devices
+ {
- m_Q1 = 0;
- m_Q2 = 0;
- m_F = 0;
-}
+ NETLIB_OBJECT(74107Asub)
+ {
+ NETLIB_CONSTRUCTOR(74107Asub)
+ , m_Q1(0)
+ , m_Q2(0)
+ , m_F(0)
-ATTR_HOT inline void NETLIB_NAME(74107Asub)::newstate(const netlist_sig_t state)
-{
- const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(40) };
+ {
+ enregister("CLK", m_clk);
+ enregister("Q", m_Q);
+ enregister("QQ", m_QQ);
- OUTLOGIC(m_Q, state, delay[state]);
- OUTLOGIC(m_QQ, state ^ 1, delay[state ^ 1]);
-}
+ save(NLNAME(m_Q1));
+ save(NLNAME(m_Q2));
+ save(NLNAME(m_F));
+ }
-NETLIB_UPDATE(74107Asub)
-{
- const netlist_sig_t t = m_Q.net().as_logic().Q();
- newstate(((t ^ 1) & m_Q1) | (t & m_Q2) | m_F);
- if (m_Q1 ^ 1)
- m_clk.inactivate();
-}
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
-NETLIB_UPDATE(74107A)
-{
- const UINT8 JK = (INPLOGIC(m_J) << 1) | INPLOGIC(m_K);
+ public:
+ logic_input_t m_clk;
- switch (JK)
+ logic_output_t m_Q;
+ logic_output_t m_QQ;
+
+ netlist_sig_t m_Q1;
+ netlist_sig_t m_Q2;
+ netlist_sig_t m_F;
+
+ ATTR_HOT void newstate(const netlist_sig_t state);
+
+ };
+
+ NETLIB_OBJECT(74107A)
{
- case 0:
- m_sub.m_Q1 = 0;
- m_sub.m_Q2 = 1;
- m_sub.m_F = 0;
- m_sub.m_clk.inactivate();
- break;
- case 1: // (!INPLOGIC(m_J) & INPLOGIC(m_K))
- m_sub.m_Q1 = 0;
- m_sub.m_Q2 = 0;
- m_sub.m_F = 0;
- break;
- case 2: // (INPLOGIC(m_J) & !INPLOGIC(m_K))
- m_sub.m_Q1 = 0;
- m_sub.m_Q2 = 0;
- m_sub.m_F = 1;
- break;
- case 3: // (INPLOGIC(m_J) & INPLOGIC(m_K))
- m_sub.m_Q1 = 1;
- m_sub.m_Q2 = 0;
- m_sub.m_F = 0;
- break;
- default:
- break;
+ NETLIB_CONSTRUCTOR(74107A)
+ , m_sub(*this, "sub")
+ {
+
+ 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);
+ }
+
+ //NETLIB_RESETI();
+ NETLIB_UPDATEI();
+ public:
+ NETLIB_SUB(74107Asub) m_sub;
+
+ logic_input_t m_J;
+ logic_input_t m_K;
+ logic_input_t m_clrQ;
+
+ };
+
+ NETLIB_OBJECT_DERIVED(74107, 74107A)
+ {
+ public:
+ NETLIB_CONSTRUCTOR_DERIVED(74107, 74107A) { }
+
+ };
+
+ NETLIB_OBJECT(74107_dip)
+ {
+ NETLIB_CONSTRUCTOR(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);
+
+ register_subalias("4", m_1.m_K);
+ register_subalias("5", m_2.m_sub.m_Q);
+ register_subalias("6", m_2.m_sub.m_QQ);
+
+ // register_subalias("7", ); ==> GND
+
+ register_subalias("8", m_2.m_J);
+ register_subalias("9", m_2.m_sub.m_clk);
+ register_subalias("10", m_2.m_clrQ);
+
+ register_subalias("11", m_2.m_K);
+ register_subalias("12", m_1.m_sub.m_clk);
+ register_subalias("13", m_1.m_clrQ);
+
+ // register_subalias("14", ); ==> VCC
+
+ }
+ //NETLIB_RESETI();
+ //NETLIB_UPDATEI();
+
+ private:
+ NETLIB_SUB(74107) m_1;
+ NETLIB_SUB(74107) m_2;
+ };
+
+ NETLIB_RESET(74107Asub)
+ {
+ m_clk.set_state(logic_t::STATE_INP_HL);
+ //m_Q.initial(0);
+ //m_QQ.initial(1);
+
+ m_Q1 = 0;
+ m_Q2 = 0;
+ m_F = 0;
}
- if (!INPLOGIC(m_clrQ))
+ ATTR_HOT inline void NETLIB_NAME(74107Asub)::newstate(const netlist_sig_t state)
{
- m_sub.m_clk.inactivate();
- m_sub.newstate(0);
+ const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(40) };
+
+ OUTLOGIC(m_Q, state, delay[state]);
+ OUTLOGIC(m_QQ, state ^ 1, delay[state ^ 1]);
+ }
+
+ NETLIB_UPDATE(74107Asub)
+ {
+ const netlist_sig_t t = m_Q.net().as_logic().Q();
+ newstate(((t ^ 1) & m_Q1) | (t & m_Q2) | m_F);
+ if (m_Q1 ^ 1)
+ m_clk.inactivate();
+ }
+
+ NETLIB_UPDATE(74107A)
+ {
+ const UINT8 JK = (INPLOGIC(m_J) << 1) | INPLOGIC(m_K);
+
+ switch (JK)
+ {
+ case 0:
+ m_sub.m_Q1 = 0;
+ m_sub.m_Q2 = 1;
+ m_sub.m_F = 0;
+ m_sub.m_clk.inactivate();
+ break;
+ case 1: // (!INPLOGIC(m_J) & INPLOGIC(m_K))
+ m_sub.m_Q1 = 0;
+ m_sub.m_Q2 = 0;
+ m_sub.m_F = 0;
+ break;
+ case 2: // (INPLOGIC(m_J) & !INPLOGIC(m_K))
+ m_sub.m_Q1 = 0;
+ m_sub.m_Q2 = 0;
+ m_sub.m_F = 1;
+ break;
+ case 3: // (INPLOGIC(m_J) & INPLOGIC(m_K))
+ m_sub.m_Q1 = 1;
+ m_sub.m_Q2 = 0;
+ m_sub.m_F = 0;
+ break;
+ default:
+ break;
+ }
+
+ if (!INPLOGIC(m_clrQ))
+ {
+ m_sub.m_clk.inactivate();
+ m_sub.newstate(0);
+ }
+ else if (!m_sub.m_Q2)
+ m_sub.m_clk.activate_hl();
}
- else if (!m_sub.m_Q2)
- m_sub.m_clk.activate_hl();
-}
+ NETLIB_DEVICE_IMPL(74107)
+ NETLIB_DEVICE_IMPL(74107A)
+ NETLIB_DEVICE_IMPL(74107_dip)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74107.h b/src/lib/netlist/devices/nld_74107.h
index 90c632314af..ea73256e818 100644
--- a/src/lib/netlist/devices/nld_74107.h
+++ b/src/lib/netlist/devices/nld_74107.h
@@ -59,125 +59,19 @@
#ifndef NLD_74107_H_
#define NLD_74107_H_
-#include "nl_base.h"
+#include "nl_setup.h"
-#define TTL_74107A(name, cCLK, cJ, cK, cCLRQ) \
- NET_REGISTER_DEV(TTL_74107A, name) \
- NET_CONNECT(name, CLK, cCLK) \
- NET_CONNECT(name, J, cJ) \
- NET_CONNECT(name, K, cK) \
+#define TTL_74107A(name, cCLK, cJ, cK, cCLRQ) \
+ NET_REGISTER_DEV(TTL_74107A, name) \
+ NET_CONNECT(name, CLK, cCLK) \
+ NET_CONNECT(name, J, cJ) \
+ NET_CONNECT(name, K, cK) \
NET_CONNECT(name, CLRQ, cCLRQ)
-#define TTL_74107(name, cCLK, cJ, cK, cCLRQ) \
+#define TTL_74107(name, cCLK, cJ, cK, cCLRQ) \
TTL_74107A(name, cCLK, cJ, cK, cCLRQ)
-#define TTL_74107_DIP(name) \
+#define TTL_74107_DIP(name) \
NET_REGISTER_DEV(TTL_74107_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(74107Asub)
-{
- NETLIB_CONSTRUCTOR(74107Asub)
- , 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));
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-public:
- logic_input_t m_clk;
-
- logic_output_t m_Q;
- logic_output_t m_QQ;
-
- netlist_sig_t m_Q1;
- netlist_sig_t m_Q2;
- netlist_sig_t m_F;
-
- ATTR_HOT void newstate(const netlist_sig_t state);
-
-};
-
-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);
- enregister("CLRQ", m_clrQ);
- register_subalias("Q", m_sub.m_Q);
- register_subalias("QQ", m_sub.m_QQ);
- }
-
- //NETLIB_RESETI();
- NETLIB_UPDATEI();
-public:
- NETLIB_SUB(74107Asub) m_sub;
-
- logic_input_t m_J;
- logic_input_t m_K;
- logic_input_t m_clrQ;
-
-};
-
-NETLIB_OBJECT_DERIVED(74107, 74107A)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(74107, 74107A) { }
-
-};
-
-NETLIB_OBJECT(74107_dip)
-{
- NETLIB_CONSTRUCTOR(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);
-
- register_subalias("4", m_1.m_K);
- register_subalias("5", m_2.m_sub.m_Q);
- register_subalias("6", m_2.m_sub.m_QQ);
-
- // register_subalias("7", ); ==> GND
-
- register_subalias("8", m_2.m_J);
- register_subalias("9", m_2.m_sub.m_clk);
- register_subalias("10", m_2.m_clrQ);
-
- register_subalias("11", m_2.m_K);
- register_subalias("12", m_1.m_sub.m_clk);
- register_subalias("13", m_1.m_clrQ);
-
- // register_subalias("14", ); ==> VCC
-
- }
- //NETLIB_RESETI();
- //NETLIB_UPDATEI();
-
-private:
- NETLIB_SUB(74107) m_1;
- NETLIB_SUB(74107) m_2;
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_74107_H_ */
diff --git a/src/lib/netlist/devices/nld_74123.cpp b/src/lib/netlist/devices/nld_74123.cpp
index 65a121104bc..1fc8ddd74a3 100644
--- a/src/lib/netlist/devices/nld_74123.cpp
+++ b/src/lib/netlist/devices/nld_74123.cpp
@@ -7,135 +7,315 @@
#include "nld_74123.h"
+#include "nlid_system.h"
+#include "analog/nld_twoterm.h"
+
#define R_OFF (1E20)
#define R_ON (m_RI.Value())
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_UPDATE(74123)
+namespace netlist
{
- netlist_sig_t m_trig;
- netlist_sig_t res = !INPLOGIC(m_CLRQ);
- netlist_time t_AB_to_Q = NLTIME_FROM_NS(10);
- netlist_time t_C_to_Q = NLTIME_FROM_NS(10);
+ namespace devices
+ {
- if (m_dev_type == 74123)
+ NETLIB_OBJECT(74123)
{
- m_trig = (INPLOGIC(m_A) ^ 1) & INPLOGIC(m_B) & INPLOGIC(m_CLRQ);
- }
- else if (m_dev_type == 9602)
+ NETLIB_CONSTRUCTOR_EX(74123, int dev_type = 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;
+
+ 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);
+ register_subalias("RC", m_RN.m_R.m_P);
+
+
+ connect_late(m_RP_Q, m_RP.m_I);
+ connect_late(m_RN_Q, m_RN.m_I);
+
+ connect_late(m_RN.m_R.m_P, m_RP.m_R.m_N);
+ connect_late(m_CV, m_RN.m_R.m_P);
+
+ save(NLNAME(m_last_trig));
+ save(NLNAME(m_state));
+ save(NLNAME(m_KP));
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ private:
+ int m_dev_type;
+ public:
+ NETLIB_SUB(res_sw) m_RP;
+ NETLIB_SUB(res_sw) m_RN;
+
+ logic_output_t m_RP_Q;
+ logic_output_t m_RN_Q;
+
+ logic_input_t m_A;
+ logic_input_t m_B;
+ logic_input_t m_CLRQ;
+ logic_output_t m_Q;
+ logic_output_t m_QQ;
+
+ analog_input_t m_CV;
+
+ netlist_sig_t m_last_trig;
+ UINT8 m_state;
+ double m_KP;
+
+ param_double_t m_K;
+ param_double_t m_RI;
+ };
+
+ NETLIB_OBJECT(74123_dip)
{
- m_trig = (INPLOGIC(m_A) ^ 1) | INPLOGIC(m_B);
- }
- else // 4538
+ NETLIB_CONSTRUCTOR(74123_dip)
+ , m_1(*this, "1", 74123)
+ , m_2(*this, "2", 74123)
+ {
+ register_subalias("1", m_1.m_A);
+ register_subalias("2", m_1.m_B);
+ register_subalias("3", m_1.m_CLRQ);
+ register_subalias("4", m_1.m_QQ);
+ register_subalias("5", m_2.m_Q);
+ register_subalias("6", m_2.m_RN.m_R.m_N);
+ register_subalias("7", m_2.m_RN.m_R.m_P);
+ register_subalias("8", m_1.m_RN.m_R.m_N);
+ connect_late(m_1.m_RN.m_R.m_N, m_2.m_RN.m_R.m_N);
+
+ register_subalias("9", m_2.m_A);
+ register_subalias("10", m_2.m_B);
+ register_subalias("11", m_2.m_CLRQ);
+ register_subalias("12", m_2.m_QQ);
+ register_subalias("13", m_1.m_Q);
+ register_subalias("14", m_1.m_RN.m_R.m_N);
+ register_subalias("15", m_1.m_RN.m_R.m_P);
+ register_subalias("16", m_1.m_RP.m_R.m_P);
+ connect_late(m_1.m_RP.m_R.m_P, m_2.m_RP.m_R.m_P);
+ }
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+ private:
+ NETLIB_SUB(74123) m_1;
+ NETLIB_SUB(74123) m_2;
+ };
+
+ NETLIB_OBJECT(9602_dip)
{
- m_trig = (INPLOGIC(m_B) ^ 1) | INPLOGIC(m_A);
- // The line below is from the datasheet truthtable ... doesn't make sense at all
- //res = res | INPLOGIC(m_A) | (INPLOGIC(m_B) ^ 1);
- t_AB_to_Q = NLTIME_FROM_NS(300);
- t_C_to_Q = NLTIME_FROM_NS(250);
- }
+ NETLIB_CONSTRUCTOR(9602_dip)
+ , m_1(*this, "1", 9602)
+ , m_2(*this, "2", 9602)
+ {
+ register_subalias("1", m_1.m_RN.m_R.m_N); // C1
+ register_subalias("2", m_1.m_RN.m_R.m_P); // RC1
+ register_subalias("3", m_1.m_CLRQ);
+ register_subalias("4", m_1.m_B);
+ register_subalias("5", m_1.m_A);
+ register_subalias("6", m_1.m_Q);
+ register_subalias("7", m_1.m_QQ);
+ register_subalias("8", m_1.m_RN.m_R.m_N);
+ connect_late(m_1.m_RN.m_R.m_N, m_2.m_RN.m_R.m_N);
+
+ register_subalias("9", m_2.m_QQ);
+ register_subalias("10", m_2.m_Q);
+ register_subalias("11", m_2.m_A);
+ register_subalias("12", m_2.m_B);
+ register_subalias("13", m_2.m_CLRQ);
+ register_subalias("14", m_2.m_RN.m_R.m_P); // RC2
+ register_subalias("15", m_2.m_RN.m_R.m_N); // C2
+ register_subalias("16", m_1.m_RP.m_R.m_P);
+ connect_late(m_1.m_RP.m_R.m_P, m_2.m_RP.m_R.m_P);
+ }
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+ private:
+ NETLIB_SUB(74123) m_1;
+ NETLIB_SUB(74123) m_2;
+ };
- if (res)
+ NETLIB_OBJECT(4538_dip)
{
- OUTLOGIC(m_Q, 0, t_C_to_Q);
- OUTLOGIC(m_QQ, 1, t_C_to_Q);
- /* quick charge until trigger */
- /* FIXME: SGS datasheet shows quick charge to 5V,
- * though schematics indicate quick charge to Vhigh only.
- */
- OUTLOGIC(m_RP_Q, 1, t_C_to_Q); // R_ON
- OUTLOGIC(m_RN_Q, 0, t_C_to_Q); // R_OFF
- m_state = 2; //charging (quick)
- }
- else if (!m_last_trig && m_trig)
+ NETLIB_CONSTRUCTOR(4538_dip)
+ NETLIB_FAMILY("CD4XXX")
+ , m_1(*this, "1", 4538)
+ , m_2(*this, "2", 4538)
+ {
+ register_subalias("1", m_1.m_RN.m_R.m_N); // C1
+ register_subalias("2", m_1.m_RN.m_R.m_P); // RC1
+ register_subalias("3", m_1.m_CLRQ);
+ register_subalias("4", m_1.m_A);
+ register_subalias("5", m_1.m_B);
+ register_subalias("6", m_1.m_Q);
+ register_subalias("7", m_1.m_QQ);
+ register_subalias("8", m_1.m_RN.m_R.m_N);
+ connect_late(m_1.m_RN.m_R.m_N, m_2.m_RN.m_R.m_N);
+
+ register_subalias("9", m_2.m_QQ);
+ register_subalias("10", m_2.m_Q);
+ register_subalias("11", m_2.m_B);
+ register_subalias("12", m_2.m_A);
+ register_subalias("13", m_2.m_CLRQ);
+ register_subalias("14", m_2.m_RN.m_R.m_P); // RC2
+ register_subalias("15", m_2.m_RN.m_R.m_N); // C2
+ register_subalias("16", m_1.m_RP.m_R.m_P);
+ connect_late(m_1.m_RP.m_R.m_P, m_2.m_RP.m_R.m_P);
+ }
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+ private:
+ NETLIB_SUB(74123) m_1;
+ NETLIB_SUB(74123) m_2;
+ };
+
+ NETLIB_UPDATE(74123)
{
- // FIXME: Timing!
- OUTLOGIC(m_Q, 1, t_AB_to_Q);
- OUTLOGIC(m_QQ, 0,t_AB_to_Q);
+ netlist_sig_t m_trig;
+ netlist_sig_t res = !INPLOGIC(m_CLRQ);
+ netlist_time t_AB_to_Q = NLTIME_FROM_NS(10);
+ netlist_time t_C_to_Q = NLTIME_FROM_NS(10);
+
+ if (m_dev_type == 74123)
+ {
+ m_trig = (INPLOGIC(m_A) ^ 1) & INPLOGIC(m_B) & INPLOGIC(m_CLRQ);
+ }
+ else if (m_dev_type == 9602)
+ {
+ m_trig = (INPLOGIC(m_A) ^ 1) | INPLOGIC(m_B);
+ }
+ else // 4538
+ {
+ m_trig = (INPLOGIC(m_B) ^ 1) | INPLOGIC(m_A);
+ // The line below is from the datasheet truthtable ... doesn't make sense at all
+ //res = res | INPLOGIC(m_A) | (INPLOGIC(m_B) ^ 1);
+ t_AB_to_Q = NLTIME_FROM_NS(300);
+ t_C_to_Q = NLTIME_FROM_NS(250);
+ }
- OUTLOGIC(m_RN_Q, 1, t_AB_to_Q); // R_ON
- OUTLOGIC(m_RP_Q, 0, t_AB_to_Q); // R_OFF
+ if (res)
+ {
+ OUTLOGIC(m_Q, 0, t_C_to_Q);
+ OUTLOGIC(m_QQ, 1, t_C_to_Q);
+ /* quick charge until trigger */
+ /* FIXME: SGS datasheet shows quick charge to 5V,
+ * though schematics indicate quick charge to Vhigh only.
+ */
+ OUTLOGIC(m_RP_Q, 1, t_C_to_Q); // R_ON
+ OUTLOGIC(m_RN_Q, 0, t_C_to_Q); // R_OFF
+ m_state = 2; //charging (quick)
+ }
+ else if (!m_last_trig && m_trig)
+ {
+ // FIXME: Timing!
+ OUTLOGIC(m_Q, 1, t_AB_to_Q);
+ OUTLOGIC(m_QQ, 0,t_AB_to_Q);
- m_state = 1; // discharging
- }
+ OUTLOGIC(m_RN_Q, 1, t_AB_to_Q); // R_ON
+ OUTLOGIC(m_RP_Q, 0, t_AB_to_Q); // R_OFF
- m_last_trig = m_trig;
+ m_state = 1; // discharging
+ }
- if (m_state == 1)
- {
- const nl_double vLow = m_KP * TERMANALOG(m_RP.m_R.m_P);
- if (INPANALOG(m_CV) < vLow)
+ m_last_trig = m_trig;
+
+ if (m_state == 1)
{
- OUTLOGIC(m_RN_Q, 0, NLTIME_FROM_NS(10)); // R_OFF
- m_state = 2; // charging
+ const nl_double vLow = m_KP * TERMANALOG(m_RP.m_R.m_P);
+ if (INPANALOG(m_CV) < vLow)
+ {
+ OUTLOGIC(m_RN_Q, 0, NLTIME_FROM_NS(10)); // R_OFF
+ m_state = 2; // charging
+ }
}
- }
- if (m_state == 2)
- {
- const nl_double vHigh = TERMANALOG(m_RP.m_R.m_P) * (1.0 - m_KP);
- if (INPANALOG(m_CV) > vHigh)
+ if (m_state == 2)
{
- OUTLOGIC(m_RP_Q, 0, NLTIME_FROM_NS(10)); // R_OFF
+ const nl_double vHigh = TERMANALOG(m_RP.m_R.m_P) * (1.0 - m_KP);
+ if (INPANALOG(m_CV) > vHigh)
+ {
+ OUTLOGIC(m_RP_Q, 0, NLTIME_FROM_NS(10)); // R_OFF
- OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(10));
- OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(10));
- m_state = 0; // waiting
+ OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(10));
+ OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(10));
+ m_state = 0; // waiting
+ }
}
}
-}
-NETLIB_RESET(74123)
-{
- m_KP = 1.0 / (1.0 + exp(m_K.Value()));
+ NETLIB_RESET(74123)
+ {
+ m_KP = 1.0 / (1.0 + exp(m_K.Value()));
- m_RP.do_reset();
- m_RN.do_reset();
+ m_RP.do_reset();
+ m_RN.do_reset();
- //m_RP.set_R(R_OFF);
- //m_RN.set_R(R_OFF);
+ //m_RP.set_R(R_OFF);
+ //m_RN.set_R(R_OFF);
- m_last_trig = 0;
- m_state = 0;
-}
+ m_last_trig = 0;
+ m_state = 0;
+ }
-NETLIB_UPDATE(74123_dip)
-{
- /* only called during startup */
- //_1.update_dev();
- //m_2.update_dev();
-}
+ NETLIB_UPDATE(74123_dip)
+ {
+ /* only called during startup */
+ //_1.update_dev();
+ //m_2.update_dev();
+ }
-NETLIB_RESET(74123_dip)
-{
- //m_1.do_reset();
- //m_2.do_reset();
-}
+ NETLIB_RESET(74123_dip)
+ {
+ //m_1.do_reset();
+ //m_2.do_reset();
+ }
-NETLIB_UPDATE(9602_dip)
-{
- /* only called during startup */
- //m_1.update_dev();
- //m_2.update_dev();
-}
+ NETLIB_UPDATE(9602_dip)
+ {
+ /* only called during startup */
+ //m_1.update_dev();
+ //m_2.update_dev();
+ }
-NETLIB_RESET(9602_dip)
-{
- //m_1.do_reset();
- //m_2.do_reset();
-}
+ NETLIB_RESET(9602_dip)
+ {
+ //m_1.do_reset();
+ //m_2.do_reset();
+ }
-NETLIB_UPDATE(4538_dip)
-{
- /* only called during startup */
- //m_1.update_dev();
- //m_2.update_dev();
-}
+ NETLIB_UPDATE(4538_dip)
+ {
+ /* only called during startup */
+ //m_1.update_dev();
+ //m_2.update_dev();
+ }
-NETLIB_RESET(4538_dip)
-{
- m_1.do_reset();
- m_2.do_reset();
-}
+ NETLIB_RESET(4538_dip)
+ {
+ m_1.do_reset();
+ m_2.do_reset();
+ }
+
+ NETLIB_DEVICE_IMPL(74123)
+ NETLIB_DEVICE_IMPL(74123_dip)
+ NETLIB_DEVICE_IMPL(4538_dip)
+ NETLIB_DEVICE_IMPL(9602_dip)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74123.h b/src/lib/netlist/devices/nld_74123.h
index 696e917abd5..15039c82f94 100644
--- a/src/lib/netlist/devices/nld_74123.h
+++ b/src/lib/netlist/devices/nld_74123.h
@@ -49,201 +49,26 @@
#ifndef NLD_74123_H_
#define NLD_74123_H_
-#include "nl_base.h"
-#include "nld_system.h"
-#include "analog/nld_twoterm.h"
+#include "nl_setup.h"
-#define TTL_74123(name) \
+#define TTL_74123(name) \
NET_REGISTER_DEV(TTL_74123, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(74123)
-{
- NETLIB_CONSTRUCTOR_EX(74123, int dev_type = 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;
-
- 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);
- register_subalias("RC", m_RN.m_R.m_P);
-
-
- connect_late(m_RP_Q, m_RP.m_I);
- connect_late(m_RN_Q, m_RN.m_I);
-
- connect_late(m_RN.m_R.m_P, m_RP.m_R.m_N);
- connect_late(m_CV, m_RN.m_R.m_P);
-
- save(NLNAME(m_last_trig));
- save(NLNAME(m_state));
- save(NLNAME(m_KP));
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-private:
- int m_dev_type;
-public:
- NETLIB_SUB(res_sw) m_RP;
- NETLIB_SUB(res_sw) m_RN;
-
- logic_output_t m_RP_Q;
- logic_output_t m_RN_Q;
-
- logic_input_t m_A;
- logic_input_t m_B;
- logic_input_t m_CLRQ;
- logic_output_t m_Q;
- logic_output_t m_QQ;
-
- analog_input_t m_CV;
-
- netlist_sig_t m_last_trig;
- UINT8 m_state;
- double m_KP;
-
- param_double_t m_K;
- param_double_t m_RI;
-};
-
-#define TTL_74123_DIP(name) \
+#define TTL_74123_DIP(name) \
NET_REGISTER_DEV(TTL_74123_DIP, name)
-NETLIB_OBJECT(74123_dip)
-{
- NETLIB_CONSTRUCTOR(74123_dip)
- , m_1(*this, "1", 74123)
- , m_2(*this, "2", 74123)
- {
- register_subalias("1", m_1.m_A);
- register_subalias("2", m_1.m_B);
- register_subalias("3", m_1.m_CLRQ);
- register_subalias("4", m_1.m_QQ);
- register_subalias("5", m_2.m_Q);
- register_subalias("6", m_2.m_RN.m_R.m_N);
- register_subalias("7", m_2.m_RN.m_R.m_P);
- register_subalias("8", m_1.m_RN.m_R.m_N);
- connect_late(m_1.m_RN.m_R.m_N, m_2.m_RN.m_R.m_N);
-
- register_subalias("9", m_2.m_A);
- register_subalias("10", m_2.m_B);
- register_subalias("11", m_2.m_CLRQ);
- register_subalias("12", m_2.m_QQ);
- register_subalias("13", m_1.m_Q);
- register_subalias("14", m_1.m_RN.m_R.m_N);
- register_subalias("15", m_1.m_RN.m_R.m_P);
- register_subalias("16", m_1.m_RP.m_R.m_P);
- connect_late(m_1.m_RP.m_R.m_P, m_2.m_RP.m_R.m_P);
- }
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-private:
- NETLIB_SUB(74123) m_1;
- NETLIB_SUB(74123) m_2;
-};
-
/* The 9602 is very similar to the 123. Input triggering is slightly different
- * THe 9602 uses an OR gate instead of an AND gate.
+ * The 9602 uses an OR gate instead of an AND gate.
*/
-#define TTL_9602_DIP(name) \
+#define TTL_9602_DIP(name) \
NET_REGISTER_DEV(TTL_9602_DIP, name)
-NETLIB_OBJECT(9602_dip)
-{
- NETLIB_CONSTRUCTOR(9602_dip)
- , m_1(*this, "1", 9602)
- , m_2(*this, "2", 9602)
- {
- register_subalias("1", m_1.m_RN.m_R.m_N); // C1
- register_subalias("2", m_1.m_RN.m_R.m_P); // RC1
- register_subalias("3", m_1.m_CLRQ);
- register_subalias("4", m_1.m_B);
- register_subalias("5", m_1.m_A);
- register_subalias("6", m_1.m_Q);
- register_subalias("7", m_1.m_QQ);
- register_subalias("8", m_1.m_RN.m_R.m_N);
- connect_late(m_1.m_RN.m_R.m_N, m_2.m_RN.m_R.m_N);
-
- register_subalias("9", m_2.m_QQ);
- register_subalias("10", m_2.m_Q);
- register_subalias("11", m_2.m_A);
- register_subalias("12", m_2.m_B);
- register_subalias("13", m_2.m_CLRQ);
- register_subalias("14", m_2.m_RN.m_R.m_P); // RC2
- register_subalias("15", m_2.m_RN.m_R.m_N); // C2
- register_subalias("16", m_1.m_RP.m_R.m_P);
- connect_late(m_1.m_RP.m_R.m_P, m_2.m_RP.m_R.m_P);
- }
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-private:
- NETLIB_SUB(74123) m_1;
- NETLIB_SUB(74123) m_2;
-};
-
/*
* The CD4538 is pretty similar to the 9602
*/
-#define CD4538_DIP(name) \
+#define CD4538_DIP(name) \
NET_REGISTER_DEV(CD4538_DIP, name)
-NETLIB_OBJECT(4538_dip)
-{
- NETLIB_CONSTRUCTOR(4538_dip)
- NETLIB_FAMILY("CD4XXX")
- , m_1(*this, "1", 4538)
- , m_2(*this, "2", 4538)
- {
- register_subalias("1", m_1.m_RN.m_R.m_N); // C1
- register_subalias("2", m_1.m_RN.m_R.m_P); // RC1
- register_subalias("3", m_1.m_CLRQ);
- register_subalias("4", m_1.m_A);
- register_subalias("5", m_1.m_B);
- register_subalias("6", m_1.m_Q);
- register_subalias("7", m_1.m_QQ);
- register_subalias("8", m_1.m_RN.m_R.m_N);
- connect_late(m_1.m_RN.m_R.m_N, m_2.m_RN.m_R.m_N);
-
- register_subalias("9", m_2.m_QQ);
- register_subalias("10", m_2.m_Q);
- register_subalias("11", m_2.m_B);
- register_subalias("12", m_2.m_A);
- register_subalias("13", m_2.m_CLRQ);
- register_subalias("14", m_2.m_RN.m_R.m_P); // RC2
- register_subalias("15", m_2.m_RN.m_R.m_N); // C2
- register_subalias("16", m_1.m_RP.m_R.m_P);
- connect_late(m_1.m_RP.m_R.m_P, m_2.m_RP.m_R.m_P);
- }
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-private:
- NETLIB_SUB(74123) m_1;
- NETLIB_SUB(74123) m_2;
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
-
#endif /* NLD_74123_H_ */
diff --git a/src/lib/netlist/devices/nld_74153.cpp b/src/lib/netlist/devices/nld_74153.cpp
index d4b40293a25..5b3408f1470 100644
--- a/src/lib/netlist/devices/nld_74153.cpp
+++ b/src/lib/netlist/devices/nld_74153.cpp
@@ -7,46 +7,140 @@
#include "nld_74153.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
/* FIXME: timing is not 100% accurate, Strobe and Select inputs have a
* slightly longer timing.
* Convert this to sub-devices at some time.
*/
+ NETLIB_OBJECT(74153sub)
+ {
+ NETLIB_CONSTRUCTOR(74153sub)
+ , 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);
-NETLIB_RESET(74153sub)
-{
- m_chan = 0;
-}
+ enregister("AY", m_Y); //FIXME: Change netlists
-NETLIB_UPDATE(74153sub)
-{
- const netlist_time delay[2] = { NLTIME_FROM_NS(23), NLTIME_FROM_NS(18) };
- if (!INPLOGIC(m_G))
+ save(NLNAME(m_chan));
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ public:
+ logic_input_t m_C[4];
+ logic_input_t m_G;
+
+ logic_output_t m_Y;
+
+ int m_chan;
+ };
+
+ 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]);
+ 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
+ }
+ NETLIB_RESETI() { }
+ NETLIB_UPDATEI();
+ public:
+ NETLIB_SUB(74153sub) m_sub;
+ logic_input_t m_A;
+ logic_input_t m_B;
+ };
+
+ NETLIB_OBJECT(74153_dip)
+ {
+ NETLIB_CONSTRUCTOR(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]);
+ register_subalias("4", m_1.m_C[2]);
+ register_subalias("5", m_1.m_C[1]);
+ register_subalias("6", m_1.m_C[0]);
+ register_subalias("7", m_1.m_Y);
+
+ register_subalias("9", m_2.m_Y);
+ register_subalias("10", m_2.m_C[0]);
+ register_subalias("11", m_2.m_C[1]);
+ 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);
+
+ }
+ //NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ protected:
+ NETLIB_SUB(74153sub) m_1;
+ NETLIB_SUB(74153sub) m_2;
+ logic_input_t m_A;
+ logic_input_t m_B;
+ };
+
+
+ NETLIB_RESET(74153sub)
{
- UINT8 t = INPLOGIC(m_C[m_chan]);
- OUTLOGIC(m_Y, t, delay[t] );
+ m_chan = 0;
}
- else
+
+ NETLIB_UPDATE(74153sub)
{
- OUTLOGIC(m_Y, 0, delay[0]);
+ const netlist_time delay[2] = { NLTIME_FROM_NS(23), NLTIME_FROM_NS(18) };
+ if (!INPLOGIC(m_G))
+ {
+ UINT8 t = INPLOGIC(m_C[m_chan]);
+ OUTLOGIC(m_Y, t, delay[t] );
+ }
+ else
+ {
+ OUTLOGIC(m_Y, 0, delay[0]);
+ }
}
-}
-NETLIB_UPDATE(74153)
-{
- m_sub.m_chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1));
- m_sub.do_update();
-}
+ NETLIB_UPDATE(74153)
+ {
+ m_sub.m_chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1));
+ m_sub.do_update();
+ }
-NETLIB_UPDATE(74153_dip)
-{
- m_2.m_chan = m_1.m_chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1));
- m_1.do_update();
- m_2.do_update();
-}
+ NETLIB_UPDATE(74153_dip)
+ {
+ m_2.m_chan = m_1.m_chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1));
+ m_1.do_update();
+ m_2.do_update();
+ }
+
+ NETLIB_DEVICE_IMPL(74153)
+ NETLIB_DEVICE_IMPL(74153_dip)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74153.h b/src/lib/netlist/devices/nld_74153.h
index d4059bbb384..6ace3b36d43 100644
--- a/src/lib/netlist/devices/nld_74153.h
+++ b/src/lib/netlist/devices/nld_74153.h
@@ -45,110 +45,19 @@
#ifndef NLD_74153_H_
#define NLD_74153_H_
-#include "nl_base.h"
-
-#define TTL_74153(name, cC0, cC1, cC2, cC3, cA, cB, cG) \
- NET_REGISTER_DEV(TTL_74153, name) \
- NET_CONNECT(name, C0, cC0) \
- NET_CONNECT(name, C1, cC1) \
- NET_CONNECT(name, C2, cC2) \
- NET_CONNECT(name, C3, cC3) \
- NET_CONNECT(name, A, cA) \
- NET_CONNECT(name, B, cB) \
+#include "nl_setup.h"
+
+#define TTL_74153(name, cC0, cC1, cC2, cC3, cA, cB, cG) \
+ NET_REGISTER_DEV(TTL_74153, name) \
+ NET_CONNECT(name, C0, cC0) \
+ NET_CONNECT(name, C1, cC1) \
+ NET_CONNECT(name, C2, cC2) \
+ NET_CONNECT(name, C3, cC3) \
+ NET_CONNECT(name, A, cA) \
+ NET_CONNECT(name, B, cB) \
NET_CONNECT(name, G, cG)
-#define TTL_74153_DIP(name) \
+#define TTL_74153_DIP(name) \
NET_REGISTER_DEV(TTL_74153_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(74153sub)
-{
- NETLIB_CONSTRUCTOR(74153sub)
- , 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));
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-public:
- logic_input_t m_C[4];
- logic_input_t m_G;
-
- logic_output_t m_Y;
-
- int m_chan;
-};
-
-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]);
- 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
- }
- NETLIB_RESETI() { }
- NETLIB_UPDATEI();
-public:
- NETLIB_SUB(74153sub) m_sub;
- logic_input_t m_A;
- logic_input_t m_B;
-};
-
-NETLIB_OBJECT(74153_dip)
-{
- NETLIB_CONSTRUCTOR(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]);
- register_subalias("4", m_1.m_C[2]);
- register_subalias("5", m_1.m_C[1]);
- register_subalias("6", m_1.m_C[0]);
- register_subalias("7", m_1.m_Y);
-
- register_subalias("9", m_2.m_Y);
- register_subalias("10", m_2.m_C[0]);
- register_subalias("11", m_2.m_C[1]);
- 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);
-
- }
- //NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-protected:
- NETLIB_SUB(74153sub) m_1;
- NETLIB_SUB(74153sub) m_2;
- logic_input_t m_A;
- logic_input_t m_B;
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_74153_H_ */
diff --git a/src/lib/netlist/devices/nld_74175.cpp b/src/lib/netlist/devices/nld_74175.cpp
index 642863f0859..53ef7bbe815 100644
--- a/src/lib/netlist/devices/nld_74175.cpp
+++ b/src/lib/netlist/devices/nld_74175.cpp
@@ -7,59 +7,158 @@
#include "nld_74175.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
-static const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(25) };
-static const netlist_time delay_clear[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
+ NETLIB_OBJECT(74175_sub)
+ {
+ NETLIB_CONSTRUCTOR(74175_sub)
+ , m_data(0)
+ {
+ enregister("CLK", m_CLK);
-NETLIB_RESET(74175_sub)
-{
- m_CLK.set_state(logic_t::STATE_INP_LH);
- m_clrq = 0;
- m_data = 0xFF;
-}
+ 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]);
-NETLIB_UPDATE(74175_sub)
-{
- if (m_clrq)
+ save(NLNAME(m_clrq));
+ save(NLNAME(m_data));
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ public:
+ logic_input_t m_CLK;
+ logic_output_t m_Q[4];
+ logic_output_t m_QQ[4];
+
+ netlist_sig_t m_clrq;
+ UINT8 m_data;
+ };
+
+ NETLIB_OBJECT(74175)
{
- for (int i=0; i<4; i++)
+ NETLIB_CONSTRUCTOR(74175)
+ , m_sub(*this, "sub")
+ {
+ 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]);
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ protected:
+ NETLIB_SUB(74175_sub) m_sub;
+ logic_input_t m_D[4];
+ logic_input_t m_CLRQ;
+ };
+
+ NETLIB_OBJECT_DERIVED(74175_dip, 74175)
+ {
+ NETLIB_CONSTRUCTOR_DERIVED(74175_dip, 74175)
{
- UINT8 d = (m_data >> i) & 1;
- OUTLOGIC(m_Q[i], d, delay[d]);
- OUTLOGIC(m_QQ[i], d ^ 1, delay[d ^ 1]);
+ register_subalias("9", m_sub.m_CLK);
+ register_subalias("1", m_CLRQ);
+
+ register_subalias("4", m_D[0]);
+ register_subalias("2", m_sub.m_Q[0]);
+ register_subalias("3", m_sub.m_QQ[0]);
+
+ register_subalias("5", m_D[1]);
+ register_subalias("7", m_sub.m_Q[1]);
+ register_subalias("6", m_sub.m_QQ[1]);
+
+ register_subalias("12", m_D[2]);
+ register_subalias("10", m_sub.m_Q[2]);
+ register_subalias("11", m_sub.m_QQ[2]);
+
+ register_subalias("13", m_D[3]);
+ register_subalias("15", m_sub.m_Q[3]);
+ register_subalias("14", m_sub.m_QQ[3]);
}
- m_CLK.inactivate();
+ };
+
+ static const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(25) };
+ static const netlist_time delay_clear[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
+
+ NETLIB_RESET(74175_sub)
+ {
+ m_CLK.set_state(logic_t::STATE_INP_LH);
+ m_clrq = 0;
+ m_data = 0xFF;
}
-}
-NETLIB_UPDATE(74175)
-{
- UINT8 d = 0;
- for (int i=0; i<4; i++)
+ NETLIB_UPDATE(74175_sub)
{
- d |= (INPLOGIC(m_D[i]) << i);
+ if (m_clrq)
+ {
+ for (int i=0; i<4; i++)
+ {
+ UINT8 d = (m_data >> i) & 1;
+ OUTLOGIC(m_Q[i], d, delay[d]);
+ OUTLOGIC(m_QQ[i], d ^ 1, delay[d ^ 1]);
+ }
+ m_CLK.inactivate();
+ }
}
- m_sub.m_clrq = INPLOGIC(m_CLRQ);
- if (!m_sub.m_clrq)
+
+ NETLIB_UPDATE(74175)
{
+ UINT8 d = 0;
for (int i=0; i<4; i++)
{
- OUTLOGIC(m_sub.m_Q[i], 0, delay_clear[0]);
- OUTLOGIC(m_sub.m_QQ[i], 1, delay_clear[1]);
+ d |= (INPLOGIC(m_D[i]) << i);
+ }
+ m_sub.m_clrq = INPLOGIC(m_CLRQ);
+ if (!m_sub.m_clrq)
+ {
+ for (int i=0; i<4; i++)
+ {
+ OUTLOGIC(m_sub.m_Q[i], 0, delay_clear[0]);
+ OUTLOGIC(m_sub.m_QQ[i], 1, delay_clear[1]);
+ }
+ m_sub.m_data = 0;
+ } else if (d != m_sub.m_data)
+ {
+ m_sub.m_data = d;
+ m_sub.m_CLK.activate_lh();
}
- m_sub.m_data = 0;
- } else if (d != m_sub.m_data)
- {
- m_sub.m_data = d;
- m_sub.m_CLK.activate_lh();
}
-}
-NETLIB_RESET(74175)
-{
- //m_sub.do_reset();
-}
+ NETLIB_RESET(74175)
+ {
+ //m_sub.do_reset();
+ }
+
+ NETLIB_DEVICE_IMPL(74175)
+ NETLIB_DEVICE_IMPL(74175_dip)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74175.h b/src/lib/netlist/devices/nld_74175.h
index ca796f65d83..8b08060e520 100644
--- a/src/lib/netlist/devices/nld_74175.h
+++ b/src/lib/netlist/devices/nld_74175.h
@@ -36,107 +36,12 @@
#ifndef NLD_74175_H_
#define NLD_74175_H_
-#include "nl_base.h"
+#include "nl_setup.h"
#define TTL_74175(name) \
NET_REGISTER_DEV(TTL_74175, name)
#define TTL_74175_DIP(name) \
NET_REGISTER_DEV(TTL_74175_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(74175_sub)
-{
- NETLIB_CONSTRUCTOR(74175_sub)
- , 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));
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-public:
- logic_input_t m_CLK;
- logic_output_t m_Q[4];
- logic_output_t m_QQ[4];
-
- netlist_sig_t m_clrq;
- UINT8 m_data;
-};
-
-NETLIB_OBJECT(74175)
-{
- NETLIB_CONSTRUCTOR(74175)
- , m_sub(*this, "sub")
- {
- 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]);
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-protected:
- NETLIB_SUB(74175_sub) m_sub;
- logic_input_t m_D[4];
- logic_input_t m_CLRQ;
-};
-
-NETLIB_OBJECT_DERIVED(74175_dip, 74175)
-{
- NETLIB_CONSTRUCTOR_DERIVED(74175_dip, 74175)
- {
- register_subalias("9", m_sub.m_CLK);
- register_subalias("1", m_CLRQ);
-
- register_subalias("4", m_D[0]);
- register_subalias("2", m_sub.m_Q[0]);
- register_subalias("3", m_sub.m_QQ[0]);
-
- register_subalias("5", m_D[1]);
- register_subalias("7", m_sub.m_Q[1]);
- register_subalias("6", m_sub.m_QQ[1]);
-
- register_subalias("12", m_D[2]);
- register_subalias("10", m_sub.m_Q[2]);
- register_subalias("11", m_sub.m_QQ[2]);
-
- register_subalias("13", m_D[3]);
- register_subalias("15", m_sub.m_Q[3]);
- register_subalias("14", m_sub.m_QQ[3]);
- }
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
#endif /* NLD_74175_H_ */
diff --git a/src/lib/netlist/devices/nld_74192.cpp b/src/lib/netlist/devices/nld_74192.cpp
index 138c519a4c1..c9ddf77033a 100644
--- a/src/lib/netlist/devices/nld_74192.cpp
+++ b/src/lib/netlist/devices/nld_74192.cpp
@@ -9,67 +9,175 @@
#include "nld_74192.h"
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_RESET(74192)
+namespace netlist
{
- m_cnt = 0;
- m_last_CU = 0;
- m_last_CD = 0;
-}
+ namespace devices
+ {
-// FIXME: Timing
-/* static */ const netlist_time delay[4] =
-{
- NLTIME_FROM_NS(40),
- NLTIME_FROM_NS(40),
- NLTIME_FROM_NS(40),
- NLTIME_FROM_NS(40)
-};
+ NETLIB_OBJECT(74192_subABCD)
+ {
+ NETLIB_CONSTRUCTOR(74192_subABCD)
+ {
+ enregister("A", m_A);
+ enregister("B", m_B);
+ enregister("C", m_C);
+ enregister("D", m_D);
+ }
-NETLIB_UPDATE(74192)
-{
- int tCarry = 1;
- int tBorrow = 1;
- if (INPLOGIC(m_CLEAR))
+ NETLIB_RESETI()
+ {
+ #if 0
+ m_A.inactivate();
+ m_B.inactivate();
+ m_C.inactivate();
+ m_D.inactivate();
+ #endif
+ }
+ //NETLIB_UPDATEI();
+
+ public:
+ logic_input_t m_A;
+ logic_input_t m_B;
+ logic_input_t m_C;
+ logic_input_t m_D;
+
+ ATTR_HOT inline UINT8 read_ABCD() const
+ {
+ //return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
+ return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
+ }
+ };
+
+ NETLIB_OBJECT(74192)
+ {
+ NETLIB_CONSTRUCTOR(74192)
+ , m_ABCD(*this, "subABCD")
+ {
+ 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));
+ save(NLNAME(m_last_CD));
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ protected:
+ NETLIB_SUB(74192_subABCD) m_ABCD;
+ logic_input_t m_CLEAR;
+ logic_input_t m_LOADQ;
+ logic_input_t m_CU;
+ logic_input_t m_CD;
+
+ INT8 m_cnt;
+ UINT8 m_last_CU;
+ UINT8 m_last_CD;
+
+ logic_output_t m_Q[4];
+ logic_output_t m_BORROWQ;
+ logic_output_t m_CARRYQ;
+ };
+
+ NETLIB_OBJECT_DERIVED(74192_dip, 74192)
+ {
+ NETLIB_CONSTRUCTOR_DERIVED(74192_dip, 74192)
+ {
+ register_subalias("1", m_ABCD.m_B);
+ register_subalias("2", m_Q[1]);
+ register_subalias("3", m_Q[0]);
+ register_subalias("4", m_CD);
+ register_subalias("5", m_CU);
+ register_subalias("6", m_Q[2]);
+ register_subalias("7", m_Q[3]);
+
+ register_subalias("9", m_ABCD.m_D);
+ register_subalias("10", m_ABCD.m_C);
+ register_subalias("11", m_LOADQ);
+ register_subalias("12", m_CARRYQ);
+ register_subalias("13", m_BORROWQ);
+ register_subalias("14", m_CLEAR);
+ register_subalias("15", m_ABCD.m_A);
+ }
+ };
+
+ NETLIB_RESET(74192)
{
m_cnt = 0;
+ m_last_CU = 0;
+ m_last_CD = 0;
}
- else if (!INPLOGIC(m_LOADQ))
+
+ // FIXME: Timing
+ /* static */ const netlist_time delay[4] =
{
- m_cnt = m_ABCD.read_ABCD();
- }
- else
+ NLTIME_FROM_NS(40),
+ NLTIME_FROM_NS(40),
+ NLTIME_FROM_NS(40),
+ NLTIME_FROM_NS(40)
+ };
+
+ NETLIB_UPDATE(74192)
{
- if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU))
+ int tCarry = 1;
+ int tBorrow = 1;
+ if (INPLOGIC(m_CLEAR))
{
- m_cnt++;
- if (m_cnt > MAXCNT)
- m_cnt = 0;
+ m_cnt = 0;
}
- if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD))
+ else if (!INPLOGIC(m_LOADQ))
{
- if (m_cnt > 0)
- m_cnt--;
- else
- m_cnt = MAXCNT;
+ m_cnt = m_ABCD.read_ABCD();
+ }
+ else
+ {
+ if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU))
+ {
+ m_cnt++;
+ if (m_cnt > MAXCNT)
+ m_cnt = 0;
+ }
+ if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD))
+ {
+ if (m_cnt > 0)
+ m_cnt--;
+ else
+ m_cnt = MAXCNT;
+ }
}
- }
- if (!INPLOGIC(m_CU) && (m_cnt == MAXCNT))
- tCarry = 0;
+ if (!INPLOGIC(m_CU) && (m_cnt == MAXCNT))
+ tCarry = 0;
- if (!INPLOGIC(m_CD) && (m_cnt == 0))
- tBorrow = 0;
+ if (!INPLOGIC(m_CD) && (m_cnt == 0))
+ tBorrow = 0;
- m_last_CD = INPLOGIC(m_CD);
- m_last_CU = INPLOGIC(m_CU);
+ m_last_CD = INPLOGIC(m_CD);
+ m_last_CU = INPLOGIC(m_CU);
- for (int i=0; i<4; i++)
- OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
+ for (int i=0; i<4; i++)
+ OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
+
+ OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME
+ OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME
+ }
- OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME
- OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME
-}
+ NETLIB_DEVICE_IMPL(74192)
+ NETLIB_DEVICE_IMPL(74192_dip)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74192.h b/src/lib/netlist/devices/nld_74192.h
index 34f02845b05..fc5778044eb 100644
--- a/src/lib/netlist/devices/nld_74192.h
+++ b/src/lib/netlist/devices/nld_74192.h
@@ -29,84 +29,12 @@
#ifndef NLD_74192_H_
#define NLD_74192_H_
-#include "nl_base.h"
-#include "nld_9316.h"
+#include "nl_setup.h"
-#define TTL_74192(name) \
+#define TTL_74192(name) \
NET_REGISTER_DEV(TTL_74192, name)
-#define TTL_74192_DIP(name) \
+#define TTL_74192_DIP(name) \
NET_REGISTER_DEV(TTL_74192_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(74192)
-{
- NETLIB_CONSTRUCTOR(74192)
- , m_ABCD(*this, "subABCD")
- {
- 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));
- save(NLNAME(m_last_CD));
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-protected:
- NETLIB_SUB(9316_subABCD) m_ABCD;
- logic_input_t m_CLEAR;
- logic_input_t m_LOADQ;
- logic_input_t m_CU;
- logic_input_t m_CD;
-
- INT8 m_cnt;
- UINT8 m_last_CU;
- UINT8 m_last_CD;
-
- logic_output_t m_Q[4];
- logic_output_t m_BORROWQ;
- logic_output_t m_CARRYQ;
-};
-
-NETLIB_OBJECT_DERIVED(74192_dip, 74192)
-{
- NETLIB_CONSTRUCTOR_DERIVED(74192_dip, 74192)
- {
- register_subalias("1", m_ABCD.m_B);
- register_subalias("2", m_Q[1]);
- register_subalias("3", m_Q[0]);
- register_subalias("4", m_CD);
- register_subalias("5", m_CU);
- register_subalias("6", m_Q[2]);
- register_subalias("7", m_Q[3]);
-
- register_subalias("9", m_ABCD.m_D);
- register_subalias("10", m_ABCD.m_C);
- register_subalias("11", m_LOADQ);
- register_subalias("12", m_CARRYQ);
- register_subalias("13", m_BORROWQ);
- register_subalias("14", m_CLEAR);
- register_subalias("15", m_ABCD.m_A);
- }
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_74192_H_ */
diff --git a/src/lib/netlist/devices/nld_74193.cpp b/src/lib/netlist/devices/nld_74193.cpp
index d38f52ffcb9..7a706cdc435 100644
--- a/src/lib/netlist/devices/nld_74193.cpp
+++ b/src/lib/netlist/devices/nld_74193.cpp
@@ -9,69 +9,148 @@
#include "nld_74193.h"
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_RESET(74193)
+namespace netlist
{
- m_cnt = 0;
- m_last_CU = 0;
- m_last_CD = 0;
-}
+ namespace devices
+ {
-// FIXME: Timing
-static const netlist_time delay[4] =
-{
- NLTIME_FROM_NS(40),
- NLTIME_FROM_NS(40),
- NLTIME_FROM_NS(40),
- NLTIME_FROM_NS(40)
-};
+ NETLIB_OBJECT(74193)
+ {
+ NETLIB_CONSTRUCTOR(74193)
+ , m_cnt(0)
+ , m_last_CU(0)
+ , m_last_CD(0)
+ {
+ 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);
-NETLIB_UPDATE(74193)
-{
- int tCarry = 1;
- int tBorrow = 1;
- if (INPLOGIC(m_CLEAR))
+ 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));
+ save(NLNAME(m_last_CD));
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ protected:
+ logic_input_t m_A;
+ logic_input_t m_B;
+ logic_input_t m_C;
+ logic_input_t m_D;
+ logic_input_t m_CLEAR;
+ logic_input_t m_LOADQ;
+ logic_input_t m_CU;
+ logic_input_t m_CD;
+
+ INT8 m_cnt;
+ UINT8 m_last_CU;
+ UINT8 m_last_CD;
+
+ logic_output_t m_Q[4];
+ logic_output_t m_BORROWQ;
+ logic_output_t m_CARRYQ;
+ };
+
+ NETLIB_OBJECT_DERIVED(74193_dip, 74193)
+ {
+ NETLIB_CONSTRUCTOR_DERIVED(74193_dip, 74193)
+ {
+ register_subalias("1", m_B);
+ register_subalias("2", m_Q[1]);
+ register_subalias("3", m_Q[0]);
+ register_subalias("4", m_CD);
+ register_subalias("5", m_CU);
+ register_subalias("6", m_Q[2]);
+ register_subalias("7", m_Q[3]);
+
+ register_subalias("9", m_D);
+ register_subalias("10", m_C);
+ register_subalias("11", m_LOADQ);
+ register_subalias("12", m_CARRYQ);
+ register_subalias("13", m_BORROWQ);
+ register_subalias("14", m_CLEAR);
+ register_subalias("15", m_A);
+
+ }
+ };
+
+ NETLIB_RESET(74193)
{
m_cnt = 0;
+ m_last_CU = 0;
+ m_last_CD = 0;
}
- else if (!INPLOGIC(m_LOADQ))
+
+ // FIXME: Timing
+ static const netlist_time delay[4] =
{
- m_cnt = (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2)
- | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
- }
- else
+ NLTIME_FROM_NS(40),
+ NLTIME_FROM_NS(40),
+ NLTIME_FROM_NS(40),
+ NLTIME_FROM_NS(40)
+ };
+
+ NETLIB_UPDATE(74193)
{
- if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU))
+ int tCarry = 1;
+ int tBorrow = 1;
+ if (INPLOGIC(m_CLEAR))
{
- m_cnt++;
- if (m_cnt > MAXCNT)
- m_cnt = 0;
+ m_cnt = 0;
}
- if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD))
+ else if (!INPLOGIC(m_LOADQ))
{
- if (m_cnt > 0)
- m_cnt--;
- else
- m_cnt = MAXCNT;
+ m_cnt = (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2)
+ | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
+ }
+ else
+ {
+ if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU))
+ {
+ m_cnt++;
+ if (m_cnt > MAXCNT)
+ m_cnt = 0;
+ }
+ if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD))
+ {
+ if (m_cnt > 0)
+ m_cnt--;
+ else
+ m_cnt = MAXCNT;
+ }
}
- }
- if (!INPLOGIC(m_CU) && (m_cnt == MAXCNT))
- tCarry = 0;
+ if (!INPLOGIC(m_CU) && (m_cnt == MAXCNT))
+ tCarry = 0;
- if (!INPLOGIC(m_CD) && (m_cnt == 0))
- tBorrow = 0;
+ if (!INPLOGIC(m_CD) && (m_cnt == 0))
+ tBorrow = 0;
- m_last_CD = INPLOGIC(m_CD);
- m_last_CU = INPLOGIC(m_CU);
+ m_last_CD = INPLOGIC(m_CD);
+ m_last_CU = INPLOGIC(m_CU);
- for (int i=0; i<4; i++)
- OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
+ for (int i=0; i<4; i++)
+ OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
- OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME
- OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME
-}
+ OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME
+ OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME
+ }
+ NETLIB_DEVICE_IMPL(74193)
+ NETLIB_DEVICE_IMPL(74193_dip)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74193.h b/src/lib/netlist/devices/nld_74193.h
index 729d3c91290..fa2b8125092 100644
--- a/src/lib/netlist/devices/nld_74193.h
+++ b/src/lib/netlist/devices/nld_74193.h
@@ -26,89 +26,12 @@
#ifndef NLD_74193_H_
#define NLD_74193_H_
-#include "nl_base.h"
+#include "nl_setup.h"
-#define TTL_74193(name) \
+#define TTL_74193(name) \
NET_REGISTER_DEV(TTL_74193, name)
-#define TTL_74193_DIP(name) \
+#define TTL_74193_DIP(name) \
NET_REGISTER_DEV(TTL_74193_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(74193)
-{
- NETLIB_CONSTRUCTOR(74193)
- , m_cnt(0)
- , m_last_CU(0)
- , m_last_CD(0)
- {
- 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));
- save(NLNAME(m_last_CD));
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-protected:
- logic_input_t m_A;
- logic_input_t m_B;
- logic_input_t m_C;
- logic_input_t m_D;
- logic_input_t m_CLEAR;
- logic_input_t m_LOADQ;
- logic_input_t m_CU;
- logic_input_t m_CD;
-
- INT8 m_cnt;
- UINT8 m_last_CU;
- UINT8 m_last_CD;
-
- logic_output_t m_Q[4];
- logic_output_t m_BORROWQ;
- logic_output_t m_CARRYQ;
-};
-
-NETLIB_OBJECT_DERIVED(74193_dip, 74193)
-{
- NETLIB_CONSTRUCTOR_DERIVED(74193_dip, 74193)
- {
- register_subalias("1", m_B);
- register_subalias("2", m_Q[1]);
- register_subalias("3", m_Q[0]);
- register_subalias("4", m_CD);
- register_subalias("5", m_CU);
- register_subalias("6", m_Q[2]);
- register_subalias("7", m_Q[3]);
-
- register_subalias("9", m_D);
- register_subalias("10", m_C);
- register_subalias("11", m_LOADQ);
- register_subalias("12", m_CARRYQ);
- register_subalias("13", m_BORROWQ);
- register_subalias("14", m_CLEAR);
- register_subalias("15", m_A);
-
- }
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_74193_H_ */
diff --git a/src/lib/netlist/devices/nld_74279.cpp b/src/lib/netlist/devices/nld_74279.cpp
index 417f3edcae3..f5eec9b384e 100644
--- a/src/lib/netlist/devices/nld_74279.cpp
+++ b/src/lib/netlist/devices/nld_74279.cpp
@@ -7,133 +7,77 @@
#include "nld_74279.h"
-NETLIB_NAMESPACE_DEVICES_START()
-
-nld_74279A::truthtable_t nld_74279A::m_ttbl;
-nld_74279B::truthtable_t nld_74279B::m_ttbl;
-
-#if 0
-const char *nld_74279A::m_desc[] = {
- "S,R,PQ,PS,PR|Q",
- "0,0,X,X,X|1|22",
- "0,1,X,X,X|1|22",
- "1,0,X,X,X|0|15",
- "1,1,0,X,X|0|15",
- "1,1,1,X,X|1|22",
- ""
-};
-
-
-const char *nld_74279B::m_desc[] = {
- "S1,S2,R,PQ,PS1,PS2,PR|Q",
- "0,X,0,X,X,X,X|1|22",
- "X,0,0,X,X,X,X|1|22",
- "0,X,1,X,X,X,X|1|22",
- "X,0,1,X,X,X,X|1|22",
- "1,1,0,X,X,X,X|0|15",
- "1,1,1,0,X,X,X|0|15",
- "1,1,1,1,X,X,X|1|22",
- ""
-};
-#else
-#if 1
-const char *nld_74279A::m_desc[] = {
- "S,R,_Q|Q",
- "0,X,X|1|22",
- "1,0,X|0|27",
- "1,1,0|0|27", //15
- "1,1,1|1|22",
- ""
-};
-
-
-const char *nld_74279B::m_desc[] = {
- "S1,S2,R,_Q|Q",
- "0,X,X,X|1|22",
- "X,0,X,X|1|22",
- "1,1,0,X|0|27",
- "1,1,1,0|0|27", // 15
- "1,1,1,1|1|22",
- ""
-};
-#else
-const char *nld_74279A::m_desc[] = {
- " S, R,_Q,_QR|Q,QR",
- " 0, 0, 0, 0 |1, 1|20,22",
- " 1, 0, 0, 0 |1, 1|20,22",
- " 0, 1, 0, 0 |1, 1|20,22",
- " 1, 1, 0, 0 |1, 1|20,22",
- " 0, 0, 1, 0 |1, 1|20,22",
- " 1, 0, 1, 0 |1, 1|20,22",
- " 0, 1, 1, 0 |1, 0|22,15",
- " 1, 1, 1, 0 |1, 0|22,15",
- " 0, 0, 0, 1 |1, 1|20,22",
- " 1, 0, 0, 1 |0, 1|15,22",
- " 0, 1, 0, 1 |1, 1|20,22",
- " 1, 1, 0, 1 |0, 1|15,22",
- " 0, 0, 1, 1 |1, 1|20,22",
- " 1, 0, 1, 1 |0, 1|15,22",
- " 0, 1, 1, 1 |1, 0|22,15",
- " 1, 1, 1, 1 |0, 0|13,15",
- ""
-};
-
-
-const char *nld_74279B::m_desc[] = {
- "S1,S2,R,_Q,_QR|Q,QR",
- "0,0,0,0,0|1,1|20,22",
- "1,0,0,0,0|1,1|20,22",
- "0,1,0,0,0|1,1|20,22",
- "1,1,0,0,0|1,1|20,22",
- "0,0,1,0,0|1,1|20,22",
- "1,0,1,0,0|1,1|20,22",
- "0,1,1,0,0|1,1|20,22",
- "1,1,1,0,0|1,1|20,22",
- "0,0,0,1,0|1,1|20,22",
- "1,0,0,1,0|1,1|20,22",
- "0,1,0,1,0|1,1|20,22",
- "1,1,0,1,0|1,1|20,22",
- "0,0,1,1,0|1,0|22,15",
- "1,0,1,1,0|1,0|22,15",
- "0,1,1,1,0|1,0|22,15",
- "1,1,1,1,0|1,0|22,15",
- "0,0,0,0,1|1,1|20,22",
- "1,0,0,0,1|1,1|20,22",
- "0,1,0,0,1|1,1|20,22",
- "1,1,0,0,1|0,1|15,22",
- "0,0,1,0,1|1,1|20,22",
- "1,0,1,0,1|1,1|20,22",
- "0,1,1,0,1|1,1|20,22",
- "1,1,1,0,1|0,1|15,22",
- "0,0,0,1,1|1,1|20,22",
- "1,0,0,1,1|1,1|20,22",
- "0,1,0,1,1|1,1|20,22",
- "1,1,0,1,1|0,1|15,22",
- "0,0,1,1,1|1,0|22,15",
- "1,0,1,1,1|1,0|22,15",
- "0,1,1,1,1|1,0|22,15",
- "1,1,1,1,1|0,0|13,15",
- ""
-};
-
-#endif
-#endif
-
-NETLIB_UPDATE(74279_dip)
+namespace netlist
{
- /* only called during startup */
- //m_1.update_dev();
- //m_2.update_dev();
- //m_3.update_dev();
- //m_4.update_dev();
-}
-
-NETLIB_RESET(74279_dip)
-{
- //m_1.do_reset();
- //m_2.do_reset();
- //m_3.do_reset();
- //m_4.do_reset();
-}
+ namespace devices
+ {
+
+ NETLIB_TRUTHTABLE(74279A, 3, 1, 0);
+ NETLIB_TRUTHTABLE(74279B, 4, 1, 0);
+
+ NETLIB_OBJECT(74279_dip)
+ {
+ NETLIB_CONSTRUCTOR(74279_dip)
+ , m_1(*this, "1")
+ , m_2(*this, "2")
+ , m_3(*this, "3")
+ , m_4(*this, "4")
+ {
+ register_subalias("1", m_1.m_I[2]); //R
+ register_subalias("2", m_1.m_I[0]);
+ register_subalias("3", m_1.m_I[1]);
+ register_subalias("4", m_1.m_Q[0]);
+
+ register_subalias("5", m_2.m_I[1]); //R
+ register_subalias("6", m_2.m_I[0]);
+ register_subalias("7", m_2.m_Q[0]);
+
+ register_subalias("9", m_3.m_Q[0]);
+ register_subalias("10", m_3.m_I[2]); //R
+ register_subalias("11", m_3.m_I[0]);
+ register_subalias("12", m_3.m_I[1]);
+
+ register_subalias("13", m_4.m_Q[0]);
+ register_subalias("14", m_4.m_I[1]); //R
+ register_subalias("15", m_4.m_I[0]);
+
+ }
+
+ //NETLIB_RESETI();
+ //NETLIB_UPDATEI();
+
+ protected:
+ NETLIB_SUB(74279B) m_1;
+ NETLIB_SUB(74279A) m_2;
+ NETLIB_SUB(74279B) m_3;
+ NETLIB_SUB(74279A) m_4;
+ };
+
+ nld_74279A::truthtable_t nld_74279A::m_ttbl;
+ nld_74279B::truthtable_t nld_74279B::m_ttbl;
+
+ const char *nld_74279A::m_desc[] = {
+ "S,R,_Q|Q",
+ "0,X,X|1|22",
+ "1,0,X|0|27",
+ "1,1,0|0|27", //15
+ "1,1,1|1|22",
+ ""
+ };
+
+
+ const char *nld_74279B::m_desc[] = {
+ "S1,S2,R,_Q|Q",
+ "0,X,X,X|1|22",
+ "X,0,X,X|1|22",
+ "1,1,0,X|0|27",
+ "1,1,1,0|0|27", // 15
+ "1,1,1,1|1|22",
+ ""
+ };
+
+
+ NETLIB_DEVICE_IMPL(74279_dip)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74279.h b/src/lib/netlist/devices/nld_74279.h
index 2e298d62dc6..a77578f0d8d 100644
--- a/src/lib/netlist/devices/nld_74279.h
+++ b/src/lib/netlist/devices/nld_74279.h
@@ -41,56 +41,13 @@
#define TTL_74279_DIP(name) \
NET_REGISTER_DEV(TTL_74279_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-#if 0
-NETLIB_TRUTHTABLE(74279A, 2, 1, 1);
-NETLIB_TRUTHTABLE(74279B, 3, 1, 1);
-#else
-NETLIB_TRUTHTABLE(74279A, 3, 1, 0);
-NETLIB_TRUTHTABLE(74279B, 4, 1, 0);
-//NETLIB_TRUTHTABLE(74279A, 4, 2, 0);
-//NETLIB_TRUTHTABLE(74279B, 5, 2, 0);
-#endif
-
-NETLIB_OBJECT(74279_dip)
+namespace netlist
{
- NETLIB_CONSTRUCTOR(74279_dip)
- , m_1(*this, "1")
- , m_2(*this, "2")
- , m_3(*this, "3")
- , m_4(*this, "4")
+ namespace devices
{
- register_subalias("1", m_1.m_I[2]); //R
- register_subalias("2", m_1.m_I[0]);
- register_subalias("3", m_1.m_I[1]);
- register_subalias("4", m_1.m_Q[0]);
-
- register_subalias("5", m_2.m_I[1]); //R
- register_subalias("6", m_2.m_I[0]);
- register_subalias("7", m_2.m_Q[0]);
-
- register_subalias("9", m_3.m_Q[0]);
- register_subalias("10", m_3.m_I[2]); //R
- register_subalias("11", m_3.m_I[0]);
- register_subalias("12", m_3.m_I[1]);
-
- register_subalias("13", m_4.m_Q[0]);
- register_subalias("14", m_4.m_I[1]); //R
- register_subalias("15", m_4.m_I[0]);
-
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-protected:
- NETLIB_SUB(74279B) m_1;
- NETLIB_SUB(74279A) m_2;
- NETLIB_SUB(74279B) m_3;
- NETLIB_SUB(74279A) m_4;
-};
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_74279_H_ */
diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp
index 0f9f81a4ffd..31d019fc1c7 100644
--- a/src/lib/netlist/devices/nld_7448.cpp
+++ b/src/lib/netlist/devices/nld_7448.cpp
@@ -7,134 +7,227 @@
#include "nld_7448.h"
-NETLIB_NAMESPACE_DEVICES_START()
-
-#if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE)
-nld_7448::truthtable_t nld_7448::m_ttbl;
-const char *nld_7448::m_desc[] = {
- " LTQ,BIQ,RBIQ, A , B , C , D | a, b, c, d, e, f, g",
-
- " 1, 1, 1, 0, 0, 0, 0 | 1, 1, 1, 1, 1, 1, 0|100,100,100,100,100,100,100",
- " 1, 1, X, 1, 0, 0, 0 | 0, 1, 1, 0, 0, 0, 0|100,100,100,100,100,100,100",
- " 1, 1, X, 0, 1, 0, 0 | 1, 1, 0, 1, 1, 0, 1|100,100,100,100,100,100,100",
- " 1, 1, X, 1, 1, 0, 0 | 1, 1, 1, 1, 0, 0, 1|100,100,100,100,100,100,100",
- " 1, 1, X, 0, 0, 1, 0 | 0, 1, 1, 0, 0, 1, 1|100,100,100,100,100,100,100",
- " 1, 1, X, 1, 0, 1, 0 | 1, 0, 1, 1, 0, 1, 1|100,100,100,100,100,100,100",
- " 1, 1, X, 0, 1, 1, 0 | 0, 0, 1, 1, 1, 1, 1|100,100,100,100,100,100,100",
- " 1, 1, X, 1, 1, 1, 0 | 1, 1, 1, 0, 0, 0, 0|100,100,100,100,100,100,100",
- " 1, 1, X, 0, 0, 0, 1 | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100",
- " 1, 1, X, 1, 0, 0, 1 | 1, 1, 1, 0, 0, 1, 1|100,100,100,100,100,100,100",
- " 1, 1, X, 0, 1, 0, 1 | 0, 0, 0, 1, 1, 0, 1|100,100,100,100,100,100,100",
- " 1, 1, X, 1, 1, 0, 1 | 0, 0, 1, 1, 0, 0, 1|100,100,100,100,100,100,100",
- " 1, 1, X, 0, 0, 1, 1 | 0, 1, 0, 0, 0, 1, 1|100,100,100,100,100,100,100",
- " 1, 1, X, 1, 0, 1, 1 | 1, 0, 0, 1, 0, 1, 1|100,100,100,100,100,100,100",
- " 1, 1, X, 0, 1, 1, 1 | 0, 0, 0, 1, 1, 1, 1|100,100,100,100,100,100,100",
- " 1, 1, X, 1, 1, 1, 1 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100",
-
- // BI/RBO is input output. In the next case it is used as an output will go low.
- " 1, 1, 0, 0, 0, 0, 0 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // RBI
-
- " 0, 1, X, X, X, X, X | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100", // LT
-
- // This condition has precedence
- " X, 0, X, X, X, X, X | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // BI
- ""
-};
-
-NETLIB_START(7448_dip)
+namespace netlist
{
- NETLIB_NAME(7448)::start();
-
- register_subalias("1", m_I[4]); // B
- register_subalias("2", m_I[5]); // C
- register_subalias("3", m_I[0]); // LTQ
- register_subalias("4", m_I[1]); // BIQ
- register_subalias("5", m_I[2]); // RBIQ
- register_subalias("6", m_I[6]); // D
- register_subalias("7", m_I[3]); // A
-
- register_subalias("9", m_Q[4]); // e
- register_subalias("10", m_Q[3]); // d
- register_subalias("11", m_Q[2]); // c
- register_subalias("12", m_Q[1]); // b
- register_subalias("13", m_Q[0]); // a
- register_subalias("14", m_Q[6]); // g
- register_subalias("15", m_Q[5]); // f
-}
-
-#else
-
-NETLIB_UPDATE(7448)
-{
- if (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ))
- {
- m_sub.update_outputs(8);
- }
- else if (!INPLOGIC(m_BIQ))
+ namespace devices
{
- m_sub.update_outputs(15);
- }
- if (!INPLOGIC(m_BIQ) || (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ)))
+
+ /*
+ * FIXME: Using truthtable is a lot slower than the explicit device
+ */
+
+ #define USE_TRUTHTABLE_7448 (0)
+
+ #if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE)
+
+ NETLIB_TRUTHTABLE(7448, 7, 7, 0);
+
+ #else
+
+ NETLIB_OBJECT(7448)
+ {
+ NETLIB_CONSTRUCTOR(7448)
+ , m_state(0)
+ {
+ 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));
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ public:
+ ATTR_HOT void update_outputs(UINT8 v);
+ static const UINT8 tab7448[16][7];
+
+ logic_input_t m_A;
+ logic_input_t m_B;
+ logic_input_t m_C;
+ logic_input_t m_D;
+ logic_input_t m_LTQ;
+ logic_input_t m_BIQ;
+ logic_input_t m_RBIQ;
+
+ UINT8 m_state;
+
+ logic_output_t m_Q[7]; /* a .. g */
+
+ };
+
+ #endif
+
+ NETLIB_OBJECT_DERIVED(7448_dip, 7448)
{
- m_sub.m_A.inactivate();
- m_sub.m_B.inactivate();
- m_sub.m_C.inactivate();
- m_sub.m_D.inactivate();
- m_sub.m_RBIQ.inactivate();
- } else {
- m_sub.m_RBIQ.activate();
- m_sub.m_D.activate();
- m_sub.m_C.activate();
- m_sub.m_B.activate();
- m_sub.m_A.activate();
- m_sub.do_update();
+ NETLIB_CONSTRUCTOR_DERIVED(7448_dip, 7448)
+ {
+ register_subalias("1", m_B);
+ register_subalias("2", m_C);
+ register_subalias("3", m_LTQ);
+ register_subalias("4", m_BIQ);
+ register_subalias("5",m_RBIQ);
+ register_subalias("6", m_D);
+ register_subalias("7", m_A);
+
+ register_subalias("9", m_Q[4]); // e
+ register_subalias("10", m_Q[3]); // d
+ register_subalias("11", m_Q[2]); // c
+ register_subalias("12", m_Q[1]); // b
+ register_subalias("13", m_Q[0]); // a
+ register_subalias("14", m_Q[6]); // g
+ register_subalias("15", m_Q[5]); // f
+ }
+ };
+
+ #if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE)
+ nld_7448::truthtable_t nld_7448::m_ttbl;
+ const char *nld_7448::m_desc[] = {
+ " LTQ,BIQ,RBIQ, A , B , C , D | a, b, c, d, e, f, g",
+
+ " 1, 1, 1, 0, 0, 0, 0 | 1, 1, 1, 1, 1, 1, 0|100,100,100,100,100,100,100",
+ " 1, 1, X, 1, 0, 0, 0 | 0, 1, 1, 0, 0, 0, 0|100,100,100,100,100,100,100",
+ " 1, 1, X, 0, 1, 0, 0 | 1, 1, 0, 1, 1, 0, 1|100,100,100,100,100,100,100",
+ " 1, 1, X, 1, 1, 0, 0 | 1, 1, 1, 1, 0, 0, 1|100,100,100,100,100,100,100",
+ " 1, 1, X, 0, 0, 1, 0 | 0, 1, 1, 0, 0, 1, 1|100,100,100,100,100,100,100",
+ " 1, 1, X, 1, 0, 1, 0 | 1, 0, 1, 1, 0, 1, 1|100,100,100,100,100,100,100",
+ " 1, 1, X, 0, 1, 1, 0 | 0, 0, 1, 1, 1, 1, 1|100,100,100,100,100,100,100",
+ " 1, 1, X, 1, 1, 1, 0 | 1, 1, 1, 0, 0, 0, 0|100,100,100,100,100,100,100",
+ " 1, 1, X, 0, 0, 0, 1 | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100",
+ " 1, 1, X, 1, 0, 0, 1 | 1, 1, 1, 0, 0, 1, 1|100,100,100,100,100,100,100",
+ " 1, 1, X, 0, 1, 0, 1 | 0, 0, 0, 1, 1, 0, 1|100,100,100,100,100,100,100",
+ " 1, 1, X, 1, 1, 0, 1 | 0, 0, 1, 1, 0, 0, 1|100,100,100,100,100,100,100",
+ " 1, 1, X, 0, 0, 1, 1 | 0, 1, 0, 0, 0, 1, 1|100,100,100,100,100,100,100",
+ " 1, 1, X, 1, 0, 1, 1 | 1, 0, 0, 1, 0, 1, 1|100,100,100,100,100,100,100",
+ " 1, 1, X, 0, 1, 1, 1 | 0, 0, 0, 1, 1, 1, 1|100,100,100,100,100,100,100",
+ " 1, 1, X, 1, 1, 1, 1 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100",
+
+ // BI/RBO is input output. In the next case it is used as an output will go low.
+ " 1, 1, 0, 0, 0, 0, 0 | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // RBI
+
+ " 0, 1, X, X, X, X, X | 1, 1, 1, 1, 1, 1, 1|100,100,100,100,100,100,100", // LT
+
+ // This condition has precedence
+ " X, 0, X, X, X, X, X | 0, 0, 0, 0, 0, 0, 0|100,100,100,100,100,100,100", // BI
+ ""
+ };
+
+ NETLIB_START(7448_dip)
+ {
+ NETLIB_NAME(7448)::start();
+
+ register_subalias("1", m_I[4]); // B
+ register_subalias("2", m_I[5]); // C
+ register_subalias("3", m_I[0]); // LTQ
+ register_subalias("4", m_I[1]); // BIQ
+ register_subalias("5", m_I[2]); // RBIQ
+ register_subalias("6", m_I[6]); // D
+ register_subalias("7", m_I[3]); // A
+
+ register_subalias("9", m_Q[4]); // e
+ register_subalias("10", m_Q[3]); // d
+ register_subalias("11", m_Q[2]); // c
+ register_subalias("12", m_Q[1]); // b
+ register_subalias("13", m_Q[0]); // a
+ register_subalias("14", m_Q[6]); // g
+ register_subalias("15", m_Q[5]); // f
}
-}
-
-NETLIB_UPDATE(7448_sub)
-{
- UINT8 v;
+ #else
- v = (INPLOGIC(m_A) << 0) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_D) << 3);
- if ((!INPLOGIC(m_RBIQ) && (v==0)))
- v = 15;
- update_outputs(v);
-}
+ NETLIB_UPDATE(7448)
+ {
+ if (!INPLOGIC(m_BIQ) || (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ)))
+ {
+ m_A.inactivate();
+ m_B.inactivate();
+ m_C.inactivate();
+ m_D.inactivate();
+ m_RBIQ.inactivate();
+ if (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ))
+ {
+ update_outputs(8);
+ }
+ else if (!INPLOGIC(m_BIQ))
+ {
+ update_outputs(15);
+ }
+ } else {
+ m_RBIQ.activate();
+ m_D.activate();
+ m_C.activate();
+ m_B.activate();
+ m_A.activate();
+ UINT8 v;
+
+ v = (INPLOGIC(m_A) << 0) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_D) << 3);
+ if ((!INPLOGIC(m_RBIQ) && (v==0)))
+ v = 15;
+ update_outputs(v);
+ }
+ }
-NETLIB_FUNC_VOID(7448_sub, update_outputs, (UINT8 v))
-{
- nl_assert(v<16);
- if (v != m_state)
+ NETLIB_RESET(7448)
{
- // max transfer time is 100 NS */
+ m_state = 0;
+ m_A.inactivate();
+ m_B.inactivate();
+ m_C.inactivate();
+ m_D.inactivate();
+ m_RBIQ.inactivate();
+ }
- for (int i=0; i<7; i++)
- OUTLOGIC(m_Q[i], tab7448[v][i], NLTIME_FROM_NS(100));
- m_state = v;
+ NETLIB_FUNC_VOID(7448, update_outputs, (UINT8 v))
+ {
+ nl_assert(v<16);
+ if (v != m_state)
+ {
+ // max transfer time is 100 NS */
+
+ for (int i=0; i<7; i++)
+ OUTLOGIC(m_Q[i], tab7448[v][i], NLTIME_FROM_NS(100));
+ m_state = v;
+ }
}
-}
-const UINT8 NETLIB_NAME(7448_sub)::tab7448[16][7] =
-{
- { 1, 1, 1, 1, 1, 1, 0 }, /* 00 - not blanked ! */
- { 0, 1, 1, 0, 0, 0, 0 }, /* 01 */
- { 1, 1, 0, 1, 1, 0, 1 }, /* 02 */
- { 1, 1, 1, 1, 0, 0, 1 }, /* 03 */
- { 0, 1, 1, 0, 0, 1, 1 }, /* 04 */
- { 1, 0, 1, 1, 0, 1, 1 }, /* 05 */
- { 0, 0, 1, 1, 1, 1, 1 }, /* 06 */
- { 1, 1, 1, 0, 0, 0, 0 }, /* 07 */
- { 1, 1, 1, 1, 1, 1, 1 }, /* 08 */
- { 1, 1, 1, 0, 0, 1, 1 }, /* 09 */
- { 0, 0, 0, 1, 1, 0, 1 }, /* 10 */
- { 0, 0, 1, 1, 0, 0, 1 }, /* 11 */
- { 0, 1, 0, 0, 0, 1, 1 }, /* 12 */
- { 1, 0, 0, 1, 0, 1, 1 }, /* 13 */
- { 0, 0, 0, 1, 1, 1, 1 }, /* 14 */
- { 0, 0, 0, 0, 0, 0, 0 }, /* 15 */
-};
-#endif
-
-NETLIB_NAMESPACE_DEVICES_END()
+ const UINT8 NETLIB_NAME(7448)::tab7448[16][7] =
+ {
+ { 1, 1, 1, 1, 1, 1, 0 }, /* 00 - not blanked ! */
+ { 0, 1, 1, 0, 0, 0, 0 }, /* 01 */
+ { 1, 1, 0, 1, 1, 0, 1 }, /* 02 */
+ { 1, 1, 1, 1, 0, 0, 1 }, /* 03 */
+ { 0, 1, 1, 0, 0, 1, 1 }, /* 04 */
+ { 1, 0, 1, 1, 0, 1, 1 }, /* 05 */
+ { 0, 0, 1, 1, 1, 1, 1 }, /* 06 */
+ { 1, 1, 1, 0, 0, 0, 0 }, /* 07 */
+ { 1, 1, 1, 1, 1, 1, 1 }, /* 08 */
+ { 1, 1, 1, 0, 0, 1, 1 }, /* 09 */
+ { 0, 0, 0, 1, 1, 0, 1 }, /* 10 */
+ { 0, 0, 1, 1, 0, 0, 1 }, /* 11 */
+ { 0, 1, 0, 0, 0, 1, 1 }, /* 12 */
+ { 1, 0, 0, 1, 0, 1, 1 }, /* 13 */
+ { 0, 0, 0, 1, 1, 1, 1 }, /* 14 */
+ { 0, 0, 0, 0, 0, 0, 0 }, /* 15 */
+ };
+ #endif
+
+ NETLIB_DEVICE_IMPL(7448)
+ NETLIB_DEVICE_IMPL(7448_dip)
+
+
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7448.h b/src/lib/netlist/devices/nld_7448.h
index f5280daf550..e7c2bda94ed 100644
--- a/src/lib/netlist/devices/nld_7448.h
+++ b/src/lib/netlist/devices/nld_7448.h
@@ -27,130 +27,17 @@
#include "nl_base.h"
#include "nld_truthtable.h"
-#define TTL_7448(name, cA0, cA1, cA2, cA3, cLTQ, cBIQ, cRBIQ) \
- NET_REGISTER_DEV(TTL_7448, name) \
- NET_CONNECT(name, A, cA0) \
- NET_CONNECT(name, B, cA1) \
- NET_CONNECT(name, C, cA2) \
- NET_CONNECT(name, D, cA3) \
- NET_CONNECT(name, LTQ, cLTQ) \
- NET_CONNECT(name, BIQ, cBIQ) \
+#define TTL_7448(name, cA0, cA1, cA2, cA3, cLTQ, cBIQ, cRBIQ) \
+ NET_REGISTER_DEV(TTL_7448, name) \
+ NET_CONNECT(name, A, cA0) \
+ NET_CONNECT(name, B, cA1) \
+ NET_CONNECT(name, C, cA2) \
+ NET_CONNECT(name, D, cA3) \
+ NET_CONNECT(name, LTQ, cLTQ) \
+ NET_CONNECT(name, BIQ, cBIQ) \
NET_CONNECT(name, RBIQ, cRBIQ)
-#define TTL_7448_DIP(name) \
+#define TTL_7448_DIP(name) \
NET_REGISTER_DEV(TTL_7448_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-/*
- * FIXME: Using truthtable is a lot slower than the explicit device
- */
-
-#define USE_TRUTHTABLE_7448 (0)
-
-#if (USE_TRUTHTABLE_7448 && USE_TRUTHTABLE)
-
-NETLIB_TRUTHTABLE(7448, 7, 7, 0);
-
-#else
-
-NETLIB_OBJECT(7448_sub)
-{
- NETLIB_CONSTRUCTOR(7448_sub)
- , m_state(0)
- {
- enregister("A0", m_A);
- enregister("A1", m_B);
- enregister("A2", m_C);
- enregister("A3", m_D);
- 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));
- }
-
- NETLIB_RESETI() { m_state = 0; }
- NETLIB_UPDATEI();
-
-public:
- ATTR_HOT void update_outputs(UINT8 v);
- static const UINT8 tab7448[16][7];
-
- logic_input_t m_A;
- logic_input_t m_B;
- logic_input_t m_C;
- logic_input_t m_D;
- logic_input_t m_RBIQ;
-
- UINT8 m_state;
-
- logic_output_t m_Q[7]; /* a .. g */
-
-};
-
-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);
- register_subalias("D", m_sub.m_D);
- enregister("LTQ", m_LTQ);
- enregister("BIQ", m_BIQ);
- register_subalias("RBIQ",m_sub.m_RBIQ);
-
- register_subalias("a", m_sub.m_Q[0]);
- register_subalias("b", m_sub.m_Q[1]);
- register_subalias("c", m_sub.m_Q[2]);
- register_subalias("d", m_sub.m_Q[3]);
- register_subalias("e", m_sub.m_Q[4]);
- register_subalias("f", m_sub.m_Q[5]);
- register_subalias("g", m_sub.m_Q[6]);
- }
-
- NETLIB_RESETI() { m_sub.do_reset(); }
- NETLIB_UPDATEI();
-
-public:
- NETLIB_SUB(7448_sub) m_sub;
-
- logic_input_t m_LTQ;
- logic_input_t m_BIQ;
-};
-#endif
-
-NETLIB_OBJECT_DERIVED(7448_dip, 7448)
-{
- NETLIB_CONSTRUCTOR_DERIVED(7448_dip, 7448)
- {
- register_subalias("1", m_sub.m_B);
- register_subalias("2", m_sub.m_C);
- register_subalias("3", m_LTQ);
- register_subalias("4", m_BIQ);
- register_subalias("5",m_sub.m_RBIQ);
- register_subalias("6", m_sub.m_D);
- register_subalias("7", m_sub.m_A);
-
- register_subalias("9", m_sub.m_Q[4]); // e
- register_subalias("10", m_sub.m_Q[3]); // d
- register_subalias("11", m_sub.m_Q[2]); // c
- register_subalias("12", m_sub.m_Q[1]); // b
- register_subalias("13", m_sub.m_Q[0]); // a
- register_subalias("14", m_sub.m_Q[6]); // g
- register_subalias("15", m_sub.m_Q[5]); // f
- }
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_7448_H_ */
diff --git a/src/lib/netlist/devices/nld_7450.cpp b/src/lib/netlist/devices/nld_7450.cpp
index 558abc62644..aa997256c5a 100644
--- a/src/lib/netlist/devices/nld_7450.cpp
+++ b/src/lib/netlist/devices/nld_7450.cpp
@@ -7,40 +7,97 @@
#include "nld_7450.h"
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_UPDATE(7450)
+namespace netlist
{
- m_A.activate();
- m_B.activate();
- m_C.activate();
- m_D.activate();
- UINT8 t1 = INPLOGIC(m_A) & INPLOGIC(m_B);
- UINT8 t2 = INPLOGIC(m_C) & INPLOGIC(m_D);
-
- const netlist_time times[2] = { NLTIME_FROM_NS(22), NLTIME_FROM_NS(15) };
+ namespace devices
+ {
- UINT8 res = 0;
- if (t1 ^ 1)
+ NETLIB_OBJECT(7450)
{
- if (t2 ^ 1)
+ NETLIB_CONSTRUCTOR(7450)
{
- res = 1;
+ enregister("A", m_A);
+ enregister("B", m_B);
+ enregister("C", m_C);
+ enregister("D", m_D);
+ enregister("Q", m_Q);
}
- else
+ //NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ public:
+ logic_input_t m_A;
+ logic_input_t m_B;
+ logic_input_t m_C;
+ logic_input_t m_D;
+ logic_output_t m_Q;
+ };
+
+ NETLIB_OBJECT(7450_dip)
+ {
+ NETLIB_CONSTRUCTOR(7450_dip)
+ , m_1(*this, "1")
+ , m_2(*this, "2")
{
- m_A.inactivate();
- m_B.inactivate();
+
+ register_subalias("1", m_1.m_A);
+ register_subalias("2", m_2.m_A);
+ register_subalias("3", m_2.m_B);
+ register_subalias("4", m_2.m_C);
+ register_subalias("5", m_2.m_D);
+ register_subalias("6", m_2.m_Q);
+ //register_subalias("7",); GND
+
+ register_subalias("8", m_1.m_Q);
+ register_subalias("9", m_1.m_C);
+ register_subalias("10", m_1.m_D);
+ //register_subalias("11", m_1.m_X1);
+ //register_subalias("12", m_1.m_X1Q);
+ register_subalias("13", m_1.m_B);
+ //register_subalias("14",); VCC
}
- } else {
- if (t2 ^ 1)
+ //NETLIB_RESETI();
+ //NETLIB_UPDATEI();
+
+ NETLIB_SUB(7450) m_1;
+ NETLIB_SUB(7450) m_2;
+ };
+
+ NETLIB_UPDATE(7450)
+ {
+ m_A.activate();
+ m_B.activate();
+ m_C.activate();
+ m_D.activate();
+ UINT8 t1 = INPLOGIC(m_A) & INPLOGIC(m_B);
+ UINT8 t2 = INPLOGIC(m_C) & INPLOGIC(m_D);
+
+ const netlist_time times[2] = { NLTIME_FROM_NS(22), NLTIME_FROM_NS(15) };
+
+ UINT8 res = 0;
+ if (t1 ^ 1)
{
- m_C.inactivate();
- m_D.inactivate();
+ if (t2 ^ 1)
+ {
+ res = 1;
+ }
+ else
+ {
+ m_A.inactivate();
+ m_B.inactivate();
+ }
+ } else {
+ if (t2 ^ 1)
+ {
+ m_C.inactivate();
+ m_D.inactivate();
+ }
}
+ OUTLOGIC(m_Q, res, times[1 - res]);// ? 22000 : 15000);
}
- OUTLOGIC(m_Q, res, times[1 - res]);// ? 22000 : 15000);
-}
+ NETLIB_DEVICE_IMPL(7450)
+ NETLIB_DEVICE_IMPL(7450_dip)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7450.h b/src/lib/netlist/devices/nld_7450.h
index ded207bc070..47d997d3f3c 100644
--- a/src/lib/netlist/devices/nld_7450.h
+++ b/src/lib/netlist/devices/nld_7450.h
@@ -24,71 +24,16 @@
#ifndef NLD_7450_H_
#define NLD_7450_H_
-#include "nl_base.h"
+#include "nl_setup.h"
-#define TTL_7450_ANDORINVERT(name, cI1, cI2, cI3, cI4) \
- NET_REGISTER_DEV(TTL_7450_ANDORINVERT, name) \
- NET_CONNECT(name, A, cI1) \
- NET_CONNECT(name, B, cI2) \
- NET_CONNECT(name, C, cI3) \
+#define TTL_7450_ANDORINVERT(name, cI1, cI2, cI3, cI4) \
+ NET_REGISTER_DEV(TTL_7450_ANDORINVERT, name) \
+ NET_CONNECT(name, A, cI1) \
+ NET_CONNECT(name, B, cI2) \
+ NET_CONNECT(name, C, cI3) \
NET_CONNECT(name, D, cI4)
-#define TTL_7450_DIP(name) \
+#define TTL_7450_DIP(name) \
NET_REGISTER_DEV(TTL_7450_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(7450)
-{
- NETLIB_CONSTRUCTOR(7450)
- {
- enregister("A", m_A);
- enregister("B", m_B);
- enregister("C", m_C);
- enregister("D", m_D);
- enregister("Q", m_Q);
- }
- //NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-public:
- logic_input_t m_A;
- logic_input_t m_B;
- logic_input_t m_C;
- logic_input_t m_D;
- logic_output_t m_Q;
-};
-
-NETLIB_OBJECT(7450_dip)
-{
- NETLIB_CONSTRUCTOR(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);
- register_subalias("4", m_2.m_C);
- register_subalias("5", m_2.m_D);
- register_subalias("6", m_2.m_Q);
- //register_subalias("7",); GND
-
- register_subalias("8", m_1.m_Q);
- register_subalias("9", m_1.m_C);
- register_subalias("10", m_1.m_D);
- //register_subalias("11", m_1.m_X1);
- //register_subalias("12", m_1.m_X1Q);
- register_subalias("13", m_1.m_B);
- //register_subalias("14",); VCC
- }
- //NETLIB_RESETI();
- //NETLIB_UPDATEI();
-
- NETLIB_SUB(7450) m_1;
- NETLIB_SUB(7450) m_2;
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_7450_H_ */
diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp
index d1f2e11cd8a..f3890f4105d 100644
--- a/src/lib/netlist/devices/nld_7474.cpp
+++ b/src/lib/netlist/devices/nld_7474.cpp
@@ -7,75 +7,166 @@
#include "nld_7474.h"
-NETLIB_NAMESPACE_DEVICES_START()
-
-ATTR_HOT inline void NETLIB_NAME(7474sub)::newstate(const UINT8 stateQ, const UINT8 stateQQ)
+namespace netlist
{
- // 0: High-to-low 40 ns, 1: Low-to-high 25 ns
- const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
- OUTLOGIC(m_Q, stateQ, delay[stateQ]);
- OUTLOGIC(m_QQ, stateQQ, delay[stateQQ]);
-}
+ namespace devices
+ {
-NETLIB_UPDATE(7474sub)
-{
- //if (INP_LH(m_CLK))
+ NETLIB_OBJECT(7474sub)
{
- newstate(m_nextD, !m_nextD);
- m_CLK.inactivate();
- }
-}
+ NETLIB_CONSTRUCTOR(7474sub)
+ , m_nextD(0)
+ {
+ enregister("CLK", m_CLK);
-NETLIB_UPDATE(7474)
-{
- if (INPLOGIC(m_PREQ) && INPLOGIC(m_CLRQ))
+ enregister("Q", m_Q);
+ enregister("QQ", m_QQ);
+
+ save(NLNAME(m_nextD));
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ public:
+ logic_input_t m_CLK;
+ logic_output_t m_Q;
+ logic_output_t m_QQ;
+ INT8 m_nextD;
+
+ ATTR_HOT inline void newstate(const UINT8 stateQ, const UINT8 stateQQ);
+
+ private:
+
+ };
+
+ NETLIB_OBJECT(7474)
+ {
+ NETLIB_CONSTRUCTOR(7474)
+ , sub(*this, "sub")
+ {
+ 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);
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ public:
+ NETLIB_SUB(7474sub) sub;
+
+ logic_input_t m_D;
+ logic_input_t m_CLRQ;
+ logic_input_t m_PREQ;
+ };
+
+ NETLIB_OBJECT(7474_dip)
{
- m_D.activate();
- sub.m_nextD = INPLOGIC(m_D);
- sub.m_CLK.activate_lh();
+ NETLIB_CONSTRUCTOR(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);
+ register_subalias("4", m_1.m_PREQ);
+ register_subalias("5", m_1.sub.m_Q);
+ register_subalias("6", m_1.sub.m_QQ);
+ // register_subalias("7", ); ==> GND
+
+ register_subalias("8", m_2.sub.m_QQ);
+ register_subalias("9", m_2.sub.m_Q);
+ register_subalias("10", m_2.m_PREQ);
+ register_subalias("11", m_2.sub.m_CLK);
+ register_subalias("12", m_2.m_D);
+ register_subalias("13", m_2.m_CLRQ);
+ // register_subalias("14", ); ==> VCC
+ }
+ NETLIB_UPDATEI();
+ NETLIB_RESETI();
+
+ private:
+ NETLIB_SUB(7474) m_1;
+ NETLIB_SUB(7474) m_2;
+ };
+
+ ATTR_HOT inline void NETLIB_NAME(7474sub)::newstate(const UINT8 stateQ, const UINT8 stateQQ)
+ {
+ // 0: High-to-low 40 ns, 1: Low-to-high 25 ns
+ const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
+ OUTLOGIC(m_Q, stateQ, delay[stateQ]);
+ OUTLOGIC(m_QQ, stateQQ, delay[stateQQ]);
}
- else if (!INPLOGIC(m_PREQ))
+
+ NETLIB_UPDATE(7474sub)
{
- sub.newstate(1, 0);
- sub.m_CLK.inactivate();
- m_D.inactivate();
+ //if (INP_LH(m_CLK))
+ {
+ newstate(m_nextD, !m_nextD);
+ m_CLK.inactivate();
+ }
}
- else if (!INPLOGIC(m_CLRQ))
+
+ NETLIB_UPDATE(7474)
{
- sub.newstate(0, 1);
- sub.m_CLK.inactivate();
- m_D.inactivate();
+ if (INPLOGIC(m_PREQ) && INPLOGIC(m_CLRQ))
+ {
+ m_D.activate();
+ sub.m_nextD = INPLOGIC(m_D);
+ sub.m_CLK.activate_lh();
+ }
+ else if (!INPLOGIC(m_PREQ))
+ {
+ sub.newstate(1, 0);
+ sub.m_CLK.inactivate();
+ m_D.inactivate();
+ }
+ else if (!INPLOGIC(m_CLRQ))
+ {
+ sub.newstate(0, 1);
+ sub.m_CLK.inactivate();
+ m_D.inactivate();
+ }
+ else
+ {
+ sub.newstate(1, 1);
+ sub.m_CLK.inactivate();
+ m_D.inactivate();
+ }
}
- else
+
+ NETLIB_RESET(7474)
{
- sub.newstate(1, 1);
- sub.m_CLK.inactivate();
- m_D.inactivate();
+ sub.do_reset();
}
-}
-NETLIB_RESET(7474)
-{
- sub.do_reset();
-}
+ NETLIB_RESET(7474sub)
+ {
+ m_CLK.set_state(logic_t::STATE_INP_LH);
-NETLIB_RESET(7474sub)
-{
- m_CLK.set_state(logic_t::STATE_INP_LH);
+ m_nextD = 0;
+ }
- m_nextD = 0;
-}
+ NETLIB_RESET(7474_dip)
+ {
+ // m_1.do_reset();
+ //m_2.do_reset();
+ }
-NETLIB_RESET(7474_dip)
-{
-// m_1.do_reset();
- //m_2.do_reset();
-}
+ NETLIB_UPDATE(7474_dip)
+ {
+ //m_1.update_dev();
+ //m_2.update_dev();
+ }
-NETLIB_UPDATE(7474_dip)
-{
- //m_1.update_dev();
- //m_2.update_dev();
-}
+ NETLIB_DEVICE_IMPL(7474)
+ NETLIB_DEVICE_IMPL(7474_dip)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7474.h b/src/lib/netlist/devices/nld_7474.h
index 918280f9966..25a9efe32c5 100644
--- a/src/lib/netlist/devices/nld_7474.h
+++ b/src/lib/netlist/devices/nld_7474.h
@@ -42,104 +42,16 @@
#ifndef NLD_7474_H_
#define NLD_7474_H_
-#include "nl_base.h"
+#include "nl_setup.h"
-#define TTL_7474(name, cCLK, cD, cCLRQ, cPREQ) \
- NET_REGISTER_DEV(TTL_7474, name) \
- NET_CONNECT(name, CLK, cCLK) \
- NET_CONNECT(name, D, cD) \
- NET_CONNECT(name, CLRQ, cCLRQ) \
+#define TTL_7474(name, cCLK, cD, cCLRQ, cPREQ) \
+ NET_REGISTER_DEV(TTL_7474, name) \
+ NET_CONNECT(name, CLK, cCLK) \
+ NET_CONNECT(name, D, cD) \
+ NET_CONNECT(name, CLRQ, cCLRQ) \
NET_CONNECT(name, PREQ, cPREQ)
-#define TTL_7474_DIP(name) \
+#define TTL_7474_DIP(name) \
NET_REGISTER_DEV(TTL_7474_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(7474sub)
-{
- NETLIB_CONSTRUCTOR(7474sub)
- , m_nextD(0)
- {
- enregister("CLK", m_CLK);
-
- enregister("Q", m_Q);
- enregister("QQ", m_QQ);
-
- save(NLNAME(m_nextD));
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-public:
- logic_input_t m_CLK;
- logic_output_t m_Q;
- logic_output_t m_QQ;
- INT8 m_nextD;
-
- ATTR_HOT inline void newstate(const UINT8 stateQ, const UINT8 stateQQ);
-
-private:
-
-};
-
-NETLIB_OBJECT(7474)
-{
- NETLIB_CONSTRUCTOR(7474)
- , sub(*this, "sub")
- {
- 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);
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-public:
- NETLIB_SUB(7474sub) sub;
-
- logic_input_t m_D;
- logic_input_t m_CLRQ;
- logic_input_t m_PREQ;
-};
-
-NETLIB_OBJECT(7474_dip)
-{
- NETLIB_CONSTRUCTOR(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);
- register_subalias("4", m_1.m_PREQ);
- register_subalias("5", m_1.sub.m_Q);
- register_subalias("6", m_1.sub.m_QQ);
- // register_subalias("7", ); ==> GND
-
- register_subalias("8", m_2.sub.m_QQ);
- register_subalias("9", m_2.sub.m_Q);
- register_subalias("10", m_2.m_PREQ);
- register_subalias("11", m_2.sub.m_CLK);
- register_subalias("12", m_2.m_D);
- register_subalias("13", m_2.m_CLRQ);
- // register_subalias("14", ); ==> VCC
- }
- NETLIB_UPDATEI();
- NETLIB_RESETI();
-
-private:
- NETLIB_SUB(7474) m_1;
- NETLIB_SUB(7474) m_2;
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_7474_H_ */
diff --git a/src/lib/netlist/devices/nld_7483.cpp b/src/lib/netlist/devices/nld_7483.cpp
index 0657702e718..29c28121d8f 100644
--- a/src/lib/netlist/devices/nld_7483.cpp
+++ b/src/lib/netlist/devices/nld_7483.cpp
@@ -7,29 +7,109 @@
#include "nld_7483.h"
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_RESET(7483)
+namespace netlist
{
- m_lastr = 0;
-}
+ namespace devices
+ {
-NETLIB_UPDATE(7483)
-{
- UINT8 a = (INPLOGIC(m_A1) << 0) | (INPLOGIC(m_A2) << 1) | (INPLOGIC(m_A3) << 2) | (INPLOGIC(m_A4) << 3);
- UINT8 b = (INPLOGIC(m_B1) << 0) | (INPLOGIC(m_B2) << 1) | (INPLOGIC(m_B3) << 2) | (INPLOGIC(m_B4) << 3);
+ NETLIB_OBJECT(7483)
+ {
+ NETLIB_CONSTRUCTOR(7483)
+ , m_lastr(0)
+ {
+ 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();
+ NETLIB_UPDATEI();
+
+ protected:
+ logic_input_t m_C0;
+ logic_input_t m_A1;
+ logic_input_t m_A2;
+ logic_input_t m_A3;
+ logic_input_t m_A4;
+ logic_input_t m_B1;
+ logic_input_t m_B2;
+ logic_input_t m_B3;
+ logic_input_t m_B4;
+
+ UINT8 m_lastr;
+
+ logic_output_t m_S1;
+ logic_output_t m_S2;
+ logic_output_t m_S3;
+ logic_output_t m_S4;
+ logic_output_t m_C4;
- UINT8 r = a + b + INPLOGIC(m_C0);
+ };
- if (r != m_lastr)
+ NETLIB_OBJECT_DERIVED(7483_dip, 7483)
{
- m_lastr = r;
- OUTLOGIC(m_S1, (r >> 0) & 1, NLTIME_FROM_NS(23));
- OUTLOGIC(m_S2, (r >> 1) & 1, NLTIME_FROM_NS(23));
- OUTLOGIC(m_S3, (r >> 2) & 1, NLTIME_FROM_NS(23));
- OUTLOGIC(m_S4, (r >> 3) & 1, NLTIME_FROM_NS(23));
- OUTLOGIC(m_C4, (r >> 4) & 1, NLTIME_FROM_NS(23));
+ NETLIB_CONSTRUCTOR_DERIVED(7483_dip, 7483)
+ {
+ register_subalias("1", m_A4);
+ register_subalias("2", m_S3);
+ register_subalias("3", m_A3);
+ register_subalias("4", m_B3);
+ // register_subalias("5", ); --> VCC
+ register_subalias("6", m_S2);
+ register_subalias("7", m_B2);
+ register_subalias("8", m_A2);
+
+ register_subalias("9", m_S1);
+ register_subalias("10", m_A1);
+ register_subalias("11", m_B1);
+ // register_subalias("12", ); --> GND
+ register_subalias("13", m_C0);
+ register_subalias("14", m_C4);
+ register_subalias("15", m_S4);
+ register_subalias("16", m_B4);
+ }
+ //NETLIB_RESETI();
+ //NETLIB_UPDATEI();
+ };
+
+ NETLIB_RESET(7483)
+ {
+ m_lastr = 0;
}
-}
-NETLIB_NAMESPACE_DEVICES_END()
+ NETLIB_UPDATE(7483)
+ {
+ UINT8 a = (INPLOGIC(m_A1) << 0) | (INPLOGIC(m_A2) << 1) | (INPLOGIC(m_A3) << 2) | (INPLOGIC(m_A4) << 3);
+ UINT8 b = (INPLOGIC(m_B1) << 0) | (INPLOGIC(m_B2) << 1) | (INPLOGIC(m_B3) << 2) | (INPLOGIC(m_B4) << 3);
+
+ UINT8 r = a + b + INPLOGIC(m_C0);
+
+ if (r != m_lastr)
+ {
+ m_lastr = r;
+ OUTLOGIC(m_S1, (r >> 0) & 1, NLTIME_FROM_NS(23));
+ OUTLOGIC(m_S2, (r >> 1) & 1, NLTIME_FROM_NS(23));
+ OUTLOGIC(m_S3, (r >> 2) & 1, NLTIME_FROM_NS(23));
+ OUTLOGIC(m_S4, (r >> 3) & 1, NLTIME_FROM_NS(23));
+ OUTLOGIC(m_C4, (r >> 4) & 1, NLTIME_FROM_NS(23));
+ }
+ }
+
+ NETLIB_DEVICE_IMPL(7483)
+ NETLIB_DEVICE_IMPL(7483_dip)
+
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7483.h b/src/lib/netlist/devices/nld_7483.h
index a66876844e6..5d920c0bdbb 100644
--- a/src/lib/netlist/devices/nld_7483.h
+++ b/src/lib/netlist/devices/nld_7483.h
@@ -27,98 +27,21 @@
#ifndef NLD_7483_H_
#define NLD_7483_H_
-#include "nl_base.h"
-
-#define TTL_7483(name, cA1, cA2, cA3, cA4, cB1, cB2, cB3, cB4, cCI) \
- NET_REGISTER_DEV(TTL_7483, name) \
- NET_CONNECT(name, A1, cA1) \
- NET_CONNECT(name, A2, cA2) \
- NET_CONNECT(name, A3, cA3) \
- NET_CONNECT(name, A4, cA4) \
- NET_CONNECT(name, B1, cB1) \
- NET_CONNECT(name, B2, cB2) \
- NET_CONNECT(name, B3, cB3) \
- NET_CONNECT(name, B4, cB4) \
+#include "nl_setup.h"
+
+#define TTL_7483(name, cA1, cA2, cA3, cA4, cB1, cB2, cB3, cB4, cCI) \
+ NET_REGISTER_DEV(TTL_7483, name) \
+ NET_CONNECT(name, A1, cA1) \
+ NET_CONNECT(name, A2, cA2) \
+ NET_CONNECT(name, A3, cA3) \
+ NET_CONNECT(name, A4, cA4) \
+ NET_CONNECT(name, B1, cB1) \
+ NET_CONNECT(name, B2, cB2) \
+ NET_CONNECT(name, B3, cB3) \
+ NET_CONNECT(name, B4, cB4) \
NET_CONNECT(name, C0, cCI)
-#define TTL_7483_DIP(name) \
+#define TTL_7483_DIP(name) \
NET_REGISTER_DEV(TTL_7483_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(7483)
-{
- NETLIB_CONSTRUCTOR(7483)
- , m_lastr(0)
- {
- 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();
- NETLIB_UPDATEI();
-
-protected:
- logic_input_t m_C0;
- logic_input_t m_A1;
- logic_input_t m_A2;
- logic_input_t m_A3;
- logic_input_t m_A4;
- logic_input_t m_B1;
- logic_input_t m_B2;
- logic_input_t m_B3;
- logic_input_t m_B4;
-
- UINT8 m_lastr;
-
- logic_output_t m_S1;
- logic_output_t m_S2;
- logic_output_t m_S3;
- logic_output_t m_S4;
- logic_output_t m_C4;
-
-};
-
-NETLIB_OBJECT_DERIVED(7483_dip, 7483)
-{
- NETLIB_CONSTRUCTOR_DERIVED(7483_dip, 7483)
- {
- register_subalias("1", m_A4);
- register_subalias("2", m_S3);
- register_subalias("3", m_A3);
- register_subalias("4", m_B3);
- // register_subalias("5", ); --> VCC
- register_subalias("6", m_S2);
- register_subalias("7", m_B2);
- register_subalias("8", m_A2);
-
- register_subalias("9", m_S1);
- register_subalias("10", m_A1);
- register_subalias("11", m_B1);
- // register_subalias("12", ); --> GND
- register_subalias("13", m_C0);
- register_subalias("14", m_C4);
- register_subalias("15", m_S4);
- register_subalias("16", m_B4);
- }
- //NETLIB_RESETI();
- //NETLIB_UPDATEI();
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_7483_H_ */
diff --git a/src/lib/netlist/devices/nld_7490.cpp b/src/lib/netlist/devices/nld_7490.cpp
index a4120db28ba..fbe0bda2443 100644
--- a/src/lib/netlist/devices/nld_7490.cpp
+++ b/src/lib/netlist/devices/nld_7490.cpp
@@ -7,60 +7,134 @@
#include "nld_7490.h"
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_RESET(7490)
+namespace netlist
{
- m_cnt = 0;
- m_last_A = 0;
- m_last_B = 0;
-}
+ namespace devices
+ {
-static const netlist_time delay[4] =
-{
- NLTIME_FROM_NS(18),
- NLTIME_FROM_NS(36) - NLTIME_FROM_NS(18),
- NLTIME_FROM_NS(54) - NLTIME_FROM_NS(18),
- NLTIME_FROM_NS(72) - NLTIME_FROM_NS(18)};
+ NETLIB_OBJECT(7490)
+ {
+ NETLIB_CONSTRUCTOR(7490)
+ , m_cnt(0)
+ , m_last_A(0)
+ , m_last_B(0)
+ {
+ enregister("A", m_A);
+ enregister("B", m_B);
+ enregister("R1", m_R1);
+ enregister("R2", m_R2);
+ enregister("R91", m_R91);
+ enregister("R92", m_R92);
-NETLIB_UPDATE(7490)
-{
- const netlist_sig_t new_A = INPLOGIC(m_A);
- const netlist_sig_t new_B = INPLOGIC(m_B);
+ 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));
+ }
- if (INPLOGIC(m_R91) & INPLOGIC(m_R92))
+ NETLIB_UPDATEI();
+ NETLIB_RESETI();
+
+ protected:
+ ATTR_HOT void update_outputs();
+
+ 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];
+ };
+
+ NETLIB_OBJECT_DERIVED(7490_dip, 7490)
{
- m_cnt = 9;
- update_outputs();
- }
- else if (INPLOGIC(m_R1) & INPLOGIC(m_R2))
+ NETLIB_CONSTRUCTOR_DERIVED(7490_dip, 7490)
+ {
+ register_subalias("1", m_B);
+ register_subalias("2", m_R1);
+ register_subalias("3", m_R2);
+
+ // register_subalias("4", ); --> NC
+ // register_subalias("5", ); --> VCC
+ register_subalias("6", m_R91);
+ register_subalias("7", m_R92);
+
+ register_subalias("8", m_Q[2]);
+ register_subalias("9", m_Q[1]);
+ // register_subalias("10", ); --> GND
+ register_subalias("11", m_Q[3]);
+ register_subalias("12", m_Q[0]);
+ // register_subalias("13", ); --> NC
+ register_subalias("14", m_A);
+ }
+ };
+
+ NETLIB_RESET(7490)
{
m_cnt = 0;
- update_outputs();
+ m_last_A = 0;
+ m_last_B = 0;
}
- else
+
+ static const netlist_time delay[4] =
+ {
+ NLTIME_FROM_NS(18),
+ NLTIME_FROM_NS(36) - NLTIME_FROM_NS(18),
+ NLTIME_FROM_NS(54) - NLTIME_FROM_NS(18),
+ NLTIME_FROM_NS(72) - NLTIME_FROM_NS(18)};
+
+ NETLIB_UPDATE(7490)
{
- if (m_last_A && !new_A) // High - Low
+ const netlist_sig_t new_A = INPLOGIC(m_A);
+ const netlist_sig_t new_B = INPLOGIC(m_B);
+
+ if (INPLOGIC(m_R91) & INPLOGIC(m_R92))
{
- m_cnt ^= 1;
- OUTLOGIC(m_Q[0], m_cnt & 1, delay[0]);
+ m_cnt = 9;
+ update_outputs();
}
- if (m_last_B && !new_B) // High - Low
+ else if (INPLOGIC(m_R1) & INPLOGIC(m_R2))
{
- m_cnt += 2;
- if (m_cnt >= 10)
- m_cnt &= 1; /* Output A is not reset! */
+ m_cnt = 0;
update_outputs();
}
+ else
+ {
+ if (m_last_A && !new_A) // High - Low
+ {
+ m_cnt ^= 1;
+ OUTLOGIC(m_Q[0], m_cnt & 1, delay[0]);
+ }
+ if (m_last_B && !new_B) // High - Low
+ {
+ m_cnt += 2;
+ if (m_cnt >= 10)
+ m_cnt &= 1; /* Output A is not reset! */
+ update_outputs();
+ }
+ }
+ m_last_A = new_A;
+ m_last_B = new_B;
}
- m_last_A = new_A;
- m_last_B = new_B;
-}
-NETLIB_FUNC_VOID(7490, update_outputs, (void))
-{
- for (int i=0; i<4; i++)
- OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
-}
+ NETLIB_FUNC_VOID(7490, update_outputs, (void))
+ {
+ for (int i=0; i<4; i++)
+ OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
+ }
+
+ NETLIB_DEVICE_IMPL(7490)
+ NETLIB_DEVICE_IMPL(7490_dip)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7490.h b/src/lib/netlist/devices/nld_7490.h
index c4a92f1b364..657972618e9 100644
--- a/src/lib/netlist/devices/nld_7490.h
+++ b/src/lib/netlist/devices/nld_7490.h
@@ -55,7 +55,7 @@
#ifndef NLD_7490_H_
#define NLD_7490_H_
-#include "nl_base.h"
+#include "nl_setup.h"
#define TTL_7490(name, cA, cB, cR1, cR2, cR91, cR92) \
NET_REGISTER_DEV(TTL_7490, name) \
@@ -69,75 +69,4 @@
#define TTL_7490_DIP(name) \
NET_REGISTER_DEV(TTL_7490_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(7490)
-{
- NETLIB_CONSTRUCTOR(7490)
- , m_cnt(0)
- , m_last_A(0)
- , m_last_B(0)
- {
- 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));
- }
-
- NETLIB_UPDATEI();
- NETLIB_RESETI();
-
-protected:
- ATTR_HOT void update_outputs();
-
- 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];
-};
-
-NETLIB_OBJECT_DERIVED(7490_dip, 7490)
-{
- NETLIB_CONSTRUCTOR_DERIVED(7490_dip, 7490)
- {
- register_subalias("1", m_B);
- register_subalias("2", m_R1);
- register_subalias("3", m_R2);
-
- // register_subalias("4", ); --> NC
- // register_subalias("5", ); --> VCC
- register_subalias("6", m_R91);
- register_subalias("7", m_R92);
-
- register_subalias("8", m_Q[2]);
- register_subalias("9", m_Q[1]);
- // register_subalias("10", ); --> GND
- register_subalias("11", m_Q[3]);
- register_subalias("12", m_Q[0]);
- // register_subalias("13", ); --> NC
- register_subalias("14", m_A);
- }
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_7490_H_ */
diff --git a/src/lib/netlist/devices/nld_7493.cpp b/src/lib/netlist/devices/nld_7493.cpp
index c83230a2a81..3ed976cfa86 100644
--- a/src/lib/netlist/devices/nld_7493.cpp
+++ b/src/lib/netlist/devices/nld_7493.cpp
@@ -8,47 +8,133 @@
#include "nld_7493.h"
#include "nl_setup.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
-NETLIB_RESET(7493ff)
-{
- m_reset = 1;
- m_state = 0;
- m_I.set_state(logic_t::STATE_INP_HL);
-}
+ NETLIB_OBJECT(7493ff)
+ {
+ NETLIB_CONSTRUCTOR(7493ff)
+ {
+ enregister("CLK", m_I);
+ enregister("Q", m_Q);
-NETLIB_UPDATE(7493ff)
-{
- const netlist_time out_delay = NLTIME_FROM_NS(18);
- if (m_reset != 0)
+ save(NLNAME(m_reset));
+ save(NLNAME(m_state));
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ public:
+ logic_input_t m_I;
+ logic_output_t m_Q;
+
+ UINT8 m_reset;
+ UINT8 m_state;
+ };
+
+ NETLIB_OBJECT(7493)
{
- m_state ^= 1;
- OUTLOGIC(m_Q, m_state, out_delay);
- }
-}
+ NETLIB_CONSTRUCTOR(7493)
+ , A(*this, "A")
+ , B(*this, "B")
+ , C(*this, "C")
+ , D(*this, "D")
+ {
+ register_subalias("CLKA", A.m_I);
+ register_subalias("CLKB", B.m_I);
+ enregister("R1", m_R1);
+ enregister("R2", m_R2);
-NETLIB_UPDATE(7493)
-{
- const netlist_sig_t r = INPLOGIC(m_R1) & INPLOGIC(m_R2);
+ register_subalias("QA", A.m_Q);
+ register_subalias("QB", B.m_Q);
+ register_subalias("QC", C.m_Q);
+ register_subalias("QD", D.m_Q);
+
+ connect_late(C.m_I, B.m_Q);
+ connect_late(D.m_I, C.m_Q);
+ }
+
+ NETLIB_RESETI() { }
+ NETLIB_UPDATEI();
- if (r)
+ logic_input_t m_R1;
+ logic_input_t m_R2;
+
+ NETLIB_SUB(7493ff) A;
+ NETLIB_SUB(7493ff) B;
+ NETLIB_SUB(7493ff) C;
+ NETLIB_SUB(7493ff) D;
+ };
+
+ NETLIB_OBJECT_DERIVED(7493_dip, 7493)
+ {
+ NETLIB_CONSTRUCTOR_DERIVED(7493_dip, 7493)
+ {
+ register_subalias("1", B.m_I);
+ register_subalias("2", m_R1);
+ register_subalias("3", m_R2);
+
+ // register_subalias("4", ); --> NC
+ // register_subalias("5", ); --> VCC
+ // register_subalias("6", ); --> NC
+ // register_subalias("7", ); --> NC
+
+ register_subalias("8", C.m_Q);
+ register_subalias("9", B.m_Q);
+ // register_subalias("10", ); -. GND
+ register_subalias("11", D.m_Q);
+ register_subalias("12", A.m_Q);
+ // register_subalias("13", ); -. NC
+ register_subalias("14", A.m_I);
+ }
+ };
+
+ NETLIB_RESET(7493ff)
{
- A.m_I.inactivate();
- B.m_I.inactivate();
- OUTLOGIC(A.m_Q, 0, NLTIME_FROM_NS(40));
- OUTLOGIC(B.m_Q, 0, NLTIME_FROM_NS(40));
- OUTLOGIC(C.m_Q, 0, NLTIME_FROM_NS(40));
- OUTLOGIC(D.m_Q, 0, NLTIME_FROM_NS(40));
- A.m_reset = B.m_reset = C.m_reset = D.m_reset = 0;
- A.m_state = B.m_state = C.m_state = D.m_state = 0;
+ m_reset = 1;
+ m_state = 0;
+ m_I.set_state(logic_t::STATE_INP_HL);
}
- else
+
+ NETLIB_UPDATE(7493ff)
+ {
+ const netlist_time out_delay = NLTIME_FROM_NS(18);
+ if (m_reset != 0)
+ {
+ m_state ^= 1;
+ OUTLOGIC(m_Q, m_state, out_delay);
+ }
+ }
+
+ NETLIB_UPDATE(7493)
{
- A.m_I.activate_hl();
- B.m_I.activate_hl();
- A.m_reset = B.m_reset = C.m_reset = D.m_reset = 1;
+ const netlist_sig_t r = INPLOGIC(m_R1) & INPLOGIC(m_R2);
+
+ if (r)
+ {
+ A.m_I.inactivate();
+ B.m_I.inactivate();
+ OUTLOGIC(A.m_Q, 0, NLTIME_FROM_NS(40));
+ OUTLOGIC(B.m_Q, 0, NLTIME_FROM_NS(40));
+ OUTLOGIC(C.m_Q, 0, NLTIME_FROM_NS(40));
+ OUTLOGIC(D.m_Q, 0, NLTIME_FROM_NS(40));
+ A.m_reset = B.m_reset = C.m_reset = D.m_reset = 0;
+ A.m_state = B.m_state = C.m_state = D.m_state = 0;
+ }
+ else
+ {
+ A.m_I.activate_hl();
+ B.m_I.activate_hl();
+ A.m_reset = B.m_reset = C.m_reset = D.m_reset = 1;
+ }
}
-}
-NETLIB_NAMESPACE_DEVICES_END()
+ NETLIB_DEVICE_IMPL(7493)
+ NETLIB_DEVICE_IMPL(7493_dip)
+
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7493.h b/src/lib/netlist/devices/nld_7493.h
index 778e2358b2d..e102b07ed8a 100644
--- a/src/lib/netlist/devices/nld_7493.h
+++ b/src/lib/netlist/devices/nld_7493.h
@@ -57,100 +57,16 @@
#ifndef NLD_7493_H_
#define NLD_7493_H_
-#include "nl_base.h"
+#include "nl_setup.h"
-#define TTL_7493(name, cCLKA, cCLKB, cR1, cR2) \
- NET_REGISTER_DEV(TTL_7493, name) \
- NET_CONNECT(name, CLKA, cCLKA) \
- NET_CONNECT(name, CLKB, cCLKB) \
- NET_CONNECT(name, R1, cR1) \
+#define TTL_7493(name, cCLKA, cCLKB, cR1, cR2) \
+ NET_REGISTER_DEV(TTL_7493, name) \
+ NET_CONNECT(name, CLKA, cCLKA) \
+ NET_CONNECT(name, CLKB, cCLKB) \
+ NET_CONNECT(name, R1, cR1) \
NET_CONNECT(name, R2, cR2)
-#define TTL_7493_DIP(name) \
+#define TTL_7493_DIP(name) \
NET_REGISTER_DEV(TTL_7493_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(7493ff)
-{
- NETLIB_CONSTRUCTOR(7493ff)
- {
- enregister("CLK", m_I);
- enregister("Q", m_Q);
-
- save(NLNAME(m_reset));
- save(NLNAME(m_state));
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-public:
- logic_input_t m_I;
- logic_output_t m_Q;
-
- UINT8 m_reset;
- UINT8 m_state;
-};
-
-NETLIB_OBJECT(7493)
-{
- NETLIB_CONSTRUCTOR(7493)
- , A(*this, "A")
- , B(*this, "B")
- , C(*this, "C")
- , D(*this, "D")
- {
- 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);
- register_subalias("QC", C.m_Q);
- register_subalias("QD", D.m_Q);
-
- connect_late(C.m_I, B.m_Q);
- connect_late(D.m_I, C.m_Q);
- }
-
- NETLIB_RESETI() { }
- NETLIB_UPDATEI();
-
- logic_input_t m_R1;
- logic_input_t m_R2;
-
- NETLIB_SUB(7493ff) A;
- NETLIB_SUB(7493ff) B;
- NETLIB_SUB(7493ff) C;
- NETLIB_SUB(7493ff) D;
-};
-
-NETLIB_OBJECT_DERIVED(7493_dip, 7493)
-{
- NETLIB_CONSTRUCTOR_DERIVED(7493_dip, 7493)
- {
- register_subalias("1", B.m_I);
- register_subalias("2", m_R1);
- register_subalias("3", m_R2);
-
- // register_subalias("4", ); --> NC
- // register_subalias("5", ); --> VCC
- // register_subalias("6", ); --> NC
- // register_subalias("7", ); --> NC
-
- register_subalias("8", C.m_Q);
- register_subalias("9", B.m_Q);
- // register_subalias("10", ); -. GND
- register_subalias("11", D.m_Q);
- register_subalias("12", A.m_Q);
- // register_subalias("13", ); -. NC
- register_subalias("14", A.m_I);
- }
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
-
#endif /* NLD_7493_H_ */
diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp
index ceadb3c2b0d..909a862862f 100644
--- a/src/lib/netlist/devices/nld_74ls629.cpp
+++ b/src/lib/netlist/devices/nld_74ls629.cpp
@@ -40,84 +40,205 @@
#include "nld_74ls629.h"
-#include "nl_setup.h"
+#include "analog/nld_twoterm.h"
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_UPDATE(SN74LS629clk)
+namespace netlist
{
- if (!m_enableq)
+ namespace devices
{
- m_out = m_out ^ 1;
- OUTLOGIC(m_Y, m_out, m_inc);
- }
- else
+
+ NETLIB_OBJECT(SN74LS629clk)
{
- OUTLOGIC(m_Y, 1, m_inc);
- }
-}
+ NETLIB_CONSTRUCTOR(SN74LS629clk)
+ , m_enableq(1)
+ , m_out(0)
+ , m_inc(netlist_time::zero)
+ {
+ enregister("FB", m_FB);
+ enregister("Y", m_Y);
-NETLIB_UPDATE(SN74LS629)
-{
+ connect_late(m_FB, m_Y);
+
+ save(NLNAME(m_enableq));
+ save(NLNAME(m_inc));
+ save(NLNAME(m_out));
+ }
+
+ NETLIB_RESETI()
+ {
+ m_enableq = 1;
+ m_out = 0;
+ m_inc = netlist_time::zero;
+ }
+
+ NETLIB_UPDATEI();
+
+ public:
+ logic_input_t m_FB;
+ logic_output_t m_Y;
+
+ netlist_sig_t m_enableq;
+ netlist_sig_t m_out;
+ netlist_time m_inc;
+ };
+
+ NETLIB_OBJECT(SN74LS629)
{
- // recompute
- nl_double freq;
- nl_double v_freq_2, v_freq_3, v_freq_4;
- nl_double v_freq = INPANALOG(m_FC);
- nl_double v_rng = INPANALOG(m_RNG);
-
- /* coefficients */
- const nl_double k1 = 1.9904769024796283E+03;
- const nl_double k2 = 1.2070059213983407E+03;
- const nl_double k3 = 1.3266985579561108E+03;
- const nl_double k4 = -1.5500979825922698E+02;
- const nl_double k5 = 2.8184536266938172E+00;
- const nl_double k6 = -2.3503421582744556E+02;
- const nl_double k7 = -3.3836786704527788E+02;
- const nl_double k8 = -1.3569136703258670E+02;
- const nl_double k9 = 2.9914575453819188E+00;
- const nl_double k10 = 1.6855569086173170E+00;
-
- /* scale due to input resistance */
-
- /* Polyfunctional3D_model created by zunzun.com using sum of squared absolute error */
-
- v_freq_2 = v_freq * v_freq;
- v_freq_3 = v_freq_2 * v_freq;
- v_freq_4 = v_freq_3 * v_freq;
- freq = k1;
- freq += k2 * v_freq;
- freq += k3 * v_freq_2;
- freq += k4 * v_freq_3;
- freq += k5 * v_freq_4;
- freq += k6 * v_rng;
- freq += k7 * v_rng * v_freq;
- freq += k8 * v_rng * v_freq_2;
- freq += k9 * v_rng * v_freq_3;
- freq += k10 * v_rng * v_freq_4;
-
- freq *= NL_FCONST(0.1e-6) / m_CAP;
-
- // FIXME: we need a possibility to remove entries from queue ...
- // or an exact model ...
- m_clock.m_inc = netlist_time::from_double(0.5 / (double) freq);
- //m_clock.update();
-
- //NL_VERBOSE_OUT(("{1} {2} {3} {4}\n", name(), v_freq, v_rng, freq));
- }
+ NETLIB_CONSTRUCTOR(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);
+ enregister("FC", m_FC);
+ register_subalias("GND", m_R_FC.m_N);
+
+ connect_late(m_FC, m_R_FC.m_P);
+ connect_late(m_RNG, m_R_RNG.m_P);
+ connect_late(m_R_FC.m_N, m_R_RNG.m_N);
+
+ register_subalias("Y", m_clock.m_Y);
+ }
+
+ NETLIB_RESETI()
+ {
+ m_R_FC.set_R(90000.0);
+ m_R_RNG.set_R(90000.0);
+ m_clock.do_reset();
+ }
+ NETLIB_UPDATEI();
- if (!m_clock.m_enableq && INPLOGIC(m_ENQ))
+ NETLIB_UPDATE_PARAMI() { update_dev(); }
+
+ public:
+ NETLIB_SUB(SN74LS629clk) m_clock;
+ NETLIB_SUB(R_base) m_R_FC;
+ NETLIB_SUB(R_base) m_R_RNG;
+
+ logic_input_t m_ENQ;
+ analog_input_t m_RNG;
+ analog_input_t m_FC;
+
+ param_double_t m_CAP;
+ };
+
+ NETLIB_OBJECT(SN74LS629_dip)
{
- m_clock.m_enableq = 1;
- m_clock.m_out = m_clock.m_out ^ 1;
- OUTLOGIC(m_clock.m_Y, m_clock.m_out, netlist_time::from_nsec(1));
+ NETLIB_CONSTRUCTOR(SN74LS629_dip)
+ , m_1(*this, "1")
+ , m_2(*this, "2")
+ {
+ register_subalias("1", m_2.m_FC);
+ register_subalias("2", m_1.m_FC);
+ register_subalias("3", m_1.m_RNG);
+
+ register_subalias("6", m_1.m_ENQ);
+ register_subalias("7", m_1.m_clock.m_Y);
+
+ register_subalias("8", m_1.m_R_FC.m_N);
+ register_subalias("9", m_1.m_R_FC.m_N);
+ connect_late(m_1.m_R_FC.m_N, m_2.m_R_FC.m_N);
+
+ register_subalias("10", m_2.m_clock.m_Y);
+
+ register_subalias("11", m_2.m_ENQ);
+ register_subalias("14", m_2.m_RNG);
+ }
+
+ NETLIB_UPDATEI() { }
+
+ NETLIB_RESETI()
+ {
+ m_1.do_reset();
+ m_2.do_reset();
+ }
+
+ private:
+ NETLIB_SUB(SN74LS629) m_1;
+ NETLIB_SUB(SN74LS629) m_2;
+ };
+
+
+ NETLIB_UPDATE(SN74LS629clk)
+ {
+ if (!m_enableq)
+ {
+ m_out = m_out ^ 1;
+ OUTLOGIC(m_Y, m_out, m_inc);
+ }
+ else
+ {
+ OUTLOGIC(m_Y, 1, m_inc);
+ }
}
- else if (m_clock.m_enableq && !INPLOGIC(m_ENQ))
+
+ NETLIB_UPDATE(SN74LS629)
{
- m_clock.m_enableq = 0;
- m_clock.m_out = m_clock.m_out ^ 1;
- OUTLOGIC(m_clock.m_Y, m_clock.m_out, netlist_time::from_nsec(1));
+ {
+ // recompute
+ nl_double freq;
+ nl_double v_freq_2, v_freq_3, v_freq_4;
+ nl_double v_freq = INPANALOG(m_FC);
+ nl_double v_rng = INPANALOG(m_RNG);
+
+ /* coefficients */
+ const nl_double k1 = 1.9904769024796283E+03;
+ const nl_double k2 = 1.2070059213983407E+03;
+ const nl_double k3 = 1.3266985579561108E+03;
+ const nl_double k4 = -1.5500979825922698E+02;
+ const nl_double k5 = 2.8184536266938172E+00;
+ const nl_double k6 = -2.3503421582744556E+02;
+ const nl_double k7 = -3.3836786704527788E+02;
+ const nl_double k8 = -1.3569136703258670E+02;
+ const nl_double k9 = 2.9914575453819188E+00;
+ const nl_double k10 = 1.6855569086173170E+00;
+
+ /* scale due to input resistance */
+
+ /* Polyfunctional3D_model created by zunzun.com using sum of squared absolute error */
+
+ v_freq_2 = v_freq * v_freq;
+ v_freq_3 = v_freq_2 * v_freq;
+ v_freq_4 = v_freq_3 * v_freq;
+ freq = k1;
+ freq += k2 * v_freq;
+ freq += k3 * v_freq_2;
+ freq += k4 * v_freq_3;
+ freq += k5 * v_freq_4;
+ freq += k6 * v_rng;
+ freq += k7 * v_rng * v_freq;
+ freq += k8 * v_rng * v_freq_2;
+ freq += k9 * v_rng * v_freq_3;
+ freq += k10 * v_rng * v_freq_4;
+
+ freq *= NL_FCONST(0.1e-6) / m_CAP;
+
+ // FIXME: we need a possibility to remove entries from queue ...
+ // or an exact model ...
+ m_clock.m_inc = netlist_time::from_double(0.5 / (double) freq);
+ //m_clock.update();
+
+ //NL_VERBOSE_OUT(("{1} {2} {3} {4}\n", name(), v_freq, v_rng, freq));
+ }
+
+ if (!m_clock.m_enableq && INPLOGIC(m_ENQ))
+ {
+ m_clock.m_enableq = 1;
+ m_clock.m_out = m_clock.m_out ^ 1;
+ OUTLOGIC(m_clock.m_Y, m_clock.m_out, netlist_time::from_nsec(1));
+ }
+ else if (m_clock.m_enableq && !INPLOGIC(m_ENQ))
+ {
+ m_clock.m_enableq = 0;
+ m_clock.m_out = m_clock.m_out ^ 1;
+ OUTLOGIC(m_clock.m_Y, m_clock.m_out, netlist_time::from_nsec(1));
+ }
}
-}
-NETLIB_NAMESPACE_DEVICES_END()
+ NETLIB_DEVICE_IMPL(SN74LS629)
+ NETLIB_DEVICE_IMPL(SN74LS629_dip)
+
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74ls629.h b/src/lib/netlist/devices/nld_74ls629.h
index f0805f03681..273436f09fa 100644
--- a/src/lib/netlist/devices/nld_74ls629.h
+++ b/src/lib/netlist/devices/nld_74ls629.h
@@ -28,134 +28,15 @@
#ifndef NLD_74LS629_H_
#define NLD_74LS629_H_
-#include "nl_base.h"
-#include "analog/nld_twoterm.h"
+#include "nl_setup.h"
-#define SN74LS629(name, p_cap) \
- NET_REGISTER_DEV(SN74LS629, name) \
+#define SN74LS629(name, p_cap) \
+ NET_REGISTER_DEV(SN74LS629, name) \
NETDEV_PARAMI(name, CAP, p_cap)
-#define SN74LS629_DIP(name, p_cap1, p_cap2) \
- NET_REGISTER_DEV(SN74LS629_DIP, name) \
- NETDEV_PARAMI(name, 1.CAP, p_cap1) \
+#define SN74LS629_DIP(name, p_cap1, p_cap2) \
+ NET_REGISTER_DEV(SN74LS629_DIP, name) \
+ NETDEV_PARAMI(name, 1.CAP, p_cap1) \
NETDEV_PARAMI(name, 2.CAP, p_cap2)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(SN74LS629clk)
-{
- NETLIB_CONSTRUCTOR(SN74LS629clk)
- , 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));
- save(NLNAME(m_inc));
- save(NLNAME(m_out));
- }
-
- NETLIB_RESETI()
- {
- m_enableq = 1;
- m_out = 0;
- m_inc = netlist_time::zero;
- }
-
- NETLIB_UPDATEI();
-
-public:
- logic_input_t m_FB;
- logic_output_t m_Y;
-
- netlist_sig_t m_enableq;
- netlist_sig_t m_out;
- netlist_time m_inc;
-};
-
-NETLIB_OBJECT(SN74LS629)
-{
- NETLIB_CONSTRUCTOR(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);
- enregister("FC", m_FC);
- register_subalias("GND", m_R_FC.m_N);
-
- connect_late(m_FC, m_R_FC.m_P);
- connect_late(m_RNG, m_R_RNG.m_P);
- connect_late(m_R_FC.m_N, m_R_RNG.m_N);
-
- register_subalias("Y", m_clock.m_Y);
- }
-
- NETLIB_RESETI()
- {
- m_R_FC.set_R(90000.0);
- m_R_RNG.set_R(90000.0);
- m_clock.do_reset();
- }
- NETLIB_UPDATEI();
-
- NETLIB_UPDATE_PARAMI() { update_dev(); }
-
-public:
- NETLIB_SUB(SN74LS629clk) m_clock;
- NETLIB_SUB(R_base) m_R_FC;
- NETLIB_SUB(R_base) m_R_RNG;
-
- logic_input_t m_ENQ;
- analog_input_t m_RNG;
- analog_input_t m_FC;
-
- param_double_t m_CAP;
-};
-
-NETLIB_OBJECT(SN74LS629_dip)
-{
- NETLIB_CONSTRUCTOR(SN74LS629_dip)
- , m_1(*this, "1")
- , m_2(*this, "2")
- {
- register_subalias("1", m_2.m_FC);
- register_subalias("2", m_1.m_FC);
- register_subalias("3", m_1.m_RNG);
-
- register_subalias("6", m_1.m_ENQ);
- register_subalias("7", m_1.m_clock.m_Y);
-
- register_subalias("8", m_1.m_R_FC.m_N);
- register_subalias("9", m_1.m_R_FC.m_N);
- connect_late(m_1.m_R_FC.m_N, m_2.m_R_FC.m_N);
-
- register_subalias("10", m_2.m_clock.m_Y);
-
- register_subalias("11", m_2.m_ENQ);
- register_subalias("14", m_2.m_RNG);
- }
-
- NETLIB_UPDATEI() { }
-
- NETLIB_RESETI()
- {
- m_1.do_reset();
- m_2.do_reset();
- }
-
-private:
- NETLIB_SUB(SN74LS629) m_1;
- NETLIB_SUB(SN74LS629) m_2;
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
-
#endif /* NLD_74LS629_H_ */
diff --git a/src/lib/netlist/devices/nld_82S16.cpp b/src/lib/netlist/devices/nld_82S16.cpp
index 84eceda8c80..8fefb52e43c 100644
--- a/src/lib/netlist/devices/nld_82S16.cpp
+++ b/src/lib/netlist/devices/nld_82S16.cpp
@@ -7,42 +7,115 @@
#include "nld_82S16.h"
-NETLIB_NAMESPACE_DEVICES_START()
-
-// FIXME: timing!
-// FIXME: optimize device (separate address decoder!)
-NETLIB_UPDATE(82S16)
+namespace netlist
{
- if (INPLOGIC(m_CE1Q) || INPLOGIC(m_CE2Q) || INPLOGIC(m_CE3Q))
+ namespace devices
{
- // FIXME: Outputs are tristate. This needs to be properly implemented
- OUTLOGIC(m_DOUTQ, 1, NLTIME_FROM_NS(20));
- //for (int i=0; i<8; i++)
- //m_A[i].inactivate();
- }
- else
+
+ NETLIB_OBJECT(82S16)
+ {
+ NETLIB_CONSTRUCTOR(82S16)
+ {
+ 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];
+ logic_input_t m_CE1Q;
+ logic_input_t m_CE2Q;
+ logic_input_t m_CE3Q;
+ logic_input_t m_WEQ;
+ logic_input_t m_DIN;
+ logic_output_t m_DOUTQ;
+
+ //netlist_state_t<UINT8[256]> m_ram;
+ UINT64 m_ram[4]; // 256 bits
+ };
+
+ NETLIB_OBJECT_DERIVED(82S16_dip, 82S16)
{
- unsigned int adr = 0;
- for (int i=0; i<8; i++)
+ NETLIB_CONSTRUCTOR_DERIVED(82S16_dip, 82S16)
{
- //m_A[i].activate();
- adr |= (INPLOGIC(m_A[i]) << i);
+ 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);
}
+ };
- if (!INPLOGIC(m_WEQ))
+ // FIXME: timing!
+ // FIXME: optimize device (separate address decoder!)
+ NETLIB_UPDATE(82S16)
+ {
+ if (INPLOGIC(m_CE1Q) || INPLOGIC(m_CE2Q) || INPLOGIC(m_CE3Q))
{
- m_ram[adr >> 6] = (m_ram[adr >> 6] & ~((UINT64) 1 << (adr & 0x3f))) | ((UINT64) INPLOGIC(m_DIN) << (adr & 0x3f));
+ // FIXME: Outputs are tristate. This needs to be properly implemented
+ OUTLOGIC(m_DOUTQ, 1, NLTIME_FROM_NS(20));
+ //for (int i=0; i<8; i++)
+ //m_A[i].inactivate();
+ }
+ else
+ {
+ unsigned int adr = 0;
+ for (int i=0; i<8; i++)
+ {
+ //m_A[i].activate();
+ adr |= (INPLOGIC(m_A[i]) << i);
+ }
+
+ if (!INPLOGIC(m_WEQ))
+ {
+ m_ram[adr >> 6] = (m_ram[adr >> 6] & ~((UINT64) 1 << (adr & 0x3f))) | ((UINT64) INPLOGIC(m_DIN) << (adr & 0x3f));
+ }
+ OUTLOGIC(m_DOUTQ, ((m_ram[adr >> 6] >> (adr & 0x3f)) & 1) ^ 1, NLTIME_FROM_NS(20));
}
- OUTLOGIC(m_DOUTQ, ((m_ram[adr >> 6] >> (adr & 0x3f)) & 1) ^ 1, NLTIME_FROM_NS(20));
}
-}
-NETLIB_RESET(82S16)
-{
- for (int i=0; i<4; i++)
+ NETLIB_RESET(82S16)
{
- m_ram[i] = 0;
+ for (int i=0; i<4; i++)
+ {
+ m_ram[i] = 0;
+ }
}
-}
-NETLIB_NAMESPACE_DEVICES_END()
+ NETLIB_DEVICE_IMPL(82S16)
+ NETLIB_DEVICE_IMPL(82S16_dip)
+
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_82S16.h b/src/lib/netlist/devices/nld_82S16.h
index 769e2324964..cfdd84584c6 100644
--- a/src/lib/netlist/devices/nld_82S16.h
+++ b/src/lib/netlist/devices/nld_82S16.h
@@ -24,81 +24,11 @@
#ifndef NLD_82S16_H_
#define NLD_82S16_H_
-#include "nl_base.h"
+#include "nl_setup.h"
#define TTL_82S16(name) \
NET_REGISTER_DEV(TTL_82S16, name)
#define TTL_82S16_DIP(name) \
NET_REGISTER_DEV(TTL_82S16_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(82S16)
-{
- NETLIB_CONSTRUCTOR(82S16)
- {
- 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];
- logic_input_t m_CE1Q;
- logic_input_t m_CE2Q;
- logic_input_t m_CE3Q;
- logic_input_t m_WEQ;
- logic_input_t m_DIN;
- logic_output_t m_DOUTQ;
-
- //netlist_state_t<UINT8[256]> m_ram;
- UINT64 m_ram[4]; // 256 bits
-};
-
-NETLIB_OBJECT_DERIVED(82S16_dip, 82S16)
-{
- 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);
- }
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_82S16_H_ */
diff --git a/src/lib/netlist/devices/nld_9310.cpp b/src/lib/netlist/devices/nld_9310.cpp
index fd4d6434479..24a9a9c440c 100644
--- a/src/lib/netlist/devices/nld_9310.cpp
+++ b/src/lib/netlist/devices/nld_9310.cpp
@@ -9,142 +9,277 @@
#define MAXCNT 9
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_RESET(9310)
+namespace netlist
{
- sub.do_reset();
- subABCD.do_reset();
-}
+ namespace devices
+ {
-NETLIB_RESET(9310_subABCD)
-{
-#if 0
- m_A.inactivate();
- m_B.inactivate();
- m_C.inactivate();
- m_D.inactivate();
-#endif
-}
-
-NETLIB_RESET(9310_sub)
-{
- m_CLK.set_state(logic_t::STATE_INP_LH);
- m_cnt = 0;
- m_loadq = 1;
- m_ent = 1;
-}
+ NETLIB_OBJECT(9310_subABCD)
+ {
+ NETLIB_CONSTRUCTOR(9310_subABCD)
+ {
+ enregister("A", m_A);
+ enregister("B", m_B);
+ enregister("C", m_C);
+ enregister("D", m_D);
+ }
-NETLIB_UPDATE(9310_sub)
-{
- if (m_loadq)
+ NETLIB_RESETI();
+ //NETLIB_UPDATEI();
+
+ public:
+ logic_input_t m_A;
+ logic_input_t m_B;
+ logic_input_t m_C;
+ logic_input_t m_D;
+
+ ATTR_HOT inline UINT8 read_ABCD() const
+ {
+ //return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
+ return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
+ }
+ };
+
+ NETLIB_OBJECT(9310_sub)
{
-#if 0
- m_cnt = (m_cnt < MAXCNT) ? m_cnt + 1 : 0;
- update_outputs(m_cnt);
- OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(20));
-#else
- switch (m_cnt)
+ NETLIB_CONSTRUCTOR(9310_sub)
+ , m_cnt(0)
+ , m_ABCD(nullptr)
+ , m_loadq(0)
+ , m_ent(0)
{
- case MAXCNT - 1:
- m_cnt = MAXCNT;
- OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20));
- OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20));
- break;
- case MAXCNT:
- OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20));
- m_cnt = 0;
- update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
- break;
- default:
- m_cnt++;
- update_outputs(m_cnt);
+ 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));
}
-#endif
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+ public:
+ ATTR_HOT inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay);
+ ATTR_HOT inline void update_outputs(const UINT8 cnt);
+
+ 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;
+ };
+
+ NETLIB_OBJECT(9310)
+ {
+ NETLIB_CONSTRUCTOR(9310)
+ , subABCD(*this, "subABCD")
+ , sub(*this, "sub")
+ {
+ 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);
+ register_subalias("D", subABCD.m_D);
+
+ register_subalias("QA", sub.m_QA);
+ register_subalias("QB", sub.m_QB);
+ register_subalias("QC", sub.m_QC);
+ register_subalias("QD", sub.m_QD);
+ register_subalias("RC", sub.m_RC);
+ }
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ public:
+ NETLIB_SUB(9310_subABCD) subABCD;
+ NETLIB_SUB(9310_sub) sub;
+ logic_input_t m_ENP;
+ logic_input_t m_ENT;
+ logic_input_t m_CLRQ;
+ logic_input_t m_LOADQ;
+ };
+
+ NETLIB_OBJECT_DERIVED(9310_dip, 9310)
+ {
+ NETLIB_CONSTRUCTOR_DERIVED(9310_dip, 9310)
+ {
+ register_subalias("1", m_CLRQ);
+ register_subalias("2", sub.m_CLK);
+ register_subalias("3", subABCD.m_A);
+ register_subalias("4", subABCD.m_B);
+ register_subalias("5", subABCD.m_C);
+ register_subalias("6", subABCD.m_D);
+ register_subalias("7", m_ENP);
+ // register_subalias("8", ); -. GND
+
+ register_subalias("9", m_LOADQ);
+ register_subalias("10", m_ENT);
+ register_subalias("11", sub.m_QD);
+ register_subalias("12", sub.m_QC);
+ register_subalias("13", sub.m_QB);
+ register_subalias("14", sub.m_QA);
+ register_subalias("15", sub.m_RC);
+ // register_subalias("16", ); -. VCC
+ }
+ };
+
+ NETLIB_RESET(9310)
+ {
+ sub.do_reset();
+ subABCD.do_reset();
}
- else
+
+ NETLIB_RESET(9310_subABCD)
{
- m_cnt = m_ABCD->read_ABCD();
- update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
- OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ #if 0
+ m_A.inactivate();
+ m_B.inactivate();
+ m_C.inactivate();
+ m_D.inactivate();
+ #endif
}
-}
-NETLIB_UPDATE(9310)
-{
- sub.m_loadq = INPLOGIC(m_LOADQ);
- sub.m_ent = INPLOGIC(m_ENT);
- const netlist_sig_t clrq = INPLOGIC(m_CLRQ);
+ NETLIB_RESET(9310_sub)
+ {
+ m_CLK.set_state(logic_t::STATE_INP_LH);
+ m_cnt = 0;
+ m_loadq = 1;
+ m_ent = 1;
+ }
- if ((!sub.m_loadq || (sub.m_ent & INPLOGIC(m_ENP))) && clrq)
+ NETLIB_UPDATE(9310_sub)
{
- sub.m_CLK.activate_lh();
- OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ if (m_loadq)
+ {
+ #if 0
+ m_cnt = (m_cnt < MAXCNT) ? m_cnt + 1 : 0;
+ update_outputs(m_cnt);
+ OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(20));
+ #else
+ switch (m_cnt)
+ {
+ case MAXCNT - 1:
+ m_cnt = MAXCNT;
+ OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20));
+ OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20));
+ break;
+ case MAXCNT:
+ OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20));
+ m_cnt = 0;
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
+ break;
+ default:
+ m_cnt++;
+ update_outputs(m_cnt);
+ }
+ #endif
+ }
+ else
+ {
+ m_cnt = m_ABCD->read_ABCD();
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
+ OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ }
}
- else
+
+ NETLIB_UPDATE(9310)
{
- sub.m_CLK.inactivate();
- if (!clrq && (sub.m_cnt>0))
+ sub.m_loadq = INPLOGIC(m_LOADQ);
+ sub.m_ent = INPLOGIC(m_ENT);
+ const netlist_sig_t clrq = INPLOGIC(m_CLRQ);
+
+ if ((!sub.m_loadq || (sub.m_ent & INPLOGIC(m_ENP))) && clrq)
+ {
+ sub.m_CLK.activate_lh();
+ OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ }
+ else
{
- sub.update_outputs_all(0, NLTIME_FROM_NS(36));
- sub.m_cnt = 0;
- //return;
+ sub.m_CLK.inactivate();
+ if (!clrq && (sub.m_cnt>0))
+ {
+ sub.update_outputs_all(0, NLTIME_FROM_NS(36));
+ sub.m_cnt = 0;
+ //return;
+ }
+ OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
- OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
-}
-inline NETLIB_FUNC_VOID(9310_sub, update_outputs_all, (const UINT8 cnt, const netlist_time out_delay))
-{
- OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
- OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
- OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
- OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
-}
+ inline NETLIB_FUNC_VOID(9310_sub, update_outputs_all, (const UINT8 cnt, const netlist_time out_delay))
+ {
+ OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
+ OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
+ OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
+ OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
+ }
-inline NETLIB_FUNC_VOID(9310_sub, update_outputs, (const UINT8 cnt))
-{
- /* static */ const netlist_time out_delay = NLTIME_FROM_NS(20);
-#if 0
-// for (int i=0; i<4; i++)
-// OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]);
- OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
- OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
- OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
- OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
-#else
- if ((cnt & 1) == 1)
- OUTLOGIC(m_QA, 1, out_delay);
- else
+ inline NETLIB_FUNC_VOID(9310_sub, update_outputs, (const UINT8 cnt))
{
- OUTLOGIC(m_QA, 0, out_delay);
- switch (cnt)
+ /* static */ const netlist_time out_delay = NLTIME_FROM_NS(20);
+ #if 0
+ // for (int i=0; i<4; i++)
+ // OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]);
+ OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
+ OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
+ OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
+ OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
+ #else
+ if ((cnt & 1) == 1)
+ OUTLOGIC(m_QA, 1, out_delay);
+ else
{
- case 0x00:
- OUTLOGIC(m_QB, 0, out_delay);
- OUTLOGIC(m_QC, 0, out_delay);
- OUTLOGIC(m_QD, 0, out_delay);
- break;
- case 0x02:
- case 0x06:
- case 0x0A:
- case 0x0E:
- OUTLOGIC(m_QB, 1, out_delay);
- break;
- case 0x04:
- case 0x0C:
- OUTLOGIC(m_QB, 0, out_delay);
- OUTLOGIC(m_QC, 1, out_delay);
- break;
- case 0x08:
- OUTLOGIC(m_QB, 0, out_delay);
- OUTLOGIC(m_QC, 0, out_delay);
- OUTLOGIC(m_QD, 1, out_delay);
- break;
- }
+ OUTLOGIC(m_QA, 0, out_delay);
+ switch (cnt)
+ {
+ case 0x00:
+ OUTLOGIC(m_QB, 0, out_delay);
+ OUTLOGIC(m_QC, 0, out_delay);
+ OUTLOGIC(m_QD, 0, out_delay);
+ break;
+ case 0x02:
+ case 0x06:
+ case 0x0A:
+ case 0x0E:
+ OUTLOGIC(m_QB, 1, out_delay);
+ break;
+ case 0x04:
+ case 0x0C:
+ OUTLOGIC(m_QB, 0, out_delay);
+ OUTLOGIC(m_QC, 1, out_delay);
+ break;
+ case 0x08:
+ OUTLOGIC(m_QB, 0, out_delay);
+ OUTLOGIC(m_QC, 0, out_delay);
+ OUTLOGIC(m_QD, 1, out_delay);
+ break;
+ }
+ }
+ #endif
}
-#endif
-}
-NETLIB_NAMESPACE_DEVICES_END()
+ NETLIB_DEVICE_IMPL(9310)
+ NETLIB_DEVICE_IMPL(9310_dip)
+
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_9310.h b/src/lib/netlist/devices/nld_9310.h
index 3c4fbb22847..4df8a2d03a0 100644
--- a/src/lib/netlist/devices/nld_9310.h
+++ b/src/lib/netlist/devices/nld_9310.h
@@ -45,152 +45,21 @@
#ifndef NLD_9310_H_
#define NLD_9310_H_
-#include "nl_base.h"
-
-#define TTL_9310(name, cCLK, cENP, cENT, cCLRQ, cLOADQ, cA, cB, cC, cD) \
- NET_REGISTER_DEV(TTL_9310, name) \
- NET_CONNECT(name, CLK, cCLK) \
- NET_CONNECT(name, ENP, cENP) \
- NET_CONNECT(name, ENT, cENT) \
- NET_CONNECT(name, CLRQ, cCLRQ) \
- NET_CONNECT(name, LOADQ,_LOADQ) \
- NET_CONNECT(name, A, cA) \
- NET_CONNECT(name, B, cB) \
- NET_CONNECT(name, C, cC) \
+#include "nl_setup.h"
+
+#define TTL_9310(name, cCLK, cENP, cENT, cCLRQ, cLOADQ, cA, cB, cC, cD) \
+ NET_REGISTER_DEV(TTL_9310, name) \
+ NET_CONNECT(name, CLK, cCLK) \
+ NET_CONNECT(name, ENP, cENP) \
+ NET_CONNECT(name, ENT, cENT) \
+ NET_CONNECT(name, CLRQ, cCLRQ) \
+ NET_CONNECT(name, LOADQ,_LOADQ) \
+ NET_CONNECT(name, A, cA) \
+ NET_CONNECT(name, B, cB) \
+ NET_CONNECT(name, C, cC) \
NET_CONNECT(name, D, cD)
-#define TTL_9310_DIP(name) \
+#define TTL_9310_DIP(name) \
NET_REGISTER_DEV(TTL_9310_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(9310_subABCD)
-{
- NETLIB_CONSTRUCTOR(9310_subABCD)
- {
- enregister("A", m_A);
- enregister("B", m_B);
- enregister("C", m_C);
- enregister("D", m_D);
- }
-
- NETLIB_RESETI();
- //NETLIB_UPDATEI();
-
-public:
- logic_input_t m_A;
- logic_input_t m_B;
- logic_input_t m_C;
- logic_input_t m_D;
-
- ATTR_HOT inline UINT8 read_ABCD() const
- {
- //return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
- return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
- }
-};
-
-NETLIB_OBJECT(9310_sub)
-{
- NETLIB_CONSTRUCTOR(9310_sub)
- , 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));
- save(NLNAME(m_ent));
- }
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-public:
- ATTR_HOT inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay);
- ATTR_HOT inline void update_outputs(const UINT8 cnt);
-
- 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;
-};
-
-NETLIB_OBJECT(9310)
-{
- NETLIB_CONSTRUCTOR(9310)
- , subABCD(*this, "subABCD")
- , sub(*this, "sub")
- {
- 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);
- register_subalias("D", subABCD.m_D);
-
- register_subalias("QA", sub.m_QA);
- register_subalias("QB", sub.m_QB);
- register_subalias("QC", sub.m_QC);
- register_subalias("QD", sub.m_QD);
- register_subalias("RC", sub.m_RC);
- }
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-public:
- NETLIB_SUB(9310_subABCD) subABCD;
- NETLIB_SUB(9310_sub) sub;
- logic_input_t m_ENP;
- logic_input_t m_ENT;
- logic_input_t m_CLRQ;
- logic_input_t m_LOADQ;
-};
-
-NETLIB_OBJECT_DERIVED(9310_dip, 9310)
-{
- NETLIB_CONSTRUCTOR_DERIVED(9310_dip, 9310)
- {
- register_subalias("1", m_CLRQ);
- register_subalias("2", sub.m_CLK);
- register_subalias("3", subABCD.m_A);
- register_subalias("4", subABCD.m_B);
- register_subalias("5", subABCD.m_C);
- register_subalias("6", subABCD.m_D);
- register_subalias("7", m_ENP);
- // register_subalias("8", ); -. GND
-
- register_subalias("9", m_LOADQ);
- register_subalias("10", m_ENT);
- register_subalias("11", sub.m_QD);
- register_subalias("12", sub.m_QC);
- register_subalias("13", sub.m_QB);
- register_subalias("14", sub.m_QA);
- register_subalias("15", sub.m_RC);
- // register_subalias("16", ); -. VCC
- }
-};
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_9310_H_ */
diff --git a/src/lib/netlist/devices/nld_9312.cpp b/src/lib/netlist/devices/nld_9312.cpp
index 1c5798f9286..8affb42a12f 100644
--- a/src/lib/netlist/devices/nld_9312.cpp
+++ b/src/lib/netlist/devices/nld_9312.cpp
@@ -21,107 +21,193 @@
* +---+---+---+---++---+---+
*/
#include "nld_9312.h"
+#include "nld_truthtable.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
-#if (1 && USE_TRUTHTABLE)
-nld_9312::truthtable_t nld_9312::m_ttbl;
+ #if (USE_TRUTHTABLE)
+ /* The truthtable implementation is a lot faster than
+ * the carefully crafted code :-(
+ */
+ NETLIB_TRUTHTABLE(9312, 12, 2, 0);
+ #else
-/* FIXME: Data changes are propagating faster than changing selects A,B,C
- * Please refer to data sheet.
- * This would require a state machine, thus we do not
- * do this right now.
- */
+ NETLIB_DEVICE(9312,
+ public:
+ // C, B, A, G,D0,D1,D2,D3,D4,D5,D6,D7| Y,YQ
+ logic_input_t m_A;
+ logic_input_t m_B;
+ logic_input_t m_C;
+ logic_input_t m_G;
+ logic_input_t m_D[8];
+ logic_output_t m_Y;
+ logic_output_t m_YQ;
-const char *nld_9312::m_desc[] = {
- " C, B, A, G,D0,D1,D2,D3,D4,D5,D6,D7| Y,YQ",
- " X, X, X, 1, X, X, X, X, X, X, X, X| 0, 1|33,19",
- " 0, 0, 0, 0, 0, X, X, X, X, X, X, X| 0, 1|33,28",
- " 0, 0, 0, 0, 1, X, X, X, X, X, X, X| 1, 0|33,28",
- " 0, 0, 1, 0, X, 0, X, X, X, X, X, X| 0, 1|33,28",
- " 0, 0, 1, 0, X, 1, X, X, X, X, X, X| 1, 0|33,28",
- " 0, 1, 0, 0, X, X, 0, X, X, X, X, X| 0, 1|33,28",
- " 0, 1, 0, 0, X, X, 1, X, X, X, X, X| 1, 0|33,28",
- " 0, 1, 1, 0, X, X, X, 0, X, X, X, X| 0, 1|33,28",
- " 0, 1, 1, 0, X, X, X, 1, X, X, X, X| 1, 0|33,28",
- " 1, 0, 0, 0, X, X, X, X, 0, X, X, X| 0, 1|33,28",
- " 1, 0, 0, 0, X, X, X, X, 1, X, X, X| 1, 0|33,28",
- " 1, 0, 1, 0, X, X, X, X, X, 0, X, X| 0, 1|33,28",
- " 1, 0, 1, 0, X, X, X, X, X, 1, X, X| 1, 0|33,28",
- " 1, 1, 0, 0, X, X, X, X, X, X, 0, X| 0, 1|33,28",
- " 1, 1, 0, 0, X, X, X, X, X, X, 1, X| 1, 0|33,28",
- " 1, 1, 1, 0, X, X, X, X, X, X, X, 0| 0, 1|33,28",
- " 1, 1, 1, 0, X, X, X, X, X, X, X, 1| 1, 0|33,28",
- ""
-};
-#else
-
-NETLIB_UPDATE(9312)
-{
- const UINT8 G = INPLOGIC(m_G);
- if (G)
+ UINT8 m_last_chan;
+ UINT8 m_last_G;
+ );
+
+ #endif
+
+ NETLIB_OBJECT(9312_dip)
{
- /* static */ const netlist_time delay[2] = { NLTIME_FROM_NS(33), NLTIME_FROM_NS(19) };
- OUTLOGIC(m_Y, 0, delay[0]);
- OUTLOGIC(m_YQ, 1, delay[1]);
-
- m_A.inactivate();
- m_B.inactivate();
- m_C.inactivate();
- m_last_G = G;
- }
- else
+ NETLIB_CONSTRUCTOR(9312_dip)
+ , m_sub(*this, "1")
+ {
+ #if (1 && USE_TRUTHTABLE)
+
+ register_subalias("13", m_sub.m_I[0]);
+ register_subalias("12", m_sub.m_I[1]);
+ register_subalias("11", m_sub.m_I[2]);
+ register_subalias("10", m_sub.m_I[3]);
+
+ register_subalias("1", m_sub.m_I[4]);
+ register_subalias("2", m_sub.m_I[5]);
+ register_subalias("3", m_sub.m_I[6]);
+ register_subalias("4", m_sub.m_I[7]);
+ register_subalias("5", m_sub.m_I[8]);
+ register_subalias("6", m_sub.m_I[9]);
+ register_subalias("7", m_sub.m_I[10]);
+ register_subalias("9", m_sub.m_I[11]);
+
+ register_subalias("15", m_sub.m_Q[0]); // Y
+ register_subalias("14", m_sub.m_Q[1]); // YQ
+
+ #else
+
+ register_subalias("13", m_sub.m_C);
+ register_subalias("12", m_sub.m_B);
+ register_subalias("11", m_sub.m_A);
+ register_subalias("10", m_sub.m_G);
+
+ register_subalias("1", m_sub.m_D[0]);
+ register_subalias("2", m_sub.m_D[1]);
+ register_subalias("3", m_sub.m_D[2]);
+ register_subalias("4", m_sub.m_D[3]);
+ register_subalias("5", m_sub.m_D[4]);
+ register_subalias("6", m_sub.m_D[5]);
+ register_subalias("7", m_sub.m_D[6]);
+ register_subalias("9", m_sub.m_D[7]);
+
+ register_subalias("15", m_sub.m_Y); // Y
+ register_subalias("14", m_sub.m_YQ); // YQ
+
+ #endif
+
+ }
+
+ //NETLIB_RESETI();
+ //NETLIB_UPDATEI();
+
+ protected:
+ NETLIB_SUB(9312) m_sub;
+ };
+
+ #if (1 && USE_TRUTHTABLE)
+ nld_9312::truthtable_t nld_9312::m_ttbl;
+
+ /* FIXME: Data changes are propagating faster than changing selects A,B,C
+ * Please refer to data sheet.
+ * This would require a state machine, thus we do not
+ * do this right now.
+ */
+
+ const char *nld_9312::m_desc[] = {
+ " C, B, A, G,D0,D1,D2,D3,D4,D5,D6,D7| Y,YQ",
+ " X, X, X, 1, X, X, X, X, X, X, X, X| 0, 1|33,19",
+ " 0, 0, 0, 0, 0, X, X, X, X, X, X, X| 0, 1|33,28",
+ " 0, 0, 0, 0, 1, X, X, X, X, X, X, X| 1, 0|33,28",
+ " 0, 0, 1, 0, X, 0, X, X, X, X, X, X| 0, 1|33,28",
+ " 0, 0, 1, 0, X, 1, X, X, X, X, X, X| 1, 0|33,28",
+ " 0, 1, 0, 0, X, X, 0, X, X, X, X, X| 0, 1|33,28",
+ " 0, 1, 0, 0, X, X, 1, X, X, X, X, X| 1, 0|33,28",
+ " 0, 1, 1, 0, X, X, X, 0, X, X, X, X| 0, 1|33,28",
+ " 0, 1, 1, 0, X, X, X, 1, X, X, X, X| 1, 0|33,28",
+ " 1, 0, 0, 0, X, X, X, X, 0, X, X, X| 0, 1|33,28",
+ " 1, 0, 0, 0, X, X, X, X, 1, X, X, X| 1, 0|33,28",
+ " 1, 0, 1, 0, X, X, X, X, X, 0, X, X| 0, 1|33,28",
+ " 1, 0, 1, 0, X, X, X, X, X, 1, X, X| 1, 0|33,28",
+ " 1, 1, 0, 0, X, X, X, X, X, X, 0, X| 0, 1|33,28",
+ " 1, 1, 0, 0, X, X, X, X, X, X, 1, X| 1, 0|33,28",
+ " 1, 1, 1, 0, X, X, X, X, X, X, X, 0| 0, 1|33,28",
+ " 1, 1, 1, 0, X, X, X, X, X, X, X, 1| 1, 0|33,28",
+ ""
+ };
+ #else
+
+ NETLIB_UPDATE(9312)
{
- if (m_last_G)
+ const UINT8 G = INPLOGIC(m_G);
+ if (G)
{
+ /* static */ const netlist_time delay[2] = { NLTIME_FROM_NS(33), NLTIME_FROM_NS(19) };
+ OUTLOGIC(m_Y, 0, delay[0]);
+ OUTLOGIC(m_YQ, 1, delay[1]);
+
+ m_A.inactivate();
+ m_B.inactivate();
+ m_C.inactivate();
m_last_G = G;
- m_A.activate();
- m_B.activate();
- m_C.activate();
}
- /* static */ const netlist_time delay[2] = { NLTIME_FROM_NS(33), NLTIME_FROM_NS(28) };
- const UINT8 chan = INPLOGIC(m_A) | (INPLOGIC(m_B)<<1) | (INPLOGIC(m_C)<<2);
- if (m_last_chan != chan)
+ else
{
- m_D[m_last_chan].inactivate();
- m_D[chan].activate();
+ if (m_last_G)
+ {
+ m_last_G = G;
+ m_A.activate();
+ m_B.activate();
+ m_C.activate();
+ }
+ /* static */ const netlist_time delay[2] = { NLTIME_FROM_NS(33), NLTIME_FROM_NS(28) };
+ const UINT8 chan = INPLOGIC(m_A) | (INPLOGIC(m_B)<<1) | (INPLOGIC(m_C)<<2);
+ if (m_last_chan != chan)
+ {
+ m_D[m_last_chan].inactivate();
+ m_D[chan].activate();
+ }
+ const UINT8 val = INPLOGIC(m_D[chan]);
+ OUTLOGIC(m_Y, val, delay[val]);
+ OUTLOGIC(m_YQ, !val, delay[!val]);
+ m_last_chan = chan;
}
- const UINT8 val = INPLOGIC(m_D[chan]);
- OUTLOGIC(m_Y, val, delay[val]);
- OUTLOGIC(m_YQ, !val, delay[!val]);
- m_last_chan = chan;
}
-}
-NETLIB_START(9312)
-{
- register_input("G", m_G);
- register_input("A", m_A);
- register_input("B", m_B);
- register_input("C", m_C);
-
- register_input("D0", m_D[0]);
- register_input("D1", m_D[1]);
- register_input("D2", m_D[2]);
- register_input("D3", m_D[3]);
- register_input("D4", m_D[4]);
- register_input("D5", m_D[5]);
- register_input("D6", m_D[6]);
- register_input("D7", m_D[7]);
-
- register_output("Y", m_Y);
- register_output("YQ", m_YQ);
-
- m_last_chan = 0;
- m_last_G = 0;
-
- save(NLNAME(m_last_chan));
- save(NLNAME(m_last_G));
-}
-
-NETLIB_RESET(9312)
-{
-}
-#endif
+ NETLIB_START(9312)
+ {
+ register_input("G", m_G);
+ register_input("A", m_A);
+ register_input("B", m_B);
+ register_input("C", m_C);
+
+ register_input("D0", m_D[0]);
+ register_input("D1", m_D[1]);
+ register_input("D2", m_D[2]);
+ register_input("D3", m_D[3]);
+ register_input("D4", m_D[4]);
+ register_input("D5", m_D[5]);
+ register_input("D6", m_D[6]);
+ register_input("D7", m_D[7]);
+
+ register_output("Y", m_Y);
+ register_output("YQ", m_YQ);
+
+ m_last_chan = 0;
+ m_last_G = 0;
+
+ save(NLNAME(m_last_chan));
+ save(NLNAME(m_last_G));
+ }
+
+ NETLIB_RESET(9312)
+ {
+ }
+ #endif
+
+ NETLIB_DEVICE_IMPL(9312)
+ NETLIB_DEVICE_IMPL(9312_dip)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_9312.h b/src/lib/netlist/devices/nld_9312.h
index 37a2e3afcb8..a787b38e604 100644
--- a/src/lib/netlist/devices/nld_9312.h
+++ b/src/lib/netlist/devices/nld_9312.h
@@ -37,94 +37,12 @@
#ifndef NLD_9312_H_
#define NLD_9312_H_
-#include "nld_truthtable.h"
+#include "nl_setup.h"
-#define TTL_9312(name) \
+#define TTL_9312(name) \
NET_REGISTER_DEV(TTL_9312, name)
-#define TTL_9312_DIP(name) \
+#define TTL_9312_DIP(name) \
NET_REGISTER_DEV(TTL_9312_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-#if (USE_TRUTHTABLE)
-/* The truthtable implementation is a lot faster than
- * the carefully crafted code :-(
- */
-NETLIB_TRUTHTABLE(9312, 12, 2, 0);
-#else
-
-NETLIB_DEVICE(9312,
-public:
-// C, B, A, G,D0,D1,D2,D3,D4,D5,D6,D7| Y,YQ
- logic_input_t m_A;
- logic_input_t m_B;
- logic_input_t m_C;
- logic_input_t m_G;
- logic_input_t m_D[8];
- logic_output_t m_Y;
- logic_output_t m_YQ;
-
- UINT8 m_last_chan;
- UINT8 m_last_G;
-);
-
-#endif
-
-NETLIB_OBJECT(9312_dip)
-{
- NETLIB_CONSTRUCTOR(9312_dip)
- , m_sub(*this, "1")
- {
- #if (1 && USE_TRUTHTABLE)
-
- register_subalias("13", m_sub.m_I[0]);
- register_subalias("12", m_sub.m_I[1]);
- register_subalias("11", m_sub.m_I[2]);
- register_subalias("10", m_sub.m_I[3]);
-
- register_subalias("1", m_sub.m_I[4]);
- register_subalias("2", m_sub.m_I[5]);
- register_subalias("3", m_sub.m_I[6]);
- register_subalias("4", m_sub.m_I[7]);
- register_subalias("5", m_sub.m_I[8]);
- register_subalias("6", m_sub.m_I[9]);
- register_subalias("7", m_sub.m_I[10]);
- register_subalias("9", m_sub.m_I[11]);
-
- register_subalias("15", m_sub.m_Q[0]); // Y
- register_subalias("14", m_sub.m_Q[1]); // YQ
-
- #else
-
- register_subalias("13", m_sub.m_C);
- register_subalias("12", m_sub.m_B);
- register_subalias("11", m_sub.m_A);
- register_subalias("10", m_sub.m_G);
-
- register_subalias("1", m_sub.m_D[0]);
- register_subalias("2", m_sub.m_D[1]);
- register_subalias("3", m_sub.m_D[2]);
- register_subalias("4", m_sub.m_D[3]);
- register_subalias("5", m_sub.m_D[4]);
- register_subalias("6", m_sub.m_D[5]);
- register_subalias("7", m_sub.m_D[6]);
- register_subalias("9", m_sub.m_D[7]);
-
- register_subalias("15", m_sub.m_Y); // Y
- register_subalias("14", m_sub.m_YQ); // YQ
-
- #endif
-
- }
-
- //NETLIB_RESETI();
- //NETLIB_UPDATEI();
-
-protected:
- NETLIB_SUB(9312) m_sub;
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_9312_H_ */
diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp
index b7857fc4d95..bd36df284aa 100644
--- a/src/lib/netlist/devices/nld_9316.cpp
+++ b/src/lib/netlist/devices/nld_9316.cpp
@@ -9,137 +9,273 @@
#define MAXCNT 15
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_RESET(9316)
+namespace netlist
{
- sub.do_reset();
- subABCD.do_reset();
-}
+ namespace devices
+ {
-NETLIB_RESET(9316_subABCD)
-{
-#if 0
- m_A.inactivate();
- m_B.inactivate();
- m_C.inactivate();
- m_D.inactivate();
-#endif
-}
-
-NETLIB_RESET(9316_sub)
-{
- m_CLK.set_state(logic_t::STATE_INP_LH);
- m_cnt = 0;
- m_loadq = 1;
- m_ent = 1;
-}
+ NETLIB_OBJECT(9316_subABCD)
+ {
+ NETLIB_CONSTRUCTOR(9316_subABCD)
+ {
+ enregister("A", m_A);
+ enregister("B", m_B);
+ enregister("C", m_C);
+ enregister("D", m_D);
+ }
-NETLIB_UPDATE(9316_sub)
-{
- if (m_loadq)
+ NETLIB_RESETI()
+ {
+ #if 0
+ m_A.inactivate();
+ m_B.inactivate();
+ m_C.inactivate();
+ m_D.inactivate();
+ #endif
+ }
+ //NETLIB_UPDATEI();
+
+ public:
+ logic_input_t m_A;
+ logic_input_t m_B;
+ logic_input_t m_C;
+ logic_input_t m_D;
+
+ ATTR_HOT inline UINT8 read_ABCD() const
+ {
+ //return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
+ return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
+ }
+ };
+
+ NETLIB_OBJECT(9316_sub)
{
- switch (m_cnt)
+ NETLIB_CONSTRUCTOR(9316_sub)
+ , m_cnt(0)
+ , m_ABCD(nullptr)
+ , m_loadq(0)
+ , m_ent(0)
{
- case MAXCNT - 1:
- m_cnt = MAXCNT;
- OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(27));
- OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20));
- break;
- case MAXCNT:
- OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(27));
- m_cnt = 0;
- update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
- break;
- default:
- m_cnt++;
- update_outputs(m_cnt);
- break;
+ 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));
}
- }
- else
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ public:
+ ATTR_HOT inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay);
+ ATTR_HOT inline void update_outputs(const UINT8 cnt);
+
+ logic_input_t m_CLK;
+
+ 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;
+ NETLIB_NAME(9316_subABCD) *m_ABCD;
+ netlist_sig_t m_loadq;
+ netlist_sig_t m_ent;
+ };
+
+ NETLIB_OBJECT(9316)
+ {
+ NETLIB_CONSTRUCTOR(9316)
+ , sub(*this, "sub")
+ , subABCD(*this, "subABCD")
+ {
+ 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);
+ register_subalias("D", subABCD.m_D);
+
+ register_subalias("QA", sub.m_QA);
+ register_subalias("QB", sub.m_QB);
+ register_subalias("QC", sub.m_QC);
+ register_subalias("QD", sub.m_QD);
+ register_subalias("RC", sub.m_RC);
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ protected:
+ NETLIB_SUB(9316_sub) sub;
+ NETLIB_SUB(9316_subABCD) subABCD;
+ logic_input_t m_ENP;
+ logic_input_t m_ENT;
+ logic_input_t m_CLRQ;
+ logic_input_t m_LOADQ;
+ };
+
+ NETLIB_OBJECT_DERIVED(9316_dip, 9316)
+ {
+ NETLIB_CONSTRUCTOR_DERIVED(9316_dip, 9316)
+ {
+ register_subalias("1", m_CLRQ);
+ register_subalias("2", sub.m_CLK);
+ register_subalias("3", subABCD.m_A);
+ register_subalias("4", subABCD.m_B);
+ register_subalias("5", subABCD.m_C);
+ register_subalias("6", subABCD.m_D);
+ register_subalias("7", m_ENP);
+ // register_subalias("8", ); -. GND
+
+ register_subalias("9", m_LOADQ);
+ register_subalias("10", m_ENT);
+ register_subalias("11", sub.m_QD);
+ register_subalias("12", sub.m_QC);
+ register_subalias("13", sub.m_QB);
+ register_subalias("14", sub.m_QA);
+ register_subalias("15", sub.m_RC);
+ // register_subalias("16", ); -. VCC
+ }
+ };
+
+ NETLIB_RESET(9316)
{
- m_cnt = m_ABCD->read_ABCD();
- OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
- update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
+ sub.do_reset();
+ subABCD.do_reset();
}
-}
-NETLIB_UPDATE(9316)
-{
- sub.m_loadq = INPLOGIC(m_LOADQ);
- sub.m_ent = INPLOGIC(m_ENT);
- const netlist_sig_t clrq = INPLOGIC(m_CLRQ);
+ NETLIB_RESET(9316_sub)
+ {
+ m_CLK.set_state(logic_t::STATE_INP_LH);
+ m_cnt = 0;
+ m_loadq = 1;
+ m_ent = 1;
+ }
- if (((sub.m_loadq ^ 1) | (sub.m_ent & INPLOGIC(m_ENP))) & clrq)
+ NETLIB_UPDATE(9316_sub)
{
- sub.m_CLK.activate_lh();
- OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ if (m_loadq)
+ {
+ switch (m_cnt)
+ {
+ case MAXCNT - 1:
+ m_cnt = MAXCNT;
+ OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(27));
+ OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20));
+ break;
+ case MAXCNT:
+ OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(27));
+ m_cnt = 0;
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
+ break;
+ default:
+ m_cnt++;
+ update_outputs(m_cnt);
+ break;
+ }
+ }
+ else
+ {
+ m_cnt = m_ABCD->read_ABCD();
+ OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
+ }
}
- else
+
+ NETLIB_UPDATE(9316)
{
- sub.m_CLK.inactivate();
- if (!clrq && (sub.m_cnt>0))
+ sub.m_loadq = INPLOGIC(m_LOADQ);
+ sub.m_ent = INPLOGIC(m_ENT);
+ const netlist_sig_t clrq = INPLOGIC(m_CLRQ);
+
+ if (((sub.m_loadq ^ 1) | (sub.m_ent & INPLOGIC(m_ENP))) & clrq)
+ {
+ sub.m_CLK.activate_lh();
+ OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ }
+ else
{
- sub.update_outputs_all(0, NLTIME_FROM_NS(36));
- sub.m_cnt = 0;
- //return;
+ sub.m_CLK.inactivate();
+ if (!clrq && (sub.m_cnt>0))
+ {
+ sub.update_outputs_all(0, NLTIME_FROM_NS(36));
+ sub.m_cnt = 0;
+ //return;
+ }
+ OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
- OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
-}
-inline NETLIB_FUNC_VOID(9316_sub, update_outputs_all, (const UINT8 cnt, const netlist_time out_delay))
-{
- OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
- OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
- OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
- OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
-}
+ inline NETLIB_FUNC_VOID(9316_sub, update_outputs_all, (const UINT8 cnt, const netlist_time out_delay))
+ {
+ OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
+ OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
+ OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
+ OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
+ }
-inline NETLIB_FUNC_VOID(9316_sub, update_outputs, (const UINT8 cnt))
-{
- /* static */ const netlist_time out_delay = NLTIME_FROM_NS(20);
-#if 0
-// for (int i=0; i<4; i++)
-// OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]);
- OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
- OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
- OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
- OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
-#else
- if ((cnt & 1) == 1)
- OUTLOGIC(m_QA, 1, out_delay);
- else
+ inline NETLIB_FUNC_VOID(9316_sub, update_outputs, (const UINT8 cnt))
{
- OUTLOGIC(m_QA, 0, out_delay);
- switch (cnt)
+ /* static */ const netlist_time out_delay = NLTIME_FROM_NS(20);
+ #if 0
+ // for (int i=0; i<4; i++)
+ // OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]);
+ OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
+ OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
+ OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
+ OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
+ #else
+ if ((cnt & 1) == 1)
+ OUTLOGIC(m_QA, 1, out_delay);
+ else
{
- case 0x00:
- OUTLOGIC(m_QB, 0, out_delay);
- OUTLOGIC(m_QC, 0, out_delay);
- OUTLOGIC(m_QD, 0, out_delay);
- break;
- case 0x02:
- case 0x06:
- case 0x0A:
- case 0x0E:
- OUTLOGIC(m_QB, 1, out_delay);
- break;
- case 0x04:
- case 0x0C:
- OUTLOGIC(m_QB, 0, out_delay);
- OUTLOGIC(m_QC, 1, out_delay);
- break;
- case 0x08:
- OUTLOGIC(m_QB, 0, out_delay);
- OUTLOGIC(m_QC, 0, out_delay);
- OUTLOGIC(m_QD, 1, out_delay);
- break;
- }
+ OUTLOGIC(m_QA, 0, out_delay);
+ switch (cnt)
+ {
+ case 0x00:
+ OUTLOGIC(m_QB, 0, out_delay);
+ OUTLOGIC(m_QC, 0, out_delay);
+ OUTLOGIC(m_QD, 0, out_delay);
+ break;
+ case 0x02:
+ case 0x06:
+ case 0x0A:
+ case 0x0E:
+ OUTLOGIC(m_QB, 1, out_delay);
+ break;
+ case 0x04:
+ case 0x0C:
+ OUTLOGIC(m_QB, 0, out_delay);
+ OUTLOGIC(m_QC, 1, out_delay);
+ break;
+ case 0x08:
+ OUTLOGIC(m_QB, 0, out_delay);
+ OUTLOGIC(m_QC, 0, out_delay);
+ OUTLOGIC(m_QD, 1, out_delay);
+ break;
+ }
+ }
+ #endif
}
-#endif
-}
-NETLIB_NAMESPACE_DEVICES_END()
+ NETLIB_DEVICE_IMPL(9316)
+ NETLIB_DEVICE_IMPL(9316_dip)
+
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_9316.h b/src/lib/netlist/devices/nld_9316.h
index fcb9228390e..696a5dcba61 100644
--- a/src/lib/netlist/devices/nld_9316.h
+++ b/src/lib/netlist/devices/nld_9316.h
@@ -49,7 +49,7 @@
#ifndef NLD_9316_H_
#define NLD_9316_H_
-#include "nl_base.h"
+#include "nl_setup.h"
#define TTL_9316(name, cCLK, cENP, cENT, cCLRQ, cLOADQ, cA, cB, cC, cD) \
NET_REGISTER_DEV(TTL_9316, name) \
@@ -63,142 +63,7 @@
NET_CONNECT(name, C, cC) \
NET_CONNECT(name, D, cD)
-#define TTL_9316_DIP(name) \
+#define TTL_9316_DIP(name) \
NET_REGISTER_DEV(TTL_9316_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(9316_subABCD)
-{
- NETLIB_CONSTRUCTOR(9316_subABCD)
- {
- enregister("A", m_A);
- enregister("B", m_B);
- enregister("C", m_C);
- enregister("D", m_D);
- }
-
- NETLIB_RESETI();
- //NETLIB_UPDATEI();
-
-public:
- logic_input_t m_A;
- logic_input_t m_B;
- logic_input_t m_C;
- logic_input_t m_D;
-
- ATTR_HOT inline UINT8 read_ABCD() const
- {
- //return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
- return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
- }
-};
-
-NETLIB_OBJECT(9316_sub)
-{
- NETLIB_CONSTRUCTOR(9316_sub)
- , 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));
- save(NLNAME(m_ent));
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-public:
- ATTR_HOT inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay);
- ATTR_HOT inline void update_outputs(const UINT8 cnt);
-
- logic_input_t m_CLK;
-
- 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;
- NETLIB_NAME(9316_subABCD) *m_ABCD;
- netlist_sig_t m_loadq;
- netlist_sig_t m_ent;
-};
-
-NETLIB_OBJECT(9316)
-{
- NETLIB_CONSTRUCTOR(9316)
- , sub(*this, "sub")
- , subABCD(*this, "subABCD")
- {
- 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);
- register_subalias("D", subABCD.m_D);
-
- register_subalias("QA", sub.m_QA);
- register_subalias("QB", sub.m_QB);
- register_subalias("QC", sub.m_QC);
- register_subalias("QD", sub.m_QD);
- register_subalias("RC", sub.m_RC);
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-protected:
- NETLIB_SUB(9316_sub) sub;
- NETLIB_SUB(9316_subABCD) subABCD;
- logic_input_t m_ENP;
- logic_input_t m_ENT;
- logic_input_t m_CLRQ;
- logic_input_t m_LOADQ;
-};
-
-NETLIB_OBJECT_DERIVED(9316_dip, 9316)
-{
- NETLIB_CONSTRUCTOR_DERIVED(9316_dip, 9316)
- {
- register_subalias("1", m_CLRQ);
- register_subalias("2", sub.m_CLK);
- register_subalias("3", subABCD.m_A);
- register_subalias("4", subABCD.m_B);
- register_subalias("5", subABCD.m_C);
- register_subalias("6", subABCD.m_D);
- register_subalias("7", m_ENP);
- // register_subalias("8", ); -. GND
-
- register_subalias("9", m_LOADQ);
- register_subalias("10", m_ENT);
- register_subalias("11", sub.m_QD);
- register_subalias("12", sub.m_QC);
- register_subalias("13", sub.m_QB);
- register_subalias("14", sub.m_QA);
- register_subalias("15", sub.m_RC);
- // register_subalias("16", ); -. VCC
- }
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_9316_H_ */
diff --git a/src/lib/netlist/devices/nld_cmos.h b/src/lib/netlist/devices/nld_cmos.h
deleted file mode 100644
index c11887ef684..00000000000
--- a/src/lib/netlist/devices/nld_cmos.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// license:GPL-2.0+
-// copyright-holders:Couriersud
-/*
- * nld_cmos.h
- *
- */
-
-#ifndef NLD_CMOS_H_
-#define NLD_CMOS_H_
-
-#include "nl_base.h"
-#include "analog/nld_twoterm.h"
-
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(vdd_vss)
-{
- NETLIB_CONSTRUCTOR(vdd_vss)
- {
- enregister("VDD", m_vdd);
- enregister("VSS", m_vss);
- }
-
- NETLIB_UPDATEI() {};
- NETLIB_RESETI() {};
-
-public:
- ATTR_HOT inline nl_double vdd() { return INPANALOG(m_vdd); }
- ATTR_HOT inline nl_double vss() { return INPANALOG(m_vss); }
-
- analog_input_t m_vdd;
- analog_input_t m_vss;
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
-#endif /* NLD_CMOS_H_ */
diff --git a/src/lib/netlist/devices/nld_legacy.cpp b/src/lib/netlist/devices/nld_legacy.cpp
index 387330d8e95..f2ddf677d33 100644
--- a/src/lib/netlist/devices/nld_legacy.cpp
+++ b/src/lib/netlist/devices/nld_legacy.cpp
@@ -8,47 +8,104 @@
#include "nld_legacy.h"
#include "nl_setup.h"
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_RESET(nicRSFF)
+namespace netlist
{
- m_Q.initial(0);
- m_QQ.initial(1);
-}
+ namespace devices
+ {
-NETLIB_UPDATE(nicRSFF)
-{
- if (!INPLOGIC(m_S))
+ NETLIB_OBJECT(nicRSFF)
{
- OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(20));
- OUTLOGIC(m_QQ, 0, NLTIME_FROM_NS(20));
- }
- else if (!INPLOGIC(m_R))
+ NETLIB_CONSTRUCTOR(nicRSFF)
+ {
+ enregister("S", m_S);
+ enregister("R", m_R);
+ enregister("Q", m_Q);
+ enregister("QQ", m_QQ);
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ protected:
+ logic_input_t m_S;
+ logic_input_t m_R;
+
+ logic_output_t m_Q;
+ logic_output_t m_QQ;
+ };
+
+
+ NETLIB_OBJECT(nicDelay)
{
- OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(20));
- OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(20));
+ 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);
+
+ save(NLNAME(m_last));
+ }
+
+ //NETLIB_UPDATE_PARAMI();
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ protected:
+ logic_input_t m_I;
+
+ logic_output_t m_Q;
+
+ param_int_t m_L_to_H;
+ param_int_t m_H_to_L;
+
+ UINT8 m_last;
+ };
+
+ NETLIB_RESET(nicRSFF)
+ {
+ m_Q.initial(0);
+ m_QQ.initial(1);
}
-}
-NETLIB_RESET(nicDelay)
-{
- //m_Q.initial(0);
-}
+ NETLIB_UPDATE(nicRSFF)
+ {
+ if (!INPLOGIC(m_S))
+ {
+ OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(20));
+ OUTLOGIC(m_QQ, 0, NLTIME_FROM_NS(20));
+ }
+ else if (!INPLOGIC(m_R))
+ {
+ OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(20));
+ OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(20));
+ }
+ }
-NETLIB_UPDATE(nicDelay)
-{
- netlist_sig_t nval = INPLOGIC(m_I);
- if (nval && !m_last)
+ NETLIB_RESET(nicDelay)
{
- // L_to_H
- OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(m_L_to_H.Value()));
+ //m_Q.initial(0);
}
- else if (!nval && m_last)
+
+ NETLIB_UPDATE(nicDelay)
{
- // H_to_L
- OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(m_H_to_L.Value()));
+ netlist_sig_t nval = INPLOGIC(m_I);
+ if (nval && !m_last)
+ {
+ // L_to_H
+ OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(m_L_to_H.Value()));
+ }
+ else if (!nval && m_last)
+ {
+ // H_to_L
+ OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(m_H_to_L.Value()));
+ }
+ m_last = nval;
}
- m_last = nval;
-}
-NETLIB_NAMESPACE_DEVICES_END()
+ NETLIB_DEVICE_IMPL(nicRSFF)
+ NETLIB_DEVICE_IMPL(nicDelay)
+
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_legacy.h b/src/lib/netlist/devices/nld_legacy.h
index f4fdd84ca61..99a99008451 100644
--- a/src/lib/netlist/devices/nld_legacy.h
+++ b/src/lib/netlist/devices/nld_legacy.h
@@ -13,74 +13,28 @@
#ifndef NLD_LEGACY_H_
#define NLD_LEGACY_H_
-#include "nl_base.h"
-
-NETLIB_NAMESPACE_DEVICES_START()
+#include "nl_setup.h"
// ----------------------------------------------------------------------------------------
// Macros
// ----------------------------------------------------------------------------------------
-#define NETDEV_RSFF(name) \
+#define NETDEV_RSFF(name) \
NET_REGISTER_DEV(NETDEV_RSFF, name)
-#define NETDEV_DELAY(name) \
+#define NETDEV_DELAY(name) \
NET_REGISTER_DEV(NETDEV_DELAY, name)
// ----------------------------------------------------------------------------------------
// Devices ...
// ----------------------------------------------------------------------------------------
-NETLIB_OBJECT(nicRSFF)
-{
- NETLIB_CONSTRUCTOR(nicRSFF)
- {
- enregister("S", m_S);
- enregister("R", m_R);
- enregister("Q", m_Q);
- enregister("QQ", m_QQ);
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-protected:
- logic_input_t m_S;
- logic_input_t m_R;
-
- logic_output_t m_Q;
- logic_output_t m_QQ;
-};
-
-
-NETLIB_OBJECT(nicDelay)
+namespace netlist
{
- NETLIB_CONSTRUCTOR(nicDelay)
- , m_L_to_H(*this, "L_TO_H", 10)
- , m_H_to_L(*this, "H_TO_L", 10)
- , m_last(0)
+ namespace devices
{
- enregister("1", m_I);
- enregister("2", m_Q);
-
- save(NLNAME(m_last));
- }
-
- //NETLIB_UPDATE_PARAMI();
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-protected:
- logic_input_t m_I;
-
- logic_output_t m_Q;
-
- param_int_t m_L_to_H;
- param_int_t m_H_to_L;
-
- UINT8 m_last;
-};
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_LEGACY_H_ */
diff --git a/src/lib/netlist/devices/nld_log.cpp b/src/lib/netlist/devices/nld_log.cpp
index 501b6e862e5..839254f60d2 100644
--- a/src/lib/netlist/devices/nld_log.cpp
+++ b/src/lib/netlist/devices/nld_log.cpp
@@ -5,49 +5,94 @@
*
*/
+#include <memory>
+#include "nl_base.h"
+#include "plib/pstream.h"
+#include "plib/pfmtlog.h"
#include "nld_log.h"
//#include "sound/wavwrite.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
-//FIXME: what to do with save states?
+ NETLIB_OBJECT(log)
+ {
+ NETLIB_CONSTRUCTOR(log)
+ {
+ enregister("I", m_I);
-NETLIB_UPDATE(log)
-{
- /* use pstring::sprintf, it is a LOT faster */
- m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e((nl_double) INPANALOG(m_I)));
-}
+ pstring filename = plib::pfmt("{1}.log")(this->name());
+ m_strm = plib::make_unique<plib::pofilestream>(filename);
+ }
-NETLIB_NAME(log)::~NETLIB_NAME(log)()
-{
- m_strm->close();
-}
+ NETLIB_UPDATEI()
+ {
+ /* use pstring::sprintf, it is a LOT faster */
+ m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e((nl_double) INPANALOG(m_I)));
+ }
-NETLIB_UPDATE(logD)
-{
- m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e((nl_double) (INPANALOG(m_I) - INPANALOG(m_I2))));
-}
+ NETLIB_RESETI() { }
+ protected:
+ analog_input_t m_I;
+ std::unique_ptr<plib::pofilestream> m_strm;
+ };
-// FIXME: Implement wav later, this must be clock triggered device where the input to be written
-// is on a subdevice ..
-#if 0
-NETLIB_START(wav)
-{
- enregister("I", m_I);
+ NETLIB_OBJECT_DERIVED(logD, log)
+ {
+ NETLIB_CONSTRUCTOR_DERIVED(logD, log)
+ {
+ enregister("I2", m_I2);
+ }
- pstring filename = "netlist_" + name() + ".wav";
- m_file = wav_open(filename, sample_rate(), active_inputs()/2)
-}
+ NETLIB_UPDATEI()
+ {
+ m_strm->writeline(plib::pfmt("{1} {2}").e(netlist().time().as_double(),".9").e((nl_double) (INPANALOG(m_I) - INPANALOG(m_I2))));
+ }
-NETLIB_UPDATE(wav)
-{
- fprintf(m_file, "%e %e\n", netlist().time().as_double(), INPANALOG(m_I));
-}
+ NETLIB_RESETI() { }
+ analog_input_t m_I2;
+ };
-NETLIB_NAME(log)::~NETLIB_NAME(wav)()
-{
- fclose(m_file);
-}
-#endif
+ #if 0
+ NETLIB_DEVICE(wav,
+ ~NETLIB_NAME(wav)();
+ analog_input_t m_I;
+ private:
+ // FIXME: rewrite sound/wavwrite.h to be an object ...
+ void *m_file;
+ );
+ #endif
+
+ //FIXME: what to do with save states?
+
+
+ // FIXME: Implement wav later, this must be clock triggered device where the input to be written
+ // is on a subdevice ..
+ #if 0
+ NETLIB_START(wav)
+ {
+ enregister("I", m_I);
+
+ pstring filename = "netlist_" + name() + ".wav";
+ m_file = wav_open(filename, sample_rate(), active_inputs()/2)
+ }
+
+ NETLIB_UPDATE(wav)
+ {
+ fprintf(m_file, "%e %e\n", netlist().time().as_double(), INPANALOG(m_I));
+ }
+
+ NETLIB_NAME(log)::~NETLIB_NAME(wav)()
+ {
+ fclose(m_file);
+ }
+ #endif
+
+
+ NETLIB_DEVICE_IMPL(log)
+ NETLIB_DEVICE_IMPL(logD)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_log.h b/src/lib/netlist/devices/nld_log.h
index 79ef4e53ae6..716aea1b873 100644
--- a/src/lib/netlist/devices/nld_log.h
+++ b/src/lib/netlist/devices/nld_log.h
@@ -18,10 +18,7 @@
#ifndef NLD_LOG_H_
#define NLD_LOG_H_
-#include <memory>
-#include "nl_base.h"
-#include "plib/pstream.h"
-#include "plib/pfmtlog.h"
+#include "nl_setup.h"
#define LOG(name, cI) \
NET_REGISTER_DEV(??PG, name) \
@@ -32,47 +29,4 @@
NET_CONNECT(name, I, cI) \
NET_CONNECT(name, I2, cI2)
-
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(log)
-{
- NETLIB_CONSTRUCTOR(log)
- {
- enregister("I", m_I);
-
- pstring filename = plib::pfmt("{1}.log")(this->name());
- m_strm = plib::pmake_unique<plib::pofilestream>(filename);
- }
- NETLIB_DESTRUCTOR(log);
- NETLIB_UPDATEI();
- NETLIB_RESETI() { }
-protected:
- analog_input_t m_I;
- std::unique_ptr<plib::pofilestream> m_strm;
-};
-
-NETLIB_OBJECT_DERIVED(logD, log)
-{
- NETLIB_CONSTRUCTOR_DERIVED(logD, log)
- {
- enregister("I2", m_I2);
- }
- NETLIB_UPDATEI();
- NETLIB_RESETI() { };
- analog_input_t m_I2;
-};
-
-#if 0
-NETLIB_DEVICE(wav,
- ~NETLIB_NAME(wav)();
- analog_input_t m_I;
-private:
- // FIXME: rewrite sound/wavwrite.h to be an object ...
- void *m_file;
-);
-#endif
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_LOG_H_ */
diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp
index c8e5ca23b44..54d66dd17bb 100644
--- a/src/lib/netlist/devices/nld_mm5837.cpp
+++ b/src/lib/netlist/devices/nld_mm5837.cpp
@@ -5,54 +5,110 @@
*
*/
-#include <solver/nld_matrix_solver.h>
#include "nld_mm5837.h"
-#include "nl_setup.h"
-
-#define R_LOW (1000)
-#define R_HIGH (1000)
+#include <solver/nld_matrix_solver.h>
+#include "analog/nld_twoterm.h"
-NETLIB_NAMESPACE_DEVICES_START()
+#define R_LOW (1000.0)
+#define R_HIGH (1000.0)
-NETLIB_RESET(MM5837_dip)
+namespace netlist
{
- //m_V0.initial(0.0);
- //m_RV.do_reset();
- m_RV.set(NL_FCONST(1.0) / R_LOW, 0.0, 0.0);
+ namespace devices
+ {
+
+ NETLIB_OBJECT(MM5837_dip)
+ {
+ NETLIB_CONSTRUCTOR(MM5837_dip)
+ , m_RV(*this, "RV")
+ , 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);
- m_shift = 0x1ffff;
- m_is_timestep = m_RV.m_P.net().solver()->is_timestep();
-}
+ /* output */
+ enregister("_RV1", m_RV.m_P);
+ enregister("_RV2", m_RV.m_N);
+ enregister("_Q", m_V0);
+ connect_late(m_RV.m_N, m_V0);
-NETLIB_UPDATE(MM5837_dip)
-{
- OUTLOGIC(m_Q, !m_Q.net().as_logic().new_Q(), m_inc );
+ /* device */
+ enregister("1", m_VDD);
+ enregister("2", m_VGG);
+ register_subalias("3", m_RV.m_P);
+ enregister("4", m_VSS);
+
+ save(NLNAME(m_shift));
+
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
- /* shift register
- *
- * 17 bits, bits 17 & 14 feed back to input
- *
- */
+ protected:
+ NETLIB_SUB(twoterm) m_RV;
+ analog_input_t m_VDD;
+ analog_input_t m_VGG;
+ analog_input_t m_VSS;
- const UINT32 last_state = m_shift & 0x01;
- /* shift */
- m_shift = (m_shift >> 1) | (((m_shift & 0x01) ^ ((m_shift >> 3) & 0x01)) << 16);
- const UINT32 state = m_shift & 0x01;
+ /* output stage */
+ analog_output_t m_V0; /* could be gnd as well */
- if (state != last_state)
+ /* clock stage */
+ logic_input_t m_feedback;
+ logic_output_t m_Q;
+ netlist_time m_inc;
+
+ /* state */
+ UINT32 m_shift;
+
+ /* cache */
+ bool m_is_timestep;
+ };
+
+ NETLIB_RESET(MM5837_dip)
{
- const nl_double R = state ? R_HIGH : R_LOW;
- const nl_double V = state ? INPANALOG(m_VDD) : INPANALOG(m_VSS);
-
- // We only need to update the net first if this is a time stepping net
- if (m_is_timestep)
- m_RV.update_dev();
- m_RV.set(NL_FCONST(1.0) / R, V, 0.0);
- m_RV.m_P.schedule_after(NLTIME_FROM_NS(1));
+ //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;
+ m_is_timestep = m_RV.m_P.net().solver()->is_timestep();
}
-}
+ NETLIB_UPDATE(MM5837_dip)
+ {
+ OUTLOGIC(m_Q, !m_Q.net().as_logic().new_Q(), m_inc );
+
+ /* shift register
+ *
+ * 17 bits, bits 17 & 14 feed back to input
+ *
+ */
+
+ const UINT32 last_state = m_shift & 0x01;
+ /* shift */
+ m_shift = (m_shift >> 1) | (((m_shift & 0x01) ^ ((m_shift >> 3) & 0x01)) << 16);
+ const UINT32 state = m_shift & 0x01;
+
+ if (state != last_state)
+ {
+ const nl_double R = state ? R_HIGH : R_LOW;
+ const nl_double V = state ? INPANALOG(m_VDD) : INPANALOG(m_VSS);
+ // We only need to update the net first if this is a time stepping net
+ if (m_is_timestep)
+ m_RV.update_dev();
+ m_RV.set(NL_FCONST(1.0) / R, V, 0.0);
+ m_RV.m_P.schedule_after(NLTIME_FROM_NS(1));
+ }
+
+ }
+ NETLIB_DEVICE_IMPL(MM5837_dip)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_mm5837.h b/src/lib/netlist/devices/nld_mm5837.h
index d433b057d57..d50a456b93c 100644
--- a/src/lib/netlist/devices/nld_mm5837.h
+++ b/src/lib/netlist/devices/nld_mm5837.h
@@ -19,65 +19,9 @@
#ifndef NLD_MM5837_H_
#define NLD_MM5837_H_
-#include "nl_base.h"
-#include "analog/nld_twoterm.h"
+#include "nl_setup.h"
#define MM5837_DIP(name) \
NET_REGISTER_DEV(MM5837_DIP, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(MM5837_dip)
-{
- NETLIB_CONSTRUCTOR(MM5837_dip)
- ,m_RV(*this, "RV")
- {
- /* 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);
- 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));
-
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-protected:
- NETLIB_SUB(twoterm) m_RV;
- analog_input_t m_VDD;
- analog_input_t m_VGG;
- analog_input_t m_VSS;
-
- /* output stage */
- analog_output_t m_V0; /* could be gnd as well */
-
- /* clock stage */
- logic_input_t m_feedback;
- logic_output_t m_Q;
- netlist_time m_inc;
-
- /* state */
- UINT32 m_shift;
-
- /* cache */
- bool m_is_timestep;
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_MM5837_H_ */
diff --git a/src/lib/netlist/devices/nld_ne555.cpp b/src/lib/netlist/devices/nld_ne555.cpp
index e08659f7827..7f40497e2de 100644
--- a/src/lib/netlist/devices/nld_ne555.cpp
+++ b/src/lib/netlist/devices/nld_ne555.cpp
@@ -5,76 +5,147 @@
*
*/
-#include <solver/nld_solver.h>
#include "nld_ne555.h"
-#include "nl_setup.h"
+#include "analog/nld_twoterm.h"
+#include <solver/nld_solver.h>
#define R_OFF (1E20)
#define R_ON (25) // Datasheet states a maximum discharge of 200mA, R = 5V / 0.2
-NETLIB_NAMESPACE_DEVICES_START()
-
-inline nl_double NETLIB_NAME(NE555)::clamp(const nl_double v, const nl_double a, const nl_double b)
+namespace netlist
{
- nl_double ret = v;
- nl_double vcc = TERMANALOG(m_R1.m_P);
+ namespace devices
+ {
- if (ret > vcc - a)
- ret = vcc - a;
- if (ret < b)
- ret = b;
- return ret;
-}
+ NETLIB_OBJECT(NE555)
+ {
+ NETLIB_CONSTRUCTOR(NE555)
+ , m_R1(*this, "R1")
+ , m_R2(*this, "R2")
+ , m_R3(*this, "R3")
+ , m_RDIS(*this, "RDIS")
+ , m_last_out(false)
+ , m_ff(false)
+ {
-NETLIB_RESET(NE555)
-{
- m_R1.do_reset();
- m_R2.do_reset();
- m_R3.do_reset();
- m_RDIS.do_reset();
+ 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
- m_R1.set_R(5000);
- m_R2.set_R(5000);
- m_R3.set_R(5000);
- m_RDIS.set_R(R_OFF);
+ connect_late(m_R1.m_N, m_R2.m_P);
+ connect_late(m_R2.m_N, m_R3.m_P);
+ connect_late(m_RDIS.m_N, m_R3.m_N);
- m_last_out = true;
-}
+ save(NLNAME(m_last_out));
+ save(NLNAME(m_ff));
+ }
-NETLIB_UPDATE(NE555)
-{
- // FIXME: assumes GND is connected to 0V.
+ NETLIB_UPDATEI();
+ NETLIB_RESETI();
+
+ protected:
+ NETLIB_SUB(R) m_R1;
+ NETLIB_SUB(R) m_R2;
+ NETLIB_SUB(R) m_R3;
+ NETLIB_SUB(R) m_RDIS;
+
+ logic_input_t m_RESET;
+ analog_input_t m_THRES;
+ analog_input_t m_TRIG;
+ analog_output_t m_OUT;
- nl_double vt = clamp(TERMANALOG(m_R2.m_P), 0.7, 1.4);
- bool bthresh = (INPANALOG(m_THRES) > vt);
- bool btrig = (INPANALOG(m_TRIG) > clamp(TERMANALOG(m_R2.m_N), 0.7, 1.4));
+ private:
+ bool m_last_out;
+ bool m_ff;
- if (!btrig)
+ inline nl_double clamp(const nl_double v, const nl_double a, const nl_double b);
+
+ };
+
+ NETLIB_OBJECT_DERIVED(NE555_dip, NE555)
{
- m_ff = true;
- }
- else if (bthresh)
+ NETLIB_CONSTRUCTOR_DERIVED(NE555_dip, NE555)
+ {
+ register_subalias("1", m_R3.m_N); // Pin 1
+ register_subalias("2", m_TRIG); // Pin 2
+ register_subalias("3", m_OUT); // Pin 3
+ register_subalias("4", m_RESET); // Pin 4
+ register_subalias("5", m_R1.m_N); // Pin 5
+ register_subalias("6", m_THRES); // Pin 6
+ register_subalias("7", m_RDIS.m_P); // Pin 7
+ register_subalias("8", m_R1.m_P); // Pin 8
+ }
+ };
+
+ inline nl_double NETLIB_NAME(NE555)::clamp(const nl_double v, const nl_double a, const nl_double b)
{
- m_ff = false;
- }
+ nl_double ret = v;
+ nl_double vcc = TERMANALOG(m_R1.m_P);
- bool out = (!INPLOGIC(m_RESET) ? false : m_ff);
+ if (ret > vcc - a)
+ ret = vcc - a;
+ if (ret < b)
+ ret = b;
+ return ret;
+ }
- if (m_last_out && !out)
+ NETLIB_RESET(NE555)
{
- m_RDIS.update_dev();
- OUTANALOG(m_OUT, TERMANALOG(m_R3.m_N));
- m_RDIS.set_R(R_ON);
+ m_R1.do_reset();
+ m_R2.do_reset();
+ m_R3.do_reset();
+ m_RDIS.do_reset();
+
+ m_R1.set_R(5000);
+ m_R2.set_R(5000);
+ m_R3.set_R(5000);
+ m_RDIS.set_R(R_OFF);
+
+ m_last_out = true;
}
- else if (!m_last_out && out)
+
+ NETLIB_UPDATE(NE555)
{
- m_RDIS.update_dev();
- // FIXME: Should be delayed by 100ns
- OUTANALOG(m_OUT, TERMANALOG(m_R1.m_P));
- m_RDIS.set_R(R_OFF);
+ // FIXME: assumes GND is connected to 0V.
+
+ nl_double vt = clamp(TERMANALOG(m_R2.m_P), 0.7, 1.4);
+ bool bthresh = (INPANALOG(m_THRES) > vt);
+ bool btrig = (INPANALOG(m_TRIG) > clamp(TERMANALOG(m_R2.m_N), 0.7, 1.4));
+
+ if (!btrig)
+ {
+ m_ff = true;
+ }
+ else if (bthresh)
+ {
+ m_ff = false;
+ }
+
+ bool out = (!INPLOGIC(m_RESET) ? false : m_ff);
+
+ if (m_last_out && !out)
+ {
+ m_RDIS.update_dev();
+ OUTANALOG(m_OUT, TERMANALOG(m_R3.m_N));
+ m_RDIS.set_R(R_ON);
+ }
+ else if (!m_last_out && out)
+ {
+ m_RDIS.update_dev();
+ // FIXME: Should be delayed by 100ns
+ OUTANALOG(m_OUT, TERMANALOG(m_R1.m_P));
+ m_RDIS.set_R(R_OFF);
+ }
+ m_last_out = out;
}
- m_last_out = out;
-}
+ NETLIB_DEVICE_IMPL(NE555)
+ NETLIB_DEVICE_IMPL(NE555_dip)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_ne555.h b/src/lib/netlist/devices/nld_ne555.h
index cead3ba8cd5..27e02285ee0 100644
--- a/src/lib/netlist/devices/nld_ne555.h
+++ b/src/lib/netlist/devices/nld_ne555.h
@@ -19,82 +19,12 @@
#ifndef NLD_NE555_H_
#define NLD_NE555_H_
-#include "nl_base.h"
-#include "analog/nld_twoterm.h"
+#include "nl_setup.h"
-#define NE555(name) \
+#define NE555(name) \
NET_REGISTER_DEV(NE555, name)
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_OBJECT(NE555)
-{
- NETLIB_CONSTRUCTOR(NE555)
- , m_R1(*this, "R1")
- , m_R2(*this, "R2")
- , m_R3(*this, "R3")
- , m_RDIS(*this, "RDIS")
- , 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
-
- connect_late(m_R1.m_N, m_R2.m_P);
- connect_late(m_R2.m_N, m_R3.m_P);
- connect_late(m_RDIS.m_N, m_R3.m_N);
-
- save(NLNAME(m_last_out));
- save(NLNAME(m_ff));
- }
-
- NETLIB_UPDATEI();
- NETLIB_RESETI();
-
-protected:
- NETLIB_SUB(R) m_R1;
- NETLIB_SUB(R) m_R2;
- NETLIB_SUB(R) m_R3;
- NETLIB_SUB(R) m_RDIS;
-
- logic_input_t m_RESET;
- analog_input_t m_THRES;
- analog_input_t m_TRIG;
- analog_output_t m_OUT;
-
-private:
- bool m_last_out;
- bool m_ff;
-
- inline nl_double clamp(const nl_double v, const nl_double a, const nl_double b);
-
-};
-
#define NE555_DIP(name) \
NET_REGISTER_DEV(NE555_DIP, name)
-NETLIB_OBJECT_DERIVED(NE555_dip, NE555)
-{
- NETLIB_CONSTRUCTOR_DERIVED(NE555_dip, NE555)
- {
- register_subalias("1", m_R3.m_N); // Pin 1
- register_subalias("2", m_TRIG); // Pin 2
- register_subalias("3", m_OUT); // Pin 3
- register_subalias("4", m_RESET); // Pin 4
- register_subalias("5", m_R1.m_N); // Pin 5
- register_subalias("6", m_THRES); // Pin 6
- register_subalias("7", m_RDIS.m_P); // Pin 7
- register_subalias("8", m_R1.m_P); // Pin 8
- }
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_NE555_H_ */
diff --git a/src/lib/netlist/devices/nld_r2r_dac.cpp b/src/lib/netlist/devices/nld_r2r_dac.cpp
index 0762eccf332..eb95058fa69 100644
--- a/src/lib/netlist/devices/nld_r2r_dac.cpp
+++ b/src/lib/netlist/devices/nld_r2r_dac.cpp
@@ -6,16 +6,47 @@
*/
#include "nld_r2r_dac.h"
+#include "analog/nld_twoterm.h"
-NETLIB_NAMESPACE_DEVICES_START()
-
-NETLIB_UPDATE_PARAM(r2r_dac)
+namespace netlist
{
- update_dev();
+ namespace devices
+ {
+
+ 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);
+ }
+
+ NETLIB_UPDATE_PARAMI();
+ //NETLIB_RESETI();
+ //NETLIB_UPDATEI();
+
+ protected:
+ param_double_t m_VIN;
+ param_double_t m_R;
+ param_int_t m_num;
+ param_int_t m_val;
+ };
+
+
+ NETLIB_UPDATE_PARAM(r2r_dac)
+ {
+ update_dev();
+
+ nl_double V = m_VIN.Value() / (nl_double) (1 << m_num.Value()) * (nl_double) m_val.Value();
- nl_double V = m_VIN.Value() / (nl_double) (1 << m_num.Value()) * (nl_double) m_val.Value();
+ this->set(1.0 / m_R.Value(), V, 0.0);
+ }
- this->set(1.0 / m_R.Value(), V, 0.0);
-}
+ NETLIB_DEVICE_IMPL(r2r_dac)
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_r2r_dac.h b/src/lib/netlist/devices/nld_r2r_dac.h
index 89ee4c5cbf4..b88d0f595f6 100644
--- a/src/lib/netlist/devices/nld_r2r_dac.h
+++ b/src/lib/netlist/devices/nld_r2r_dac.h
@@ -46,41 +46,12 @@
#ifndef NLD_R2R_DAC_H_
#define NLD_R2R_DAC_H_
-#include "nl_base.h"
-#include "analog/nld_twoterm.h"
+#include "nl_setup.h"
-#define R2R_DAC(name, p_VIN, p_R, p_N) \
- NET_REGISTER_DEV(R2R_DAC, name) \
- NETDEV_PARAMI(name, VIN, p_VIN) \
- NETDEV_PARAMI(name, R, p_R) \
+#define R2R_DAC(name, p_VIN, p_R, p_N) \
+ NET_REGISTER_DEV(R2R_DAC, name) \
+ NETDEV_PARAMI(name, VIN, p_VIN) \
+ NETDEV_PARAMI(name, R, p_R) \
NETDEV_PARAMI(name, N, p_N)
-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);
- }
-
- NETLIB_UPDATE_PARAMI();
- //NETLIB_RESETI();
- //NETLIB_UPDATEI();
-
-protected:
- param_double_t m_VIN;
- param_double_t m_R;
- param_int_t m_num;
- param_int_t m_val;
-};
-
-NETLIB_NAMESPACE_DEVICES_END()
-
-
#endif /* NLD_R2R_DAC_H_ */
diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp
index d2cdc5a3aca..ee3d381d422 100644
--- a/src/lib/netlist/devices/nld_system.cpp
+++ b/src/lib/netlist/devices/nld_system.cpp
@@ -7,207 +7,223 @@
#include <solver/nld_solver.h>
#include <solver/nld_matrix_solver.h>
-#include "nld_system.h"
+#include "nlid_system.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
-// ----------------------------------------------------------------------------------------
-// netlistparams
-// ----------------------------------------------------------------------------------------
+ // ----------------------------------------------------------------------------------------
+ // netlistparams
+ // ----------------------------------------------------------------------------------------
-// ----------------------------------------------------------------------------------------
-// clock
-// ----------------------------------------------------------------------------------------
+ // ----------------------------------------------------------------------------------------
+ // clock
+ // ----------------------------------------------------------------------------------------
-NETLIB_UPDATE_PARAM(clock)
-{
- m_inc = netlist_time::from_hz(m_freq.Value()*2);
-}
+ NETLIB_UPDATE_PARAM(clock)
+ {
+ m_inc = netlist_time::from_hz(m_freq.Value()*2);
+ }
-NETLIB_UPDATE(clock)
-{
- OUTLOGIC(m_Q, !m_Q.net().as_logic().new_Q(), m_inc );
-}
+ NETLIB_UPDATE(clock)
+ {
+ OUTLOGIC(m_Q, !m_Q.net().as_logic().new_Q(), m_inc );
+ }
-// ----------------------------------------------------------------------------------------
-// extclock
-// ----------------------------------------------------------------------------------------
+ // ----------------------------------------------------------------------------------------
+ // extclock
+ // ----------------------------------------------------------------------------------------
-NETLIB_RESET(extclock)
-{
- m_cnt = 0;
- m_off = netlist_time::from_double(m_offset.Value());
- //m_Q.initial(0);
-}
+ NETLIB_RESET(extclock)
+ {
+ m_cnt = 0;
+ m_off = netlist_time::from_double(m_offset.Value());
+ //m_Q.initial(0);
+ }
-NETLIB_UPDATE(extclock)
-{
-#if 0
- if (m_off == netlist_time::zero)
+ NETLIB_UPDATE(extclock)
{
- OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[m_cnt]);
+ #if 0
+ if (m_off == netlist_time::zero)
+ {
+ OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[m_cnt]);
+ m_cnt = (m_cnt + 1) % m_size;
+ }
+ else
+ {
+ OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[0] + m_off);
+ m_cnt = 1;
+ m_off = netlist_time::zero;
+ }
+ #else
+ OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[m_cnt] + m_off);
m_cnt = (m_cnt + 1) % m_size;
+ m_off = netlist_time::zero;
+ #endif
}
- else
+
+ // ----------------------------------------------------------------------------------------
+ // logic_input
+ // ----------------------------------------------------------------------------------------
+
+ NETLIB_RESET(logic_input)
{
- OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[0] + m_off);
- m_cnt = 1;
- m_off = netlist_time::zero;
+ //FIXME: causes issues in breakout (lots of pings after first player 1 start)
+ //m_Q.initial(m_IN.Value() & 1);
}
-#else
- OUTLOGIC(m_Q, (m_cnt & 1) ^ 1, m_inc[m_cnt] + m_off);
- m_cnt = (m_cnt + 1) % m_size;
- m_off = netlist_time::zero;
-#endif
-}
-
-// ----------------------------------------------------------------------------------------
-// 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));
-}
+ NETLIB_UPDATE(logic_input)
+ {
+ OUTLOGIC(m_Q, m_IN.Value() & 1, netlist_time::from_nsec(1));
+ }
-NETLIB_UPDATE_PARAM(logic_input)
-{
-}
+ NETLIB_UPDATE_PARAM(logic_input)
+ {
+ }
-// ----------------------------------------------------------------------------------------
-// analog_input
-// ----------------------------------------------------------------------------------------
+ // ----------------------------------------------------------------------------------------
+ // analog_input
+ // ----------------------------------------------------------------------------------------
-NETLIB_RESET(analog_input)
-{
-// m_Q.initial(m_IN.Value() * 0.999);
-}
+ NETLIB_RESET(analog_input)
+ {
+ // m_Q.initial(m_IN.Value() * 0.999);
+ }
-NETLIB_UPDATE(analog_input)
-{
- OUTANALOG(m_Q, m_IN.Value());
-}
+ NETLIB_UPDATE(analog_input)
+ {
+ OUTANALOG(m_Q, m_IN.Value());
+ }
-NETLIB_UPDATE_PARAM(analog_input)
-{
-}
+ NETLIB_UPDATE_PARAM(analog_input)
+ {
+ }
-// ----------------------------------------------------------------------------------------
-// nld_d_to_a_proxy
-// ----------------------------------------------------------------------------------------
+ // ----------------------------------------------------------------------------------------
+ // nld_d_to_a_proxy
+ // ----------------------------------------------------------------------------------------
-void nld_d_to_a_proxy::reset()
-{
- //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();
- m_RV.set(NL_FCONST(1.0) / logic_family().m_R_low, logic_family().m_low_V, 0.0);
-}
-
-NETLIB_UPDATE(d_to_a_proxy)
-{
- const int state = INPLOGIC(m_I);
- if (state != m_last_state)
+ void nld_d_to_a_proxy::reset()
{
- m_last_state = state;
- const nl_double R = state ? logic_family().m_R_high : logic_family().m_R_low;
- const nl_double V = state ? logic_family().m_high_V : logic_family().m_low_V;
+ //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();
+ m_RV.set(NL_FCONST(1.0) / logic_family().m_R_low, logic_family().m_low_V, 0.0);
+ }
- // We only need to update the net first if this is a time stepping net
- if (m_is_timestep)
+ NETLIB_UPDATE(d_to_a_proxy)
+ {
+ const int state = INPLOGIC(m_I);
+ if (state != m_last_state)
{
- m_RV.update_dev();
+ m_last_state = state;
+ const nl_double R = state ? logic_family().m_R_high : logic_family().m_R_low;
+ const nl_double V = state ? logic_family().m_high_V : logic_family().m_low_V;
+
+ // We only need to update the net first if this is a time stepping net
+ if (m_is_timestep)
+ {
+ m_RV.update_dev();
+ }
+ m_RV.set(NL_FCONST(1.0) / R, V, 0.0);
+ m_RV.m_P.schedule_after(NLTIME_FROM_NS(1));
}
- m_RV.set(NL_FCONST(1.0) / R, V, 0.0);
- m_RV.m_P.schedule_after(NLTIME_FROM_NS(1));
}
-}
-// -----------------------------------------------------------------------------
-// nld_res_sw
-// -----------------------------------------------------------------------------
+ // -----------------------------------------------------------------------------
+ // nld_res_sw
+ // -----------------------------------------------------------------------------
-NETLIB_UPDATE(res_sw)
-{
- const int state = INPLOGIC(m_I);
- if (state != m_last_state)
+ NETLIB_UPDATE(res_sw)
{
- m_last_state = state;
- const nl_double R = state ? m_RON.Value() : m_ROFF.Value();
-
- // We only need to update the net first if this is a time stepping net
- if (0) // m_R->m_P.net().as_analog().solver()->is_timestep())
- {
- m_R.update_dev();
- m_R.set_R(R);
- m_R.m_P.schedule_after(NLTIME_FROM_NS(1));
- }
- else
+ const int state = INPLOGIC(m_I);
+ if (state != m_last_state)
{
- m_R.set_R(R);
- m_R.m_P.schedule_after(NLTIME_FROM_NS(1));
- //m_R->update_dev();
+ m_last_state = state;
+ const nl_double R = state ? m_RON.Value() : m_ROFF.Value();
+
+ // We only need to update the net first if this is a time stepping net
+ if (0) // m_R->m_P.net().as_analog().solver()->is_timestep())
+ {
+ m_R.update_dev();
+ m_R.set_R(R);
+ m_R.m_P.schedule_after(NLTIME_FROM_NS(1));
+ }
+ else
+ {
+ m_R.set_R(R);
+ m_R.m_P.schedule_after(NLTIME_FROM_NS(1));
+ //m_R->update_dev();
+ }
}
}
-}
-/* -----------------------------------------------------------------------------
- * nld_function
- * ----------------------------------------------------------------------------- */
+ /* -----------------------------------------------------------------------------
+ * nld_function
+ * ----------------------------------------------------------------------------- */
-NETLIB_RESET(function)
-{
- //m_Q.initial(0.0);
-}
+ NETLIB_RESET(function)
+ {
+ //m_Q.initial(0.0);
+ }
-NETLIB_UPDATE(function)
-{
- //nl_double val = INPANALOG(m_I[0]) * INPANALOG(m_I[1]) * 0.2;
- //OUTANALOG(m_Q, val);
- nl_double stack[20];
- unsigned ptr = 0;
- unsigned e = m_precompiled.size();
- for (unsigned i = 0; i<e; i++)
- {
- rpn_inst &rc = m_precompiled[i];
- switch (rc.m_cmd)
+ NETLIB_UPDATE(function)
+ {
+ //nl_double val = INPANALOG(m_I[0]) * INPANALOG(m_I[1]) * 0.2;
+ //OUTANALOG(m_Q, val);
+ nl_double stack[20];
+ unsigned ptr = 0;
+ unsigned e = m_precompiled.size();
+ for (unsigned i = 0; i<e; i++)
{
- case ADD:
- ptr--;
- stack[ptr-1] = stack[ptr] + stack[ptr-1];
- break;
- case MULT:
- ptr--;
- stack[ptr-1] = stack[ptr] * stack[ptr-1];
- break;
- case SUB:
- ptr--;
- stack[ptr-1] = stack[ptr-1] - stack[ptr];
- break;
- case DIV:
- ptr--;
- stack[ptr-1] = stack[ptr-1] / stack[ptr];
- break;
- case PUSH_INPUT:
- stack[ptr++] = INPANALOG(m_I[(int) rc.m_param]);
- break;
- case PUSH_CONST:
- stack[ptr++] = rc.m_param;
- break;
+ rpn_inst &rc = m_precompiled[i];
+ switch (rc.m_cmd)
+ {
+ case ADD:
+ ptr--;
+ stack[ptr-1] = stack[ptr] + stack[ptr-1];
+ break;
+ case MULT:
+ ptr--;
+ stack[ptr-1] = stack[ptr] * stack[ptr-1];
+ break;
+ case SUB:
+ ptr--;
+ stack[ptr-1] = stack[ptr-1] - stack[ptr];
+ break;
+ case DIV:
+ ptr--;
+ stack[ptr-1] = stack[ptr-1] / stack[ptr];
+ break;
+ case PUSH_INPUT:
+ stack[ptr++] = INPANALOG(m_I[(int) rc.m_param]);
+ break;
+ case PUSH_CONST:
+ stack[ptr++] = rc.m_param;
+ break;
+ }
}
+ OUTANALOG(m_Q, stack[ptr-1]);
}
- OUTANALOG(m_Q, stack[ptr-1]);
-}
-NETLIB_NAMESPACE_DEVICES_END()
+ NETLIB_DEVICE_IMPL(dummy_input)
+ NETLIB_DEVICE_IMPL(frontier)
+ NETLIB_DEVICE_IMPL(function)
+ NETLIB_DEVICE_IMPL(logic_input)
+ NETLIB_DEVICE_IMPL(analog_input)
+ NETLIB_DEVICE_IMPL(clock)
+ NETLIB_DEVICE_IMPL(extclock)
+ NETLIB_DEVICE_IMPL(res_sw)
+ NETLIB_DEVICE_IMPL(mainclock)
+ NETLIB_DEVICE_IMPL(gnd)
+ NETLIB_DEVICE_IMPL(netlistparams)
+
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_system.h b/src/lib/netlist/devices/nld_system.h
index d7e340c421e..738ceb2a171 100644
--- a/src/lib/netlist/devices/nld_system.h
+++ b/src/lib/netlist/devices/nld_system.h
@@ -10,637 +10,66 @@
#define NLD_SYSTEM_H_
#include "nl_setup.h"
-#include "nl_base.h"
-#include "nl_factory.h"
-#include "analog/nld_twoterm.h"
// -----------------------------------------------------------------------------
// Macros
// -----------------------------------------------------------------------------
-#define TTL_INPUT(name, v) \
- NET_REGISTER_DEV(TTL_INPUT, name) \
+#define TTL_INPUT(name, v) \
+ NET_REGISTER_DEV(TTL_INPUT, name) \
PARAM(name.IN, v)
-#define LOGIC_INPUT(name, v, family) \
- NET_REGISTER_DEV(LOGIC_INPUT, name) \
- PARAM(name.IN, v) \
+#define LOGIC_INPUT(name, v, family) \
+ NET_REGISTER_DEV(LOGIC_INPUT, name) \
+ PARAM(name.IN, v) \
PARAM(name.FAMILY, family)
-#define ANALOG_INPUT(name, v) \
- NET_REGISTER_DEV(ANALOG_INPUT, name) \
+#define ANALOG_INPUT(name, v) \
+ NET_REGISTER_DEV(ANALOG_INPUT, name) \
PARAM(name.IN, v)
-#define MAINCLOCK(name, freq) \
- NET_REGISTER_DEV(MAINCLOCK, name) \
+#define MAINCLOCK(name, freq) \
+ NET_REGISTER_DEV(MAINCLOCK, name) \
PARAM(name.FREQ, freq)
-#define CLOCK(name, freq) \
- NET_REGISTER_DEV(CLOCK, name) \
+#define CLOCK(name, freq) \
+ NET_REGISTER_DEV(CLOCK, name) \
PARAM(name.FREQ, freq)
-#define EXTCLOCK(name, freq, pattern) \
- NET_REGISTER_DEV(EXTCLOCK, name) \
- PARAM(name.FREQ, freq) \
+#define EXTCLOCK(name, freq, pattern) \
+ NET_REGISTER_DEV(EXTCLOCK, name) \
+ PARAM(name.FREQ, freq) \
PARAM(name.PATTERN, pattern)
-#define GNDA() \
+#define GNDA() \
NET_REGISTER_DEV(GNDA, GND)
-#define DUMMY_INPUT(name) \
+#define DUMMY_INPUT(name) \
NET_REGISTER_DEV(DUMMY_INPUT, name)
//FIXME: Usage discouraged, use OPTIMIZE_FRONTIER instead
-#define FRONTIER_DEV(name, cIN, cG, cOUT) \
- NET_REGISTER_DEV(FRONTIER_DEV, name) \
- NET_C(cIN, name.I) \
- NET_C(cG, name.G) \
+#define FRONTIER_DEV(name, cIN, cG, cOUT) \
+ NET_REGISTER_DEV(FRONTIER_DEV, name) \
+ NET_C(cIN, name.I) \
+ NET_C(cG, name.G) \
NET_C(cOUT, name.Q)
-#define OPTIMIZE_FRONTIER(attach, r_in, r_out) \
+#define OPTIMIZE_FRONTIER(attach, r_in, r_out) \
setup.register_frontier(# attach, r_in, r_out);
-#define RES_SWITCH(name, cIN, cP1, cP2) \
- NET_REGISTER_DEV(RES_SWITCH, name) \
- NET_C(cIN, name.I) \
- NET_C(cP1, name.1) \
+#define RES_SWITCH(name, cIN, cP1, cP2) \
+ NET_REGISTER_DEV(RES_SWITCH, name) \
+ NET_C(cIN, name.I) \
+ NET_C(cP1, name.1) \
NET_C(cP2, name.2)
/* Default device to hold netlist parameters */
-#define PARAMETERS(name) \
+#define PARAMETERS(name) \
NET_REGISTER_DEV(PARAMETERS, name)
#define AFUNC(name, p_N, p_F) \
- NET_REGISTER_DEV(AFUNC, name) \
- PARAM(name.N, p_N) \
+ NET_REGISTER_DEV(AFUNC, name) \
+ PARAM(name.N, p_N) \
PARAM(name.FUNC, p_F)
-NETLIB_NAMESPACE_DEVICES_START()
-
-// -----------------------------------------------------------------------------
-// netlistparams
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT(netlistparams)
-{
- NETLIB_CONSTRUCTOR(netlistparams)
- , m_use_deactivate(*this, "USE_DEACTIVATE", 0)
- {
- }
- NETLIB_UPDATEI() { }
- //NETLIB_RESETI() { }
- //NETLIB_UPDATE_PARAMI() { }
-public:
- param_logic_t m_use_deactivate;
-};
-
-// -----------------------------------------------------------------------------
-// mainclock
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT(mainclock)
-{
- NETLIB_CONSTRUCTOR(mainclock)
- , m_freq(*this, "FREQ", 7159000.0 * 5)
- {
- enregister("Q", m_Q);
-
- m_inc = netlist_time::from_hz(m_freq.Value()*2);
- }
-
- NETLIB_RESETI()
- {
- m_Q.net().set_time(netlist_time::zero);
- }
-
- NETLIB_UPDATE_PARAMI()
- {
- m_inc = netlist_time::from_hz(m_freq.Value()*2);
- }
-
- NETLIB_UPDATEI()
- {
- logic_net_t &net = m_Q.net().as_logic();
- // this is only called during setup ...
- net.toggle_new_Q();
- net.set_time(netlist().time() + m_inc);
- }
-
-public:
- logic_output_t m_Q;
-
- param_double_t m_freq;
- netlist_time m_inc;
-
- ATTR_HOT inline static void mc_update(logic_net_t &net);
-};
-
-// -----------------------------------------------------------------------------
-// clock
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT(clock)
-{
- NETLIB_CONSTRUCTOR(clock)
- , 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);
-
- connect_late(m_feedback, m_Q);
- }
- NETLIB_UPDATEI();
- //NETLIB_RESETI();
- NETLIB_UPDATE_PARAMI();
-
-protected:
- logic_input_t m_feedback;
- logic_output_t m_Q;
-
- param_double_t m_freq;
- netlist_time m_inc;
-};
-
-// -----------------------------------------------------------------------------
-// extclock
-// -----------------------------------------------------------------------------
-
-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);
-
- m_inc[0] = netlist_time::from_hz(m_freq.Value()*2);
-
- connect_late(m_feedback, m_Q);
- {
- netlist_time base = netlist_time::from_hz(m_freq.Value()*2);
- plib::pstring_vector_t pat(m_pattern.Value(),",");
- m_off = netlist_time::from_double(m_offset.Value());
-
- int pati[256];
- m_size = pat.size();
- int total = 0;
- for (int i=0; i<m_size; i++)
- {
- pati[i] = pat[i].as_long();
- total += pati[i];
- }
- netlist_time ttotal = netlist_time::zero;
- for (int i=0; i<m_size - 1; i++)
- {
- m_inc[i] = base * pati[i];
- ttotal += m_inc[i];
- }
- m_inc[m_size - 1] = base * total - ttotal;
- }
- save(NLNAME(m_cnt));
- save(NLNAME(m_off));
- }
- NETLIB_UPDATEI();
- NETLIB_RESETI();
- //NETLIB_UPDATE_PARAMI();
-protected:
-
- param_double_t m_freq;
- param_str_t m_pattern;
- param_double_t m_offset;
-
- logic_input_t m_feedback;
- logic_output_t m_Q;
- UINT32 m_cnt;
- UINT32 m_size;
- netlist_time m_inc[32];
- netlist_time m_off;
-};
-
-// -----------------------------------------------------------------------------
-// Special support devices ...
-// -----------------------------------------------------------------------------
-
-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)")
- {
- set_logic_family(netlist().setup().family_from_model(m_FAMILY.Value()));
-
- enregister("Q", m_Q);
- }
- NETLIB_UPDATE_AFTER_PARAM_CHANGE()
-
- NETLIB_UPDATEI();
- NETLIB_RESETI();
- NETLIB_UPDATE_PARAMI();
-
-protected:
- logic_output_t m_Q;
-
- param_logic_t m_IN;
- param_model_t m_FAMILY;
-};
-
-NETLIB_OBJECT(analog_input)
-{
- NETLIB_CONSTRUCTOR(analog_input)
- , m_IN(*this, "IN", 0.0)
- {
- enregister("Q", m_Q);
- }
- NETLIB_UPDATE_AFTER_PARAM_CHANGE()
-
- NETLIB_UPDATEI();
- NETLIB_RESETI();
- NETLIB_UPDATE_PARAMI();
-protected:
- analog_output_t m_Q;
- param_double_t m_IN;
-};
-
-// -----------------------------------------------------------------------------
-// nld_gnd
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT(gnd)
-{
- NETLIB_CONSTRUCTOR(gnd)
- {
- enregister("Q", m_Q);
- }
- NETLIB_UPDATEI()
- {
- OUTANALOG(m_Q, 0.0);
- }
- NETLIB_RESETI() { }
-protected:
- analog_output_t m_Q;
-};
-
-// -----------------------------------------------------------------------------
-// nld_dummy_input
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT_DERIVED(dummy_input, base_dummy)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(dummy_input, base_dummy)
- {
- enregister("I", m_I);
- }
-
-protected:
-
- NETLIB_RESETI() { }
- NETLIB_UPDATEI() { }
-
-private:
- analog_input_t m_I;
-
-};
-
-// -----------------------------------------------------------------------------
-// nld_frontier
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT_DERIVED(frontier, base_dummy)
-{
-public:
- NETLIB_CONSTRUCTOR_DERIVED(frontier, base_dummy)
- , m_RIN(netlist(), "m_RIN")
- , m_ROUT(netlist(), "m_ROUT")
- , 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);
- connect_late(m_I, m_RIN.m_P);
-
- enregister("_Q", m_Q);
- enregister("_OP",m_ROUT.m_P);
- enregister("Q",m_ROUT.m_N);
- connect_late(m_Q, m_ROUT.m_P);
- }
-
- NETLIB_RESETI()
- {
- m_RIN.set(1.0 / m_p_RIN.Value(),0,0);
- m_ROUT.set(1.0 / m_p_ROUT.Value(),0,0);
- }
-
- NETLIB_UPDATEI()
- {
- OUTANALOG(m_Q, INPANALOG(m_I));
- }
-
-private:
- NETLIB_NAME(twoterm) m_RIN;
- NETLIB_NAME(twoterm) m_ROUT;
- analog_input_t m_I;
- analog_output_t m_Q;
-
- param_double_t m_p_RIN;
- param_double_t m_p_ROUT;
-};
-
-/* -----------------------------------------------------------------------------
- * nld_function
- *
- * FIXME: Currently a proof of concept to get congo bongo working
- * ----------------------------------------------------------------------------- */
-
-NETLIB_OBJECT(function)
-{
- NETLIB_CONSTRUCTOR(function)
- , m_N(*this, "N", 2)
- , m_func(*this, "FUNC", "")
- {
- enregister("Q", m_Q);
-
- for (int i=0; i < m_N; i++)
- enregister(plib::pfmt("A{1}")(i), m_I[i]);
-
- plib::pstring_vector_t cmds(m_func.Value(), " ");
- m_precompiled.clear();
-
- for (std::size_t i=0; i < cmds.size(); i++)
- {
- pstring cmd = cmds[i];
- rpn_inst rc;
- if (cmd == "+")
- rc.m_cmd = ADD;
- else if (cmd == "-")
- rc.m_cmd = SUB;
- else if (cmd == "*")
- rc.m_cmd = MULT;
- else if (cmd == "/")
- rc.m_cmd = DIV;
- else if (cmd.startsWith("A"))
- {
- rc.m_cmd = PUSH_INPUT;
- rc.m_param = cmd.substr(1).as_long();
- }
- else
- {
- bool err = false;
- rc.m_cmd = PUSH_CONST;
- rc.m_param = cmd.as_double(&err);
- if (err)
- netlist().log().fatal("nld_function: unknown/misformatted token <{1}> in <{2}>", cmd, m_func.Value());
- }
- m_precompiled.push_back(rc);
- }
-
-
- }
-
-protected:
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-private:
-
- enum rpn_cmd
- {
- ADD,
- MULT,
- SUB,
- DIV,
- PUSH_CONST,
- PUSH_INPUT
- };
-
- struct rpn_inst
- {
- rpn_inst() : m_cmd(ADD), m_param(0.0) { }
- rpn_cmd m_cmd;
- nl_double m_param;
- };
-
- param_int_t m_N;
- param_str_t m_func;
- analog_output_t m_Q;
- analog_input_t m_I[10];
-
- plib::pvector_t<rpn_inst> m_precompiled;
-};
-
-// -----------------------------------------------------------------------------
-// nld_res_sw
-// -----------------------------------------------------------------------------
-
-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_subalias("1", m_R.m_P);
- register_subalias("2", m_R.m_N);
-
- save(NLNAME(m_last_state));
- }
-
- NETLIB_SUB(R) m_R;
- logic_input_t m_I;
- param_double_t m_RON;
- param_double_t m_ROFF;
-
- NETLIB_RESETI()
- {
- m_last_state = 0;
- m_R.set_R(m_ROFF.Value());
- }
- //NETLIB_UPDATE_PARAMI();
- NETLIB_UPDATEI();
-
-private:
-
- UINT8 m_last_state;
-};
-
-// -----------------------------------------------------------------------------
-// nld_base_proxy
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT(base_proxy)
-{
-public:
- nld_base_proxy(netlist_t &anetlist, const pstring &name, logic_t *inout_proxied, core_terminal_t *proxy_inout)
- : device_t(anetlist, name)
- {
- m_logic_family = inout_proxied->logic_family();
- m_term_proxied = inout_proxied;
- m_proxy_term = proxy_inout;
- }
-
- virtual ~nld_base_proxy() {}
-
- logic_t &term_proxied() const { return *m_term_proxied; }
- core_terminal_t &proxy_term() const { return *m_proxy_term; }
-
-protected:
-
- virtual const logic_family_desc_t &logic_family() const
- {
- return *m_logic_family;
- }
-
-private:
- const logic_family_desc_t *m_logic_family;
- logic_t *m_term_proxied;
- core_terminal_t *m_proxy_term;
-};
-
-// -----------------------------------------------------------------------------
-// nld_a_to_d_proxy
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT_DERIVED(a_to_d_proxy, base_proxy)
-{
-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)
- {
- enregister("I", m_I);
- enregister("Q", m_Q);
- }
-
- virtual ~nld_a_to_d_proxy() {}
-
- analog_input_t m_I;
- logic_output_t m_Q;
-
-protected:
-
- NETLIB_RESETI() { }
-
- NETLIB_UPDATEI()
- {
- if (m_I.Q_Analog() > logic_family().m_high_thresh_V)
- OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(1));
- else if (m_I.Q_Analog() < logic_family().m_low_thresh_V)
- OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(1));
- else
- {
- // do nothing
- }
- }
-private:
-};
-
-// -----------------------------------------------------------------------------
-// nld_base_d_to_a_proxy
-// -----------------------------------------------------------------------------
-
-NETLIB_OBJECT_DERIVED(base_d_to_a_proxy, base_proxy)
-{
-public:
- virtual ~nld_base_d_to_a_proxy() {}
-
- virtual logic_input_t &in() { return m_I; }
-
-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)
- {
- enregister("I", m_I);
- }
-
- logic_input_t m_I;
-
-private:
-};
-
-NETLIB_OBJECT_DERIVED(d_to_a_proxy, base_d_to_a_proxy)
-{
-public:
- nld_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied)
- : nld_base_d_to_a_proxy(anetlist, name, out_proxied, m_RV.m_P)
- , 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);
-
- enregister("_Q", m_Q);
- register_subalias("Q", m_RV.m_P);
-
- connect_late(m_RV.m_N, m_Q);
-
- save(NLNAME(m_last_state));
- }
-
- virtual ~nld_d_to_a_proxy() {}
-
-protected:
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
-private:
- analog_output_t m_Q;
- NETLIB_SUB(twoterm) m_RV;
- int m_last_state;
- bool m_is_timestep;
-};
-
-
-class factory_lib_entry_t : public base_factory_t
-{
- P_PREVENT_COPYING(factory_lib_entry_t)
-public:
-
- ATTR_COLD factory_lib_entry_t(setup_t &setup, const pstring &name, const pstring &classname,
- const pstring &def_param)
- : base_factory_t(name, classname, def_param), m_setup(setup) { }
-
- class wrapper : public device_t
- {
- public:
- wrapper(const pstring &devname, netlist_t &anetlist, const pstring &name)
- : device_t(anetlist, name), m_devname(devname)
- {
- anetlist.setup().namespace_push(name);
- anetlist.setup().include(m_devname);
- anetlist.setup().namespace_pop();
- }
- protected:
- NETLIB_RESETI() { }
- NETLIB_UPDATEI() { }
-
- pstring m_devname;
- };
-
- plib::powned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
- {
- return plib::powned_ptr<device_t>::Create<wrapper>(this->name(), anetlist, name);
- }
-
-private:
- setup_t &m_setup;
-};
-
-
-NETLIB_NAMESPACE_DEVICES_END()
-
#endif /* NLD_SYSTEM_H_ */
diff --git a/src/lib/netlist/devices/nld_truthtable.cpp b/src/lib/netlist/devices/nld_truthtable.cpp
index bd37a80d4f4..e4249713df4 100644
--- a/src/lib/netlist/devices/nld_truthtable.cpp
+++ b/src/lib/netlist/devices/nld_truthtable.cpp
@@ -8,7 +8,10 @@
#include "nld_truthtable.h"
#include "plib/plists.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
unsigned truthtable_desc_t::count_bits(UINT32 v)
{
@@ -243,13 +246,13 @@ void truthtable_desc_t::setup(const plib::pstring_vector_t &truthtable, UINT32 d
#define ENTRYX(n, m, h) case (n * 1000 + m * 10 + h): \
{ using xtype = netlist_factory_truthtable_t<n, m, h>; \
- return plib::powned_ptr<netlist_base_factory_truthtable_t>::Create<xtype>(name,classname,def_param); } break
+ return plib::owned_ptr<netlist_base_factory_truthtable_t>::Create<xtype>(name,classname,def_param); } break
#define ENTRYY(n, m) ENTRYX(n, m, 0); ENTRYX(n, m, 1)
#define ENTRY(n) ENTRYY(n, 1); ENTRYY(n, 2); ENTRYY(n, 3); ENTRYY(n, 4); ENTRYY(n, 5); ENTRYY(n, 6)
-plib::powned_ptr<netlist_base_factory_truthtable_t> nl_tt_factory_create(const unsigned ni, const unsigned no,
+plib::owned_ptr<netlist_base_factory_truthtable_t> nl_tt_factory_create(const unsigned ni, const unsigned no,
const unsigned has_state,
const pstring &name, const pstring &classname,
const pstring &def_param)
@@ -273,4 +276,5 @@ plib::powned_ptr<netlist_base_factory_truthtable_t> nl_tt_factory_create(const u
//return nullptr;
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_truthtable.h b/src/lib/netlist/devices/nld_truthtable.h
index 8f447420490..6aaaa73a698 100644
--- a/src/lib/netlist/devices/nld_truthtable.h
+++ b/src/lib/netlist/devices/nld_truthtable.h
@@ -10,8 +10,11 @@
#ifndef NLD_TRUTHTABLE_H_
#define NLD_TRUTHTABLE_H_
+#include <new>
+
#include "nl_base.h"
#include "nl_factory.h"
+#include "plib/plists.h"
#define NETLIB_TRUTHTABLE(cname, nIN, nOUT, state) \
class NETLIB_NAME(cname) : public nld_truthtable_t<nIN, nOUT, state> \
@@ -43,7 +46,10 @@
setup.factory().register_device(std::move(ttd)); \
}
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
#if 0
static inline UINT32 remove_first_bit(UINT32 v)
@@ -159,11 +165,13 @@ public:
for (unsigned i=0; i < m_NI; i++)
{
+ new (&m_I[i]) logic_input_t();
inout[i] = inout[i].trim();
enregister(inout[i], m_I[i]);
}
for (unsigned i=0; i < m_NO; i++)
{
+ new (&m_Q[i]) logic_output_t();
out[i] = out[i].trim();
enregister(out[i], m_Q[i]);
}
@@ -246,8 +254,10 @@ public:
}
}
- logic_input_t m_I[m_NI];
- logic_output_t m_Q[m_NO];
+ //logic_input_t m_I[m_NI];
+ //logic_output_t m_Q[m_NO];
+ plib::uninitialised_array_t<logic_input_t, m_NI> m_I;
+ plib::uninitialised_array_t<logic_output_t, m_NO> m_Q;
protected:
@@ -341,21 +351,22 @@ public:
const pstring &def_param)
: netlist_base_factory_truthtable_t(name, classname, def_param) { }
- plib::powned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
+ plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
{
typedef nld_truthtable_t<m_NI, m_NO, has_state> tt_type;
- return plib::powned_ptr<device_t>::Create<tt_type>(anetlist, name, m_family, &m_ttbl, m_desc);
+ return plib::owned_ptr<device_t>::Create<tt_type>(anetlist, name, m_family, &m_ttbl, m_desc);
}
private:
typename nld_truthtable_t<m_NI, m_NO, has_state>::truthtable_t m_ttbl;
};
-plib::powned_ptr<netlist_base_factory_truthtable_t> nl_tt_factory_create(const unsigned ni, const unsigned no,
+plib::owned_ptr<netlist_base_factory_truthtable_t> nl_tt_factory_create(const unsigned ni, const unsigned no,
const unsigned has_state,
const pstring &name, const pstring &classname,
const pstring &def_param);
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nlid_cmos.h b/src/lib/netlist/devices/nlid_cmos.h
new file mode 100644
index 00000000000..22dc7beb01d
--- /dev/null
+++ b/src/lib/netlist/devices/nlid_cmos.h
@@ -0,0 +1,41 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * nld_cmos.h
+ *
+ */
+
+#ifndef NLID_CMOS_H_
+#define NLID_CMOS_H_
+
+#include "nl_base.h"
+#include "analog/nld_twoterm.h"
+
+namespace netlist
+{
+ namespace devices
+ {
+
+ NETLIB_OBJECT(vdd_vss)
+ {
+ NETLIB_CONSTRUCTOR(vdd_vss)
+ {
+ enregister("VDD", m_vdd);
+ enregister("VSS", m_vss);
+ }
+
+ NETLIB_UPDATEI() {};
+ NETLIB_RESETI() {};
+
+ public:
+ ATTR_HOT inline nl_double vdd() { return INPANALOG(m_vdd); }
+ ATTR_HOT inline nl_double vss() { return INPANALOG(m_vss); }
+
+ analog_input_t m_vdd;
+ analog_input_t m_vss;
+ };
+
+ } //namespace devices
+} // namespace netlist
+
+#endif /* NLID_CMOS_H_ */
diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h
new file mode 100644
index 00000000000..18a1a926fef
--- /dev/null
+++ b/src/lib/netlist/devices/nlid_system.h
@@ -0,0 +1,591 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * nlid_system.h
+ *
+ * netlist devices defined in the core
+ *
+ * This file contains internal headers
+ */
+
+#ifndef NLID_SYSTEM_H_
+#define NLID_SYSTEM_H_
+
+#include "nl_setup.h"
+#include "nl_base.h"
+#include "nl_factory.h"
+#include "analog/nld_twoterm.h"
+
+namespace netlist
+{
+ namespace devices
+ {
+
+ // -----------------------------------------------------------------------------
+ // netlistparams
+ // -----------------------------------------------------------------------------
+
+ NETLIB_OBJECT(netlistparams)
+ {
+ NETLIB_CONSTRUCTOR(netlistparams)
+ , m_use_deactivate(*this, "USE_DEACTIVATE", 0)
+ {
+ }
+ NETLIB_UPDATEI() { }
+ //NETLIB_RESETI() { }
+ //NETLIB_UPDATE_PARAMI() { }
+ public:
+ param_logic_t m_use_deactivate;
+ };
+
+ // -----------------------------------------------------------------------------
+ // mainclock
+ // -----------------------------------------------------------------------------
+
+ NETLIB_OBJECT(mainclock)
+ {
+ NETLIB_CONSTRUCTOR(mainclock)
+ , m_freq(*this, "FREQ", 7159000.0 * 5)
+ {
+ enregister("Q", m_Q);
+
+ m_inc = netlist_time::from_hz(m_freq.Value()*2);
+ }
+
+ NETLIB_RESETI()
+ {
+ m_Q.net().set_time(netlist_time::zero);
+ }
+
+ NETLIB_UPDATE_PARAMI()
+ {
+ m_inc = netlist_time::from_hz(m_freq.Value()*2);
+ }
+
+ NETLIB_UPDATEI()
+ {
+ logic_net_t &net = m_Q.net().as_logic();
+ // this is only called during setup ...
+ net.toggle_new_Q();
+ net.set_time(netlist().time() + m_inc);
+ }
+
+ public:
+ logic_output_t m_Q;
+
+ param_double_t m_freq;
+ netlist_time m_inc;
+
+ ATTR_HOT inline static void mc_update(logic_net_t &net);
+ };
+
+ // -----------------------------------------------------------------------------
+ // clock
+ // -----------------------------------------------------------------------------
+
+ NETLIB_OBJECT(clock)
+ {
+ NETLIB_CONSTRUCTOR(clock)
+ , 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);
+
+ connect_late(m_feedback, m_Q);
+ }
+ NETLIB_UPDATEI();
+ //NETLIB_RESETI();
+ NETLIB_UPDATE_PARAMI();
+
+ protected:
+ logic_input_t m_feedback;
+ logic_output_t m_Q;
+
+ param_double_t m_freq;
+ netlist_time m_inc;
+ };
+
+ // -----------------------------------------------------------------------------
+ // extclock
+ // -----------------------------------------------------------------------------
+
+ 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);
+
+ m_inc[0] = netlist_time::from_hz(m_freq.Value()*2);
+
+ connect_late(m_feedback, m_Q);
+ {
+ netlist_time base = netlist_time::from_hz(m_freq.Value()*2);
+ plib::pstring_vector_t pat(m_pattern.Value(),",");
+ m_off = netlist_time::from_double(m_offset.Value());
+
+ int pati[256];
+ m_size = pat.size();
+ int total = 0;
+ for (int i=0; i<m_size; i++)
+ {
+ pati[i] = pat[i].as_long();
+ total += pati[i];
+ }
+ netlist_time ttotal = netlist_time::zero;
+ for (int i=0; i<m_size - 1; i++)
+ {
+ m_inc[i] = base * pati[i];
+ ttotal += m_inc[i];
+ }
+ m_inc[m_size - 1] = base * total - ttotal;
+ }
+ save(NLNAME(m_cnt));
+ save(NLNAME(m_off));
+ }
+ NETLIB_UPDATEI();
+ NETLIB_RESETI();
+ //NETLIB_UPDATE_PARAMI();
+ protected:
+
+ param_double_t m_freq;
+ param_str_t m_pattern;
+ param_double_t m_offset;
+
+ logic_input_t m_feedback;
+ logic_output_t m_Q;
+ UINT32 m_cnt;
+ UINT32 m_size;
+ netlist_time m_inc[32];
+ netlist_time m_off;
+ };
+
+ // -----------------------------------------------------------------------------
+ // Special support devices ...
+ // -----------------------------------------------------------------------------
+
+ 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)")
+ {
+ set_logic_family(netlist().setup().family_from_model(m_FAMILY.Value()));
+
+ enregister("Q", m_Q);
+ }
+ NETLIB_UPDATE_AFTER_PARAM_CHANGE()
+
+ NETLIB_UPDATEI();
+ NETLIB_RESETI();
+ NETLIB_UPDATE_PARAMI();
+
+ protected:
+ logic_output_t m_Q;
+
+ param_logic_t m_IN;
+ param_model_t m_FAMILY;
+ };
+
+ NETLIB_OBJECT(analog_input)
+ {
+ NETLIB_CONSTRUCTOR(analog_input)
+ , m_IN(*this, "IN", 0.0)
+ {
+ enregister("Q", m_Q);
+ }
+ NETLIB_UPDATE_AFTER_PARAM_CHANGE()
+
+ NETLIB_UPDATEI();
+ NETLIB_RESETI();
+ NETLIB_UPDATE_PARAMI();
+ protected:
+ analog_output_t m_Q;
+ param_double_t m_IN;
+ };
+
+ // -----------------------------------------------------------------------------
+ // nld_gnd
+ // -----------------------------------------------------------------------------
+
+ NETLIB_OBJECT(gnd)
+ {
+ NETLIB_CONSTRUCTOR(gnd)
+ {
+ enregister("Q", m_Q);
+ }
+ NETLIB_UPDATEI()
+ {
+ OUTANALOG(m_Q, 0.0);
+ }
+ NETLIB_RESETI() { }
+ protected:
+ analog_output_t m_Q;
+ };
+
+ // -----------------------------------------------------------------------------
+ // nld_dummy_input
+ // -----------------------------------------------------------------------------
+
+ NETLIB_OBJECT_DERIVED(dummy_input, base_dummy)
+ {
+ public:
+ NETLIB_CONSTRUCTOR_DERIVED(dummy_input, base_dummy)
+ {
+ enregister("I", m_I);
+ }
+
+ protected:
+
+ NETLIB_RESETI() { }
+ NETLIB_UPDATEI() { }
+
+ private:
+ analog_input_t m_I;
+
+ };
+
+ // -----------------------------------------------------------------------------
+ // nld_frontier
+ // -----------------------------------------------------------------------------
+
+ NETLIB_OBJECT_DERIVED(frontier, base_dummy)
+ {
+ public:
+ NETLIB_CONSTRUCTOR_DERIVED(frontier, base_dummy)
+ , m_RIN(netlist(), "m_RIN")
+ , m_ROUT(netlist(), "m_ROUT")
+ , 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);
+ connect_late(m_I, m_RIN.m_P);
+
+ enregister("_Q", m_Q);
+ enregister("_OP",m_ROUT.m_P);
+ enregister("Q",m_ROUT.m_N);
+ connect_late(m_Q, m_ROUT.m_P);
+ }
+
+ NETLIB_RESETI()
+ {
+ m_RIN.set(1.0 / m_p_RIN.Value(),0,0);
+ m_ROUT.set(1.0 / m_p_ROUT.Value(),0,0);
+ }
+
+ NETLIB_UPDATEI()
+ {
+ OUTANALOG(m_Q, INPANALOG(m_I));
+ }
+
+ private:
+ NETLIB_NAME(twoterm) m_RIN;
+ NETLIB_NAME(twoterm) m_ROUT;
+ analog_input_t m_I;
+ analog_output_t m_Q;
+
+ param_double_t m_p_RIN;
+ param_double_t m_p_ROUT;
+ };
+
+ /* -----------------------------------------------------------------------------
+ * nld_function
+ *
+ * FIXME: Currently a proof of concept to get congo bongo working
+ * ----------------------------------------------------------------------------- */
+
+ NETLIB_OBJECT(function)
+ {
+ NETLIB_CONSTRUCTOR(function)
+ , m_N(*this, "N", 2)
+ , m_func(*this, "FUNC", "")
+ {
+ enregister("Q", m_Q);
+
+ for (int i=0; i < m_N; i++)
+ enregister(plib::pfmt("A{1}")(i), m_I[i]);
+
+ plib::pstring_vector_t cmds(m_func.Value(), " ");
+ m_precompiled.clear();
+
+ for (std::size_t i=0; i < cmds.size(); i++)
+ {
+ pstring cmd = cmds[i];
+ rpn_inst rc;
+ if (cmd == "+")
+ rc.m_cmd = ADD;
+ else if (cmd == "-")
+ rc.m_cmd = SUB;
+ else if (cmd == "*")
+ rc.m_cmd = MULT;
+ else if (cmd == "/")
+ rc.m_cmd = DIV;
+ else if (cmd.startsWith("A"))
+ {
+ rc.m_cmd = PUSH_INPUT;
+ rc.m_param = cmd.substr(1).as_long();
+ }
+ else
+ {
+ bool err = false;
+ rc.m_cmd = PUSH_CONST;
+ rc.m_param = cmd.as_double(&err);
+ if (err)
+ netlist().log().fatal("nld_function: unknown/misformatted token <{1}> in <{2}>", cmd, m_func.Value());
+ }
+ m_precompiled.push_back(rc);
+ }
+
+
+ }
+
+ protected:
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ private:
+
+ enum rpn_cmd
+ {
+ ADD,
+ MULT,
+ SUB,
+ DIV,
+ PUSH_CONST,
+ PUSH_INPUT
+ };
+
+ struct rpn_inst
+ {
+ rpn_inst() : m_cmd(ADD), m_param(0.0) { }
+ rpn_cmd m_cmd;
+ nl_double m_param;
+ };
+
+ param_int_t m_N;
+ param_str_t m_func;
+ analog_output_t m_Q;
+ analog_input_t m_I[10];
+
+ plib::pvector_t<rpn_inst> m_precompiled;
+ };
+
+ // -----------------------------------------------------------------------------
+ // nld_res_sw
+ // -----------------------------------------------------------------------------
+
+ 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_subalias("1", m_R.m_P);
+ register_subalias("2", m_R.m_N);
+
+ save(NLNAME(m_last_state));
+ }
+
+ NETLIB_SUB(R) m_R;
+ logic_input_t m_I;
+ param_double_t m_RON;
+ param_double_t m_ROFF;
+
+ NETLIB_RESETI()
+ {
+ m_last_state = 0;
+ m_R.set_R(m_ROFF.Value());
+ }
+ //NETLIB_UPDATE_PARAMI();
+ NETLIB_UPDATEI();
+
+ private:
+
+ UINT8 m_last_state;
+ };
+
+ // -----------------------------------------------------------------------------
+ // nld_base_proxy
+ // -----------------------------------------------------------------------------
+
+ NETLIB_OBJECT(base_proxy)
+ {
+ public:
+ nld_base_proxy(netlist_t &anetlist, const pstring &name, logic_t *inout_proxied, core_terminal_t *proxy_inout)
+ : device_t(anetlist, name)
+ {
+ m_logic_family = inout_proxied->logic_family();
+ m_term_proxied = inout_proxied;
+ m_proxy_term = proxy_inout;
+ }
+
+ virtual ~nld_base_proxy() {}
+
+ logic_t &term_proxied() const { return *m_term_proxied; }
+ core_terminal_t &proxy_term() const { return *m_proxy_term; }
+
+ protected:
+
+ virtual const logic_family_desc_t &logic_family() const
+ {
+ return *m_logic_family;
+ }
+
+ private:
+ const logic_family_desc_t *m_logic_family;
+ logic_t *m_term_proxied;
+ core_terminal_t *m_proxy_term;
+ };
+
+ // -----------------------------------------------------------------------------
+ // nld_a_to_d_proxy
+ // -----------------------------------------------------------------------------
+
+ NETLIB_OBJECT_DERIVED(a_to_d_proxy, base_proxy)
+ {
+ 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)
+ {
+ enregister("I", m_I);
+ enregister("Q", m_Q);
+ }
+
+ virtual ~nld_a_to_d_proxy() {}
+
+ analog_input_t m_I;
+ logic_output_t m_Q;
+
+ protected:
+
+ NETLIB_RESETI() { }
+
+ NETLIB_UPDATEI()
+ {
+ if (m_I.Q_Analog() > logic_family().m_high_thresh_V)
+ OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(1));
+ else if (m_I.Q_Analog() < logic_family().m_low_thresh_V)
+ OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(1));
+ else
+ {
+ // do nothing
+ }
+ }
+ private:
+ };
+
+ // -----------------------------------------------------------------------------
+ // nld_base_d_to_a_proxy
+ // -----------------------------------------------------------------------------
+
+ NETLIB_OBJECT_DERIVED(base_d_to_a_proxy, base_proxy)
+ {
+ public:
+ virtual ~nld_base_d_to_a_proxy() {}
+
+ virtual logic_input_t &in() { return m_I; }
+
+ 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)
+ {
+ enregister("I", m_I);
+ }
+
+ logic_input_t m_I;
+
+ private:
+ };
+
+ NETLIB_OBJECT_DERIVED(d_to_a_proxy, base_d_to_a_proxy)
+ {
+ public:
+ nld_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied)
+ : nld_base_d_to_a_proxy(anetlist, name, out_proxied, m_RV.m_P)
+ , 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);
+
+ enregister("_Q", m_Q);
+ register_subalias("Q", m_RV.m_P);
+
+ connect_late(m_RV.m_N, m_Q);
+
+ save(NLNAME(m_last_state));
+ }
+
+ virtual ~nld_d_to_a_proxy() {}
+
+ protected:
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ private:
+ analog_output_t m_Q;
+ NETLIB_SUB(twoterm) m_RV;
+ int m_last_state;
+ bool m_is_timestep;
+ };
+
+
+ class factory_lib_entry_t : public base_factory_t
+ {
+ P_PREVENT_COPYING(factory_lib_entry_t)
+ public:
+
+ ATTR_COLD factory_lib_entry_t(setup_t &setup, const pstring &name, const pstring &classname,
+ const pstring &def_param)
+ : base_factory_t(name, classname, def_param), m_setup(setup) { }
+
+ class wrapper : public device_t
+ {
+ public:
+ wrapper(const pstring &devname, netlist_t &anetlist, const pstring &name)
+ : device_t(anetlist, name), m_devname(devname)
+ {
+ anetlist.setup().namespace_push(name);
+ anetlist.setup().include(m_devname);
+ anetlist.setup().namespace_pop();
+ }
+ protected:
+ NETLIB_RESETI() { }
+ NETLIB_UPDATEI() { }
+
+ pstring m_devname;
+ };
+
+ plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
+ {
+ return plib::owned_ptr<device_t>::Create<wrapper>(this->name(), anetlist, name);
+ }
+
+ private:
+ setup_t &m_setup;
+ };
+
+
+ } //namespace devices
+} // namespace netlist
+
+#endif /* NLD_SYSTEM_H_ */
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp
index f7629065ff4..c4ce27a71e4 100644
--- a/src/lib/netlist/nl_base.cpp
+++ b/src/lib/netlist/nl_base.cpp
@@ -5,15 +5,12 @@
*
*/
-#include <solver/nld_matrix_solver.h>
-
-#include <cstring>
-#include <algorithm>
+#include "solver/nld_matrix_solver.h"
#include "plib/palloc.h"
#include "nl_base.h"
-#include "devices/nld_system.h"
+#include "devices/nlid_system.h"
#include "nl_util.h"
const netlist::netlist_time netlist::netlist_time::zero = netlist::netlist_time(0);
@@ -21,8 +18,8 @@ const netlist::netlist_time netlist::netlist_time::zero = netlist::netlist_time(
namespace netlist
{
-#if 0
-static pmempool p(65536, 16);
+#if (NL_USE_MEMPOOL)
+static plib::pmempool p(65536, 16);
void * object_t::operator new (size_t size)
{
@@ -64,9 +61,9 @@ public:
m_R_low = 1.0;
m_R_high = 130.0;
}
- virtual plib::powned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override
+ virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override
{
- return plib::powned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
+ return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
}
};
@@ -84,9 +81,9 @@ public:
m_R_low = 10.0;
m_R_high = 10.0;
}
- virtual plib::powned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override
+ virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *proxied) const override
{
- return plib::powned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
+ return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
}
};
@@ -264,7 +261,7 @@ ATTR_COLD void netlist_t::start()
|| setup().factory().is_class<devices::NETLIB_NAME(gnd)>(e.second)
|| setup().factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
{
- auto dev = plib::powned_ptr<device_t>(e.second->Create(*this, e.first));
+ auto dev = plib::owned_ptr<device_t>(e.second->Create(*this, e.first));
setup().register_dev_s(std::move(dev));
}
}
@@ -287,7 +284,7 @@ ATTR_COLD void netlist_t::start()
&& !setup().factory().is_class<devices::NETLIB_NAME(gnd)>(e.second)
&& !setup().factory().is_class<devices::NETLIB_NAME(netlistparams)>(e.second))
{
- auto dev = plib::powned_ptr<device_t>(e.second->Create(*this, e.first));
+ auto dev = plib::owned_ptr<device_t>(e.second->Create(*this, e.first));
setup().register_dev_s(std::move(dev));
}
}
@@ -495,7 +492,7 @@ ATTR_COLD core_device_t::core_device_t(core_device_t &owner, const pstring &name
if (logic_family() == nullptr)
set_logic_family(family_TTL());
init_object(owner.netlist(), owner.name() + "." + name);
- owner.netlist().m_devices.push_back(plib::powned_ptr<core_device_t>(this, false));
+ owner.netlist().m_devices.push_back(plib::owned_ptr<core_device_t>(this, false));
}
ATTR_COLD core_device_t::~core_device_t()
@@ -1069,18 +1066,22 @@ ATTR_COLD nl_double param_model_t::model_value(const pstring &entity)
} // namespace
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
-// ----------------------------------------------------------------------------------------
-// mainclock
-// ----------------------------------------------------------------------------------------
+ // ----------------------------------------------------------------------------------------
+ // mainclock
+ // ----------------------------------------------------------------------------------------
-ATTR_HOT /* inline */ void NETLIB_NAME(mainclock)::mc_update(logic_net_t &net)
-{
- net.toggle_new_Q();
- net.update_devs();
-}
+ ATTR_HOT /* inline */ void NETLIB_NAME(mainclock)::mc_update(logic_net_t &net)
+ {
+ net.toggle_new_Q();
+ net.update_devs();
+ }
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index 63650c25700..427fa100a22 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -180,9 +180,6 @@ using netlist_sig_t = std::uint32_t;
// MACROS / New Syntax
//============================================================
-#define NETLIB_NAMESPACE_DEVICES_START() namespace netlist { namespace devices {
-#define NETLIB_NAMESPACE_DEVICES_END() }}
-
#define NETLIB_NAME(chip) nld_ ## chip
#define NETLIB_OBJECT_DERIVED(name, pclass) \
@@ -239,12 +236,6 @@ class NETLIB_NAME(name) : public device_t
#define NETLIB_UPDATE_TERMINALS(chip) ATTR_HOT void NETLIB_NAME(chip) :: update_terminals(void)
-
-//============================================================
-// MACROS / netlist devices
-//============================================================
-
-
//============================================================
// Asserts
//============================================================
@@ -313,7 +304,7 @@ namespace netlist
public:
logic_family_desc_t() {}
virtual ~logic_family_desc_t() {}
- virtual plib::powned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name,
+ virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist, const pstring &name,
logic_output_t *proxied) const = 0;
nl_double m_low_thresh_V;
@@ -404,11 +395,11 @@ namespace netlist
const type_t m_objtype;
netlist_t * m_netlist;
-#if 1
public:
+ void * operator new (size_t size, void *ptr) { return ptr; }
+ void operator delete (void *ptr, void *) { }
void * operator new (size_t size);
void operator delete (void * mem);
-#endif
};
// -----------------------------------------------------------------------------
@@ -1015,6 +1006,8 @@ 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();
}
@@ -1270,7 +1263,7 @@ namespace netlist
void print_stats() const;
- plib::pvector_t<plib::powned_ptr<core_device_t>> m_devices;
+ plib::pvector_t<plib::owned_ptr<core_device_t>> m_devices;
/* sole use is to manage lifetime of net objects */
net_t::list_t m_nets;
@@ -1306,6 +1299,7 @@ protected:
plib::dynlib *m_lib; // external lib needs to be loaded as long as netlist exists
};
+
// -----------------------------------------------------------------------------
// inline implementations
// -----------------------------------------------------------------------------
diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h
index dd96bbd5ecc..6ca57b864f5 100644
--- a/src/lib/netlist/nl_config.h
+++ b/src/lib/netlist/nl_config.h
@@ -14,8 +14,6 @@
// SETUP
//============================================================
-#define NOEXCEPT noexcept
-
/*
* The following options determine how object::update is called.
* NL_PMF_TYPE_VIRTUAL
@@ -48,11 +46,6 @@
* Disappointing is the GNUC_PMF performance.
*/
-
-/* FIXME: Currently, we are not registering subdevices and thus these will not
- * be started and the internal method will not be initialized.
- */
-
// This will be autodetected
//#define NL_PMF_TYPE 0
@@ -73,38 +66,26 @@
#pragma GCC diagnostic ignored "-Wpmf-conversions"
#endif
-#define USE_TRUTHTABLE (1)
-// The following adds about 10% performance ...
-#if !defined(USE_OPENMP)
-#define USE_OPENMP (0)
-#endif // !defined(USE_OPENMP)
-
-// Use nano-second resolution - Sufficient for now
-#define NETLIST_INTERNAL_RES (U64(1000000000))
-//#define NETLIST_INTERNAL_RES (U64(1000000000000))
-
-#define NETLIST_CLOCK (NETLIST_INTERNAL_RES)
-
-#define NETLIST_GMIN_DEFAULT (1e-9)
-
-//#define nl_double float
-//#define NL_FCONST(x) (x ## f)
-
-#define nl_double double
-#define NL_FCONST(x) x
+//============================================================
+// GENERAL
+//============================================================
+#define NL_USE_MEMPOOL (0)
+#define USE_TRUTHTABLE (1)
//============================================================
// Solver defines
//============================================================
-#define USE_MATRIX_GS (0)
-#define USE_GABS (1)
+#define USE_MATRIX_GS (0)
+#define USE_GABS (1)
// savings are eaten up by effort
// FIXME: Convert into solver parameter
-#define USE_LINEAR_PREDICTION (0)
+#define USE_LINEAR_PREDICTION (0)
+#define NETLIST_GMIN_DEFAULT (1e-9)
+
//============================================================
@@ -140,9 +121,34 @@
#define end_timing(v) do { } while (0)
#endif
+//============================================================
+// General
+//============================================================
+
// this macro passes an item followed by a string version of itself as two consecutive parameters
#define NLNAME(x) x, #x
+#define NOEXCEPT noexcept
+
+// The following adds about 10% performance ...
+
+#if !defined(USE_OPENMP)
+#define USE_OPENMP (0)
+#endif // !defined(USE_OPENMP)
+
+// Use nano-second resolution - Sufficient for now
+#define NETLIST_INTERNAL_RES (U64(1000000000))
+//#define NETLIST_INTERNAL_RES (U64(1000000000000))
+
+#define NETLIST_CLOCK (NETLIST_INTERNAL_RES)
+
+//#define nl_double float
+//#define NL_FCONST(x) (x ## f)
+
+#define nl_double double
+#define NL_FCONST(x) x
+
+
//============================================================
// WARNINGS
//============================================================
diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp
index 0b59d0afef4..ca349e7dd67 100644
--- a/src/lib/netlist/nl_factory.cpp
+++ b/src/lib/netlist/nl_factory.cpp
@@ -67,12 +67,6 @@ void factory_list_t::error(const pstring &s)
m_setup.log().fatal("{1}", s);
}
-plib::powned_ptr<device_t> factory_list_t::new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name)
-{
- base_factory_t *f = factory_by_name(devname);
- return f->Create(anetlist, name);
-}
-
base_factory_t * factory_list_t::factory_by_name(const pstring &devname)
{
for (auto & e : *this)
diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h
index 97374d29c1a..d1bd0b6f728 100644
--- a/src/lib/netlist/nl_factory.h
+++ b/src/lib/netlist/nl_factory.h
@@ -15,8 +15,11 @@
#include "plib/plists.h"
#include "nl_base.h"
+#define NETLIB_DEVICE_IMPL(chip) factory_creator_ptr_t decl_ ## chip = factory_creator_t< NETLIB_NAME(chip) >;
+
namespace netlist
{
+
// -----------------------------------------------------------------------------
// net_dev class factory
// -----------------------------------------------------------------------------
@@ -32,7 +35,7 @@ namespace netlist
virtual ~base_factory_t() {}
- virtual plib::powned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) = 0;
+ virtual plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) = 0;
const pstring &name() const { return m_name; }
const pstring &classname() const { return m_classname; }
@@ -46,7 +49,7 @@ namespace netlist
pstring m_def_param; /* default parameter */
};
- template <class device_class>
+ template <class C>
class factory_t : public base_factory_t
{
P_PREVENT_COPYING(factory_t)
@@ -55,14 +58,13 @@ namespace netlist
const pstring &def_param)
: base_factory_t(name, classname, def_param) { }
- plib::powned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
+ plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
{
- return plib::powned_ptr<device_t>::Create<device_class>(anetlist, name);
+ return plib::owned_ptr<device_t>::Create<C>(anetlist, name);
}
-
};
- class factory_list_t : public plib::pvector_t<plib::powned_ptr<base_factory_t>>
+ class factory_list_t : public plib::pvector_t<plib::owned_ptr<base_factory_t>>
{
public:
factory_list_t(setup_t &m_setup);
@@ -72,10 +74,10 @@ namespace netlist
void register_device(const pstring &name, const pstring &classname,
const pstring &def_param)
{
- register_device(plib::powned_ptr<base_factory_t>::Create<factory_t<device_class>>(name, classname, def_param));
+ register_device(plib::owned_ptr<base_factory_t>::Create<factory_t<device_class>>(name, classname, def_param));
}
- void register_device(plib::powned_ptr<base_factory_t> factory)
+ void register_device(plib::owned_ptr<base_factory_t> factory)
{
for (auto & e : *this)
if (e->name() == factory->name())
@@ -83,9 +85,6 @@ namespace netlist
push_back(std::move(factory));
}
- //ATTR_COLD device_t *new_device_by_classname(const pstring &classname) const;
- // FIXME: legacy, should use factory_by_name
- plib::powned_ptr<device_t> new_device_by_name(const pstring &devname, netlist_t &anetlist, const pstring &name);
base_factory_t * factory_by_name(const pstring &devname);
template <class C>
@@ -100,6 +99,20 @@ namespace netlist
setup_t &m_setup;
};
+ // -----------------------------------------------------------------------------
+ // factory_creator_ptr_t
+ // -----------------------------------------------------------------------------
+
+ using factory_creator_ptr_t = plib::owned_ptr<base_factory_t> (*)(const pstring &name, const pstring &classname,
+ const pstring &def_param);
+
+ template <typename T>
+ plib::owned_ptr<base_factory_t> factory_creator_t(const pstring &name, const pstring &classname,
+ const pstring &def_param)
+ {
+ return plib::owned_ptr<base_factory_t>::Create<factory_t<T>>(name, classname, def_param);
+ }
+
}
#endif /* NLFACTORY_H_ */
diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp
index 2aa4366b0ba..c001a6c0fd6 100644
--- a/src/lib/netlist/nl_parser.cpp
+++ b/src/lib/netlist/nl_parser.cpp
@@ -158,7 +158,7 @@ void parser_t::net_truthtable_start()
pstring def_param = get_string();
require_token(m_tok_param_right);
- plib::powned_ptr<netlist::devices::netlist_base_factory_truthtable_t> ttd = netlist::devices::nl_tt_factory_create(ni, no, hs,
+ plib::owned_ptr<netlist::devices::netlist_base_factory_truthtable_t> ttd = netlist::devices::nl_tt_factory_create(ni, no, hs,
name, name, "+" + def_param);
while (true)
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp
index 8e0b9a11ff2..8fda3d2f8f4 100644
--- a/src/lib/netlist/nl_setup.cpp
+++ b/src/lib/netlist/nl_setup.cpp
@@ -16,7 +16,7 @@
#include "nl_util.h"
#include "nl_factory.h"
#include "devices/net_lib.h"
-#include "devices/nld_system.h"
+#include "devices/nlid_system.h"
#include "analog/nld_twoterm.h"
#include "solver/nld_solver.h"
@@ -100,7 +100,7 @@ void setup_t::namespace_pop()
}
-void setup_t::register_dev(plib::powned_ptr<device_t> dev)
+void setup_t::register_dev(plib::owned_ptr<device_t> dev)
{
for (auto & d : netlist().m_devices)
if (d->name() == dev->name())
@@ -529,7 +529,7 @@ void setup_t::connect_input_output(core_terminal_t &in, core_terminal_t &out)
{
logic_input_t &incast = dynamic_cast<logic_input_t &>(in);
pstring x = plib::pfmt("proxy_ad_{1}_{2}")(in.name())( m_proxy_cnt);
- auto proxy = plib::powned_ptr<devices::nld_a_to_d_proxy>::Create(netlist(), x, &incast);
+ auto proxy = plib::owned_ptr<devices::nld_a_to_d_proxy>::Create(netlist(), x, &incast);
incast.set_proxy(proxy.get());
m_proxy_cnt++;
@@ -567,7 +567,7 @@ void setup_t::connect_terminal_input(terminal_t &term, core_terminal_t &inp)
logic_input_t &incast = dynamic_cast<logic_input_t &>(inp);
log().debug("connect_terminal_input: connecting proxy\n");
pstring x = plib::pfmt("proxy_ad_{1}_{2}")(inp.name())(m_proxy_cnt);
- auto proxy = plib::powned_ptr<devices::nld_a_to_d_proxy>::Create(netlist(), x, &incast);
+ auto proxy = plib::owned_ptr<devices::nld_a_to_d_proxy>::Create(netlist(), x, &incast);
incast.set_proxy(proxy.get());
m_proxy_cnt++;
@@ -853,7 +853,7 @@ void setup_t::start_devices()
for (pstring ll : loglist)
{
pstring name = "log_" + ll;
- auto nc = factory().new_device_by_name("LOG", netlist(), name);
+ auto nc = factory().factory_by_name("LOG")->Create(netlist(), name);
register_link(name + ".I", ll);
log().debug(" dynamic link {1}: <{2}>\n",ll, name);
register_dev_s(std::move(nc));
@@ -872,10 +872,10 @@ class logic_family_std_proxy_t : public logic_family_desc_t
{
public:
logic_family_std_proxy_t() { }
- virtual plib::powned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist,
+ virtual plib::owned_ptr<devices::nld_base_d_to_a_proxy> create_d_a_proxy(netlist_t &anetlist,
const pstring &name, logic_output_t *proxied) const override
{
- return plib::powned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
+ return plib::owned_ptr<devices::nld_base_d_to_a_proxy>::Create<devices::nld_d_to_a_proxy>(anetlist, name, proxied);
}
};
diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h
index bb0a6f2d01a..d7ab1723b79 100644
--- a/src/lib/netlist/nl_setup.h
+++ b/src/lib/netlist/nl_setup.h
@@ -116,13 +116,13 @@ namespace netlist
void register_object(device_t &dev, const pstring &name, object_t &obj);
template<class NETLIST_X>
- void register_dev_s(plib::powned_ptr<NETLIST_X> dev)
+ void register_dev_s(plib::owned_ptr<NETLIST_X> dev)
{
register_dev(std::move(dev));
}
- void register_dev(plib::powned_ptr<device_t> dev);
+ void register_dev(plib::owned_ptr<device_t> dev);
void register_dev(const pstring &classname, const pstring &name);
void register_lib_entry(const pstring &name);
diff --git a/src/lib/netlist/nl_time.h b/src/lib/netlist/nl_time.h
index a97a02bc34a..7949f68e132 100644
--- a/src/lib/netlist/nl_time.h
+++ b/src/lib/netlist/nl_time.h
@@ -137,11 +137,11 @@ namespace netlist
}
-PLIB_NAMESPACE_START()
+namespace plib {
template<> ATTR_COLD inline void pstate_manager_t::save_item(netlist::netlist_time &nlt, const void *owner, const pstring &stname)
{
save_state_ptr(stname, netlist::netlist_time::STATETYPE, owner, sizeof(netlist::netlist_time::INTERNALTYPE), 1, nlt.get_internaltype_ptr(), false);
}
-PLIB_NAMESPACE_END()
+}
#endif /* NLTIME_H_ */
diff --git a/src/lib/netlist/plib/palloc.cpp b/src/lib/netlist/plib/palloc.cpp
index c3d674f7519..f58da749792 100644
--- a/src/lib/netlist/plib/palloc.cpp
+++ b/src/lib/netlist/plib/palloc.cpp
@@ -10,7 +10,7 @@
#include "pconfig.h"
#include "palloc.h"
-PLIB_NAMESPACE_START()
+namespace plib {
//============================================================
// Exceptions
@@ -22,11 +22,11 @@ pexception::pexception(const pstring &text)
fprintf(stderr, "%s\n", m_text.cstr());
}
-pmempool::pmempool(int min_alloc, int min_align)
+mempool::mempool(int min_alloc, int min_align)
: m_min_alloc(min_alloc), m_min_align(min_align)
{
}
-pmempool::~pmempool()
+mempool::~mempool()
{
for (auto & b : m_blocks)
{
@@ -37,7 +37,7 @@ pmempool::~pmempool()
m_blocks.clear();
}
-int pmempool::new_block()
+int mempool::new_block()
{
block b;
b.data = new char[m_min_alloc];
@@ -49,7 +49,7 @@ int pmempool::new_block()
}
-void *pmempool::alloc(size_t size)
+void *mempool::alloc(size_t size)
{
size_t rs = (size + sizeof(info) + m_min_align - 1) & ~(m_min_align - 1);
for (int bn=0; bn < m_blocks.size(); bn++)
@@ -79,7 +79,7 @@ void *pmempool::alloc(size_t size)
}
}
-void pmempool::free(void *ptr)
+void mempool::free(void *ptr)
{
char *p = (char *) ptr;
@@ -95,4 +95,4 @@ void pmempool::free(void *ptr)
b->m_num_alloc--;
}
-PLIB_NAMESPACE_END()
+}
diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h
index bd994466226..6b79d410bc8 100644
--- a/src/lib/netlist/plib/palloc.h
+++ b/src/lib/netlist/plib/palloc.h
@@ -36,7 +36,7 @@
#endif
-PLIB_NAMESPACE_START()
+namespace plib {
//============================================================
// exception base
@@ -77,7 +77,7 @@ template<typename T>
void pfree_array(T *ptr) { delete [] ptr; }
template<typename T, typename... Args>
-std::unique_ptr<T> pmake_unique(Args&&... args) {
+std::unique_ptr<T> make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
@@ -89,19 +89,19 @@ static std::unique_ptr<BC> make_unique_base(Args&&... args)
}
template <typename SC>
-class powned_ptr
+class owned_ptr
{
private:
- powned_ptr()
+ owned_ptr()
: m_ptr(nullptr), m_is_owned(true) { }
public:
- powned_ptr(SC *p, bool owned)
+ owned_ptr(SC *p, bool owned)
: m_ptr(p), m_is_owned(owned)
{ }
- powned_ptr(const powned_ptr &r) = delete;
- powned_ptr & operator =(const powned_ptr &r) = delete;
+ owned_ptr(const owned_ptr &r) = delete;
+ owned_ptr & operator =(const owned_ptr &r) = delete;
- powned_ptr(powned_ptr &&r)
+ owned_ptr(owned_ptr &&r)
{
m_is_owned = r.m_is_owned;
m_ptr = r.m_ptr;
@@ -110,7 +110,7 @@ public:
}
template<typename DC>
- powned_ptr(powned_ptr<DC> &&r)
+ owned_ptr(owned_ptr<DC> &&r)
{
SC *dest_ptr = &dynamic_cast<SC &>(*r.get());
bool o = r.is_owned();
@@ -119,24 +119,24 @@ public:
m_ptr = dest_ptr;
}
- ~powned_ptr()
+ ~owned_ptr()
{
if (m_is_owned)
delete m_ptr;
}
template<typename DC, typename... Args>
- static powned_ptr Create(Args&&... args)
+ static owned_ptr Create(Args&&... args)
{
- powned_ptr a;
+ owned_ptr a;
DC *x = new DC(std::forward<Args>(args)...);
a.m_ptr = static_cast<SC *>(x);
return a;
}
template<typename... Args>
- static powned_ptr Create(Args&&... args)
+ static owned_ptr Create(Args&&... args)
{
- powned_ptr a;
+ owned_ptr a;
a.m_ptr = new SC(std::forward<Args>(args)...);
return a;
}
@@ -149,7 +149,7 @@ public:
bool is_owned() const { return m_is_owned; }
template<typename DC>
- powned_ptr<DC> & operator =(powned_ptr<DC> &r)
+ owned_ptr<DC> & operator =(owned_ptr<DC> &r)
{
m_is_owned = r.m_is_owned;
m_ptr = r.m_ptr;
@@ -165,7 +165,7 @@ private:
bool m_is_owned;
};
-class pmempool
+class mempool
{
private:
struct block
@@ -186,8 +186,8 @@ private:
};
public:
- pmempool(int min_alloc, int min_align);
- ~pmempool();
+ mempool(int min_alloc, int min_align);
+ ~mempool();
void *alloc(size_t size);
void free(void *ptr);
@@ -198,6 +198,6 @@ public:
std::vector<block> m_blocks;
};
-PLIB_NAMESPACE_END()
+}
#endif /* PALLOC_H_ */
diff --git a/src/lib/netlist/plib/pconfig.h b/src/lib/netlist/plib/pconfig.h
index 1b7a241c1d4..7634c663123 100644
--- a/src/lib/netlist/plib/pconfig.h
+++ b/src/lib/netlist/plib/pconfig.h
@@ -27,9 +27,6 @@ typedef _uint128_t UINT128;
typedef _int128_t INT128;
#endif
-#define PLIB_NAMESPACE_START() namespace plib {
-#define PLIB_NAMESPACE_END() }
-
#if !(PSTANDALONE)
#include "osdcomm.h"
//#include "eminline.h"
@@ -139,7 +136,7 @@ typedef int64_t INT64;
#endif
-PLIB_NAMESPACE_START()
+namespace plib {
using ticks_t = INT64;
@@ -171,59 +168,59 @@ static inline ticks_t profile_ticks() { return ticks(); }
*/
#if (PHAS_PMF_INTERNAL)
-class mfp
-{
-public:
- // construct from any member function pointer
- class generic_class;
- using generic_function = void (*)();
-
- template<typename MemberFunctionType>
- mfp(MemberFunctionType mftp)
- : m_function(0), m_this_delta(0)
- {
- *reinterpret_cast<MemberFunctionType *>(this) = mftp;
- }
-
- // binding helper
- template<typename FunctionType, typename ObjectType>
- FunctionType update_after_bind(ObjectType *object)
- {
- return reinterpret_cast<FunctionType>(
- convert_to_generic(reinterpret_cast<generic_class *>(object)));
- }
- template<typename FunctionType, typename MemberFunctionType, typename ObjectType>
- static FunctionType get_mfp(MemberFunctionType mftp, ObjectType *object)
+ class mfp
{
- mfp mfpo(mftp);
- return mfpo.update_after_bind<FunctionType>(object);
- }
-
-private:
- // extract the generic function and adjust the object pointer
- generic_function convert_to_generic(generic_class * object) const
- {
- // apply the "this" delta to the object first
- generic_class * o_p_delta = reinterpret_cast<generic_class *>(reinterpret_cast<std::uint8_t *>(object) + m_this_delta);
-
- // if the low bit of the vtable index is clear, then it is just a raw function pointer
- if (!(m_function & 1))
- return reinterpret_cast<generic_function>(m_function);
-
- // otherwise, it is the byte index into the vtable where the actual function lives
- std::uint8_t *vtable_base = *reinterpret_cast<std::uint8_t **>(o_p_delta);
- return *reinterpret_cast<generic_function *>(vtable_base + m_function - 1);
- }
-
- // actual state
- uintptr_t m_function; // first item can be one of two things:
- // if even, it's a pointer to the function
- // if odd, it's the byte offset into the vtable
- int m_this_delta; // delta to apply to the 'this' pointer
-};
+ public:
+ // construct from any member function pointer
+ class generic_class;
+ using generic_function = void (*)();
+
+ template<typename MemberFunctionType>
+ mfp(MemberFunctionType mftp)
+ : m_function(0), m_this_delta(0)
+ {
+ *reinterpret_cast<MemberFunctionType *>(this) = mftp;
+ }
+
+ // binding helper
+ template<typename FunctionType, typename ObjectType>
+ FunctionType update_after_bind(ObjectType *object)
+ {
+ return reinterpret_cast<FunctionType>(
+ convert_to_generic(reinterpret_cast<generic_class *>(object)));
+ }
+ template<typename FunctionType, typename MemberFunctionType, typename ObjectType>
+ static FunctionType get_mfp(MemberFunctionType mftp, ObjectType *object)
+ {
+ mfp mfpo(mftp);
+ return mfpo.update_after_bind<FunctionType>(object);
+ }
+
+ private:
+ // extract the generic function and adjust the object pointer
+ generic_function convert_to_generic(generic_class * object) const
+ {
+ // apply the "this" delta to the object first
+ generic_class * o_p_delta = reinterpret_cast<generic_class *>(reinterpret_cast<std::uint8_t *>(object) + m_this_delta);
+
+ // if the low bit of the vtable index is clear, then it is just a raw function pointer
+ if (!(m_function & 1))
+ return reinterpret_cast<generic_function>(m_function);
+
+ // otherwise, it is the byte index into the vtable where the actual function lives
+ std::uint8_t *vtable_base = *reinterpret_cast<std::uint8_t **>(o_p_delta);
+ return *reinterpret_cast<generic_function *>(vtable_base + m_function - 1);
+ }
+
+ // actual state
+ uintptr_t m_function; // first item can be one of two things:
+ // if even, it's a pointer to the function
+ // if odd, it's the byte offset into the vtable
+ int m_this_delta; // delta to apply to the 'this' pointer
+ };
#endif
-PLIB_NAMESPACE_END()
+}
#endif /* PCONFIG_H_ */
diff --git a/src/lib/netlist/plib/pdynlib.cpp b/src/lib/netlist/plib/pdynlib.cpp
index f1901e4dda3..27021c9d364 100644
--- a/src/lib/netlist/plib/pdynlib.cpp
+++ b/src/lib/netlist/plib/pdynlib.cpp
@@ -12,7 +12,7 @@
#include <dlfcn.h>
#endif
-PLIB_NAMESPACE_START()
+namespace plib {
dynlib::dynlib(const pstring libname)
: m_isLoaded(false), m_lib(nullptr)
@@ -96,4 +96,4 @@ void *dynlib::getsym_p(const pstring name)
#endif
}
-PLIB_NAMESPACE_END()
+}
diff --git a/src/lib/netlist/plib/pdynlib.h b/src/lib/netlist/plib/pdynlib.h
index 71b885d2b8f..08aa531d1bf 100644
--- a/src/lib/netlist/plib/pdynlib.h
+++ b/src/lib/netlist/plib/pdynlib.h
@@ -13,7 +13,7 @@
#include "pconfig.h"
#include "pstring.h"
-PLIB_NAMESPACE_START()
+namespace plib {
// ----------------------------------------------------------------------------------------
// pdynlib: dynamic loading of libraries ...
@@ -40,6 +40,6 @@ private:
void *m_lib;
};
-PLIB_NAMESPACE_END()
+}
#endif /* PSTRING_H_ */
diff --git a/src/lib/netlist/plib/pfmtlog.cpp b/src/lib/netlist/plib/pfmtlog.cpp
index 90e743b8125..40ab47209ba 100644
--- a/src/lib/netlist/plib/pfmtlog.cpp
+++ b/src/lib/netlist/plib/pfmtlog.cpp
@@ -16,7 +16,7 @@
#include "pfmtlog.h"
#include "palloc.h"
-PLIB_NAMESPACE_START()
+namespace plib {
pfmt::pfmt(const pstring &fmt)
: m_str(m_str_buf), m_allocated(0), m_arg(0)
@@ -164,6 +164,6 @@ void pfmt::format_element(const char *f, const char *l, const char *fmt_spec, .
va_end(ap);
}
-PLIB_NAMESPACE_END()
+}
#endif
diff --git a/src/lib/netlist/plib/pfmtlog.h b/src/lib/netlist/plib/pfmtlog.h
index 1aff9473311..603e623c103 100644
--- a/src/lib/netlist/plib/pfmtlog.h
+++ b/src/lib/netlist/plib/pfmtlog.h
@@ -14,7 +14,7 @@
#include "pstring.h"
#include "ptypes.h"
-PLIB_NAMESPACE_START()
+namespace plib {
template <typename T>
struct ptype_treats
@@ -295,7 +295,7 @@ void plog_channel<L, build_enabled>::vdowrite(const pstring &ls) const
m_base->vlog(L, ls);
}
-PLIB_NAMESPACE_END()
+}
#endif /* PSTRING_H_ */
diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h
index c2a4f44565a..4e1454a7d30 100644
--- a/src/lib/netlist/plib/plists.h
+++ b/src/lib/netlist/plib/plists.h
@@ -10,16 +10,14 @@
#ifndef PLISTS_H_
#define PLISTS_H_
-#include <cstring>
#include <algorithm>
-#include <cmath>
#include <stack>
#include <vector>
#include "palloc.h"
#include "pstring.h"
-PLIB_NAMESPACE_START()
+namespace plib {
// ----------------------------------------------------------------------------------------
// parray_t: dynamic array
@@ -87,6 +85,52 @@ private:
int m_capacity;
};
+/* ----------------------------------------------------------------------------------------
+ * uninitialised_array_t:
+ * fixed size array allowing to override constructor and initialize
+ * members by placement new.
+ *
+ * Use with care. This template is provided to improve locality of storage
+ * in high frequency applications. It should not be used for anything else.
+ * ---------------------------------------------------------------------------------------- */
+
+template <class C, std::size_t N>
+class uninitialised_array_t
+{
+public:
+ uninitialised_array_t()
+ {
+ }
+
+ ~uninitialised_array_t()
+ {
+ for (std::size_t i=0; i<N; i++)
+ {
+ C &r = (*this)[i];
+ r.~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));
+ }
+
+ const C& operator[](const std::size_t &index) const
+ {
+ return *reinterpret_cast<C *>(reinterpret_cast<char *>(m_buf) + index * sizeof(C));
+ }
+
+protected:
+
+private:
+
+ /* ensure proper alignment */
+ UINT64 m_buf[(N * sizeof(C) + sizeof(UINT64) - 1) / sizeof(UINT64)];
+};
+
// ----------------------------------------------------------------------------------------
// plist_t: a simple list
// ----------------------------------------------------------------------------------------
@@ -617,6 +661,6 @@ static inline void sort_list(T &sl)
}
}
-PLIB_NAMESPACE_END()
+}
#endif /* PLISTS_H_ */
diff --git a/src/lib/netlist/plib/poptions.h b/src/lib/netlist/plib/poptions.h
index 1665738ebe4..ea48598d5f5 100644
--- a/src/lib/netlist/plib/poptions.h
+++ b/src/lib/netlist/plib/poptions.h
@@ -15,7 +15,7 @@
#include "pstring.h"
#include "plists.h"
-PLIB_NAMESPACE_START()
+namespace plib {
/***************************************************************************
Options
@@ -235,6 +235,6 @@ option::option(pstring ashort, pstring along, pstring help, bool has_argument, o
parent->register_option(this);
}
-PLIB_NAMESPACE_END()
+}
#endif /* POPTIONS_H_ */
diff --git a/src/lib/netlist/plib/pparser.cpp b/src/lib/netlist/plib/pparser.cpp
index dc0c99e8560..ad60a91b4b1 100644
--- a/src/lib/netlist/plib/pparser.cpp
+++ b/src/lib/netlist/plib/pparser.cpp
@@ -9,7 +9,7 @@
#include "pparser.h"
-PLIB_NAMESPACE_START()
+namespace plib {
// ----------------------------------------------------------------------------------------
// A simple tokenizer
// ----------------------------------------------------------------------------------------
@@ -470,4 +470,4 @@ postream & ppreprocessor::process_i(pistream &istrm, postream &ostrm)
return ostrm;
}
-PLIB_NAMESPACE_END()
+}
diff --git a/src/lib/netlist/plib/pparser.h b/src/lib/netlist/plib/pparser.h
index e5bd3617cda..dd08d781313 100644
--- a/src/lib/netlist/plib/pparser.h
+++ b/src/lib/netlist/plib/pparser.h
@@ -13,7 +13,7 @@
#include "plists.h"
#include "pstream.h"
-PLIB_NAMESPACE_START()
+namespace plib {
class ptokenizer
{
@@ -197,6 +197,6 @@ private:
int m_lineno;
};
-PLIB_NAMESPACE_END()
+}
#endif /* PPARSER_H_ */
diff --git a/src/lib/netlist/plib/pstate.cpp b/src/lib/netlist/plib/pstate.cpp
index f0763d5eab4..bd16ee172e2 100644
--- a/src/lib/netlist/plib/pstate.cpp
+++ b/src/lib/netlist/plib/pstate.cpp
@@ -7,7 +7,7 @@
#include "pstate.h"
-PLIB_NAMESPACE_START()
+namespace plib {
pstate_manager_t::pstate_manager_t()
{
@@ -38,7 +38,7 @@ ATTR_COLD void pstate_manager_t::save_state_ptr(const pstring &stname, const pst
"DT_FLOAT"
};
- auto p = pmake_unique<pstate_entry_t>(stname, dt, owner, size, count, ptr, is_ptr);
+ auto p = plib::make_unique<pstate_entry_t>(stname, dt, owner, size, count, ptr, is_ptr);
m_save.push_back(std::move(p));
}
@@ -72,9 +72,9 @@ template<> ATTR_COLD void pstate_manager_t::save_item(pstate_callback_t &state,
{
//save_state_ptr(stname, DT_CUSTOM, 0, 1, &state);
pstate_callback_t *state_p = &state;
- auto p = pmake_unique<pstate_entry_t>(stname, owner, state_p);
+ auto p = plib::make_unique<pstate_entry_t>(stname, owner, state_p);
m_save.push_back(std::move(p));
state.register_state(*this, stname);
}
-PLIB_NAMESPACE_END()
+}
diff --git a/src/lib/netlist/plib/pstate.h b/src/lib/netlist/plib/pstate.h
index 5432c37f327..846bad2cc68 100644
--- a/src/lib/netlist/plib/pstate.h
+++ b/src/lib/netlist/plib/pstate.h
@@ -68,7 +68,7 @@ NETLIST_SAVE_TYPE(UINT16, DT_INT16);
NETLIST_SAVE_TYPE(INT16, DT_INT16);
//NETLIST_SAVE_TYPE(std::size_t, DT_INT64);
-PLIB_NAMESPACE_START()
+namespace plib {
class pstate_manager_t;
@@ -187,6 +187,6 @@ public:
}
};
-PLIB_NAMESPACE_END()
+}
#endif /* PSTATE_H_ */
diff --git a/src/lib/netlist/plib/pstream.cpp b/src/lib/netlist/plib/pstream.cpp
index dd3713499d5..8b09f58fc03 100644
--- a/src/lib/netlist/plib/pstream.cpp
+++ b/src/lib/netlist/plib/pstream.cpp
@@ -13,7 +13,7 @@
#include "pstream.h"
#include "palloc.h"
-PLIB_NAMESPACE_START()
+namespace plib {
// -----------------------------------------------------------------------------
// pistream: input stream
@@ -363,4 +363,4 @@ pstream::pos_type pomemstream::vtell()
return m_pos;
}
-PLIB_NAMESPACE_END()
+}
diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h
index b0a5c0379da..9da07105df6 100644
--- a/src/lib/netlist/plib/pstream.h
+++ b/src/lib/netlist/plib/pstream.h
@@ -16,7 +16,7 @@
#include "palloc.h"
#include "pfmtlog.h"
-PLIB_NAMESPACE_START()
+namespace plib {
// -----------------------------------------------------------------------------
// pstream: things common to all streams
@@ -377,6 +377,6 @@ private:
postream &m_strm;
};
-PLIB_NAMESPACE_END()
+}
#endif /* PSTREAM_H_ */
diff --git a/src/lib/netlist/plib/ptypes.h b/src/lib/netlist/plib/ptypes.h
index a747dc9e8d7..06246846d0e 100644
--- a/src/lib/netlist/plib/ptypes.h
+++ b/src/lib/netlist/plib/ptypes.h
@@ -11,7 +11,7 @@
#include "pconfig.h"
#include "pstring.h"
-PLIB_NAMESPACE_START()
+namespace plib {
//============================================================
// penum - strongly typed enumeration
@@ -76,7 +76,7 @@ protected:
}
};
-PLIB_NAMESPACE_END()
+}
#define P_ENUM(ename, ...) \
struct ename : public plib::enum_base { \
diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h
index b4e8da156c8..44db4d9e73a 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.h
+++ b/src/lib/netlist/solver/nld_matrix_solver.h
@@ -8,12 +8,15 @@
#ifndef NLD_MATRIX_SOLVER_H_
#define NLD_MATRIX_SOLVER_H_
+#include <type_traits>
+
#include "solver/nld_solver.h"
#include "plib/pstream.h"
-#include <type_traits>
-
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
class terms_t
{
@@ -281,6 +284,7 @@ void matrix_solver_t::build_LE_RHS()
}
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_MS_DIRECT_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_direct.h b/src/lib/netlist/solver/nld_ms_direct.h
index 47a2d62027b..519693af885 100644
--- a/src/lib/netlist/solver/nld_ms_direct.h
+++ b/src/lib/netlist/solver/nld_ms_direct.h
@@ -26,7 +26,10 @@
#include <atomic>
#endif
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
//#define nl_ext_double _float128 // slow, very slow
//#define nl_ext_double long double // slightly slower
@@ -450,6 +453,7 @@ matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(netlist_t &anetli
#endif
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_MS_DIRECT_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_direct1.h b/src/lib/netlist/solver/nld_ms_direct1.h
index fa994cc0413..4d8ae1fb677 100644
--- a/src/lib/netlist/solver/nld_ms_direct1.h
+++ b/src/lib/netlist/solver/nld_ms_direct1.h
@@ -11,7 +11,10 @@
#include "solver/nld_ms_direct.h"
#include "solver/nld_solver.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
class matrix_solver_direct1_t: public matrix_solver_direct_t<1,1>
{
@@ -49,7 +52,8 @@ inline int matrix_solver_direct1_t::vsolve_non_dynamic(ATTR_UNUSED const bool ne
return 1;
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_MS_DIRECT1_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_direct2.h b/src/lib/netlist/solver/nld_ms_direct2.h
index 0a9c5cdd0b4..4094f84c8a2 100644
--- a/src/lib/netlist/solver/nld_ms_direct2.h
+++ b/src/lib/netlist/solver/nld_ms_direct2.h
@@ -11,7 +11,10 @@
#include "solver/nld_ms_direct.h"
#include "solver/nld_solver.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
class matrix_solver_direct2_t: public matrix_solver_direct_t<2,2>
{
@@ -55,6 +58,7 @@ inline int matrix_solver_direct2_t::vsolve_non_dynamic(ATTR_UNUSED const bool ne
return 1;
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_MS_DIRECT2_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_direct_lu.h b/src/lib/netlist/solver/nld_ms_direct_lu.h
index 6f6288f9c48..b45e23d42ec 100644
--- a/src/lib/netlist/solver/nld_ms_direct_lu.h
+++ b/src/lib/netlist/solver/nld_ms_direct_lu.h
@@ -15,7 +15,10 @@
//#define A(r, c) m_A[_r][_c]
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
//#define nl_ext_double _float128 // slow, very slow
//#define nl_ext_double long double // slightly slower
@@ -625,6 +628,7 @@ matrix_solver_direct_t<m_N, storage_N>::matrix_solver_direct_t(const eSolverType
}
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_MS_DIRECT_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_gcr.h b/src/lib/netlist/solver/nld_ms_gcr.h
index 7ffe4594d3a..f963c59be01 100644
--- a/src/lib/netlist/solver/nld_ms_gcr.h
+++ b/src/lib/netlist/solver/nld_ms_gcr.h
@@ -23,7 +23,10 @@
#define NL_USE_SSE 0
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
template <unsigned m_N, unsigned storage_N>
class matrix_solver_GCR_t: public matrix_solver_t
@@ -395,6 +398,7 @@ int matrix_solver_GCR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_ra
}
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_MS_GCR_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_gmres.h b/src/lib/netlist/solver/nld_ms_gmres.h
index 6d0bb404fd3..e4ee5fe0cb8 100644
--- a/src/lib/netlist/solver/nld_ms_gmres.h
+++ b/src/lib/netlist/solver/nld_ms_gmres.h
@@ -19,7 +19,10 @@
#include "solver/nld_solver.h"
#include "solver/vector_base.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
template <unsigned m_N, unsigned storage_N>
class matrix_solver_GMRES_t: public matrix_solver_direct_t<m_N, storage_N>
@@ -381,6 +384,7 @@ int matrix_solver_GMRES_t<m_N, storage_N>::solve_ilu_gmres (nl_double * RESTRICT
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_MS_GMRES_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_sm.h b/src/lib/netlist/solver/nld_ms_sm.h
index c11e4fd0500..331161751f9 100644
--- a/src/lib/netlist/solver/nld_ms_sm.h
+++ b/src/lib/netlist/solver/nld_ms_sm.h
@@ -39,7 +39,10 @@
#include "solver/nld_matrix_solver.h"
#include "solver/vector_base.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
//#define nl_ext_double _float128 // slow, very slow
//#define nl_ext_double long double // slightly slower
@@ -339,6 +342,7 @@ matrix_solver_sm_t<m_N, storage_N>::matrix_solver_sm_t(netlist_t &anetlist, cons
}
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_MS_DIRECT_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_sor.h b/src/lib/netlist/solver/nld_ms_sor.h
index 355a7ce138d..5ccb7af6bc0 100644
--- a/src/lib/netlist/solver/nld_ms_sor.h
+++ b/src/lib/netlist/solver/nld_ms_sor.h
@@ -17,7 +17,10 @@
#include "solver/nld_ms_direct.h"
#include "solver/nld_solver.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
template <unsigned m_N, unsigned storage_N>
class matrix_solver_SOR_t: public matrix_solver_direct_t<m_N, storage_N>
@@ -182,6 +185,7 @@ int matrix_solver_SOR_t<m_N, storage_N>::vsolve_non_dynamic(const bool newton_ra
return resched_cnt;
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_MS_SOR_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_sor_mat.h b/src/lib/netlist/solver/nld_ms_sor_mat.h
index 099db11ab0f..e828d1a6c31 100644
--- a/src/lib/netlist/solver/nld_ms_sor_mat.h
+++ b/src/lib/netlist/solver/nld_ms_sor_mat.h
@@ -18,7 +18,10 @@
#include "solver/nld_matrix_solver.h"
#include "solver/nld_solver.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
template <unsigned m_N, unsigned storage_N>
class matrix_solver_SOR_mat_t: public matrix_solver_direct_t<m_N, storage_N>
@@ -217,6 +220,7 @@ int matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve_non_dynamic(const bool newto
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_MS_GAUSS_SEIDEL_H_ */
diff --git a/src/lib/netlist/solver/nld_ms_w.h b/src/lib/netlist/solver/nld_ms_w.h
index 2fd64b2f990..cd70d82024b 100644
--- a/src/lib/netlist/solver/nld_ms_w.h
+++ b/src/lib/netlist/solver/nld_ms_w.h
@@ -46,7 +46,10 @@
#include "solver/nld_matrix_solver.h"
#include "solver/vector_base.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
//#define nl_ext_double _float128 // slow, very slow
//#define nl_ext_double long double // slightly slower
@@ -401,6 +404,7 @@ matrix_solver_w_t<m_N, storage_N>::matrix_solver_w_t(netlist_t &anetlist, const
}
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_MS_DIRECT_H_ */
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp
index 92cadc1859c..7d16bcbefc2 100644
--- a/src/lib/netlist/solver/nld_solver.cpp
+++ b/src/lib/netlist/solver/nld_solver.cpp
@@ -55,7 +55,10 @@
#include "nld_ms_sor_mat.h"
#include "nld_ms_gmres.h"
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
ATTR_COLD void terms_t::add(terminal_t *term, int net_other, bool sorted)
{
@@ -847,4 +850,5 @@ void NETLIB_NAME(solver)::create_solver_code(plib::postream &strm)
}
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h
index 86a0d6c3218..7b7aac2a1c1 100644
--- a/src/lib/netlist/solver/nld_solver.h
+++ b/src/lib/netlist/solver/nld_solver.h
@@ -27,7 +27,10 @@
// solver
// ----------------------------------------------------------------------------------------
-NETLIB_NAMESPACE_DEVICES_START()
+namespace netlist
+{
+ namespace devices
+ {
class NETLIB_NAME(solver);
@@ -129,6 +132,7 @@ private:
matrix_solver_t *create_solver(int size, bool use_specific);
};
-NETLIB_NAMESPACE_DEVICES_END()
+ } //namespace devices
+} // namespace netlist
#endif /* NLD_SOLVER_H_ */
diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp
index fde6c663005..145de96aa38 100644
--- a/src/lib/netlist/tools/nl_convert.cpp
+++ b/src/lib/netlist/tools/nl_convert.cpp
@@ -38,7 +38,7 @@ static plib::pvector_t<int> bubble(const plib::pvector_t<Class> &sl)
void nl_convert_base_t::add_pin_alias(const pstring &devname, const pstring &name, const pstring &alias)
{
pstring pname = devname + "." + name;
- m_pins.add(pname, plib::pmake_unique<pin_alias_t>(pname, devname + "." + alias));
+ m_pins.add(pname, plib::make_unique<pin_alias_t>(pname, devname + "." + alias));
}
void nl_convert_base_t::add_ext_alias(const pstring &alias)