mirror of
https://github.com/holub/mame
synced 2025-06-29 15:38:53 +03:00
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:
parent
a64328499c
commit
9a7b32f29d
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
@ -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")
|
||||
|
@ -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
|
||||
// -----------------------------------------------------------------------------
|
||||
|
@ -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_ */
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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 ¶m_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 */
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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>
|
||||
|
@ -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());
|
||||
|
Loading…
Reference in New Issue
Block a user