summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/netlist/analog/nld_fourterm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/netlist/analog/nld_fourterm.c')
-rw-r--r--src/emu/netlist/analog/nld_fourterm.c67
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()