summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/analog/nlid_fourterm.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/analog/nlid_fourterm.h')
-rw-r--r--src/lib/netlist/analog/nlid_fourterm.h282
1 files changed, 170 insertions, 112 deletions
diff --git a/src/lib/netlist/analog/nlid_fourterm.h b/src/lib/netlist/analog/nlid_fourterm.h
index 5ca6a747116..1320f97984b 100644
--- a/src/lib/netlist/analog/nlid_fourterm.h
+++ b/src/lib/netlist/analog/nlid_fourterm.h
@@ -1,71 +1,74 @@
-// license:GPL-2.0+
+// license:BSD-3-Clause
// copyright-holders:Couriersud
-/*
- * nlid_fourterm.h
- *
- */
#ifndef NLID_FOURTERM_H_
#define NLID_FOURTERM_H_
-#include "netlist/nl_base.h"
+///
+/// \file nlid_fourterm.h
+///
+
+#include "nl_base.h"
+
#include "plib/putil.h"
-namespace netlist {
- namespace analog {
+namespace netlist::analog
+{
// ----------------------------------------------------------------------------------------
// nld_VCCS
// ----------------------------------------------------------------------------------------
- /*
- * Voltage controlled current source
- *
- * IP ---+ +------> OP
- * | |
- * RI I
- * RI => G => I IOut = (V(IP)-V(IN)) * G
- * RI I
- * | |
- * IN ---+ +------< ON
- *
- * G=1 ==> 1V ==> 1A
- *
- * RI = 1 / NETLIST_GMIN
- *
- */
-
- NETLIB_OBJECT(VCCS)
+ //
+ // Voltage controlled current source
+ //
+ // IP ---+ +------> OP
+ // | |
+ // RI I
+ // RI => G => I IOut = (V(IP)-V(IN)) * G
+ // RI I
+ // | |
+ // IN ---+ +------< ON
+ //
+ // G=1 ==> 1V ==> 1A
+ //
+ // RI = 1 / NETLIST_GMIN
+ //
+ class nld_VCCS : public base_device_t
{
public:
- NETLIB_CONSTRUCTOR(VCCS)
- , m_G(*this, "G", 1.0)
- , m_RI(*this, "RI", 1e9)
- , m_OP(*this, "OP", &m_IP)
- , m_ON(*this, "ON", &m_IP)
- , m_IP(*this, "IP", &m_IN) // <= this should be NULL and terminal be filtered out prior to solving...
- , m_IN(*this, "IN", &m_IP) // <= this should be NULL and terminal be filtered out prior to solving...
- , m_OP1(*this, "_OP1", &m_IN)
- , m_ON1(*this, "_ON1", &m_IN)
- , m_gfac(1.0)
+ nld_VCCS(constructor_param_t data, nl_fptype ri = nlconst::magic(1e9))
+ : base_device_t(data)
+ , m_G(*this, "G", nlconst::one())
+ , m_RI(*this, "RI", ri)
+ , m_OP(*this, "OP", &m_IP, {&m_ON, &m_IN},
+ NETLIB_DELEGATE(terminal_handler))
+ , m_ON(*this, "ON", &m_IP, {&m_OP, &m_IN},
+ NETLIB_DELEGATE(terminal_handler))
+ , m_IP(*this, "IP", &m_IN, {&m_OP, &m_ON},
+ NETLIB_DELEGATE(terminal_handler))
+ , m_IN(*this, "IN", &m_IP, {&m_OP, &m_ON},
+ NETLIB_DELEGATE(terminal_handler))
+ , m_OP1(*this, "_OP1", &m_IN, NETLIB_DELEGATE(terminal_handler))
+ , m_ON1(*this, "_ON1", &m_IN, NETLIB_DELEGATE(terminal_handler))
+ , m_gfac(nlconst::one())
{
connect(m_OP, m_OP1);
connect(m_ON, m_ON1);
- m_gfac = plib::constants<nl_double>::one();
}
NETLIB_RESETI();
- param_double_t m_G;
- param_double_t m_RI;
+ param_fp_t m_G;
+ param_fp_t m_RI;
protected:
- NETLIB_UPDATEI();
- NETLIB_UPDATE_PARAMI()
- {
- NETLIB_NAME(VCCS)::reset();
- }
+ NETLIB_HANDLERI(terminal_handler);
+ NETLIB_UPDATE_PARAMI() { NETLIB_NAME(VCCS)::reset(); }
+ void set_gfac(nl_fptype g) noexcept { m_gfac = g; }
+
+ nl_fptype get_gfac() const noexcept { return m_gfac; }
terminal_t m_OP;
terminal_t m_ON;
@@ -76,107 +79,107 @@ namespace netlist {
terminal_t m_OP1;
terminal_t m_ON1;
- nl_double m_gfac;
+ private:
+ nl_fptype m_gfac;
};
- /* Limited Current source*/
+ // Limited Current source
- NETLIB_OBJECT_DERIVED(LVCCS, VCCS)
+ class nld_LVCCS : public nld_VCCS
{
public:
- NETLIB_CONSTRUCTOR_DERIVED(LVCCS, VCCS)
- , m_cur_limit(*this, "CURLIM", 1000.0)
- , m_vi(0.0)
+ nld_LVCCS(constructor_param_t data)
+ : nld_VCCS(data)
+ , m_cur_limit(*this, "CURLIM", nlconst::magic(1000.0))
+ , m_vi(nlconst::zero())
{
}
NETLIB_IS_DYNAMIC(true)
protected:
- //NETLIB_UPDATEI();
NETLIB_RESETI();
NETLIB_UPDATE_PARAMI();
NETLIB_UPDATE_TERMINALSI();
private:
- param_double_t m_cur_limit; /* current limit */
- nl_double m_vi;
+ param_fp_t m_cur_limit; // current limit
+ nl_fptype m_vi;
};
// ----------------------------------------------------------------------------------------
// nld_CCCS
// ----------------------------------------------------------------------------------------
- /*
- * Current controlled current source
- *
- * IP ---+ +------> OP
- * | |
- * RI I
- * RI => G => I IOut = (V(IP)-V(IN)) / RI * G
- * RI I
- * | |
- * IN ---+ +------< ON
- *
- * G=1 ==> 1A ==> 1A
- *
- * RI = 1
- *
- * This needs high levels of accuracy to work with 1 Ohm RI.
- *
- */
-
- NETLIB_OBJECT_DERIVED(CCCS, VCCS)
+ //
+ // Current controlled current source
+ //
+ // IP ---+ +------> OP
+ // | |
+ // RI I
+ // RI => G => I IOut = -(V(IP)-V(IN)) / RI * G
+ // RI I
+ // | |
+ // IN ---+ +------< ON
+ //
+ // G=1 ==> 1A ==> 1A
+ //
+ // RI = 1
+ //
+ // If current flows from IP to IN than output current flows from OP to ON
+ //
+ // This needs high levels of accuracy to work with 1 Ohm RI.
+ //
+
+ class nld_CCCS : public nld_VCCS
{
public:
- NETLIB_CONSTRUCTOR_DERIVED(CCCS, VCCS)
+ nld_CCCS(constructor_param_t data)
+ : nld_VCCS(data, nlconst::one())
{
- m_gfac = plib::constants<nl_double>::one() / m_RI();
+ set_gfac(-plib::reciprocal(m_RI()));
}
NETLIB_RESETI();
protected:
- //NETLIB_UPDATEI();
NETLIB_UPDATE_PARAMI();
};
-
// ----------------------------------------------------------------------------------------
// nld_VCVS
// ----------------------------------------------------------------------------------------
- /*
- * Voltage controlled voltage source
- *
- * Parameters:
- * G Default: 1
- * RO Default: 1 (would be typically 50 for an op-amp
- *
- * IP ---+ +--+---- OP
- * | | |
- * RI I RO
- * RI => G => I RO V(OP) - V(ON) = (V(IP)-V(IN)) * G
- * RI I RO
- * | | |
- * IN ---+ +--+---- ON
- *
- * G=1 ==> 1V ==> 1V
- *
- * RI = 1 / NETLIST_GMIN
- *
- * Internal GI = G / RO
- *
- */
-
-
- NETLIB_OBJECT_DERIVED(VCVS, VCCS)
+ //
+ // Voltage controlled voltage source
+ //
+ // Parameters:
+ // G Default: 1
+ // RO Default: 1 (would be typically 50 for an op-amp
+ //
+ // IP ---+ +--+---- OP
+ // | | |
+ // RI I RO
+ // RI => G => I RO V(OP) - V(ON) = (V(IP)-V(IN)) * G
+ // RI I RO
+ // | | |
+ // IN ---+ +--+---- ON
+ //
+ // G=1 ==> 1V ==> 1V
+ //
+ // RI = 1 / NETLIST_GMIN
+ //
+ // Internal GI = G / RO
+ //
+
+ class nld_VCVS : public nld_VCCS
{
public:
- NETLIB_CONSTRUCTOR_DERIVED(VCVS, VCCS)
- , m_RO(*this, "RO", 1.0)
- , m_OP2(*this, "_OP2", &m_ON2)
- , m_ON2(*this, "_ON2", &m_OP2)
+ nld_VCVS(constructor_param_t data)
+ : nld_VCCS(data)
+ , m_RO(*this, "RO", nlconst::one())
+ , m_OP2(*this, "_OP2", &m_ON2, NETLIB_DELEGATE(terminal_handler))
+ , m_ON2(*this, "_ON2", &m_OP2, NETLIB_DELEGATE(terminal_handler))
{
connect(m_OP2, m_OP1);
connect(m_ON2, m_ON1);
@@ -184,19 +187,74 @@ namespace netlist {
NETLIB_RESETI();
- param_double_t m_RO;
+ param_fp_t m_RO;
private:
- //NETLIB_UPDATEI();
- //NETLIB_UPDATE_PARAMI();
+ // NETLIB_UPDATE_PARAMI();
+ NETLIB_HANDLERI(terminal_handler)
+ {
+ NETLIB_NAME(VCCS)::terminal_handler();
+ }
terminal_t m_OP2;
terminal_t m_ON2;
+ };
+ // ----------------------------------------------------------------------------------------
+ // nld_CCVS
+ // ----------------------------------------------------------------------------------------
+ //
+ // Voltage controlled voltage source
+ //
+ // Parameters:
+ // G Default: 1
+ // RO Default: 1 (would be typically 50 for an op-amp
+ //
+ // IP ---+ +--+---- OP
+ // | | |
+ // RI I RO
+ // RI => G => I RO V(OP) - V(ON) = (V(IP)-V(IN)) / RI * G
+ // RI I RO
+ // | | |
+ // IN ---+ +--+---- ON
+ //
+ // G=1 ==> 1A ==> 1V
+ //
+ // RI = 1
+ //
+ // Internal GI = G / RO
+ //
+
+ class nld_CCVS : public nld_VCCS
+ {
+ public:
+ nld_CCVS(constructor_param_t data)
+ : nld_VCCS(data, nlconst::one())
+ , m_RO(*this, "RO", nlconst::one())
+ , m_OP2(*this, "_OP2", &m_ON2, NETLIB_DELEGATE(terminal_handler))
+ , m_ON2(*this, "_ON2", &m_OP2, NETLIB_DELEGATE(terminal_handler))
+ {
+ connect(m_OP2, m_OP1);
+ connect(m_ON2, m_ON1);
+ }
+
+ NETLIB_RESETI();
+
+ param_fp_t m_RO;
+
+ private:
+ // NETLIB_UPDATE_PARAMI();
+
+ NETLIB_HANDLERI(terminal_handler)
+ {
+ NETLIB_NAME(VCCS)::terminal_handler();
+ }
+
+ terminal_t m_OP2;
+ terminal_t m_ON2;
};
- } // namespace analog
-} // namespace netlist
+} // namespace netlist::analog
-#endif /* NLD_FOURTERM_H_ */
+#endif // NLD_FOURTERM_H_