diff options
27 files changed, 317 insertions, 226 deletions
diff --git a/src/emu/netlist/analog/nld_fourterm.c b/src/emu/netlist/analog/nld_fourterm.c index e2457d8ee11..ad67ccbba4b 100644 --- a/src/emu/netlist/analog/nld_fourterm.c +++ b/src/emu/netlist/analog/nld_fourterm.c @@ -50,6 +50,7 @@ NETLIB_RESET(VCCS) const nl_double m_mult = m_G.Value() * m_gfac; // 1.0 ==> 1V ==> 1A const nl_double GI = NL_FCONST(1.0) / m_RI.Value(); + //printf("VCCS %s RI %f\n", name().cstr(), m_RI.Value()); m_IP.set(GI); m_IN.set(GI); diff --git a/src/emu/netlist/analog/nld_opamps.h b/src/emu/netlist/analog/nld_opamps.h index 4433114a18c..722212b1763 100644 --- a/src/emu/netlist/analog/nld_opamps.h +++ b/src/emu/netlist/analog/nld_opamps.h @@ -19,7 +19,7 @@ // ---------------------------------------------------------------------------------------- #define LM3900(_name) \ - SUBMODEL(_name, opamp_lm3900) + SUBMODEL(opamp_lm3900, name) // ---------------------------------------------------------------------------------------- // Devices ... diff --git a/src/emu/netlist/analog/nld_solver.c b/src/emu/netlist/analog/nld_solver.c index 947cda58cbb..c7d4ac1cddc 100644 --- a/src/emu/netlist/analog/nld_solver.c +++ b/src/emu/netlist/analog/nld_solver.c @@ -508,6 +508,9 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start() case 12: ms = create_solver<12,12>(12, gs_threshold, use_specific); break; + case 87: + ms = create_solver<87,87>(87, gs_threshold, use_specific); + break; default: if (net_count <= 16) { @@ -521,9 +524,13 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start() { ms = create_solver<0,64>(net_count, gs_threshold, use_specific); } + else if (net_count <= 128) + { + ms = create_solver<0,128>(net_count, gs_threshold, use_specific); + } else { - netlist().error("Encountered netgroup with > 64 nets"); + netlist().error("Encountered netgroup with > 128 nets"); ms = NULL; /* tease compilers */ } diff --git a/src/emu/netlist/devices/nld_7400.c b/src/emu/netlist/devices/nld_7400.c index 758d5d1b667..91a1bfbf472 100644 --- a/src/emu/netlist/devices/nld_7400.c +++ b/src/emu/netlist/devices/nld_7400.c @@ -26,20 +26,20 @@ NETLIB_START(7400_dip) register_sub("3", m_3); register_sub("4", m_4); - register_subalias("1", m_1.m_i[0]); - register_subalias("2", m_1.m_i[1]); + register_subalias("1", m_1.m_I[0]); + register_subalias("2", m_1.m_I[1]); register_subalias("3", m_1.m_Q[0]); - register_subalias("4", m_2.m_i[0]); - register_subalias("5", m_2.m_i[1]); + register_subalias("4", m_2.m_I[0]); + register_subalias("5", m_2.m_I[1]); register_subalias("6", m_2.m_Q[0]); - register_subalias("9", m_3.m_i[0]); - register_subalias("10", m_3.m_i[1]); + register_subalias("9", m_3.m_I[0]); + register_subalias("10", m_3.m_I[1]); register_subalias("8", m_3.m_Q[0]); - register_subalias("12", m_4.m_i[0]); - register_subalias("13", m_4.m_i[1]); + register_subalias("12", m_4.m_I[0]); + register_subalias("13", m_4.m_I[1]); register_subalias("11", m_4.m_Q[0]); } diff --git a/src/emu/netlist/devices/nld_7402.c b/src/emu/netlist/devices/nld_7402.c index 708dab04fcf..f64f5e4ba96 100644 --- a/src/emu/netlist/devices/nld_7402.c +++ b/src/emu/netlist/devices/nld_7402.c @@ -27,19 +27,19 @@ NETLIB_START(7402_dip) register_sub("4", m_4); register_subalias("1", m_1.m_Q[0]); - register_subalias("2", m_1.m_i[0]); - register_subalias("3", m_1.m_i[1]); + register_subalias("2", m_1.m_I[0]); + register_subalias("3", m_1.m_I[1]); register_subalias("4", m_2.m_Q[0]); - register_subalias("5", m_2.m_i[0]); - register_subalias("6", m_2.m_i[1]); + register_subalias("5", m_2.m_I[0]); + register_subalias("6", m_2.m_I[1]); - register_subalias("8", m_3.m_i[0]); - register_subalias("9", m_3.m_i[1]); + register_subalias("8", m_3.m_I[0]); + register_subalias("9", m_3.m_I[1]); register_subalias("10", m_3.m_Q[0]); - register_subalias("11", m_4.m_i[0]); - register_subalias("12", m_4.m_i[1]); + register_subalias("11", m_4.m_I[0]); + register_subalias("12", m_4.m_I[1]); register_subalias("13", m_4.m_Q[0]); } diff --git a/src/emu/netlist/devices/nld_7404.c b/src/emu/netlist/devices/nld_7404.c index 2c812744db0..8637da2fec6 100644 --- a/src/emu/netlist/devices/nld_7404.c +++ b/src/emu/netlist/devices/nld_7404.c @@ -7,10 +7,20 @@ #include "nld_7404.h" +#if 1 && (USE_TRUTHTABLE) +nld_7404::truthtable_t nld_7404::m_ttbl; +const char *nld_7404::m_desc[] = { + "A | Q ", + "0 | 1|22", + "1 | 0|15", + "" +}; +#else + NETLIB_START(7404) { - register_input("A", m_I); - register_output("Q", m_Q); + register_input("A", m_I[0]); + register_output("Q", m_Q[0]); } NETLIB_RESET(7404) @@ -20,9 +30,10 @@ NETLIB_RESET(7404) NETLIB_UPDATE(7404) { /* static */ const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) }; - UINT8 t = (INPLOGIC(m_I)) ^ 1; - OUTLOGIC(m_Q, t, delay[t]); + UINT8 t = (INPLOGIC(m_I[0])) ^ 1; + OUTLOGIC(m_Q[0], t, delay[t]); } +#endif NETLIB_START(7404_dip) { @@ -33,23 +44,23 @@ NETLIB_START(7404_dip) register_sub("5", m_5); register_sub("6", m_6); - register_subalias("1", m_1.m_I); - register_subalias("2", m_1.m_Q); + register_subalias("1", m_1.m_I[0]); + register_subalias("2", m_1.m_Q[0]); - register_subalias("3", m_2.m_I); - register_subalias("4", m_2.m_Q); + register_subalias("3", m_2.m_I[0]); + register_subalias("4", m_2.m_Q[0]); - register_subalias("5", m_3.m_I); - register_subalias("6", m_3.m_Q); + register_subalias("5", m_3.m_I[0]); + register_subalias("6", m_3.m_Q[0]); - register_subalias("8", m_4.m_Q); - register_subalias("9", m_4.m_I); + register_subalias("8", m_4.m_Q[0]); + register_subalias("9", m_4.m_I[0]); - register_subalias("10", m_5.m_Q); - register_subalias("11", m_5.m_I); + register_subalias("10", m_5.m_Q[0]); + register_subalias("11", m_5.m_I[0]); - register_subalias("12", m_6.m_Q); - register_subalias("13", m_6.m_I); + register_subalias("12", m_6.m_Q[0]); + register_subalias("13", m_6.m_I[0]); } NETLIB_UPDATE(7404_dip) diff --git a/src/emu/netlist/devices/nld_7404.h b/src/emu/netlist/devices/nld_7404.h index f74210bc958..0988d1d1e7c 100644 --- a/src/emu/netlist/devices/nld_7404.h +++ b/src/emu/netlist/devices/nld_7404.h @@ -32,11 +32,16 @@ #include "nld_signal.h" +#if 1 && (USE_TRUTHTABLE) +#include "nld_truthtable.h" +NETLIB_TRUTHTABLE(7404, 1, 1, 0); +#else NETLIB_DEVICE(7404, public: - netlist_logic_input_t m_I; - netlist_logic_output_t m_Q; + netlist_logic_input_t m_I[1]; + netlist_logic_output_t m_Q[1]; ); +#endif #define TTL_7404_INVERT(_name, _A) \ NET_REGISTER_DEV(7404, _name) \ diff --git a/src/emu/netlist/devices/nld_7408.c b/src/emu/netlist/devices/nld_7408.c index 4ecdc78469b..70cc8006f67 100644 --- a/src/emu/netlist/devices/nld_7408.c +++ b/src/emu/netlist/devices/nld_7408.c @@ -26,20 +26,20 @@ NETLIB_START(7408_dip) register_sub("3", m_3); register_sub("4", m_4); - register_subalias("1", m_1.m_i[0]); - register_subalias("2", m_1.m_i[1]); + register_subalias("1", m_1.m_I[0]); + register_subalias("2", m_1.m_I[1]); register_subalias("3", m_1.m_Q[0]); - register_subalias("4", m_2.m_i[0]); - register_subalias("5", m_2.m_i[1]); + register_subalias("4", m_2.m_I[0]); + register_subalias("5", m_2.m_I[1]); register_subalias("6", m_2.m_Q[0]); - register_subalias("9", m_3.m_i[0]); - register_subalias("10", m_3.m_i[1]); + register_subalias("9", m_3.m_I[0]); + register_subalias("10", m_3.m_I[1]); register_subalias("8", m_3.m_Q[0]); - register_subalias("12", m_4.m_i[0]); - register_subalias("13", m_4.m_i[1]); + register_subalias("12", m_4.m_I[0]); + register_subalias("13", m_4.m_I[1]); register_subalias("11", m_4.m_Q[0]); } diff --git a/src/emu/netlist/devices/nld_7410.c b/src/emu/netlist/devices/nld_7410.c index d920398c68b..05ad04f2b1c 100644 --- a/src/emu/netlist/devices/nld_7410.c +++ b/src/emu/netlist/devices/nld_7410.c @@ -27,20 +27,20 @@ NETLIB_START(7410_dip) register_sub("2", m_2); register_sub("3", m_3); - register_subalias("1", m_1.m_i[0]); - register_subalias("2", m_1.m_i[1]); - register_subalias("3", m_2.m_i[0]); - register_subalias("4", m_2.m_i[1]); - register_subalias("5", m_2.m_i[2]); + register_subalias("1", m_1.m_I[0]); + register_subalias("2", m_1.m_I[1]); + register_subalias("3", m_2.m_I[0]); + register_subalias("4", m_2.m_I[1]); + register_subalias("5", m_2.m_I[2]); register_subalias("6", m_2.m_Q[0]); register_subalias("8", m_3.m_Q[0]); - register_subalias("9", m_3.m_i[0]); - register_subalias("10", m_3.m_i[1]); - register_subalias("11", m_3.m_i[2]); + register_subalias("9", m_3.m_I[0]); + register_subalias("10", m_3.m_I[1]); + register_subalias("11", m_3.m_I[2]); register_subalias("12", m_1.m_Q[0]); - register_subalias("13", m_1.m_i[2]); + register_subalias("13", m_1.m_I[2]); } NETLIB_UPDATE(7410_dip) diff --git a/src/emu/netlist/devices/nld_7411.c b/src/emu/netlist/devices/nld_7411.c index 0664bd10c5c..3ac56fc11ef 100644 --- a/src/emu/netlist/devices/nld_7411.c +++ b/src/emu/netlist/devices/nld_7411.c @@ -25,20 +25,20 @@ NETLIB_START(7411_dip) register_sub("2", m_2); register_sub("3", m_3); - register_subalias("1", m_1.m_i[0]); - register_subalias("2", m_1.m_i[1]); - register_subalias("3", m_2.m_i[0]); - register_subalias("4", m_2.m_i[1]); - register_subalias("5", m_2.m_i[2]); + register_subalias("1", m_1.m_I[0]); + register_subalias("2", m_1.m_I[1]); + register_subalias("3", m_2.m_I[0]); + register_subalias("4", m_2.m_I[1]); + register_subalias("5", m_2.m_I[2]); register_subalias("6", m_2.m_Q[0]); register_subalias("8", m_3.m_Q[0]); - register_subalias("9", m_3.m_i[0]); - register_subalias("10", m_3.m_i[1]); - register_subalias("11", m_3.m_i[2]); + register_subalias("9", m_3.m_I[0]); + register_subalias("10", m_3.m_I[1]); + register_subalias("11", m_3.m_I[2]); register_subalias("12", m_1.m_Q[0]); - register_subalias("13", m_1.m_i[2]); + register_subalias("13", m_1.m_I[2]); } NETLIB_UPDATE(7411_dip) diff --git a/src/emu/netlist/devices/nld_7420.c b/src/emu/netlist/devices/nld_7420.c index 59e649fc6f6..e45b91397bc 100644 --- a/src/emu/netlist/devices/nld_7420.c +++ b/src/emu/netlist/devices/nld_7420.c @@ -25,19 +25,19 @@ NETLIB_START(7420_dip) register_sub("1", m_1); register_sub("2", m_2); - register_subalias("1", m_1.m_i[0]); - register_subalias("2", m_1.m_i[1]); + register_subalias("1", m_1.m_I[0]); + register_subalias("2", m_1.m_I[1]); - register_subalias("4", m_1.m_i[2]); - register_subalias("5", m_1.m_i[3]); + register_subalias("4", m_1.m_I[2]); + register_subalias("5", m_1.m_I[3]); register_subalias("6", m_1.m_Q[0]); register_subalias("8", m_2.m_Q[0]); - register_subalias("9", m_2.m_i[0]); - register_subalias("10", m_2.m_i[1]); + register_subalias("9", m_2.m_I[0]); + register_subalias("10", m_2.m_I[1]); - register_subalias("12", m_2.m_i[2]); - register_subalias("13", m_2.m_i[3]); + register_subalias("12", m_2.m_I[2]); + register_subalias("13", m_2.m_I[3]); } diff --git a/src/emu/netlist/devices/nld_7425.c b/src/emu/netlist/devices/nld_7425.c index 59bb899c56b..a46f544297e 100644 --- a/src/emu/netlist/devices/nld_7425.c +++ b/src/emu/netlist/devices/nld_7425.c @@ -12,23 +12,23 @@ NETLIB_START(7425_dip) register_sub("1", m_1); register_sub("2", m_2); - register_subalias("1", m_1.m_i[0]); - register_subalias("2", m_1.m_i[1]); + register_subalias("1", m_1.m_I[0]); + register_subalias("2", m_1.m_I[1]); //register_subalias("3", ); X1 ==> NC - register_subalias("4", m_1.m_i[2]); - register_subalias("5", m_1.m_i[3]); + register_subalias("4", m_1.m_I[2]); + register_subalias("5", m_1.m_I[3]); register_subalias("6", m_1.m_Q[0]); register_subalias("8", m_2.m_Q[0]); - register_subalias("9", m_2.m_i[0]); - register_subalias("10", m_2.m_i[1]); + register_subalias("9", m_2.m_I[0]); + register_subalias("10", m_2.m_I[1]); //register_subalias("11", ); X2 ==> NC - register_subalias("12", m_2.m_i[2]); - register_subalias("13", m_2.m_i[3]); + register_subalias("12", m_2.m_I[2]); + register_subalias("13", m_2.m_I[3]); } diff --git a/src/emu/netlist/devices/nld_7427.c b/src/emu/netlist/devices/nld_7427.c index a363ddd5f3c..6551ee1840b 100644 --- a/src/emu/netlist/devices/nld_7427.c +++ b/src/emu/netlist/devices/nld_7427.c @@ -27,20 +27,20 @@ NETLIB_START(7427_dip) register_sub("2", m_2); register_sub("3", m_3); - register_subalias("1", m_1.m_i[0]); - register_subalias("2", m_1.m_i[1]); - register_subalias("3", m_2.m_i[0]); - register_subalias("4", m_2.m_i[1]); - register_subalias("5", m_2.m_i[2]); + register_subalias("1", m_1.m_I[0]); + register_subalias("2", m_1.m_I[1]); + register_subalias("3", m_2.m_I[0]); + register_subalias("4", m_2.m_I[1]); + register_subalias("5", m_2.m_I[2]); register_subalias("6", m_2.m_Q[0]); register_subalias("8", m_3.m_Q[0]); - register_subalias("9", m_3.m_i[0]); - register_subalias("10", m_3.m_i[1]); - register_subalias("11", m_3.m_i[2]); + register_subalias("9", m_3.m_I[0]); + register_subalias("10", m_3.m_I[1]); + register_subalias("11", m_3.m_I[2]); register_subalias("12", m_1.m_Q[0]); - register_subalias("13", m_1.m_i[2]); + register_subalias("13", m_1.m_I[2]); } NETLIB_UPDATE(7427_dip) diff --git a/src/emu/netlist/devices/nld_74279.c b/src/emu/netlist/devices/nld_74279.c index 17fbc2e8b22..5740b59c6ed 100644 --- a/src/emu/netlist/devices/nld_74279.c +++ b/src/emu/netlist/devices/nld_74279.c @@ -125,23 +125,23 @@ NETLIB_START(74279_dip) register_sub("3", m_3); register_sub("4", m_4); - register_subalias("1", m_1.m_i[2]); //R - register_subalias("2", m_1.m_i[0]); - register_subalias("3", m_1.m_i[1]); + register_subalias("1", m_1.m_I[2]); //R + register_subalias("2", m_1.m_I[0]); + register_subalias("3", m_1.m_I[1]); register_subalias("4", m_1.m_Q[0]); - register_subalias("5", m_2.m_i[1]); //R - register_subalias("6", m_2.m_i[0]); + register_subalias("5", m_2.m_I[1]); //R + register_subalias("6", m_2.m_I[0]); register_subalias("7", m_2.m_Q[0]); register_subalias("9", m_3.m_Q[0]); - register_subalias("10", m_3.m_i[2]); //R - register_subalias("11", m_3.m_i[0]); - register_subalias("12", m_3.m_i[1]); + register_subalias("10", m_3.m_I[2]); //R + register_subalias("11", m_3.m_I[0]); + register_subalias("12", m_3.m_I[1]); register_subalias("13", m_4.m_Q[0]); - register_subalias("14", m_4.m_i[1]); //R - register_subalias("15", m_4.m_i[0]); + register_subalias("14", m_4.m_I[1]); //R + register_subalias("15", m_4.m_I[0]); } NETLIB_UPDATE(74279_dip) diff --git a/src/emu/netlist/devices/nld_7430.c b/src/emu/netlist/devices/nld_7430.c index 06d73997ad5..24d61d7b8ac 100644 --- a/src/emu/netlist/devices/nld_7430.c +++ b/src/emu/netlist/devices/nld_7430.c @@ -30,17 +30,17 @@ NETLIB_START(7430_dip) { register_sub("1", m_1); - register_subalias("1", m_1.m_i[0]); - register_subalias("2", m_1.m_i[1]); - register_subalias("3", m_1.m_i[2]); - register_subalias("4", m_1.m_i[3]); - register_subalias("5", m_1.m_i[4]); - register_subalias("6", m_1.m_i[5]); + register_subalias("1", m_1.m_I[0]); + register_subalias("2", m_1.m_I[1]); + register_subalias("3", m_1.m_I[2]); + register_subalias("4", m_1.m_I[3]); + register_subalias("5", m_1.m_I[4]); + register_subalias("6", m_1.m_I[5]); register_subalias("8", m_1.m_Q[0]); - register_subalias("11", m_1.m_i[6]); - register_subalias("12", m_1.m_i[7]); + register_subalias("11", m_1.m_I[6]); + register_subalias("12", m_1.m_I[7]); } NETLIB_UPDATE(7430_dip) diff --git a/src/emu/netlist/devices/nld_7432.c b/src/emu/netlist/devices/nld_7432.c index e3dda241be7..0e176a323fc 100644 --- a/src/emu/netlist/devices/nld_7432.c +++ b/src/emu/netlist/devices/nld_7432.c @@ -27,19 +27,19 @@ NETLIB_START(7432_dip) register_sub("4", m_4); register_subalias("3", m_1.m_Q[0]); - register_subalias("1", m_1.m_i[0]); - register_subalias("2", m_1.m_i[1]); + register_subalias("1", m_1.m_I[0]); + register_subalias("2", m_1.m_I[1]); register_subalias("6", m_2.m_Q[0]); - register_subalias("4", m_2.m_i[0]); - register_subalias("5", m_2.m_i[1]); + register_subalias("4", m_2.m_I[0]); + register_subalias("5", m_2.m_I[1]); - register_subalias("9", m_3.m_i[0]); - register_subalias("10", m_3.m_i[1]); + register_subalias("9", m_3.m_I[0]); + register_subalias("10", m_3.m_I[1]); register_subalias("8", m_3.m_Q[0]); - register_subalias("12", m_4.m_i[0]); - register_subalias("13", m_4.m_i[1]); + register_subalias("12", m_4.m_I[0]); + register_subalias("13", m_4.m_I[1]); register_subalias("11", m_4.m_Q[0]); } diff --git a/src/emu/netlist/devices/nld_7437.c b/src/emu/netlist/devices/nld_7437.c index ba078f81d11..f65c9fd016b 100644 --- a/src/emu/netlist/devices/nld_7437.c +++ b/src/emu/netlist/devices/nld_7437.c @@ -26,20 +26,20 @@ NETLIB_START(7437_dip) register_sub("3", m_3); register_sub("4", m_4); - register_subalias("1", m_1.m_i[0]); - register_subalias("2", m_1.m_i[1]); + register_subalias("1", m_1.m_I[0]); + register_subalias("2", m_1.m_I[1]); register_subalias("3", m_1.m_Q[0]); - register_subalias("4", m_2.m_i[0]); - register_subalias("5", m_2.m_i[1]); + register_subalias("4", m_2.m_I[0]); + register_subalias("5", m_2.m_I[1]); register_subalias("6", m_2.m_Q[0]); - register_subalias("9", m_3.m_i[0]); - register_subalias("10", m_3.m_i[1]); + register_subalias("9", m_3.m_I[0]); + register_subalias("10", m_3.m_I[1]); register_subalias("8", m_3.m_Q[0]); - register_subalias("12", m_4.m_i[0]); - register_subalias("13", m_4.m_i[1]); + register_subalias("12", m_4.m_I[0]); + register_subalias("13", m_4.m_I[1]); register_subalias("11", m_4.m_Q[0]); } diff --git a/src/emu/netlist/devices/nld_7486.c b/src/emu/netlist/devices/nld_7486.c index e4009b22180..1e8de4bf744 100644 --- a/src/emu/netlist/devices/nld_7486.c +++ b/src/emu/netlist/devices/nld_7486.c @@ -7,11 +7,22 @@ #include "nld_7486.h" +#if (USE_TRUTHTABLE) +nld_7486::truthtable_t nld_7486::m_ttbl; +const char *nld_7486::m_desc[] = { + "A , B | Q ", + "0,0|0|15", + "0,1|1|22", + "1,0|1|22", + "1,1|0|15", + "" +}; +#else NETLIB_START(7486) { - register_input("A", m_A); - register_input("B", m_B); - register_output("Q", m_Q); + register_input("A", m_I[0]); + register_input("B", m_I[1]); + register_output("Q", m_Q[0]); save(NLNAME(m_active)); } @@ -25,10 +36,41 @@ NETLIB_UPDATE(7486) { const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) }; - UINT8 t = INPLOGIC(m_A) ^ INPLOGIC(m_B); - OUTLOGIC(m_Q, t, delay[t]); + UINT8 t = INPLOGIC(m_I[0]) ^ INPLOGIC(m_I[1]); + OUTLOGIC(m_Q[0], t, delay[t]); } +ATTR_HOT void NETLIB_NAME(7486)::inc_active() +{ + const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) }; + nl_assert(netlist().use_deactivate()); + if (++m_active == 1) + { + m_I[0].activate(); + m_I[1].activate(); + + netlist_time mt = this->m_I[0].net().time(); + if (this->m_I[1].net().time() > mt) + mt = this->m_I[1].net().time(); + + UINT8 t = INPLOGIC(m_I[0]) ^ INPLOGIC(m_I[1]); + m_Q[0].net().set_Q_time(t, mt + delay[t]); + } +} + +ATTR_HOT void NETLIB_NAME(7486)::dec_active() +{ +#if 1 + nl_assert(netlist().use_deactivate()); + if (--m_active == 0) + { + m_I[0].inactivate(); + m_I[1].inactivate(); + } +#endif +} +#endif + NETLIB_START(7486_dip) { register_sub("1", m_1); @@ -36,21 +78,21 @@ NETLIB_START(7486_dip) register_sub("3", m_3); register_sub("4", m_4); - register_subalias("1", m_1.m_A); - register_subalias("2", m_1.m_B); - register_subalias("3", m_1.m_Q); + register_subalias("1", m_1.m_I[0]); + register_subalias("2", m_1.m_I[1]); + register_subalias("3", m_1.m_Q[0]); - register_subalias("4", m_2.m_A); - register_subalias("5", m_2.m_B); - register_subalias("6", m_2.m_Q); + register_subalias("4", m_2.m_I[0]); + register_subalias("5", m_2.m_I[1]); + register_subalias("6", m_2.m_Q[0]); - register_subalias("9", m_3.m_A); - register_subalias("10", m_3.m_B); - register_subalias("8", m_3.m_Q); + register_subalias("9", m_3.m_I[0]); + register_subalias("10", m_3.m_I[1]); + register_subalias("8", m_3.m_Q[0]); - register_subalias("12", m_4.m_A); - register_subalias("13", m_4.m_B); - register_subalias("11", m_4.m_Q); + register_subalias("12", m_4.m_I[0]); + register_subalias("13", m_4.m_I[1]); + register_subalias("11", m_4.m_Q[0]); } NETLIB_UPDATE(7486_dip) @@ -70,32 +112,3 @@ NETLIB_RESET(7486_dip) m_4.do_reset(); } -ATTR_HOT void NETLIB_NAME(7486)::inc_active() -{ - const netlist_time delay[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) }; - nl_assert(netlist().use_deactivate()); - if (++m_active == 1) - { - m_A.activate(); - m_B.activate(); - - netlist_time mt = this->m_A.net().time(); - if (this->m_B.net().time() > mt) - mt = this->m_B.net().time(); - - UINT8 t = INPLOGIC(m_A) ^ INPLOGIC(m_B); - m_Q.net().set_Q_time(t, mt + delay[t]); - } -} - -ATTR_HOT void NETLIB_NAME(7486)::dec_active() -{ -#if 1 - nl_assert(netlist().use_deactivate()); - if (--m_active == 0) - { - m_A.inactivate(); - m_B.inactivate(); - } -#endif -} diff --git a/src/emu/netlist/devices/nld_7486.h b/src/emu/netlist/devices/nld_7486.h index 5febda494f9..e5ad2cb3be7 100644 --- a/src/emu/netlist/devices/nld_7486.h +++ b/src/emu/netlist/devices/nld_7486.h @@ -39,16 +39,20 @@ NET_CONNECT(_name, A, _A) \ NET_CONNECT(_name, B, _B) +#if (USE_TRUTHTABLE) +#include "nld_truthtable.h" +NETLIB_TRUTHTABLE(7486, 2, 1, 0); +#else NETLIB_DEVICE(7486, public: - netlist_logic_input_t m_A; - netlist_logic_input_t m_B; - netlist_logic_output_t m_Q; + netlist_logic_input_t m_I[2]; + netlist_logic_output_t m_Q[1]; ATTR_HOT void inc_active(); ATTR_HOT void dec_active(); int m_active; ); +#endif #define TTL_7486_DIP(_name) \ NET_REGISTER_DEV(7486_dip, _name) diff --git a/src/emu/netlist/devices/nld_9312.c b/src/emu/netlist/devices/nld_9312.c index 7ed2c678f38..06b6c3c5f62 100644 --- a/src/emu/netlist/devices/nld_9312.c +++ b/src/emu/netlist/devices/nld_9312.c @@ -128,19 +128,19 @@ NETLIB_START(9312_dip) #if (1 && USE_TRUTHTABLE) - register_subalias("13", m_sub.m_i[0]); - register_subalias("12", m_sub.m_i[1]); - register_subalias("11", m_sub.m_i[2]); - register_subalias("10", m_sub.m_i[3]); - - register_subalias("1", m_sub.m_i[4]); - register_subalias("2", m_sub.m_i[5]); - register_subalias("3", m_sub.m_i[6]); - register_subalias("4", m_sub.m_i[7]); - register_subalias("5", m_sub.m_i[8]); - register_subalias("6", m_sub.m_i[9]); - register_subalias("7", m_sub.m_i[10]); - register_subalias("9", m_sub.m_i[11]); + register_subalias("13", m_sub.m_I[0]); + register_subalias("12", m_sub.m_I[1]); + register_subalias("11", m_sub.m_I[2]); + register_subalias("10", m_sub.m_I[3]); + + register_subalias("1", m_sub.m_I[4]); + register_subalias("2", m_sub.m_I[5]); + register_subalias("3", m_sub.m_I[6]); + register_subalias("4", m_sub.m_I[7]); + register_subalias("5", m_sub.m_I[8]); + register_subalias("6", m_sub.m_I[9]); + register_subalias("7", m_sub.m_I[10]); + register_subalias("9", m_sub.m_I[11]); register_subalias("15", m_sub.m_Q[0]); // Y register_subalias("14", m_sub.m_Q[1]); // YQ diff --git a/src/emu/netlist/devices/nld_signal.h b/src/emu/netlist/devices/nld_signal.h index f6ac5fd0924..0dc84e7e549 100644 --- a/src/emu/netlist/devices/nld_signal.h +++ b/src/emu/netlist/devices/nld_signal.h @@ -42,7 +42,7 @@ public: register_output("Q", m_Q[0]); for (int i=0; i < _numdev; i++) { - register_input(sIN[i], m_i[i]); + register_input(sIN[i], m_I[i]); } save(NLNAME(m_active)); } @@ -57,13 +57,13 @@ public: { for (int i = 0; i< _numdev; i++) { - this->m_i[i].activate(); - if (INPLOGIC(this->m_i[i]) == _check) + this->m_I[i].activate(); + if (INPLOGIC(this->m_I[i]) == _check) { for (int j = 0; j < i; j++) - this->m_i[j].inactivate(); + this->m_I[j].inactivate(); for (int j = i + 1; j < _numdev; j++) - this->m_i[j].inactivate(); + this->m_I[j].inactivate(); return _check ^ (1 ^ _invert); } } @@ -80,8 +80,8 @@ public: netlist_time mt = netlist_time::zero; for (int i = 0; i< _numdev; i++) { - if (this->m_i[i].net().time() > mt) - mt = this->m_i[i].net().time(); + if (this->m_I[i].net().time() > mt) + mt = this->m_I[i].net().time(); } netlist_sig_t r = process(); m_Q[0].net().set_Q_time(r, mt + times[r]); @@ -94,7 +94,7 @@ public: if (--m_active == 0) { for (int i = 0; i< _numdev; i++) - m_i[i].inactivate(); + m_I[i].inactivate(); } } @@ -107,7 +107,7 @@ public: } public: - netlist_logic_input_t m_i[_numdev]; + netlist_logic_input_t m_I[_numdev]; netlist_logic_output_t m_Q[1]; INT32 m_active; }; diff --git a/src/emu/netlist/devices/nld_truthtable.h b/src/emu/netlist/devices/nld_truthtable.h index 3036178bcfb..615f8d6b9b6 100644 --- a/src/emu/netlist/devices/nld_truthtable.h +++ b/src/emu/netlist/devices/nld_truthtable.h @@ -121,7 +121,7 @@ public: for (unsigned i=0; i < m_NI; i++) { inout[i] = inout[i].trim(); - register_input(inout[i], m_i[i]); + register_input(inout[i], m_I[i]); } for (unsigned i=0; i < m_NO; i++) { @@ -138,7 +138,7 @@ public: if (idx>=0) { //printf("connecting %s %d\n", out[i].cstr(), idx); - connect(m_Q[i], m_i[idx]); + connect(m_Q[i], m_I[idx]); // disable ignore for this inputs altogether. // FIXME: This shouldn't be necessary disabled_ignore |= (1<<idx); @@ -167,7 +167,7 @@ public: m_active = 0; m_ign = 0; for (unsigned i = 0; i < m_NI; i++) - m_i[i].activate(); + m_I[i].activate(); for (unsigned i=0; i<m_NO;i++) if (this->m_Q[i].net().num_cons()>0) m_active++; @@ -183,26 +183,27 @@ public: for (unsigned i = 0; i < m_NI; i++) { if (!doOUT || (m_ign & (1<<i))) - m_i[i].activate(); + m_I[i].activate(); } for (unsigned i = 0; i < m_NI; i++) { - state |= (INPLOGIC(m_i[i]) << i); + state |= (INPLOGIC(m_I[i]) << i); if (!doOUT) - if (this->m_i[i].net().time() > mt) - mt = this->m_i[i].net().time(); + if (this->m_I[i].net().time() > mt) + mt = this->m_I[i].net().time(); } const UINT32 nstate = state | (has_state ? (m_last_state << m_NI) : 0); - const UINT32 out = m_ttp->m_outs[nstate] & ((1 << m_NO) - 1); - m_ign = m_ttp->m_outs[nstate] >> m_NO; + const UINT32 outstate = m_ttp->m_outs[nstate]; + const UINT32 out = outstate & ((1 << m_NO) - 1); + m_ign = outstate >> m_NO; if (has_state) m_last_state = (state << m_NO) | out; #if 0 for (int i = 0; i < m_NI; i++) if (m_ign & (1 << i)) - m_i[i].inactivate(); + m_I[i].inactivate(); #endif const UINT32 timebase = nstate * m_NO; if (doOUT) @@ -214,10 +215,12 @@ public: for (unsigned i = 0; i < m_NO; i++) m_Q[i].net().set_Q_time((out >> i) & 1, mt + m_ttp->m_timing_nt[m_ttp->m_timing[timebase + i]]); - for (unsigned i = 0; i < m_NI; i++) - if (m_ign & (1 << i)) - m_i[i].inactivate(); - + if (m_NI > 1 || has_state) + { + for (unsigned i = 0; i < m_NI; i++) + if (m_ign & (1 << i)) + m_I[i].inactivate(); + } } ATTR_HOT void update() @@ -238,16 +241,24 @@ public: ATTR_HOT void dec_active() { nl_assert(netlist().use_deactivate()); + /* 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 benefitial to + * ignore deactivation. + */ + if (m_NI < 2) + return; if (has_state == 0) if (--m_active == 0) { for (unsigned i = 0; i< m_NI; i++) - m_i[i].inactivate(); + m_I[i].inactivate(); m_ign = (1<<m_NI)-1; } } - netlist_logic_input_t m_i[m_NI]; + netlist_logic_input_t m_I[m_NI]; netlist_logic_output_t m_Q[m_NO]; private: diff --git a/src/emu/netlist/nl_parser.c b/src/emu/netlist/nl_parser.c index d82333cbc4c..2810a9be861 100644 --- a/src/emu/netlist/nl_parser.c +++ b/src/emu/netlist/nl_parser.c @@ -207,13 +207,13 @@ void netlist_parser::net_model() void netlist_parser::net_submodel() { // don't do much - pstring name = get_identifier(); - require_token(m_tok_comma); pstring model = get_identifier(); + require_token(m_tok_comma); + pstring name = get_identifier(); require_token(m_tok_param_right); m_setup.namespace_push(name); - m_setup.include(name); + m_setup.include(model); m_setup.namespace_pop(); } @@ -236,7 +236,7 @@ void netlist_parser::net_local_source() void netlist_parser::net_alias() { - pstring alias = get_identifier(); + pstring alias = get_identifier_or_number(); require_token(m_tok_comma); diff --git a/src/emu/netlist/nl_setup.h b/src/emu/netlist/nl_setup.h index a97b1bad727..c7b2f08b64e 100644 --- a/src/emu/netlist/nl_setup.h +++ b/src/emu/netlist/nl_setup.h @@ -63,7 +63,7 @@ ATTR_COLD void NETLIST_NAME(_name)(netlist_setup_t &setup) #define INCLUDE(_name) \ setup.include(# _name); -#define SUBMODEL(_name, _model) \ +#define SUBMODEL(_model, _name) \ setup.namespace_push(# _name); \ NETLIST_NAME(_model)(setup); \ setup.namespace_pop(); diff --git a/src/emu/netlist/plib/pparser.c b/src/emu/netlist/plib/pparser.c index 6022eef1426..98b26a1b85f 100644 --- a/src/emu/netlist/plib/pparser.c +++ b/src/emu/netlist/plib/pparser.c @@ -97,6 +97,16 @@ pstring ptokenizer::get_identifier() return tok.str(); } +pstring ptokenizer::get_identifier_or_number() +{ + token_t tok = get_token(); + if (!(tok.is_type(IDENTIFIER) || tok.is_type(NUMBER))) + { + error("Error: expected an identifier, got <%s>\n", tok.str().cstr()); + } + return tok.str(); +} + double ptokenizer::get_number_double() { token_t tok = get_token(); diff --git a/src/emu/netlist/plib/pparser.h b/src/emu/netlist/plib/pparser.h index 4dbaac67324..f4f8cff2171 100644 --- a/src/emu/netlist/plib/pparser.h +++ b/src/emu/netlist/plib/pparser.h @@ -86,6 +86,7 @@ public: token_t get_token(); pstring get_string(); pstring get_identifier(); + pstring get_identifier_or_number(); double get_number_double(); long get_number_long(); diff --git a/src/emu/netlist/tools/nl_convert.c b/src/emu/netlist/tools/nl_convert.c index 8347e263b20..5453129dac1 100644 --- a/src/emu/netlist/tools/nl_convert.c +++ b/src/emu/netlist/tools/nl_convert.c @@ -230,22 +230,43 @@ void nl_convert_spice_t::process_line(const pstring &line) /* check for fourth terminal ... should be numeric net * including "0" or start with "N" (ltspice) */ - // FIXME: we need a is_long method .. ATTR_UNUSED int nval =tt[4].as_long(&cerr); + pstring model; + pstring pins ="CBE"; + if ((!cerr || tt[4].startsWith("N")) && tt.size() > 5) - add_device("QBJT", tt[0], tt[5]); + model = tt[5]; else - add_device("QBJT", tt[0], tt[4]); - add_term(tt[1], tt[0] + ".C"); - add_term(tt[2], tt[0] + ".B"); - add_term(tt[3], tt[0] + ".E"); + model = tt[4]; + pstring_list_t m(model,"{"); + if (m.size() == 2) + { + if (m[1].len() != 4) + fprintf(stderr, "error with model desc %s\n", model.cstr()); + pins = m[1].left(3); + } + add_device("QBJT_EB", tt[0], m[0]); + add_term(tt[1], tt[0] + "." + pins[0]); + add_term(tt[2], tt[0] + "." + pins[1]); + add_term(tt[3], tt[0] + "." + pins[2]); } break; case 'R': - val = get_sp_val(tt[3]); - add_device("RES", tt[0], val); - add_term(tt[1], tt[0] + ".1"); - add_term(tt[2], tt[0] + ".2"); + if (tt[0].startsWith("RV")) + { + val = get_sp_val(tt[4]); + add_device("POT", tt[0], val); + add_term(tt[1], tt[0] + ".1"); + add_term(tt[2], tt[0] + ".2"); + add_term(tt[3], tt[0] + ".3"); + } + else + { + val = get_sp_val(tt[3]); + add_device("RES", tt[0], val); + add_term(tt[1], tt[0] + ".1"); + add_term(tt[2], tt[0] + ".2"); + } break; case 'C': val = get_sp_val(tt[3]); @@ -265,11 +286,18 @@ void nl_convert_spice_t::process_line(const pstring &line) else fprintf(stderr, "Voltage Source %s not connected to GND\n", tt[0].cstr()); break; + case 'I': // Input pin special notation + { + val = get_sp_val(tt[2]); + add_device("ANALOG_INPUT", tt[0], val); + add_term(tt[1], tt[0] + ".Q"); + } + break; case 'D': - // FIXME: Rewrite resistor value add_device("DIODE", tt[0], tt[3]); - add_term(tt[1], tt[0] + ".A"); - add_term(tt[2], tt[0] + ".K"); + /* FIXME ==> does Kicad use different notation from LTSPICE */ + add_term(tt[1], tt[0] + ".K"); + add_term(tt[2], tt[0] + ".A"); break; case 'U': case 'X': |