diff options
author | couriersud <couriersud@gmx.org> | 2020-08-26 09:06:05 +0200 |
---|---|---|
committer | couriersud <couriersud@gmx.org> | 2020-08-26 22:12:57 +0200 |
commit | e00a6ccf414eaa8b02ae22fde42558667b820e7b (patch) | |
tree | 72a4a37dacbaa03febc382aa9fc9aa593c1b01e2 | |
parent | 654be7c635752c92ed24e24a1acc1f877e613380 (diff) |
netlist: Truth tables are now standalone objects.
* Added TRUTHTABLE_ENTRY to netlist language.
* Please see nlm_ttl74xx for reference implementation.
-rw-r--r-- | src/lib/netlist/macro/nlm_cd4xxx_lib.cpp | 67 | ||||
-rw-r--r-- | src/lib/netlist/macro/nlm_otheric_lib.cpp | 17 | ||||
-rw-r--r-- | src/lib/netlist/macro/nlm_ttl74xx_lib.cpp | 700 | ||||
-rw-r--r-- | src/lib/netlist/nl_errstr.h | 15 | ||||
-rw-r--r-- | src/lib/netlist/nl_factory.cpp | 21 | ||||
-rw-r--r-- | src/lib/netlist/nl_factory.h | 1 | ||||
-rw-r--r-- | src/lib/netlist/nl_parser.cpp | 39 | ||||
-rw-r--r-- | src/lib/netlist/nl_parser.h | 1 | ||||
-rw-r--r-- | src/lib/netlist/nl_setup.cpp | 2 | ||||
-rw-r--r-- | src/lib/netlist/nl_setup.h | 8 |
10 files changed, 470 insertions, 401 deletions
diff --git a/src/lib/netlist/macro/nlm_cd4xxx_lib.cpp b/src/lib/netlist/macro/nlm_cd4xxx_lib.cpp index db46f187f55..fbeec12b261 100644 --- a/src/lib/netlist/macro/nlm_cd4xxx_lib.cpp +++ b/src/lib/netlist/macro/nlm_cd4xxx_lib.cpp @@ -570,39 +570,44 @@ static NETLIST_START(MM5837_DIP) ) NETLIST_END() +static TRUTHTABLE_START(CD4001_GATE, 2, 1, "") + TT_HEAD("A , B | Q ") + TT_LINE("0,0|1|110") + TT_LINE("X,1|0|120") + TT_LINE("1,X|0|120") + TT_FAMILY("CD4XXX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(CD4011_GATE, 2, 1, "") + TT_HEAD("A,B|Q ") + TT_LINE("0,X|1|100") + TT_LINE("X,0|1|100") + TT_LINE("1,1|0|100") + TT_FAMILY("CD4XXX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(CD4069_GATE, 1, 1, "") + TT_HEAD("A|Q ") + TT_LINE("0|1|55") + TT_LINE("1|0|55") + TT_FAMILY("CD4XXX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(CD4070_GATE, 2, 1, "") + TT_HEAD("A,B|Q ") + TT_LINE("0,0|0|15") + TT_LINE("0,1|1|22") + TT_LINE("1,0|1|22") + TT_LINE("1,1|0|15") + TT_FAMILY("CD4XXX") +TRUTHTABLE_END() + NETLIST_START(cd4xxx_lib) - TRUTHTABLE_START(CD4001_GATE, 2, 1, "") - TT_HEAD("A , B | Q ") - TT_LINE("0,0|1|110") - TT_LINE("X,1|0|120") - TT_LINE("1,X|0|120") - TT_FAMILY("CD4XXX") - TRUTHTABLE_END() - - TRUTHTABLE_START(CD4011_GATE, 2, 1, "") - TT_HEAD("A,B|Q ") - TT_LINE("0,X|1|100") - TT_LINE("X,0|1|100") - TT_LINE("1,1|0|100") - TT_FAMILY("CD4XXX") - TRUTHTABLE_END() - - TRUTHTABLE_START(CD4069_GATE, 1, 1, "") - TT_HEAD("A|Q ") - TT_LINE("0|1|55") - TT_LINE("1|0|55") - TT_FAMILY("CD4XXX") - TRUTHTABLE_END() - - TRUTHTABLE_START(CD4070_GATE, 2, 1, "") - TT_HEAD("A,B|Q ") - TT_LINE("0,0|0|15") - TT_LINE("0,1|1|22") - TT_LINE("1,0|1|22") - TT_LINE("1,1|0|15") - TT_FAMILY("CD4XXX") - TRUTHTABLE_END() + TRUTHTABLE_ENTRY(CD4001_GATE) + TRUTHTABLE_ENTRY(CD4011_GATE) + TRUTHTABLE_ENTRY(CD4069_GATE) + TRUTHTABLE_ENTRY(CD4070_GATE) LOCAL_LIB_ENTRY(CD4001_DIP) LOCAL_LIB_ENTRY(CD4011_DIP) diff --git a/src/lib/netlist/macro/nlm_otheric_lib.cpp b/src/lib/netlist/macro/nlm_otheric_lib.cpp index 46f9de61608..ad8f42af11b 100644 --- a/src/lib/netlist/macro/nlm_otheric_lib.cpp +++ b/src/lib/netlist/macro/nlm_otheric_lib.cpp @@ -235,14 +235,17 @@ static NETLIST_START(MC1455P_DIP) NETLIST_END() +static TRUTHTABLE_START(MC14584B_GATE, 1, 1, "") + TT_HEAD(" A | Q ") + TT_LINE(" 0 | 1 |100") + TT_LINE(" 1 | 0 |100") + // 2.1V negative going and 2.7V positive going at 5V + TT_FAMILY("FAMILY(TYPE=CMOS IVL=0.42 IVH=0.54 OVL=0.05 OVH=0.05 ORL=10.0 ORH=10.0)") +TRUTHTABLE_END() + NETLIST_START(otheric_lib) - TRUTHTABLE_START(MC14584B_GATE, 1, 1, "") - TT_HEAD(" A | Q ") - TT_LINE(" 0 | 1 |100") - TT_LINE(" 1 | 0 |100") - // 2.1V negative going and 2.7V positive going at 5V - TT_FAMILY("FAMILY(TYPE=CMOS IVL=0.42 IVH=0.54 OVL=0.05 OVH=0.05 ORL=10.0 ORH=10.0)") - TRUTHTABLE_END() + + TRUTHTABLE_ENTRY(MC14584B_GATE) LOCAL_LIB_ENTRY(MC14584B_DIP) LOCAL_LIB_ENTRY(NE566_DIP) diff --git a/src/lib/netlist/macro/nlm_ttl74xx_lib.cpp b/src/lib/netlist/macro/nlm_ttl74xx_lib.cpp index 54044f67056..c720cb8f3e2 100644 --- a/src/lib/netlist/macro/nlm_ttl74xx_lib.cpp +++ b/src/lib/netlist/macro/nlm_ttl74xx_lib.cpp @@ -3308,6 +3308,339 @@ static NETLIST_START(TTL_AM2847_DIP) ) NETLIST_END() +static TRUTHTABLE_START(TTL_7400_NAND, 2, 1, "+A,+B,@VCC,@GND") + TT_HEAD("A,B|Q ") + TT_LINE("0,X|1|22") + TT_LINE("X,0|1|22") + TT_LINE("1,1|0|15") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7402_NOR, 2, 1, "+A,+B,@VCC,@GND") + TT_HEAD("A,B|Q ") + TT_LINE("0,0|1|22") + TT_LINE("X,1|0|15") + TT_LINE("1,X|0|15") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7404_INVERT, 1, 1, "+A,@VCC,@GND") + TT_HEAD(" A | Q ") + TT_LINE(" 0 | 1 |22") + TT_LINE(" 1 | 0 |15") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7406_GATE, 1, 1, "") + TT_HEAD("A|Y ") + TT_LINE("0|1|15") + TT_LINE("1|0|23") + /* Open Collector */ + TT_FAMILY("74XXOC") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7407_GATE, 1, 1, "") + TT_HEAD("A|Y ") + TT_LINE("0|0|15") + TT_LINE("1|1|23") + /* Open Collector */ + TT_FAMILY("74XXOC") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7408_GATE, 2, 1, "") + TT_HEAD("A,B|Q ") + TT_LINE("0,X|0|15") + TT_LINE("X,0|0|15") + TT_LINE("1,1|1|22") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7408_AND, 2, 1, "+A,+B,@VCC,@GND") + TT_HEAD("A,B|Q ") + TT_LINE("0,X|0|15") + TT_LINE("X,0|0|15") + TT_LINE("1,1|1|22") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7410_NAND, 3, 1, "+A,+B,+C,@VCC,@GND") + TT_HEAD("A,B,C|Q ") + TT_LINE("0,X,X|1|22") + TT_LINE("X,0,X|1|22") + TT_LINE("X,X,0|1|22") + TT_LINE("1,1,1|0|15") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7410_GATE, 3, 1, "") + TT_HEAD("A,B,C|Q ") + TT_LINE("0,X,X|1|22") + TT_LINE("X,0,X|1|22") + TT_LINE("X,X,0|1|22") + TT_LINE("1,1,1|0|15") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7411_AND, 3, 1, "+A,+B,+C,@VCC,@GND") + TT_HEAD("A,B,C|Q ") + TT_LINE("0,X,X|0|15") + TT_LINE("X,0,X|0|15") + TT_LINE("X,X,0|0|15") + TT_LINE("1,1,1|1|22") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7411_GATE, 3, 1, "") + TT_HEAD("A,B,C|Q ") + TT_LINE("0,X,X|0|15") + TT_LINE("X,0,X|0|15") + TT_LINE("X,X,0|0|15") + TT_LINE("1,1,1|1|22") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7416_GATE, 1, 1, "") + TT_HEAD("A|Q") + TT_LINE("0|1|15") + TT_LINE("1|0|23") + /* Open Collector */ + TT_FAMILY("74XXOC") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7417_GATE, 1, 1, "") + TT_HEAD("A|Q") + TT_LINE("0|0|15") + TT_LINE("1|1|23") + /* Open Collector */ + TT_FAMILY("74XXOC") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7420_NAND, 4, 1, "+A,+B,+C,+D,@VCC,@GND") + TT_HEAD("A,B,C,D|Q ") + TT_LINE("0,X,X,X|1|22") + TT_LINE("X,0,X,X|1|22") + TT_LINE("X,X,0,X|1|22") + TT_LINE("X,X,X,0|1|22") + TT_LINE("1,1,1,1|0|15") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7421_AND, 4, 1, "+A,+B,+C,+D,@VCC,@GND") + TT_HEAD("A,B,C,D|Q ") + TT_LINE("0,X,X,X|0|22") + TT_LINE("X,0,X,X|0|22") + TT_LINE("X,X,0,X|0|22") + TT_LINE("X,X,X,0|0|22") + TT_LINE("1,1,1,1|1|15") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7425_NOR, 4, 1, "+A,+B,+C,+D,@VCC,@GND") + TT_HEAD("A,B,C,D|Q ") + TT_LINE("1,X,X,X|0|15") + TT_LINE("X,1,X,X|0|15") + TT_LINE("X,X,1,X|0|15") + TT_LINE("X,X,X,1|0|15") + TT_LINE("0,0,0,0|1|22") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7427_NOR, 3, 1, "+A,+B,+C,@VCC,@GND") + TT_HEAD("A,B,C|Q ") + TT_LINE("1,X,X|0|15") + TT_LINE("X,1,X|0|15") + TT_LINE("X,X,1|0|15") + TT_LINE("0,0,0|1|22") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7430_NAND, 8, 1, "+A,+B,+C,+D,+E,+F,+G,+H,@VCC,@GND") + 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") + TT_LINE("X,X,0,X,X,X,X,X|1|22") + TT_LINE("X,X,X,0,X,X,X,X|1|22") + TT_LINE("X,X,X,X,0,X,X,X|1|22") + TT_LINE("X,X,X,X,X,0,X,X|1|22") + TT_LINE("X,X,X,X,X,X,0,X|1|22") + TT_LINE("X,X,X,X,X,X,X,0|1|22") + TT_LINE("1,1,1,1,1,1,1,1|0|15") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7432_OR, 2, 1, "+A,+B,@VCC,@GND") + TT_HEAD("A,B|Q ") + TT_LINE("1,X|1|22") + TT_LINE("X,1|1|22") + TT_LINE("0,0|0|15") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +/* FIXME: Same as 7400, but drains higher output currents. + * Netlist currently does not model over currents (should it ever?) + */ + +static 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") + TT_LINE("1,1|0|15") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7438_NAND, 2, 1, "+A,+B") + TT_HEAD("A,B|Q ") + TT_LINE("0,X|1|22") + TT_LINE("X,0|1|22") + TT_LINE("1,1|0|15") + /* Open Collector */ + TT_FAMILY("74XXOC") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7442, 4, 10, "") + TT_HEAD("D,C,B,A|0,1,2,3,4,5,6,7,8,9") + TT_LINE("0,0,0,0|0,1,1,1,1,1,1,1,1,1|30,30,30,30,30,30,30,30,30,30") + TT_LINE("0,0,0,1|1,0,1,1,1,1,1,1,1,1|30,30,30,30,30,30,30,30,30,30") + TT_LINE("0,0,1,0|1,1,0,1,1,1,1,1,1,1|30,30,30,30,30,30,30,30,30,30") + TT_LINE("0,0,1,1|1,1,1,0,1,1,1,1,1,1|30,30,30,30,30,30,30,30,30,30") + TT_LINE("0,1,0,0|1,1,1,1,0,1,1,1,1,1|30,30,30,30,30,30,30,30,30,30") + TT_LINE("0,1,0,1|1,1,1,1,1,0,1,1,1,1|30,30,30,30,30,30,30,30,30,30") + TT_LINE("0,1,1,0|1,1,1,1,1,1,0,1,1,1|30,30,30,30,30,30,30,30,30,30") + TT_LINE("0,1,1,1|1,1,1,1,1,1,1,0,1,1|30,30,30,30,30,30,30,30,30,30") + TT_LINE("1,0,0,0|1,1,1,1,1,1,1,1,0,1|30,30,30,30,30,30,30,30,30,30") + TT_LINE("1,0,0,1|1,1,1,1,1,1,1,1,1,0|30,30,30,30,30,30,30,30,30,30") + TT_LINE("1,0,1,X|1,1,1,1,1,1,1,1,1,1|30,30,30,30,30,30,30,30,30,30") + TT_LINE("1,1,X,X|1,1,1,1,1,1,1,1,1,1|30,30,30,30,30,30,30,30,30,30") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_7486_XOR, 2, 1, "+A,+B,@VCC,@GND") + TT_HEAD("A,B|Q ") + TT_LINE("0,0|0|15") + TT_LINE("0,1|1|22") + TT_LINE("1,0|1|22") + TT_LINE("1,1|0|15") + TT_FAMILY("74XX") +TRUTHTABLE_END() + + +static TRUTHTABLE_START(TTL_74139_GATE, 3, 4, "") + TT_HEAD("E,A,B|0,1,2,3") + TT_LINE("1,X,X|1,1,1,1|14") + TT_LINE("0,0,0|0,1,1,1|14") + TT_LINE("0,0,1|1,0,1,1|14") + TT_LINE("0,1,0|1,1,0,1|14") + TT_LINE("0,1,1|1,1,1,0|14") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_74155A_GATE, 4, 4, "") + TT_HEAD("B,A,G,C|0,1,2,3") + TT_LINE("X,X,1,X|1,1,1,1|13,13,13,13") + TT_LINE("X,X,0,0|1,1,1,1|13,13,13,13") + TT_LINE("0,0,0,1|0,1,1,1|13,13,13,13") + TT_LINE("0,1,0,1|1,0,1,1|13,13,13,13") + TT_LINE("1,0,0,1|1,1,0,1|13,13,13,13") + TT_LINE("1,1,0,1|1,1,1,0|13,13,13,13") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_74155B_GATE, 4, 4, "") + TT_HEAD("B,A,G,C|0,1,2,3") + TT_LINE("X,X,1,X|1,1,1,1|13,13,13,13") + TT_LINE("X,X,0,1|1,1,1,1|13,13,13,13") + TT_LINE("0,0,0,0|0,1,1,1|13,13,13,13") + TT_LINE("0,1,0,0|1,0,1,1|13,13,13,13") + TT_LINE("1,0,0,0|1,1,0,1|13,13,13,13") + TT_LINE("1,1,0,0|1,1,1,0|13,13,13,13") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_74156A_GATE, 4, 4, "") + TT_HEAD("B,A,G,C|0,1,2,3") + TT_LINE("X,X,1,X|1,1,1,1|13,13,13,13") + TT_LINE("X,X,0,0|1,1,1,1|13,13,13,13") + TT_LINE("0,0,0,1|0,1,1,1|13,13,13,13") + TT_LINE("0,1,0,1|1,0,1,1|13,13,13,13") + TT_LINE("1,0,0,1|1,1,0,1|13,13,13,13") + TT_LINE("1,1,0,1|1,1,1,0|13,13,13,13") + /* Open Collector */ + TT_FAMILY("74XXOC") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_74156B_GATE, 4, 4, "") + TT_HEAD("B,A,G,C|0,1,2,3") + TT_LINE("X,X,1,X|1,1,1,1|13,13,13,13") + TT_LINE("X,X,0,1|1,1,1,1|13,13,13,13") + TT_LINE("0,0,0,0|0,1,1,1|13,13,13,13") + TT_LINE("0,1,0,0|1,0,1,1|13,13,13,13") + TT_LINE("1,0,0,0|1,1,0,1|13,13,13,13") + TT_LINE("1,1,0,0|1,1,1,0|13,13,13,13") + /* Open Collector */ + TT_FAMILY("74XXOC") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_74157_GATE, 4, 4, "") + TT_HEAD("E,S,I,J|O") + TT_LINE("1,X,X,X|0|14") + TT_LINE("0,1,X,0|0|14") + TT_LINE("0,1,X,1|1|14") + TT_LINE("0,0,0,X|0|14") + TT_LINE("0,0,1,X|1|14") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_74260_NOR, 5, 1, "+A,+B,+C,+D,+E,@VCC,@GND") + 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") + TT_LINE("X,X,X,1,X|0|12") + TT_LINE("X,X,1,X,X|0|12") + TT_LINE("X,1,X,X,X|0|12") + TT_LINE("1,X,X,X,X|0|12") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +// FIXME: We need "private" devices +static TRUTHTABLE_START(TTL_74279A, 3, 1, "") + TT_HEAD("S,R,_Q|Q") + TT_LINE("0,X,X|1|22") + TT_LINE("1,0,X|0|27") + TT_LINE("1,1,0|0|27") + TT_LINE("1,1,1|1|22") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_74279B, 4, 1, "") + TT_HEAD("S1,S2,R,_Q|Q") + TT_LINE("0,X,X,X|1|22") + TT_LINE("X,0,X,X|1|22") + TT_LINE("1,1,0,X|0|27") + TT_LINE("1,1,1,0|0|27") + TT_LINE("1,1,1,1|1|22") + TT_FAMILY("74XX") +TRUTHTABLE_END() + +static TRUTHTABLE_START(TTL_9312, 12, 2, "+A,+B,+C,+G,+D0,+D1,+D2,+D3,+D4,+D5,+D6,+D7,@VCC,@GND") + TT_HEAD(" C, B, A, G,D0,D1,D2,D3,D4,D5,D6,D7| Y,YQ") + TT_LINE(" X, X, X, 1, X, X, X, X, X, X, X, X| 0, 1|33,19") + TT_LINE(" 0, 0, 0, 0, 0, X, X, X, X, X, X, X| 0, 1|33,28") + TT_LINE(" 0, 0, 0, 0, 1, X, X, X, X, X, X, X| 1, 0|33,28") + TT_LINE(" 0, 0, 1, 0, X, 0, X, X, X, X, X, X| 0, 1|33,28") + TT_LINE(" 0, 0, 1, 0, X, 1, X, X, X, X, X, X| 1, 0|33,28") + TT_LINE(" 0, 1, 0, 0, X, X, 0, X, X, X, X, X| 0, 1|33,28") + TT_LINE(" 0, 1, 0, 0, X, X, 1, X, X, X, X, X| 1, 0|33,28") + TT_LINE(" 0, 1, 1, 0, X, X, X, 0, X, X, X, X| 0, 1|33,28") + TT_LINE(" 0, 1, 1, 0, X, X, X, 1, X, X, X, X| 1, 0|33,28") + TT_LINE(" 1, 0, 0, 0, X, X, X, X, 0, X, X, X| 0, 1|33,28") + TT_LINE(" 1, 0, 0, 0, X, X, X, X, 1, X, X, X| 1, 0|33,28") + TT_LINE(" 1, 0, 1, 0, X, X, X, X, X, 0, X, X| 0, 1|33,28") + TT_LINE(" 1, 0, 1, 0, X, X, X, X, X, 1, X, X| 1, 0|33,28") + TT_LINE(" 1, 1, 0, 0, X, X, X, X, X, X, 0, X| 0, 1|33,28") + TT_LINE(" 1, 1, 0, 0, X, X, X, X, X, X, 1, X| 1, 0|33,28") + TT_LINE(" 1, 1, 1, 0, X, X, X, X, X, X, X, 0| 0, 1|33,28") + TT_LINE(" 1, 1, 1, 0, X, X, X, X, X, X, X, 1| 1, 0|33,28") + TT_FAMILY("74XX") +TRUTHTABLE_END() NETLIST_START(ttl74xx_lib) NET_MODEL("DM7414 SCHMITT_TRIGGER(VTP=1.7 VTM=0.9 VI=4.35 RI=6.15k VOH=3.5 ROH=120 VOL=0.1 ROL=37.5 TPLH=15 TPHL=15)") @@ -3315,340 +3648,39 @@ NETLIST_START(ttl74xx_lib) NET_MODEL("DM74LS14 SCHMITT_TRIGGER(VTP=1.6 VTM=0.8 VI=4.4 RI=19.3k VOH=3.45 ROH=130 VOL=0.1 ROL=31.2 TPLH=15 TPHL=15)") //NET_MODEL("DM7414 FAMILY(IVL=0.16 IVH=0.4 OVL=0.1 OVH=0.05 ORL=10.0 ORH=1.0e8)") - - TRUTHTABLE_START(TTL_7400_NAND, 2, 1, "+A,+B,@VCC,@GND") - TT_HEAD("A,B|Q ") - TT_LINE("0,X|1|22") - TT_LINE("X,0|1|22") - TT_LINE("1,1|0|15") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7402_NOR, 2, 1, "+A,+B,@VCC,@GND") - TT_HEAD("A,B|Q ") - TT_LINE("0,0|1|22") - TT_LINE("X,1|0|15") - TT_LINE("1,X|0|15") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7404_INVERT, 1, 1, "+A,@VCC,@GND") - TT_HEAD(" A | Q ") - TT_LINE(" 0 | 1 |22") - TT_LINE(" 1 | 0 |15") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7406_GATE, 1, 1, "") - TT_HEAD("A|Y ") - TT_LINE("0|1|15") - TT_LINE("1|0|23") - /* Open Collector */ - TT_FAMILY("74XXOC") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7407_GATE, 1, 1, "") - TT_HEAD("A|Y ") - TT_LINE("0|0|15") - TT_LINE("1|1|23") - /* Open Collector */ - TT_FAMILY("74XXOC") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7408_GATE, 2, 1, "") - TT_HEAD("A,B|Q ") - TT_LINE("0,X|0|15") - TT_LINE("X,0|0|15") - TT_LINE("1,1|1|22") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7408_AND, 2, 1, "+A,+B,@VCC,@GND") - TT_HEAD("A,B|Q ") - TT_LINE("0,X|0|15") - TT_LINE("X,0|0|15") - TT_LINE("1,1|1|22") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7410_NAND, 3, 1, "+A,+B,+C,@VCC,@GND") - TT_HEAD("A,B,C|Q ") - TT_LINE("0,X,X|1|22") - TT_LINE("X,0,X|1|22") - TT_LINE("X,X,0|1|22") - TT_LINE("1,1,1|0|15") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7410_GATE, 3, 1, "") - TT_HEAD("A,B,C|Q ") - TT_LINE("0,X,X|1|22") - TT_LINE("X,0,X|1|22") - TT_LINE("X,X,0|1|22") - TT_LINE("1,1,1|0|15") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7411_AND, 3, 1, "+A,+B,+C,@VCC,@GND") - TT_HEAD("A,B,C|Q ") - TT_LINE("0,X,X|0|15") - TT_LINE("X,0,X|0|15") - TT_LINE("X,X,0|0|15") - TT_LINE("1,1,1|1|22") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7411_GATE, 3, 1, "") - TT_HEAD("A,B,C|Q ") - TT_LINE("0,X,X|0|15") - TT_LINE("X,0,X|0|15") - TT_LINE("X,X,0|0|15") - TT_LINE("1,1,1|1|22") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7416_GATE, 1, 1, "") - TT_HEAD("A|Q") - TT_LINE("0|1|15") - TT_LINE("1|0|23") - /* Open Collector */ - TT_FAMILY("74XXOC") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7417_GATE, 1, 1, "") - TT_HEAD("A|Q") - TT_LINE("0|0|15") - TT_LINE("1|1|23") - /* Open Collector */ - TT_FAMILY("74XXOC") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7420_NAND, 4, 1, "+A,+B,+C,+D,@VCC,@GND") - TT_HEAD("A,B,C,D|Q ") - TT_LINE("0,X,X,X|1|22") - TT_LINE("X,0,X,X|1|22") - TT_LINE("X,X,0,X|1|22") - TT_LINE("X,X,X,0|1|22") - TT_LINE("1,1,1,1|0|15") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7421_AND, 4, 1, "+A,+B,+C,+D,@VCC,@GND") - TT_HEAD("A,B,C,D|Q ") - TT_LINE("0,X,X,X|0|22") - TT_LINE("X,0,X,X|0|22") - TT_LINE("X,X,0,X|0|22") - TT_LINE("X,X,X,0|0|22") - TT_LINE("1,1,1,1|1|15") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7425_NOR, 4, 1, "+A,+B,+C,+D,@VCC,@GND") - TT_HEAD("A,B,C,D|Q ") - TT_LINE("1,X,X,X|0|15") - TT_LINE("X,1,X,X|0|15") - TT_LINE("X,X,1,X|0|15") - TT_LINE("X,X,X,1|0|15") - TT_LINE("0,0,0,0|1|22") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7427_NOR, 3, 1, "+A,+B,+C,@VCC,@GND") - TT_HEAD("A,B,C|Q ") - TT_LINE("1,X,X|0|15") - TT_LINE("X,1,X|0|15") - TT_LINE("X,X,1|0|15") - TT_LINE("0,0,0|1|22") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7430_NAND, 8, 1, "+A,+B,+C,+D,+E,+F,+G,+H,@VCC,@GND") - 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") - TT_LINE("X,X,0,X,X,X,X,X|1|22") - TT_LINE("X,X,X,0,X,X,X,X|1|22") - TT_LINE("X,X,X,X,0,X,X,X|1|22") - TT_LINE("X,X,X,X,X,0,X,X|1|22") - TT_LINE("X,X,X,X,X,X,0,X|1|22") - TT_LINE("X,X,X,X,X,X,X,0|1|22") - TT_LINE("1,1,1,1,1,1,1,1|0|15") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7432_OR, 2, 1, "+A,+B,@VCC,@GND") - TT_HEAD("A,B|Q ") - TT_LINE("1,X|1|22") - TT_LINE("X,1|1|22") - TT_LINE("0,0|0|15") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - /* FIXME: Same as 7400, but drains higher output currents. - * Netlist currently does not model over currents (should it ever?) - */ - - 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") - TT_LINE("1,1|0|15") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7438_NAND, 2, 1, "+A,+B") - TT_HEAD("A,B|Q ") - TT_LINE("0,X|1|22") - TT_LINE("X,0|1|22") - TT_LINE("1,1|0|15") - /* Open Collector */ - TT_FAMILY("74XXOC") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7442, 4, 10, "") - TT_HEAD("D,C,B,A|0,1,2,3,4,5,6,7,8,9") - TT_LINE("0,0,0,0|0,1,1,1,1,1,1,1,1,1|30,30,30,30,30,30,30,30,30,30") - TT_LINE("0,0,0,1|1,0,1,1,1,1,1,1,1,1|30,30,30,30,30,30,30,30,30,30") - TT_LINE("0,0,1,0|1,1,0,1,1,1,1,1,1,1|30,30,30,30,30,30,30,30,30,30") - TT_LINE("0,0,1,1|1,1,1,0,1,1,1,1,1,1|30,30,30,30,30,30,30,30,30,30") - TT_LINE("0,1,0,0|1,1,1,1,0,1,1,1,1,1|30,30,30,30,30,30,30,30,30,30") - TT_LINE("0,1,0,1|1,1,1,1,1,0,1,1,1,1|30,30,30,30,30,30,30,30,30,30") - TT_LINE("0,1,1,0|1,1,1,1,1,1,0,1,1,1|30,30,30,30,30,30,30,30,30,30") - TT_LINE("0,1,1,1|1,1,1,1,1,1,1,0,1,1|30,30,30,30,30,30,30,30,30,30") - TT_LINE("1,0,0,0|1,1,1,1,1,1,1,1,0,1|30,30,30,30,30,30,30,30,30,30") - TT_LINE("1,0,0,1|1,1,1,1,1,1,1,1,1,0|30,30,30,30,30,30,30,30,30,30") - TT_LINE("1,0,1,X|1,1,1,1,1,1,1,1,1,1|30,30,30,30,30,30,30,30,30,30") - TT_LINE("1,1,X,X|1,1,1,1,1,1,1,1,1,1|30,30,30,30,30,30,30,30,30,30") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_7486_XOR, 2, 1, "+A,+B,@VCC,@GND") - TT_HEAD("A,B|Q ") - TT_LINE("0,0|0|15") - TT_LINE("0,1|1|22") - TT_LINE("1,0|1|22") - TT_LINE("1,1|0|15") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - - TRUTHTABLE_START(TTL_74139_GATE, 3, 4, "") - TT_HEAD("E,A,B|0,1,2,3") - TT_LINE("1,X,X|1,1,1,1|14") - TT_LINE("0,0,0|0,1,1,1|14") - TT_LINE("0,0,1|1,0,1,1|14") - TT_LINE("0,1,0|1,1,0,1|14") - TT_LINE("0,1,1|1,1,1,0|14") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_74155A_GATE, 4, 4, "") - TT_HEAD("B,A,G,C|0,1,2,3") - TT_LINE("X,X,1,X|1,1,1,1|13,13,13,13") - TT_LINE("X,X,0,0|1,1,1,1|13,13,13,13") - TT_LINE("0,0,0,1|0,1,1,1|13,13,13,13") - TT_LINE("0,1,0,1|1,0,1,1|13,13,13,13") - TT_LINE("1,0,0,1|1,1,0,1|13,13,13,13") - TT_LINE("1,1,0,1|1,1,1,0|13,13,13,13") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_74155B_GATE, 4, 4, "") - TT_HEAD("B,A,G,C|0,1,2,3") - TT_LINE("X,X,1,X|1,1,1,1|13,13,13,13") - TT_LINE("X,X,0,1|1,1,1,1|13,13,13,13") - TT_LINE("0,0,0,0|0,1,1,1|13,13,13,13") - TT_LINE("0,1,0,0|1,0,1,1|13,13,13,13") - TT_LINE("1,0,0,0|1,1,0,1|13,13,13,13") - TT_LINE("1,1,0,0|1,1,1,0|13,13,13,13") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_74156A_GATE, 4, 4, "") - TT_HEAD("B,A,G,C|0,1,2,3") - TT_LINE("X,X,1,X|1,1,1,1|13,13,13,13") - TT_LINE("X,X,0,0|1,1,1,1|13,13,13,13") - TT_LINE("0,0,0,1|0,1,1,1|13,13,13,13") - TT_LINE("0,1,0,1|1,0,1,1|13,13,13,13") - TT_LINE("1,0,0,1|1,1,0,1|13,13,13,13") - TT_LINE("1,1,0,1|1,1,1,0|13,13,13,13") - /* Open Collector */ - TT_FAMILY("74XXOC") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_74156B_GATE, 4, 4, "") - TT_HEAD("B,A,G,C|0,1,2,3") - TT_LINE("X,X,1,X|1,1,1,1|13,13,13,13") - TT_LINE("X,X,0,1|1,1,1,1|13,13,13,13") - TT_LINE("0,0,0,0|0,1,1,1|13,13,13,13") - TT_LINE("0,1,0,0|1,0,1,1|13,13,13,13") - TT_LINE("1,0,0,0|1,1,0,1|13,13,13,13") - TT_LINE("1,1,0,0|1,1,1,0|13,13,13,13") - /* Open Collector */ - TT_FAMILY("74XXOC") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_74157_GATE, 4, 4, "") - TT_HEAD("E,S,I,J|O") - TT_LINE("1,X,X,X|0|14") - TT_LINE("0,1,X,0|0|14") - TT_LINE("0,1,X,1|1|14") - TT_LINE("0,0,0,X|0|14") - TT_LINE("0,0,1,X|1|14") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_74260_NOR, 5, 1, "+A,+B,+C,+D,+E,@VCC,@GND") - 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") - TT_LINE("X,X,X,1,X|0|12") - TT_LINE("X,X,1,X,X|0|12") - TT_LINE("X,1,X,X,X|0|12") - TT_LINE("1,X,X,X,X|0|12") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - // FIXME: We need "private" devices - TRUTHTABLE_START(TTL_74279A, 3, 1, "") - TT_HEAD("S,R,_Q|Q") - TT_LINE("0,X,X|1|22") - TT_LINE("1,0,X|0|27") - TT_LINE("1,1,0|0|27") - TT_LINE("1,1,1|1|22") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_74279B, 4, 1, "") - TT_HEAD("S1,S2,R,_Q|Q") - TT_LINE("0,X,X,X|1|22") - TT_LINE("X,0,X,X|1|22") - TT_LINE("1,1,0,X|0|27") - TT_LINE("1,1,1,0|0|27") - TT_LINE("1,1,1,1|1|22") - TT_FAMILY("74XX") - TRUTHTABLE_END() - - TRUTHTABLE_START(TTL_9312, 12, 2, "+A,+B,+C,+G,+D0,+D1,+D2,+D3,+D4,+D5,+D6,+D7,@VCC,@GND") - TT_HEAD(" C, B, A, G,D0,D1,D2,D3,D4,D5,D6,D7| Y,YQ") - TT_LINE(" X, X, X, 1, X, X, X, X, X, X, X, X| 0, 1|33,19") - TT_LINE(" 0, 0, 0, 0, 0, X, X, X, X, X, X, X| 0, 1|33,28") - TT_LINE(" 0, 0, 0, 0, 1, X, X, X, X, X, X, X| 1, 0|33,28") - TT_LINE(" 0, 0, 1, 0, X, 0, X, X, X, X, X, X| 0, 1|33,28") - TT_LINE(" 0, 0, 1, 0, X, 1, X, X, X, X, X, X| 1, 0|33,28") - TT_LINE(" 0, 1, 0, 0, X, X, 0, X, X, X, X, X| 0, 1|33,28") - TT_LINE(" 0, 1, 0, 0, X, X, 1, X, X, X, X, X| 1, 0|33,28") - TT_LINE(" 0, 1, 1, 0, X, X, X, 0, X, X, X, X| 0, 1|33,28") - TT_LINE(" 0, 1, 1, 0, X, X, X, 1, X, X, X, X| 1, 0|33,28") - TT_LINE(" 1, 0, 0, 0, X, X, X, X, 0, X, X, X| 0, 1|33,28") - TT_LINE(" 1, 0, 0, 0, X, X, X, X, 1, X, X, X| 1, 0|33,28") - TT_LINE(" 1, 0, 1, 0, X, X, X, X, X, 0, X, X| 0, 1|33,28") - TT_LINE(" 1, 0, 1, 0, X, X, X, X, X, 1, X, X| 1, 0|33,28") - TT_LINE(" 1, 1, 0, 0, X, X, X, X, X, X, 0, X| 0, 1|33,28") - TT_LINE(" 1, 1, 0, 0, X, X, X, X, X, X, 1, X| 1, 0|33,28") - TT_LINE(" 1, 1, 1, 0, X, X, X, X, X, X, X, 0| 0, 1|33,28") - TT_LINE(" 1, 1, 1, 0, X, X, X, X, X, X, X, 1| 1, 0|33,28") - TT_FAMILY("74XX") - TRUTHTABLE_END() + TRUTHTABLE_ENTRY(TTL_7400_NAND) + TRUTHTABLE_ENTRY(TTL_7402_NOR) + TRUTHTABLE_ENTRY(TTL_7404_INVERT) + TRUTHTABLE_ENTRY(TTL_7406_GATE) + TRUTHTABLE_ENTRY(TTL_7407_GATE) + TRUTHTABLE_ENTRY(TTL_7408_GATE) + TRUTHTABLE_ENTRY(TTL_7408_AND) + TRUTHTABLE_ENTRY(TTL_7410_NAND) + TRUTHTABLE_ENTRY(TTL_7410_GATE) + TRUTHTABLE_ENTRY(TTL_7411_AND) + TRUTHTABLE_ENTRY(TTL_7411_GATE) + TRUTHTABLE_ENTRY(TTL_7416_GATE) + TRUTHTABLE_ENTRY(TTL_7417_GATE) + TRUTHTABLE_ENTRY(TTL_7420_NAND) + TRUTHTABLE_ENTRY(TTL_7421_AND) + TRUTHTABLE_ENTRY(TTL_7425_NOR) + TRUTHTABLE_ENTRY(TTL_7427_NOR) + TRUTHTABLE_ENTRY(TTL_7430_NAND) + TRUTHTABLE_ENTRY(TTL_7432_OR) + TRUTHTABLE_ENTRY(TTL_7437_NAND) + TRUTHTABLE_ENTRY(TTL_7438_NAND) + TRUTHTABLE_ENTRY(TTL_7442) + TRUTHTABLE_ENTRY(TTL_7486_XOR) + TRUTHTABLE_ENTRY(TTL_74139_GATE) + TRUTHTABLE_ENTRY(TTL_74155A_GATE) + TRUTHTABLE_ENTRY(TTL_74155B_GATE) + TRUTHTABLE_ENTRY(TTL_74156A_GATE) + TRUTHTABLE_ENTRY(TTL_74156B_GATE) + TRUTHTABLE_ENTRY(TTL_74157_GATE) + TRUTHTABLE_ENTRY(TTL_74260_NOR) + TRUTHTABLE_ENTRY(TTL_74279A) + TRUTHTABLE_ENTRY(TTL_74279B) + TRUTHTABLE_ENTRY(TTL_9312) LOCAL_LIB_ENTRY(TTL_7400_DIP) LOCAL_LIB_ENTRY(TTL_7402_DIP) diff --git a/src/lib/netlist/nl_errstr.h b/src/lib/netlist/nl_errstr.h index 553387301d9..db15fccd6c8 100644 --- a/src/lib/netlist/nl_errstr.h +++ b/src/lib/netlist/nl_errstr.h @@ -25,7 +25,7 @@ namespace netlist PERRMSGV(MF_REMOVE_TERMINAL_1_FROM_NET_2, 2, "Can not remove terminal {1} from net {2}.") PERRMSGV(MF_UNKNOWN_PARAM_TYPE, 1, "Can not determine param_type for {1}") //PERRMSGV(MF_ERROR_CONNECTING_1_TO_2, 2, "Error connecting {1} to {2}") - PERRMSGV(ME_HND_VAL_NOT_SUPPORTED, 1, "HINT_NO_DEACTIVATE value not supported: <{1}>") + //PERRMSGV(ME_HND_VAL_NOT_SUPPORTED, 1, "HINT_NO_DEACTIVATE value not supported: <{1}>") PERRMSGV(MW_ROM_NOT_FOUND, 1, "Rom {1} not found") // nl_factory.cpp @@ -40,17 +40,19 @@ namespace netlist // nl_parser.cpp + PERRMSGV(MF_PARSER_UNEXPECTED_1, 1, "Unexpected {}") PERRMSGV(MF_UNEXPECTED_NETLIST_END, 0, "Unexpected NETLIST_END") PERRMSGV(MF_UNEXPECTED_END_OF_FILE, 0, "Unexpected end of file, missing NETLIST_END") - PERRMSGV(MF_UNEXPECTED_NETLIST_START, 0, "Unexpected NETLIST_START") + //PERRMSGV(MF_UNEXPECTED_NETLIST_START, 0, "Unexpected NETLIST_START") PERRMSGV(MF_UNEXPECTED_NETLIST_EXTERNAL, 0, "Unexpected NETLIST_EXTERNAL within a netlist") PERRMSGV(MF_EXPECTED_NETLIST_START_1, 1, "Expected NETLIST_START but got {1}") PERRMSGV(MF_EXPECTED_IDENTIFIER_GOT_1, 1, "Expected an identifier, but got {1}") PERRMSGV(MF_EXPECTED_COMMA_OR_RP_1, 1, "Expected comma or right parenthesis but found <{1}>") PERRMSGV(MF_DIPPINS_EQUAL_NUMBER_1, 1, "DIPPINS requires equal number of pins to DIPPINS, first pin is {}") - PERRMSGV(MF_PARAM_NOT_FP_1, 1, "Parameter value <{1}> not floating point") + //PERRMSGV(MF_PARAM_NOT_FP_1, 1, "Parameter value <{1}> not floating point") PERRMSGV(MF_TT_LINE_WITHOUT_HEAD, 0, "TT_LINE found without TT_HEAD") PERRMSGV(MF_LOCAL_SOURCE_NOT_FOUND_1, 1, "Local source not found: <{1}>") + PERRMSGV(MF_TRUTHTABLE_NOT_FOUND_1, 1, "Truthtable not found: <{1}>") // nl_setup.cpp @@ -65,7 +67,7 @@ namespace netlist PERRMSGV(MF_DIP_PINS_MUST_BE_AN_EQUAL_NUMBER_OF_PINS_1, 1,"You must pass an equal number of pins to DIPPINS {1}") PERRMSGV(MF_PARAM_COUNT_MISMATCH_2, 2, "Parameter count mismatch for {1} - only found {2}") PERRMSGV(MF_PARAM_COUNT_EXCEEDED_2, 2, "Parameter count exceed for {1} - found {2}") - PERRMSGV(MF_UNKNOWN_OBJECT_TYPE_1, 1, "Unknown object type {1}") + //PERRMSGV(MF_UNKNOWN_OBJECT_TYPE_1, 1, "Unknown object type {1}") PERRMSGV(MF_UNKNOWN_FAMILY_TYPE_1, 2, "Unknown family type {1} in model {2}") PERRMSGV(MF_INVALID_NUMBER_CONVERSION_1_2, 2, "Invalid number conversion {1} : {2}") PERRMSGV(MF_INVALID_ENUM_CONVERSION_1_2, 2, "Invalid element found {1} : {2}") @@ -116,11 +118,12 @@ namespace netlist "but has been forced to act as a logic output. Parameter " " FORCE_TRISTATE_LOGIC for device {2} needs to be disabled!.") - PERRMSGV(MI_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3, 3, "Found device {1} connected only to railterminals {2}/{3}. Please consider commenting those out.") + PERRMSGV(MI_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3, 3, "Found device {1} connected only to railterminals {2}/{3}." + " This may reflect the schematic - but as well be an error. Please review.") PERRMSGV(MW_DATA_1_NOT_FOUND, 1, "unable to find data {1} in sources collection") - PERRMSGV(ME_DEVICE_NOT_FOUND_FOR_HINT, 1, "Device not found for hint {1}") + //PERRMSGV(ME_DEVICE_NOT_FOUND_FOR_HINT, 1, "Device not found for hint {1}") PERRMSGV(ME_UNKNOWN_PARAMETER, 1, "Unknown parameter {1}") PERRMSGV(MF_ERRORS_FOUND, 1, "Counted {1} errors which need to be fixed") diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp index 9026bbfb6b1..3bf1fced5c3 100644 --- a/src/lib/netlist/nl_factory.cpp +++ b/src/lib/netlist/nl_factory.cpp @@ -41,14 +41,23 @@ namespace factory { { } - void list_t::add(host_arena::unique_ptr<element_t> &&factory) + bool exists(const pstring &name); + + bool list_t::exists(const pstring &name) const noexcept { for (auto & e : *this) - if (e->name() == factory->name()) - { - m_log.fatal(MF_FACTORY_ALREADY_CONTAINS_1(factory->name())); - throw nl_exception(MF_FACTORY_ALREADY_CONTAINS_1(factory->name())); - } + if (e->name() == name) + return true; + return false; + } + + void list_t::add(host_arena::unique_ptr<element_t> &&factory) + { + if (exists(factory->name())) + { + m_log.fatal(MF_FACTORY_ALREADY_CONTAINS_1(factory->name())); + throw nl_exception(MF_FACTORY_ALREADY_CONTAINS_1(factory->name())); + } push_back(std::move(factory)); } diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h index ad26a505453..02cce0db128 100644 --- a/src/lib/netlist/nl_factory.h +++ b/src/lib/netlist/nl_factory.h @@ -181,6 +181,7 @@ namespace factory { return dynamic_cast<device_element_t<C> *>(f) != nullptr; } + bool exists(const pstring &name) const noexcept; private: log_type &m_log; }; diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp index 85f78cabdd1..8b05d50429f 100644 --- a/src/lib/netlist/nl_parser.cpp +++ b/src/lib/netlist/nl_parser.cpp @@ -51,6 +51,7 @@ parser_t::parser_t(nlparse_t &setup) m_tok_EXTERNAL_SOURCE = m_tokenizer.register_token("EXTERNAL_SOURCE"); m_tok_TRUTHTABLE_START = m_tokenizer.register_token("TRUTHTABLE_START"); m_tok_TRUTHTABLE_END = m_tokenizer.register_token("TRUTHTABLE_END"); + m_tok_TRUTHTABLE_ENTRY = m_tokenizer.register_token("TRUTHTABLE_ENTRY"); m_tok_TT_HEAD = m_tokenizer.register_token("TT_HEAD"); m_tok_TT_LINE = m_tokenizer.register_token("TT_LINE"); m_tok_TT_FAMILY = m_tokenizer.register_token("TT_FAMILY"); @@ -93,11 +94,11 @@ bool parser_t::parse(const token_store &tokstor, const pstring &nlname) return false; } - if (token.is(m_tok_NETLIST_END)) + if (token.is(m_tok_NETLIST_END) || token.is(m_tok_TRUTHTABLE_END)) { require_token(m_tok_paren_left); if (!in_nl) - error (MF_UNEXPECTED_NETLIST_END()); + error (MF_PARSER_UNEXPECTED_1(token.str())); else { in_nl = false; @@ -109,18 +110,23 @@ bool parser_t::parse(const token_store &tokstor, const pstring &nlname) m_cur_local->push_back(token_t(m_tok_paren_right)); } - else if (token.is(m_tok_NETLIST_START)) + else if (token.is(m_tok_NETLIST_START) || token.is(m_tok_TRUTHTABLE_START)) { if (in_nl) - error (MF_UNEXPECTED_NETLIST_START()); + error (MF_PARSER_UNEXPECTED_1(token.str())); require_token(m_tok_paren_left); token_t name = get_token(); - require_token(m_tok_paren_right); - if (name.str() == nlname || nlname.empty()) + if (token.is(m_tok_NETLIST_START) && (name.str() == nlname || nlname.empty())) { + require_token(m_tok_paren_right); parse_netlist(name.str()); return true; } + if (token.is(m_tok_TRUTHTABLE_START) && name.str() == nlname) + { + net_truthtable_start(nlname); + return true; + } // create a new cached local store m_local.emplace(name.str(), token_store()); @@ -130,10 +136,10 @@ bool parser_t::parse(const token_store &tokstor, const pstring &nlname) auto num = plib::pfmt("{1}")(sl.line()); m_cur_local->push_back(token_t(token_type::NUMBER, num)); m_cur_local->push_back(token_t(token_type::STRING, sl.file_name())); - m_cur_local->push_back(token_t(m_tok_NETLIST_START)); + m_cur_local->push_back(token); m_cur_local->push_back(token_t(m_tok_paren_left)); m_cur_local->push_back(name); - m_cur_local->push_back(token_t(m_tok_paren_right)); + //m_cur_local->push_back(token_t(m_tok_paren_right)); in_nl = true; } else if (token.is(m_tok_NETLIST_EXTERNAL)) @@ -191,8 +197,8 @@ void parser_t::parse_netlist(const pstring &nlname) net_local_source(); else if (token.is(m_tok_EXTERNAL_SOURCE)) net_external_source(); - else if (token.is(m_tok_TRUTHTABLE_START)) - net_truthtable_start(nlname); + //else if (token.is(m_tok_TRUTHTABLE_START)) + // net_truthtable_start(nlname); else if (token.is(m_tok_LOCAL_LIB_ENTRY)) { require_token(m_tok_paren_left); @@ -202,6 +208,14 @@ void parser_t::parse_netlist(const pstring &nlname) m_setup.register_lib_entry(name, "", plib::source_location("parser: " + nlname, 1)); require_token(m_tok_paren_right); } + else if (token.is(m_tok_TRUTHTABLE_ENTRY)) + { + require_token(m_tok_paren_left); + pstring name(get_identifier()); + register_local_as_source(name); + m_setup.include(name); + require_token(m_tok_paren_right); + } else if (token.is(m_tok_NET_REGISTER_DEV)) { net_register_dev(); @@ -220,10 +234,9 @@ void parser_t::parse_netlist(const pstring &nlname) void parser_t::net_truthtable_start(const pstring &nlname) { - require_token(m_tok_paren_left); - pstring name(get_identifier()); bool head_found(false); + // parse remaining parameters require_token(m_tok_comma); long ni = get_number_long(); require_token(m_tok_comma); @@ -233,7 +246,7 @@ void parser_t::net_truthtable_start(const pstring &nlname) require_token(m_tok_paren_right); netlist::tt_desc desc; - desc.name = name; + desc.name = nlname; desc.ni = gsl::narrow<unsigned long>(ni); desc.no = gsl::narrow<unsigned long>(no); desc.family = ""; diff --git a/src/lib/netlist/nl_parser.h b/src/lib/netlist/nl_parser.h index 5e00c7c8470..99a42daed23 100644 --- a/src/lib/netlist/nl_parser.h +++ b/src/lib/netlist/nl_parser.h @@ -77,6 +77,7 @@ namespace netlist token_id_t m_tok_LOCAL_LIB_ENTRY; token_id_t m_tok_TRUTHTABLE_START; token_id_t m_tok_TRUTHTABLE_END; + token_id_t m_tok_TRUTHTABLE_ENTRY; token_id_t m_tok_TT_HEAD; token_id_t m_tok_TT_LINE; token_id_t m_tok_TT_FAMILY; diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index e8d6b1cf249..39d9144cd6d 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -1628,7 +1628,6 @@ void setup_t::prepare_to_run() // resolve inputs resolve_inputs(); -#if 0 log().verbose("looking for two terms connected to rail nets ..."); for (auto & t : m_nlstate.get_device_list<analog::NETLIB_NAME(twoterm)>()) { @@ -1644,7 +1643,6 @@ void setup_t::prepare_to_run() #endif } } -#endif log().verbose("looking for unused hints ..."); for (auto &h : m_abstract.m_hints) diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index 745032ab054..39dfb2dd747 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -110,7 +110,7 @@ void NETLIST_NAME(name)(netlist::nlparse_t &setup) \ // ----------------------------------------------------------------------------- #define TRUTHTABLE_START(cname, in, out, pdef_params) \ - { \ + NETLIST_START(cname) \ netlist::tt_desc desc; \ desc.name = #cname ; \ desc.ni = in; \ @@ -130,7 +130,11 @@ void NETLIST_NAME(name)(netlist::nlparse_t &setup) \ #define TRUTHTABLE_END() \ setup.truthtable_create(desc, def_params, std::move(sloc)); \ - } + NETLIST_END() + +#define TRUTHTABLE_ENTRY(name) \ + LOCAL_SOURCE(name) \ + INCLUDE(name) namespace netlist { |