summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices')
-rw-r--r--src/lib/netlist/devices/net_lib.cpp281
-rw-r--r--src/lib/netlist/devices/net_lib.h46
-rw-r--r--src/lib/netlist/devices/nld_2102A.cpp8
-rw-r--r--src/lib/netlist/devices/nld_2102A.h2
-rw-r--r--src/lib/netlist/devices/nld_2716.cpp6
-rw-r--r--src/lib/netlist/devices/nld_2716.h2
-rw-r--r--src/lib/netlist/devices/nld_4020.cpp7
-rw-r--r--src/lib/netlist/devices/nld_4020.h2
-rw-r--r--src/lib/netlist/devices/nld_4066.cpp37
-rw-r--r--src/lib/netlist/devices/nld_4066.h2
-rw-r--r--src/lib/netlist/devices/nld_4316.cpp18
-rw-r--r--src/lib/netlist/devices/nld_4316.h2
-rw-r--r--src/lib/netlist/devices/nld_74107.cpp20
-rw-r--r--src/lib/netlist/devices/nld_74107.h2
-rw-r--r--src/lib/netlist/devices/nld_74123.cpp26
-rw-r--r--src/lib/netlist/devices/nld_74123.h2
-rw-r--r--src/lib/netlist/devices/nld_74153.cpp12
-rw-r--r--src/lib/netlist/devices/nld_74153.h2
-rw-r--r--src/lib/netlist/devices/nld_74161.cpp8
-rw-r--r--src/lib/netlist/devices/nld_74161.h2
-rw-r--r--src/lib/netlist/devices/nld_74164.cpp6
-rw-r--r--src/lib/netlist/devices/nld_74164.h2
-rw-r--r--src/lib/netlist/devices/nld_74165.cpp7
-rw-r--r--src/lib/netlist/devices/nld_74165.h2
-rw-r--r--src/lib/netlist/devices/nld_74166.cpp6
-rw-r--r--src/lib/netlist/devices/nld_74166.h2
-rw-r--r--src/lib/netlist/devices/nld_74174.cpp6
-rw-r--r--src/lib/netlist/devices/nld_74174.h2
-rw-r--r--src/lib/netlist/devices/nld_74175.cpp6
-rw-r--r--src/lib/netlist/devices/nld_74175.h2
-rw-r--r--src/lib/netlist/devices/nld_74192.cpp8
-rw-r--r--src/lib/netlist/devices/nld_74192.h2
-rw-r--r--src/lib/netlist/devices/nld_74193.cpp8
-rw-r--r--src/lib/netlist/devices/nld_74193.h2
-rw-r--r--src/lib/netlist/devices/nld_74194.cpp6
-rw-r--r--src/lib/netlist/devices/nld_74194.h2
-rw-r--r--src/lib/netlist/devices/nld_74365.cpp14
-rw-r--r--src/lib/netlist/devices/nld_74365.h2
-rw-r--r--src/lib/netlist/devices/nld_7448.cpp24
-rw-r--r--src/lib/netlist/devices/nld_7448.h2
-rw-r--r--src/lib/netlist/devices/nld_7450.cpp18
-rw-r--r--src/lib/netlist/devices/nld_7450.h2
-rw-r--r--src/lib/netlist/devices/nld_7473.cpp10
-rw-r--r--src/lib/netlist/devices/nld_7473.h2
-rw-r--r--src/lib/netlist/devices/nld_7474.cpp132
-rw-r--r--src/lib/netlist/devices/nld_7474.h2
-rw-r--r--src/lib/netlist/devices/nld_7475.cpp12
-rw-r--r--src/lib/netlist/devices/nld_7475.h2
-rw-r--r--src/lib/netlist/devices/nld_7483.cpp47
-rw-r--r--src/lib/netlist/devices/nld_7483.h2
-rw-r--r--src/lib/netlist/devices/nld_7485.cpp6
-rw-r--r--src/lib/netlist/devices/nld_7485.h2
-rw-r--r--src/lib/netlist/devices/nld_7490.cpp35
-rw-r--r--src/lib/netlist/devices/nld_7490.h2
-rw-r--r--src/lib/netlist/devices/nld_7493.cpp87
-rw-r--r--src/lib/netlist/devices/nld_7493.h2
-rw-r--r--src/lib/netlist/devices/nld_7497.cpp174
-rw-r--r--src/lib/netlist/devices/nld_7497.h57
-rw-r--r--src/lib/netlist/devices/nld_74ls629.cpp19
-rw-r--r--src/lib/netlist/devices/nld_74ls629.h2
-rw-r--r--src/lib/netlist/devices/nld_82S115.cpp6
-rw-r--r--src/lib/netlist/devices/nld_82S115.h2
-rw-r--r--src/lib/netlist/devices/nld_82S123.cpp6
-rw-r--r--src/lib/netlist/devices/nld_82S123.h2
-rw-r--r--src/lib/netlist/devices/nld_82S126.cpp6
-rw-r--r--src/lib/netlist/devices/nld_82S126.h2
-rw-r--r--src/lib/netlist/devices/nld_82S16.cpp73
-rw-r--r--src/lib/netlist/devices/nld_82S16.h2
-rw-r--r--src/lib/netlist/devices/nld_9310.cpp42
-rw-r--r--src/lib/netlist/devices/nld_9310.h2
-rw-r--r--src/lib/netlist/devices/nld_9316.cpp138
-rw-r--r--src/lib/netlist/devices/nld_9316.h2
-rw-r--r--src/lib/netlist/devices/nld_9322.cpp14
-rw-r--r--src/lib/netlist/devices/nld_9322.h2
-rw-r--r--src/lib/netlist/devices/nld_am2847.cpp10
-rw-r--r--src/lib/netlist/devices/nld_am2847.h2
-rw-r--r--src/lib/netlist/devices/nld_dm9314.cpp6
-rw-r--r--src/lib/netlist/devices/nld_dm9314.h2
-rw-r--r--src/lib/netlist/devices/nld_dm9334.cpp6
-rw-r--r--src/lib/netlist/devices/nld_dm9334.h2
-rw-r--r--src/lib/netlist/devices/nld_legacy.cpp10
-rw-r--r--src/lib/netlist/devices/nld_legacy.h2
-rw-r--r--src/lib/netlist/devices/nld_log.cpp18
-rw-r--r--src/lib/netlist/devices/nld_log.h4
-rw-r--r--src/lib/netlist/devices/nld_mm5837.cpp16
-rw-r--r--src/lib/netlist/devices/nld_mm5837.h2
-rw-r--r--src/lib/netlist/devices/nld_ne555.cpp101
-rw-r--r--src/lib/netlist/devices/nld_ne555.h8
-rw-r--r--src/lib/netlist/devices/nld_r2r_dac.cpp14
-rw-r--r--src/lib/netlist/devices/nld_r2r_dac.h2
-rw-r--r--src/lib/netlist/devices/nld_schmitt.cpp30
-rw-r--r--src/lib/netlist/devices/nld_schmitt.h2
-rw-r--r--src/lib/netlist/devices/nld_system.cpp95
-rw-r--r--src/lib/netlist/devices/nld_system.h2
-rw-r--r--src/lib/netlist/devices/nld_tms4800.cpp10
-rw-r--r--src/lib/netlist/devices/nld_tms4800.h2
-rw-r--r--src/lib/netlist/devices/nld_tristate.cpp6
-rw-r--r--src/lib/netlist/devices/nld_tristate.h2
-rw-r--r--src/lib/netlist/devices/nlid_cmos.h4
-rw-r--r--src/lib/netlist/devices/nlid_proxy.cpp54
-rw-r--r--src/lib/netlist/devices/nlid_proxy.h24
-rw-r--r--src/lib/netlist/devices/nlid_system.h92
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.cpp141
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.h175
104 files changed, 1274 insertions, 1082 deletions
diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp
index e0f0277daac..c0353f2489a 100644
--- a/src/lib/netlist/devices/net_lib.cpp
+++ b/src/lib/netlist/devices/net_lib.cpp
@@ -9,152 +9,159 @@
****************************************************************************/
#include "net_lib.h"
-#include "../nl_factory.h"
-#include "../solver/nld_solver.h"
+#include "netlist/nl_factory.h"
+#include "netlist/solver/nld_solver.h"
#define xstr(s) # s
-#define NETLIB_DEVICE_DECL(chip) extern factory::constructor_ptr_t decl_ ## chip;
+#define NETLIB_DEVICE_DECL(chip) extern factory::constructor_ptr_t decl_ ## chip
-#define ENTRYX1(nic, name, defparam, decl) factory.register_device( decl (pstring(# name), pstring(xstr(nic)), pstring(defparam)) );
-#define ENTRYX(nic, name, defparam) { NETLIB_DEVICE_DECL(nic) ENTRYX1(NETLIB_NAME(nic), name, defparam, decl_ ## nic) }
+#define LIB_DECL(nic, decl) factory.register_device( decl ( pstring(xstr(nic))) );
+#define LIB_ENTRY(nic) { NETLIB_DEVICE_DECL(nic); LIB_DECL(NETLIB_NAME(nic), decl_ ## nic) }
namespace netlist
{
- namespace devices
- {
- void initialize_factory(factory::list_t &factory)
+namespace devices
{
- ENTRYX(R, RES, "R")
- ENTRYX(POT, POT, "R")
- ENTRYX(POT2, POT2, "R")
- ENTRYX(C, CAP, "C")
- ENTRYX(L, IND, "L")
- ENTRYX(D, DIODE, "MODEL")
- ENTRYX(VS, VS, "V")
- ENTRYX(CS, CS, "I")
- ENTRYX(VCVS, VCVS, "")
- ENTRYX(VCCS, VCCS, "")
- ENTRYX(CCCS, CCCS, "")
- ENTRYX(LVCCS, LVCCS, "")
- ENTRYX(opamp, OPAMP, "MODEL")
- 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
- ENTRYX(QBJT_EB, QBJT_EB, "MODEL")
- ENTRYX(QBJT_switch, QBJT_SW, "MODEL")
- 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,PATTERN")
- ENTRYX(mainclock, MAINCLOCK, "FREQ")
- ENTRYX(gnd, GND, "")
- ENTRYX(netlistparams, PARAMETER, "")
- ENTRYX(solver, SOLVER, "FREQ")
- ENTRYX(res_sw, RES_SWITCH, "+IN,+P1,+P2")
- ENTRYX(switch1, SWITCH, "")
- ENTRYX(switch2, SWITCH2, "")
- ENTRYX(nicRSFF, NETDEV_RSFF, "")
- ENTRYX(nicDelay, NETDEV_DELAY, "")
- ENTRYX(2716, EPROM_2716, "+GQ,+EPQ,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+A10")
- ENTRYX(TMS4800, ROM_TMS4800, "+AR,+OE1,+OE2,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+A10")
- ENTRYX(2102A, RAM_2102A, "+CEQ,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+RWQ,+DI")
- ENTRYX(7450, TTL_7450_ANDORINVERT, "+A,+B,+C,+D")
- ENTRYX(7448, TTL_7448, "+A,+B,+C,+D,+LTQ,+BIQ,+RBIQ")
- ENTRYX(7473, TTL_7473, "+CLK,+J,+K,+CLRQ")
- ENTRYX(7473A, TTL_7473A, "+CLK,+J,+K,+CLRQ")
- ENTRYX(7474, TTL_7474, "+CLK,+D,+CLRQ,+PREQ")
- ENTRYX(7475, TTL_7475, "")
- ENTRYX(7477, TTL_7477, "")
- ENTRYX(7483, TTL_7483, "+A1,+A2,+A3,+A4,+B1,+B2,+B3,+B4,+C0")
- ENTRYX(7485, TTL_7485, "+A0,+A1,+A2,+A3,+B0,+B1,+B2,+B3,+LTIN,+EQIN,+GTIN")
- 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(74161, TTL_74161, "+A,+B,+C,+D,+CLRQ,+LOADQ,+CLK,+ENABLEP,+ENABLET")
- ENTRYX(74164, TTL_74164, "+A,+B,+CLRQ,+CLK")
- ENTRYX(74165, TTL_74165, "+CLK,+CLKINH,+SH_LDQ,+SER,+A,+B,+C,+D,+E,+F,+G,+H")
- ENTRYX(74166, TTL_74166, "+CLK,+CLKINH,+SH_LDQ,+SER,+A,+B,+C,+D,+E,+F,+G,+H,+CLRQ")
- ENTRYX(74174, TTL_74174, "+CLK,+D1,+D2,+D3,+D4,+D5,+D6,+CLRQ")
- ENTRYX(74175, TTL_74175, "+CLK,+D1,+D2,+D3,+D4,+CLRQ")
- ENTRYX(74192, TTL_74192, "+A,+B,+C,+D,+CLEAR,+LOADQ,+CU,+CD")
- ENTRYX(74193, TTL_74193, "+A,+B,+C,+D,+CLEAR,+LOADQ,+CU,+CD")
- ENTRYX(74194, TTL_74194, "+CLK,+S0,+S1,+SRIN,+A,+B,+C,+D,+SLIN,+CLRQ")
- ENTRYX(74365, TTL_74365, "+G1Q,+G2Q,+A1,+A2,+A3,+A4,+A5,+A6")
- //ENTRY(74279, TTL_74279, "") // only dip available
- ENTRYX(SN74LS629, SN74LS629, "CAP")
- ENTRYX(82S16, TTL_82S16, "")
- ENTRYX(82S115, PROM_82S115, "+CE1Q,+CE2,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+STROBE")
- ENTRYX(82S123, PROM_82S123, "+CEQ,+A0,+A1,+A2,+A3,+A4")
- ENTRYX(82S126, PROM_82S126, "+CE1Q,+CE2Q,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7")
- ENTRYX(9310, TTL_9310, "")
- ENTRYX(9314, TTL_9314, "+EQ,+MRQ,+S0Q,+S1Q,+S2Q,+S3Q,+D0,+D1,+D2,+D3")
- ENTRYX(9316, TTL_9316, "+CLK,+ENP,+ENT,+CLRQ,+LOADQ,+A,+B,+C,+D")
- ENTRYX(9322, TTL_9322, "+SELECT,+A1,+B1,+A2,+B2,+A3,+B3,+A4,+B4,+STROBE")
- ENTRYX(9334, TTL_9334, "+CQ,+EQ,+D,+A0,+A1,+A2")
- ENTRYX(AM2847, TTL_AM2847, "+CP,+INA,+INB,+INC,+IND,+RCA,+RCB,+RCC,+RCD")
- ENTRYX(CD4020, CD4020, "")
- ENTRYX(CD4066_GATE, CD4066_GATE, "")
- ENTRYX(CD4316_GATE, CD4316_GATE, "")
- ENTRYX(schmitt_trigger, SCHMITT_TRIGGER, "MODEL")
- /* entries with suffix WI are legacy only */
- ENTRYX(CD4020, CD4020_WI, "+IP,+RESET,+VDD,+VSS")
- //ENTRY(4066, CD_4066, "+A,B")
- ENTRYX(NE555, NE555, "")
- ENTRYX(r2r_dac, R2R_DAC, "VIN,R,N")
- ENTRYX(tristate, TTL_TRISTATE, "+CEQ1,+D1,+CEQ2,+D2")
- ENTRYX(tristate3, TTL_TRISTATE3, "")
- ENTRYX(2102A_dip, RAM_2102A_DIP, "")
- ENTRYX(2716_dip, EPROM_2716_DIP, "")
- ENTRYX(tms4800_dip, ROM_TMS4800_DIP, "")
- ENTRYX(4538_dip, CD4538_DIP, "")
- ENTRYX(7448_dip, TTL_7448_DIP, "")
- ENTRYX(7450_dip, TTL_7450_DIP, "")
- ENTRYX(7473_dip, TTL_7473_DIP, "")
- ENTRYX(7473A_dip, TTL_7473A_DIP, "")
- ENTRYX(7474_dip, TTL_7474_DIP, "")
- ENTRYX(7475_dip, TTL_7475_DIP, "")
- ENTRYX(7477_dip, TTL_7477_DIP, "")
- ENTRYX(7483_dip, TTL_7483_DIP, "")
- ENTRYX(7485_dip, TTL_7485_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(74161_dip, TTL_74161_DIP, "")
- ENTRYX(74164_dip, TTL_74164_DIP, "")
- ENTRYX(74165_dip, TTL_74165_DIP, "")
- ENTRYX(74166_dip, TTL_74166_DIP, "")
- ENTRYX(74174_dip, TTL_74174_DIP, "")
- ENTRYX(74175_dip, TTL_74175_DIP, "")
- ENTRYX(74192_dip, TTL_74192_DIP, "")
- ENTRYX(74193_dip, TTL_74193_DIP, "")
- ENTRYX(74194_dip, TTL_74194_DIP, "")
- ENTRYX(74365_dip, TTL_74365_DIP, "")
- ENTRYX(82S16_dip, TTL_82S16_DIP, "")
- ENTRYX(82S115_dip, PROM_82S115_DIP, "")
- ENTRYX(82S123_dip, PROM_82S123_DIP, "")
- ENTRYX(82S126_dip, PROM_82S126_DIP, "")
- ENTRYX(9602_dip, TTL_9602_DIP, "")
- ENTRYX(9310_dip, TTL_9310_DIP, "")
- ENTRYX(9314_dip, TTL_9314_DIP, "")
- ENTRYX(9316_dip, TTL_9316_DIP, "")
- ENTRYX(9322_dip, TTL_9322_DIP, "")
- ENTRYX(9334_dip, TTL_9334_DIP, "")
- ENTRYX(AM2847_dip, TTL_AM2847_DIP, "")
- ENTRYX(SN74LS629_dip, SN74LS629_DIP, "1.CAP1,2.CAP2")
- ENTRYX(NE555_dip, NE555_DIP, "")
- ENTRYX(MM5837_dip, MM5837_DIP, "")
-}
- } //namespace devices
+ void initialize_factory(factory::list_t &factory)
+ {
+ LIB_ENTRY(R)
+ LIB_ENTRY(POT)
+ LIB_ENTRY(POT2)
+ LIB_ENTRY(C)
+ LIB_ENTRY(L)
+ LIB_ENTRY(D)
+ LIB_ENTRY(VS)
+ LIB_ENTRY(CS)
+ LIB_ENTRY(VCVS)
+ LIB_ENTRY(VCCS)
+ LIB_ENTRY(CCCS)
+ LIB_ENTRY(LVCCS)
+ LIB_ENTRY(opamp)
+ LIB_ENTRY(dummy_input)
+ LIB_ENTRY(frontier) // not intended to be used directly
+ LIB_ENTRY(function) // only for macro devices - NO FEEDBACK loops
+ LIB_ENTRY(QBJT_EB)
+ LIB_ENTRY(QBJT_switch)
+ LIB_ENTRY(MOSFET)
+ LIB_ENTRY(logic_input_ttl)
+ LIB_ENTRY(logic_input)
+ LIB_ENTRY(analog_input)
+ LIB_ENTRY(log)
+ LIB_ENTRY(logD)
+ LIB_ENTRY(clock)
+ LIB_ENTRY(extclock)
+ LIB_ENTRY(mainclock)
+ LIB_ENTRY(gnd)
+ LIB_ENTRY(netlistparams)
+ LIB_ENTRY(solver)
+ LIB_ENTRY(res_sw)
+ LIB_ENTRY(switch1)
+ LIB_ENTRY(switch2)
+ LIB_ENTRY(nicRSFF)
+ LIB_ENTRY(nicDelay)
+ LIB_ENTRY(2102A)
+ LIB_ENTRY(2102A_dip)
+ LIB_ENTRY(2716)
+ LIB_ENTRY(2716_dip)
+ LIB_ENTRY(7448)
+ LIB_ENTRY(7448_dip)
+ LIB_ENTRY(7450)
+ LIB_ENTRY(7450_dip)
+ LIB_ENTRY(7473)
+ LIB_ENTRY(7473_dip)
+ LIB_ENTRY(7473A)
+ LIB_ENTRY(7473A_dip)
+ LIB_ENTRY(7474)
+ LIB_ENTRY(7474_dip)
+ LIB_ENTRY(7475)
+ LIB_ENTRY(7475_dip)
+ LIB_ENTRY(7477)
+ LIB_ENTRY(7477_dip)
+ LIB_ENTRY(7483)
+ LIB_ENTRY(7483_dip)
+ LIB_ENTRY(7485)
+ LIB_ENTRY(7485_dip)
+ LIB_ENTRY(7490)
+ LIB_ENTRY(7490_dip)
+ LIB_ENTRY(7493)
+ LIB_ENTRY(7493_dip)
+ LIB_ENTRY(7497)
+ LIB_ENTRY(7497_dip)
+ LIB_ENTRY(74107)
+ LIB_ENTRY(74107_dip)
+ LIB_ENTRY(74107A) // FIXME: implement missing DIP
+ LIB_ENTRY(74123)
+ LIB_ENTRY(74123_dip)
+ LIB_ENTRY(74153)
+ LIB_ENTRY(74153_dip)
+ LIB_ENTRY(74161)
+ LIB_ENTRY(74161_dip)
+ LIB_ENTRY(74164)
+ LIB_ENTRY(74164_dip)
+ LIB_ENTRY(74165)
+ LIB_ENTRY(74165_dip)
+ LIB_ENTRY(74166)
+ LIB_ENTRY(74166_dip)
+ LIB_ENTRY(74174)
+ LIB_ENTRY(74175)
+ LIB_ENTRY(74192)
+ LIB_ENTRY(74193)
+ LIB_ENTRY(74194)
+ LIB_ENTRY(74365)
+ //ENTRY(74279, TTL_74279, "") // only dip available
+ LIB_ENTRY(SN74LS629)
+ LIB_ENTRY(82S16)
+ LIB_ENTRY(82S115)
+ LIB_ENTRY(82S123)
+ LIB_ENTRY(82S126)
+ LIB_ENTRY(9310)
+ LIB_ENTRY(9314)
+ LIB_ENTRY(9316)
+ LIB_ENTRY(9322)
+ LIB_ENTRY(9334)
+ LIB_ENTRY(AM2847)
+ // FIXME: duplicate?
+ LIB_ENTRY(CD4020_WI)
+ LIB_ENTRY(CD4020)
+ LIB_ENTRY(CD4066_GATE)
+ LIB_ENTRY(CD4316_GATE)
+ LIB_ENTRY(4538_dip)
+ LIB_ENTRY(schmitt_trigger)
+ /* entries with suffix WI are legacy only */
+ //ENTRY(4066, CD_4066, "+A,B")
+ LIB_ENTRY(NE555)
+ LIB_ENTRY(NE555_dip)
+ LIB_ENTRY(MC1455P)
+ LIB_ENTRY(MC1455P_dip)
+ LIB_ENTRY(TMS4800)
+ LIB_ENTRY(TMS4800_dip)
+ LIB_ENTRY(r2r_dac)
+ LIB_ENTRY(tristate)
+ LIB_ENTRY(tristate3)
+ LIB_ENTRY(74174_dip)
+ LIB_ENTRY(74175_dip)
+ LIB_ENTRY(74192_dip)
+ LIB_ENTRY(74193_dip)
+ LIB_ENTRY(74194_dip)
+ LIB_ENTRY(74365_dip)
+ LIB_ENTRY(82S16_dip)
+ LIB_ENTRY(82S115_dip)
+ LIB_ENTRY(82S123_dip)
+ LIB_ENTRY(82S126_dip)
+ LIB_ENTRY(9602_dip)
+ LIB_ENTRY(9310_dip)
+ LIB_ENTRY(9314_dip)
+ LIB_ENTRY(9316_dip)
+ LIB_ENTRY(9322_dip)
+ LIB_ENTRY(9334_dip)
+ LIB_ENTRY(AM2847_dip)
+ LIB_ENTRY(SN74LS629_dip)
+ LIB_ENTRY(MM5837_dip)
+ }
+
+} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/net_lib.h b/src/lib/netlist/devices/net_lib.h
index 4dead624fc2..abf58ccee16 100644
--- a/src/lib/netlist/devices/net_lib.h
+++ b/src/lib/netlist/devices/net_lib.h
@@ -35,18 +35,8 @@
#include "nld_2102A.h"
#include "nld_2716.h"
-#include "nld_tms4800.h"
#include "nld_4020.h"
#include "nld_4066.h"
-#include "nld_7448.h"
-#include "nld_7450.h"
-#include "nld_7473.h"
-#include "nld_7474.h"
-#include "nld_7475.h"
-#include "nld_7483.h"
-#include "nld_7485.h"
-#include "nld_7490.h"
-#include "nld_7493.h"
#include "nld_74107.h"
#include "nld_74123.h"
#include "nld_74153.h"
@@ -60,21 +50,32 @@
#include "nld_74193.h"
#include "nld_74194.h"
#include "nld_74365.h"
+#include "nld_7448.h"
+#include "nld_7450.h"
+#include "nld_7473.h"
+#include "nld_7474.h"
+#include "nld_7475.h"
+#include "nld_7483.h"
+#include "nld_7485.h"
+#include "nld_7490.h"
+#include "nld_7493.h"
+#include "nld_7497.h"
#include "nld_74ls629.h"
-#include "nld_82S16.h"
#include "nld_82S115.h"
#include "nld_82S123.h"
#include "nld_82S126.h"
+#include "nld_82S16.h"
#include "nld_9310.h"
#include "nld_9316.h"
#include "nld_9322.h"
+#include "nld_tms4800.h"
#include "nld_am2847.h"
#include "nld_dm9314.h"
#include "nld_dm9334.h"
-#include "nld_ne555.h"
#include "nld_mm5837.h"
+#include "nld_ne555.h"
#include "nld_r2r_dac.h"
@@ -84,16 +85,17 @@
#include "nld_log.h"
-#include "../macro/nlm_cd4xxx.h"
-#include "../macro/nlm_ttl74xx.h"
-#include "../macro/nlm_opamp.h"
-#include "../macro/nlm_other.h"
-
-#include "../analog/nld_bjt.h"
-#include "../analog/nld_fourterm.h"
-#include "../analog/nld_switches.h"
-#include "../analog/nld_twoterm.h"
-#include "../analog/nld_opamps.h"
+#include "netlist/macro/nlm_cd4xxx.h"
+#include "netlist/macro/nlm_opamp.h"
+#include "netlist/macro/nlm_other.h"
+#include "netlist/macro/nlm_ttl74xx.h"
+
+#include "netlist/analog/nld_bjt.h"
+#include "netlist/analog/nld_fourterm.h"
+#include "netlist/analog/nld_mosfet.h"
+#include "netlist/analog/nld_opamps.h"
+#include "netlist/analog/nld_switches.h"
+#include "netlist/analog/nld_twoterm.h"
#include "nld_legacy.h"
#endif
diff --git a/src/lib/netlist/devices/nld_2102A.cpp b/src/lib/netlist/devices/nld_2102A.cpp
index 5296bf2d029..0ec7132b401 100644
--- a/src/lib/netlist/devices/nld_2102A.cpp
+++ b/src/lib/netlist/devices/nld_2102A.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_2102A.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
#define ADDR2BYTE(a) ((a) >> 3)
#define ADDR2BIT(a) ((a) & 0x7)
@@ -39,7 +39,7 @@ namespace netlist
logic_output_t m_DO;
- state_var<uint8_t[128]> m_ram; // 1024x1 bits
+ state_array<uint8_t, 128> m_ram; // 1024x1 bits
param_ptr_t m_RAM;
};
@@ -97,8 +97,8 @@ namespace netlist
m_ram[i] = 0;
}
- NETLIB_DEVICE_IMPL(2102A)
- NETLIB_DEVICE_IMPL(2102A_dip)
+ NETLIB_DEVICE_IMPL(2102A, "RAM_2102A", "+CEQ,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+RWQ,+DI")
+ NETLIB_DEVICE_IMPL(2102A_dip,"RAM_2102A_DIP","")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_2102A.h b/src/lib/netlist/devices/nld_2102A.h
index 52d892d4d40..aa53efde47d 100644
--- a/src/lib/netlist/devices/nld_2102A.h
+++ b/src/lib/netlist/devices/nld_2102A.h
@@ -24,7 +24,7 @@
#ifndef NLD_2102A_H_
#define NLD_2102A_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define RAM_2102A(name, cCEQ, cA0, cA1, cA2, cA3, cA4, cA5, cA6, cA7, cA8, cA9, cRWQ, cDI) \
NET_REGISTER_DEV(RAM_2102A, name) \
diff --git a/src/lib/netlist/devices/nld_2716.cpp b/src/lib/netlist/devices/nld_2716.cpp
index cb53d60e205..b021bc95003 100644
--- a/src/lib/netlist/devices/nld_2716.cpp
+++ b/src/lib/netlist/devices/nld_2716.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_2716.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -92,8 +92,8 @@ namespace netlist
m_D[i].push((d >> i) & 1, delay);
}
- NETLIB_DEVICE_IMPL(2716)
- NETLIB_DEVICE_IMPL(2716_dip)
+ NETLIB_DEVICE_IMPL(2716, "EPROM_2716", "+GQ,+EPQ,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+A10")
+ NETLIB_DEVICE_IMPL(2716_dip, "EPROM_2716_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_2716.h b/src/lib/netlist/devices/nld_2716.h
index f4776242e6a..363086d6a37 100644
--- a/src/lib/netlist/devices/nld_2716.h
+++ b/src/lib/netlist/devices/nld_2716.h
@@ -28,7 +28,7 @@
#ifndef NLD_2716_H_
#define NLD_2716_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define EPROM_2716(name, cGQ, cEPQ, cA0, cA1, cA2, cA3, cA4, cA5, cA6, cA7, cA8, cA9, cA10) \
NET_REGISTER_DEV(EPROM_2716, name) \
diff --git a/src/lib/netlist/devices/nld_4020.cpp b/src/lib/netlist/devices/nld_4020.cpp
index 8403d42bef2..13518f9d3cb 100644
--- a/src/lib/netlist/devices/nld_4020.cpp
+++ b/src/lib/netlist/devices/nld_4020.cpp
@@ -96,9 +96,9 @@ namespace netlist
m_sub.m_IP.activate_hl();
}
- inline NETLIB_FUNC_VOID(CD4020_sub, update_outputs, (const unsigned cnt))
+ NETLIB_FUNC_VOID(CD4020_sub, update_outputs, (const unsigned cnt))
{
- /* static */ const netlist_time out_delayQn[14] = {
+ static constexpr const std::array<netlist_time, 14> out_delayQn = {
NLTIME_FROM_NS(180), NLTIME_FROM_NS(280),
NLTIME_FROM_NS(380), NLTIME_FROM_NS(480),
NLTIME_FROM_NS(580), NLTIME_FROM_NS(680),
@@ -113,7 +113,8 @@ namespace netlist
m_Q[i].push((cnt >> i) & 1, out_delayQn[i]);
}
- NETLIB_DEVICE_IMPL(CD4020)
+ NETLIB_DEVICE_IMPL(CD4020, "CD4020", "")
+ NETLIB_DEVICE_IMPL_ALIAS(CD4020_WI, CD4020, "CD4020_WI", "+IP,+RESET,+VDD,+VSS")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_4020.h b/src/lib/netlist/devices/nld_4020.h
index fd6b234da46..f24251fb1dc 100644
--- a/src/lib/netlist/devices/nld_4020.h
+++ b/src/lib/netlist/devices/nld_4020.h
@@ -27,7 +27,7 @@
#ifndef NLD_4020_H_
#define NLD_4020_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
/* FIXME: only used in mario.c */
#define CD4020_WI(name, cIP, cRESET, cVDD, cVSS) \
diff --git a/src/lib/netlist/devices/nld_4066.cpp b/src/lib/netlist/devices/nld_4066.cpp
index ebd269a023a..0c7511ca438 100644
--- a/src/lib/netlist/devices/nld_4066.cpp
+++ b/src/lib/netlist/devices/nld_4066.cpp
@@ -5,10 +5,12 @@
*
*/
-#include "nlid_cmos.h"
-#include "../analog/nlid_twoterm.h"
#include "nld_4066.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/solver/nld_solver.h"
+#include "nlid_cmos.h"
+
namespace netlist
{
namespace devices
@@ -27,7 +29,7 @@ namespace netlist
NETLIB_RESETI();
NETLIB_UPDATEI();
- public:
+ private:
NETLIB_SUB(vdd_vss) m_supply;
analog::NETLIB_SUB(R_base) m_R;
@@ -39,45 +41,36 @@ namespace netlist
{
// Start in off condition
// FIXME: is ROFF correct?
- m_R.set_R(NL_FCONST(1.0) / netlist().gmin());
+ m_R.set_R(plib::constants<nl_double>::one() / exec().gmin());
}
NETLIB_UPDATE(CD4066_GATE)
{
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 low = plib::constants<nl_double>::cast(0.45) * sup;
+ nl_double high = plib::constants<nl_double>::cast(0.55) * sup;
nl_double in = m_control() - m_supply.vss();
- nl_double rON = m_base_r() * NL_FCONST(5.0) / sup;
+ nl_double rON = m_base_r() * plib::constants<nl_double>::cast(5.0) / sup;
nl_double R = -1.0;
if (in < low)
{
- R = NL_FCONST(1.0) / netlist().gmin();
+ R = plib::constants<nl_double>::one() / exec().gmin();
}
else if (in > high)
{
R = rON;
}
- if (R > NL_FCONST(0.0))
+ if (R > plib::constants<nl_double>::zero())
{
- // 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_solve_after(NLTIME_FROM_NS(1));
- }
- else
- {
- m_R.set_R(R);
- m_R.update_dev();
- }
+ m_R.update();
+ m_R.set_R(R);
+ m_R.solve_later();
}
}
- NETLIB_DEVICE_IMPL(CD4066_GATE)
+ NETLIB_DEVICE_IMPL(CD4066_GATE, "CD4066_GATE", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_4066.h b/src/lib/netlist/devices/nld_4066.h
index e9fd579496c..d339464a108 100644
--- a/src/lib/netlist/devices/nld_4066.h
+++ b/src/lib/netlist/devices/nld_4066.h
@@ -24,7 +24,7 @@
#ifndef NLD_4066_H_
#define NLD_4066_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define CD4066_GATE(name) \
NET_REGISTER_DEV(CD4066_GATE, name)
diff --git a/src/lib/netlist/devices/nld_4316.cpp b/src/lib/netlist/devices/nld_4316.cpp
index b9758ff036b..c8ee1a90643 100644
--- a/src/lib/netlist/devices/nld_4316.cpp
+++ b/src/lib/netlist/devices/nld_4316.cpp
@@ -5,9 +5,10 @@
*
*/
-#include "nlid_cmos.h"
-#include "../analog/nlid_twoterm.h"
#include "nld_4316.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/solver/nld_solver.h"
+#include "nlid_cmos.h"
namespace netlist { namespace devices {
@@ -37,19 +38,20 @@ namespace netlist { namespace devices {
NETLIB_RESET(CD4316_GATE)
{
- m_R.set_R(NL_FCONST(1.0) / netlist().gmin());
+ m_R.set_R(plib::constants<nl_double>::one() / exec().gmin());
}
NETLIB_UPDATE(CD4316_GATE)
{
- m_R.update_dev();
+ m_R.update();
if (m_S() && !m_E())
m_R.set_R(m_base_r());
else
- m_R.set_R(NL_FCONST(1.0) / netlist().gmin());
- m_R.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
+ m_R.set_R(plib::constants<nl_double>::one() / exec().gmin());
+ m_R.solve_later(NLTIME_FROM_NS(1));
}
- NETLIB_DEVICE_IMPL(CD4316_GATE)
+ NETLIB_DEVICE_IMPL(CD4316_GATE, "CD4316_GATE", "")
-} } // namesapce netlist::devices
+} // namespace devices
+ } // namespace netlist
diff --git a/src/lib/netlist/devices/nld_4316.h b/src/lib/netlist/devices/nld_4316.h
index eb1d13f5542..278a2793a6f 100644
--- a/src/lib/netlist/devices/nld_4316.h
+++ b/src/lib/netlist/devices/nld_4316.h
@@ -25,7 +25,7 @@
#ifndef NLD_4316_H_
#define NLD_4316_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define CD4316_GATE(name) \
NET_REGISTER_DEV(CD4316_GATE, name)
diff --git a/src/lib/netlist/devices/nld_74107.cpp b/src/lib/netlist/devices/nld_74107.cpp
index c5a12a15fb4..763760e2c6a 100644
--- a/src/lib/netlist/devices/nld_74107.cpp
+++ b/src/lib/netlist/devices/nld_74107.cpp
@@ -6,15 +6,15 @@
*/
#include "nld_74107.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
namespace devices
{
- static constexpr netlist_time delay_107[2] = { NLTIME_FROM_NS(16), NLTIME_FROM_NS(25) };
- static constexpr netlist_time delay_107A[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(15) };
+ static constexpr const netlist_time delay_107[2] = { NLTIME_FROM_NS(16), NLTIME_FROM_NS(25) };
+ static constexpr const netlist_time delay_107A[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(15) };
NETLIB_OBJECT(74107A)
{
@@ -22,11 +22,12 @@ namespace netlist
, m_clk(*this, "CLK", NETLIB_DELEGATE(74107A, clk))
, m_Q(*this, "Q")
, m_QQ(*this, "QQ")
- , m_delay(delay_107A)
, m_J(*this, "J")
, m_K(*this, "K")
, m_clrQ(*this, "CLRQ")
{
+ m_delay[0] = delay_107A[0];
+ m_delay[1] = delay_107A[1];
}
friend class NETLIB_NAME(74107_dip);
@@ -43,7 +44,7 @@ namespace netlist
logic_output_t m_Q;
logic_output_t m_QQ;
- const netlist_time *m_delay;
+ netlist_time m_delay[2];
logic_input_t m_J;
logic_input_t m_K;
@@ -61,7 +62,8 @@ namespace netlist
public:
NETLIB_CONSTRUCTOR_DERIVED(74107, 74107A)
{
- m_delay = delay_107;
+ m_delay[0] = delay_107[0];
+ m_delay[1] = delay_107[1];
}
};
@@ -137,9 +139,9 @@ namespace netlist
m_clk.activate_hl();
}
- NETLIB_DEVICE_IMPL(74107)
- NETLIB_DEVICE_IMPL(74107A)
- NETLIB_DEVICE_IMPL(74107_dip)
+ NETLIB_DEVICE_IMPL(74107, "TTL_74107", "+CLK,+J,+K,+CLRQ")
+ NETLIB_DEVICE_IMPL(74107A, "TTL_74107A", "+CLK,+J,+K,+CLRQ")
+ NETLIB_DEVICE_IMPL(74107_dip, "TTL_74107_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74107.h b/src/lib/netlist/devices/nld_74107.h
index b59848cbb05..c6f8864610a 100644
--- a/src/lib/netlist/devices/nld_74107.h
+++ b/src/lib/netlist/devices/nld_74107.h
@@ -64,7 +64,7 @@
#ifndef NLD_74107_H_
#define NLD_74107_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74107A(name, cCLK, cJ, cK, cCLRQ) \
NET_REGISTER_DEV(TTL_74107A, name) \
diff --git a/src/lib/netlist/devices/nld_74123.cpp b/src/lib/netlist/devices/nld_74123.cpp
index 9055c5ce140..32e47a47ef2 100644
--- a/src/lib/netlist/devices/nld_74123.cpp
+++ b/src/lib/netlist/devices/nld_74123.cpp
@@ -6,7 +6,7 @@
*/
#include "nlid_system.h"
-#include "../analog/nlid_twoterm.h"
+#include "netlist/analog/nlid_twoterm.h"
#include <cmath>
@@ -257,8 +257,8 @@ namespace netlist
{
m_KP = 1.0 / (1.0 + exp(m_K()));
- m_RP.do_reset();
- m_RN.do_reset();
+ m_RP.reset();
+ m_RN.reset();
//m_RP.set_R(R_OFF);
//m_RN.set_R(R_OFF);
@@ -276,8 +276,8 @@ namespace netlist
NETLIB_RESET(74123_dip)
{
- //m_1.do_reset();
- //m_2.do_reset();
+ //m_1.reset();
+ //m_2.reset();
}
NETLIB_UPDATE(9602_dip)
@@ -289,8 +289,8 @@ namespace netlist
NETLIB_RESET(9602_dip)
{
- //m_1.do_reset();
- //m_2.do_reset();
+ //m_1.reset();
+ //m_2.reset();
}
NETLIB_UPDATE(4538_dip)
@@ -302,14 +302,14 @@ namespace netlist
NETLIB_RESET(4538_dip)
{
- m_1.do_reset();
- m_2.do_reset();
+ m_1.reset();
+ m_2.reset();
}
- NETLIB_DEVICE_IMPL(74123)
- NETLIB_DEVICE_IMPL(74123_dip)
- NETLIB_DEVICE_IMPL(4538_dip)
- NETLIB_DEVICE_IMPL(9602_dip)
+ NETLIB_DEVICE_IMPL(74123, "TTL_74123", "")
+ NETLIB_DEVICE_IMPL(74123_dip, "TTL_74123_DIP", "")
+ NETLIB_DEVICE_IMPL(4538_dip, "CD4538_DIP", "")
+ NETLIB_DEVICE_IMPL(9602_dip, "TTL_9602_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74123.h b/src/lib/netlist/devices/nld_74123.h
index dfd75f746c7..3eca141b613 100644
--- a/src/lib/netlist/devices/nld_74123.h
+++ b/src/lib/netlist/devices/nld_74123.h
@@ -49,7 +49,7 @@
#ifndef NLD_74123_H_
#define NLD_74123_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74123(name) \
NET_REGISTER_DEV(TTL_74123, name)
diff --git a/src/lib/netlist/devices/nld_74153.cpp b/src/lib/netlist/devices/nld_74153.cpp
index b74c09f8cc0..136fe61520b 100644
--- a/src/lib/netlist/devices/nld_74153.cpp
+++ b/src/lib/netlist/devices/nld_74153.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74153.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -120,19 +120,19 @@ namespace netlist
NETLIB_UPDATE(74153)
{
m_sub.m_chan = (m_A() | (m_B()<<1));
- m_sub.update_dev();
+ m_sub.update();
}
NETLIB_UPDATE(74153_dip)
{
m_2.m_chan = m_1.m_chan = (m_A() | (m_B()<<1));
- m_1.update_dev();
- m_2.update_dev();
+ m_1.update();
+ m_2.update();
}
- NETLIB_DEVICE_IMPL(74153)
- NETLIB_DEVICE_IMPL(74153_dip)
+ NETLIB_DEVICE_IMPL(74153, "TTL_74153", "+C0,+C1,+C2,+C3,+A,+B,+G")
+ NETLIB_DEVICE_IMPL(74153_dip, "TTL_74153_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74153.h b/src/lib/netlist/devices/nld_74153.h
index ee77d4224ce..f1c0f056cf7 100644
--- a/src/lib/netlist/devices/nld_74153.h
+++ b/src/lib/netlist/devices/nld_74153.h
@@ -45,7 +45,7 @@
#ifndef NLD_74153_H_
#define NLD_74153_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74153(name, cC0, cC1, cC2, cC3, cA, cB, cG) \
NET_REGISTER_DEV(TTL_74153, name) \
diff --git a/src/lib/netlist/devices/nld_74161.cpp b/src/lib/netlist/devices/nld_74161.cpp
index 5eb711fb456..7a3b54d6368 100644
--- a/src/lib/netlist/devices/nld_74161.cpp
+++ b/src/lib/netlist/devices/nld_74161.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74161.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -85,7 +85,7 @@ namespace netlist
}
// FIXME: Timing
- static constexpr netlist_time delay[4] =
+ static constexpr const netlist_time delay[4] =
{
NLTIME_FROM_NS(40),
NLTIME_FROM_NS(40),
@@ -126,8 +126,8 @@ namespace netlist
m_RCO.push(tRippleCarryOut, NLTIME_FROM_NS(20)); //FIXME
}
- NETLIB_DEVICE_IMPL(74161)
- NETLIB_DEVICE_IMPL(74161_dip)
+ NETLIB_DEVICE_IMPL(74161, "TTL_74161", "+A,+B,+C,+D,+CLRQ,+LOADQ,+CLK,+ENABLEP,+ENABLET")
+ NETLIB_DEVICE_IMPL(74161_dip, "TTL_74161_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74161.h b/src/lib/netlist/devices/nld_74161.h
index 363bc3c7f0d..f3fa3eab043 100644
--- a/src/lib/netlist/devices/nld_74161.h
+++ b/src/lib/netlist/devices/nld_74161.h
@@ -25,7 +25,7 @@
#ifndef NLD_74161_H_
#define NLD_74161_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74161(name, cA, cB, cC, cD, cCLRQ, cLOADQ, cCLK, cENABLEP, cENABLET) \
NET_REGISTER_DEV(TTL_74161, name) \
diff --git a/src/lib/netlist/devices/nld_74164.cpp b/src/lib/netlist/devices/nld_74164.cpp
index 5b2b1d8d080..b1eb30bb1ba 100644
--- a/src/lib/netlist/devices/nld_74164.cpp
+++ b/src/lib/netlist/devices/nld_74164.cpp
@@ -9,7 +9,7 @@
*/
#include "nld_74164.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -97,8 +97,8 @@ namespace netlist
}
}
- NETLIB_DEVICE_IMPL(74164)
- NETLIB_DEVICE_IMPL(74164_dip)
+ NETLIB_DEVICE_IMPL(74164, "TTL_74164", "+A,+B,+CLRQ,+CLK")
+ NETLIB_DEVICE_IMPL(74164_dip, "TTL_74164_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74164.h b/src/lib/netlist/devices/nld_74164.h
index d7f29d386de..dd4e6bd1303 100644
--- a/src/lib/netlist/devices/nld_74164.h
+++ b/src/lib/netlist/devices/nld_74164.h
@@ -42,7 +42,7 @@
#ifndef NLD_74164_H_
#define NLD_74164_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74164(name, cA, cB, cCLRQ, cCLK) \
NET_REGISTER_DEV(TTL_74164, name) \
diff --git a/src/lib/netlist/devices/nld_74165.cpp b/src/lib/netlist/devices/nld_74165.cpp
index 678c1b1782e..521bf4d63d2 100644
--- a/src/lib/netlist/devices/nld_74165.cpp
+++ b/src/lib/netlist/devices/nld_74165.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74165.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -86,6 +86,7 @@ namespace netlist
}
else if (!m_CLK() || m_CLKINH())
{
+ // FIXME: qh is overwritten below?
qh = old_qh;
}
else if (!m_last_CLK)
@@ -101,8 +102,8 @@ namespace netlist
m_QH.push(qh, NLTIME_FROM_NS(20)); // FIXME: Timing
}
- NETLIB_DEVICE_IMPL(74165)
- NETLIB_DEVICE_IMPL(74165_dip)
+ NETLIB_DEVICE_IMPL(74165, "TTL_74165", "+CLK,+CLKINH,+SH_LDQ,+SER,+A,+B,+C,+D,+E,+F,+G,+H")
+ NETLIB_DEVICE_IMPL(74165_dip, "TTL_74165_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74165.h b/src/lib/netlist/devices/nld_74165.h
index e38ca7bab86..d282bab622b 100644
--- a/src/lib/netlist/devices/nld_74165.h
+++ b/src/lib/netlist/devices/nld_74165.h
@@ -27,7 +27,7 @@
#ifndef NLD_74165_H_
#define NLD_74165_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74165(name, cCLK, cCLKINH, cSH_LDQ, cSER, cA, cB, cC, cD, cE, cF, cG, cH) \
NET_REGISTER_DEV(TTL_74165, name) \
diff --git a/src/lib/netlist/devices/nld_74166.cpp b/src/lib/netlist/devices/nld_74166.cpp
index 32f075c4da5..a5049014576 100644
--- a/src/lib/netlist/devices/nld_74166.cpp
+++ b/src/lib/netlist/devices/nld_74166.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74166.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -121,8 +121,8 @@ namespace netlist
m_QH.push(qh, delay); //FIXME
}
- NETLIB_DEVICE_IMPL(74166)
- NETLIB_DEVICE_IMPL(74166_dip)
+ NETLIB_DEVICE_IMPL(74166, "TTL_74166", "+CLK,+CLKINH,+SH_LDQ,+SER,+A,+B,+C,+D,+E,+F,+G,+H,+CLRQ")
+ NETLIB_DEVICE_IMPL(74166_dip,"TTL_74166_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74166.h b/src/lib/netlist/devices/nld_74166.h
index b8a8a204374..80c86bb3422 100644
--- a/src/lib/netlist/devices/nld_74166.h
+++ b/src/lib/netlist/devices/nld_74166.h
@@ -27,7 +27,7 @@
#ifndef NLD_74166_H_
#define NLD_74166_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74166(name, cCLK, cCLKINH, cSH_LDQ, cSER, cA, cB, cC, cD, cE, cF, cG, cH, cCLRQ) \
NET_REGISTER_DEV(TTL_74166, name) \
diff --git a/src/lib/netlist/devices/nld_74174.cpp b/src/lib/netlist/devices/nld_74174.cpp
index 5f4573942bd..83369075db6 100644
--- a/src/lib/netlist/devices/nld_74174.cpp
+++ b/src/lib/netlist/devices/nld_74174.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74174.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -134,8 +134,8 @@ namespace netlist
//m_sub.do_reset();
}
- NETLIB_DEVICE_IMPL(74174)
- NETLIB_DEVICE_IMPL(74174_dip)
+ NETLIB_DEVICE_IMPL(74174, "TTL_74174", "+CLK,+D1,+D2,+D3,+D4,+D5,+D6,+CLRQ")
+ NETLIB_DEVICE_IMPL(74174_dip,"TTL_74174_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74174.h b/src/lib/netlist/devices/nld_74174.h
index 66824abb7aa..f1854801291 100644
--- a/src/lib/netlist/devices/nld_74174.h
+++ b/src/lib/netlist/devices/nld_74174.h
@@ -36,7 +36,7 @@
#ifndef NLD_74174_H_
#define NLD_74174_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74174(name, cCLK, cD1, cD2, cD3, cD4, cD5, cD6, cCLRQ) \
NET_REGISTER_DEV(TTL_74174, name) \
diff --git a/src/lib/netlist/devices/nld_74175.cpp b/src/lib/netlist/devices/nld_74175.cpp
index 5955bcb389e..a15adb5c60f 100644
--- a/src/lib/netlist/devices/nld_74175.cpp
+++ b/src/lib/netlist/devices/nld_74175.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74175.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -111,8 +111,8 @@ namespace netlist
m_data = 0xFF;
}
- NETLIB_DEVICE_IMPL(74175)
- NETLIB_DEVICE_IMPL(74175_dip)
+ NETLIB_DEVICE_IMPL(74175, "TTL_74175", "+CLK,+D1,+D2,+D3,+D4,+CLRQ")
+ NETLIB_DEVICE_IMPL(74175_dip,"TTL_74175_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74175.h b/src/lib/netlist/devices/nld_74175.h
index 27e01b55b05..4bc8c1175ba 100644
--- a/src/lib/netlist/devices/nld_74175.h
+++ b/src/lib/netlist/devices/nld_74175.h
@@ -36,7 +36,7 @@
#ifndef NLD_74175_H_
#define NLD_74175_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74175(name, cCLK, cD1, cD2, cD3, cD4, cCLRQ) \
NET_REGISTER_DEV(TTL_74175, name) \
diff --git a/src/lib/netlist/devices/nld_74192.cpp b/src/lib/netlist/devices/nld_74192.cpp
index 1af605d4776..954fc351179 100644
--- a/src/lib/netlist/devices/nld_74192.cpp
+++ b/src/lib/netlist/devices/nld_74192.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74192.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -110,7 +110,7 @@ namespace netlist
}
// FIXME: Timing
- static constexpr netlist_time delay[4] =
+ static constexpr const netlist_time delay[4] =
{
NLTIME_FROM_NS(40),
NLTIME_FROM_NS(40),
@@ -162,8 +162,8 @@ namespace netlist
m_CARRYQ.push(tCarry, NLTIME_FROM_NS(20)); //FIXME
}
- NETLIB_DEVICE_IMPL(74192)
- NETLIB_DEVICE_IMPL(74192_dip)
+ NETLIB_DEVICE_IMPL(74192, "TTL_74192", "+A,+B,+C,+D,+CLEAR,+LOADQ,+CU,+CD")
+ NETLIB_DEVICE_IMPL(74192_dip,"TTL_74192_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74192.h b/src/lib/netlist/devices/nld_74192.h
index 613d463cf47..9b0139070b8 100644
--- a/src/lib/netlist/devices/nld_74192.h
+++ b/src/lib/netlist/devices/nld_74192.h
@@ -29,7 +29,7 @@
#ifndef NLD_74192_H_
#define NLD_74192_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74192(name, cA, cB, cC, cD, cCLEAR, cLOADQ, cCU, cCD) \
NET_REGISTER_DEV(TTL_74192, name) \
diff --git a/src/lib/netlist/devices/nld_74193.cpp b/src/lib/netlist/devices/nld_74193.cpp
index 55d18f3dc1b..16d7438d799 100644
--- a/src/lib/netlist/devices/nld_74193.cpp
+++ b/src/lib/netlist/devices/nld_74193.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74193.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -87,7 +87,7 @@ namespace netlist
}
// FIXME: Timing
- static constexpr netlist_time delay[4] =
+ static constexpr const netlist_time delay[4] =
{
NLTIME_FROM_NS(40),
NLTIME_FROM_NS(40),
@@ -139,8 +139,8 @@ namespace netlist
m_CARRYQ.push(tCarry, NLTIME_FROM_NS(20)); //FIXME timing
}
- NETLIB_DEVICE_IMPL(74193)
- NETLIB_DEVICE_IMPL(74193_dip)
+ NETLIB_DEVICE_IMPL(74193, "TTL_74193", "+A,+B,+C,+D,+CLEAR,+LOADQ,+CU,+CD")
+ NETLIB_DEVICE_IMPL(74193_dip, "TTL_74193_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74193.h b/src/lib/netlist/devices/nld_74193.h
index bb14a301f38..a4c745d5386 100644
--- a/src/lib/netlist/devices/nld_74193.h
+++ b/src/lib/netlist/devices/nld_74193.h
@@ -26,7 +26,7 @@
#ifndef NLD_74193_H_
#define NLD_74193_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74193(name, cA, cB, cC, cD, cCLEAR, cLOADQ, cCU, cCD) \
NET_REGISTER_DEV(TTL_74193, name) \
diff --git a/src/lib/netlist/devices/nld_74194.cpp b/src/lib/netlist/devices/nld_74194.cpp
index d531e792885..9876aa6b170 100644
--- a/src/lib/netlist/devices/nld_74194.cpp
+++ b/src/lib/netlist/devices/nld_74194.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_74194.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -116,8 +116,8 @@ namespace netlist
m_Q[i].push((q >> i) & 1, NLTIME_FROM_NS(26)); // FIXME: Timing
}
- NETLIB_DEVICE_IMPL(74194)
- NETLIB_DEVICE_IMPL(74194_dip)
+ NETLIB_DEVICE_IMPL(74194, "TTL_74194", "+CLK,+S0,+S1,+SRIN,+A,+B,+C,+D,+SLIN,+CLRQ")
+ NETLIB_DEVICE_IMPL(74194_dip, "TTL_74194_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74194.h b/src/lib/netlist/devices/nld_74194.h
index 5124a66bcc0..5a507982b81 100644
--- a/src/lib/netlist/devices/nld_74194.h
+++ b/src/lib/netlist/devices/nld_74194.h
@@ -26,7 +26,7 @@
#ifndef NLD_74194_H_
#define NLD_74194_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74194(name, cCLK, cS0, cS1, cSRIN, cA, cB, cC, cD, cSLIN, cCLRQ) \
NET_REGISTER_DEV(TTL_74194, name) \
diff --git a/src/lib/netlist/devices/nld_74365.cpp b/src/lib/netlist/devices/nld_74365.cpp
index 10456ebbc21..753f16bfd22 100644
--- a/src/lib/netlist/devices/nld_74365.cpp
+++ b/src/lib/netlist/devices/nld_74365.cpp
@@ -6,12 +6,20 @@
*/
#include "nld_74365.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
namespace devices
{
+
+ /* FIXME: This should be a single device, i.e. one tristate buffer only.
+ *
+ * FIXME: Implement tristate output.
+ *
+ */
+
+
NETLIB_OBJECT(74365)
{
NETLIB_CONSTRUCTOR(74365)
@@ -68,8 +76,8 @@ namespace netlist
}
}
- NETLIB_DEVICE_IMPL(74365)
- NETLIB_DEVICE_IMPL(74365_dip)
+ NETLIB_DEVICE_IMPL(74365, "TTL_74365", "+G1Q,+G2Q,+A1,+A2,+A3,+A4,+A5,+A6")
+ NETLIB_DEVICE_IMPL(74365_dip, "TTL_74365_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74365.h b/src/lib/netlist/devices/nld_74365.h
index ca0eacf6ba1..a50b535383f 100644
--- a/src/lib/netlist/devices/nld_74365.h
+++ b/src/lib/netlist/devices/nld_74365.h
@@ -25,7 +25,7 @@
#ifndef NLD_74365_H_
#define NLD_74365_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_74365(name, cG1Q, cG2Q, cA1, cA2, cA3, cA4, cA5, cA6) \
NET_REGISTER_DEV(TTL_74365, name) \
diff --git a/src/lib/netlist/devices/nld_7448.cpp b/src/lib/netlist/devices/nld_7448.cpp
index cc2e60f23b7..4500229a1c5 100644
--- a/src/lib/netlist/devices/nld_7448.cpp
+++ b/src/lib/netlist/devices/nld_7448.cpp
@@ -5,8 +5,10 @@
*
*/
-#include "nlid_truthtable.h"
#include "nld_7448.h"
+#include "nlid_truthtable.h"
+
+#include <array>
namespace netlist
{
@@ -133,9 +135,9 @@ namespace netlist
#else
-#define BITS7(b6,b5,b4,b3,b2,b1,b0) (b6<<6) | (b5<<5) | (b4<<4) | (b3<<3) | (b2<<2) | (b1<<1) | (b0<<0)
+#define BITS7(b6,b5,b4,b3,b2,b1,b0) ((b6)<<6) | ((b5)<<5) | ((b4)<<4) | ((b3)<<3) | ((b2)<<2) | ((b1)<<1) | ((b0)<<0)
- static constexpr uint8_t tab7448[16] =
+ static constexpr const std::array<uint8_t, 16> tab7448 =
{
BITS7( 1, 1, 1, 1, 1, 1, 0 ), /* 00 - not blanked ! */
BITS7( 0, 1, 1, 0, 0, 0, 0 ), /* 01 */
@@ -188,11 +190,13 @@ namespace netlist
NETLIB_RESET(7448)
{
m_state = 0;
- m_A.inactivate();
- m_B.inactivate();
- m_C.inactivate();
- m_D.inactivate();
- m_RBIQ.inactivate();
+#if 0
+ m_A.set_state(logic_t::STATE_INP_PASSIVE);
+ m_B.set_state(logic_t::STATE_INP_PASSIVE);
+ m_C.set_state(logic_t::STATE_INP_PASSIVE);
+ m_D.set_state(logic_t::STATE_INP_PASSIVE);
+ m_RBIQ.set_state(logic_t::STATE_INP_PASSIVE);
+#endif
}
NETLIB_FUNC_VOID(7448, update_outputs, (unsigned v))
@@ -211,8 +215,8 @@ namespace netlist
#endif
- NETLIB_DEVICE_IMPL(7448)
- NETLIB_DEVICE_IMPL(7448_dip)
+ NETLIB_DEVICE_IMPL(7448, "TTL_7448", "+A,+B,+C,+D,+LTQ,+BIQ,+RBIQ")
+ NETLIB_DEVICE_IMPL(7448_dip, "TTL_7448_DIP", "")
} //namespace devices
diff --git a/src/lib/netlist/devices/nld_7448.h b/src/lib/netlist/devices/nld_7448.h
index 89528707bc1..b9c03ae6360 100644
--- a/src/lib/netlist/devices/nld_7448.h
+++ b/src/lib/netlist/devices/nld_7448.h
@@ -24,7 +24,7 @@
#ifndef NLD_7448_H_
#define NLD_7448_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#ifndef NL_AUTO_DEVICES
diff --git a/src/lib/netlist/devices/nld_7450.cpp b/src/lib/netlist/devices/nld_7450.cpp
index af9b9afada1..aacab46a021 100644
--- a/src/lib/netlist/devices/nld_7450.cpp
+++ b/src/lib/netlist/devices/nld_7450.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_7450.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -68,10 +68,10 @@ namespace netlist
m_B.activate();
m_C.activate();
m_D.activate();
- unsigned t1 = m_A() & m_B();
- unsigned t2 = m_C() & m_D();
+ auto t1 = m_A() & m_B();
+ auto t2 = m_C() & m_D();
- const netlist_time times[2] = { NLTIME_FROM_NS(22), NLTIME_FROM_NS(15) };
+ const netlist_time times[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) };
uint_fast8_t res = 0;
if (t1 ^ 1)
@@ -85,18 +85,20 @@ namespace netlist
m_A.inactivate();
m_B.inactivate();
}
- } else {
+ }
+ else
+ {
if (t2 ^ 1)
{
m_C.inactivate();
m_D.inactivate();
}
}
- m_Q.push(res, times[1 - res]);// ? 22000 : 15000);
+ m_Q.push(res, times[res]);// ? 22000 : 15000);
}
- NETLIB_DEVICE_IMPL(7450)
- NETLIB_DEVICE_IMPL(7450_dip)
+ NETLIB_DEVICE_IMPL(7450, "TTL_7450_ANDORINVERT", "+A,+B,+C,+D")
+ NETLIB_DEVICE_IMPL(7450_dip, "TTL_7450_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7450.h b/src/lib/netlist/devices/nld_7450.h
index 652516758ad..6718afd8f9e 100644
--- a/src/lib/netlist/devices/nld_7450.h
+++ b/src/lib/netlist/devices/nld_7450.h
@@ -24,7 +24,7 @@
#ifndef NLD_7450_H_
#define NLD_7450_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_7450_ANDORINVERT(name, cI1, cI2, cI3, cI4) \
NET_REGISTER_DEV(TTL_7450_ANDORINVERT, name) \
diff --git a/src/lib/netlist/devices/nld_7473.cpp b/src/lib/netlist/devices/nld_7473.cpp
index d9efb9fb710..c8abd829264 100644
--- a/src/lib/netlist/devices/nld_7473.cpp
+++ b/src/lib/netlist/devices/nld_7473.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_7473.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -142,10 +142,10 @@ namespace netlist
m_QQ.push(m_q ^ 1, NLTIME_FROM_NS(20)); // FIXME: timing
}
- NETLIB_DEVICE_IMPL(7473)
- NETLIB_DEVICE_IMPL(7473A)
- NETLIB_DEVICE_IMPL(7473_dip)
- NETLIB_DEVICE_IMPL(7473A_dip)
+ NETLIB_DEVICE_IMPL(7473, "TTL_7473", "+CLK,+J,+K,+CLRQ")
+ NETLIB_DEVICE_IMPL(7473A, "TTL_7473A", "+CLK,+J,+K,+CLRQ")
+ NETLIB_DEVICE_IMPL(7473_dip, "TTL_7473_DIP", "")
+ NETLIB_DEVICE_IMPL(7473A_dip, "TTL_7473A_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7473.h b/src/lib/netlist/devices/nld_7473.h
index 5313d18570c..3fbaaf4efbc 100644
--- a/src/lib/netlist/devices/nld_7473.h
+++ b/src/lib/netlist/devices/nld_7473.h
@@ -60,7 +60,7 @@
#ifndef NLD_7473_H_
#define NLD_7473_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_7473(name, cCLK, cJ, cK, cCLRQ) \
NET_REGISTER_DEV(TTL_7473, name) \
diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp
index 9d020663f46..740af6ad3c1 100644
--- a/src/lib/netlist/devices/nld_7474.cpp
+++ b/src/lib/netlist/devices/nld_7474.cpp
@@ -1,3 +1,4 @@
+
// license:GPL-2.0+
// copyright-holders:Couriersud
/*
@@ -6,60 +7,47 @@
*/
#include "nld_7474.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
namespace devices
{
- NETLIB_OBJECT(7474sub)
+
+ NETLIB_OBJECT(7474)
{
- NETLIB_CONSTRUCTOR(7474sub)
- , m_CLK(*this, "CLK")
+ NETLIB_CONSTRUCTOR(7474)
+ , m_D(*this, "D")
+ , m_CLRQ(*this, "CLRQ")
+ , m_PREQ(*this, "PREQ")
+ , m_CLK(*this, "CLK", NETLIB_DELEGATE(7474, clk))
, m_Q(*this, "Q")
, m_QQ(*this, "QQ")
, m_nextD(*this, "m_nextD", 0)
{
}
+ private:
NETLIB_RESETI();
NETLIB_UPDATEI();
+ NETLIB_HANDLERI(clk);
- public:
+ logic_input_t m_D;
+ logic_input_t m_CLRQ;
+ logic_input_t m_PREQ;
logic_input_t m_CLK;
logic_output_t m_Q;
logic_output_t m_QQ;
- state_var<unsigned> m_nextD;
-
- inline void newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ);
- private:
-
- };
+ state_var<netlist_sig_t> m_nextD;
- NETLIB_OBJECT(7474)
- {
- NETLIB_CONSTRUCTOR(7474)
- , sub(*this, "sub")
- , m_D(*this, "D")
- , m_CLRQ(*this, "CLRQ")
- , m_PREQ(*this, "PREQ")
+ void newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ)
{
- register_subalias("CLK", sub.m_CLK);
-
- register_subalias("Q", sub.m_Q);
- register_subalias("QQ", sub.m_QQ);
+ // 0: High-to-low 40 ns, 1: Low-to-high 25 ns
+ static constexpr const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
+ m_Q.push(stateQ, delay[stateQ]);
+ m_QQ.push(stateQQ, delay[stateQQ]);
}
-
- 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)
@@ -68,20 +56,20 @@ namespace netlist
, 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("1", "1.CLRQ");
+ register_subalias("2", "1.D");
+ register_subalias("3", "1.CLK");
+ register_subalias("4", "1.PREQ");
+ register_subalias("5", "1.Q");
+ register_subalias("6", "1.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("8", "2.QQ");
+ register_subalias("9", "2.Q");
+ register_subalias("10", "2.PREQ");
+ register_subalias("11", "2.CLK");
+ register_subalias("12", "2.D");
+ register_subalias("13", "2.CLRQ");
// register_subalias("14", ); ==> VCC
}
NETLIB_UPDATEI();
@@ -92,77 +80,47 @@ namespace netlist
NETLIB_SUB(7474) m_2;
};
- inline void NETLIB_NAME(7474sub)::newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ)
+ NETLIB_HANDLER(7474, clk)
{
- // 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) };
- m_Q.push(stateQ, delay[stateQ]);
- m_QQ.push(stateQQ, delay[stateQQ]);
- }
-
- NETLIB_UPDATE(7474sub)
- {
- //if (INP_LH(m_CLK))
- {
- newstate(m_nextD, !m_nextD);
- m_CLK.inactivate();
- }
+ newstate(m_nextD, !m_nextD);
+ m_CLK.inactivate();
}
NETLIB_UPDATE(7474)
{
- if (m_PREQ() && m_CLRQ())
+ const auto preq(m_PREQ());
+ const auto clrq(m_CLRQ());
+ if (preq & clrq)
{
m_D.activate();
- sub.m_nextD = m_D();
- sub.m_CLK.activate_lh();
- }
- else if (!m_PREQ())
- {
- sub.newstate(1, 0);
- sub.m_CLK.inactivate();
- m_D.inactivate();
- }
- else if (!m_CLRQ())
- {
- sub.newstate(0, 1);
- sub.m_CLK.inactivate();
- m_D.inactivate();
+ m_nextD = m_D();
+ m_CLK.activate_lh();
}
else
{
- sub.newstate(1, 1);
- sub.m_CLK.inactivate();
+ newstate(preq ^ 1, clrq ^ 1);
+ m_CLK.inactivate();
m_D.inactivate();
}
}
NETLIB_RESET(7474)
{
- sub.do_reset();
- }
-
- NETLIB_RESET(7474sub)
- {
m_CLK.set_state(logic_t::STATE_INP_LH);
-
+ m_D.set_state(logic_t::STATE_INP_ACTIVE);
m_nextD = 0;
}
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_DEVICE_IMPL(7474)
- NETLIB_DEVICE_IMPL(7474_dip)
+ NETLIB_DEVICE_IMPL(7474, "TTL_7474", "+CLK,+D,+CLRQ,+PREQ")
+ NETLIB_DEVICE_IMPL(7474_dip, "TTL_7474_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7474.h b/src/lib/netlist/devices/nld_7474.h
index aa48e240387..48fd4f3d842 100644
--- a/src/lib/netlist/devices/nld_7474.h
+++ b/src/lib/netlist/devices/nld_7474.h
@@ -42,7 +42,7 @@
#ifndef NLD_7474_H_
#define NLD_7474_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_7474(name, cCLK, cD, cCLRQ, cPREQ) \
NET_REGISTER_DEV(TTL_7474, name) \
diff --git a/src/lib/netlist/devices/nld_7475.cpp b/src/lib/netlist/devices/nld_7475.cpp
index b2d28048513..63fd355d406 100644
--- a/src/lib/netlist/devices/nld_7475.cpp
+++ b/src/lib/netlist/devices/nld_7475.cpp
@@ -7,7 +7,7 @@
*/
#include "nld_7475.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -101,7 +101,7 @@ namespace netlist
{
unsigned start_q = m_last_Q;
- NETLIB_PARENT_UPDATE(7477);
+ NETLIB_NAME(7477)::update();
for (std::size_t i=0; i<4; i++)
{
@@ -148,10 +148,10 @@ namespace netlist
}
- NETLIB_DEVICE_IMPL(7475)
- NETLIB_DEVICE_IMPL(7475_dip)
- NETLIB_DEVICE_IMPL(7477)
- NETLIB_DEVICE_IMPL(7477_dip)
+ NETLIB_DEVICE_IMPL(7475, "TTL_7475", "")
+ NETLIB_DEVICE_IMPL(7475_dip, "TTL_7475_DIP", "")
+ NETLIB_DEVICE_IMPL(7477, "TTL_7477", "")
+ NETLIB_DEVICE_IMPL(7477_dip, "TTL_7477_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7475.h b/src/lib/netlist/devices/nld_7475.h
index 51d09e75a66..b16fabe61b6 100644
--- a/src/lib/netlist/devices/nld_7475.h
+++ b/src/lib/netlist/devices/nld_7475.h
@@ -35,7 +35,7 @@
#ifndef NLD_7475_H_
#define NLD_7475_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define PARAMS_7475_7477(name, cC1C2, cC3C4, cD1, cD2, cD3, cD4) \
NET_CONNECT(name, C1C2, cC1C2) \
diff --git a/src/lib/netlist/devices/nld_7483.cpp b/src/lib/netlist/devices/nld_7483.cpp
index 72c86c003d5..5f820162209 100644
--- a/src/lib/netlist/devices/nld_7483.cpp
+++ b/src/lib/netlist/devices/nld_7483.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_7483.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -16,14 +16,16 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(7483)
, m_C0(*this, "C0")
- , m_A1(*this, "A1")
- , m_A2(*this, "A2")
- , m_A3(*this, "A3")
- , m_A4(*this, "A4")
- , m_B1(*this, "B1")
- , m_B2(*this, "B2")
- , m_B3(*this, "B3")
- , m_B4(*this, "B4")
+ , m_A1(*this, "A1", NETLIB_DELEGATE(7483, upd_a))
+ , m_A2(*this, "A2", NETLIB_DELEGATE(7483, upd_a))
+ , m_A3(*this, "A3", NETLIB_DELEGATE(7483, upd_a))
+ , m_A4(*this, "A4", NETLIB_DELEGATE(7483, upd_a))
+ , m_B1(*this, "B1", NETLIB_DELEGATE(7483, upd_b))
+ , m_B2(*this, "B2", NETLIB_DELEGATE(7483, upd_b))
+ , m_B3(*this, "B3", NETLIB_DELEGATE(7483, upd_b))
+ , m_B4(*this, "B4", NETLIB_DELEGATE(7483, upd_b))
+ , m_a(*this, "m_a", 0)
+ , m_b(*this, "m_b", 0)
, m_lastr(*this, "m_lastr", 0)
, m_S1(*this, "S1")
, m_S2(*this, "S2")
@@ -34,6 +36,8 @@ namespace netlist
}
NETLIB_RESETI();
NETLIB_UPDATEI();
+ NETLIB_HANDLERI(upd_a);
+ NETLIB_HANDLERI(upd_b);
protected:
logic_input_t m_C0;
@@ -46,7 +50,9 @@ namespace netlist
logic_input_t m_B3;
logic_input_t m_B4;
- state_var<unsigned> m_lastr;
+ state_var_u8 m_a;
+ state_var_u8 m_b;
+ state_var_u8 m_lastr;
logic_output_t m_S1;
logic_output_t m_S2;
@@ -87,12 +93,21 @@ namespace netlist
m_lastr = 0;
}
- NETLIB_UPDATE(7483)
+ NETLIB_HANDLER(7483, upd_a)
{
- netlist_sig_t a = (m_A1() << 0) | (m_A2() << 1) | (m_A3() << 2) | (m_A4() << 3);
- netlist_sig_t b = (m_B1() << 0) | (m_B2() << 1) | (m_B3() << 2) | (m_B4() << 3);
+ m_a = static_cast<uint8_t>((m_A1() << 0) | (m_A2() << 1) | (m_A3() << 2) | (m_A4() << 3));
+ NETLIB_NAME(7483)::update();
+ }
- unsigned r = a + b + m_C0();
+ NETLIB_HANDLER(7483, upd_b)
+ {
+ m_b = static_cast<uint8_t>((m_B1() << 0) | (m_B2() << 1) | (m_B3() << 2) | (m_B4() << 3));
+ NETLIB_NAME(7483)::update();
+ }
+
+ NETLIB_UPDATE(7483)
+ {
+ auto r = static_cast<uint8_t>(m_a + m_b + m_C0());
if (r != m_lastr)
{
@@ -105,8 +120,8 @@ namespace netlist
}
}
- NETLIB_DEVICE_IMPL(7483)
- NETLIB_DEVICE_IMPL(7483_dip)
+ NETLIB_DEVICE_IMPL(7483, "TTL_7483", "+A1,+A2,+A3,+A4,+B1,+B2,+B3,+B4,+C0")
+ NETLIB_DEVICE_IMPL(7483_dip, "TTL_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 24952bf0501..ba82d5bbb9c 100644
--- a/src/lib/netlist/devices/nld_7483.h
+++ b/src/lib/netlist/devices/nld_7483.h
@@ -27,7 +27,7 @@
#ifndef NLD_7483_H_
#define NLD_7483_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_7483(name, cA1, cA2, cA3, cA4, cB1, cB2, cB3, cB4, cCI) \
NET_REGISTER_DEV(TTL_7483, name) \
diff --git a/src/lib/netlist/devices/nld_7485.cpp b/src/lib/netlist/devices/nld_7485.cpp
index 320cf762f26..cadb73000ff 100644
--- a/src/lib/netlist/devices/nld_7485.cpp
+++ b/src/lib/netlist/devices/nld_7485.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_7485.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -101,8 +101,8 @@ namespace netlist
update_outputs(1, 1, 0);
}
- NETLIB_DEVICE_IMPL(7485)
- NETLIB_DEVICE_IMPL(7485_dip)
+ NETLIB_DEVICE_IMPL(7485, "TTL_7485", "+A0,+A1,+A2,+A3,+B0,+B1,+B2,+B3,+LTIN,+EQIN,+GTIN")
+ NETLIB_DEVICE_IMPL(7485_dip, "TTL_7485_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7485.h b/src/lib/netlist/devices/nld_7485.h
index 61b87c37ba3..7890f4dbd2a 100644
--- a/src/lib/netlist/devices/nld_7485.h
+++ b/src/lib/netlist/devices/nld_7485.h
@@ -23,7 +23,7 @@
#ifndef NLD_7485_H_
#define NLD_7485_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_7485(name, cA0, cA1, cA2, cA3, cB0, cB1, cB2, cB3, cLTIN, cEQIN, cGTIN) \
NET_REGISTER_DEV(TTL_7485, name) \
diff --git a/src/lib/netlist/devices/nld_7490.cpp b/src/lib/netlist/devices/nld_7490.cpp
index 13e69c6aa31..acbe0fa4d7a 100644
--- a/src/lib/netlist/devices/nld_7490.cpp
+++ b/src/lib/netlist/devices/nld_7490.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_7490.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -28,10 +28,10 @@ namespace netlist
{
}
+ private:
NETLIB_UPDATEI();
NETLIB_RESETI();
- protected:
void update_outputs();
logic_input_t m_A;
@@ -52,22 +52,22 @@ namespace netlist
{
NETLIB_CONSTRUCTOR_DERIVED(7490_dip, 7490)
{
- register_subalias("1", m_B);
- register_subalias("2", m_R1);
- register_subalias("3", m_R2);
+ register_subalias("1", "B");
+ register_subalias("2", "R1");
+ register_subalias("3", "R2");
// register_subalias("4", ); --> NC
// register_subalias("5", ); --> VCC
- register_subalias("6", m_R91);
- register_subalias("7", m_R92);
+ register_subalias("6", "R91");
+ register_subalias("7", "R92");
- register_subalias("8", m_Q[2]);
- register_subalias("9", m_Q[1]);
+ register_subalias("8", "QC");
+ register_subalias("9", "QB");
// register_subalias("10", ); --> GND
- register_subalias("11", m_Q[3]);
- register_subalias("12", m_Q[0]);
+ register_subalias("11", "QD");
+ register_subalias("12", "QA");
// register_subalias("13", ); --> NC
- register_subalias("14", m_A);
+ register_subalias("14", "A");
}
};
@@ -78,12 +78,13 @@ namespace netlist
m_last_B = 0;
}
- static C14CONSTEXPR const netlist_time delay[4] =
+ static constexpr 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)};
+ NLTIME_FROM_NS(72) - NLTIME_FROM_NS(18)
+ };
NETLIB_UPDATE(7490)
{
@@ -119,14 +120,14 @@ namespace netlist
m_last_B = new_B;
}
- NETLIB_FUNC_VOID(7490, update_outputs, (void))
+ NETLIB_FUNC_VOID(7490, update_outputs, ())
{
for (std::size_t i=0; i<4; i++)
m_Q[i].push((m_cnt >> i) & 1, delay[i]);
}
- NETLIB_DEVICE_IMPL(7490)
- NETLIB_DEVICE_IMPL(7490_dip)
+ NETLIB_DEVICE_IMPL(7490, "TTL_7490", "+A,+B,+R1,+R2,+R91,+R92")
+ NETLIB_DEVICE_IMPL(7490_dip, "TTL_7490_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7490.h b/src/lib/netlist/devices/nld_7490.h
index 5ff18543b03..e2fa5094911 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_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_7490(name, cA, cB, cR1, cR2, cR91, cR92) \
NET_REGISTER_DEV(TTL_7490, name) \
diff --git a/src/lib/netlist/devices/nld_7493.cpp b/src/lib/netlist/devices/nld_7493.cpp
index f3c68f7a5c2..f26e1c237d5 100644
--- a/src/lib/netlist/devices/nld_7493.cpp
+++ b/src/lib/netlist/devices/nld_7493.cpp
@@ -6,23 +6,22 @@
*/
#include "nld_7493.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
namespace devices
{
- static constexpr netlist_time out_delay = NLTIME_FROM_NS(18);
- static constexpr netlist_time out_delay2 = NLTIME_FROM_NS(36);
- static constexpr netlist_time out_delay3 = NLTIME_FROM_NS(54);
+ static constexpr const netlist_time out_delay = NLTIME_FROM_NS(18);
+ static constexpr const netlist_time out_delay2 = NLTIME_FROM_NS(36);
+ static constexpr const netlist_time out_delay3 = NLTIME_FROM_NS(54);
NETLIB_OBJECT(7493)
{
NETLIB_CONSTRUCTOR(7493)
, m_R1(*this, "R1")
, m_R2(*this, "R2")
- , m_reset(*this, "_m_reset", 0)
, m_a(*this, "_m_a", 0)
, m_bcd(*this, "_m_b", 0)
, m_CLKA(*this, "CLKA", NETLIB_DELEGATE(7493, updA))
@@ -35,35 +34,51 @@ namespace netlist
}
private:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
+ NETLIB_RESETI()
+ {
+ m_a = m_bcd = 0;
+ m_CLKA.set_state(logic_t::STATE_INP_HL);
+ m_CLKB.set_state(logic_t::STATE_INP_HL);
+ }
- NETLIB_HANDLERI(updA)
+ NETLIB_UPDATEI()
{
- if (m_reset)
+ if (!(m_R1() & m_R2()))
+ {
+ m_CLKA.activate_hl();
+ m_CLKB.activate_hl();
+ }
+ else
{
- m_a ^= 1;
- m_QA.push(m_a, out_delay);
+ m_CLKA.inactivate();
+ m_CLKB.inactivate();
+ m_QA.push(0, NLTIME_FROM_NS(40));
+ m_QB.push(0, NLTIME_FROM_NS(40));
+ m_QC.push(0, NLTIME_FROM_NS(40));
+ m_QD.push(0, NLTIME_FROM_NS(40));
+ m_a = m_bcd = 0;
}
}
+ NETLIB_HANDLERI(updA)
+ {
+ m_a ^= 1;
+ m_QA.push(m_a, out_delay);
+ }
+
NETLIB_HANDLERI(updB)
{
- if (m_reset)
- {
- ++m_bcd &= static_cast<std::uint8_t>(0x07);
- m_QD.push((m_bcd >> 2) & 1, out_delay3);
- m_QC.push((m_bcd >> 1) & 1, out_delay2);
- m_QB.push(m_bcd & 1, out_delay);
- }
+ auto cnt = (++m_bcd &= 0x07);
+ m_QD.push((cnt >> 2) & 1, out_delay3);
+ m_QC.push((cnt >> 1) & 1, out_delay2);
+ m_QB.push(cnt & 1, out_delay);
}
logic_input_t m_R1;
logic_input_t m_R2;
- state_var_sig m_reset;
state_var_sig m_a;
- state_var_sig m_bcd;
+ state_var_u8 m_bcd;
logic_input_t m_CLKA;
logic_input_t m_CLKB;
@@ -97,37 +112,9 @@ namespace netlist
}
};
- NETLIB_RESET(7493)
- {
- m_reset = 1;
- m_a = m_bcd = 0;
- m_CLKA.set_state(logic_t::STATE_INP_HL);
- m_CLKB.set_state(logic_t::STATE_INP_HL);
- }
-
- NETLIB_UPDATE(7493)
- {
- m_reset = (m_R1() & m_R2()) ^ 1;
-
- if (m_reset)
- {
- m_CLKA.activate_hl();
- m_CLKB.activate_hl();
- }
- else
- {
- m_CLKA.inactivate();
- m_CLKB.inactivate();
- m_QA.push_force(0, NLTIME_FROM_NS(40));
- m_QB.push_force(0, NLTIME_FROM_NS(40));
- m_QC.push_force(0, NLTIME_FROM_NS(40));
- m_QD.push_force(0, NLTIME_FROM_NS(40));
- m_a = m_bcd = 0;
- }
- }
- NETLIB_DEVICE_IMPL(7493)
- NETLIB_DEVICE_IMPL(7493_dip)
+ NETLIB_DEVICE_IMPL(7493, "TTL_7493", "+CLKA,+CLKB,+R1,+R2")
+ NETLIB_DEVICE_IMPL(7493_dip, "TTL_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 ce9566aa28f..68ad90885ec 100644
--- a/src/lib/netlist/devices/nld_7493.h
+++ b/src/lib/netlist/devices/nld_7493.h
@@ -57,7 +57,7 @@
#ifndef NLD_7493_H_
#define NLD_7493_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_7493(name, cCLKA, cCLKB, cR1, cR2) \
NET_REGISTER_DEV(TTL_7493, name) \
diff --git a/src/lib/netlist/devices/nld_7497.cpp b/src/lib/netlist/devices/nld_7497.cpp
new file mode 100644
index 00000000000..1432884b8dd
--- /dev/null
+++ b/src/lib/netlist/devices/nld_7497.cpp
@@ -0,0 +1,174 @@
+// license:GPL-2.0+
+// copyright-holders:Sergey Svishchev
+/*
+ * nld_7497.cpp
+ *
+ * To do:
+ *
+ * - STRB and EN
+ * - Timing
+ */
+
+#include "nld_7497.h"
+#include "netlist/nl_base.h"
+
+namespace netlist
+{
+ namespace devices
+ {
+
+ static constexpr const netlist_time out_delay_CLK_Y[2] = { NLTIME_FROM_NS(20), NLTIME_FROM_NS(26) }; // tPHL, tPLH
+ static constexpr const netlist_time out_delay_CLK_Z[2] = { NLTIME_FROM_NS(17), NLTIME_FROM_NS(12) };
+
+ NETLIB_OBJECT(7497)
+ {
+ NETLIB_CONSTRUCTOR(7497)
+ , m_B(*this, {{"B5", "B4", "B3", "B2", "B1", "B0"}})
+ , m_CLK(*this, "CLK", NETLIB_DELEGATE(7497, clk_strb))
+ , m_STRBQ(*this, "STRBQ", NETLIB_DELEGATE(7497, clk_strb))
+ , m_ENQ(*this, "ENQ")
+ , m_UNITYQ(*this, "UNITYQ", NETLIB_DELEGATE(7497, unity))
+ , m_CLR(*this, "CLR", NETLIB_DELEGATE(7497, clr))
+ , m_Y(*this, "Y")
+ , m_ZQ(*this, "ZQ")
+ , m_ENOUTQ(*this, "ENOUTQ")
+ , m_cnt(*this, "_m_cnt", 0)
+ , m_rate(*this, "_m_rate", 0)
+ , m_state(*this, "_m_state", 0)
+ , m_lastclock(*this, "_m_lastclock", 0)
+ {
+ }
+
+ private:
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ NETLIB_HANDLERI(noop) { }
+ NETLIB_HANDLERI(unity);
+ NETLIB_HANDLERI(clr);
+ NETLIB_HANDLERI(clk_strb);
+
+ protected:
+ object_array_t<logic_input_t, 6> m_B;
+ logic_input_t m_CLK;
+ logic_input_t m_STRBQ;
+ logic_input_t m_ENQ;
+ logic_input_t m_UNITYQ;
+ logic_input_t m_CLR;
+
+ logic_output_t m_Y;
+ logic_output_t m_ZQ;
+ logic_output_t m_ENOUTQ;
+
+ state_var_u8 m_cnt;
+ state_var_u8 m_rate;
+ state_var_sig m_state;
+ state_var_sig m_lastclock;
+
+ void newstate(const netlist_sig_t state)
+ {
+ m_state = state;
+ m_ZQ.push(state, out_delay_CLK_Z[state]);
+ //netlist_sig_t y = (state ^ 1) | (m_UNITY() ^ 1); // OR with negated inputs == NAND
+ netlist_sig_t y = (state & m_UNITYQ()) ^ 1; // OR with negated inputs == NAND
+ m_Y.push(y, out_delay_CLK_Y[y]);
+ }
+
+ uint8_t rate()
+ {
+ uint8_t a = 0;
+
+ for (std::size_t i = 0; i < 6; i++)
+ a |= (m_B[i]() << i);
+
+ return a;
+ }
+ };
+
+ NETLIB_RESET(7497)
+ {
+ m_cnt = 0;
+ m_rate = 0;
+ m_lastclock = 0;
+ }
+
+ NETLIB_UPDATE(7497)
+ {
+ m_rate = rate();
+ clk_strb();
+ }
+
+ NETLIB_HANDLER(7497, unity)
+ {
+ newstate (m_state);
+ }
+
+ NETLIB_HANDLER(7497, clr)
+ {
+ m_cnt = 0;
+ clk_strb();
+ }
+
+ NETLIB_HANDLER(7497, clk_strb)
+ {
+ netlist_sig_t clk = m_CLK();
+
+ if (!m_lastclock && clk && !m_ENQ() && !m_CLR())
+ {
+ m_cnt++;
+ m_cnt &= 63;
+ }
+ m_lastclock = clk;
+
+ const netlist_sig_t clk_strb = (clk ^ 1) & (m_STRBQ() ^ 1);
+
+ const netlist_sig_t cntQ = m_cnt;
+
+ // NOR GATE
+ netlist_sig_t p1 = ((cntQ & 63) == 31 && (m_rate & 32)) ||
+ ((cntQ & 31) == 15 && (m_rate & 16)) ||
+ ((cntQ & 15) == 7 && (m_rate & 8)) ||
+ ((cntQ & 7) == 3 && (m_rate & 4)) ||
+ ((cntQ & 3) == 1 && (m_rate & 2)) ||
+ ((cntQ & 1) == 0 && (m_rate & 1));
+
+ p1 = (p1 & clk_strb) ^ 1;
+
+ newstate(p1);
+
+ // NAND gate
+ if ((m_cnt == 63) && !m_ENQ())
+ m_ENOUTQ.push(0, out_delay_CLK_Y[0]); // XXX timing
+ else
+ m_ENOUTQ.push(1, out_delay_CLK_Y[1]);
+
+ }
+
+ NETLIB_OBJECT_DERIVED(7497_dip, 7497)
+ {
+ NETLIB_CONSTRUCTOR_DERIVED(7497_dip, 7497)
+ {
+ register_subalias("1", m_B[4]); // B0
+ register_subalias("2", m_B[1]); // B4
+ register_subalias("3", m_B[0]); // B5
+ register_subalias("4", m_B[5]); // B0
+ register_subalias("5", m_ZQ);
+ register_subalias("6", m_Y);
+ register_subalias("7", m_ENOUTQ);
+
+ register_subalias("9", m_CLK);
+ register_subalias("10", m_STRBQ);
+ register_subalias("11", m_UNITYQ);
+ register_subalias("12", m_ENQ);
+ register_subalias("13", m_CLR);
+ register_subalias("14", m_B[3]); // B2
+ register_subalias("15", m_B[2]); // B3
+ }
+ };
+
+
+ NETLIB_DEVICE_IMPL(7497, "TTL_7497", "+CLK,+STRBQ,+ENQ,+UNITYQ,+CLR,+B0,+B1,+B2,+B3,+B4,+B5")
+ NETLIB_DEVICE_IMPL(7497_dip, "TTL_7497_DIP", "")
+
+ } //namespace devices
+} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_7497.h b/src/lib/netlist/devices/nld_7497.h
new file mode 100644
index 00000000000..8d14e08a49b
--- /dev/null
+++ b/src/lib/netlist/devices/nld_7497.h
@@ -0,0 +1,57 @@
+// license:GPL-2.0+
+// copyright-holders:Sergey Svishchev
+/*
+ * nld_7497.h
+ *
+ * SN7497: Synchronous 6-Bit Binary Rate Multiplier
+ *
+ * +--------------+
+ * B1 |1 16| VCC
+ * B4 |2 15| B3
+ * B5 |3 14| B2
+ * B0 |4 7497 13| CLR
+ * Z |5 12| UNITY/CAS
+ * Y |6 11| ENin (EN)
+ * ENout |7 10| STRB
+ * GND |8 9| CLK
+ * +--------------+
+ *
+ * Naming conventions follow TI datasheet
+ *
+ * The counter is enabled when the clear, strobe, and enable inputs are low.
+ *
+ * When the rate input is binary 0 (all rate inputs low), Z remains high [and Y low].
+ *
+ * The unity/cascade input, when connected to the clock input, passes
+ * clock frequency (inverted) to the Y output when the rate input/decoding
+ * gates are inhibited by the strobe.
+ *
+ * When CLR is H, states of CLK and STRB can affect Y and Z. Default are
+ * Y L, Z H, ENout H.
+ *
+ * Unity/cascade is used to inhibit output Y (UNITY L -> Y H)
+ */
+
+#ifndef NLD_7497_H_
+#define NLD_7497_H_
+
+#include "netlist/nl_setup.h"
+
+#define TTL_7497(name, cCLK, cSTRB, cEN, cUNITY, cCLR, cB0, cB1, cB2, cB3, cB4, cB5) \
+ NET_REGISTER_DEV(TTL_7497, name) \
+ NET_CONNECT(name, CLK, cCLK) \
+ NET_CONNECT(name, STRBQ, cSTRB) \
+ NET_CONNECT(name, ENQ, cEN) \
+ NET_CONNECT(name, UNITYQ,cUNITY) \
+ NET_CONNECT(name, CLR, cCLR) \
+ NET_CONNECT(name, B0, cB0) \
+ NET_CONNECT(name, B1, cB1) \
+ NET_CONNECT(name, B2, cB2) \
+ NET_CONNECT(name, B3, cB3) \
+ NET_CONNECT(name, B4, cB4) \
+ NET_CONNECT(name, B5, cB5)
+
+#define TTL_7497_DIP(name) \
+ NET_REGISTER_DEV(TTL_7497_DIP, name)
+
+#endif /* NLD_7497_H_ */
diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp
index d6dc268ed28..b7bb729b334 100644
--- a/src/lib/netlist/devices/nld_74ls629.cpp
+++ b/src/lib/netlist/devices/nld_74ls629.cpp
@@ -40,7 +40,7 @@
#include "nld_74ls629.h"
-#include "../analog/nlid_twoterm.h"
+#include "netlist/analog/nlid_twoterm.h"
namespace netlist
{
@@ -100,11 +100,14 @@ namespace netlist
{
m_R_FC.set_R(90000.0);
m_R_RNG.set_R(90000.0);
- m_clock.do_reset();
+ m_clock.reset();
}
NETLIB_UPDATEI();
- NETLIB_UPDATE_PARAMI() { update_dev(); }
+ NETLIB_UPDATE_PARAMI()
+ {
+ /* update param may be called from anywhere, update_dev(time) is not a good idea */
+ }
public:
NETLIB_SUB(SN74LS629clk) m_clock;
@@ -145,8 +148,8 @@ namespace netlist
NETLIB_RESETI()
{
- m_1.do_reset();
- m_2.do_reset();
+ m_1.reset();
+ m_2.reset();
}
private:
@@ -207,7 +210,7 @@ namespace netlist
freq += k9 * v_rng * v_freq_3;
freq += k10 * v_rng * v_freq_4;
- freq *= NL_FCONST(0.1e-6) / m_CAP();
+ freq *= plib::constants<nl_double>::cast(0.1e-6) / m_CAP();
// FIXME: we need a possibility to remove entries from queue ...
// or an exact model ...
@@ -231,8 +234,8 @@ namespace netlist
}
}
- NETLIB_DEVICE_IMPL(SN74LS629)
- NETLIB_DEVICE_IMPL(SN74LS629_dip)
+ NETLIB_DEVICE_IMPL(SN74LS629, "SN74LS629", "CAP")
+ NETLIB_DEVICE_IMPL(SN74LS629_dip, "SN74LS629_DIP", "1.CAP1,2.CAP2")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_74ls629.h b/src/lib/netlist/devices/nld_74ls629.h
index 3351524a60b..30d15d70865 100644
--- a/src/lib/netlist/devices/nld_74ls629.h
+++ b/src/lib/netlist/devices/nld_74ls629.h
@@ -28,7 +28,7 @@
#ifndef NLD_74LS629_H_
#define NLD_74LS629_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define SN74LS629(name, p_cap) \
NET_REGISTER_DEV(SN74LS629, name) \
diff --git a/src/lib/netlist/devices/nld_82S115.cpp b/src/lib/netlist/devices/nld_82S115.cpp
index 2e24bbf9fed..8ae6cbb6097 100644
--- a/src/lib/netlist/devices/nld_82S115.cpp
+++ b/src/lib/netlist/devices/nld_82S115.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_82S115.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -106,8 +106,8 @@ namespace netlist
m_O[i].push((o >> i) & 1, NLTIME_FROM_NS(40)); // FIXME: Timing
}
- NETLIB_DEVICE_IMPL(82S115)
- NETLIB_DEVICE_IMPL(82S115_dip)
+ NETLIB_DEVICE_IMPL(82S115, "PROM_82S115", "+CE1Q,+CE2,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+STROBE")
+ NETLIB_DEVICE_IMPL(82S115_dip, "PROM_82S115_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_82S115.h b/src/lib/netlist/devices/nld_82S115.h
index ef7f1ec3910..8c13fd8b51e 100644
--- a/src/lib/netlist/devices/nld_82S115.h
+++ b/src/lib/netlist/devices/nld_82S115.h
@@ -28,7 +28,7 @@
#ifndef NLD_82S115_H_
#define NLD_82S115_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define PROM_82S115(name, cCE1Q, cCE2, cA0, cA1, cA2, cA3, cA4, cA5, cA6, cA7, cA8, cSTROBE) \
NET_REGISTER_DEV(PROM_82S115, name) \
diff --git a/src/lib/netlist/devices/nld_82S123.cpp b/src/lib/netlist/devices/nld_82S123.cpp
index a8a6bfc9b57..4a80b57e349 100644
--- a/src/lib/netlist/devices/nld_82S123.cpp
+++ b/src/lib/netlist/devices/nld_82S123.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_82S123.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -77,8 +77,8 @@ namespace netlist
m_O[i].push((o >> i) & 1, delay);
}
- NETLIB_DEVICE_IMPL(82S123)
- NETLIB_DEVICE_IMPL(82S123_dip)
+ NETLIB_DEVICE_IMPL(82S123, "PROM_82S123", "+CEQ,+A0,+A1,+A2,+A3,+A4")
+ NETLIB_DEVICE_IMPL(82S123_dip, "PROM_82S123_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_82S123.h b/src/lib/netlist/devices/nld_82S123.h
index dbf6bf63180..2c18377934d 100644
--- a/src/lib/netlist/devices/nld_82S123.h
+++ b/src/lib/netlist/devices/nld_82S123.h
@@ -25,7 +25,7 @@
#ifndef NLD_82S123_H_
#define NLD_82S123_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define PROM_82S123(name, cCEQ, cA0, cA1, cA2, cA3, cA4) \
NET_REGISTER_DEV(PROM_82S123, name) \
diff --git a/src/lib/netlist/devices/nld_82S126.cpp b/src/lib/netlist/devices/nld_82S126.cpp
index dcacd1ec876..b1752908645 100644
--- a/src/lib/netlist/devices/nld_82S126.cpp
+++ b/src/lib/netlist/devices/nld_82S126.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_82S126.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -79,8 +79,8 @@ namespace netlist
m_O[i].push((o >> i) & 1, delay);
}
- NETLIB_DEVICE_IMPL(82S126)
- NETLIB_DEVICE_IMPL(82S126_dip)
+ NETLIB_DEVICE_IMPL(82S126, "PROM_82S126", "+CE1Q,+CE2Q,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7")
+ NETLIB_DEVICE_IMPL(82S126_dip, "PROM_82S126_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_82S126.h b/src/lib/netlist/devices/nld_82S126.h
index 3079bb8e2e0..ed7aa131819 100644
--- a/src/lib/netlist/devices/nld_82S126.h
+++ b/src/lib/netlist/devices/nld_82S126.h
@@ -24,7 +24,7 @@
#ifndef NLD_82S126_H_
#define NLD_82S126_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define PROM_82S126(name, cCE1Q, cCE2Q, cA0, cA1, cA2, cA3, cA4, cA5, cA6, cA7) \
NET_REGISTER_DEV(PROM_82S126, name) \
diff --git a/src/lib/netlist/devices/nld_82S16.cpp b/src/lib/netlist/devices/nld_82S16.cpp
index 7441f6c677e..e3176c7b30f 100644
--- a/src/lib/netlist/devices/nld_82S16.cpp
+++ b/src/lib/netlist/devices/nld_82S16.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_82S16.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -15,19 +15,55 @@ namespace netlist
NETLIB_OBJECT(82S16)
{
NETLIB_CONSTRUCTOR(82S16)
- , m_A(*this, {{"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7" }})
- , m_CE1Q(*this, "CE1Q")
- , m_CE2Q(*this, "CE2Q")
- , m_CE3Q(*this, "CE3Q")
+ , m_A(*this, {{"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7" }}, NETLIB_DELEGATE(82S16, addr))
+ , m_CE1Q(*this, "CE1Q", NETLIB_DELEGATE(82S16, enq))
+ , m_CE2Q(*this, "CE2Q", NETLIB_DELEGATE(82S16, enq))
+ , m_CE3Q(*this, "CE3Q", NETLIB_DELEGATE(82S16, enq))
, m_WEQ(*this, "WEQ")
, m_DIN(*this, "DIN")
, m_DOUTQ(*this, "DOUTQ")
, m_ram(*this, "m_ram", 0)
+ , m_addr(*this, "m_addr", 0)
+ , m_enq(*this, "m_enq", 0)
{
}
NETLIB_RESETI();
NETLIB_UPDATEI();
+ NETLIB_HANDLERI(addr)
+ {
+ uint8_t adr = 0;
+ for (std::size_t i=0; i<8; i++)
+ {
+ //m_A[i].activate();
+ adr |= (m_A[i]() << i);
+ }
+ m_addr = adr;
+ NETLIB_NAME(82S16)::update();
+ }
+ NETLIB_HANDLERI(enq)
+ {
+ const auto last = m_enq;
+ m_enq = m_CE1Q() || m_CE2Q() || m_CE3Q();
+ if (!last && m_enq)
+ {
+ // FIXME: Outputs are tristate. This needs to be properly implemented
+ m_DOUTQ.push(1, NLTIME_FROM_NS(20));
+ for (std::size_t i=0; i<8; i++)
+ m_A[i].inactivate();
+ m_WEQ.inactivate();
+ m_DIN.inactivate();
+ }
+ else if (last && !m_enq)
+ {
+ for (std::size_t i=0; i<8; i++)
+ m_A[i].activate();
+ m_WEQ.activate();
+ m_DIN.activate();
+ NETLIB_NAME(82S16)::update();
+ }
+ }
+
protected:
object_array_t<logic_input_t, 8> m_A;
@@ -38,7 +74,9 @@ namespace netlist
logic_input_t m_DIN;
logic_output_t m_DOUTQ;
- state_var<uint64_t[4]> m_ram; // 256 bits
+ state_array<uint64_t, 4> m_ram; // 256 bits
+ state_var_u8 m_addr; // 256 bits
+ state_var_sig m_enq;
};
NETLIB_OBJECT_DERIVED(82S16_dip, 82S16)
@@ -69,22 +107,9 @@ namespace netlist
// FIXME: optimize device (separate address decoder!)
NETLIB_UPDATE(82S16)
{
- if (m_CE1Q() || m_CE2Q() || m_CE3Q())
+ if (!m_enq)
{
- // FIXME: Outputs are tristate. This needs to be properly implemented
- m_DOUTQ.push(1, NLTIME_FROM_NS(20));
- //for (int i=0; i<8; i++)
- //m_A[i].inactivate();
- }
- else
- {
- unsigned int adr = 0;
- for (std::size_t i=0; i<8; i++)
- {
- //m_A[i].activate();
- adr |= (m_A[i]() << i);
- }
-
+ const auto adr(m_addr);
if (!m_WEQ())
{
m_ram[adr >> 6] = (m_ram[adr >> 6]
@@ -101,10 +126,12 @@ namespace netlist
{
m_ram[i] = 0;
}
+ m_addr = 0;
+ m_enq = 0;
}
- NETLIB_DEVICE_IMPL(82S16)
- NETLIB_DEVICE_IMPL(82S16_dip)
+ NETLIB_DEVICE_IMPL(82S16, "TTL_82S16", "")
+ NETLIB_DEVICE_IMPL(82S16_dip, "TTL_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 d1117246d87..47d6189a79b 100644
--- a/src/lib/netlist/devices/nld_82S16.h
+++ b/src/lib/netlist/devices/nld_82S16.h
@@ -24,7 +24,7 @@
#ifndef NLD_82S16_H_
#define NLD_82S16_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_82S16(name) \
NET_REGISTER_DEV(TTL_82S16, name)
diff --git a/src/lib/netlist/devices/nld_9310.cpp b/src/lib/netlist/devices/nld_9310.cpp
index ad752adb605..b416015df24 100644
--- a/src/lib/netlist/devices/nld_9310.cpp
+++ b/src/lib/netlist/devices/nld_9310.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_9310.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
#define MAXCNT 9
@@ -14,6 +14,7 @@ namespace netlist
{
namespace devices
{
+ //FIXME: Convert sub devices into NETDEV_DELEGATE logic
NETLIB_OBJECT(9310_subABCD)
{
NETLIB_CONSTRUCTOR(9310_subABCD)
@@ -139,8 +140,8 @@ namespace netlist
NETLIB_RESET(9310)
{
- sub.do_reset();
- subABCD.do_reset();
+ sub.reset();
+ subABCD.reset();
}
NETLIB_RESET(9310_subABCD)
@@ -157,32 +158,35 @@ namespace netlist
NETLIB_UPDATE(9310_sub)
{
+ auto cnt(m_cnt);
+
if (m_loadq)
{
- if (m_cnt < MAXCNT - 1)
+ if (cnt < MAXCNT - 1)
{
- ++m_cnt;
- update_outputs(m_cnt);
+ ++cnt;
+ update_outputs(cnt);
}
- else if (m_cnt == MAXCNT - 1)
+ else if (cnt == MAXCNT - 1)
{
- m_cnt = MAXCNT;
+ cnt = MAXCNT;
m_RC.push(m_ent, NLTIME_FROM_NS(20));
m_QA.push(1, NLTIME_FROM_NS(20));
}
else // MAXCNT
{
m_RC.push(0, NLTIME_FROM_NS(20));
- m_cnt = 0;
- update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
+ cnt = 0;
+ update_outputs_all(cnt, NLTIME_FROM_NS(20));
}
}
else
{
- m_cnt = m_ABCD->read_ABCD();
- m_RC.push(m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
- update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
+ cnt = m_ABCD->read_ABCD();
+ m_RC.push(m_ent & (cnt == MAXCNT), NLTIME_FROM_NS(27));
+ update_outputs_all(cnt, NLTIME_FROM_NS(22));
}
+ m_cnt = cnt;
}
NETLIB_UPDATE(9310)
@@ -223,10 +227,10 @@ namespace netlist
#if 0
// for (int i=0; i<4; i++)
// m_Q[i], (cnt >> i) & 1, delay[i]);
- m_QA, (cnt >> 0) & 1, out_delay);
- m_QB, (cnt >> 1) & 1, out_delay);
- m_QC, (cnt >> 2) & 1, out_delay);
- m_QD, (cnt >> 3) & 1, out_delay);
+ m_QA.push((cnt >> 0) & 1, out_delay);
+ m_QB.push((cnt >> 1) & 1, out_delay);
+ m_QC.push((cnt >> 2) & 1, out_delay);
+ m_QD.push((cnt >> 3) & 1, out_delay);
#else
if ((cnt & 1) == 1)
m_QA.push(1, out_delay);
@@ -262,8 +266,8 @@ namespace netlist
#endif
}
- NETLIB_DEVICE_IMPL(9310)
- NETLIB_DEVICE_IMPL(9310_dip)
+ NETLIB_DEVICE_IMPL(9310, "TTL_9310", "")
+ NETLIB_DEVICE_IMPL(9310_dip, "TTL_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 02cb45b2d86..65df9c04ce4 100644
--- a/src/lib/netlist/devices/nld_9310.h
+++ b/src/lib/netlist/devices/nld_9310.h
@@ -45,7 +45,7 @@
#ifndef NLD_9310_H_
#define NLD_9310_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_9310(name, cCLK, cENP, cENT, cCLRQ, cLOADQ, cA, cB, cC, cD) \
NET_REGISTER_DEV(TTL_9310, name) \
diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp
index 7c478fd4b05..2b17eabb3ec 100644
--- a/src/lib/netlist/devices/nld_9316.cpp
+++ b/src/lib/netlist/devices/nld_9316.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_9316.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -20,31 +20,72 @@ namespace netlist
NETLIB_CONSTRUCTOR(9316)
, m_CLK(*this, "CLK", NETLIB_DELEGATE(9316, clk))
, m_ENT(*this, "ENT")
+ , m_RC(*this, "RC")
, m_LOADQ(*this, "LOADQ")
- , m_cnt(*this, "m_cnt", 0)
, m_ENP(*this, "ENP")
, m_CLRQ(*this, "CLRQ")
- , m_A(*this, "A", NETLIB_DELEGATE(9316, noop))
- , m_B(*this, "B", NETLIB_DELEGATE(9316, noop))
- , m_C(*this, "C", NETLIB_DELEGATE(9316, noop))
- , m_D(*this, "D", NETLIB_DELEGATE(9316, noop))
+ , m_A(*this, "A", NETLIB_DELEGATE(9316, abcd))
+ , m_B(*this, "B", NETLIB_DELEGATE(9316, abcd))
+ , m_C(*this, "C", NETLIB_DELEGATE(9316, abcd))
+ , m_D(*this, "D", NETLIB_DELEGATE(9316, abcd))
, m_Q(*this, {{ "QA", "QB", "QC", "QD" }})
- , m_RC(*this, "RC")
+ , m_cnt(*this, "m_cnt", 0)
+ , m_abcd(*this, "m_abcd", 0)
+ , m_loadq(*this, "m_loadq", 0)
+ , m_ent(*this, "m_ent", 0)
{
}
private:
- NETLIB_RESETI();
- NETLIB_UPDATEI();
- NETLIB_HANDLERI(clk);
- NETLIB_HANDLERI(noop) { }
+ NETLIB_RESETI()
+ {
+ m_CLK.set_state(logic_t::STATE_INP_LH);
+ m_cnt = 0;
+ m_abcd = 0;
+ }
- logic_input_t m_CLK;
+ NETLIB_UPDATEI()
+ {
+ const auto CLRQ(m_CLRQ());
+ m_ent = m_ENT();
+ m_loadq = m_LOADQ();
+ if (((m_loadq ^ 1) || (m_ent && m_ENP())) && CLRQ)
+ {
+ m_CLK.activate_lh();
+ }
+ else
+ {
+ m_CLK.inactivate();
+ if (!CLRQ && (m_cnt>0))
+ {
+ m_cnt = 0;
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(36));
+ }
+ }
+ m_RC.push(m_ent && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+ }
+
+
+ NETLIB_HANDLERI(clk)
+ {
+ auto cnt = (m_loadq ? m_cnt + 1 : m_abcd) & MAXCNT;
+ m_RC.push(m_ent && (cnt == MAXCNT), NLTIME_FROM_NS(27));
+ update_outputs_all(cnt, NLTIME_FROM_NS(20));
+ m_cnt = cnt;
+ }
+
+ NETLIB_HANDLERI(abcd)
+ {
+ m_abcd = static_cast<uint8_t>((m_D() << 3) | (m_C() << 2) | (m_B() << 1) | (m_A() << 0));
+ }
+
+ logic_input_t m_CLK;
logic_input_t m_ENT;
- logic_input_t m_LOADQ;
- state_var<unsigned> m_cnt;
+ logic_output_t m_RC;
+
+ logic_input_t m_LOADQ;
logic_input_t m_ENP;
logic_input_t m_CLRQ;
@@ -55,12 +96,15 @@ namespace netlist
logic_input_t m_D;
object_array_t<logic_output_t, 4> m_Q;
- logic_output_t m_RC;
+ /* counter state */
+ state_var<unsigned> m_cnt;
+ /* cached pins */
+ state_var_u8 m_abcd;
+ state_var_sig m_loadq;
+ state_var_sig m_ent;
- private:
- //inline void update_outputs_all(const unsigned &cnt, const netlist_time &out_delay) noexcept
- inline void update_outputs_all(const unsigned &cnt, const netlist_time &out_delay) noexcept
+ void update_outputs_all(unsigned cnt, netlist_time out_delay) noexcept
{
m_Q[0].push((cnt >> 0) & 1, out_delay);
m_Q[1].push((cnt >> 1) & 1, out_delay);
@@ -93,63 +137,9 @@ namespace netlist
}
};
- NETLIB_RESET(9316)
- {
- m_CLK.set_state(logic_t::STATE_INP_LH);
- m_cnt = 0;
- }
-
- NETLIB_HANDLER(9316, clk)
- {
- if (m_LOADQ())
- {
- ++m_cnt &= MAXCNT;
- //m_RC.push(m_ENT() && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
- if (m_cnt == MAXCNT)
- {
- m_RC.push(m_ENT(), NLTIME_FROM_NS(27));
- update_outputs_all(MAXCNT, NLTIME_FROM_NS(20));
- }
- else if (m_cnt == 0)
- {
- m_RC.push(0, NLTIME_FROM_NS(27));
- update_outputs_all(0, NLTIME_FROM_NS(20));
- }
- else
- update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
- }
- else
- {
- m_cnt = (m_D() << 3) | (m_C() << 2) | (m_B() << 1) | (m_A() << 0);
- m_RC.push(m_ENT() && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
- update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
- }
- }
-
- NETLIB_UPDATE(9316)
- {
- const netlist_sig_t CLRQ(m_CLRQ());
- const netlist_sig_t ENT(m_ENT());
-
- if (((m_LOADQ() ^ 1) || (ENT && m_ENP())) && CLRQ)
- {
- m_CLK.activate_lh();
- }
- else
- {
- m_CLK.inactivate();
- if (!CLRQ && (m_cnt>0))
- {
- m_cnt = 0;
- update_outputs_all(m_cnt, NLTIME_FROM_NS(36));
- }
- }
- m_RC.push(ENT && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
- }
-
- NETLIB_DEVICE_IMPL(9316)
- NETLIB_DEVICE_IMPL(9316_dip)
+ NETLIB_DEVICE_IMPL(9316, "TTL_9316", "+CLK,+ENP,+ENT,+CLRQ,+LOADQ,+A,+B,+C,+D")
+ NETLIB_DEVICE_IMPL(9316_dip, "TTL_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 8deb21dfccd..8ab1789d7c7 100644
--- a/src/lib/netlist/devices/nld_9316.h
+++ b/src/lib/netlist/devices/nld_9316.h
@@ -51,7 +51,7 @@
#ifndef NLD_9316_H_
#define NLD_9316_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_9316(name, cCLK, cENP, cENT, cCLRQ, cLOADQ, cA, cB, cC, cD) \
NET_REGISTER_DEV(TTL_9316, name) \
diff --git a/src/lib/netlist/devices/nld_9322.cpp b/src/lib/netlist/devices/nld_9322.cpp
index 6c408498be7..abf9bf9f6ef 100644
--- a/src/lib/netlist/devices/nld_9322.cpp
+++ b/src/lib/netlist/devices/nld_9322.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_9322.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -105,14 +105,14 @@ namespace netlist
NETLIB_UPDATE(9322)
{
- m_1.update_dev();
- m_2.update_dev();
- m_3.update_dev();
- m_4.update_dev();
+ m_1.update();
+ m_2.update();
+ m_3.update();
+ m_4.update();
}
- NETLIB_DEVICE_IMPL(9322)
- NETLIB_DEVICE_IMPL(9322_dip)
+ NETLIB_DEVICE_IMPL(9322, "TTL_9322", "+SELECT,+A1,+B1,+A2,+B2,+A3,+B3,+A4,+B4,+STROBE")
+ NETLIB_DEVICE_IMPL(9322_dip, "TTL_9322_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_9322.h b/src/lib/netlist/devices/nld_9322.h
index 7de0f053b05..986c6b9e7f7 100644
--- a/src/lib/netlist/devices/nld_9322.h
+++ b/src/lib/netlist/devices/nld_9322.h
@@ -21,7 +21,7 @@
#ifndef NLD_9322_H_
#define NLD_9322_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_9322(name, cSELECT, cA1, cB1, cA2, cB2, cA3, cB3, cA4, cB4, cSTROBE) \
NET_REGISTER_DEV(TTL_9322, name) \
diff --git a/src/lib/netlist/devices/nld_am2847.cpp b/src/lib/netlist/devices/nld_am2847.cpp
index 5d0c5cb71a3..825696f0938 100644
--- a/src/lib/netlist/devices/nld_am2847.cpp
+++ b/src/lib/netlist/devices/nld_am2847.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_am2847.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -30,7 +30,7 @@ namespace netlist
logic_input_t m_RC;
logic_input_t m_IN;
- state_var<uint16_t[5]> m_buffer;
+ state_array<uint16_t, 5> m_buffer;
logic_output_t m_OUT;
};
@@ -116,7 +116,7 @@ namespace netlist
/* do nothing */
}
- inline NETLIB_FUNC_VOID(Am2847_shifter, shift, (void))
+ NETLIB_FUNC_VOID(Am2847_shifter, shift, ())
{
uint32_t out = m_buffer[0] & 1;
uint32_t in = (m_RC() ? out : m_IN());
@@ -130,8 +130,8 @@ namespace netlist
m_OUT.push(out, NLTIME_FROM_NS(200));
}
- NETLIB_DEVICE_IMPL(AM2847)
- NETLIB_DEVICE_IMPL(AM2847_dip)
+ NETLIB_DEVICE_IMPL(AM2847, "TTL_AM2847", "+CP,+INA,+INB,+INC,+IND,+RCA,+RCB,+RCC,+RCD")
+ NETLIB_DEVICE_IMPL(AM2847_dip, "TTL_AM2847_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_am2847.h b/src/lib/netlist/devices/nld_am2847.h
index 70d288d3eec..ff4a95b8e81 100644
--- a/src/lib/netlist/devices/nld_am2847.h
+++ b/src/lib/netlist/devices/nld_am2847.h
@@ -21,7 +21,7 @@
#ifndef NLD_AM2847_H_
#define NLD_AM2847_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_AM2847(name, cCP, cINA, cINB, cINC, cIND, cRCA, cRCB, cRCC, cRCD) \
NET_REGISTER_DEV(TTL_AM2847, name) \
diff --git a/src/lib/netlist/devices/nld_dm9314.cpp b/src/lib/netlist/devices/nld_dm9314.cpp
index fd3b8666078..93b958de539 100644
--- a/src/lib/netlist/devices/nld_dm9314.cpp
+++ b/src/lib/netlist/devices/nld_dm9314.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_dm9314.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -107,8 +107,8 @@ namespace netlist
}
}
- NETLIB_DEVICE_IMPL(9314)
- NETLIB_DEVICE_IMPL(9314_dip)
+ NETLIB_DEVICE_IMPL(9314, "TTL_9314", "+EQ,+MRQ,+S0Q,+S1Q,+S2Q,+S3Q,+D0,+D1,+D2,+D3")
+ NETLIB_DEVICE_IMPL(9314_dip, "TTL_9314_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_dm9314.h b/src/lib/netlist/devices/nld_dm9314.h
index 6188bbef42f..59c60591ce7 100644
--- a/src/lib/netlist/devices/nld_dm9314.h
+++ b/src/lib/netlist/devices/nld_dm9314.h
@@ -21,7 +21,7 @@
#ifndef NLD_DM9314_H_
#define NLD_DM9314_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_9314(name, cEQ, cMRQ, cS0Q, cS1Q, cS2Q, cS3Q, cD0, cD1, cD2, cD3) \
NET_REGISTER_DEV(TTL_9314, name) \
diff --git a/src/lib/netlist/devices/nld_dm9334.cpp b/src/lib/netlist/devices/nld_dm9334.cpp
index 8dceded5390..c08ce53efed 100644
--- a/src/lib/netlist/devices/nld_dm9334.cpp
+++ b/src/lib/netlist/devices/nld_dm9334.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_dm9334.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -143,8 +143,8 @@ namespace netlist
m_Q[i].push((q >> i) & 1, delay);
}
- NETLIB_DEVICE_IMPL(9334)
- NETLIB_DEVICE_IMPL(9334_dip)
+ NETLIB_DEVICE_IMPL(9334, "TTL_9334", "+CQ,+EQ,+D,+A0,+A1,+A2")
+ NETLIB_DEVICE_IMPL(9334_dip, "TTL_9334_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_dm9334.h b/src/lib/netlist/devices/nld_dm9334.h
index 1a07e051333..e54208e3ba4 100644
--- a/src/lib/netlist/devices/nld_dm9334.h
+++ b/src/lib/netlist/devices/nld_dm9334.h
@@ -65,7 +65,7 @@
#ifndef NLD_DM9334_H_
#define NLD_DM9334_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_9334(name, cCQ, cEQ, cD, cA0, cA1, cA2) \
NET_REGISTER_DEV(TTL_9334, name) \
diff --git a/src/lib/netlist/devices/nld_legacy.cpp b/src/lib/netlist/devices/nld_legacy.cpp
index 28fe0ad8188..738230646e0 100644
--- a/src/lib/netlist/devices/nld_legacy.cpp
+++ b/src/lib/netlist/devices/nld_legacy.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_legacy.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -25,7 +25,7 @@ namespace netlist
NETLIB_RESETI();
NETLIB_UPDATEI();
- protected:
+ private:
logic_input_t m_S;
logic_input_t m_R;
@@ -49,7 +49,7 @@ namespace netlist
NETLIB_RESETI();
NETLIB_UPDATEI();
- protected:
+ private:
logic_input_t m_I;
logic_output_t m_Q;
@@ -100,8 +100,8 @@ namespace netlist
m_last = nval;
}
- NETLIB_DEVICE_IMPL(nicRSFF)
- NETLIB_DEVICE_IMPL(nicDelay)
+ NETLIB_DEVICE_IMPL(nicRSFF, "NETDEV_RSFF", "")
+ NETLIB_DEVICE_IMPL(nicDelay, "NETDEV_DELAY", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_legacy.h b/src/lib/netlist/devices/nld_legacy.h
index 33f7d0caaf8..aa3aec6f147 100644
--- a/src/lib/netlist/devices/nld_legacy.h
+++ b/src/lib/netlist/devices/nld_legacy.h
@@ -13,7 +13,7 @@
#ifndef NLD_LEGACY_H_
#define NLD_LEGACY_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
// ----------------------------------------------------------------------------------------
// Macros
diff --git a/src/lib/netlist/devices/nld_log.cpp b/src/lib/netlist/devices/nld_log.cpp
index 29218aaa09a..6b1b3d8efc1 100644
--- a/src/lib/netlist/devices/nld_log.cpp
+++ b/src/lib/netlist/devices/nld_log.cpp
@@ -5,10 +5,10 @@
*
*/
-#include "../nl_base.h"
-#include "../plib/pstream.h"
-#include "../plib/pfmtlog.h"
+#include "netlist/nl_base.h"
#include "nld_log.h"
+#include "plib/pfmtlog.h"
+#include "plib/pstream.h"
//#include "sound/wavwrite.h"
namespace netlist
@@ -19,15 +19,15 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(log)
, m_I(*this, "I")
- , m_strm(plib::pfmt("{1}.log")(this->name()))
- , m_writer(m_strm)
+ , m_strm(pstring(plib::pfmt("{1}.log")(this->name())))
+ , m_writer(&m_strm)
{
}
NETLIB_UPDATEI()
{
/* use pstring::sprintf, it is a LOT faster */
- m_writer.writeline(plib::pfmt("{1:.9} {2}").e(netlist().time().as_double()).e(static_cast<double>(m_I())));
+ m_writer.writeline(plib::pfmt("{1:.9} {2}").e(exec().time().as_double()).e(static_cast<double>(m_I())));
}
NETLIB_RESETI() { }
@@ -46,7 +46,7 @@ namespace netlist
NETLIB_UPDATEI()
{
- m_writer.writeline(plib::pfmt("{1:.9} {2}").e(netlist().time().as_double()).e(static_cast<double>(m_I() - m_I2())));
+ m_writer.writeline(plib::pfmt("{1:.9} {2}").e(exec().time().as_double()).e(static_cast<double>(m_I() - m_I2())));
}
NETLIB_RESETI() { }
@@ -89,8 +89,8 @@ namespace netlist
#endif
- NETLIB_DEVICE_IMPL(log)
- NETLIB_DEVICE_IMPL(logD)
+ NETLIB_DEVICE_IMPL(log, "LOG", "+I")
+ NETLIB_DEVICE_IMPL(logD, "LOGD", "+I,+I2")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_log.h b/src/lib/netlist/devices/nld_log.h
index 6364022cea2..13c71ea7257 100644
--- a/src/lib/netlist/devices/nld_log.h
+++ b/src/lib/netlist/devices/nld_log.h
@@ -18,10 +18,10 @@
#ifndef NLD_LOG_H_
#define NLD_LOG_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define LOG(name, cI) \
- NET_REGISTER_DEV(??PG, name) \
+ NET_REGISTER_DEV(LOG, name) \
NET_CONNECT(name, I, cI)
#define LOGD(name, cI, cI2) \
diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp
index e97ae41e437..f6c2566bd43 100644
--- a/src/lib/netlist/devices/nld_mm5837.cpp
+++ b/src/lib/netlist/devices/nld_mm5837.cpp
@@ -6,8 +6,8 @@
*/
#include "nld_mm5837.h"
-#include "../solver/nld_matrix_solver.h"
-#include "../analog/nlid_twoterm.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/solver/nld_matrix_solver.h"
#define R_LOW (1000.0)
#define R_HIGH (1000.0)
@@ -69,13 +69,13 @@ namespace netlist
{
//m_V0.initial(0.0);
//m_RV.do_reset();
- m_RV.set(NL_FCONST(1.0) / R_LOW, 0.0, 0.0);
+ m_RV.set_G_V_I(plib::constants<nl_double>::one() / R_LOW, 0.0, 0.0);
m_inc = netlist_time::from_double(1.0 / m_FREQ());
if (m_FREQ() < 24000 || m_FREQ() > 56000)
log().warning(MW_1_FREQUENCY_OUTSIDE_OF_SPECS_1, m_FREQ());
m_shift = 0x1ffff;
- m_is_timestep = m_RV.m_P.net().solver()->is_timestep();
+ m_is_timestep = m_RV.m_P.net().solver()->has_timestep_devices();
}
NETLIB_UPDATE_PARAM(MM5837_dip)
@@ -107,14 +107,14 @@ namespace netlist
// 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_solve_after(NLTIME_FROM_NS(1));
+ m_RV.update();
+ m_RV.set_G_V_I(plib::constants<nl_double>::one() / R, V, plib::constants<nl_double>::zero());
+ m_RV.solve_later(NLTIME_FROM_NS(1));
}
}
- NETLIB_DEVICE_IMPL(MM5837_dip)
+ NETLIB_DEVICE_IMPL(MM5837_dip, "MM5837_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_mm5837.h b/src/lib/netlist/devices/nld_mm5837.h
index 4af397d9965..8f764aa651f 100644
--- a/src/lib/netlist/devices/nld_mm5837.h
+++ b/src/lib/netlist/devices/nld_mm5837.h
@@ -19,7 +19,7 @@
#ifndef NLD_MM5837_H_
#define NLD_MM5837_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define MM5837_DIP(name) \
NET_REGISTER_DEV(MM5837_DIP, name)
diff --git a/src/lib/netlist/devices/nld_ne555.cpp b/src/lib/netlist/devices/nld_ne555.cpp
index 8795197bd57..5e990d2e974 100644
--- a/src/lib/netlist/devices/nld_ne555.cpp
+++ b/src/lib/netlist/devices/nld_ne555.cpp
@@ -46,8 +46,8 @@
*/
#include "nld_ne555.h"
-#include "../analog/nlid_twoterm.h"
-#include "../solver/nld_solver.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/solver/nld_solver.h"
#define R_OFF (1E20)
#define R_ON (25) // Datasheet states a maximum discharge of 200mA, R = 5V / 0.2
@@ -62,31 +62,37 @@ namespace netlist
, m_R1(*this, "R1")
, m_R2(*this, "R2")
, m_R3(*this, "R3")
+ , m_ROUT(*this, "ROUT")
, m_RDIS(*this, "RDIS")
, m_RESET(*this, "RESET") // Pin 4
, m_THRES(*this, "THRESH") // Pin 6
, m_TRIG(*this, "TRIG") // Pin 2
- , m_OUT(*this, "OUT") // Pin 3
+ , m_OUT(*this, "_OUT") // to Pin 3 via ROUT
, m_last_out(*this, "m_last_out", false)
, m_ff(*this, "m_ff", false)
+ , m_last_reset(*this, "m_last_reset", false)
{
register_subalias("GND", m_R3.m_N); // Pin 1
register_subalias("CONT", m_R1.m_N); // Pin 5
register_subalias("DISCH", m_RDIS.m_P); // Pin 7
register_subalias("VCC", m_R1.m_P); // Pin 8
+ register_subalias("OUT", m_ROUT.m_P); // Pin 3
connect(m_R1.m_N, m_R2.m_P);
+ connect(m_R1.m_N, m_R2.m_P);
connect(m_R2.m_N, m_R3.m_P);
connect(m_RDIS.m_N, m_R3.m_N);
+ connect(m_OUT, m_ROUT.m_N);
}
NETLIB_UPDATEI();
NETLIB_RESETI();
- protected:
+ private:
analog::NETLIB_SUB(R_base) m_R1;
analog::NETLIB_SUB(R_base) m_R2;
analog::NETLIB_SUB(R_base) m_R3;
+ analog::NETLIB_SUB(R_base) m_ROUT;
analog::NETLIB_SUB(R_base) m_RDIS;
logic_input_t m_RESET;
@@ -94,52 +100,51 @@ namespace netlist
analog_input_t m_TRIG;
analog_output_t m_OUT;
- private:
state_var<bool> m_last_out;
state_var<bool> m_ff;
+ state_var<bool> m_last_reset;
- inline nl_double clamp(const nl_double v, const nl_double a, const nl_double b);
-
+ nl_double clamp(const nl_double v, const nl_double a, const nl_double b)
+ {
+ nl_double ret = v;
+ nl_double vcc = m_R1.m_P();
+
+ if (ret > vcc - a)
+ ret = vcc - a;
+ if (ret < b)
+ ret = b;
+ return ret;
+ }
};
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
+ register_subalias("1", "GND"); // Pin 1
+ register_subalias("2", "TRIG"); // Pin 2
+ register_subalias("3", "OUT"); // Pin 3
+ register_subalias("4", "RESET"); // Pin 4
+ register_subalias("5", "CONT"); // Pin 5
+ register_subalias("6", "THRESH"); // Pin 6
+ register_subalias("7", "DISCH"); // Pin 7
+ register_subalias("8", "VCC"); // Pin 8
}
};
- inline nl_double NETLIB_NAME(NE555)::clamp(const nl_double v, const nl_double a, const nl_double b)
- {
- nl_double ret = v;
- nl_double vcc = m_R1.m_P();
-
- if (ret > vcc - a)
- ret = vcc - a;
- if (ret < b)
- ret = b;
- return ret;
- }
-
NETLIB_RESET(NE555)
{
- m_R1.do_reset();
- m_R2.do_reset();
- m_R3.do_reset();
- m_RDIS.do_reset();
+ m_R1.reset();
+ m_R2.reset();
+ m_R3.reset();
+ m_ROUT.reset();
+ m_RDIS.reset();
- /* FIXME make resistance a parameter, properly model other variants */
+ /* FIXME make resistances a parameter, properly model other variants */
m_R1.set_R(5000);
m_R2.set_R(5000);
m_R3.set_R(5000);
+ m_ROUT.set_R(20);
m_RDIS.set_R(R_OFF);
m_last_out = true;
@@ -149,39 +154,47 @@ namespace netlist
{
// FIXME: assumes GND is connected to 0V.
- nl_double vt = clamp(m_R2.m_P(), 0.7, 1.4);
- bool bthresh = (m_THRES() > vt);
- bool btrig = (m_TRIG() > clamp(m_R2.m_N(), 0.7, 1.4));
+ const auto reset = m_RESET();
- if (!btrig)
+ if (!reset && m_last_reset)
{
- m_ff = true;
+ m_ff = false;
}
- else if (bthresh)
+ else
{
- m_ff = false;
+ const nl_double vt = clamp(m_R2.m_P(), 0.7, 1.4);
+ const bool bthresh = (m_THRES() > vt);
+ const bool btrig = (m_TRIG() > clamp(m_R2.m_N(), 0.7, 1.4));
+
+ if (!btrig)
+ m_ff = true;
+ else if (bthresh)
+ m_ff = false;
}
- bool out = (!m_RESET() ? false : m_ff);
+ const bool out = (!reset ? false : m_ff);
if (m_last_out && !out)
{
- m_RDIS.update_dev();
+ m_RDIS.update();
m_OUT.push(m_R3.m_N());
m_RDIS.set_R(R_ON);
}
else if (!m_last_out && out)
{
- m_RDIS.update_dev();
+ m_RDIS.update();
// FIXME: Should be delayed by 100ns
m_OUT.push(m_R1.m_P());
m_RDIS.set_R(R_OFF);
}
+ m_last_reset = reset;
m_last_out = out;
}
- NETLIB_DEVICE_IMPL(NE555)
- NETLIB_DEVICE_IMPL(NE555_dip)
+ NETLIB_DEVICE_IMPL(NE555, "NE555", "")
+ NETLIB_DEVICE_IMPL(NE555_dip, "NE555_DIP", "")
+ NETLIB_DEVICE_IMPL_ALIAS(MC1455P, NE555, "MC1455P", "")
+ NETLIB_DEVICE_IMPL_ALIAS(MC1455P_dip, NE555_dip, "MC1455P_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_ne555.h b/src/lib/netlist/devices/nld_ne555.h
index c629253f08f..fc575d914b7 100644
--- a/src/lib/netlist/devices/nld_ne555.h
+++ b/src/lib/netlist/devices/nld_ne555.h
@@ -4,7 +4,7 @@
#ifndef NLD_NE555_H_
#define NLD_NE555_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define NE555(name) \
NET_REGISTER_DEV(NE555, name)
@@ -12,4 +12,10 @@
#define NE555_DIP(name) \
NET_REGISTER_DEV(NE555_DIP, name)
+#define MC1455P(name) \
+ NET_REGISTER_DEV(MC1455P, name)
+
+#define MC1455P_DIP(name) \
+ NET_REGISTER_DEV(MC1455P_DIP, name)
+
#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 4c29389d491..284b6673f76 100644
--- a/src/lib/netlist/devices/nld_r2r_dac.cpp
+++ b/src/lib/netlist/devices/nld_r2r_dac.cpp
@@ -5,9 +5,9 @@
*
*/
-#include "../nl_base.h"
-#include "../nl_factory.h"
-#include "../analog/nlid_twoterm.h"
+#include "netlist/nl_base.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/nl_factory.h"
namespace netlist
{
@@ -39,17 +39,17 @@ namespace netlist
NETLIB_UPDATE_PARAM(r2r_dac)
{
- update_dev();
+ solve_now();
double V = m_VIN() / static_cast<double>(1 << m_num())
* static_cast<double>(m_val());
- this->set(1.0 / m_R(), V, 0.0);
+ this->set_G_V_I(1.0 / m_R(), V, 0.0);
}
} //namespace analog
namespace devices {
- NETLIB_DEVICE_IMPL_NS(analog, r2r_dac)
- }
+ NETLIB_DEVICE_IMPL_NS(analog, r2r_dac, "R2R_DAC", "VIN,R,N")
+ } // 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 18e5bddc053..8a4257a3cbf 100644
--- a/src/lib/netlist/devices/nld_r2r_dac.h
+++ b/src/lib/netlist/devices/nld_r2r_dac.h
@@ -46,7 +46,7 @@
#ifndef NLD_R2R_DAC_H_
#define NLD_R2R_DAC_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define R2R_DAC(name, p_VIN, p_R, p_N) \
NET_REGISTER_DEV(R2R_DAC, name) \
diff --git a/src/lib/netlist/devices/nld_schmitt.cpp b/src/lib/netlist/devices/nld_schmitt.cpp
index 4bc41075f89..f219d215520 100644
--- a/src/lib/netlist/devices/nld_schmitt.cpp
+++ b/src/lib/netlist/devices/nld_schmitt.cpp
@@ -7,10 +7,10 @@
#include "nld_schmitt.h"
-#include "../nl_base.h"
-#include "../nl_errstr.h"
-#include "../analog/nlid_twoterm.h"
-#include "../solver/nld_solver.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/nl_base.h"
+#include "netlist/nl_errstr.h"
+#include "netlist/solver/nld_solver.h"
#include <cmath>
@@ -82,11 +82,11 @@ namespace netlist
NETLIB_RESETI()
{
m_last_state = 1;
- m_RVI.do_reset();
- m_RVO.do_reset();
+ m_RVI.reset();
+ m_RVO.reset();
m_is_timestep = m_RVO.m_P.net().solver()->has_timestep_devices();
- m_RVI.set(NL_FCONST(1.0) / m_model.m_RI, m_model.m_VI, 0.0);
- m_RVO.set(NL_FCONST(1.0) / m_model.m_ROL, m_model.m_VOL, 0.0);
+ m_RVI.set_G_V_I(plib::constants<nl_double>::one() / m_model.m_RI, m_model.m_VI, 0.0);
+ m_RVO.set_G_V_I(plib::constants<nl_double>::one() / m_model.m_ROL, m_model.m_VOL, 0.0);
}
NETLIB_UPDATEI()
@@ -97,9 +97,9 @@ namespace netlist
{
m_last_state = 0;
if (m_is_timestep)
- m_RVO.update_dev();
- m_RVO.set(NL_FCONST(1.0) / m_model.m_ROH, m_model.m_VOH, 0.0);
- m_RVO.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
+ m_RVO.update();
+ m_RVO.set_G_V_I(plib::constants<nl_double>::one() / m_model.m_ROH, m_model.m_VOH, 0.0);
+ m_RVO.solve_later();
}
}
else
@@ -108,9 +108,9 @@ namespace netlist
{
m_last_state = 1;
if (m_is_timestep)
- m_RVO.update_dev();
- m_RVO.set(NL_FCONST(1.0) / m_model.m_ROL, m_model.m_VOL, 0.0);
- m_RVO.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
+ m_RVO.update();
+ m_RVO.set_G_V_I(plib::constants<nl_double>::one() / m_model.m_ROL, m_model.m_VOL, 0.0);
+ m_RVO.solve_later();
}
}
}
@@ -125,7 +125,7 @@ namespace netlist
bool m_is_timestep;
};
- NETLIB_DEVICE_IMPL(schmitt_trigger)
+ NETLIB_DEVICE_IMPL(schmitt_trigger, "SCHMITT_TRIGGER", "MODEL")
} // namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_schmitt.h b/src/lib/netlist/devices/nld_schmitt.h
index ecce59be616..20666b29cf7 100644
--- a/src/lib/netlist/devices/nld_schmitt.h
+++ b/src/lib/netlist/devices/nld_schmitt.h
@@ -11,7 +11,7 @@
#define NLD_SCHMITT_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
// ----------------------------------------------------------------------------------------
// Macros
diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp
index eabc4b4fbff..03aa5c678f1 100644
--- a/src/lib/netlist/devices/nld_system.cpp
+++ b/src/lib/netlist/devices/nld_system.cpp
@@ -5,8 +5,8 @@
*
*/
-#include "../solver/nld_solver.h"
-#include "../solver/nld_matrix_solver.h"
+#include "netlist/solver/nld_solver.h"
+#include "netlist/solver/nld_matrix_solver.h"
#include "nlid_system.h"
namespace netlist
@@ -40,54 +40,40 @@ namespace netlist
{
m_cnt = 0;
m_off = netlist_time::from_double(m_offset());
+ m_feedback.m_delegate = NETLIB_DELEGATE(extclock, update);
+
+ //m_feedback.m_delegate .set(&NETLIB_NAME(extclock)::update, this);
//m_Q.initial(0);
}
- NETLIB_UPDATE(extclock)
+ NETLIB_HANDLER(extclock, clk2)
{
- m_Q.push((m_cnt & 1) ^ 1, m_inc[m_cnt] + m_off);
- m_off = netlist_time::zero();
+ m_Q.push((m_cnt & 1) ^ 1, m_inc[m_cnt]);
if (++m_cnt >= m_size)
m_cnt = 0;
}
- // ----------------------------------------------------------------------------------------
- // logic_input
- // ----------------------------------------------------------------------------------------
-
- NETLIB_RESET(logic_input)
- {
- m_Q.initial(0);
- }
-
- NETLIB_UPDATE(logic_input)
+ NETLIB_HANDLER(extclock, clk2_pow2)
{
- m_Q.push(m_IN() & 1, netlist_time::from_nsec(1));
+ m_Q.push((m_cnt & 1) ^ 1, m_inc[m_cnt]);
+ m_cnt = (++m_cnt) & (m_size-1);
}
- NETLIB_UPDATE_PARAM(logic_input)
- {
- }
-
- // ----------------------------------------------------------------------------------------
- // analog_input
- // ----------------------------------------------------------------------------------------
-
- NETLIB_RESET(analog_input)
+ NETLIB_UPDATE(extclock)
{
- m_Q.initial(0.0);
- }
+ m_Q.push((m_cnt & 1) ^ 1, m_inc[m_cnt] + m_off);
+ m_off = netlist_time::zero();
+ if (++m_cnt >= m_size)
+ m_cnt = 0;
- NETLIB_UPDATE(analog_input)
- {
- m_Q.push(m_IN());
- }
+ // continue with optimized clock handlers ....
- NETLIB_UPDATE_PARAM(analog_input)
- {
+ if ((m_size & (m_size-1)) == 0) // power of 2?
+ m_feedback.m_delegate.set(&NETLIB_NAME(extclock)::clk2_pow2, this);
+ else
+ m_feedback.m_delegate.set(&NETLIB_NAME(extclock)::clk2, this);
}
-
// -----------------------------------------------------------------------------
// nld_res_sw
// -----------------------------------------------------------------------------
@@ -106,19 +92,10 @@ namespace netlist
m_last_state = state;
const nl_double R = state ? m_RON() : m_ROFF();
- // 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_solve_after(NLTIME_FROM_NS(1));
- }
- else
- {
- m_R.set_R(R);
- m_R.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
- //m_R->update_dev();
- }
+ // FIXME: We only need to update the net first if this is a time stepping net
+ m_R.update();
+ m_R.set_R(R);
+ m_R.solve_later();
}
}
@@ -141,17 +118,19 @@ namespace netlist
}
- 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)
+ NETLIB_DEVICE_IMPL(dummy_input, "DUMMY_INPUT", "")
+ NETLIB_DEVICE_IMPL(frontier, "FRONTIER_DEV", "+I,+G,+Q")
+ NETLIB_DEVICE_IMPL(function, "AFUNC", "N,FUNC")
+ NETLIB_DEVICE_IMPL(analog_input, "ANALOG_INPUT", "IN")
+ NETLIB_DEVICE_IMPL(clock, "CLOCK", "FREQ")
+ NETLIB_DEVICE_IMPL(extclock, "EXTCLOCK", "FREQ,PATTERN")
+ NETLIB_DEVICE_IMPL(res_sw, "RES_SWITCH", "+IN,+P1,+P2")
+ NETLIB_DEVICE_IMPL(mainclock, "MAINCLOCK", "FREQ")
+ NETLIB_DEVICE_IMPL(gnd, "GND", "")
+ NETLIB_DEVICE_IMPL(netlistparams, "PARAMETER", "")
+
+ NETLIB_DEVICE_IMPL(logic_input, "LOGIC_INPUT", "IN,FAMILY")
+ NETLIB_DEVICE_IMPL_ALIAS(logic_input_ttl, logic_input, "TTL_INPUT", "IN")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_system.h b/src/lib/netlist/devices/nld_system.h
index 69a7c75dbf3..5158e098cfa 100644
--- a/src/lib/netlist/devices/nld_system.h
+++ b/src/lib/netlist/devices/nld_system.h
@@ -9,7 +9,7 @@
#ifndef NLD_SYSTEM_H_
#define NLD_SYSTEM_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
// -----------------------------------------------------------------------------
// Macros
diff --git a/src/lib/netlist/devices/nld_tms4800.cpp b/src/lib/netlist/devices/nld_tms4800.cpp
index 29a9bd836ab..24729b10e72 100644
--- a/src/lib/netlist/devices/nld_tms4800.cpp
+++ b/src/lib/netlist/devices/nld_tms4800.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_tms4800.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -39,9 +39,9 @@ namespace netlist
param_rom_t<uint8_t, 11, 8> m_ROM; // 16 Kbits, used as 2 Kbit x 8
};
- NETLIB_OBJECT_DERIVED(tms4800_dip, TMS4800)
+ NETLIB_OBJECT_DERIVED(TMS4800_dip, TMS4800)
{
- NETLIB_CONSTRUCTOR_DERIVED(tms4800_dip, TMS4800)
+ NETLIB_CONSTRUCTOR_DERIVED(TMS4800_dip, TMS4800)
{
register_subalias("2", m_A[0]);
register_subalias("3", m_A[1]);
@@ -97,8 +97,8 @@ namespace netlist
}
}
- NETLIB_DEVICE_IMPL(TMS4800)
- NETLIB_DEVICE_IMPL(tms4800_dip)
+ NETLIB_DEVICE_IMPL(TMS4800, "ROM_TMS4800", "+AR,+OE1,+OE2,+A0,+A1,+A2,+A3,+A4,+A5,+A6,+A7,+A8,+A9,+A10")
+ NETLIB_DEVICE_IMPL(TMS4800_dip, "ROM_TMS4800_DIP", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_tms4800.h b/src/lib/netlist/devices/nld_tms4800.h
index dc72354cb03..c5bcd1337f0 100644
--- a/src/lib/netlist/devices/nld_tms4800.h
+++ b/src/lib/netlist/devices/nld_tms4800.h
@@ -28,7 +28,7 @@
#ifndef NLD_TMS4800_H_
#define NLD_TMS4800_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define ROM_TMS4800(name, cAR, cOE1, cOE2, cA0, cA1, cA2, cA3, cA4, cA5, cA6, cA7, cA8, cA9, cA10) \
NET_REGISTER_DEV(ROM_TMS4800, name) \
diff --git a/src/lib/netlist/devices/nld_tristate.cpp b/src/lib/netlist/devices/nld_tristate.cpp
index 74fbb206feb..b05d09ea71e 100644
--- a/src/lib/netlist/devices/nld_tristate.cpp
+++ b/src/lib/netlist/devices/nld_tristate.cpp
@@ -6,7 +6,7 @@
*/
#include "nld_tristate.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
namespace netlist
{
@@ -70,8 +70,8 @@ namespace netlist
m_Q.push(q, NLTIME_FROM_NS(1));
}
- NETLIB_DEVICE_IMPL(tristate)
- NETLIB_DEVICE_IMPL(tristate3)
+ NETLIB_DEVICE_IMPL(tristate, "TTL_TRISTATE", "+CEQ1,+D1,+CEQ2,+D2")
+ NETLIB_DEVICE_IMPL(tristate3, "TTL_TRISTATE3", "")
} //namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/devices/nld_tristate.h b/src/lib/netlist/devices/nld_tristate.h
index a5ff22fac96..71f97d9812d 100644
--- a/src/lib/netlist/devices/nld_tristate.h
+++ b/src/lib/netlist/devices/nld_tristate.h
@@ -10,7 +10,7 @@
#ifndef NLD_TRISTATE_H_
#define NLD_TRISTATE_H_
-#include "../nl_setup.h"
+#include "netlist/nl_setup.h"
#define TTL_TRISTATE(name, cCEQ1, cD1, cCEQ2, cD2) \
NET_REGISTER_DEV(TTL_TRISTATE, name) \
diff --git a/src/lib/netlist/devices/nlid_cmos.h b/src/lib/netlist/devices/nlid_cmos.h
index f9999aebcc0..d91d691453a 100644
--- a/src/lib/netlist/devices/nlid_cmos.h
+++ b/src/lib/netlist/devices/nlid_cmos.h
@@ -8,8 +8,8 @@
#ifndef NLID_CMOS_H_
#define NLID_CMOS_H_
-#include "../nl_setup.h"
-#include "../nl_base.h"
+#include "netlist/nl_base.h"
+#include "netlist/nl_setup.h"
namespace netlist
{
diff --git a/src/lib/netlist/devices/nlid_proxy.cpp b/src/lib/netlist/devices/nlid_proxy.cpp
index 4c3ec6f67aa..a2fd18e85a7 100644
--- a/src/lib/netlist/devices/nlid_proxy.cpp
+++ b/src/lib/netlist/devices/nlid_proxy.cpp
@@ -6,7 +6,7 @@
*/
#include "nlid_proxy.h"
-#include "../solver/nld_solver.h"
+#include "netlist/solver/nld_solver.h"
//#include "plib/pstream.h"
//#include "plib/pfmtlog.h"
//#include "nld_log.h"
@@ -20,7 +20,7 @@ namespace netlist
// nld_base_proxy
// -----------------------------------------------------------------------------
- nld_base_proxy::nld_base_proxy(netlist_t &anetlist, const pstring &name,
+ nld_base_proxy::nld_base_proxy(netlist_state_t &anetlist, const pstring &name,
logic_t *inout_proxied, detail::core_terminal_t *proxy_inout)
: device_t(anetlist, name)
{
@@ -29,33 +29,23 @@ namespace netlist
m_proxy_term = proxy_inout;
}
- nld_base_proxy::~nld_base_proxy()
- {
- }
-
// ----------------------------------------------------------------------------------------
// nld_a_to_d_proxy
// ----------------------------------------------------------------------------------------
- nld_base_a_to_d_proxy::nld_base_a_to_d_proxy(netlist_t &anetlist, const pstring &name,
+ nld_base_a_to_d_proxy::nld_base_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name,
logic_input_t *in_proxied, detail::core_terminal_t *in_proxy)
: nld_base_proxy(anetlist, name, in_proxied, in_proxy)
, m_Q(*this, "Q")
{
}
- nld_base_a_to_d_proxy::~nld_base_a_to_d_proxy() {}
-
- nld_a_to_d_proxy::nld_a_to_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *in_proxied)
+ nld_a_to_d_proxy::nld_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *in_proxied)
: nld_base_a_to_d_proxy(anetlist, name, in_proxied, &m_I)
, m_I(*this, "I")
{
}
- nld_a_to_d_proxy::~nld_a_to_d_proxy()
- {
- }
-
NETLIB_RESET(a_to_d_proxy)
{
}
@@ -81,39 +71,32 @@ namespace netlist
// nld_d_to_a_proxy
// ----------------------------------------------------------------------------------------
- nld_base_d_to_a_proxy::nld_base_d_to_a_proxy(netlist_t &anetlist, const pstring &name,
+ nld_base_d_to_a_proxy::nld_base_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name,
logic_output_t *out_proxied, detail::core_terminal_t &proxy_out)
: nld_base_proxy(anetlist, name, out_proxied, &proxy_out)
, m_I(*this, "I")
{
}
- nld_base_d_to_a_proxy::~nld_base_d_to_a_proxy()
- {
- }
-
- nld_d_to_a_proxy::nld_d_to_a_proxy(netlist_t &anetlist, const pstring &name, logic_output_t *out_proxied)
+ nld_d_to_a_proxy::nld_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *out_proxied)
: nld_base_d_to_a_proxy(anetlist, name, out_proxied, m_RV.m_P)
, m_GNDHack(*this, "_Q")
, m_RV(*this, "RV")
, m_last_state(*this, "m_last_var", -1)
, m_is_timestep(false)
{
- const pstring power_syms[3][2] ={ {"VCC", "VEE"}, {"VCC", "GND"}, {"VDD", "VSS"}};
- //register_sub(m_RV);
- //register_term("1", m_RV.m_P);
- //register_term("2", m_RV.m_N);
+ const std::vector<std::pair<pstring, pstring>> power_syms = { {"VCC", "VEE"}, {"VCC", "GND"}, {"VDD", "VSS"}};
register_subalias("Q", m_RV.m_P);
connect(m_RV.m_N, m_GNDHack);
bool f = false;
- for (int i = 0; i < 3; i++)
+ for (auto & pwr_sym : power_syms)
{
pstring devname = out_proxied->device().name();
- auto tp = netlist().setup().find_terminal(devname + "." + power_syms[i][0],
+ auto tp = setup().find_terminal(devname + "." + pwr_sym.first,
detail::terminal_type::INPUT, false);
- auto tn = netlist().setup().find_terminal(devname + "." + power_syms[i][1],
+ auto tn = setup().find_terminal(devname + "." + pwr_sym.second,
detail::terminal_type::INPUT, false);
if (tp != nullptr && tn != nullptr)
{
@@ -126,11 +109,6 @@ namespace netlist
log().warning(MW_1_NO_POWER_TERMINALS_ON_DEVICE_1, out_proxied->device().name());
else
log().verbose("D/A Proxy: Found power terminals on device {1}", out_proxied->device().name());
-#if (0)
- printf("%s %s\n", out_proxied->name().c_str(), out_proxied->device().name().c_str());
- auto x = netlist().setup().find_terminal(out_proxied->name(), detail::device_object_t::terminal_type::OUTPUT, false);
- if (x) printf("==> %s\n", x->name().c_str());
-#endif
}
@@ -142,15 +120,15 @@ namespace netlist
//m_Q.initial(0.0);
m_last_state = -1;
- m_RV.do_reset();
+ m_RV.reset();
m_is_timestep = m_RV.m_P.net().solver()->has_timestep_devices();
- m_RV.set(NL_FCONST(1.0) / logic_family()->R_low(),
+ m_RV.set_G_V_I(plib::constants<nl_double>::one() / logic_family()->R_low(),
logic_family()->low_V(0.0, supply_V), 0.0);
}
NETLIB_UPDATE(d_to_a_proxy)
{
- const int state = static_cast<int>(m_I());
+ const auto state = static_cast<int>(m_I());
if (state != m_last_state)
{
// FIXME: Variable voltage
@@ -163,10 +141,10 @@ namespace netlist
// 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.update();
}
- m_RV.set(NL_FCONST(1.0) / R, V, 0.0);
- m_RV.m_P.schedule_solve_after(NLTIME_FROM_NS(1));
+ m_RV.set_G_V_I(plib::constants<nl_double>::one() / R, V, 0.0);
+ m_RV.solve_later();
}
}
diff --git a/src/lib/netlist/devices/nlid_proxy.h b/src/lib/netlist/devices/nlid_proxy.h
index 821cfa56d9d..9543b8db234 100644
--- a/src/lib/netlist/devices/nlid_proxy.h
+++ b/src/lib/netlist/devices/nlid_proxy.h
@@ -11,8 +11,8 @@
#ifndef NLID_PROXY_H_
#define NLID_PROXY_H_
-#include "../nl_setup.h"
-#include "../analog/nlid_twoterm.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/nl_setup.h"
namespace netlist
{
@@ -26,11 +26,9 @@ namespace netlist
NETLIB_OBJECT(base_proxy)
{
public:
- nld_base_proxy(netlist_t &anetlist, const pstring &name,
+ nld_base_proxy(netlist_state_t &anetlist, const pstring &name,
logic_t *inout_proxied, detail::core_terminal_t *proxy_inout);
- virtual ~nld_base_proxy();
-
logic_t &term_proxied() const { return *m_term_proxied; }
detail::core_terminal_t &proxy_term() const { return *m_proxy_term; }
@@ -49,13 +47,11 @@ namespace netlist
{
public:
- virtual ~nld_base_a_to_d_proxy();
-
virtual logic_output_t &out() { return m_Q; }
protected:
- nld_base_a_to_d_proxy(netlist_t &anetlist, const pstring &name,
+ nld_base_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name,
logic_input_t *in_proxied, detail::core_terminal_t *in_proxy);
private:
@@ -67,9 +63,7 @@ namespace netlist
NETLIB_OBJECT_DERIVED(a_to_d_proxy, base_a_to_d_proxy)
{
public:
- nld_a_to_d_proxy(netlist_t &anetlist, const pstring &name, logic_input_t *in_proxied);
-
- virtual ~nld_a_to_d_proxy() override;
+ nld_a_to_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *in_proxied);
analog_input_t m_I;
@@ -88,24 +82,20 @@ namespace netlist
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,
+ nld_base_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name,
logic_output_t *out_proxied, detail::core_terminal_t &proxy_out);
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);
- virtual ~nld_d_to_a_proxy() override {}
+ nld_d_to_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *out_proxied);
protected:
diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h
index 326cd3dbf2c..f1f2af1b31e 100644
--- a/src/lib/netlist/devices/nlid_system.h
+++ b/src/lib/netlist/devices/nlid_system.h
@@ -11,10 +11,10 @@
#ifndef NLID_SYSTEM_H_
#define NLID_SYSTEM_H_
-#include "../nl_base.h"
-#include "../nl_setup.h"
-#include "../analog/nlid_twoterm.h"
-#include "../plib/putil.h"
+#include "netlist/analog/nlid_twoterm.h"
+#include "netlist/nl_base.h"
+#include "netlist/nl_setup.h"
+#include "plib/putil.h"
namespace netlist
{
@@ -27,7 +27,8 @@ namespace netlist
NETLIB_OBJECT(netlistparams)
{
NETLIB_CONSTRUCTOR(netlistparams)
- , m_use_deactivate(*this, "USE_DEACTIVATE", 0)
+ , m_use_deactivate(*this, "USE_DEACTIVATE", false)
+ , m_startup_strategy(*this, "STARTUP_STRATEGY", 1)
{
}
NETLIB_UPDATEI() { }
@@ -35,6 +36,7 @@ namespace netlist
//NETLIB_UPDATE_PARAMI() { }
public:
param_logic_t m_use_deactivate;
+ param_int_t m_startup_strategy;
};
// -----------------------------------------------------------------------------
@@ -52,7 +54,7 @@ namespace netlist
NETLIB_RESETI()
{
- m_Q.net().set_time(netlist_time::zero());
+ m_Q.net().set_next_scheduled_time(netlist_time::zero());
}
NETLIB_UPDATE_PARAMI()
@@ -65,16 +67,14 @@ namespace netlist
logic_net_t &net = m_Q.net();
// this is only called during setup ...
net.toggle_new_Q();
- net.set_time(netlist().time() + m_inc);
+ net.set_next_scheduled_time(exec().time() + m_inc);
}
public:
logic_output_t m_Q;
-
- param_double_t m_freq;
netlist_time m_inc;
-
- inline static void mc_update(logic_net_t &net);
+ private:
+ param_double_t m_freq;
};
// -----------------------------------------------------------------------------
@@ -96,7 +96,7 @@ namespace netlist
//NETLIB_RESETI();
NETLIB_UPDATE_PARAMI();
- protected:
+ private:
logic_input_t m_feedback;
logic_output_t m_Q;
@@ -127,31 +127,35 @@ namespace netlist
std::vector<pstring> pat(plib::psplit(m_pattern(),","));
m_off = netlist_time::from_double(m_offset());
- unsigned long pati[32];
- for (int pI = 0; pI < 32; pI++)
- {
- pati[pI] = 0;
- }
+ std::array<std::int64_t, 32> pati = { 0 };
+
m_size = static_cast<std::uint8_t>(pat.size());
- unsigned long total = 0;
+ netlist_time::mult_type total = 0;
for (unsigned i=0; i<m_size; i++)
{
- pati[i] = static_cast<unsigned long>(pat[i].as_long());
+ // FIXME: use pstonum_ne
+ //pati[i] = plib::pstonum<decltype(pati[i])>(pat[i]);
+ pati[i] = plib::pstonum<std::int64_t>(pat[i]);
total += pati[i];
}
netlist_time ttotal = netlist_time::zero();
- for (unsigned i=0; i<m_size - 1; i++)
+ auto sm1 = static_cast<uint8_t>(m_size - 1);
+ for (unsigned i=0; i < sm1; i++)
{
m_inc[i] = base * pati[i];
ttotal += m_inc[i];
}
- m_inc[m_size - 1] = base * total - ttotal;
+ m_inc[sm1] = base * total - ttotal;
}
}
NETLIB_UPDATEI();
NETLIB_RESETI();
//NETLIB_UPDATE_PARAMI();
- protected:
+
+ NETLIB_HANDLERI(clk2);
+ NETLIB_HANDLERI(clk2_pow2);
+
+ private:
param_double_t m_freq;
param_str_t m_pattern;
@@ -162,7 +166,7 @@ namespace netlist
state_var_u8 m_cnt;
std::uint8_t m_size;
state_var<netlist_time> m_off;
- netlist_time m_inc[32];
+ std::array<netlist_time, 32> m_inc;
};
// -----------------------------------------------------------------------------
@@ -173,20 +177,19 @@ namespace netlist
{
NETLIB_CONSTRUCTOR(logic_input)
, m_Q(*this, "Q")
- , m_IN(*this, "IN", 0)
+ , m_IN(*this, "IN", false)
/* make sure we get the family first */
, m_FAMILY(*this, "FAMILY", "FAMILY(TYPE=TTL)")
{
set_logic_family(setup().family_from_model(m_FAMILY()));
+ m_Q.set_logic_family(this->logic_family());
}
- NETLIB_UPDATE_AFTER_PARAM_CHANGE()
-
- NETLIB_UPDATEI();
- NETLIB_RESETI();
- NETLIB_UPDATE_PARAMI();
+ NETLIB_UPDATEI() { }
+ NETLIB_RESETI() { m_Q.initial(0); }
+ NETLIB_UPDATE_PARAMI() { m_Q.push(m_IN() & 1, netlist_time::from_nsec(1)); }
- protected:
+ private:
logic_output_t m_Q;
param_logic_t m_IN;
@@ -200,12 +203,12 @@ namespace netlist
, m_IN(*this, "IN", 0.0)
{
}
- NETLIB_UPDATE_AFTER_PARAM_CHANGE()
- NETLIB_UPDATEI();
- NETLIB_RESETI();
- NETLIB_UPDATE_PARAMI();
- protected:
+ NETLIB_UPDATEI() { }
+ NETLIB_RESETI() { m_Q.initial(0.0); }
+ NETLIB_UPDATE_PARAMI() { m_Q.push(m_IN()); }
+
+ private:
analog_output_t m_Q;
param_double_t m_IN;
};
@@ -278,8 +281,8 @@ namespace netlist
NETLIB_RESETI()
{
- m_RIN.set(1.0 / m_p_RIN(),0,0);
- m_ROUT.set(1.0 / m_p_ROUT(),0,0);
+ m_RIN.set_G_V_I(1.0 / m_p_RIN(),0,0);
+ m_ROUT.set_G_V_I(1.0 / m_p_ROUT(),0,0);
}
NETLIB_UPDATEI()
@@ -310,13 +313,13 @@ namespace netlist
, m_N(*this, "N", 1)
, m_func(*this, "FUNC", "A0")
, m_Q(*this, "Q")
- , m_compiled(this->name() + ".FUNCC", this, this->netlist().state())
+ , m_compiled(this->name() + ".FUNCC", this, this->state().run_state_manager())
{
std::vector<pstring> inps;
for (int i=0; i < m_N(); i++)
{
pstring n = plib::pfmt("A{1}")(i);
- m_I.push_back(plib::make_unique<analog_input_t>(*this, n));
+ m_I.push_back(pool().make_poolptr<analog_input_t>(*this, n));
inps.push_back(n);
m_vals.push_back(0.0);
}
@@ -333,7 +336,7 @@ namespace netlist
param_int_t m_N;
param_str_t m_func;
analog_output_t m_Q;
- std::vector<std::unique_ptr<analog_input_t>> m_I;
+ std::vector<pool_owned_ptr<analog_input_t>> m_I;
std::vector<double> m_vals;
plib::pfunction m_compiled;
@@ -357,16 +360,17 @@ namespace netlist
register_subalias("2", m_R.m_N);
}
+ NETLIB_RESETI();
+ //NETLIB_UPDATE_PARAMI();
+ NETLIB_UPDATEI();
+
analog::NETLIB_SUB(R_base) m_R;
logic_input_t m_I;
param_double_t m_RON;
param_double_t m_ROFF;
- NETLIB_RESETI();
- //NETLIB_UPDATE_PARAMI();
- NETLIB_UPDATEI();
-
private:
+
state_var<netlist_sig_t> m_last_state;
};
diff --git a/src/lib/netlist/devices/nlid_truthtable.cpp b/src/lib/netlist/devices/nlid_truthtable.cpp
index bf7d03fe3d7..2221d855880 100644
--- a/src/lib/netlist/devices/nlid_truthtable.cpp
+++ b/src/lib/netlist/devices/nlid_truthtable.cpp
@@ -6,9 +6,9 @@
*/
#include "nlid_truthtable.h"
-#include "../plib/plists.h"
-#include "../nl_setup.h"
-#include "../plib/palloc.h"
+#include "netlist/nl_setup.h"
+#include "plib/palloc.h"
+#include "plib/plists.h"
#include <bitset>
@@ -24,7 +24,7 @@ namespace netlist
template <typename T>
struct sbitset
{
- typedef T type;
+ using type = T;
sbitset() : m_bs(0) { }
/* explicit */ sbitset(T v) : m_bs(v) { }
@@ -77,8 +77,8 @@ namespace netlist
return ret;
}
- static constexpr sbitset all_bits() { return sbitset(~static_cast<T>(0)); }
- static constexpr sbitset no_bits() { return sbitset(static_cast<T>(0)); }
+ static constexpr const sbitset all_bits() noexcept { return sbitset(~static_cast<T>(0)); }
+ static constexpr const sbitset no_bits() noexcept{ return sbitset(static_cast<T>(0)); }
private:
T m_bs;
};
@@ -122,8 +122,18 @@ namespace netlist
}
}
- uint_least64_t mask() const { return static_cast<uint_least64_t>(-1); }
-
+ uint_least64_t mask() const
+ {
+ switch (m_size)
+ {
+ case 8: return static_cast<uint_least8_t>(-1);
+ case 16: return static_cast<uint_least16_t>(-1);
+ case 32: return static_cast<uint_least32_t>(-1);
+ case 64: return static_cast<uint_least64_t>(-1);
+ default:
+ return 0; //should never happen
+ }
+ }
private:
void *m_data;
size_t m_size;
@@ -134,7 +144,7 @@ namespace netlist
truthtable_parser(unsigned NO, unsigned NI, bool *initialized,
packed_int outs, uint_least8_t *timing, netlist_time *timing_nt)
: m_NO(NO), m_NI(NI), m_initialized(initialized),
- m_outs(outs), m_timing(timing), m_timing_nt(timing_nt),
+ m_out_state(outs), m_timing(timing), m_timing_nt(timing_nt),
m_num_bits(m_NI),
m_size(1 << (m_num_bits))
{
@@ -151,7 +161,7 @@ namespace netlist
unsigned m_NO;
unsigned m_NI;
bool *m_initialized;
- packed_int m_outs;
+ packed_int m_out_state;
uint_least8_t *m_timing;
netlist_time *m_timing_nt;
@@ -178,51 +188,27 @@ namespace netlist
nl_assert_always(io.size() == 2, "too many '|'");
std::vector<pstring> inout(plib::psplit(io[0], ","));
nl_assert_always(inout.size() == m_num_bits, "bitcount wrong");
- std::vector<pstring> out(plib::psplit(io[1], ","));
- nl_assert_always(out.size() == m_NO, "output count wrong");
+ std::vector<pstring> outputs(plib::psplit(io[1], ","));
+ nl_assert_always(outputs.size() == m_NO, "output count wrong");
for (std::size_t i=0; i < m_NI; i++)
{
- inout[i] = inout[i].trim();
+ inout[i] = plib::trim(inout[i]);
m_I.emplace(i, *this, inout[i]);
}
for (std::size_t i=0; i < m_NO; i++)
{
- out[i] = out[i].trim();
- m_Q.emplace(i, *this, out[i]);
- }
- // Connect output "Q" to input "_Q" if this exists
- // This enables timed state without having explicit state ....
- tt_bitset disabled_ignore = 0;
- for (std::size_t i=0; i < m_NO; i++)
- {
- pstring tmp = "_" + out[i];
+ outputs[i] = plib::trim(outputs[i]);
+ m_Q.emplace(i, *this, outputs[i]);
+ // Connect output "Q" to input "_Q" if this exists
+ // This enables timed state without having explicit state ....
+ pstring tmp = "_" + outputs[i];
const std::size_t idx = plib::container::indexof(inout, tmp);
if (idx != plib::container::npos)
- {
connect(m_Q[i], m_I[idx]);
- // disable ignore for theses inputs altogether.
- // FIXME: This shouldn't be necessary
- disabled_ignore.set(idx);
- }
}
m_ign = 0;
-
-#if 0
- for (size_t i=0; i<m_size; i++)
- {
- m_ttp.m_outs[i] &= ~(disabled_ignore << m_NO);
- }
-#endif
-#if 0
- printf("%s\n", name().c_str());
- for (int j=0; j < m_size; j++)
- printf("%05x %04x %04x %04x\n", j, m_ttp->m_outs[j] & ((1 << m_NO)-1),
- m_ttp->m_outs[j] >> m_NO, m_ttp->m_timing[j * m_NO + 0]);
- for (int k=0; m_ttp->m_timing_nt[k] != netlist_time::zero(); k++)
- printf("%d %f\n", k, m_ttp->m_timing_nt[k].as_double() * 1000000.0);
-#endif
}
// ----------------------------------------------------------------------------------------
@@ -238,15 +224,20 @@ namespace netlist
: netlist_base_factory_truthtable_t(name, classname, def_param, sourcefile)
{ }
- plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
+ pool_owned_ptr<device_t> Create(netlist_state_t &anetlist, const pstring &name) override
{
- typedef nld_truthtable_t<m_NI, m_NO> tt_type;
+ using tt_type = nld_truthtable_t<m_NI, m_NO>;
truthtable_parser desc_s(m_NO, m_NI, &m_ttbl.m_initialized,
- packed_int(m_ttbl.m_outs, sizeof(m_ttbl.m_outs[0]) * 8),
- m_ttbl.m_timing, m_ttbl.m_timing_nt);
+ packed_int(m_ttbl.m_out_state.data(), sizeof(m_ttbl.m_out_state[0]) * 8),
+ m_ttbl.m_timing_index.data(), m_ttbl.m_timing_nt.data());
desc_s.parse(m_desc);
- return plib::owned_ptr<device_t>::Create<tt_type>(anetlist, name, m_family, m_ttbl, m_desc);
+
+ /* update truthtable family definitions */
+ if (m_family_name != "")
+ m_family_desc = anetlist.setup().family_from_model(m_family_name);
+
+ return pool().make_poolptr<tt_type>(anetlist, name, m_family_desc, m_ttbl, m_desc);
}
private:
typename nld_truthtable_t<m_NI, m_NO>::truthtable_t m_ttbl;
@@ -259,7 +250,7 @@ namespace netlist
for (std::size_t j=0; j<m_NI; j++)
{
// if changing the input directly doesn't change outputs we can ignore
- if (m_outs[state] == m_outs[tt_bitset(state).set(j)])
+ if (m_out_state[state] == m_out_state[tt_bitset(state).set(j)])
ignore.set(j);
}
@@ -285,7 +276,7 @@ namespace netlist
{
tt_bitset b = tign.expand_and(k);
// will any of the inputs ignored change the output if changed?
- if (m_outs[state] != m_outs[(state & tign.invert()) | b])
+ if (m_out_state[state] != m_out_state[(state & tign.invert()) | b])
{
t[j] = true;
break;
@@ -318,21 +309,21 @@ namespace netlist
void truthtable_parser::parseline(unsigned cur, std::vector<pstring> list,
tt_bitset state, uint_least64_t val, std::vector<uint_least8_t> &timing_index)
{
- pstring elem = list[cur].trim();
+ pstring elem = plib::trim(list[cur]);
uint_least64_t start = 0;
uint_least64_t end = 0;
- if (elem.equals("0"))
+ if (elem == "0")
{
start = 0;
end = 0;
}
- else if (elem.equals("1"))
+ else if (elem == "1")
{
start = 1;
end = 1;
}
- else if (elem.equals("X"))
+ else if (elem == "X")
{
start = 0;
end = 1;
@@ -352,10 +343,10 @@ void truthtable_parser::parseline(unsigned cur, std::vector<pstring> list,
else
{
// cutoff previous inputs and outputs for ignore
- if (m_outs[nstate] != m_outs.mask() && m_outs[nstate] != val)
- nl_exception(plib::pfmt("Error in truthtable: State {1:04} already set, {2} != {3}\n")
- .x(nstate.as_uint())(m_outs[nstate])(val) );
- m_outs.set(nstate, val);
+ if (m_out_state[nstate] != m_out_state.mask() && m_out_state[nstate] != val)
+ throw nl_exception(plib::pfmt("Error in truthtable: State {1:04} already set, {2} != {3}\n")
+ .x(nstate.as_uint())(m_out_state[nstate])(val) );
+ m_out_state.set(nstate, val);
for (std::size_t j=0; j<m_NO; j++)
m_timing[nstate * m_NO + j] = timing_index[j];
}
@@ -375,12 +366,12 @@ void truthtable_parser::parse(const std::vector<pstring> &truthtable)
line++;
for (unsigned j=0; j < m_size; j++)
- m_outs.set(j, tt_bitset::all_bits());
+ m_out_state.set(j, tt_bitset::all_bits());
for (int j=0; j < 16; j++)
m_timing_nt[j] = netlist_time::zero();
- while (!ttline.equals(""))
+ while (!(ttline == ""))
{
std::vector<pstring> io(plib::psplit(ttline,"|"));
// checks
@@ -402,12 +393,13 @@ void truthtable_parser::parse(const std::vector<pstring> &truthtable)
*/
for (unsigned j=0; j<m_NO; j++)
{
- pstring outs = out[j].trim();
- if (outs.equals("1"))
+ pstring outs = plib::trim(out[j]);
+ if (outs == "1")
val.set(j);
else
- nl_assert_always(outs.equals("0"), "Unknown value (not 0 or 1");
- netlist_time t = netlist_time::from_nsec(static_cast<unsigned long>(times[j].trim().as_long()));
+ nl_assert_always(outs == "0", "Unknown value (not 0 or 1");
+ // FIXME: error handling
+ netlist_time t = netlist_time::from_nsec(plib::pstonum<std::int64_t>(plib::trim(times[j])));
uint_least8_t k=0;
while (m_timing_nt[k] != netlist_time::zero() && m_timing_nt[k] != t)
k++;
@@ -450,9 +442,9 @@ void truthtable_parser::parse(const std::vector<pstring> &truthtable)
}
for (size_t i=0; i<m_size; i++)
{
- if (m_outs[i] == m_outs.mask())
+ if (m_out_state[i] == m_out_state.mask())
throw nl_exception(plib::pfmt("truthtable: found element not set {1}\n").x(i) );
- m_outs.set(i, m_outs[i] | (ign[i] << m_NO));;
+ m_out_state.set(i, m_out_state[i] | (ign[i] << m_NO));
}
*m_initialized = true;
@@ -460,26 +452,21 @@ void truthtable_parser::parse(const std::vector<pstring> &truthtable)
netlist_base_factory_truthtable_t::netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname,
const pstring &def_param, const pstring &sourcefile)
-: factory::element_t(name, classname, def_param, sourcefile), m_family(family_TTL())
-{
-}
-
-netlist_base_factory_truthtable_t::~netlist_base_factory_truthtable_t()
+: factory::element_t(name, classname, def_param, sourcefile), m_family_desc(family_TTL())
{
}
-
#define ENTRYY(n, m, s) case (n * 100 + m): \
{ using xtype = netlist_factory_truthtable_t<n, m>; \
- ret = plib::palloc<xtype>(desc.name, desc.classname, desc.def_param, s); } break
+ ret = plib::make_unique<xtype>(desc.name, desc.classname, desc.def_param, s); } break
#define ENTRY(n, s) ENTRYY(n, 1, s); ENTRYY(n, 2, s); ENTRYY(n, 3, s); \
ENTRYY(n, 4, s); ENTRYY(n, 5, s); ENTRYY(n, 6, s); \
ENTRYY(n, 7, s); ENTRYY(n, 8, s)
-void tt_factory_create(setup_t &setup, tt_desc &desc, const pstring &sourcefile)
+plib::unique_ptr<netlist_base_factory_truthtable_t> tt_factory_create(tt_desc &desc, const pstring &sourcefile)
{
- netlist_base_factory_truthtable_t *ret;
+ plib::unique_ptr<netlist_base_factory_truthtable_t> ret;
switch (desc.ni * 100 + desc.no)
{
@@ -500,9 +487,9 @@ void tt_factory_create(setup_t &setup, tt_desc &desc, const pstring &sourcefile)
nl_assert_always(false, msg);
}
ret->m_desc = desc.desc;
- if (desc.family != "")
- ret->m_family = setup.family_from_model(desc.family);
- setup.factory().register_device(std::unique_ptr<netlist_base_factory_truthtable_t>(ret));
+ ret->m_family_name = desc.family;
+
+ return ret;
}
} //namespace devices
diff --git a/src/lib/netlist/devices/nlid_truthtable.h b/src/lib/netlist/devices/nlid_truthtable.h
index 311f5ebd8ca..1217d7ee873 100644
--- a/src/lib/netlist/devices/nlid_truthtable.h
+++ b/src/lib/netlist/devices/nlid_truthtable.h
@@ -10,9 +10,9 @@
#ifndef NLID_TRUTHTABLE_H_
#define NLID_TRUTHTABLE_H_
-#include "../nl_setup.h"
-#include "../nl_base.h"
-#include "../plib/putil.h"
+#include "netlist/nl_base.h"
+#include "netlist/nl_setup.h"
+#include "plib/putil.h"
#define NETLIB_TRUTHTABLE(cname, nIN, nOUT) \
class NETLIB_NAME(cname) : public nld_truthtable_t<nIN, nOUT> \
@@ -29,17 +29,9 @@
namespace netlist
{
- namespace devices
- {
+namespace devices
+{
-#if 0
- template<unsigned bits> struct uint_for_size { typedef uint_least32_t type; };
- template<unsigned bits>
- struct need_bytes_for_bits
- {
- enum { value = 4 };
- };
-#else
template<unsigned bits>
struct need_bytes_for_bits
{
@@ -52,11 +44,35 @@ namespace netlist
};
template<unsigned bits> struct uint_for_size;
- template<> struct uint_for_size<1> { typedef uint_least8_t type; };
- template<> struct uint_for_size<2> { typedef uint_least16_t type; };
- template<> struct uint_for_size<4> { typedef uint_least32_t type; };
- template<> struct uint_for_size<8> { typedef uint_least64_t type; };
-#endif
+ template<> struct uint_for_size<1> { using type = uint_least8_t; };
+ template<> struct uint_for_size<2> { using type = uint_least16_t; };
+ template<> struct uint_for_size<4> { using type = uint_least32_t; };
+ template<> struct uint_for_size<8> { using type = uint_least64_t; };
+
+ template<std::size_t NUM, typename R>
+ struct aa
+ {
+ template<typename T>
+ R f(T &arr, const R ign)
+ {
+ R r = aa<NUM-1, R>().f(arr, ign);
+ if (ign & (1 << (NUM-1)))
+ arr[NUM-1].activate();
+ return r | (arr[NUM-1]() << (NUM-1));
+ }
+ };
+
+ template<typename R>
+ struct aa<1, R>
+ {
+ template<typename T>
+ R f(T &arr, const R ign)
+ {
+ if ((ign & 1))
+ arr[0].activate();
+ return arr[0]();
+ }
+ };
template<std::size_t m_NI, std::size_t m_NO>
NETLIB_OBJECT(truthtable_t)
@@ -65,22 +81,23 @@ namespace netlist
detail::family_setter_t m_fam;
public:
- typedef typename uint_for_size<need_bytes_for_bits<m_NO + m_NI>::value>::type type_t;
+ using type_t = typename uint_for_size<need_bytes_for_bits<m_NO + m_NI>::value>::type;
static constexpr const std::size_t m_num_bits = m_NI;
static constexpr const std::size_t m_size = (1 << (m_num_bits));
static constexpr const type_t m_outmask = ((1 << m_NO) - 1);
- static constexpr const std::size_t m_min_devices_for_deactivate = 2;
struct truthtable_t
{
truthtable_t()
- : m_initialized(false)
+ : m_timing_index{0}
+ , m_initialized(false)
{}
+
+ std::array<type_t, m_size> m_out_state;
+ std::array<uint_least8_t, m_size * m_NO> m_timing_index;
+ std::array<netlist_time, 16> m_timing_nt;
bool m_initialized;
- type_t m_outs[m_size];
- uint_least8_t m_timing[m_size * m_NO];
- netlist_time m_timing_nt[16];
};
template <class C>
@@ -90,7 +107,6 @@ namespace netlist
: device_t(owner, name)
, m_fam(*this, fam)
, m_ign(*this, "m_ign", 0)
- , m_active(*this, "m_active", 1)
, m_ttp(ttp)
{
init(desc);
@@ -100,13 +116,14 @@ namespace netlist
NETLIB_RESETI()
{
- m_active = 0;
+ int active_outputs = 0;
m_ign = 0;
for (auto &i : m_I)
i.activate();
for (auto &q : m_Q)
if (q.has_net() && q.net().num_cons() > 0)
- m_active++;
+ active_outputs++;
+ set_active_outputs(active_outputs);
}
NETLIB_UPDATEI()
@@ -116,28 +133,14 @@ namespace netlist
void inc_active() NL_NOEXCEPT override
{
- if (m_NI >= m_min_devices_for_deactivate)
- if (++m_active == 1)
- {
- process<false>();
- }
+ process<false>();
}
void dec_active() NL_NOEXCEPT override
{
- /* FIXME:
- * Based on current measurements there is no point to disable
- * 1 input devices. This should actually be a parameter so that we
- * can decide for each individual gate whether it is beneficial to
- * ignore deactivation.
- */
- if (m_NI >= m_min_devices_for_deactivate)
- if (--m_active == 0)
- {
- for (std::size_t i = 0; i< m_NI; i++)
- m_I[i].inactivate();
- m_ign = (1<<m_NI)-1;
- }
+ for (std::size_t i = 0; i< m_NI; i++)
+ m_I[i].inactivate();
+ m_ign = (1<<m_NI)-1;
}
plib::uninitialised_array_t<logic_input_t, m_NI> m_I;
@@ -153,46 +156,44 @@ namespace netlist
netlist_time mt(netlist_time::zero());
type_t nstate(0);
- if (m_NI >= m_min_devices_for_deactivate)
- {
- type_t ign(m_ign);
- if (!doOUT)
- for (std::size_t i = 0; i < m_NI; i++)
- {
- m_I[i].activate();
- nstate |= (m_I[i]() ? (1 << i) : 0);
- mt = std::max(this->m_I[i].net().time(), mt);
- }
- else
- for (std::size_t i = 0; i < m_NI; i++)
- {
- if ((ign & 1))
- m_I[i].activate();
- nstate |= (m_I[i]() ? (1 << i) : 0);
- ign >>= 1;
- }
- }
+ type_t ign(m_ign);
+#if 1
+ if (!doOUT)
+ for (std::size_t i = 0; i < m_NI; i++)
+ {
+ m_I[i].activate();
+ //nstate |= (m_I[i]() ? (1 << i) : 0);
+ nstate |= (m_I[i]() << i);
+ mt = std::max(this->m_I[i].net().next_scheduled_time(), mt);
+ }
else
+ for (std::size_t i = 0; i < m_NI; i++)
+ {
+ if ((ign & 1))
+ m_I[i].activate();
+ //nstate |= (m_I[i]() ? (1 << i) : 0);
+ nstate |= (m_I[i]() << i);
+ ign >>= 1;
+ }
+#else
+ if (!doOUT)
{
- if (!doOUT)
- for (std::size_t i = 0; i < m_NI; i++)
- {
- nstate |= (m_I[i]() ? (1 << i) : 0);
- mt = std::max(this->m_I[i].net().time(), mt);
- }
- else
- for (std::size_t i = 0; i < m_NI; i++)
- nstate |= (m_I[i]() ? (1 << i) : 0);
+ nstate = aa<m_NI, type_t>().f(m_I, ~0);
+ for (std::size_t i = 0; i < m_NI; i++)
+ mt = std::max(this->m_I[i].net().time(), mt);
}
+ else
+ nstate = aa<m_NI, type_t>().f(m_I, ign);
+#endif
- const type_t outstate(m_ttp.m_outs[nstate]);
+ const type_t outstate(m_ttp.m_out_state[nstate]);
type_t out(outstate & m_outmask);
m_ign = outstate >> m_NO;
const std::size_t timebase(nstate * m_NO);
- const auto *t(&m_ttp.m_timing[timebase]);
- const auto *tim = m_ttp.m_timing_nt;
+ const auto *t(&m_ttp.m_timing_index[timebase]);
+ const auto *tim = m_ttp.m_timing_nt.data();
if (doOUT)
for (std::size_t i = 0; i < m_NO; out >>= 1, ++i)
@@ -201,18 +202,14 @@ namespace netlist
for (std::size_t i = 0; i < m_NO; out >>= 1, ++i)
m_Q[i].set_Q_time(out & 1, mt + tim[t[i]]);
- if (m_NI >= m_min_devices_for_deactivate)
- {
- type_t ign(m_ign);
- for (auto I = m_I.begin(); ign != 0; ign >>= 1, ++I)
- if (ign & 1)
- I->inactivate();
- }
+ ign = m_ign;
+ for (auto I = m_I.begin(); ign != 0; ign >>= 1, ++I)
+ if (ign & 1)
+ I->inactivate();
}
/* FIXME: check width */
state_var<type_t> m_ign;
- state_var_s32 m_active;
const truthtable_t &m_ttp;
};
@@ -222,15 +219,15 @@ namespace netlist
netlist_base_factory_truthtable_t(const pstring &name, const pstring &classname,
const pstring &def_param, const pstring &sourcefile);
- virtual ~netlist_base_factory_truthtable_t();
-
std::vector<pstring> m_desc;
- const logic_family_desc_t *m_family;
+ pstring m_family_name;
+ const logic_family_desc_t *m_family_desc;
};
- void tt_factory_create(setup_t &setup, tt_desc &desc, const pstring &sourcefile);
+ /* the returned element is still missing a pointer to the family ... */
+ plib::unique_ptr<netlist_base_factory_truthtable_t> tt_factory_create(tt_desc &desc, const pstring &sourcefile);
- } //namespace devices
+} //namespace devices
} // namespace netlist