summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2020-01-26 21:25:33 +0100
committer couriersud <couriersud@gmx.org>2020-01-26 21:25:33 +0100
commitfa27a02b0dfa27197082ffbadf5bbfb58360d9f3 (patch)
tree3353e9afaa73b99cc3f9c386067dad63c389c891
parentd980e7d6aba6e619b14e9f00c350d4beeed2a675 (diff)
netlist: add current controlled voltage source (CCVS). [Couriersud]
-rw-r--r--src/lib/netlist/analog/nld_fourterm.h3
-rw-r--r--src/lib/netlist/analog/nlid_fourterm.cpp14
-rw-r--r--src/lib/netlist/analog/nlid_fourterm.h57
-rw-r--r--src/lib/netlist/devices/net_lib.cpp1
-rw-r--r--src/lib/netlist/nl_base.h7
5 files changed, 79 insertions, 3 deletions
diff --git a/src/lib/netlist/analog/nld_fourterm.h b/src/lib/netlist/analog/nld_fourterm.h
index dcd32744263..63ba4276169 100644
--- a/src/lib/netlist/analog/nld_fourterm.h
+++ b/src/lib/netlist/analog/nld_fourterm.h
@@ -23,6 +23,9 @@
#define VCVS(name) \
NET_REGISTER_DEV(VCVS, name)
+#define CCVS(name) \
+ NET_REGISTER_DEV(CCVS, name)
+
#define LVCCS(name) \
NET_REGISTER_DEV(LVCCS, name)
diff --git a/src/lib/netlist/analog/nlid_fourterm.cpp b/src/lib/netlist/analog/nlid_fourterm.cpp
index 8b1240c7f82..708fc6a338a 100644
--- a/src/lib/netlist/analog/nlid_fourterm.cpp
+++ b/src/lib/netlist/analog/nlid_fourterm.cpp
@@ -108,12 +108,26 @@ NETLIB_RESET(VCVS)
m_ON2.set_conductivity(m_gfac);
}
+// ----------------------------------------------------------------------------------------
+// nld_CCVS
+// ----------------------------------------------------------------------------------------
+
+NETLIB_RESET(CCVS)
+{
+ m_gfac = plib::reciprocal(m_RO());
+ NETLIB_NAME(VCCS)::reset();
+
+ m_OP2.set_conductivity(m_gfac);
+ m_ON2.set_conductivity(m_gfac);
+}
+
} //namespace analog
namespace devices {
NETLIB_DEVICE_IMPL_NS(analog, VCVS, "VCVS", "")
NETLIB_DEVICE_IMPL_NS(analog, VCCS, "VCCS", "")
NETLIB_DEVICE_IMPL_NS(analog, CCCS, "CCCS", "")
+ NETLIB_DEVICE_IMPL_NS(analog, CCVS, "CCVS", "")
NETLIB_DEVICE_IMPL_NS(analog, LVCCS, "LVCCS", "")
} // namespace devices
} // namespace netlist
diff --git a/src/lib/netlist/analog/nlid_fourterm.h b/src/lib/netlist/analog/nlid_fourterm.h
index c7ec2524b9b..862fe8f79e5 100644
--- a/src/lib/netlist/analog/nlid_fourterm.h
+++ b/src/lib/netlist/analog/nlid_fourterm.h
@@ -36,9 +36,9 @@ namespace analog {
NETLIB_OBJECT(VCCS)
{
public:
- NETLIB_CONSTRUCTOR(VCCS)
+ NETLIB_CONSTRUCTOR_EX(VCCS, nl_fptype ari = nlconst::magic(1e9))
, m_G(*this, "G", nlconst::one())
- , m_RI(*this, "RI", nlconst::magic(1e9))
+ , m_RI(*this, "RI", ari)
, 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...
@@ -126,7 +126,7 @@ namespace analog {
NETLIB_OBJECT_DERIVED(CCCS, VCCS)
{
public:
- NETLIB_CONSTRUCTOR_DERIVED(CCCS, VCCS)
+ NETLIB_CONSTRUCTOR_DERIVED_PASS(CCCS, VCCS, nlconst::one())
{
m_gfac = plib::reciprocal(m_RI());
}
@@ -191,6 +191,57 @@ namespace analog {
};
+ // ----------------------------------------------------------------------------------------
+ // 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
+ //
+
+ NETLIB_OBJECT_DERIVED(CCVS, VCCS)
+ {
+ public:
+ NETLIB_CONSTRUCTOR_DERIVED_PASS(CCVS, VCCS, nlconst::one())
+ , m_RO(*this, "RO", nlconst::one())
+ , m_OP2(*this, "_OP2", &m_ON2)
+ , m_ON2(*this, "_ON2", &m_OP2)
+ {
+ connect(m_OP2, m_OP1);
+ connect(m_ON2, m_ON1);
+ }
+
+ NETLIB_RESETI();
+
+ param_fp_t m_RO;
+
+ private:
+ //NETLIB_UPDATEI();
+ //NETLIB_UPDATE_PARAMI();
+
+ terminal_t m_OP2;
+ terminal_t m_ON2;
+ };
+
+
} // namespace analog
} // namespace netlist
diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp
index c68a8ce5755..6685f6231d9 100644
--- a/src/lib/netlist/devices/net_lib.cpp
+++ b/src/lib/netlist/devices/net_lib.cpp
@@ -38,6 +38,7 @@ namespace devices
LIB_ENTRY(VCVS)
LIB_ENTRY(VCCS)
LIB_ENTRY(CCCS)
+ LIB_ENTRY(CCVS)
LIB_ENTRY(LVCCS)
LIB_ENTRY(opamp)
LIB_ENTRY(nc_pin)
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index ae1a17a8975..95540a7d29a 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -62,11 +62,18 @@ class NETLIB_NAME(name) : public device_t
public: template <class CLASS> NETLIB_NAME(cname)(CLASS &owner, const pstring &name) \
: NETLIB_NAME(pclass)(owner, name)
+// FIXME: Only used by diode
#define NETLIB_CONSTRUCTOR_DERIVED_EX(cname, pclass, ...) \
private: detail::family_setter_t m_famsetter; \
public: template <class CLASS> NETLIB_NAME(cname)(CLASS &owner, const pstring &name, __VA_ARGS__) \
: NETLIB_NAME(pclass)(owner, name)
+#define NETLIB_CONSTRUCTOR_DERIVED_PASS(cname, pclass, ...) \
+ private: detail::family_setter_t m_famsetter; \
+ public: template <class CLASS> NETLIB_NAME(cname)(CLASS &owner, const pstring &name) \
+ : NETLIB_NAME(pclass)(owner, name, __VA_ARGS__)
+
+
/// \brief Used to define the constructor of a netlist device.
/// Use this to define the constructor of a netlist device. Please refer to
/// #NETLIB_OBJECT for an example.