Simplify code. Introduce consistent approach to loading macro devices.

Changed  nltool "listdevices" command accordingly. Fix some bugs which
surfaced by this exercise. (nw)
This commit is contained in:
couriersud 2017-01-02 13:56:16 +01:00
parent a64328499c
commit 9a7b32f29d
13 changed files with 205 additions and 238 deletions

View File

@ -80,15 +80,15 @@ static void initialize_factory(factory_list_t &factory)
ENTRY(C, CAP, "C")
ENTRY(L, IND, "L")
ENTRY(D, DIODE, "MODEL")
ENTRY(VCVS, VCVS, "-")
ENTRY(VCCS, VCCS, "-")
ENTRY(CCCS, CCCS, "-")
ENTRY(LVCCS, LVCCS, "-")
ENTRY(VCVS, VCVS, "")
ENTRY(VCCS, VCCS, "")
ENTRY(CCCS, CCCS, "")
ENTRY(LVCCS, LVCCS, "")
ENTRY(VS, VS, "V")
ENTRY(CS, CS, "I")
ENTRY(OPAMP, OPAMP, "MODEL")
ENTRYX(dummy_input, DUMMY_INPUT, "-")
ENTRYX(frontier, FRONTIER_DEV, "+I,G,Q") // not intended to be used directly
ENTRYX(dummy_input, DUMMY_INPUT, "")
ENTRYX(frontier, FRONTIER_DEV, "+I,+G,+Q") // not intended to be used directly
ENTRYX(function, AFUNC, "N,FUNC") // only for macro devices - NO FEEDBACK loops
ENTRY(QBJT_EB, QBJT_EB, "MODEL")
ENTRY(QBJT_switch, QBJT_SW, "MODEL")
@ -96,106 +96,107 @@ static void initialize_factory(factory_list_t &factory)
ENTRYX(logic_input, LOGIC_INPUT, "IN,FAMILY")
ENTRYX(analog_input, ANALOG_INPUT, "IN")
ENTRYX(log, LOG, "+I")
ENTRYX(logD, LOGD, "+I,I2")
ENTRYX(logD, LOGD, "+I,+I2")
ENTRYX(clock, CLOCK, "FREQ")
ENTRYX(extclock, EXTCLOCK, "FREQ")
ENTRYX(mainclock, MAINCLOCK, "FREQ")
ENTRYX(gnd, GND, "-")
ENTRYX(netlistparams, PARAMETER, "-")
ENTRYX(gnd, GND, "")
ENTRYX(netlistparams, PARAMETER, "")
ENTRY(solver, SOLVER, "FREQ")
ENTRYX(res_sw, RES_SWITCH, "+IN,P1,P2")
ENTRY(switch1, SWITCH, "-")
ENTRY(switch2, SWITCH2, "-")
ENTRYX(nicRSFF, NETDEV_RSFF, "+S,R")
ENTRYX(nicDelay, NETDEV_DELAY, "-")
ENTRYX(2716, EPROM_2716, "+GQ,EPQ,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(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(res_sw, RES_SWITCH, "+IN,+P1,+P2")
ENTRY(switch1, SWITCH, "")
ENTRY(switch2, SWITCH2, "")
ENTRYX(nicRSFF, NETDEV_RSFF, "+S,+R")
ENTRYX(nicDelay, NETDEV_DELAY, "")
ENTRYX(2716, EPROM_2716, "+GQ,+EPQ,+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(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(9312, TTL_9312, "+A,B,C,D0,D1,D2,D3,D4,D5,D6,D7,G")
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(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(9312, TTL_9312, "+A,+B,+C,+D0,+D1,+D2,+D3,+D4,+D5,+D6,+D7,+G")
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, "")
/* entries with suffix WI are legacy only */
ENTRYX(CD4020, CD4020_WI, "+IP,RESET,VDD,VSS")
ENTRYX(CD4020, CD4020_WI, "+IP,+RESET,+VDD,+VSS")
//ENTRY(4066, CD_4066, "+A,B")
ENTRYX(NE555, NE555, "-")
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(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(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(74279_dip, TTL_74279_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(9312_dip, TTL_9312_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(tristate, TTL_TRISTATE, "+CEQ1,+D1,+CEQ2,+D2")
ENTRYX(tristate3, TTL_TRISTATE3, "")
ENTRYX(2102A_dip, RAM_2102A_DIP, "")
ENTRYX(2716_dip, EPROM_2716_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(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(74279_dip, TTL_74279_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(9312_dip, TTL_9312_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, "-")
ENTRYX(NE555_dip, NE555_DIP, "")
ENTRYX(MM5837_dip, MM5837_DIP, "")
}
} //namespace devices

View File

@ -429,23 +429,25 @@ namespace netlist
class wrapper : public device_t
{
public:
wrapper(const pstring &devname, netlist_t &anetlist, const pstring &name)
: device_t(anetlist, name), m_devname(devname)
wrapper(netlist_t &anetlist, const pstring &name)
: device_t(anetlist, name)
{
anetlist.setup().namespace_push(name);
anetlist.setup().include(m_devname);
anetlist.setup().namespace_pop();
}
protected:
NETLIB_RESETI() { }
NETLIB_UPDATEI() { }
pstring m_devname;
};
plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) override
{
return plib::owned_ptr<device_t>::Create<wrapper>(this->name(), anetlist, name);
return plib::owned_ptr<device_t>::Create<wrapper>(anetlist, name);
}
void macro_actions(netlist_t &anetlist, const pstring &name) override
{
anetlist.setup().namespace_push(name);
anetlist.setup().include(this->name());
anetlist.setup().namespace_pop();
}
private:

View File

@ -52,7 +52,7 @@ static NETLIST_START(opamp_layout_2_13_9_4)
A.GND, /* |4 11| */ NC,
B.N1, /* |5 10| */ B.OUT,
B.PLUS, /* |6 9| */ B.VCC,
B.MINUS /* |7 8| */ B.N2
B.MINUS, /* |7 8| */ B.N2
/* +--------------+ */
)
NET_C(A.GND, B.GND)

View File

@ -588,7 +588,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
TRUTHTABLE_START(TTL_7400_NAND, 2, 1, "A,B")
TRUTHTABLE_START(TTL_7400_NAND, 2, 1, "+A,+B")
TT_HEAD("A,B|Q ")
TT_LINE("0,X|1|22")
TT_LINE("X,0|1|22")
@ -604,7 +604,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
TRUTHTABLE_START(TTL_7402_NOR, 2, 1, "A,B")
TRUTHTABLE_START(TTL_7402_NOR, 2, 1, "+A,+B")
TT_HEAD("A,B|Q ")
TT_LINE("0,0|1|22")
TT_LINE("X,1|0|15")
@ -619,7 +619,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
TRUTHTABLE_START(TTL_7404_INVERT, 1, 1, "A")
TRUTHTABLE_START(TTL_7404_INVERT, 1, 1, "+A")
TT_HEAD(" A | Q ")
TT_LINE(" 0 | 1 |22")
TT_LINE(" 1 | 0 |15")
@ -634,7 +634,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
TRUTHTABLE_START(TTL_7408_AND, 2, 1, "A,B")
TRUTHTABLE_START(TTL_7408_AND, 2, 1, "+A,+B")
TT_HEAD("A,B|Q ")
TT_LINE("0,X|0|15")
TT_LINE("X,0|0|15")
@ -642,7 +642,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
TRUTHTABLE_START(TTL_7410_NAND, 3, 1, "A,B,C")
TRUTHTABLE_START(TTL_7410_NAND, 3, 1, "+A,+B,+C")
TT_HEAD("A,B,C|Q ")
TT_LINE("0,X,X|1|22")
TT_LINE("X,0,X|1|22")
@ -660,7 +660,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
TRUTHTABLE_START(TTL_7411_AND, 3, 1, "A,B,C")
TRUTHTABLE_START(TTL_7411_AND, 3, 1, "+A,+B,+C")
TT_HEAD("A,B,C|Q ")
TT_LINE("0,X,X|0|15")
TT_LINE("X,0,X|0|15")
@ -696,7 +696,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
TRUTHTABLE_START(TTL_7420_NAND, 4, 1, "A,B,C,D")
TRUTHTABLE_START(TTL_7420_NAND, 4, 1, "+A,+B,+C,+D")
TT_HEAD("A,B,C,D|Q ")
TT_LINE("0,X,X,X|1|22")
TT_LINE("X,0,X,X|1|22")
@ -716,7 +716,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
TRUTHTABLE_START(TTL_7425_NOR, 4, 1, "A,B,C,D")
TRUTHTABLE_START(TTL_7425_NOR, 4, 1, "+A,+B,+C,+D")
TT_HEAD("A,B,C,D|Q ")
TT_LINE("1,X,X,X|0|15")
TT_LINE("X,1,X,X|0|15")
@ -735,7 +735,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
TRUTHTABLE_START(TTL_7427_NOR, 3, 1, "A,B,C")
TRUTHTABLE_START(TTL_7427_NOR, 3, 1, "+A,+B,+C")
TT_HEAD("A,B,C|Q ")
TT_LINE("1,X,X|0|15")
TT_LINE("X,1,X|0|15")
@ -758,7 +758,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
TRUTHTABLE_START(TTL_7430_NAND, 8, 1, "A,B,C,D,E,F,G,H")
TRUTHTABLE_START(TTL_7430_NAND, 8, 1, "+A,+B,+C,+D,+E,+F,+G,+H")
TT_HEAD("A,B,C,D,E,F,G,H|Q ")
TT_LINE("0,X,X,X,X,X,X,X|1|22")
TT_LINE("X,0,X,X,X,X,X,X|1|22")
@ -780,7 +780,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
TRUTHTABLE_START(TTL_7432_OR, 2, 1, "A,B")
TRUTHTABLE_START(TTL_7432_OR, 2, 1, "+A,+B")
TT_HEAD("A,B|Q ")
TT_LINE("1,X|1|22")
TT_LINE("X,1|1|22")
@ -800,7 +800,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
TRUTHTABLE_START(TTL_7437_NAND, 2, 1, "A,B")
TRUTHTABLE_START(TTL_7437_NAND, 2, 1, "+A,+B")
TT_HEAD("A,B|Q ")
TT_LINE("0,X|1|22")
TT_LINE("X,0|1|22")
@ -817,7 +817,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
TRUTHTABLE_START(TTL_7486_XOR, 2, 1, "A,B")
TRUTHTABLE_START(TTL_7486_XOR, 2, 1, "+A,+B")
TT_HEAD("A,B|Q ")
TT_LINE("0,0|0|15")
TT_LINE("0,1|1|22")
@ -837,7 +837,7 @@ NETLIST_START(TTL74XX_lib)
TT_FAMILY("74XX")
TRUTHTABLE_END()
TRUTHTABLE_START(TTL_74260_NOR, 5, 1, "A,B,C,D,E")
TRUTHTABLE_START(TTL_74260_NOR, 5, 1, "+A,+B,+C,+D,+E")
TT_HEAD("A,B,C,D,E|Q ")
TT_LINE("0,0,0,0,0|1|10")
TT_LINE("X,X,X,X,1|0|12")

View File

@ -960,28 +960,6 @@ namespace netlist
virtual void changed() override { }
};
template <typename ST, std::size_t AW, std::size_t DW>
class param_rom_t final: public param_data_t
{
public:
param_rom_t(device_t &device, const pstring name)
: param_data_t(device, name)
{
stream()->read(&m_data[0],1<<AW);
}
const ST & operator[] (std::size_t n) { return m_data[n]; }
protected:
virtual void changed() override
{
stream()->read(&m_data[0],1<<AW);
}
private:
ST m_data[1 << AW];
};
// -----------------------------------------------------------------------------
// core_device_t
// -----------------------------------------------------------------------------
@ -1298,6 +1276,36 @@ namespace netlist
}
};
// -----------------------------------------------------------------------------
// rom parameter
// -----------------------------------------------------------------------------
template <typename ST, std::size_t AW, std::size_t DW>
class param_rom_t final: public param_data_t
{
public:
param_rom_t(device_t &device, const pstring name)
: param_data_t(device, name)
{
auto f = stream();
if (f != nullptr)
f->read(&m_data[0],1<<AW);
else
device.netlist().log().warning("Rom {1} not found", Value());
}
const ST & operator[] (std::size_t n) { return m_data[n]; }
protected:
virtual void changed() override
{
stream()->read(&m_data[0],1<<AW);
}
private:
ST m_data[1 << AW];
};
// -----------------------------------------------------------------------------
// inline implementations
// -----------------------------------------------------------------------------

View File

@ -51,7 +51,7 @@
*/
// This will be autodetected
//#define NL_PMF_TYPE 0
// #define NL_PMF_TYPE 0
#define NL_PMF_TYPE_VIRTUAL 0
#define NL_PMF_TYPE_GNUC_PMF 1
@ -82,6 +82,7 @@
* linear memory pool. This is based of the assumption that
* due to enhanced locality there will be less cache misses.
* Your mileage may vary.
* This will cause crashes on OSX and thus is ignored on OSX.
*
*/
#define USE_MEMPOOL (0)
@ -91,7 +92,6 @@
// Solver defines
//============================================================
#define USE_MATRIX_GS (0)
#define USE_GABS (1)
// savings are eaten up by effort
// FIXME: Convert into solver parameter
@ -165,5 +165,9 @@ using nl_double = double;
#endif
#endif
#ifdef __APPLE__
#undef USE_MEMPOOL
#define USE_MEMPOOL (0)
#endif
#endif /* NLCONFIG_H_ */

View File

@ -18,23 +18,6 @@ namespace netlist
// net_device_t_base_factory
// ----------------------------------------------------------------------------------------
const plib::pstring_vector_t base_factory_t::term_param_list()
{
if (m_def_param.startsWith("+"))
return plib::pstring_vector_t(m_def_param.substr(1), ",");
else
return plib::pstring_vector_t();
}
const plib::pstring_vector_t base_factory_t::def_params()
{
if (m_def_param.startsWith("+") || m_def_param.equals("-"))
return plib::pstring_vector_t();
else
return plib::pstring_vector_t(m_def_param, ",");
}
factory_list_t::factory_list_t( setup_t &setup)
: m_setup(setup)
{

View File

@ -37,12 +37,11 @@ namespace netlist
virtual ~base_factory_t() {}
virtual plib::owned_ptr<device_t> Create(netlist_t &anetlist, const pstring &name) = 0;
virtual void macro_actions(netlist_t &anetlist, const pstring &name) {};
const pstring &name() const { return m_name; }
const pstring &classname() const { return m_classname; }
const pstring &param_desc() const { return m_def_param; }
const plib::pstring_vector_t term_param_list();
const plib::pstring_vector_t def_params();
protected:
pstring m_name; /* device name */

View File

@ -316,7 +316,7 @@ void parser_t::dippins()
error(plib::pfmt("expected a comma, found <{1}>")(n.str()) );
}
if ((pins.size() % 2) == 1)
error("You must pass an equal number of pins to DIPPINS");
error(plib::pfmt("You must pass an equal number of pins to DIPPINS, first pin is {}")(pins[0]));
std::size_t n = pins.size();
for (std::size_t i = 0; i < n / 2; i++)
{
@ -356,35 +356,29 @@ void parser_t::netdev_hint()
void parser_t::device(const pstring &dev_type)
{
if (m_setup.is_library_item(dev_type))
base_factory_t *f = m_setup.factory().factory_by_name(dev_type);
auto paramlist = plib::pstring_vector_t(f->param_desc(), ",");
pstring devname = get_identifier();
m_setup.register_dev(dev_type, m_setup.build_fqn(devname));
m_setup.log().debug("Parser: IC: {1}\n", devname);
for (pstring tp : paramlist)
{
pstring devname = get_identifier();
m_setup.namespace_push(devname);
m_setup.include(dev_type);
m_setup.namespace_pop();
require_token(m_tok_param_right);
}
else
{
base_factory_t *f = m_setup.factory().factory_by_name(dev_type);
plib::pstring_vector_t termlist = f->term_param_list();
plib::pstring_vector_t def_params = f->def_params();
std::size_t cnt;
pstring devname = get_identifier();
m_setup.register_dev(dev_type, m_setup.build_fqn(devname));
m_setup.log().debug("Parser: IC: {1}\n", devname);
cnt = 0;
while (cnt < def_params.size())
require_token(m_tok_comma);
if (tp.startsWith("+"))
{
pstring paramfq = devname + "." + def_params[cnt];
pstring output_name = get_identifier();
m_setup.log().debug("Link: {1} {2}\n", tp, output_name);
m_setup.register_link(devname + "." + tp.substr(1), output_name);
}
else
{
pstring paramfq = devname + "." + tp;
m_setup.log().debug("Defparam: {1}\n", paramfq);
require_token(m_tok_comma);
token_t tok = get_token();
if (tok.is_type(STRING))
{
@ -395,24 +389,11 @@ void parser_t::device(const pstring &dev_type)
nl_double val = eval_param(tok);
m_setup.register_param(paramfq, val);
}
cnt++;
}
token_t tok = get_token();
cnt = 0;
while (tok.is(m_tok_comma) && cnt < termlist.size())
{
pstring output_name = get_identifier();
m_setup.register_link(devname + "." + termlist[cnt], output_name);
cnt++;
tok = get_token();
}
if (cnt != termlist.size())
error(plib::pfmt("Input count mismatch for {1} - expected {2} found {3}")(devname)(termlist.size())(cnt));
require_token(tok, m_tok_param_right);
}
// error(plib::pfmt("Input count mismatch for {1} - expected {2} found {3}")(devname)(termlist.size())(cnt));
require_token(m_tok_param_right);
}

View File

@ -103,27 +103,17 @@ void setup_t::namespace_pop()
void setup_t::register_lib_entry(const pstring &name)
{
if (plib::container::contains(m_lib, name))
log().warning("Lib entry collection already contains {1}. IGNORED", name);
else
m_lib.push_back(name);
factory().register_device(plib::make_unique_base<base_factory_t, devices::factory_lib_entry_t>(*this, name, name, ""));
}
void setup_t::register_dev(const pstring &classname, const pstring &name)
{
if (plib::container::contains(m_lib, classname))
{
namespace_push(name);
include(classname);
namespace_pop();
}
else
{
auto f = factory().factory_by_name(classname);
if (f == nullptr)
log().fatal("Class {1} not found!\n", classname);
m_device_factory.push_back(std::pair<pstring, base_factory_t *>(build_fqn(name), f));
}
auto f = factory().factory_by_name(classname);
if (f == nullptr)
log().fatal("Class {1} not found!\n", classname);
/* make sure we parse macro library entries */
f->macro_actions(netlist(), build_fqn(name));
m_device_factory.push_back(std::pair<pstring, base_factory_t *>(build_fqn(name), f));
}
bool setup_t::device_exists(const pstring name) const
@ -165,7 +155,7 @@ void setup_t::register_dippins_arr(const pstring &terms)
{
plib::pstring_vector_t list(terms,", ");
if (list.size() == 0 || (list.size() % 2) == 1)
log().fatal("You must pass an equal number of pins to DIPPINS");
log().fatal("You must pass an equal number of pins to DIPPINS {1}" , build_fqn(""));
std::size_t n = list.size();
for (std::size_t i = 0; i < n / 2; i++)
{
@ -349,7 +339,7 @@ const pstring setup_t::resolve_alias(const pstring &name) const
ret = temp;
auto p = m_alias.find(ret);
temp = (p != m_alias.end() ? p->second : "");
} while (temp != "");
} while (temp != "" && temp != ret);
log().debug("{1}==>{2}\n", name, ret);
return ret;
@ -1040,7 +1030,8 @@ std::unique_ptr<plib::pistream> setup_t::get_data_stream(const pstring name)
return strm;
}
}
log().fatal("unable to find data named {1} in source collection", name);
//log().fatal("unable to find data named {1} in source collection", name);
log().warning("unable to find data named {1} in source collection", name);
return std::unique_ptr<plib::pistream>(nullptr);
}

View File

@ -92,7 +92,7 @@ void NETLIST_NAME(name)(netlist::setup_t &setup) \
desc.classname = #cname ; \
desc.ni = in; \
desc.no = out; \
desc.def_param = pstring("+") + def_params; \
desc.def_param = def_params; \
desc.family = "";
#define TT_HEAD(x) \
@ -255,8 +255,6 @@ namespace netlist
factory_list_t &factory() { return m_factory; }
const factory_list_t &factory() const { return m_factory; }
bool is_library_item(const pstring &name) const { return plib::container::contains(m_lib, name); }
/* model / family related */
const logic_family_desc_t *family_from_model(const pstring &model);
@ -311,7 +309,6 @@ namespace netlist
std::stack<pstring> m_namespace_stack;
source_t::list_t m_sources;
std::vector<plib::ppreprocessor::define_t> m_defines;
std::vector<pstring> m_lib;
unsigned m_proxy_cnt;
unsigned m_frontier_cnt;

View File

@ -45,6 +45,11 @@ namespace plib
con.insert(con.begin() + static_cast<std::ptrdiff_t>(index), elem);
}
template <class C>
void remove(C &con, const typename C::value_type &elem)
{
con.erase(std::remove(con.begin(), con.end(), elem), con.end());
}
}
template <class C>

View File

@ -363,6 +363,7 @@ static void listdevices(tool_options_t &opts)
pstring out = plib::pfmt("{1} {2}(<id>")(f->classname(),"-20")(f->name());
std::vector<pstring> terms;
f->macro_actions(nt.setup().netlist(), f->name() + "_lc");
auto d = f->Create(nt.setup().netlist(), f->name() + "_lc");
// get the list of terminals ...
@ -395,18 +396,13 @@ static void listdevices(tool_options_t &opts)
}
}
if (f->param_desc().startsWith("+"))
out += "," + f->param_desc();
for (auto p : plib::pstring_vector_t(f->param_desc(),",") )
{
out += "," + f->param_desc().substr(1);
terms.clear();
}
else if (f->param_desc() == "-")
{
/* no params at all */
}
else
{
out += "," + f->param_desc();
if (p.startsWith("+"))
{
plib::container::remove(terms, p.substr(1));
}
}
out += ")";
printf("%s\n", out.c_str());