diff options
Diffstat (limited to 'src/emu/netlist/devices')
36 files changed, 1600 insertions, 1612 deletions
diff --git a/src/emu/netlist/devices/net_lib.c b/src/emu/netlist/devices/net_lib.c index 81a375bfd27..fdb376d6340 100644 --- a/src/emu/netlist/devices/net_lib.c +++ b/src/emu/netlist/devices/net_lib.c @@ -53,164 +53,164 @@ NETLIB_START(nic7448) { - register_sub(sub, "sub"); - - register_subalias("A0", sub.m_A0); - register_subalias("A1", sub.m_A1); - register_subalias("A2", sub.m_A2); - register_subalias("A3", sub.m_A3); - register_input("LTQ", m_LTQ); - register_input("BIQ", m_BIQ); - register_subalias("RBIQ",sub.m_RBIQ); - - register_subalias("a", sub.m_a); - register_subalias("b", sub.m_b); - register_subalias("c", sub.m_c); - register_subalias("d", sub.m_d); - register_subalias("e", sub.m_e); - register_subalias("f", sub.m_f); - register_subalias("g", sub.m_g); + register_sub(sub, "sub"); + + register_subalias("A0", sub.m_A0); + register_subalias("A1", sub.m_A1); + register_subalias("A2", sub.m_A2); + register_subalias("A3", sub.m_A3); + register_input("LTQ", m_LTQ); + register_input("BIQ", m_BIQ); + register_subalias("RBIQ",sub.m_RBIQ); + + register_subalias("a", sub.m_a); + register_subalias("b", sub.m_b); + register_subalias("c", sub.m_c); + register_subalias("d", sub.m_d); + register_subalias("e", sub.m_e); + register_subalias("f", sub.m_f); + register_subalias("g", sub.m_g); } NETLIB_UPDATE(nic7448) { - if (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ)) - { - sub.update_outputs(8); - } - else if (!INPLOGIC(m_BIQ)) - { - sub.update_outputs(15); - } - - if (!INPLOGIC(m_BIQ) || (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ))) - { - sub.m_A0.inactivate(); - sub.m_A1.inactivate(); - sub.m_A2.inactivate(); - sub.m_A3.inactivate(); - sub.m_RBIQ.inactivate(); - } else { - sub.m_RBIQ.activate(); - sub.m_A3.activate(); - sub.m_A2.activate(); - sub.m_A1.activate(); - sub.m_A0.activate(); - sub.update(); - } + if (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ)) + { + sub.update_outputs(8); + } + else if (!INPLOGIC(m_BIQ)) + { + sub.update_outputs(15); + } + + if (!INPLOGIC(m_BIQ) || (INPLOGIC(m_BIQ) && !INPLOGIC(m_LTQ))) + { + sub.m_A0.inactivate(); + sub.m_A1.inactivate(); + sub.m_A2.inactivate(); + sub.m_A3.inactivate(); + sub.m_RBIQ.inactivate(); + } else { + sub.m_RBIQ.activate(); + sub.m_A3.activate(); + sub.m_A2.activate(); + sub.m_A1.activate(); + sub.m_A0.activate(); + sub.update(); + } } NETLIB_START(nic7448_sub) { - m_state = 0; - - register_input("A0", m_A0); - register_input("A1", m_A1); - register_input("A2", m_A2); - register_input("A3", m_A3); - register_input("RBIQ", m_RBIQ); - - register_output("a", m_a); - register_output("b", m_b); - register_output("c", m_c); - register_output("d", m_d); - register_output("e", m_e); - register_output("f", m_f); - register_output("g", m_g); - - save(NAME(m_state)); + m_state = 0; + + register_input("A0", m_A0); + register_input("A1", m_A1); + register_input("A2", m_A2); + register_input("A3", m_A3); + register_input("RBIQ", m_RBIQ); + + register_output("a", m_a); + register_output("b", m_b); + register_output("c", m_c); + register_output("d", m_d); + register_output("e", m_e); + register_output("f", m_f); + register_output("g", m_g); + + save(NAME(m_state)); } NETLIB_UPDATE(nic7448_sub) { - UINT8 v; + UINT8 v; - v = (INPLOGIC(m_A0) << 0) | (INPLOGIC(m_A1) << 1) | (INPLOGIC(m_A2) << 2) | (INPLOGIC(m_A3) << 3); - if ((!INPLOGIC(m_RBIQ) && (v==0))) - v = 15; - update_outputs(v); + v = (INPLOGIC(m_A0) << 0) | (INPLOGIC(m_A1) << 1) | (INPLOGIC(m_A2) << 2) | (INPLOGIC(m_A3) << 3); + if ((!INPLOGIC(m_RBIQ) && (v==0))) + v = 15; + update_outputs(v); } NETLIB_FUNC_VOID(nic7448_sub, update_outputs, (UINT8 v)) { - assert(v<16); - if (v != m_state) - { - OUTLOGIC(m_a, tab7448[v][0], NLTIME_FROM_NS(100)); - OUTLOGIC(m_b, tab7448[v][1], NLTIME_FROM_NS(100)); - OUTLOGIC(m_c, tab7448[v][2], NLTIME_FROM_NS(100)); - OUTLOGIC(m_d, tab7448[v][3], NLTIME_FROM_NS(100)); - OUTLOGIC(m_e, tab7448[v][4], NLTIME_FROM_NS(100)); - OUTLOGIC(m_f, tab7448[v][5], NLTIME_FROM_NS(100)); - OUTLOGIC(m_g, tab7448[v][6], NLTIME_FROM_NS(100)); - m_state = v; - } + assert(v<16); + if (v != m_state) + { + OUTLOGIC(m_a, tab7448[v][0], NLTIME_FROM_NS(100)); + OUTLOGIC(m_b, tab7448[v][1], NLTIME_FROM_NS(100)); + OUTLOGIC(m_c, tab7448[v][2], NLTIME_FROM_NS(100)); + OUTLOGIC(m_d, tab7448[v][3], NLTIME_FROM_NS(100)); + OUTLOGIC(m_e, tab7448[v][4], NLTIME_FROM_NS(100)); + OUTLOGIC(m_f, tab7448[v][5], NLTIME_FROM_NS(100)); + OUTLOGIC(m_g, tab7448[v][6], NLTIME_FROM_NS(100)); + m_state = v; + } } const UINT8 NETLIB_NAME(nic7448_sub)::tab7448[16][7] = { - { 1, 1, 1, 1, 1, 1, 0 }, /* 00 - not blanked ! */ - { 0, 1, 1, 0, 0, 0, 0 }, /* 01 */ - { 1, 1, 0, 1, 1, 0, 1 }, /* 02 */ - { 1, 1, 1, 1, 0, 0, 1 }, /* 03 */ - { 0, 1, 1, 0, 0, 1, 1 }, /* 04 */ - { 1, 0, 1, 1, 0, 1, 1 }, /* 05 */ - { 0, 0, 1, 1, 1, 1, 1 }, /* 06 */ - { 1, 1, 1, 0, 0, 0, 0 }, /* 07 */ - { 1, 1, 1, 1, 1, 1, 1 }, /* 08 */ - { 1, 1, 1, 0, 0, 1, 1 }, /* 09 */ - { 0, 0, 0, 1, 1, 0, 1 }, /* 10 */ - { 0, 0, 1, 1, 0, 0, 1 }, /* 11 */ - { 0, 1, 0, 0, 0, 1, 1 }, /* 12 */ - { 1, 0, 0, 1, 0, 1, 1 }, /* 13 */ - { 0, 0, 0, 1, 1, 1, 1 }, /* 14 */ - { 0, 0, 0, 0, 0, 0, 0 }, /* 15 */ + { 1, 1, 1, 1, 1, 1, 0 }, /* 00 - not blanked ! */ + { 0, 1, 1, 0, 0, 0, 0 }, /* 01 */ + { 1, 1, 0, 1, 1, 0, 1 }, /* 02 */ + { 1, 1, 1, 1, 0, 0, 1 }, /* 03 */ + { 0, 1, 1, 0, 0, 1, 1 }, /* 04 */ + { 1, 0, 1, 1, 0, 1, 1 }, /* 05 */ + { 0, 0, 1, 1, 1, 1, 1 }, /* 06 */ + { 1, 1, 1, 0, 0, 0, 0 }, /* 07 */ + { 1, 1, 1, 1, 1, 1, 1 }, /* 08 */ + { 1, 1, 1, 0, 0, 1, 1 }, /* 09 */ + { 0, 0, 0, 1, 1, 0, 1 }, /* 10 */ + { 0, 0, 1, 1, 0, 0, 1 }, /* 11 */ + { 0, 1, 0, 0, 0, 1, 1 }, /* 12 */ + { 1, 0, 0, 1, 0, 1, 1 }, /* 13 */ + { 0, 0, 0, 1, 1, 1, 1 }, /* 14 */ + { 0, 0, 0, 0, 0, 0, 0 }, /* 15 */ }; NETLIB_START(nic7450) { - register_input("I1", m_I0); - register_input("I2", m_I1); - register_input("I3", m_I2); - register_input("I4", m_I3); - register_output("Q", m_Q); + register_input("I1", m_I0); + register_input("I2", m_I1); + register_input("I3", m_I2); + register_input("I4", m_I3); + register_output("Q", m_Q); } NETLIB_UPDATE(nic7450) { - m_I0.activate(); - m_I1.activate(); - m_I2.activate(); - m_I3.activate(); - UINT8 t1 = INPLOGIC(m_I0) & INPLOGIC(m_I1); - UINT8 t2 = INPLOGIC(m_I2) & INPLOGIC(m_I3); + m_I0.activate(); + m_I1.activate(); + m_I2.activate(); + m_I3.activate(); + UINT8 t1 = INPLOGIC(m_I0) & INPLOGIC(m_I1); + UINT8 t2 = INPLOGIC(m_I2) & INPLOGIC(m_I3); #if 0 - UINT8 t = (t1 | t2) ^ 1; - OUTLOGIC(m_Q, t, t ? NLTIME_FROM_NS(22) : NLTIME_FROM_NS(15)); + UINT8 t = (t1 | t2) ^ 1; + OUTLOGIC(m_Q, t, t ? NLTIME_FROM_NS(22) : NLTIME_FROM_NS(15)); #else - const netlist_time times[2] = { NLTIME_FROM_NS(22), NLTIME_FROM_NS(15) }; - - UINT8 res = 0; - if (t1 ^ 1) - { - if (t2 ^ 1) - { - res = 1; - } - else - { - m_I0.inactivate(); - m_I1.inactivate(); - } - } else { - if (t2 ^ 1) - { - m_I2.inactivate(); - m_I3.inactivate(); - } - } - OUTLOGIC(m_Q, res, times[1 - res]);// ? 22000 : 15000); + const netlist_time times[2] = { NLTIME_FROM_NS(22), NLTIME_FROM_NS(15) }; + + UINT8 res = 0; + if (t1 ^ 1) + { + if (t2 ^ 1) + { + res = 1; + } + else + { + m_I0.inactivate(); + m_I1.inactivate(); + } + } else { + if (t2 ^ 1) + { + m_I2.inactivate(); + m_I3.inactivate(); + } + } + OUTLOGIC(m_Q, res, times[1 - res]);// ? 22000 : 15000); #endif } @@ -221,122 +221,122 @@ NETLIB_UPDATE(nic7450) NETLIB_START(nic74107Asub) { - register_input("CLK", m_clk, netlist_input_t::STATE_INP_HL); - register_output("Q", m_Q); - register_output("QQ", m_QQ); + register_input("CLK", m_clk, netlist_input_t::STATE_INP_HL); + register_output("Q", m_Q); + register_output("QQ", m_QQ); - m_Q.initial(0); - m_QQ.initial(1); + m_Q.initial(0); + m_QQ.initial(1); - save(NAME(m_Q1)); - save(NAME(m_Q2)); - save(NAME(m_F)); + save(NAME(m_Q1)); + save(NAME(m_Q2)); + save(NAME(m_F)); } NETLIB_START(nic74107A) { - register_sub(sub, "sub"); + register_sub(sub, "sub"); - register_subalias("CLK", sub.m_clk); - register_input("J", m_J); - register_input("K", m_K); - register_input("CLRQ", m_clrQ); - register_subalias("Q", sub.m_Q); - register_subalias("QQ", sub.m_QQ); + register_subalias("CLK", sub.m_clk); + register_input("J", m_J); + register_input("K", m_K); + register_input("CLRQ", m_clrQ); + register_subalias("Q", sub.m_Q); + register_subalias("QQ", sub.m_QQ); - sub.m_Q.initial(0); - sub.m_QQ.initial(1); + sub.m_Q.initial(0); + sub.m_QQ.initial(1); } ATTR_HOT inline void NETLIB_NAME(nic74107Asub)::newstate(const netlist_sig_t state) { - const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; + const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) }; #if 1 - OUTLOGIC(m_Q, state, delay[state ^ 1]); - OUTLOGIC(m_QQ, state ^ 1, delay[state]); + OUTLOGIC(m_Q, state, delay[state ^ 1]); + OUTLOGIC(m_QQ, state ^ 1, delay[state]); #else - if (state != Q.new_Q()) - { - Q.setToNoCheck(state, delay[1-state]); - QQ.setToNoCheck(1-state, delay[state]); - } + if (state != Q.new_Q()) + { + Q.setToNoCheck(state, delay[1-state]); + QQ.setToNoCheck(1-state, delay[state]); + } #endif } NETLIB_UPDATE(nic74107Asub) { - { - const netlist_sig_t t = m_Q.net().new_Q(); - newstate((!t & m_Q1) | (t & m_Q2) | m_F); - if (!m_Q1) - m_clk.inactivate(); - } + { + const netlist_sig_t t = m_Q.net().new_Q(); + newstate((!t & m_Q1) | (t & m_Q2) | m_F); + if (!m_Q1) + m_clk.inactivate(); + } } NETLIB_UPDATE(nic74107A) { - if (INPLOGIC(m_J) & INPLOGIC(m_K)) - { - sub.m_Q1 = 1; - sub.m_Q2 = 0; - sub.m_F = 0; - } - else if (!INPLOGIC(m_J) & INPLOGIC(m_K)) - { - sub.m_Q1 = 0; - sub.m_Q2 = 0; - sub.m_F = 0; - } - else if (INPLOGIC(m_J) & !INPLOGIC(m_K)) - { - sub.m_Q1 = 0; - sub.m_Q2 = 0; - sub.m_F = 1; - } - else - { - sub.m_Q1 = 0; - sub.m_Q2 = 1; - sub.m_F = 0; - sub.m_clk.inactivate(); - } - if (!INPLOGIC(m_clrQ)) - { - sub.m_clk.inactivate(); - sub.newstate(0); - } - else if (!sub.m_Q2) - sub.m_clk.activate_hl(); - //if (!sub.m_Q2 & INPLOGIC(m_clrQ)) - // sub.m_clk.activate_hl(); + if (INPLOGIC(m_J) & INPLOGIC(m_K)) + { + sub.m_Q1 = 1; + sub.m_Q2 = 0; + sub.m_F = 0; + } + else if (!INPLOGIC(m_J) & INPLOGIC(m_K)) + { + sub.m_Q1 = 0; + sub.m_Q2 = 0; + sub.m_F = 0; + } + else if (INPLOGIC(m_J) & !INPLOGIC(m_K)) + { + sub.m_Q1 = 0; + sub.m_Q2 = 0; + sub.m_F = 1; + } + else + { + sub.m_Q1 = 0; + sub.m_Q2 = 1; + sub.m_F = 0; + sub.m_clk.inactivate(); + } + if (!INPLOGIC(m_clrQ)) + { + sub.m_clk.inactivate(); + sub.newstate(0); + } + else if (!sub.m_Q2) + sub.m_clk.activate_hl(); + //if (!sub.m_Q2 & INPLOGIC(m_clrQ)) + // sub.m_clk.activate_hl(); } NETLIB_START(nic74153) { - register_input("A1", m_I[0]); - register_input("A2", m_I[1]); - register_input("A3", m_I[2]); - register_input("A4", m_I[3]); - register_input("A", m_A); - register_input("B", m_B); - register_input("GA", m_GA); - - register_output("AY", m_AY); + register_input("A1", m_I[0]); + register_input("A2", m_I[1]); + register_input("A3", m_I[2]); + register_input("A4", m_I[3]); + register_input("A", m_A); + register_input("B", m_B); + register_input("GA", m_GA); + + register_output("AY", m_AY); } NETLIB_UPDATE(nic74153) { - const netlist_time delay[2] = { NLTIME_FROM_NS(23), NLTIME_FROM_NS(18) }; - if (!INPLOGIC(m_GA)) - { - UINT8 chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1)); - UINT8 t = INPLOGIC(m_I[chan]); - OUTLOGIC(m_AY, t, delay[t] ); /* data to y only, FIXME */ - } - else - { - OUTLOGIC(m_AY, 0, delay[0]); - } + const netlist_time delay[2] = { NLTIME_FROM_NS(23), NLTIME_FROM_NS(18) }; + if (!INPLOGIC(m_GA)) + { + UINT8 chan = (INPLOGIC(m_A) | (INPLOGIC(m_B)<<1)); + UINT8 t = INPLOGIC(m_I[chan]); + OUTLOGIC(m_AY, t, delay[t] ); /* data to y only, FIXME */ + } + else + { + OUTLOGIC(m_AY, 0, delay[0]); + } } @@ -346,93 +346,91 @@ NETLIB_UPDATE(nic74153) netlist_factory::netlist_factory() { - } netlist_factory::~netlist_factory() { - for (list_t::entry_t *e = m_list.first(); e != NULL; e = m_list.next(e)) - { - net_device_t_base_factory *p = e->object(); - delete p; - } - m_list.reset(); + for (list_t::entry_t *e = m_list.first(); e != NULL; e = m_list.next(e)) + { + net_device_t_base_factory *p = e->object(); + delete p; + } + m_list.reset(); } void netlist_factory::initialize() { - ENTRY(R, NETDEV_R) - ENTRY(POT, NETDEV_POT) - ENTRY(C, NETDEV_C) - ENTRY(D, NETDEV_D) - ENTRY(VCVS, NETDEV_VCVS) - ENTRY(VCCS, NETDEV_VCCS) - ENTRY(QPNP_switch, NETDEV_QPNP) - ENTRY(QNPN_switch, NETDEV_QNPN) - ENTRY(ttl_const, NETDEV_TTL_CONST) - ENTRY(analog_const, NETDEV_ANALOG_CONST) - ENTRY(logic_input, NETDEV_LOGIC_INPUT) - ENTRY(analog_input, NETDEV_ANALOG_INPUT) - ENTRY(log, NETDEV_LOG) - ENTRY(logD, NETDEV_LOGD) - ENTRY(clock, NETDEV_CLOCK) - ENTRY(mainclock, NETDEV_MAINCLOCK) - ENTRY(solver, NETDEV_SOLVER) - ENTRY(nicMultiSwitch, NETDEV_SWITCH2) - ENTRY(nicRSFF, NETDEV_RSFF) - ENTRY(nicMixer8, NETDEV_MIXER) - ENTRY(7400, TTL_7400_NAND) - ENTRY(7402, TTL_7402_NOR) - ENTRY(nic7404, TTL_7404_INVERT) - ENTRY(7410, TTL_7410_NAND) - ENTRY(7420, TTL_7420_NAND) - ENTRY(7425, TTL_7425_NOR) - ENTRY(7427, TTL_7427_NOR) - ENTRY(7430, TTL_7430_NAND) - ENTRY(nic7450, TTL_7450_ANDORINVERT) - ENTRY(7486, TTL_7486_XOR) - ENTRY(nic7448, TTL_7448) - ENTRY(7474, TTL_7474) - ENTRY(7483, TTL_7483) - ENTRY(7490, TTL_7490) - ENTRY(7493, TTL_7493) - ENTRY(nic74107, TTL_74107) - ENTRY(nic74107A, TTL_74107A) - ENTRY(nic74153, TTL_74153) - ENTRY(9316, TTL_9316) - ENTRY(NE555, NETDEV_NE555) - ENTRY(nicNE555N_MSTABLE, NE555N_MSTABLE) + ENTRY(R, NETDEV_R) + ENTRY(POT, NETDEV_POT) + ENTRY(C, NETDEV_C) + ENTRY(D, NETDEV_D) + ENTRY(VCVS, NETDEV_VCVS) + ENTRY(VCCS, NETDEV_VCCS) + ENTRY(QPNP_switch, NETDEV_QPNP) + ENTRY(QNPN_switch, NETDEV_QNPN) + ENTRY(ttl_const, NETDEV_TTL_CONST) + ENTRY(analog_const, NETDEV_ANALOG_CONST) + ENTRY(logic_input, NETDEV_LOGIC_INPUT) + ENTRY(analog_input, NETDEV_ANALOG_INPUT) + ENTRY(log, NETDEV_LOG) + ENTRY(logD, NETDEV_LOGD) + ENTRY(clock, NETDEV_CLOCK) + ENTRY(mainclock, NETDEV_MAINCLOCK) + ENTRY(solver, NETDEV_SOLVER) + ENTRY(nicMultiSwitch, NETDEV_SWITCH2) + ENTRY(nicRSFF, NETDEV_RSFF) + ENTRY(nicMixer8, NETDEV_MIXER) + ENTRY(7400, TTL_7400_NAND) + ENTRY(7402, TTL_7402_NOR) + ENTRY(nic7404, TTL_7404_INVERT) + ENTRY(7410, TTL_7410_NAND) + ENTRY(7420, TTL_7420_NAND) + ENTRY(7425, TTL_7425_NOR) + ENTRY(7427, TTL_7427_NOR) + ENTRY(7430, TTL_7430_NAND) + ENTRY(nic7450, TTL_7450_ANDORINVERT) + ENTRY(7486, TTL_7486_XOR) + ENTRY(nic7448, TTL_7448) + ENTRY(7474, TTL_7474) + ENTRY(7483, TTL_7483) + ENTRY(7490, TTL_7490) + ENTRY(7493, TTL_7493) + ENTRY(nic74107, TTL_74107) + ENTRY(nic74107A, TTL_74107A) + ENTRY(nic74153, TTL_74153) + ENTRY(9316, TTL_9316) + ENTRY(NE555, NETDEV_NE555) + ENTRY(nicNE555N_MSTABLE, NE555N_MSTABLE) } netlist_device_t *netlist_factory::new_device_by_classname(const pstring &classname, netlist_setup_t &setup) const { - for (list_t::entry_t *e = m_list.first(); e != NULL; e = m_list.next(e)) - { - net_device_t_base_factory *p = e->object(); - if (strcmp(p->classname(), classname) == 0) - { - netlist_device_t *ret = p->Create(); - return ret; - } - p++; - } - setup.netlist().xfatalerror("Class %s not found!\n", classname.cstr()); - return NULL; // appease code analysis + for (list_t::entry_t *e = m_list.first(); e != NULL; e = m_list.next(e)) + { + net_device_t_base_factory *p = e->object(); + if (strcmp(p->classname(), classname) == 0) + { + netlist_device_t *ret = p->Create(); + return ret; + } + p++; + } + setup.netlist().xfatalerror("Class %s not found!\n", classname.cstr()); + return NULL; // appease code analysis } netlist_device_t *netlist_factory::new_device_by_name(const pstring &name, netlist_setup_t &setup) const { - for (list_t::entry_t *e = m_list.first(); e != NULL; e = m_list.next(e)) - { - net_device_t_base_factory *p = e->object(); - if (strcmp(p->name(), name) == 0) - { - netlist_device_t *ret = p->Create(); - return ret; - } - p++; - } - setup.netlist().xfatalerror("Class %s not found!\n", name.cstr()); - return NULL; // appease code analysis + for (list_t::entry_t *e = m_list.first(); e != NULL; e = m_list.next(e)) + { + net_device_t_base_factory *p = e->object(); + if (strcmp(p->name(), name) == 0) + { + netlist_device_t *ret = p->Create(); + return ret; + } + p++; + } + setup.netlist().xfatalerror("Class %s not found!\n", name.cstr()); + return NULL; // appease code analysis } - diff --git a/src/emu/netlist/devices/net_lib.h b/src/emu/netlist/devices/net_lib.h index da225bc3f1e..2c696588f97 100644 --- a/src/emu/netlist/devices/net_lib.h +++ b/src/emu/netlist/devices/net_lib.h @@ -136,7 +136,7 @@ NETLIB_DEVICE(nic7450, */ NETLIB_SUBDEVICE(nic74107Asub, - netlist_ttl_input_t m_clk; + netlist_ttl_input_t m_clk; netlist_ttl_output_t m_Q; netlist_ttl_output_t m_QQ; diff --git a/src/emu/netlist/devices/nld_7400.h b/src/emu/netlist/devices/nld_7400.h index 809ea87334e..76af3043c4b 100644 --- a/src/emu/netlist/devices/nld_7400.h +++ b/src/emu/netlist/devices/nld_7400.h @@ -43,34 +43,34 @@ NETLIB_SIGNAL(7400, 2, 0, 0); NETLIB_DEVICE(7400pin, - NETLIB_NAME(7400) m_1; - NETLIB_NAME(7400) m_2; - NETLIB_NAME(7400) m_3; - NETLIB_NAME(7400) m_4; + NETLIB_NAME(7400) m_1; + NETLIB_NAME(7400) m_2; + NETLIB_NAME(7400) m_3; + NETLIB_NAME(7400) m_4; ); inline NETLIB_START(7400pin) { - register_sub(m_1, "1"); - register_sub(m_2, "2"); - register_sub(m_3, "3"); - register_sub(m_4, "4"); + register_sub(m_1, "1"); + register_sub(m_2, "2"); + register_sub(m_3, "3"); + register_sub(m_4, "4"); - register_subalias("1", m_1.m_i[0]); - register_subalias("2", m_1.m_i[1]); - 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); - register_subalias("4", m_2.m_i[0]); - register_subalias("5", m_2.m_i[1]); - 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); - register_subalias("9", m_3.m_i[0]); - register_subalias("10", m_3.m_i[1]); - 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); - register_subalias("12", m_4.m_i[0]); - register_subalias("13", m_4.m_i[1]); - 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); } #endif /* NLD_7400_H_ */ diff --git a/src/emu/netlist/devices/nld_7402.h b/src/emu/netlist/devices/nld_7402.h index 0d5990478c0..63a91d25ce8 100644 --- a/src/emu/netlist/devices/nld_7402.h +++ b/src/emu/netlist/devices/nld_7402.h @@ -35,9 +35,9 @@ #include "nld_signal.h" #define TTL_7402_NOR(_name, _I1, _I2) \ - NET_REGISTER_DEV(7402, _name) \ - NET_CONNECT(_name, A, _I1) \ - NET_CONNECT(_name, B, _I2) + NET_REGISTER_DEV(7402, _name) \ + NET_CONNECT(_name, A, _I1) \ + NET_CONNECT(_name, B, _I2) NETLIB_SIGNAL(7402, 2, 1, 0); diff --git a/src/emu/netlist/devices/nld_7404.c b/src/emu/netlist/devices/nld_7404.c index e285eb54f06..42b7e341c39 100644 --- a/src/emu/netlist/devices/nld_7404.c +++ b/src/emu/netlist/devices/nld_7404.c @@ -7,14 +7,14 @@ NETLIB_START(nic7404) { - register_input("A", m_I); - register_output("Q", m_Q); - m_Q.initial(1); + register_input("A", m_I); + register_output("Q", m_Q); + m_Q.initial(1); } NETLIB_UPDATE(nic7404) { - 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]); + 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]); } diff --git a/src/emu/netlist/devices/nld_7404.h b/src/emu/netlist/devices/nld_7404.h index 15c16652f75..5432a1dd9f7 100644 --- a/src/emu/netlist/devices/nld_7404.h +++ b/src/emu/netlist/devices/nld_7404.h @@ -33,12 +33,12 @@ #include "nld_signal.h" NETLIB_DEVICE(nic7404, - netlist_ttl_input_t m_I; - netlist_ttl_output_t m_Q; + netlist_ttl_input_t m_I; + netlist_ttl_output_t m_Q; ); #define TTL_7404_INVERT(_name, _A) \ - NET_REGISTER_DEV(nic7404, _name) \ - NET_CONNECT(_name, A, _A) + NET_REGISTER_DEV(nic7404, _name) \ + NET_CONNECT(_name, A, _A) #endif /* NLD_7404_H_ */ diff --git a/src/emu/netlist/devices/nld_7410.h b/src/emu/netlist/devices/nld_7410.h index 860d5fcab21..b8a1c55aee6 100644 --- a/src/emu/netlist/devices/nld_7410.h +++ b/src/emu/netlist/devices/nld_7410.h @@ -35,10 +35,10 @@ #include "nld_signal.h" #define TTL_7410_NAND(_name, _I1, _I2, _I3) \ - NET_REGISTER_DEV(7410, _name) \ - NET_CONNECT(_name, A, _I1) \ - NET_CONNECT(_name, B, _I2) \ - NET_CONNECT(_name, C, _I3) + NET_REGISTER_DEV(7410, _name) \ + NET_CONNECT(_name, A, _I1) \ + NET_CONNECT(_name, B, _I2) \ + NET_CONNECT(_name, C, _I3) NETLIB_SIGNAL(7410, 3, 0, 0); diff --git a/src/emu/netlist/devices/nld_7420.h b/src/emu/netlist/devices/nld_7420.h index 5ff5bd12ac5..6ac7c477743 100644 --- a/src/emu/netlist/devices/nld_7420.h +++ b/src/emu/netlist/devices/nld_7420.h @@ -36,11 +36,11 @@ #include "nld_signal.h" #define TTL_7420_NAND(_name, _I1, _I2, _I3, _I4) \ - NET_REGISTER_DEV(7420, _name) \ - NET_CONNECT(_name, A, _I1) \ - NET_CONNECT(_name, B, _I2) \ - NET_CONNECT(_name, C, _I3) \ - NET_CONNECT(_name, D, _I4) + NET_REGISTER_DEV(7420, _name) \ + NET_CONNECT(_name, A, _I1) \ + NET_CONNECT(_name, B, _I2) \ + NET_CONNECT(_name, C, _I3) \ + NET_CONNECT(_name, D, _I4) NETLIB_SIGNAL(7420, 4, 0, 0); diff --git a/src/emu/netlist/devices/nld_7425.h b/src/emu/netlist/devices/nld_7425.h index 5e2fff4f946..26ae9b8476c 100644 --- a/src/emu/netlist/devices/nld_7425.h +++ b/src/emu/netlist/devices/nld_7425.h @@ -39,11 +39,11 @@ #include "nld_signal.h" #define TTL_7425_NOR(_name, _I1, _I2, _I3, _I4) \ - NET_REGISTER_DEV(7425, _name) \ - NET_CONNECT(_name, A, _I1) \ - NET_CONNECT(_name, B, _I2) \ - NET_CONNECT(_name, C, _I3) \ - NET_CONNECT(_name, D, _I4) + NET_REGISTER_DEV(7425, _name) \ + NET_CONNECT(_name, A, _I1) \ + NET_CONNECT(_name, B, _I2) \ + NET_CONNECT(_name, C, _I3) \ + NET_CONNECT(_name, D, _I4) NETLIB_SIGNAL(7425, 4, 1, 0); diff --git a/src/emu/netlist/devices/nld_7427.h b/src/emu/netlist/devices/nld_7427.h index c5a8ede870a..9863acc9f5d 100644 --- a/src/emu/netlist/devices/nld_7427.h +++ b/src/emu/netlist/devices/nld_7427.h @@ -35,10 +35,10 @@ #include "nld_signal.h" #define TTL_7427_NOR(_name, _I1, _I2, _I3) \ - NET_REGISTER_DEV(7427, _name) \ - NET_CONNECT(_name, A, _I1) \ - NET_CONNECT(_name, B, _I2) \ - NET_CONNECT(_name, C, _I3) + NET_REGISTER_DEV(7427, _name) \ + NET_CONNECT(_name, A, _I1) \ + NET_CONNECT(_name, B, _I2) \ + NET_CONNECT(_name, C, _I3) NETLIB_SIGNAL(7427, 3, 1, 0); diff --git a/src/emu/netlist/devices/nld_7430.h b/src/emu/netlist/devices/nld_7430.h index 783e8bb6816..2d9ff87f385 100644 --- a/src/emu/netlist/devices/nld_7430.h +++ b/src/emu/netlist/devices/nld_7430.h @@ -40,15 +40,15 @@ #include "nld_signal.h" #define TTL_7430_NAND(_name, _I1, _I2, _I3, _I4, _I5, _I6, _I7, _I8) \ - NET_REGISTER_DEV(7430, _name) \ - NET_CONNECT(_name, A, _I1) \ - NET_CONNECT(_name, B, _I2) \ - NET_CONNECT(_name, C, _I3) \ - NET_CONNECT(_name, D, _I4) \ - NET_CONNECT(_name, E, _I5) \ - NET_CONNECT(_name, F, _I6) \ - NET_CONNECT(_name, G, _I7) \ - NET_CONNECT(_name, H, _I8) + NET_REGISTER_DEV(7430, _name) \ + NET_CONNECT(_name, A, _I1) \ + NET_CONNECT(_name, B, _I2) \ + NET_CONNECT(_name, C, _I3) \ + NET_CONNECT(_name, D, _I4) \ + NET_CONNECT(_name, E, _I5) \ + NET_CONNECT(_name, F, _I6) \ + NET_CONNECT(_name, G, _I7) \ + NET_CONNECT(_name, H, _I8) NETLIB_SIGNAL(7430, 8, 0, 0); diff --git a/src/emu/netlist/devices/nld_7474.c b/src/emu/netlist/devices/nld_7474.c index cd9e64e41af..ef23fe819c5 100644 --- a/src/emu/netlist/devices/nld_7474.c +++ b/src/emu/netlist/devices/nld_7474.c @@ -7,63 +7,63 @@ ATTR_HOT inline void NETLIB_NAME(7474sub)::newstate(const UINT8 state) { - static const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(40) }; - OUTLOGIC(m_Q, state, delay[state]); - OUTLOGIC(m_QQ, !state, delay[!state]); + static const netlist_time delay[2] = { NLTIME_FROM_NS(25), NLTIME_FROM_NS(40) }; + OUTLOGIC(m_Q, state, delay[state]); + OUTLOGIC(m_QQ, !state, delay[!state]); } NETLIB_UPDATE(7474sub) { - //if (!INP_LAST(m_clk) & INP(m_clk)) - { - newstate(m_nextD); - m_clk.inactivate(); - } + //if (!INP_LAST(m_clk) & INP(m_clk)) + { + newstate(m_nextD); + m_clk.inactivate(); + } } NETLIB_UPDATE(7474) { - if (!INPLOGIC(m_preQ)) - { - sub.newstate(1); - sub.m_clk.inactivate(); - m_D.inactivate(); - } - else if (!INPLOGIC(m_clrQ)) - { - sub.newstate(0); - sub.m_clk.inactivate(); - m_D.inactivate(); - } - else - { - m_D.activate(); - sub.m_nextD = INPLOGIC(m_D); - sub.m_clk.activate_lh(); - } + if (!INPLOGIC(m_preQ)) + { + sub.newstate(1); + sub.m_clk.inactivate(); + m_D.inactivate(); + } + else if (!INPLOGIC(m_clrQ)) + { + sub.newstate(0); + sub.m_clk.inactivate(); + m_D.inactivate(); + } + else + { + m_D.activate(); + sub.m_nextD = INPLOGIC(m_D); + sub.m_clk.activate_lh(); + } } NETLIB_START(7474) { - register_sub(sub, "sub"); + register_sub(sub, "sub"); - register_subalias("CLK", sub.m_clk); - register_input("D", m_D); - register_input("CLRQ", m_clrQ); - register_input("PREQ", m_preQ); + register_subalias("CLK", sub.m_clk); + register_input("D", m_D); + register_input("CLRQ", m_clrQ); + register_input("PREQ", m_preQ); - register_subalias("Q", sub.m_Q); - register_subalias("QQ", sub.m_QQ); + register_subalias("Q", sub.m_Q); + register_subalias("QQ", sub.m_QQ); } NETLIB_START(7474sub) { - register_input("CLK", m_clk, netlist_input_t::STATE_INP_LH); + register_input("CLK", m_clk, netlist_input_t::STATE_INP_LH); - register_output("Q", m_Q); - register_output("QQ", m_QQ); + register_output("Q", m_Q); + register_output("QQ", m_QQ); - m_Q.initial(1); - m_QQ.initial(0); + m_Q.initial(1); + m_QQ.initial(0); } diff --git a/src/emu/netlist/devices/nld_7474.h b/src/emu/netlist/devices/nld_7474.h index 91375f479e6..31cf80e0d6d 100644 --- a/src/emu/netlist/devices/nld_7474.h +++ b/src/emu/netlist/devices/nld_7474.h @@ -45,28 +45,28 @@ #include "nld_signal.h" #define TTL_7474(_name, _CLK, _D, _CLRQ, _PREQ) \ - NET_REGISTER_DEV(7474, _name) \ - NET_CONNECT(_name, CLK, _CLK) \ - NET_CONNECT(_name, D, _D) \ - NET_CONNECT(_name, CLRQ, _CLRQ) \ - NET_CONNECT(_name, PREQ, _PREQ) + NET_REGISTER_DEV(7474, _name) \ + NET_CONNECT(_name, CLK, _CLK) \ + NET_CONNECT(_name, D, _D) \ + NET_CONNECT(_name, CLRQ, _CLRQ) \ + NET_CONNECT(_name, PREQ, _PREQ) NETLIB_SUBDEVICE(7474sub, - netlist_ttl_input_t m_clk; + netlist_ttl_input_t m_clk; - UINT8 m_nextD; - netlist_ttl_output_t m_Q; - netlist_ttl_output_t m_QQ; + UINT8 m_nextD; + netlist_ttl_output_t m_Q; + netlist_ttl_output_t m_QQ; - ATTR_HOT inline void newstate(const UINT8 state); + ATTR_HOT inline void newstate(const UINT8 state); ); NETLIB_DEVICE(7474, - NETLIB_NAME(7474sub) sub; + NETLIB_NAME(7474sub) sub; - netlist_ttl_input_t m_D; - netlist_ttl_input_t m_clrQ; - netlist_ttl_input_t m_preQ; + netlist_ttl_input_t m_D; + netlist_ttl_input_t m_clrQ; + netlist_ttl_input_t m_preQ; ); diff --git a/src/emu/netlist/devices/nld_7483.c b/src/emu/netlist/devices/nld_7483.c index eca61846241..81624326d6e 100644 --- a/src/emu/netlist/devices/nld_7483.c +++ b/src/emu/netlist/devices/nld_7483.c @@ -7,42 +7,41 @@ NETLIB_START(7483) { - m_lastr = 0; - - register_input("A1", m_A1); - register_input("A2", m_A2); - register_input("A3", m_A3); - register_input("A4", m_A4); - register_input("B1", m_B1); - register_input("B2", m_B2); - register_input("B3", m_B3); - register_input("B4", m_B4); - register_input("C0", m_C0); - - register_output("SA", m_SA); - register_output("SB", m_SB); - register_output("SC", m_SC); - register_output("SD", m_SD); - register_output("C4", m_C4); - - save(NAME(m_lastr)); + m_lastr = 0; + + register_input("A1", m_A1); + register_input("A2", m_A2); + register_input("A3", m_A3); + register_input("A4", m_A4); + register_input("B1", m_B1); + register_input("B2", m_B2); + register_input("B3", m_B3); + register_input("B4", m_B4); + register_input("C0", m_C0); + + register_output("SA", m_SA); + register_output("SB", m_SB); + register_output("SC", m_SC); + register_output("SD", m_SD); + register_output("C4", m_C4); + + save(NAME(m_lastr)); } NETLIB_UPDATE(7483) { - UINT8 a = (INPLOGIC(m_A1) << 0) | (INPLOGIC(m_A2) << 1) | (INPLOGIC(m_A3) << 2) | (INPLOGIC(m_A4) << 3); - UINT8 b = (INPLOGIC(m_B1) << 0) | (INPLOGIC(m_B2) << 1) | (INPLOGIC(m_B3) << 2) | (INPLOGIC(m_B4) << 3); - - UINT8 r = a + b + INPLOGIC(m_C0); - - if (r != m_lastr) - { - m_lastr = r; - OUTLOGIC(m_SA, (r >> 0) & 1, NLTIME_FROM_NS(23)); - OUTLOGIC(m_SB, (r >> 1) & 1, NLTIME_FROM_NS(23)); - OUTLOGIC(m_SC, (r >> 2) & 1, NLTIME_FROM_NS(23)); - OUTLOGIC(m_SD, (r >> 3) & 1, NLTIME_FROM_NS(23)); - OUTLOGIC(m_C4, (r >> 4) & 1, NLTIME_FROM_NS(23)); - } + UINT8 a = (INPLOGIC(m_A1) << 0) | (INPLOGIC(m_A2) << 1) | (INPLOGIC(m_A3) << 2) | (INPLOGIC(m_A4) << 3); + UINT8 b = (INPLOGIC(m_B1) << 0) | (INPLOGIC(m_B2) << 1) | (INPLOGIC(m_B3) << 2) | (INPLOGIC(m_B4) << 3); + + UINT8 r = a + b + INPLOGIC(m_C0); + + if (r != m_lastr) + { + m_lastr = r; + OUTLOGIC(m_SA, (r >> 0) & 1, NLTIME_FROM_NS(23)); + OUTLOGIC(m_SB, (r >> 1) & 1, NLTIME_FROM_NS(23)); + OUTLOGIC(m_SC, (r >> 2) & 1, NLTIME_FROM_NS(23)); + OUTLOGIC(m_SD, (r >> 3) & 1, NLTIME_FROM_NS(23)); + OUTLOGIC(m_C4, (r >> 4) & 1, NLTIME_FROM_NS(23)); + } } - diff --git a/src/emu/netlist/devices/nld_7483.h b/src/emu/netlist/devices/nld_7483.h index 5900b33cc05..2f457435847 100644 --- a/src/emu/netlist/devices/nld_7483.h +++ b/src/emu/netlist/devices/nld_7483.h @@ -7,16 +7,16 @@ * * +--------------+ * A4 |1 ++ 16| B4 - * Ʃ3 |2 15| Ʃ3 + * ??3 |2 15| ??3 * A3 |3 14| C4 * B3 |4 7483 13| C0 * VCC |5 12| GND - * Ʃ3 |6 11| B1 + * ??3 |6 11| B1 * B2 |7 10| A1 - * A2 |8 9| Ʃ3 + * A2 |8 9| ??3 * +--------------+ * - * Ʃ = (A + B + C) & 0x0f + * ?? = (A + B + C) & 0x0f * * C4 = (A + B + C) > 15 ? 1 : 0 * @@ -30,35 +30,35 @@ #include "../nl_base.h" #define TTL_7483(_name, _A1, _A2, _A3, _A4, _B1, _B2, _B3, _B4, _CI) \ - NET_REGISTER_DEV(7483, _name) \ - NET_CONNECT(_name, A1, _A1) \ - NET_CONNECT(_name, A2, _A2) \ - NET_CONNECT(_name, A3, _A3) \ - NET_CONNECT(_name, A4, _A4) \ - NET_CONNECT(_name, B1, _B1) \ - NET_CONNECT(_name, B2, _B2) \ - NET_CONNECT(_name, B3, _B3) \ - NET_CONNECT(_name, B4, _B4) \ - NET_CONNECT(_name, C0, _CI) + NET_REGISTER_DEV(7483, _name) \ + NET_CONNECT(_name, A1, _A1) \ + NET_CONNECT(_name, A2, _A2) \ + NET_CONNECT(_name, A3, _A3) \ + NET_CONNECT(_name, A4, _A4) \ + NET_CONNECT(_name, B1, _B1) \ + NET_CONNECT(_name, B2, _B2) \ + NET_CONNECT(_name, B3, _B3) \ + NET_CONNECT(_name, B4, _B4) \ + NET_CONNECT(_name, C0, _CI) NETLIB_DEVICE(7483, - netlist_ttl_input_t m_C0; - netlist_ttl_input_t m_A1; - netlist_ttl_input_t m_A2; - netlist_ttl_input_t m_A3; - netlist_ttl_input_t m_A4; - netlist_ttl_input_t m_B1; - netlist_ttl_input_t m_B2; - netlist_ttl_input_t m_B3; - netlist_ttl_input_t m_B4; + netlist_ttl_input_t m_C0; + netlist_ttl_input_t m_A1; + netlist_ttl_input_t m_A2; + netlist_ttl_input_t m_A3; + netlist_ttl_input_t m_A4; + netlist_ttl_input_t m_B1; + netlist_ttl_input_t m_B2; + netlist_ttl_input_t m_B3; + netlist_ttl_input_t m_B4; - UINT8 m_lastr; + UINT8 m_lastr; - netlist_ttl_output_t m_SA; - netlist_ttl_output_t m_SB; - netlist_ttl_output_t m_SC; - netlist_ttl_output_t m_SD; - netlist_ttl_output_t m_C4; + netlist_ttl_output_t m_SA; + netlist_ttl_output_t m_SB; + netlist_ttl_output_t m_SC; + netlist_ttl_output_t m_SD; + netlist_ttl_output_t m_C4; ); diff --git a/src/emu/netlist/devices/nld_7486.c b/src/emu/netlist/devices/nld_7486.c index 55fa712e9ad..fcd94c9f321 100644 --- a/src/emu/netlist/devices/nld_7486.c +++ b/src/emu/netlist/devices/nld_7486.c @@ -7,15 +7,14 @@ NETLIB_START(7486) { - register_input("A", m_A); - register_input("B", m_B); - register_output("Q", m_Q); + register_input("A", m_A); + register_input("B", m_B); + register_output("Q", m_Q); } NETLIB_UPDATE(7486) { - static 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]); + static 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]); } - diff --git a/src/emu/netlist/devices/nld_7486.h b/src/emu/netlist/devices/nld_7486.h index b00d8905ae3..d4fd3d5cda9 100644 --- a/src/emu/netlist/devices/nld_7486.h +++ b/src/emu/netlist/devices/nld_7486.h @@ -35,13 +35,13 @@ #include "nld_signal.h" #define TTL_7486_XOR(_name, _A, _B) \ - NET_REGISTER_DEV(7486, _name) \ - NET_CONNECT(_name, A, _A) \ - NET_CONNECT(_name, B, _B) + NET_REGISTER_DEV(7486, _name) \ + NET_CONNECT(_name, A, _A) \ + NET_CONNECT(_name, B, _B) NETLIB_DEVICE(7486, - netlist_ttl_input_t m_A; - netlist_ttl_input_t m_B; - netlist_ttl_output_t m_Q; + netlist_ttl_input_t m_A; + netlist_ttl_input_t m_B; + netlist_ttl_output_t m_Q; ); #endif /* NLD_7486_H_ */ diff --git a/src/emu/netlist/devices/nld_7490.c b/src/emu/netlist/devices/nld_7490.c index 48b8bbc6b5c..cc84a1389c3 100644 --- a/src/emu/netlist/devices/nld_7490.c +++ b/src/emu/netlist/devices/nld_7490.c @@ -7,47 +7,47 @@ NETLIB_START(7490) { - m_cnt = 0; + m_cnt = 0; - register_input("CLK", m_clk); - register_input("R1", m_R1); - register_input("R2", m_R2); - register_input("R91", m_R91); - register_input("R92", m_R92); + register_input("CLK", m_clk); + register_input("R1", m_R1); + register_input("R2", m_R2); + register_input("R91", m_R91); + register_input("R92", m_R92); - register_output("QA", m_Q[0]); - register_output("QB", m_Q[1]); - register_output("QC", m_Q[2]); - register_output("QD", m_Q[3]); + register_output("QA", m_Q[0]); + register_output("QB", m_Q[1]); + register_output("QC", m_Q[2]); + register_output("QD", m_Q[3]); - save(NAME(m_cnt)); + save(NAME(m_cnt)); } NETLIB_UPDATE(7490) { - if (INPLOGIC(m_R91) & INPLOGIC(m_R92)) - { - m_cnt = 9; - update_outputs(); - } - else if (INPLOGIC(m_R1) & INPLOGIC(m_R2)) - { - m_cnt = 0; - update_outputs(); - } - else if (INP_HL(m_clk)) - { - m_cnt++; - if (m_cnt >= 10) - m_cnt = 0; - update_outputs(); - } + if (INPLOGIC(m_R91) & INPLOGIC(m_R92)) + { + m_cnt = 9; + update_outputs(); + } + else if (INPLOGIC(m_R1) & INPLOGIC(m_R2)) + { + m_cnt = 0; + update_outputs(); + } + else if (INP_HL(m_clk)) + { + m_cnt++; + if (m_cnt >= 10) + m_cnt = 0; + update_outputs(); + } } NETLIB_FUNC_VOID(7490, update_outputs, (void)) { - const netlist_time delay[4] = { NLTIME_FROM_NS(18), NLTIME_FROM_NS(36), NLTIME_FROM_NS(54), NLTIME_FROM_NS(72) }; - for (int i=0; i<4; i++) - OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]); + const netlist_time delay[4] = { NLTIME_FROM_NS(18), NLTIME_FROM_NS(36), NLTIME_FROM_NS(54), NLTIME_FROM_NS(72) }; + for (int i=0; i<4; i++) + OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]); } diff --git a/src/emu/netlist/devices/nld_7490.h b/src/emu/netlist/devices/nld_7490.h index a5380a21cae..288f2cc8864 100644 --- a/src/emu/netlist/devices/nld_7490.h +++ b/src/emu/netlist/devices/nld_7490.h @@ -58,26 +58,26 @@ #include "../nl_base.h" #define TTL_7490(_name, _CLK, _R1, _R2, _R91, _R92) \ - NET_REGISTER_DEV(7490, _name) \ - NET_CONNECT(_name, CLK, _CLK) \ - NET_CONNECT(_name, R1, _R1) \ - NET_CONNECT(_name, R2, _R2) \ - NET_CONNECT(_name, R91, _R91) \ - NET_CONNECT(_name, R92, _R92) + NET_REGISTER_DEV(7490, _name) \ + NET_CONNECT(_name, CLK, _CLK) \ + NET_CONNECT(_name, R1, _R1) \ + NET_CONNECT(_name, R2, _R2) \ + NET_CONNECT(_name, R91, _R91) \ + NET_CONNECT(_name, R92, _R92) NETLIB_DEVICE(7490, - ATTR_HOT void update_outputs(); + ATTR_HOT void update_outputs(); - netlist_ttl_input_t m_R1; - netlist_ttl_input_t m_R2; - netlist_ttl_input_t m_R91; - netlist_ttl_input_t m_R92; - netlist_ttl_input_t m_clk; + netlist_ttl_input_t m_R1; + netlist_ttl_input_t m_R2; + netlist_ttl_input_t m_R91; + netlist_ttl_input_t m_R92; + netlist_ttl_input_t m_clk; - UINT8 m_cnt; + UINT8 m_cnt; - netlist_ttl_output_t m_Q[4]; + netlist_ttl_output_t m_Q[4]; ); #endif /* NLD_7490_H_ */ diff --git a/src/emu/netlist/devices/nld_7493.c b/src/emu/netlist/devices/nld_7493.c index a8c218de5a8..ac633df081b 100644 --- a/src/emu/netlist/devices/nld_7493.c +++ b/src/emu/netlist/devices/nld_7493.c @@ -7,59 +7,59 @@ NETLIB_START(7493) { - register_sub(A, "A"); - register_sub(B, "B"); - register_sub(C, "C"); - register_sub(D, "D"); + register_sub(A, "A"); + register_sub(B, "B"); + register_sub(C, "C"); + register_sub(D, "D"); - register_subalias("CLKA", A.m_I); - register_subalias("CLKB", B.m_I); - register_input("R1", m_R1); - register_input("R2", m_R2); + register_subalias("CLKA", A.m_I); + register_subalias("CLKB", B.m_I); + register_input("R1", m_R1); + register_input("R2", m_R2); - register_subalias("QA", A.m_Q); - register_subalias("QB", B.m_Q); - register_subalias("QC", C.m_Q); - register_subalias("QD", D.m_Q); + register_subalias("QA", A.m_Q); + register_subalias("QB", B.m_Q); + register_subalias("QC", C.m_Q); + register_subalias("QD", D.m_Q); - register_link_internal(C, C.m_I, B.m_Q, netlist_input_t::STATE_INP_HL); - register_link_internal(D, D.m_I, C.m_Q, netlist_input_t::STATE_INP_HL); + register_link_internal(C, C.m_I, B.m_Q, netlist_input_t::STATE_INP_HL); + register_link_internal(D, D.m_I, C.m_Q, netlist_input_t::STATE_INP_HL); } NETLIB_START(7493ff) { - m_reset = 0; + m_reset = 0; - register_input("CLK", m_I, netlist_input_t::STATE_INP_HL); - register_output("Q", m_Q); + register_input("CLK", m_I, netlist_input_t::STATE_INP_HL); + register_output("Q", m_Q); - save(NAME(m_reset)); + save(NAME(m_reset)); } NETLIB_UPDATE(7493ff) { - if (m_reset == 0) - OUTLOGIC(m_Q, !m_Q.net().new_Q(), NLTIME_FROM_NS(18)); + if (m_reset == 0) + OUTLOGIC(m_Q, !m_Q.net().new_Q(), NLTIME_FROM_NS(18)); } NETLIB_UPDATE(7493) { - netlist_sig_t r = INPLOGIC(m_R1) & INPLOGIC(m_R2); + netlist_sig_t r = INPLOGIC(m_R1) & INPLOGIC(m_R2); - if (r) - { - A.m_reset = B.m_reset = C.m_reset = D.m_reset = 1; - A.m_I.inactivate(); - B.m_I.inactivate(); - OUTLOGIC(A.m_Q, 0, NLTIME_FROM_NS(40)); - OUTLOGIC(B.m_Q, 0, NLTIME_FROM_NS(40)); - OUTLOGIC(C.m_Q, 0, NLTIME_FROM_NS(40)); - OUTLOGIC(D.m_Q, 0, NLTIME_FROM_NS(40)); - } - else - { - A.m_reset = B.m_reset = C.m_reset = D.m_reset = 0; - A.m_I.activate_hl(); - B.m_I.activate_hl(); - } + if (r) + { + A.m_reset = B.m_reset = C.m_reset = D.m_reset = 1; + A.m_I.inactivate(); + B.m_I.inactivate(); + OUTLOGIC(A.m_Q, 0, NLTIME_FROM_NS(40)); + OUTLOGIC(B.m_Q, 0, NLTIME_FROM_NS(40)); + OUTLOGIC(C.m_Q, 0, NLTIME_FROM_NS(40)); + OUTLOGIC(D.m_Q, 0, NLTIME_FROM_NS(40)); + } + else + { + A.m_reset = B.m_reset = C.m_reset = D.m_reset = 0; + A.m_I.activate_hl(); + B.m_I.activate_hl(); + } } diff --git a/src/emu/netlist/devices/nld_7493.h b/src/emu/netlist/devices/nld_7493.h index 7cd6e59988b..cc961c389f1 100644 --- a/src/emu/netlist/devices/nld_7493.h +++ b/src/emu/netlist/devices/nld_7493.h @@ -60,27 +60,27 @@ #include "../nl_base.h" #define TTL_7493(_name, _CLKA, _CLKB, _R1, _R2) \ - NET_REGISTER_DEV(7493, _name) \ - NET_CONNECT(_name, CLKA, _CLKA) \ - NET_CONNECT(_name, CLKB, _CLKB) \ - NET_CONNECT(_name, R1, _R1) \ - NET_CONNECT(_name, R2, _R2) + NET_REGISTER_DEV(7493, _name) \ + NET_CONNECT(_name, CLKA, _CLKA) \ + NET_CONNECT(_name, CLKB, _CLKB) \ + NET_CONNECT(_name, R1, _R1) \ + NET_CONNECT(_name, R2, _R2) NETLIB_SUBDEVICE(7493ff, - netlist_ttl_input_t m_I; - netlist_ttl_output_t m_Q; + netlist_ttl_input_t m_I; + netlist_ttl_output_t m_Q; - UINT8 m_reset; + UINT8 m_reset; ); NETLIB_DEVICE(7493, - netlist_ttl_input_t m_R1; - netlist_ttl_input_t m_R2; + netlist_ttl_input_t m_R1; + netlist_ttl_input_t m_R2; - NETLIB_NAME(7493ff) A; - NETLIB_NAME(7493ff) B; - NETLIB_NAME(7493ff) C; - NETLIB_NAME(7493ff) D; + NETLIB_NAME(7493ff) A; + NETLIB_NAME(7493ff) B; + NETLIB_NAME(7493ff) C; + NETLIB_NAME(7493ff) D; ); #endif /* NLD_7493_H_ */ diff --git a/src/emu/netlist/devices/nld_9316.c b/src/emu/netlist/devices/nld_9316.c index ede8e0c0e68..b3b49c171b3 100644 --- a/src/emu/netlist/devices/nld_9316.c +++ b/src/emu/netlist/devices/nld_9316.c @@ -7,148 +7,147 @@ NETLIB_START(9316) { - register_sub(sub, "sub"); + register_sub(sub, "sub"); - register_subalias("CLK", sub.m_clk); + register_subalias("CLK", sub.m_clk); - register_input("ENP", m_ENP); - register_input("ENT", m_ENT); - register_input("CLRQ", m_CLRQ); - register_input("LOADQ", m_LOADQ); + register_input("ENP", m_ENP); + register_input("ENT", m_ENT); + register_input("CLRQ", m_CLRQ); + register_input("LOADQ", m_LOADQ); - register_subalias("A", sub.m_A); - register_subalias("B", sub.m_B); - register_subalias("C", sub.m_C); - register_subalias("D", sub.m_D); + register_subalias("A", sub.m_A); + register_subalias("B", sub.m_B); + register_subalias("C", sub.m_C); + register_subalias("D", sub.m_D); - register_subalias("QA", sub.m_QA); - register_subalias("QB", sub.m_QB); - register_subalias("QC", sub.m_QC); - register_subalias("QD", sub.m_QD); - register_subalias("RC", sub.m_RC); + register_subalias("QA", sub.m_QA); + register_subalias("QB", sub.m_QB); + register_subalias("QC", sub.m_QC); + register_subalias("QD", sub.m_QD); + register_subalias("RC", sub.m_RC); } NETLIB_START(9316_sub) { - m_cnt = 0; - m_loadq = 1; - m_ent = 1; - - register_input("CLK", m_clk, netlist_input_t::STATE_INP_LH); - - register_input("A", m_A, netlist_input_t::STATE_INP_PASSIVE); - register_input("B", m_B, netlist_input_t::STATE_INP_PASSIVE); - register_input("C", m_C, netlist_input_t::STATE_INP_PASSIVE); - register_input("D", m_D, netlist_input_t::STATE_INP_PASSIVE); - - register_output("QA", m_QA); - register_output("QB", m_QB); - register_output("QC", m_QC); - register_output("QD", m_QD); - register_output("RC", m_RC); - - save(NAME(m_cnt)); - save(NAME(m_loadq)); - save(NAME(m_ent)); + m_cnt = 0; + m_loadq = 1; + m_ent = 1; + + register_input("CLK", m_clk, netlist_input_t::STATE_INP_LH); + + register_input("A", m_A, netlist_input_t::STATE_INP_PASSIVE); + register_input("B", m_B, netlist_input_t::STATE_INP_PASSIVE); + register_input("C", m_C, netlist_input_t::STATE_INP_PASSIVE); + register_input("D", m_D, netlist_input_t::STATE_INP_PASSIVE); + + register_output("QA", m_QA); + register_output("QB", m_QB); + register_output("QC", m_QC); + register_output("QD", m_QD); + register_output("RC", m_RC); + + save(NAME(m_cnt)); + save(NAME(m_loadq)); + save(NAME(m_ent)); } NETLIB_UPDATE(9316_sub) { - UINT8 cnt = m_cnt; - if (m_loadq) - { - cnt = ( cnt + 1) & 0x0f; - update_outputs(cnt); - if (cnt == 0x0f) - OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20)); - else if (cnt == 0) - OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20)); - } - else - { - cnt = (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0); - update_outputs_all(cnt); - OUTLOGIC(m_RC, m_ent & (cnt == 0x0f), NLTIME_FROM_NS(20)); - } - m_cnt = cnt; + UINT8 cnt = m_cnt; + if (m_loadq) + { + cnt = ( cnt + 1) & 0x0f; + update_outputs(cnt); + if (cnt == 0x0f) + OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20)); + else if (cnt == 0) + OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20)); + } + else + { + cnt = (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0); + update_outputs_all(cnt); + OUTLOGIC(m_RC, m_ent & (cnt == 0x0f), NLTIME_FROM_NS(20)); + } + m_cnt = cnt; } NETLIB_UPDATE(9316) { - sub.m_loadq = INPLOGIC(m_LOADQ); - sub.m_ent = INPLOGIC(m_ENT); - const netlist_sig_t clrq = INPLOGIC(m_CLRQ); - - if ((!sub.m_loadq || (sub.m_ent & INPLOGIC(m_ENP))) & clrq) - { - sub.m_clk.activate_lh(); - } - else - { - sub.m_clk.inactivate(); - if (!clrq & (sub.m_cnt>0)) - { - sub.m_cnt = 0; - sub.update_outputs(sub.m_cnt); - OUTLOGIC(sub.m_RC, 0, NLTIME_FROM_NS(20)); - return; - } - } - OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == 0x0f), NLTIME_FROM_NS(20)); + sub.m_loadq = INPLOGIC(m_LOADQ); + sub.m_ent = INPLOGIC(m_ENT); + const netlist_sig_t clrq = INPLOGIC(m_CLRQ); + + if ((!sub.m_loadq || (sub.m_ent & INPLOGIC(m_ENP))) & clrq) + { + sub.m_clk.activate_lh(); + } + else + { + sub.m_clk.inactivate(); + if (!clrq & (sub.m_cnt>0)) + { + sub.m_cnt = 0; + sub.update_outputs(sub.m_cnt); + OUTLOGIC(sub.m_RC, 0, NLTIME_FROM_NS(20)); + return; + } + } + OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == 0x0f), NLTIME_FROM_NS(20)); } inline NETLIB_FUNC_VOID(9316_sub, update_outputs_all, (const UINT8 cnt)) { - const netlist_time out_delay = NLTIME_FROM_NS(20); - OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay); - OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay); - OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay); - OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay); + const netlist_time out_delay = NLTIME_FROM_NS(20); + OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay); + OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay); + OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay); + OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay); } inline NETLIB_FUNC_VOID(9316_sub, update_outputs, (const UINT8 cnt)) { - const netlist_time out_delay = NLTIME_FROM_NS(20); + const netlist_time out_delay = NLTIME_FROM_NS(20); #if 0 // for (int i=0; i<4; i++) // OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]); - OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay); - OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay); - OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay); - OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay); + OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay); + OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay); + OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay); + OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay); #else - if ((cnt & 1) == 1) - OUTLOGIC(m_QA, 1, out_delay); - else - { - OUTLOGIC(m_QA, 0, out_delay); - switch (cnt) - { - case 0x00: - OUTLOGIC(m_QB, 0, out_delay); - OUTLOGIC(m_QC, 0, out_delay); - OUTLOGIC(m_QD, 0, out_delay); - break; - case 0x02: - case 0x06: - case 0x0A: - case 0x0E: - OUTLOGIC(m_QB, 1, out_delay); - break; - case 0x04: - case 0x0C: - OUTLOGIC(m_QB, 0, out_delay); - OUTLOGIC(m_QC, 1, out_delay); - break; - case 0x08: - OUTLOGIC(m_QB, 0, out_delay); - OUTLOGIC(m_QC, 0, out_delay); - OUTLOGIC(m_QD, 1, out_delay); - break; - } - - } + if ((cnt & 1) == 1) + OUTLOGIC(m_QA, 1, out_delay); + else + { + OUTLOGIC(m_QA, 0, out_delay); + switch (cnt) + { + case 0x00: + OUTLOGIC(m_QB, 0, out_delay); + OUTLOGIC(m_QC, 0, out_delay); + OUTLOGIC(m_QD, 0, out_delay); + break; + case 0x02: + case 0x06: + case 0x0A: + case 0x0E: + OUTLOGIC(m_QB, 1, out_delay); + break; + case 0x04: + case 0x0C: + OUTLOGIC(m_QB, 0, out_delay); + OUTLOGIC(m_QC, 1, out_delay); + break; + case 0x08: + OUTLOGIC(m_QB, 0, out_delay); + OUTLOGIC(m_QC, 0, out_delay); + OUTLOGIC(m_QD, 1, out_delay); + break; + } + + } #endif } - diff --git a/src/emu/netlist/devices/nld_9316.h b/src/emu/netlist/devices/nld_9316.h index 886ef1c956c..7aa340a76d1 100644 --- a/src/emu/netlist/devices/nld_9316.h +++ b/src/emu/netlist/devices/nld_9316.h @@ -52,45 +52,45 @@ #include "../nl_base.h" #define TTL_9316(_name, _CLK, _ENP, _ENT, _CLRQ, _LOADQ, _A, _B, _C, _D) \ - NET_REGISTER_DEV(9316, _name) \ - NET_CONNECT(_name, CLK, _CLK) \ - NET_CONNECT(_name, ENP, _ENP) \ - NET_CONNECT(_name, ENT, _ENT) \ - NET_CONNECT(_name, CLRQ, _CLRQ) \ - NET_CONNECT(_name, LOADQ,_LOADQ) \ - NET_CONNECT(_name, A, _A) \ - NET_CONNECT(_name, B, _B) \ - NET_CONNECT(_name, C, _C) \ - NET_CONNECT(_name, D, _D) + NET_REGISTER_DEV(9316, _name) \ + NET_CONNECT(_name, CLK, _CLK) \ + NET_CONNECT(_name, ENP, _ENP) \ + NET_CONNECT(_name, ENT, _ENT) \ + NET_CONNECT(_name, CLRQ, _CLRQ) \ + NET_CONNECT(_name, LOADQ,_LOADQ) \ + NET_CONNECT(_name, A, _A) \ + NET_CONNECT(_name, B, _B) \ + NET_CONNECT(_name, C, _C) \ + NET_CONNECT(_name, D, _D) NETLIB_SUBDEVICE(9316_sub, - ATTR_HOT void update_outputs_all(const UINT8 cnt); - ATTR_HOT void update_outputs(const UINT8 cnt); + ATTR_HOT void update_outputs_all(const UINT8 cnt); + ATTR_HOT void update_outputs(const UINT8 cnt); - netlist_ttl_input_t m_clk; + netlist_ttl_input_t m_clk; - netlist_ttl_input_t m_A; - netlist_ttl_input_t m_B; - netlist_ttl_input_t m_C; - netlist_ttl_input_t m_D; + netlist_ttl_input_t m_A; + netlist_ttl_input_t m_B; + netlist_ttl_input_t m_C; + netlist_ttl_input_t m_D; - UINT8 m_cnt; - netlist_sig_t m_loadq; - netlist_sig_t m_ent; + UINT8 m_cnt; + netlist_sig_t m_loadq; + netlist_sig_t m_ent; - netlist_ttl_output_t m_QA; - netlist_ttl_output_t m_QB; - netlist_ttl_output_t m_QC; - netlist_ttl_output_t m_QD; - netlist_ttl_output_t m_RC; + netlist_ttl_output_t m_QA; + netlist_ttl_output_t m_QB; + netlist_ttl_output_t m_QC; + netlist_ttl_output_t m_QD; + netlist_ttl_output_t m_RC; ); NETLIB_DEVICE(9316, - NETLIB_NAME(9316_sub) sub; - netlist_ttl_input_t m_ENP; - netlist_ttl_input_t m_ENT; - netlist_ttl_input_t m_CLRQ; - netlist_ttl_input_t m_LOADQ; + NETLIB_NAME(9316_sub) sub; + netlist_ttl_input_t m_ENP; + netlist_ttl_input_t m_ENT; + netlist_ttl_input_t m_CLRQ; + netlist_ttl_input_t m_LOADQ; ); #endif /* NLD_9316_H_ */ diff --git a/src/emu/netlist/devices/nld_legacy.c b/src/emu/netlist/devices/nld_legacy.c index 4afe74a45d8..e23c7287ea0 100644 --- a/src/emu/netlist/devices/nld_legacy.c +++ b/src/emu/netlist/devices/nld_legacy.c @@ -7,141 +7,141 @@ NETLIB_START(nicMultiSwitch) { - static const char *sIN[8] = { "i1", "i2", "i3", "i4", "i5", "i6", "i7", "i8" }; - int i; + static const char *sIN[8] = { "i1", "i2", "i3", "i4", "i5", "i6", "i7", "i8" }; + int i; - m_position = 0; - m_low.initial(0); + m_position = 0; + m_low.initial(0); - for (i=0; i<8; i++) - { - register_input(sIN[i], m_I[i]); - m_low.net().register_con(m_I[i]); - //m_I[i].set_net(m_low.m_net); - } - register_param("POS", m_POS, 0); - register_output("Q", m_Q); + for (i=0; i<8; i++) + { + register_input(sIN[i], m_I[i]); + m_low.net().register_con(m_I[i]); + //m_I[i].set_net(m_low.m_net); + } + register_param("POS", m_POS, 0); + register_output("Q", m_Q); - save(NAME(m_position)); + save(NAME(m_position)); } NETLIB_UPDATE(nicMultiSwitch) { - assert(m_position<8); - OUTANALOG(m_Q, INPANALOG(m_I[m_position]), NLTIME_FROM_NS(1)); + assert(m_position<8); + OUTANALOG(m_Q, INPANALOG(m_I[m_position]), NLTIME_FROM_NS(1)); } NETLIB_UPDATE_PARAM(nicMultiSwitch) { - m_position = m_POS.Value(); - //update(); + m_position = m_POS.Value(); + //update(); } NETLIB_START(nicMixer8) { - static const char *sI[8] = { "I1", "I2", "I3", "I4", "I5", "I6", "I7", "I8" }; - static const char *sR[8] = { "R1", "R2", "R3", "R4", "R5", "R6", "R7", "R8" }; - int i; - - m_low.initial(0); - - for (i=0; i<8; i++) - { - register_input(sI[i], m_I[i]); - m_low.net().register_con(m_I[i]); - //m_I[i].set_output(m_low); - register_param(sR[i], m_R[i], 1e12); - } - register_output("Q", m_Q); + static const char *sI[8] = { "I1", "I2", "I3", "I4", "I5", "I6", "I7", "I8" }; + static const char *sR[8] = { "R1", "R2", "R3", "R4", "R5", "R6", "R7", "R8" }; + int i; + + m_low.initial(0); + + for (i=0; i<8; i++) + { + register_input(sI[i], m_I[i]); + m_low.net().register_con(m_I[i]); + //m_I[i].set_output(m_low); + register_param(sR[i], m_R[i], 1e12); + } + register_output("Q", m_Q); } NETLIB_UPDATE(nicMixer8) { - int i; - double r = 0; - - for (i=0; i<8; i++) - { - r += m_w[i] * INPANALOG(m_I[i]); - } - OUTANALOG(m_Q, r, NLTIME_IMMEDIATE); + int i; + double r = 0; + + for (i=0; i<8; i++) + { + r += m_w[i] * INPANALOG(m_I[i]); + } + OUTANALOG(m_Q, r, NLTIME_IMMEDIATE); } NETLIB_UPDATE_PARAM(nicMixer8) { - double t = 0; - int i; + double t = 0; + int i; - for (i=0; i<8; i++) - t += 1.0 / m_R[i].Value(); - t = 1.0 / t; + for (i=0; i<8; i++) + t += 1.0 / m_R[i].Value(); + t = 1.0 / t; - for (i=0; i<8; i++) - m_w[i] = t / m_R[i].Value(); + for (i=0; i<8; i++) + m_w[i] = t / m_R[i].Value(); } NETLIB_START(nicRSFF) { - register_input("S", m_S); - register_input("R", m_R); - register_output("Q", m_Q); - register_output("QQ", m_QQ); - m_Q.initial(0); - m_QQ.initial(1); + register_input("S", m_S); + register_input("R", m_R); + register_output("Q", m_Q); + register_output("QQ", m_QQ); + m_Q.initial(0); + m_QQ.initial(1); } NETLIB_UPDATE(nicRSFF) { - if (INPLOGIC(m_S)) - { - OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(10)); - OUTLOGIC(m_QQ, 0, NLTIME_FROM_NS(10)); - } - else if (INPLOGIC(m_R)) - { - OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(10)); - OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(10)); - } + if (INPLOGIC(m_S)) + { + OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(10)); + OUTLOGIC(m_QQ, 0, NLTIME_FROM_NS(10)); + } + else if (INPLOGIC(m_R)) + { + OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(10)); + OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(10)); + } } NETLIB_START(nicNE555N_MSTABLE) { - register_input("TRIG", m_trigger); - register_input("CV", m_CV); + register_input("TRIG", m_trigger); + register_input("CV", m_CV); - register_output("Q", m_Q); - register_param("R", m_R, 0.0); - register_param("C", m_C, 0.0); - register_param("VS", m_VS, 5.0); - register_param("VL", m_VL, 0.0 *5.0); + register_output("Q", m_Q); + register_param("R", m_R, 0.0); + register_param("C", m_C, 0.0); + register_param("VS", m_VS, 5.0); + register_param("VL", m_VL, 0.0 *5.0); - m_THRESHOLD_OUT.init_object(*this, name() + "THRESHOLD"); - register_link_internal(m_THRESHOLD, m_THRESHOLD_OUT, netlist_input_t::STATE_INP_ACTIVE); + m_THRESHOLD_OUT.init_object(*this, name() + "THRESHOLD"); + register_link_internal(m_THRESHOLD, m_THRESHOLD_OUT, netlist_input_t::STATE_INP_ACTIVE); - m_Q.initial(5.0 * 0.4); - m_last = false; + m_Q.initial(5.0 * 0.4); + m_last = false; - save(NAME(m_last)); + save(NAME(m_last)); } inline double NETLIB_NAME(nicNE555N_MSTABLE)::nicNE555N_cv() { - return (m_CV.is_highz() ? 0.67 * m_VS.Value() : INPANALOG(m_CV)); + return (m_CV.is_highz() ? 0.67 * m_VS.Value() : INPANALOG(m_CV)); } inline double NETLIB_NAME(nicNE555N_MSTABLE)::nicNE555N_clamp(const double v, const double a, const double b) { - double ret = v; - if (ret > m_VS.Value() - a) - ret = m_VS.Value() - a; - if (ret < b) - ret = b; - return ret; + double ret = v; + if (ret > m_VS.Value() - a) + ret = m_VS.Value() - a; + if (ret < b) + ret = b; + return ret; } NETLIB_UPDATE_PARAM(nicNE555N_MSTABLE) @@ -150,46 +150,46 @@ NETLIB_UPDATE_PARAM(nicNE555N_MSTABLE) NETLIB_UPDATE(nicNE555N_MSTABLE) { - update_param(); // FIXME : m_CV should be on a sub device ... - - double vt = nicNE555N_clamp(nicNE555N_cv(), 0.7, 1.4); - bool bthresh = (INPANALOG(m_THRESHOLD) > vt); - bool btrig = (INPANALOG(m_trigger) > nicNE555N_clamp(nicNE555N_cv() * 0.5, 0.7, 1.4)); - bool out = m_last; - - if (!btrig) - { - out = true; - } - else if (bthresh) - { - out = false; - } - - if (!m_last && out) - { - double vl = m_VL.Value(); - double time; - - // FIXME : m_CV should be on a sub device ... - - // TI datasheet states minimum pulse of 10 us - if (vt<vl) - time = 10; - else - { - time = - log((m_VS.Value()-vt)/(m_VS.Value()-vl)) * m_R.Value() * m_C.Value() * 1.0e6; // in us - if (time < 10.0) - time = 10.0; - } - - OUTANALOG(m_Q, m_VS.Value() * 0.7, NLTIME_FROM_NS(100)); - OUTANALOG(m_THRESHOLD_OUT, m_VS.Value(), NLTIME_FROM_US(time )); - } - else if (m_last && !out) - { - OUTANALOG(m_Q, 0.25, NLTIME_FROM_NS(100)); - OUTANALOG(m_THRESHOLD_OUT, 0.0, NLTIME_FROM_NS(1)); - } - m_last = out; + update_param(); // FIXME : m_CV should be on a sub device ... + + double vt = nicNE555N_clamp(nicNE555N_cv(), 0.7, 1.4); + bool bthresh = (INPANALOG(m_THRESHOLD) > vt); + bool btrig = (INPANALOG(m_trigger) > nicNE555N_clamp(nicNE555N_cv() * 0.5, 0.7, 1.4)); + bool out = m_last; + + if (!btrig) + { + out = true; + } + else if (bthresh) + { + out = false; + } + + if (!m_last && out) + { + double vl = m_VL.Value(); + double time; + + // FIXME : m_CV should be on a sub device ... + + // TI datasheet states minimum pulse of 10 us + if (vt<vl) + time = 10; + else + { + time = - log((m_VS.Value()-vt)/(m_VS.Value()-vl)) * m_R.Value() * m_C.Value() * 1.0e6; // in us + if (time < 10.0) + time = 10.0; + } + + OUTANALOG(m_Q, m_VS.Value() * 0.7, NLTIME_FROM_NS(100)); + OUTANALOG(m_THRESHOLD_OUT, m_VS.Value(), NLTIME_FROM_US(time )); + } + else if (m_last && !out) + { + OUTANALOG(m_Q, 0.25, NLTIME_FROM_NS(100)); + OUTANALOG(m_THRESHOLD_OUT, 0.0, NLTIME_FROM_NS(1)); + } + m_last = out; } diff --git a/src/emu/netlist/devices/nld_legacy.h b/src/emu/netlist/devices/nld_legacy.h index eb94dbfaba0..43cdd5f6be3 100644 --- a/src/emu/netlist/devices/nld_legacy.h +++ b/src/emu/netlist/devices/nld_legacy.h @@ -20,83 +20,83 @@ // ---------------------------------------------------------------------------------------- #define NETDEV_RSFF(_name, _S, _R) \ - NET_REGISTER_DEV(nicRSFF, _name) \ - NET_CONNECT(_name, S, _S) \ - NET_CONNECT(_name, R, _R) + NET_REGISTER_DEV(nicRSFF, _name) \ + NET_CONNECT(_name, S, _S) \ + NET_CONNECT(_name, R, _R) #define NE555N_MSTABLE(_name, _TRIG, _CV) \ - NET_REGISTER_DEV(nicNE555N_MSTABLE, _name) \ - NET_CONNECT(_name, TRIG, _TRIG) \ - NET_CONNECT(_name, CV, _CV) + NET_REGISTER_DEV(nicNE555N_MSTABLE, _name) \ + NET_CONNECT(_name, TRIG, _TRIG) \ + NET_CONNECT(_name, CV, _CV) #define NETDEV_MIXER3(_name, _I1, _I2, _I3) \ - NET_REGISTER_DEV(nicMixer8, _name) \ - NET_CONNECT(_name, I1, _I1) \ - NET_CONNECT(_name, I2, _I2) \ - NET_CONNECT(_name, I3, _I3) + NET_REGISTER_DEV(nicMixer8, _name) \ + NET_CONNECT(_name, I1, _I1) \ + NET_CONNECT(_name, I2, _I2) \ + NET_CONNECT(_name, I3, _I3) #define NETDEV_SWITCH2(_name, _i1, _i2) \ - NET_REGISTER_DEV(nicMultiSwitch, _name) \ - NET_CONNECT(_name, i1, _i1) \ - NET_CONNECT(_name, i2, _i2) + NET_REGISTER_DEV(nicMultiSwitch, _name) \ + NET_CONNECT(_name, i1, _i1) \ + NET_CONNECT(_name, i2, _i2) // ---------------------------------------------------------------------------------------- // Devices ... // ---------------------------------------------------------------------------------------- NETLIB_DEVICE(nicRSFF, - netlist_ttl_input_t m_S; - netlist_ttl_input_t m_R; + netlist_ttl_input_t m_S; + netlist_ttl_input_t m_R; - netlist_ttl_output_t m_Q; - netlist_ttl_output_t m_QQ; + netlist_ttl_output_t m_Q; + netlist_ttl_output_t m_QQ; ); NETLIB_DEVICE_WITH_PARAMS(nicMixer8, - netlist_analog_input_t m_I[8]; + netlist_analog_input_t m_I[8]; - netlist_analog_output_t m_Q; - netlist_analog_output_t m_low; + netlist_analog_output_t m_Q; + netlist_analog_output_t m_low; - netlist_param_double_t m_R[8]; + netlist_param_double_t m_R[8]; - double m_w[8]; + double m_w[8]; ); NETLIB_DEVICE_WITH_PARAMS(nicNE555N_MSTABLE, - //ATTR_HOT void timer_cb(INT32 timer_id); + //ATTR_HOT void timer_cb(INT32 timer_id); - netlist_analog_input_t m_trigger; - netlist_analog_input_t m_CV; - netlist_analog_input_t m_THRESHOLD; /* internal */ + netlist_analog_input_t m_trigger; + netlist_analog_input_t m_CV; + netlist_analog_input_t m_THRESHOLD; /* internal */ - bool m_last; + bool m_last; - netlist_analog_output_t m_Q; - netlist_analog_output_t m_THRESHOLD_OUT; /* internal */ + netlist_analog_output_t m_Q; + netlist_analog_output_t m_THRESHOLD_OUT; /* internal */ - //netlist_base_timer_t *m_timer; - netlist_param_double_t m_R; - netlist_param_double_t m_C; - netlist_param_double_t m_VS; - netlist_param_double_t m_VL; + //netlist_base_timer_t *m_timer; + netlist_param_double_t m_R; + netlist_param_double_t m_C; + netlist_param_double_t m_VS; + netlist_param_double_t m_VL; - double nicNE555N_cv(); - double nicNE555N_clamp(const double v, const double a, const double b); + double nicNE555N_cv(); + double nicNE555N_clamp(const double v, const double a, const double b); ); NETLIB_DEVICE_WITH_PARAMS(nicMultiSwitch, - netlist_analog_input_t m_I[8]; + netlist_analog_input_t m_I[8]; - netlist_analog_output_t m_Q; - netlist_analog_output_t m_low; + netlist_analog_output_t m_Q; + netlist_analog_output_t m_low; - netlist_param_int_t m_POS; + netlist_param_int_t m_POS; - int m_position; + int m_position; ); diff --git a/src/emu/netlist/devices/nld_log.c b/src/emu/netlist/devices/nld_log.c index e175c4670a8..837923154ab 100644 --- a/src/emu/netlist/devices/nld_log.c +++ b/src/emu/netlist/devices/nld_log.c @@ -10,31 +10,31 @@ NETLIB_START(log) { - register_input("I", m_I); + register_input("I", m_I); - pstring filename = "netlist_" + name() + ".log"; - m_file = fopen(filename, "w"); + pstring filename = "netlist_" + name() + ".log"; + m_file = fopen(filename, "w"); } NETLIB_UPDATE(log) { - fprintf(m_file, "%e %e\n", netlist().time().as_double(), INPANALOG(m_I)); + fprintf(m_file, "%e %e\n", netlist().time().as_double(), INPANALOG(m_I)); } NETLIB_NAME(log)::~NETLIB_NAME(log)() { - fclose(m_file); + fclose(m_file); } NETLIB_START(logD) { - NETLIB_NAME(log)::start(); - register_input("I2", m_I2); + NETLIB_NAME(log)::start(); + register_input("I2", m_I2); } NETLIB_UPDATE(logD) { - fprintf(m_file, "%e %e\n", netlist().time().as_double(), INPANALOG(m_I) - INPANALOG(m_I2)); + fprintf(m_file, "%e %e\n", netlist().time().as_double(), INPANALOG(m_I) - INPANALOG(m_I2)); } // FIXME: Implement wav later, this must be clock triggered device where the input to be written @@ -42,19 +42,19 @@ NETLIB_UPDATE(logD) #if 0 NETLIB_START(wav) { - register_input("I", m_I); + register_input("I", m_I); - pstring filename = "netlist_" + name() + ".wav"; - m_file = wav_open(filename, sample_rate(), active_inputs()/2) + pstring filename = "netlist_" + name() + ".wav"; + m_file = wav_open(filename, sample_rate(), active_inputs()/2) } NETLIB_UPDATE(wav) { - fprintf(m_file, "%e %e\n", netlist().time().as_double(), INPANALOG(m_I)); + fprintf(m_file, "%e %e\n", netlist().time().as_double(), INPANALOG(m_I)); } NETLIB_NAME(log)::~NETLIB_NAME(wav)() { - fclose(m_file); + fclose(m_file); } #endif diff --git a/src/emu/netlist/devices/nld_log.h b/src/emu/netlist/devices/nld_log.h index f8910f51112..16d389263b8 100644 --- a/src/emu/netlist/devices/nld_log.h +++ b/src/emu/netlist/devices/nld_log.h @@ -21,32 +21,32 @@ #include "../nl_base.h" #define NETDEV_LOG(_name, _I) \ - NET_REGISTER_DEV(log, _name) \ - NET_CONNECT(_name, I, _I) + NET_REGISTER_DEV(log, _name) \ + NET_CONNECT(_name, I, _I) NETLIB_DEVICE(log, - ~NETLIB_NAME(log)(); - netlist_analog_input_t m_I; + ~NETLIB_NAME(log)(); + netlist_analog_input_t m_I; protected: - FILE *m_file; + FILE *m_file; ); #define NETDEV_LOGD(_name, _I, _I2) \ - NET_REGISTER_DEV(logD, _name) \ - NET_CONNECT(_name, I, _I) \ - NET_CONNECT(_name, I2, _I2) + NET_REGISTER_DEV(logD, _name) \ + NET_CONNECT(_name, I, _I) \ + NET_CONNECT(_name, I2, _I2) NETLIB_DEVICE_DERIVED(logD, log, - netlist_analog_input_t m_I2; + netlist_analog_input_t m_I2; ); #if 0 NETLIB_DEVICE(wav, - ~NETLIB_NAME(wav)(); - netlist_analog_input_t m_I; + ~NETLIB_NAME(wav)(); + netlist_analog_input_t m_I; private: - // FIXME: rewrite sound/wavwrite.h to be an object ... - void *m_file; + // FIXME: rewrite sound/wavwrite.h to be an object ... + void *m_file; ); #endif diff --git a/src/emu/netlist/devices/nld_ne555.c b/src/emu/netlist/devices/nld_ne555.c index 06a616f2bb9..4eb20c75980 100644 --- a/src/emu/netlist/devices/nld_ne555.c +++ b/src/emu/netlist/devices/nld_ne555.c @@ -11,74 +11,73 @@ inline double NETLIB_NAME(NE555)::clamp(const double v, const double a, const double b) { - double ret = v; - double vcc = TERMANALOG(m_R1.m_P); + double ret = v; + double vcc = TERMANALOG(m_R1.m_P); - if (ret > vcc - a) - ret = vcc - a; - if (ret < b) - ret = b; - return ret; + if (ret > vcc - a) + ret = vcc - a; + if (ret < b) + ret = b; + return ret; } NETLIB_START(NE555) { + register_sub(m_R1, "R1"); + register_sub(m_R2, "R2"); + register_sub(m_R3, "R3"); + register_sub(m_RDIS, "RDIS"); - register_sub(m_R1, "R1"); - register_sub(m_R2, "R2"); - register_sub(m_R3, "R3"); - register_sub(m_RDIS, "RDIS"); + register_subalias("GND", m_R3.m_N); // Pin 1 + register_input("TRIG", m_TRIG); // Pin 2 + register_output("OUT", m_OUT); // Pin 3 + register_input("RESET", m_RESET); // Pin 4 + register_subalias("CONT", m_R1.m_N); // Pin 5 + register_input("THRESH", m_THRES); // Pin 6 + register_subalias("DISCH", m_RDIS.m_P); // Pin 7 + register_subalias("VCC", m_R1.m_P); // Pin 8 - register_subalias("GND", m_R3.m_N); // Pin 1 - register_input("TRIG", m_TRIG); // Pin 2 - register_output("OUT", m_OUT); // Pin 3 - register_input("RESET", m_RESET); // Pin 4 - register_subalias("CONT", m_R1.m_N); // Pin 5 - register_input("THRESH", m_THRES); // Pin 6 - register_subalias("DISCH", m_RDIS.m_P); // Pin 7 - register_subalias("VCC", m_R1.m_P); // Pin 8 + m_R1.set_R(5000); + m_R2.set_R(5000); + m_R3.set_R(5000); + m_RDIS.set_R(R_OFF); - m_R1.set_R(5000); - m_R2.set_R(5000); - m_R3.set_R(5000); - m_RDIS.set_R(R_OFF); + setup().connect(m_R1.m_N, m_R2.m_P); + setup().connect(m_R2.m_N, m_R3.m_P); + setup().connect(m_RDIS.m_N, m_R3.m_N); - setup().connect(m_R1.m_N, m_R2.m_P); - setup().connect(m_R2.m_N, m_R3.m_P); - setup().connect(m_RDIS.m_N, m_R3.m_N); + m_last_out = false; - m_last_out = false; - - save(NAME(m_last_out)); + save(NAME(m_last_out)); } NETLIB_UPDATE(NE555) { - // FIXME: assumes GND is connected to 0V. + // FIXME: assumes GND is connected to 0V. - double vt = clamp(TERMANALOG(m_R2.m_P), 0.7, 1.4); - bool bthresh = (INPANALOG(m_THRES) > vt); - bool btrig = (INPANALOG(m_TRIG) > clamp(TERMANALOG(m_R2.m_N), 0.7, 1.4)); - bool out = m_last_out; + double vt = clamp(TERMANALOG(m_R2.m_P), 0.7, 1.4); + bool bthresh = (INPANALOG(m_THRES) > vt); + bool btrig = (INPANALOG(m_TRIG) > clamp(TERMANALOG(m_R2.m_N), 0.7, 1.4)); + bool out = m_last_out; - if (!btrig) - { - out = true; - } - else if (bthresh) - { - out = false; - } + if (!btrig) + { + out = true; + } + else if (bthresh) + { + out = false; + } - if (!m_last_out && out) - { - OUTANALOG(m_OUT, TERMANALOG(m_R1.m_P), NLTIME_FROM_NS(100)); - m_RDIS.set_R(R_OFF); - } - else if (m_last_out && !out) - { - OUTANALOG(m_OUT, TERMANALOG(m_R3.m_N), NLTIME_FROM_NS(100)); - m_RDIS.set_R(R_ON); - } - m_last_out = out; + if (!m_last_out && out) + { + OUTANALOG(m_OUT, TERMANALOG(m_R1.m_P), NLTIME_FROM_NS(100)); + m_RDIS.set_R(R_OFF); + } + else if (m_last_out && !out) + { + OUTANALOG(m_OUT, TERMANALOG(m_R3.m_N), NLTIME_FROM_NS(100)); + m_RDIS.set_R(R_ON); + } + m_last_out = out; } diff --git a/src/emu/netlist/devices/nld_ne555.h b/src/emu/netlist/devices/nld_ne555.h index a350a684c28..487e8d33789 100644 --- a/src/emu/netlist/devices/nld_ne555.h +++ b/src/emu/netlist/devices/nld_ne555.h @@ -23,22 +23,21 @@ #include "nld_twoterm.h" #define NETDEV_NE555(_name) \ - NET_REGISTER_DEV(NE555, _name) \ - + NET_REGISTER_DEV(NE555, _name) NETLIB_DEVICE(NE555, - NETLIB_NAME(R) m_R1; - NETLIB_NAME(R) m_R2; - NETLIB_NAME(R) m_R3; - NETLIB_NAME(R) m_RDIS; + NETLIB_NAME(R) m_R1; + NETLIB_NAME(R) m_R2; + NETLIB_NAME(R) m_R3; + NETLIB_NAME(R) m_RDIS; - netlist_logic_input_t m_RESET; - netlist_analog_input_t m_THRES; - netlist_analog_input_t m_TRIG; - netlist_analog_output_t m_OUT; + netlist_logic_input_t m_RESET; + netlist_analog_input_t m_THRES; + netlist_analog_input_t m_TRIG; + netlist_analog_output_t m_OUT; - bool m_last_out; + bool m_last_out; - double clamp(const double v, const double a, const double b); + double clamp(const double v, const double a, const double b); ); diff --git a/src/emu/netlist/devices/nld_signal.h b/src/emu/netlist/devices/nld_signal.h index a9e99ec381d..e54eaac7372 100644 --- a/src/emu/netlist/devices/nld_signal.h +++ b/src/emu/netlist/devices/nld_signal.h @@ -93,7 +93,7 @@ public: { register_input(sIN[i], m_i[i]); } - save(NAME(m_active)); + save(NAME(m_active)); } #if (USE_DEACTIVE_DEVICE) @@ -167,7 +167,7 @@ public: { register_input(sIN[i], m_i[i], netlist_input_t::STATE_INP_ACTIVE); } - save(NAME(m_active)); + save(NAME(m_active)); } #if (USE_DEACTIVE_DEVICE) diff --git a/src/emu/netlist/devices/nld_solver.c b/src/emu/netlist/devices/nld_solver.c index b02f5e4d701..7c8ed65d0e5 100644 --- a/src/emu/netlist/devices/nld_solver.c +++ b/src/emu/netlist/devices/nld_solver.c @@ -15,155 +15,155 @@ ATTR_COLD void netlist_matrix_solver_t::setup(netlist_net_t::list_t &nets, NETLIB_NAME(solver) &aowner) { - m_owner = &aowner; - for (netlist_net_t::list_t::entry_t *pn = nets.first(); pn != NULL; pn = nets.next(pn)) - { - NL_VERBOSE_OUT(("setting up net\n")); - - m_nets.add(pn->object()); - pn->object()->m_solver = this; - - for (netlist_core_terminal_t *p = pn->object()->m_head; p != NULL; p = p->m_update_list_next) - { - switch (p->type()) - { - case netlist_terminal_t::TERMINAL: - switch (p->netdev().family()) - { - case netlist_device_t::CAPACITOR: - if (!m_steps.contains(&p->netdev())) - m_steps.add(&p->netdev()); - break; - case netlist_device_t::DIODE: - //case netlist_device_t::VCVS: - //case netlist_device_t::BJT_SWITCH: - if (!m_dynamic.contains(&p->netdev())) - m_dynamic.add(&p->netdev()); - break; - default: - break; - } - pn->object()->m_terms.add(static_cast<netlist_terminal_t *>(p)); - NL_VERBOSE_OUT(("Added terminal\n")); - break; - case netlist_terminal_t::INPUT: - if (!m_inps.contains(&p->netdev())) - m_inps.add(&p->netdev()); - NL_VERBOSE_OUT(("Added input\n")); - break; - default: - owner().netlist().xfatalerror("unhandled element found\n"); - break; - } - } - } + m_owner = &aowner; + for (netlist_net_t::list_t::entry_t *pn = nets.first(); pn != NULL; pn = nets.next(pn)) + { + NL_VERBOSE_OUT(("setting up net\n")); + + m_nets.add(pn->object()); + pn->object()->m_solver = this; + + for (netlist_core_terminal_t *p = pn->object()->m_head; p != NULL; p = p->m_update_list_next) + { + switch (p->type()) + { + case netlist_terminal_t::TERMINAL: + switch (p->netdev().family()) + { + case netlist_device_t::CAPACITOR: + if (!m_steps.contains(&p->netdev())) + m_steps.add(&p->netdev()); + break; + case netlist_device_t::DIODE: + //case netlist_device_t::VCVS: + //case netlist_device_t::BJT_SWITCH: + if (!m_dynamic.contains(&p->netdev())) + m_dynamic.add(&p->netdev()); + break; + default: + break; + } + pn->object()->m_terms.add(static_cast<netlist_terminal_t *>(p)); + NL_VERBOSE_OUT(("Added terminal\n")); + break; + case netlist_terminal_t::INPUT: + if (!m_inps.contains(&p->netdev())) + m_inps.add(&p->netdev()); + NL_VERBOSE_OUT(("Added input\n")); + break; + default: + owner().netlist().xfatalerror("unhandled element found\n"); + break; + } + } + } } ATTR_HOT inline void netlist_matrix_solver_t::step(const netlist_time delta) { - const double dd = delta.as_double(); - for (dev_list_t::entry_t *p = m_steps.first(); p != NULL; p = m_steps.next(p)) - p->object()->step_time(dd); + const double dd = delta.as_double(); + for (dev_list_t::entry_t *p = m_steps.first(); p != NULL; p = m_steps.next(p)) + p->object()->step_time(dd); } ATTR_HOT inline void netlist_matrix_solver_t::update_inputs() { - for (dev_list_t::entry_t *p = m_inps.first(); p != NULL; p = m_inps.next(p)) - p->object()->update_dev(); + for (dev_list_t::entry_t *p = m_inps.first(); p != NULL; p = m_inps.next(p)) + p->object()->update_dev(); } ATTR_HOT inline bool netlist_matrix_solver_t::solve() { - bool resched = false; - - /* update all non-linear devices */ - for (dev_list_t::entry_t *p = m_dynamic.first(); p != NULL; p = m_dynamic.next(p)) - switch (p->object()->family()) - { - case netlist_device_t::DIODE: - static_cast<NETLIB_NAME(D) *>(p->object())->update_terminals(); - break; - default: - p->object()->update_terminals(); - break; - } - - for (netlist_net_t::list_t::entry_t *pn = m_nets.first(); pn != NULL; pn = m_nets.next(pn)) - { - netlist_net_t *net = pn->object(); - - double gtot = 0; - double gabs = 0; - double iIdr = 0; - const netlist_net_t::terminal_list_t &terms = net->m_terms; + bool resched = false; + + /* update all non-linear devices */ + for (dev_list_t::entry_t *p = m_dynamic.first(); p != NULL; p = m_dynamic.next(p)) + switch (p->object()->family()) + { + case netlist_device_t::DIODE: + static_cast<NETLIB_NAME(D) *>(p->object())->update_terminals(); + break; + default: + p->object()->update_terminals(); + break; + } + + for (netlist_net_t::list_t::entry_t *pn = m_nets.first(); pn != NULL; pn = m_nets.next(pn)) + { + netlist_net_t *net = pn->object(); + + double gtot = 0; + double gabs = 0; + double iIdr = 0; + const netlist_net_t::terminal_list_t &terms = net->m_terms; #if 1 - switch (terms.count()) - { - case 1: - { - const netlist_terminal_t *pt = terms.first()->object(); - gtot = pt->m_gt; - gabs = fabs(pt->m_go); - iIdr = pt->m_Idr + pt->m_go * pt->m_otherterm->net().Q_Analog(); - } - break; - case 2: - { - const netlist_terminal_t *pt1 = terms[0]; - const netlist_terminal_t *pt2 = terms[1]; - gtot = pt1->m_gt + pt2->m_gt; - gabs = fabs(pt1->m_go) + fabs(pt2->m_go); - iIdr = pt1->m_Idr + pt1->m_go * pt1->m_otherterm->net().Q_Analog() - + pt2->m_Idr + pt2->m_go * pt2->m_otherterm->net().Q_Analog(); - } - break; - case 3: - { - const netlist_terminal_t *pt1 = terms[0]; - const netlist_terminal_t *pt2 = terms[1]; - const netlist_terminal_t *pt3 = terms[2]; - gtot = pt1->m_gt + pt2->m_gt + pt3->m_gt; - gabs = fabs(pt1->m_go) + fabs(pt2->m_go) + fabs(pt3->m_go); - iIdr = pt1->m_Idr + pt1->m_go * pt1->m_otherterm->net().Q_Analog() - + pt2->m_Idr + pt2->m_go * pt2->m_otherterm->net().Q_Analog() - + pt3->m_Idr + pt3->m_go * pt3->m_otherterm->net().Q_Analog(); - } - break; - default: - for (netlist_net_t::terminal_list_t::entry_t *e = terms.first(); e != NULL; e = terms.next(e)) - { - netlist_terminal_t *pt = e->object(); - gtot += pt->m_gt; - gabs += fabs(pt->m_go); - iIdr += pt->m_Idr + pt->m_go * pt->m_otherterm->net().Q_Analog(); - } - break; - } + switch (terms.count()) + { + case 1: + { + const netlist_terminal_t *pt = terms.first()->object(); + gtot = pt->m_gt; + gabs = fabs(pt->m_go); + iIdr = pt->m_Idr + pt->m_go * pt->m_otherterm->net().Q_Analog(); + } + break; + case 2: + { + const netlist_terminal_t *pt1 = terms[0]; + const netlist_terminal_t *pt2 = terms[1]; + gtot = pt1->m_gt + pt2->m_gt; + gabs = fabs(pt1->m_go) + fabs(pt2->m_go); + iIdr = pt1->m_Idr + pt1->m_go * pt1->m_otherterm->net().Q_Analog() + + pt2->m_Idr + pt2->m_go * pt2->m_otherterm->net().Q_Analog(); + } + break; + case 3: + { + const netlist_terminal_t *pt1 = terms[0]; + const netlist_terminal_t *pt2 = terms[1]; + const netlist_terminal_t *pt3 = terms[2]; + gtot = pt1->m_gt + pt2->m_gt + pt3->m_gt; + gabs = fabs(pt1->m_go) + fabs(pt2->m_go) + fabs(pt3->m_go); + iIdr = pt1->m_Idr + pt1->m_go * pt1->m_otherterm->net().Q_Analog() + + pt2->m_Idr + pt2->m_go * pt2->m_otherterm->net().Q_Analog() + + pt3->m_Idr + pt3->m_go * pt3->m_otherterm->net().Q_Analog(); + } + break; + default: + for (netlist_net_t::terminal_list_t::entry_t *e = terms.first(); e != NULL; e = terms.next(e)) + { + netlist_terminal_t *pt = e->object(); + gtot += pt->m_gt; + gabs += fabs(pt->m_go); + iIdr += pt->m_Idr + pt->m_go * pt->m_otherterm->net().Q_Analog(); + } + break; + } #else - for (netlist_net_t::terminal_list_t::entry_t *e = terms.first(); e != NULL; e = terms.next(e)) - { - netlist_terminal_t *pt = e->object(); - gtot += pt->m_gt; - gabs += fabs(pt->m_go); - iIdr += pt->m_Idr + pt->m_go * pt->m_otherterm->net().Q_Analog(); - } + for (netlist_net_t::terminal_list_t::entry_t *e = terms.first(); e != NULL; e = terms.next(e)) + { + netlist_terminal_t *pt = e->object(); + gtot += pt->m_gt; + gabs += fabs(pt->m_go); + iIdr += pt->m_Idr + pt->m_go * pt->m_otherterm->net().Q_Analog(); + } #endif - double new_val; - gabs *= m_convergence_factor; - if (gabs > gtot) - new_val = (net->m_cur.Analog * gabs + iIdr) / (gtot + gabs); - else - new_val = iIdr / gtot; - - if (fabs(new_val - net->m_cur.Analog) > m_accuracy) - resched = true; - net->m_cur.Analog = net->m_new.Analog = new_val; - - NL_VERBOSE_OUT(("Info: %d\n", pn->object()->m_num_cons)); - //NL_VERBOSE_OUT(("New: %lld %f %f\n", netlist().time().as_raw(), netlist().time().as_double(), new_val)); - } - return resched; + double new_val; + gabs *= m_convergence_factor; + if (gabs > gtot) + new_val = (net->m_cur.Analog * gabs + iIdr) / (gtot + gabs); + else + new_val = iIdr / gtot; + + if (fabs(new_val - net->m_cur.Analog) > m_accuracy) + resched = true; + net->m_cur.Analog = net->m_new.Analog = new_val; + + NL_VERBOSE_OUT(("Info: %d\n", pn->object()->m_num_cons)); + //NL_VERBOSE_OUT(("New: %lld %f %f\n", netlist().time().as_raw(), netlist().time().as_double(), new_val)); + } + return resched; } // ---------------------------------------------------------------------------------------- @@ -174,160 +174,159 @@ typedef netlist_net_t::list_t *net_groups_t; static bool already_processed(net_groups_t groups, int &cur_group, netlist_net_t *net) { - if (net->isRailNet()) - return true; - for (int i = 0; i <= cur_group; i++) - { - if (groups[i].contains(net)) - return true; - } - return false; + if (net->isRailNet()) + return true; + for (int i = 0; i <= cur_group; i++) + { + if (groups[i].contains(net)) + return true; + } + return false; } static void process_net(net_groups_t groups, int &cur_group, netlist_net_t *net) { - /* add the net */ - if (net->m_head == NULL) - return; - groups[cur_group].add(net); - for (netlist_core_terminal_t *p = net->m_head; p != NULL; p = p->m_update_list_next) - { - if (p->isType(netlist_terminal_t::TERMINAL)) - { - netlist_terminal_t *pt = static_cast<netlist_terminal_t *>(p); - netlist_net_t *nnet = &pt->m_otherterm->net(); - if (!already_processed(groups, cur_group, nnet)) - process_net(groups, cur_group, nnet); - } - } + /* add the net */ + if (net->m_head == NULL) + return; + groups[cur_group].add(net); + for (netlist_core_terminal_t *p = net->m_head; p != NULL; p = p->m_update_list_next) + { + if (p->isType(netlist_terminal_t::TERMINAL)) + { + netlist_terminal_t *pt = static_cast<netlist_terminal_t *>(p); + netlist_net_t *nnet = &pt->m_otherterm->net(); + if (!already_processed(groups, cur_group, nnet)) + process_net(groups, cur_group, nnet); + } + } } NETLIB_START(solver) { - register_output("Q_sync", m_Q_sync); - register_output("Q_step", m_Q_step); - //register_input("FB", m_feedback); + register_output("Q_sync", m_Q_sync); + register_output("Q_step", m_Q_step); + //register_input("FB", m_feedback); - register_param("SYNC_DELAY", m_sync_delay, NLTIME_FROM_NS(10).as_double()); - m_nt_sync_delay = m_sync_delay.Value(); + register_param("SYNC_DELAY", m_sync_delay, NLTIME_FROM_NS(10).as_double()); + m_nt_sync_delay = m_sync_delay.Value(); - register_param("FREQ", m_freq, 48000.0); - m_inc = netlist_time::from_hz(m_freq.Value()); + register_param("FREQ", m_freq, 48000.0); + m_inc = netlist_time::from_hz(m_freq.Value()); - register_param("ACCURACY", m_accuracy, 1e-3); - register_param("CONVERG", m_convergence, 0.3); + register_param("ACCURACY", m_accuracy, 1e-3); + register_param("CONVERG", m_convergence, 0.3); - // internal staff + // internal staff - register_input("FB_sync", m_fb_sync, netlist_input_t::STATE_INP_ACTIVE); - register_input("FB_step", m_fb_step, netlist_input_t::STATE_INP_ACTIVE); + register_input("FB_sync", m_fb_sync, netlist_input_t::STATE_INP_ACTIVE); + register_input("FB_step", m_fb_step, netlist_input_t::STATE_INP_ACTIVE); - setup().connect(m_fb_sync, m_Q_sync); - setup().connect(m_fb_step, m_Q_step); + setup().connect(m_fb_sync, m_Q_sync); + setup().connect(m_fb_step, m_Q_step); - m_last_step = netlist_time::zero; + m_last_step = netlist_time::zero; - save(NAME(m_last_step)); + save(NAME(m_last_step)); } NETLIB_UPDATE_PARAM(solver) { - m_inc = netlist_time::from_hz(m_freq.Value()); + m_inc = netlist_time::from_hz(m_freq.Value()); } NETLIB_NAME(solver)::~NETLIB_NAME(solver)() { - netlist_matrix_solver_t::list_t::entry_t *e = m_mat_solvers.first(); - while (e != NULL) - { - netlist_matrix_solver_t::list_t::entry_t *en = m_mat_solvers.next(e); - delete e->object(); - e = en; - } + netlist_matrix_solver_t::list_t::entry_t *e = m_mat_solvers.first(); + while (e != NULL) + { + netlist_matrix_solver_t::list_t::entry_t *en = m_mat_solvers.next(e); + delete e->object(); + e = en; + } } NETLIB_FUNC_VOID(solver, post_start, ()) { - netlist_net_t::list_t groups[100]; - int cur_group = -1; - - SOLVER_VERBOSE_OUT(("Scanning net groups ...\n")); - // determine net groups - for (netlist_net_t::list_t::entry_t *pn = netlist().m_nets.first(); pn != NULL; pn = netlist().m_nets.next(pn)) - { - if (!already_processed(groups, cur_group, pn->object())) - { - cur_group++; - process_net(groups, cur_group, pn->object()); - } - } - - // setup the solvers - SOLVER_VERBOSE_OUT(("Found %d net groups in %d nets\n", cur_group + 1, m_nets.count())); - for (int i = 0; i <= cur_group; i++) - { - netlist_matrix_solver_t *ms = new netlist_matrix_solver_t(); - ms->m_accuracy = m_accuracy.Value(); - ms->m_convergence_factor = m_convergence.Value(); - ms->setup(groups[i], *this); - m_mat_solvers.add(ms); - SOLVER_VERBOSE_OUT(("%d ==> %d nets %s\n", i, groups[i].count(), groups[i].first()->object()->m_head->name().cstr())); - SOLVER_VERBOSE_OUT((" has %s elements\n", ms->is_dynamic() ? "dynamic" : "no dynamic")); - } + netlist_net_t::list_t groups[100]; + int cur_group = -1; + + SOLVER_VERBOSE_OUT(("Scanning net groups ...\n")); + // determine net groups + for (netlist_net_t::list_t::entry_t *pn = netlist().m_nets.first(); pn != NULL; pn = netlist().m_nets.next(pn)) + { + if (!already_processed(groups, cur_group, pn->object())) + { + cur_group++; + process_net(groups, cur_group, pn->object()); + } + } + + // setup the solvers + SOLVER_VERBOSE_OUT(("Found %d net groups in %d nets\n", cur_group + 1, m_nets.count())); + for (int i = 0; i <= cur_group; i++) + { + netlist_matrix_solver_t *ms = new netlist_matrix_solver_t(); + ms->m_accuracy = m_accuracy.Value(); + ms->m_convergence_factor = m_convergence.Value(); + ms->setup(groups[i], *this); + m_mat_solvers.add(ms); + SOLVER_VERBOSE_OUT(("%d ==> %d nets %s\n", i, groups[i].count(), groups[i].first()->object()->m_head->name().cstr())); + SOLVER_VERBOSE_OUT((" has %s elements\n", ms->is_dynamic() ? "dynamic" : "no dynamic")); + } } NETLIB_UPDATE(solver) { - //m_Q.setToNoCheck(!m_Q.new_Q(), m_inc ); - //OUTLOGIC(m_Q, !m_Q.net().new_Q(), m_inc ); - - bool resched = false; - int resched_cnt = 0; - netlist_time now = netlist().time(); - netlist_time delta = now - m_last_step; - - if (delta >= m_inc) - { - NL_VERBOSE_OUT(("Step!\n")); - /* update all terminals for new time step */ - m_last_step = now; - for (netlist_matrix_solver_t::list_t::entry_t *e = m_mat_solvers.first(); e != NULL; e = m_mat_solvers.next(e)) - { - e->object()->step(delta); - } - } - bool global_resched = false; - for (netlist_matrix_solver_t::list_t::entry_t *e = m_mat_solvers.first(); e != NULL; e = m_mat_solvers.next(e)) - { - resched_cnt = (e->object()->is_dynamic() ? 0 : 1); - do { - resched = e->object()->solve(); - resched_cnt++; - } while ((resched && (resched_cnt < 5)) || (resched_cnt <= 1)); - global_resched = global_resched || resched; - } - //if (global_resched) - // printf("rescheduled\n"); - if (global_resched) - { - schedule(); - } - else - { - /* update all inputs connected */ - for (netlist_matrix_solver_t::list_t::entry_t *e = m_mat_solvers.first(); e != NULL; e = m_mat_solvers.next(e)) - { - e->object()->update_inputs(); - } - - /* step circuit */ - if (!m_Q_step.net().is_queued()) - m_Q_step.net().push_to_queue(m_inc); - } + //m_Q.setToNoCheck(!m_Q.new_Q(), m_inc ); + //OUTLOGIC(m_Q, !m_Q.net().new_Q(), m_inc ); + + bool resched = false; + int resched_cnt = 0; + netlist_time now = netlist().time(); + netlist_time delta = now - m_last_step; + + if (delta >= m_inc) + { + NL_VERBOSE_OUT(("Step!\n")); + /* update all terminals for new time step */ + m_last_step = now; + for (netlist_matrix_solver_t::list_t::entry_t *e = m_mat_solvers.first(); e != NULL; e = m_mat_solvers.next(e)) + { + e->object()->step(delta); + } + } + bool global_resched = false; + for (netlist_matrix_solver_t::list_t::entry_t *e = m_mat_solvers.first(); e != NULL; e = m_mat_solvers.next(e)) + { + resched_cnt = (e->object()->is_dynamic() ? 0 : 1); + do { + resched = e->object()->solve(); + resched_cnt++; + } while ((resched && (resched_cnt < 5)) || (resched_cnt <= 1)); + global_resched = global_resched || resched; + } + //if (global_resched) + // printf("rescheduled\n"); + if (global_resched) + { + schedule(); + } + else + { + /* update all inputs connected */ + for (netlist_matrix_solver_t::list_t::entry_t *e = m_mat_solvers.first(); e != NULL; e = m_mat_solvers.next(e)) + { + e->object()->update_inputs(); + } + + /* step circuit */ + if (!m_Q_step.net().is_queued()) + m_Q_step.net().push_to_queue(m_inc); + } } - diff --git a/src/emu/netlist/devices/nld_solver.h b/src/emu/netlist/devices/nld_solver.h index 55216f70143..0f9d0f54c28 100644 --- a/src/emu/netlist/devices/nld_solver.h +++ b/src/emu/netlist/devices/nld_solver.h @@ -14,7 +14,7 @@ // ---------------------------------------------------------------------------------------- #define NETDEV_SOLVER(_name) \ - NET_REGISTER_DEV(solver, _name) + NET_REGISTER_DEV(solver, _name) // ---------------------------------------------------------------------------------------- // solver @@ -25,70 +25,70 @@ class NETLIB_NAME(solver); class netlist_matrix_solver_t { public: - typedef netlist_list_t<netlist_matrix_solver_t *> list_t; - typedef netlist_core_device_t::list_t dev_list_t; + typedef netlist_list_t<netlist_matrix_solver_t *> list_t; + typedef netlist_core_device_t::list_t dev_list_t; - ATTR_COLD void setup(netlist_net_t::list_t &nets, NETLIB_NAME(solver) &owner); + ATTR_COLD void setup(netlist_net_t::list_t &nets, NETLIB_NAME(solver) &owner); - // return true if a reschedule is needed ... - ATTR_HOT bool solve(); - ATTR_HOT void step(const netlist_time delta); - ATTR_HOT void update_inputs(); + // return true if a reschedule is needed ... + ATTR_HOT bool solve(); + ATTR_HOT void step(const netlist_time delta); + ATTR_HOT void update_inputs(); - ATTR_HOT inline bool is_dynamic() { return m_dynamic.count() > 0; } + ATTR_HOT inline bool is_dynamic() { return m_dynamic.count() > 0; } - inline const NETLIB_NAME(solver) &owner() const; + inline const NETLIB_NAME(solver) &owner() const; - double m_accuracy; - double m_convergence_factor; + double m_accuracy; + double m_convergence_factor; private: - netlist_net_t::list_t m_nets; - dev_list_t m_dynamic; - dev_list_t m_inps; - dev_list_t m_steps; + netlist_net_t::list_t m_nets; + dev_list_t m_dynamic; + dev_list_t m_inps; + dev_list_t m_steps; - NETLIB_NAME(solver) *m_owner; + NETLIB_NAME(solver) *m_owner; }; NETLIB_DEVICE_WITH_PARAMS(solver, - typedef netlist_core_device_t::list_t dev_list_t; + typedef netlist_core_device_t::list_t dev_list_t; - netlist_ttl_input_t m_fb_sync; - netlist_ttl_output_t m_Q_sync; + netlist_ttl_input_t m_fb_sync; + netlist_ttl_output_t m_Q_sync; - netlist_ttl_input_t m_fb_step; - netlist_ttl_output_t m_Q_step; + netlist_ttl_input_t m_fb_step; + netlist_ttl_output_t m_Q_step; - netlist_param_double_t m_freq; - netlist_param_double_t m_sync_delay; - netlist_param_double_t m_accuracy; - netlist_param_double_t m_convergence; + netlist_param_double_t m_freq; + netlist_param_double_t m_sync_delay; + netlist_param_double_t m_accuracy; + netlist_param_double_t m_convergence; - netlist_time m_inc; - netlist_time m_last_step; - netlist_time m_nt_sync_delay; + netlist_time m_inc; + netlist_time m_last_step; + netlist_time m_nt_sync_delay; - netlist_matrix_solver_t::list_t m_mat_solvers; + netlist_matrix_solver_t::list_t m_mat_solvers; public: - ~NETLIB_NAME(solver)(); + ~NETLIB_NAME(solver)(); - ATTR_HOT inline void schedule(); + ATTR_HOT inline void schedule(); - ATTR_COLD void post_start(); + ATTR_COLD void post_start(); ); inline void NETLIB_NAME(solver)::schedule() { - // FIXME: time should be parameter; - if (!m_Q_sync.net().is_queued()) - m_Q_sync.net().push_to_queue(m_nt_sync_delay); + // FIXME: time should be parameter; + if (!m_Q_sync.net().is_queued()) + m_Q_sync.net().push_to_queue(m_nt_sync_delay); } inline const NETLIB_NAME(solver) &netlist_matrix_solver_t::owner() const { - return *m_owner; + return *m_owner; } diff --git a/src/emu/netlist/devices/nld_system.c b/src/emu/netlist/devices/nld_system.c index f1ab75e9f8e..33bef136082 100644 --- a/src/emu/netlist/devices/nld_system.c +++ b/src/emu/netlist/devices/nld_system.c @@ -12,8 +12,8 @@ NETLIB_START(ttl_const) { - register_output("Q", m_Q); - register_param("CONST", m_const, 0); + register_output("Q", m_Q); + register_param("CONST", m_const, 0); } NETLIB_UPDATE(ttl_const) @@ -22,13 +22,13 @@ NETLIB_UPDATE(ttl_const) NETLIB_UPDATE_PARAM(ttl_const) { - OUTLOGIC(m_Q, m_const.Value(), NLTIME_IMMEDIATE); + OUTLOGIC(m_Q, m_const.Value(), NLTIME_IMMEDIATE); } NETLIB_START(analog_const) { - register_output("Q", m_Q); - register_param("CONST", m_const, 0.0); + register_output("Q", m_Q); + register_param("CONST", m_const, 0.0); } NETLIB_UPDATE(analog_const) @@ -37,7 +37,7 @@ NETLIB_UPDATE(analog_const) NETLIB_UPDATE_PARAM(analog_const) { - m_Q.initial(m_const.Value()); + m_Q.initial(m_const.Value()); } // ---------------------------------------------------------------------------------------- @@ -46,24 +46,24 @@ NETLIB_UPDATE_PARAM(analog_const) NETLIB_START(clock) { - register_output("Q", m_Q); - //register_input("FB", m_feedback); + register_output("Q", m_Q); + //register_input("FB", m_feedback); - register_param("FREQ", m_freq, 7159000.0 * 5.0); - m_inc = netlist_time::from_hz(m_freq.Value()*2); + register_param("FREQ", m_freq, 7159000.0 * 5.0); + m_inc = netlist_time::from_hz(m_freq.Value()*2); - register_link_internal(m_feedback, m_Q, netlist_input_t::STATE_INP_ACTIVE); + register_link_internal(m_feedback, m_Q, netlist_input_t::STATE_INP_ACTIVE); } NETLIB_UPDATE_PARAM(clock) { - m_inc = netlist_time::from_hz(m_freq.Value()*2); + m_inc = netlist_time::from_hz(m_freq.Value()*2); } NETLIB_UPDATE(clock) { - OUTLOGIC(m_Q, !m_Q.net().new_Q(), m_inc ); + OUTLOGIC(m_Q, !m_Q.net().new_Q(), m_inc ); } // ---------------------------------------------------------------------------------------- @@ -72,7 +72,7 @@ NETLIB_UPDATE(clock) NETLIB_START(logic_input) { - register_output("Q", m_Q); + register_output("Q", m_Q); } NETLIB_UPDATE(logic_input) @@ -85,7 +85,7 @@ NETLIB_UPDATE(logic_input) NETLIB_START(analog_input) { - register_output("Q", m_Q); + register_output("Q", m_Q); } NETLIB_UPDATE(analog_input) diff --git a/src/emu/netlist/devices/nld_system.h b/src/emu/netlist/devices/nld_system.h index 0859d9cddef..323a10b4196 100644 --- a/src/emu/netlist/devices/nld_system.h +++ b/src/emu/netlist/devices/nld_system.h @@ -25,16 +25,16 @@ NETDEV_PARAM(_name.CONST, _v) #define NETDEV_MAINCLOCK(_name) \ - NET_REGISTER_DEV(mainclock, _name) + NET_REGISTER_DEV(mainclock, _name) #define NETDEV_CLOCK(_name) \ - NET_REGISTER_DEV(clock, _name) + NET_REGISTER_DEV(clock, _name) #define NETDEV_LOGIC_INPUT(_name) \ - NET_REGISTER_DEV(logic_input, _name) + NET_REGISTER_DEV(logic_input, _name) #define NETDEV_ANALOG_INPUT(_name) \ - NET_REGISTER_DEV(analog_input, _name) + NET_REGISTER_DEV(analog_input, _name) // ---------------------------------------------------------------------------------------- // netdev_*_const @@ -56,7 +56,7 @@ NETLIB_DEVICE_WITH_PARAMS(analog_const, NETLIB_DEVICE_WITH_PARAMS(mainclock, public: - netlist_ttl_output_t m_Q; + netlist_ttl_output_t m_Q; netlist_param_double_t m_freq; netlist_time m_inc; @@ -69,11 +69,11 @@ public: // ---------------------------------------------------------------------------------------- NETLIB_DEVICE_WITH_PARAMS(clock, - netlist_ttl_input_t m_feedback; - netlist_ttl_output_t m_Q; + netlist_ttl_input_t m_feedback; + netlist_ttl_output_t m_Q; - netlist_param_double_t m_freq; - netlist_time m_inc; + netlist_param_double_t m_freq; + netlist_time m_inc; ); @@ -82,11 +82,11 @@ NETLIB_DEVICE_WITH_PARAMS(clock, // ---------------------------------------------------------------------------------------- NETLIB_DEVICE(logic_input, - netlist_ttl_output_t m_Q; + netlist_ttl_output_t m_Q; ); NETLIB_DEVICE(analog_input, - netlist_analog_output_t m_Q; + netlist_analog_output_t m_Q; ); diff --git a/src/emu/netlist/devices/nld_twoterm.c b/src/emu/netlist/devices/nld_twoterm.c index ddf7fc128cd..67262ea0cdd 100644 --- a/src/emu/netlist/devices/nld_twoterm.c +++ b/src/emu/netlist/devices/nld_twoterm.c @@ -12,10 +12,10 @@ // ---------------------------------------------------------------------------------------- ATTR_COLD NETLIB_NAME(twoterm)::NETLIB_NAME(twoterm)(const family_t afamily) : - netlist_device_t(afamily) + netlist_device_t(afamily) { - m_P.m_otherterm = &m_N; - m_N.m_otherterm = &m_P; + m_P.m_otherterm = &m_N; + m_N.m_otherterm = &m_P; } NETLIB_START(twoterm) @@ -24,8 +24,8 @@ NETLIB_START(twoterm) NETLIB_UPDATE(twoterm) { - /* only called if connected to a rail net ==> notify the solver to recalculate */ - netlist().solver()->schedule(); + /* only called if connected to a rail net ==> notify the solver to recalculate */ + netlist().solver()->schedule(); } // ---------------------------------------------------------------------------------------- @@ -34,29 +34,29 @@ NETLIB_UPDATE(twoterm) NETLIB_START(R_base) { - register_terminal("1", m_P); - register_terminal("2", m_N); + register_terminal("1", m_P); + register_terminal("2", m_N); } NETLIB_UPDATE(R_base) { - NETLIB_NAME(twoterm)::update(); + NETLIB_NAME(twoterm)::update(); } NETLIB_START(R) { - NETLIB_NAME(R_base)::start(); - register_param("R", m_R, 1.0 / NETLIST_GMIN); + NETLIB_NAME(R_base)::start(); + register_param("R", m_R, 1.0 / NETLIST_GMIN); } NETLIB_UPDATE(R) { - NETLIB_NAME(twoterm)::update(); + NETLIB_NAME(twoterm)::update(); } NETLIB_UPDATE_PARAM(R) { - set_R(m_R.Value()); + set_R(m_R.Value()); } // ---------------------------------------------------------------------------------------- @@ -65,30 +65,30 @@ NETLIB_UPDATE_PARAM(R) NETLIB_START(POT) { - register_sub(m_R1, "R1"); - register_sub(m_R2, "R2"); + register_sub(m_R1, "R1"); + register_sub(m_R2, "R2"); - register_subalias("1", m_R1.m_P); - register_subalias("2", m_R1.m_N); - register_subalias("3", m_R2.m_N); + register_subalias("1", m_R1.m_P); + register_subalias("2", m_R1.m_N); + register_subalias("3", m_R2.m_N); - setup().connect(m_R2.m_P, m_R1.m_N); + setup().connect(m_R2.m_P, m_R1.m_N); - register_param("R", m_R, 1.0 / NETLIST_GMIN); - register_param("DIAL", m_Dial, 0.5); + register_param("R", m_R, 1.0 / NETLIST_GMIN); + register_param("DIAL", m_Dial, 0.5); } NETLIB_UPDATE(POT) { - m_R1.update_dev(); - m_R2.update_dev(); + m_R1.update_dev(); + m_R2.update_dev(); } NETLIB_UPDATE_PARAM(POT) { - m_R1.set_R(MAX(m_R.Value() * m_Dial.Value(), NETLIST_GMIN)); - m_R2.set_R(MAX(m_R.Value() * (1.0 - m_Dial.Value()), NETLIST_GMIN)); + m_R1.set_R(MAX(m_R.Value() * m_Dial.Value(), NETLIST_GMIN)); + m_R2.set_R(MAX(m_R.Value() * (1.0 - m_Dial.Value()), NETLIST_GMIN)); } // ---------------------------------------------------------------------------------------- // nld_C @@ -96,21 +96,21 @@ NETLIB_UPDATE_PARAM(POT) NETLIB_START(C) { - register_terminal("1", m_P); - register_terminal("2", m_N); + register_terminal("1", m_P); + register_terminal("2", m_N); - register_param("C", m_C, 1e-6); + register_param("C", m_C, 1e-6); } NETLIB_UPDATE_PARAM(C) { - // set to some very small step time for now - step_time(1e-9); + // set to some very small step time for now + step_time(1e-9); } NETLIB_UPDATE(C) { - NETLIB_NAME(twoterm)::update(); + NETLIB_NAME(twoterm)::update(); } // ---------------------------------------------------------------------------------------- @@ -119,59 +119,59 @@ NETLIB_UPDATE(C) NETLIB_START(D) { - register_terminal("A", m_P); - register_terminal("K", m_N); - register_param("model", m_model, ""); + register_terminal("A", m_P); + register_terminal("K", m_N); + register_param("model", m_model, ""); - m_Vd = 0.7; + m_Vd = 0.7; - save(NAME(m_Vd)); + save(NAME(m_Vd)); } NETLIB_UPDATE_PARAM(D) { - m_Is = m_model.dValue("Is", 1e-15); - m_n = m_model.dValue("N", 1); + m_Is = m_model.dValue("Is", 1e-15); + m_n = m_model.dValue("N", 1); - m_Vt = 0.0258 * m_n; + m_Vt = 0.0258 * m_n; - m_Vcrit = m_Vt * log(m_Vt / m_Is / sqrt(2.0)); - m_VtInv = 1.0 / m_Vt; - NL_VERBOSE_OUT(("VCutoff: %f\n", m_Vcrit)); + m_Vcrit = m_Vt * log(m_Vt / m_Is / sqrt(2.0)); + m_VtInv = 1.0 / m_Vt; + NL_VERBOSE_OUT(("VCutoff: %f\n", m_Vcrit)); } NETLIB_UPDATE(D) { - NETLIB_NAME(twoterm)::update(); + NETLIB_NAME(twoterm)::update(); } class diode { public: - diode() : m_Is(1e-15), m_VT(0.0258), m_VT_inv(1.0 / m_VT) {} - diode(const double Is, const double n) - { - m_Is = Is; - m_VT = 0.0258 * n; - m_VT_inv = 1.0 / m_VT; - } - void set(const double Is, const double n) - { - m_Is = Is; - m_VT = 0.0258 * n; - m_VT_inv = 1.0 / m_VT; - } - double I(const double V) const { return m_Is * exp(V * m_VT_inv) - m_Is; } - double g(const double V) const { return m_Is * m_VT_inv * exp(V * m_VT_inv); } - double V(const double I) const { return log(1.0 + I / m_Is) * m_VT; } - double gI(const double I) const { return m_VT_inv * (I + m_Is); } + diode() : m_Is(1e-15), m_VT(0.0258), m_VT_inv(1.0 / m_VT) {} + diode(const double Is, const double n) + { + m_Is = Is; + m_VT = 0.0258 * n; + m_VT_inv = 1.0 / m_VT; + } + void set(const double Is, const double n) + { + m_Is = Is; + m_VT = 0.0258 * n; + m_VT_inv = 1.0 / m_VT; + } + double I(const double V) const { return m_Is * exp(V * m_VT_inv) - m_Is; } + double g(const double V) const { return m_Is * m_VT_inv * exp(V * m_VT_inv); } + double V(const double I) const { return log(1.0 + I / m_Is) * m_VT; } + double gI(const double I) const { return m_VT_inv * (I + m_Is); } private: - double m_Is; - double m_VT; - double m_VT_inv; + double m_Is; + double m_VT; + double m_VT_inv; }; // ---------------------------------------------------------------------------------------- @@ -180,61 +180,61 @@ private: NETLIB_START(Q) { - register_param("model", m_model, ""); + register_param("model", m_model, ""); } template <NETLIB_NAME(Q)::q_type _type> NETLIB_START(QBJT_switch<_type>) { - NETLIB_NAME(Q)::start(); + NETLIB_NAME(Q)::start(); - register_sub(m_RB, "RB"); - register_sub(m_RC, "RC"); - register_input("BV", m_BV); - register_input("EV", m_EV); + register_sub(m_RB, "RB"); + register_sub(m_RC, "RC"); + register_input("BV", m_BV); + register_input("EV", m_EV); - register_subalias("B", m_RB.m_P); - register_subalias("E", m_RB.m_N); - register_subalias("C", m_RC.m_P); + register_subalias("B", m_RB.m_P); + register_subalias("E", m_RB.m_N); + register_subalias("C", m_RC.m_P); - setup().connect(m_RB.m_N, m_RC.m_N); - setup().connect(m_RB.m_P, m_BV); - setup().connect(m_RB.m_N, m_EV); + setup().connect(m_RB.m_N, m_RC.m_N); + setup().connect(m_RB.m_P, m_BV); + setup().connect(m_RB.m_N, m_EV); - save(NAME(m_state_on)); + save(NAME(m_state_on)); } NETLIB_UPDATE(Q) { - netlist().solver()->schedule(); + netlist().solver()->schedule(); } template <NETLIB_NAME(Q)::q_type _type> NETLIB_UPDATE_PARAM(QBJT_switch<_type>) { - double IS = m_model.dValue("IS", 1e-15); - double BF = m_model.dValue("BF", 100); - double NF = m_model.dValue("NF", 1); - //double VJE = m_model.dValue("VJE", 0.75); + double IS = m_model.dValue("IS", 1e-15); + double BF = m_model.dValue("BF", 100); + double NF = m_model.dValue("NF", 1); + //double VJE = m_model.dValue("VJE", 0.75); - double alpha = BF / (1.0 + BF); + double alpha = BF / (1.0 + BF); - diode d(IS, NF); + diode d(IS, NF); - // Assume 5mA Collector current for switch operation + // Assume 5mA Collector current for switch operation - if (_type == BJT_NPN) - m_V = d.V(0.005 / alpha); - else - m_V = - d.V(0.005 / alpha); + if (_type == BJT_NPN) + m_V = d.V(0.005 / alpha); + else + m_V = - d.V(0.005 / alpha); - m_gB = d.gI(0.005 / alpha); - if (m_gB < NETLIST_GMIN) - m_gB = NETLIST_GMIN; - m_gC = BF * m_gB; // very rough estimate - //printf("%f %f \n", m_V, m_gB); - m_RB.set(NETLIST_GMIN, 0.0, 0.0); - m_RC.set(NETLIST_GMIN, 0.0, 0.0); + m_gB = d.gI(0.005 / alpha); + if (m_gB < NETLIST_GMIN) + m_gB = NETLIST_GMIN; + m_gC = BF * m_gB; // very rough estimate + //printf("%f %f \n", m_V, m_gB); + m_RB.set(NETLIST_GMIN, 0.0, 0.0); + m_RC.set(NETLIST_GMIN, 0.0, 0.0); } template NETLIB_START(QBJT_switch<NETLIB_NAME(Q)::BJT_NPN>); @@ -248,40 +248,39 @@ template NETLIB_UPDATE_PARAM(QBJT_switch<NETLIB_NAME(Q)::BJT_PNP>); NETLIB_START(VCCS) { - configure(1.0, NETLIST_GMIN); + configure(1.0, NETLIST_GMIN); } ATTR_COLD void NETLIB_NAME(VCCS)::configure(const double Gfac, const double GI) { - - register_param("G", m_G, 1.0); - - register_terminal("IP", m_IP); - register_terminal("IN", m_IN); - register_terminal("OP", m_OP); - register_terminal("ON", m_ON); - - m_OP1.init_object(*this, name() + ".OP1", netlist_core_terminal_t::STATE_INP_ACTIVE); - m_ON1.init_object(*this, name() + ".ON1", netlist_core_terminal_t::STATE_INP_ACTIVE); - - const double m_mult = m_G.Value() * Gfac; // 1.0 ==> 1V ==> 1A - m_IP.set(GI); - m_IP.m_otherterm = &m_IN; // <= this should be NULL and terminal be filtered out prior to solving... - m_IN.set(GI); - m_IN.m_otherterm = &m_IP; // <= this should be NULL and terminal be filtered out prior to solving... - - m_OP.set(m_mult, 0.0); - m_OP.m_otherterm = &m_IP; - m_OP1.set(-m_mult, 0.0); - m_OP1.m_otherterm = &m_IN; - - m_ON.set(-m_mult, 0.0); - m_ON.m_otherterm = &m_IP; - m_ON1.set(m_mult, 0.0); - m_ON1.m_otherterm = &m_IN; - - setup().connect(m_OP, m_OP1); - setup().connect(m_ON, m_ON1); + register_param("G", m_G, 1.0); + + register_terminal("IP", m_IP); + register_terminal("IN", m_IN); + register_terminal("OP", m_OP); + register_terminal("ON", m_ON); + + m_OP1.init_object(*this, name() + ".OP1", netlist_core_terminal_t::STATE_INP_ACTIVE); + m_ON1.init_object(*this, name() + ".ON1", netlist_core_terminal_t::STATE_INP_ACTIVE); + + const double m_mult = m_G.Value() * Gfac; // 1.0 ==> 1V ==> 1A + m_IP.set(GI); + m_IP.m_otherterm = &m_IN; // <= this should be NULL and terminal be filtered out prior to solving... + m_IN.set(GI); + m_IN.m_otherterm = &m_IP; // <= this should be NULL and terminal be filtered out prior to solving... + + m_OP.set(m_mult, 0.0); + m_OP.m_otherterm = &m_IP; + m_OP1.set(-m_mult, 0.0); + m_OP1.m_otherterm = &m_IN; + + m_ON.set(-m_mult, 0.0); + m_ON.m_otherterm = &m_IP; + m_ON1.set(m_mult, 0.0); + m_ON1.m_otherterm = &m_IN; + + setup().connect(m_OP, m_OP1); + setup().connect(m_ON, m_ON1); } NETLIB_UPDATE_PARAM(VCCS) @@ -290,8 +289,8 @@ NETLIB_UPDATE_PARAM(VCCS) NETLIB_UPDATE(VCCS) { - /* only called if connected to a rail net ==> notify the solver to recalculate */ - netlist().solver()->schedule(); + /* only called if connected to a rail net ==> notify the solver to recalculate */ + netlist().solver()->schedule(); } // ---------------------------------------------------------------------------------------- @@ -300,25 +299,24 @@ NETLIB_UPDATE(VCCS) NETLIB_START(VCVS) { - register_param("RO", m_RO, 1.0); + register_param("RO", m_RO, 1.0); - const double gRO = 1.0 / m_RO.Value(); + const double gRO = 1.0 / m_RO.Value(); - configure(gRO, NETLIST_GMIN); + configure(gRO, NETLIST_GMIN); - m_OP2.init_object(*this, "OP2", netlist_core_terminal_t::STATE_INP_ACTIVE); - m_ON2.init_object(*this, "ON2", netlist_core_terminal_t::STATE_INP_ACTIVE); + m_OP2.init_object(*this, "OP2", netlist_core_terminal_t::STATE_INP_ACTIVE); + m_ON2.init_object(*this, "ON2", netlist_core_terminal_t::STATE_INP_ACTIVE); - m_OP2.set(gRO); - m_ON2.set(gRO); - m_OP2.m_otherterm = &m_ON2; - m_ON2.m_otherterm = &m_OP2; + m_OP2.set(gRO); + m_ON2.set(gRO); + m_OP2.m_otherterm = &m_ON2; + m_ON2.m_otherterm = &m_OP2; - setup().connect(m_OP2, m_OP1); - setup().connect(m_ON2, m_ON1); + setup().connect(m_OP2, m_OP1); + setup().connect(m_ON2, m_ON1); } NETLIB_UPDATE_PARAM(VCVS) { } - diff --git a/src/emu/netlist/devices/nld_twoterm.h b/src/emu/netlist/devices/nld_twoterm.h index 49b6ca3c629..6ebebf36903 100644 --- a/src/emu/netlist/devices/nld_twoterm.h +++ b/src/emu/netlist/devices/nld_twoterm.h @@ -40,30 +40,30 @@ // ---------------------------------------------------------------------------------------- #define NETDEV_R(_name, _R) \ - NET_REGISTER_DEV(R, _name) \ - NETDEV_PARAMI(_name, R, _R) + NET_REGISTER_DEV(R, _name) \ + NETDEV_PARAMI(_name, R, _R) #define NETDEV_POT(_name, _R) \ - NET_REGISTER_DEV(POT, _name) \ - NETDEV_PARAMI(_name, R, _R) + NET_REGISTER_DEV(POT, _name) \ + NETDEV_PARAMI(_name, R, _R) #define NETDEV_C(_name, _C) \ - NET_REGISTER_DEV(C, _name) \ - NETDEV_PARAMI(_name, C, _C) + NET_REGISTER_DEV(C, _name) \ + NETDEV_PARAMI(_name, C, _C) /* Generic Diode */ #define NETDEV_D(_name, _model) \ - NET_REGISTER_DEV(D, _name) \ - NETDEV_PARAMI(_name, model, # _model) + NET_REGISTER_DEV(D, _name) \ + NETDEV_PARAMI(_name, model, # _model) #define NETDEV_QPNP(_name, _model) \ - NET_REGISTER_DEV(QPNP_switch, _name) \ - NETDEV_PARAMI(_name, model, # _model) + NET_REGISTER_DEV(QPNP_switch, _name) \ + NETDEV_PARAMI(_name, model, # _model) #define NETDEV_QNPN(_name, _model) \ - NET_REGISTER_DEV(QNPN_switch, _name) \ - NETDEV_PARAMI(_name, model, # _model) + NET_REGISTER_DEV(QNPN_switch, _name) \ + NETDEV_PARAMI(_name, model, # _model) // ---------------------------------------------------------------------------------------- // Implementation @@ -76,24 +76,24 @@ class NETLIB_NAME(twoterm) : public netlist_device_t { public: - ATTR_COLD NETLIB_NAME(twoterm)(const family_t afamily); + ATTR_COLD NETLIB_NAME(twoterm)(const family_t afamily); - netlist_terminal_t m_P; - netlist_terminal_t m_N; + netlist_terminal_t m_P; + netlist_terminal_t m_N; - virtual NETLIB_UPDATE_TERMINALS() - { - } + virtual NETLIB_UPDATE_TERMINALS() + { + } - ATTR_HOT inline void set(const double G, const double V, const double I) - { - m_P.m_go = m_N.m_go = m_P.m_gt = m_N.m_gt = G; - m_N.m_Idr = ( -V) * G + I; - m_P.m_Idr = ( V) * G - I; - } + ATTR_HOT inline void set(const double G, const double V, const double I) + { + m_P.m_go = m_N.m_go = m_P.m_gt = m_N.m_gt = G; + m_N.m_Idr = ( -V) * G + I; + m_P.m_Idr = ( V) * G - I; + } protected: - ATTR_COLD virtual void start(); - ATTR_HOT ATTR_ALIGN void update(); + ATTR_COLD virtual void start(); + ATTR_HOT ATTR_ALIGN void update(); private: }; @@ -105,17 +105,17 @@ private: class NETLIB_NAME(R_base) : public NETLIB_NAME(twoterm) { public: - ATTR_COLD NETLIB_NAME(R_base)() : NETLIB_NAME(twoterm)(RESISTOR) { } + ATTR_COLD NETLIB_NAME(R_base)() : NETLIB_NAME(twoterm)(RESISTOR) { } - inline void set_R(const double R) { set(1.0 / R, 0.0, 0.0); } + inline void set_R(const double R) { set(1.0 / R, 0.0, 0.0); } protected: - ATTR_COLD virtual void start(); - ATTR_HOT ATTR_ALIGN void update(); + ATTR_COLD virtual void start(); + ATTR_HOT ATTR_ALIGN void update(); }; NETLIB_DEVICE_WITH_PARAMS_DERIVED(R, R_base, - netlist_param_double_t m_R; + netlist_param_double_t m_R; ); // ---------------------------------------------------------------------------------------- @@ -123,11 +123,11 @@ NETLIB_DEVICE_WITH_PARAMS_DERIVED(R, R_base, // ---------------------------------------------------------------------------------------- NETLIB_DEVICE_WITH_PARAMS(POT, - NETLIB_NAME(R_base) m_R1; - NETLIB_NAME(R_base) m_R2; + NETLIB_NAME(R_base) m_R1; + NETLIB_NAME(R_base) m_R2; - netlist_param_double_t m_R; - netlist_param_double_t m_Dial; + netlist_param_double_t m_R; + netlist_param_double_t m_Dial; ); @@ -138,21 +138,21 @@ NETLIB_DEVICE_WITH_PARAMS(POT, class NETLIB_NAME(C) : public NETLIB_NAME(twoterm) { public: - ATTR_COLD NETLIB_NAME(C)() : NETLIB_NAME(twoterm)(CAPACITOR) { } + ATTR_COLD NETLIB_NAME(C)() : NETLIB_NAME(twoterm)(CAPACITOR) { } - ATTR_HOT void step_time(const double st) - { - double G = m_C.Value() / st; - double I = -G * (m_P.net().Q_Analog()- m_N.net().Q_Analog()); - set(G, 0.0, I); - } + ATTR_HOT void step_time(const double st) + { + double G = m_C.Value() / st; + double I = -G * (m_P.net().Q_Analog()- m_N.net().Q_Analog()); + set(G, 0.0, I); + } protected: - ATTR_COLD virtual void start(); - ATTR_COLD virtual void update_param(); - ATTR_HOT ATTR_ALIGN void update(); + ATTR_COLD virtual void start(); + ATTR_COLD virtual void update_param(); + ATTR_HOT ATTR_ALIGN void update(); - netlist_param_double_t m_C; + netlist_param_double_t m_C; }; @@ -167,87 +167,87 @@ protected: #if 0 inline double fastexp_h(const double x) { - static const double ln2r = 1.442695040888963387; - static const double ln2 = 0.693147180559945286; - //static const double c3 = 0.166666666666666667; + static const double ln2r = 1.442695040888963387; + static const double ln2 = 0.693147180559945286; + //static const double c3 = 0.166666666666666667; - const double y = x * ln2r; - const unsigned int t = y; - const double z = (x - ln2 * (double) t); - const double zz = z * z; - //const double zzz = zz * z; + const double y = x * ln2r; + const unsigned int t = y; + const double z = (x - ln2 * (double) t); + const double zz = z * z; + //const double zzz = zz * z; - return (double)(1 << t)*(1.0 + z + 0.5 * zz); // + c3*zzz; + return (double)(1 << t)*(1.0 + z + 0.5 * zz); // + c3*zzz; } inline double fastexp(const double x) { - if (x<0) - return 1.0 / fastexp_h(-x); - else - return fastexp_h(x); + if (x<0) + return 1.0 / fastexp_h(-x); + else + return fastexp_h(x); } #endif class NETLIB_NAME(D) : public NETLIB_NAME(twoterm) { public: - ATTR_COLD NETLIB_NAME(D)() : NETLIB_NAME(twoterm)(DIODE) { } - - NETLIB_UPDATE_TERMINALS() - { - const double nVd = m_P.net().Q_Analog()- m_N.net().Q_Analog(); - - //FIXME: Optimize cutoff case - - double Id; - double G; - - if (nVd < -5.0 * m_Vt) - { - m_Vd = nVd; - G = NETLIST_GMIN; - Id = - m_Is; - } - else if (nVd < m_Vcrit) - { - m_Vd = nVd; - - const double eVDVt = exp(m_Vd * m_VtInv); - Id = m_Is * (eVDVt - 1.0); - G = m_Is * m_VtInv * eVDVt; - } - else - { + ATTR_COLD NETLIB_NAME(D)() : NETLIB_NAME(twoterm)(DIODE) { } + + NETLIB_UPDATE_TERMINALS() + { + const double nVd = m_P.net().Q_Analog()- m_N.net().Q_Analog(); + + //FIXME: Optimize cutoff case + + double Id; + double G; + + if (nVd < -5.0 * m_Vt) + { + m_Vd = nVd; + G = NETLIST_GMIN; + Id = - m_Is; + } + else if (nVd < m_Vcrit) + { + m_Vd = nVd; + + const double eVDVt = exp(m_Vd * m_VtInv); + Id = m_Is * (eVDVt - 1.0); + G = m_Is * m_VtInv * eVDVt; + } + else + { #if defined(_MSC_VER) && _MSC_VER < 1800 - m_Vd = m_Vd + log((nVd - m_Vd) * m_VtInv + 1.0) * m_Vt; + m_Vd = m_Vd + log((nVd - m_Vd) * m_VtInv + 1.0) * m_Vt; #else - m_Vd = m_Vd + log1p((nVd - m_Vd) * m_VtInv) * m_Vt; + m_Vd = m_Vd + log1p((nVd - m_Vd) * m_VtInv) * m_Vt; #endif - const double eVDVt = exp(m_Vd * m_VtInv); - Id = m_Is * (eVDVt - 1.0); + const double eVDVt = exp(m_Vd * m_VtInv); + Id = m_Is * (eVDVt - 1.0); - G = m_Is * m_VtInv * eVDVt; - } + G = m_Is * m_VtInv * eVDVt; + } - double I = (Id - m_Vd * G); - set(G, 0.0, I); - } + double I = (Id - m_Vd * G); + set(G, 0.0, I); + } protected: - ATTR_COLD virtual void start(); - ATTR_COLD virtual void update_param(); - ATTR_HOT ATTR_ALIGN void update(); + ATTR_COLD virtual void start(); + ATTR_COLD virtual void update_param(); + ATTR_HOT ATTR_ALIGN void update(); - netlist_param_model_t m_model; + netlist_param_model_t m_model; - double m_Vt; - double m_Is; - double m_n; + double m_Vt; + double m_Is; + double m_n; - double m_VtInv; - double m_Vcrit; - double m_Vd; + double m_VtInv; + double m_Vcrit; + double m_Vd; }; @@ -269,32 +269,32 @@ protected: class NETLIB_NAME(Q) : public netlist_device_t { public: - enum q_type { - BJT_NPN, - BJT_PNP - }; + enum q_type { + BJT_NPN, + BJT_PNP + }; - ATTR_COLD NETLIB_NAME(Q)(const q_type atype, const family_t afamily) - : netlist_device_t(afamily) - , m_qtype(atype) { } + ATTR_COLD NETLIB_NAME(Q)(const q_type atype, const family_t afamily) + : netlist_device_t(afamily) + , m_qtype(atype) { } - inline q_type qtype() const { return m_qtype; } - inline bool is_qtype(q_type atype) const { return m_qtype == atype; } + inline q_type qtype() const { return m_qtype; } + inline bool is_qtype(q_type atype) const { return m_qtype == atype; } protected: - ATTR_COLD virtual void start(); - ATTR_HOT ATTR_ALIGN void update(); + ATTR_COLD virtual void start(); + ATTR_HOT ATTR_ALIGN void update(); - netlist_param_model_t m_model; + netlist_param_model_t m_model; private: - q_type m_qtype; + q_type m_qtype; }; class NETLIB_NAME(QBJT) : public NETLIB_NAME(Q) { public: - ATTR_COLD NETLIB_NAME(QBJT)(const q_type atype, const family_t afamily) - : NETLIB_NAME(Q)(atype, afamily) { } + ATTR_COLD NETLIB_NAME(QBJT)(const q_type atype, const family_t afamily) + : NETLIB_NAME(Q)(atype, afamily) { } protected: @@ -306,51 +306,51 @@ template <NETLIB_NAME(Q)::q_type _type> class NETLIB_NAME(QBJT_switch) : public NETLIB_NAME(QBJT) { public: - ATTR_COLD NETLIB_NAME(QBJT_switch)() - : NETLIB_NAME(QBJT)(_type, BJT_SWITCH), m_gB(NETLIST_GMIN), m_gC(NETLIST_GMIN), m_V(0.0), m_state_on(0) { } - - NETLIB_UPDATEI() - { - double vE = INPANALOG(m_EV); - double vB = INPANALOG(m_BV); - - int new_state = (vB - vE > m_V ) ? 1 : 0; - if (m_state_on ^ new_state) - { - double gb = m_gB; - double gc = m_gC; - double v = m_V; - if (!new_state ) - { - // not conducting - gb = NETLIST_GMIN; - v = 0; - gc = NETLIST_GMIN; - } - m_RB.set(gb, v, 0.0); - m_RC.set(gc, 0.0, 0.0); - m_state_on = new_state; - m_RB.update_dev(); - m_RC.update_dev(); - } - - } - - NETLIB_NAME(R) m_RB; - NETLIB_NAME(R) m_RC; - - netlist_analog_input_t m_BV; - netlist_analog_input_t m_EV; + ATTR_COLD NETLIB_NAME(QBJT_switch)() + : NETLIB_NAME(QBJT)(_type, BJT_SWITCH), m_gB(NETLIST_GMIN), m_gC(NETLIST_GMIN), m_V(0.0), m_state_on(0) { } + + NETLIB_UPDATEI() + { + double vE = INPANALOG(m_EV); + double vB = INPANALOG(m_BV); + + int new_state = (vB - vE > m_V ) ? 1 : 0; + if (m_state_on ^ new_state) + { + double gb = m_gB; + double gc = m_gC; + double v = m_V; + if (!new_state ) + { + // not conducting + gb = NETLIST_GMIN; + v = 0; + gc = NETLIST_GMIN; + } + m_RB.set(gb, v, 0.0); + m_RC.set(gc, 0.0, 0.0); + m_state_on = new_state; + m_RB.update_dev(); + m_RC.update_dev(); + } + + } + + NETLIB_NAME(R) m_RB; + NETLIB_NAME(R) m_RC; + + netlist_analog_input_t m_BV; + netlist_analog_input_t m_EV; protected: - ATTR_COLD virtual void start(); - ATTR_COLD void update_param(); + ATTR_COLD virtual void start(); + ATTR_COLD void update_param(); - double m_gB; // base conductance / switch on - double m_gC; // collector conductance / switch on - double m_V; // internal voltage source - UINT8 m_state_on; + double m_gB; // base conductance / switch on + double m_gC; // collector conductance / switch on + double m_V; // internal voltage source + UINT8 m_state_on; private: }; @@ -380,35 +380,34 @@ typedef NETLIB_NAME(QBJT_switch)<NETLIB_NAME(Q)::BJT_NPN> NETLIB_NAME(QNPN_switc */ #define NETDEV_VCCS(_name) \ - NET_REGISTER_DEV(VCCS, _name) \ - + NET_REGISTER_DEV(VCCS, _name) //NETDEV_PARAMI(_name, model, _model) class NETLIB_NAME(VCCS) : public netlist_device_t { public: - ATTR_COLD NETLIB_NAME(VCCS)() - : netlist_device_t(VCCS) { } - ATTR_COLD NETLIB_NAME(VCCS)(const family_t afamily) - : netlist_device_t(afamily) { } + ATTR_COLD NETLIB_NAME(VCCS)() + : netlist_device_t(VCCS) { } + ATTR_COLD NETLIB_NAME(VCCS)(const family_t afamily) + : netlist_device_t(afamily) { } protected: - ATTR_COLD virtual void start(); - ATTR_COLD virtual void update_param(); - ATTR_HOT ATTR_ALIGN void update(); + ATTR_COLD virtual void start(); + ATTR_COLD virtual void update_param(); + ATTR_HOT ATTR_ALIGN void update(); - ATTR_COLD void configure(const double Gfac, const double GI); + ATTR_COLD void configure(const double Gfac, const double GI); - netlist_terminal_t m_OP; - netlist_terminal_t m_ON; + netlist_terminal_t m_OP; + netlist_terminal_t m_ON; - netlist_terminal_t m_IP; - netlist_terminal_t m_IN; + netlist_terminal_t m_IP; + netlist_terminal_t m_IN; - netlist_terminal_t m_OP1; - netlist_terminal_t m_ON1; + netlist_terminal_t m_OP1; + netlist_terminal_t m_ON1; - netlist_param_double_t m_G; + netlist_param_double_t m_G; }; // ---------------------------------------------------------------------------------------- @@ -439,28 +438,27 @@ protected: */ #define NETDEV_VCVS(_name) \ - NET_REGISTER_DEV(VCVS, _name) \ - + NET_REGISTER_DEV(VCVS, _name) //NETDEV_PARAMI(_name, model, _model) class NETLIB_NAME(VCVS) : public NETLIB_NAME(VCCS) { public: - ATTR_COLD NETLIB_NAME(VCVS)() - : NETLIB_NAME(VCCS)(VCVS) { } + ATTR_COLD NETLIB_NAME(VCVS)() + : NETLIB_NAME(VCCS)(VCVS) { } protected: - ATTR_COLD virtual void start(); - ATTR_COLD virtual void update_param(); - //ATTR_HOT ATTR_ALIGN void update(); + ATTR_COLD virtual void start(); + ATTR_COLD virtual void update_param(); + //ATTR_HOT ATTR_ALIGN void update(); - netlist_terminal_t m_OP2; - netlist_terminal_t m_ON2; + netlist_terminal_t m_OP2; + netlist_terminal_t m_ON2; - double m_mult; + double m_mult; - netlist_param_double_t m_RO; + netlist_param_double_t m_RO; }; |
