diff options
Diffstat (limited to 'src/emu/netlist/devices/nld_twoterm.c')
-rw-r--r-- | src/emu/netlist/devices/nld_twoterm.c | 274 |
1 files changed, 136 insertions, 138 deletions
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) { } - |