diff options
Diffstat (limited to 'src/emu/netlist/analog/nld_fourterm.c')
-rw-r--r-- | src/emu/netlist/analog/nld_fourterm.c | 67 |
1 files changed, 61 insertions, 6 deletions
diff --git a/src/emu/netlist/analog/nld_fourterm.c b/src/emu/netlist/analog/nld_fourterm.c index e2457d8ee11..58d173e6554 100644 --- a/src/emu/netlist/analog/nld_fourterm.c +++ b/src/emu/netlist/analog/nld_fourterm.c @@ -5,9 +5,11 @@ * */ +#include <solver/nld_solver.h> #include "nld_fourterm.h" #include "../nl_setup.h" -#include "nld_solver.h" + +NETLIB_NAMESPACE_DEVICES_START() // ---------------------------------------------------------------------------------------- // nld_VCCS @@ -41,8 +43,8 @@ void NETLIB_NAME(VCCS)::start_internal(const nl_double def_RI) m_ON.m_otherterm = &m_IP; m_ON1.m_otherterm = &m_IN; - connect(m_OP, m_OP1); - connect(m_ON, m_ON1); + connect_late(m_OP, m_OP1); + connect_late(m_ON, m_ON1); } NETLIB_RESET(VCCS) @@ -50,6 +52,7 @@ NETLIB_RESET(VCCS) const nl_double m_mult = m_G.Value() * m_gfac; // 1.0 ==> 1V ==> 1A const nl_double GI = NL_FCONST(1.0) / m_RI.Value(); + //printf("VCCS %s RI %f\n", name().cstr(), m_RI.Value()); m_IP.set(GI); m_IN.set(GI); @@ -62,12 +65,12 @@ NETLIB_RESET(VCCS) NETLIB_UPDATE_PARAM(VCCS) { + NETLIB_NAME(VCCS)::reset(); } NETLIB_UPDATE(VCCS) { /* only called if connected to a rail net ==> notify the solver to recalculate */ - /* Big FIXME ... */ if (!m_IP.net().isRailNet()) m_IP.schedule_solve(); else if (!m_IN.net().isRailNet()) @@ -79,6 +82,56 @@ NETLIB_UPDATE(VCCS) } // ---------------------------------------------------------------------------------------- +// nld_LVCCS +// ---------------------------------------------------------------------------------------- + +NETLIB_START(LVCCS) +{ + NETLIB_NAME(VCCS)::start(); + register_param("CURLIM", m_cur_limit, 1000.0); +} + +NETLIB_RESET(LVCCS) +{ + NETLIB_NAME(VCCS)::reset(); +} + +NETLIB_UPDATE_PARAM(LVCCS) +{ + NETLIB_NAME(VCCS)::update_param(); +} + +NETLIB_UPDATE(LVCCS) +{ + NETLIB_NAME(VCCS)::update(); +} + +NETLIB_UPDATE_TERMINALS(LVCCS) +{ + const nl_double m_mult = m_G.Value() * m_gfac; // 1.0 ==> 1V ==> 1A + const nl_double vi = m_IP.net().m_cur_Analog - m_IN.net().m_cur_Analog; + + if (std::abs(m_mult / m_cur_limit * vi) > 0.5) + m_vi = m_vi + 0.2*std::tanh((vi - m_vi)/0.2); + else + m_vi = vi; + + const nl_double x = m_mult / m_cur_limit * m_vi; + const nl_double X = std::tanh(x); + + const nl_double beta = m_mult * (1.0 - X*X); + const nl_double I = m_cur_limit * X - beta * m_vi; + + m_OP.set(beta, NL_FCONST(0.0), I); + m_OP1.set(-beta, NL_FCONST(0.0)); + + m_ON.set(-beta, NL_FCONST(0.0), -I); + m_ON1.set(beta, NL_FCONST(0.0)); + //printf("vi %f beta %f I %f\n", vi, beta, I); + +} + +// ---------------------------------------------------------------------------------------- // nld_CCCS // ---------------------------------------------------------------------------------------- @@ -119,8 +172,8 @@ NETLIB_START(VCVS) m_OP2.m_otherterm = &m_ON2; m_ON2.m_otherterm = &m_OP2; - connect(m_OP2, m_OP1); - connect(m_ON2, m_ON1); + connect_late(m_OP2, m_OP1); + connect_late(m_ON2, m_ON1); } NETLIB_RESET(VCVS) @@ -135,3 +188,5 @@ NETLIB_RESET(VCVS) NETLIB_UPDATE_PARAM(VCVS) { } + +NETLIB_NAMESPACE_DEVICES_END() |