diff options
Diffstat (limited to 'src/lib/netlist/analog/nlid_fourterm.h')
-rw-r--r-- | src/lib/netlist/analog/nlid_fourterm.h | 282 |
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_ |