From 045ffafb42c06066048a0e66308e7df4040affce Mon Sep 17 00:00:00 2001 From: couriersud Date: Tue, 30 Jun 2015 21:46:42 +0200 Subject: [PATCH] Added Voltage source and Current source to netlist. [Couriersud] --- nl_examples/vs_cs.c | 50 +++++++++++++++++++++++ src/emu/netlist/analog/nld_twoterm.c | 52 ++++++++++++++++++++++++ src/emu/netlist/analog/nld_twoterm.h | 61 ++++++++++++++++++++++++---- src/emu/netlist/devices/net_lib.c | 2 + src/emu/netlist/nl_base.h | 2 + 5 files changed, 159 insertions(+), 8 deletions(-) create mode 100644 nl_examples/vs_cs.c diff --git a/nl_examples/vs_cs.c b/nl_examples/vs_cs.c new file mode 100644 index 00000000000..4e6bb9615fe --- /dev/null +++ b/nl_examples/vs_cs.c @@ -0,0 +1,50 @@ +/* + * vs_cs.c + * + * Voltage and current source test + * + */ + +#include "netlist/devices/net_lib.h" + +NETLIST_START(rc) + + /* + * delay circuit + * + */ + + /* Standard stuff */ + + SOLVER(Solver, 48000) + PARAM(Solver.ACCURACY, 1e-6) + CLOCK(clk, 20000) + + /* Voltage source. Inner resistance will make clock visible */ + + RES(R1, 1000) + VS(VS1, 1) + NET_C(R1.1, clk) + NET_C(R1.2, VS1.P) + NET_C(GND, VS1.N) + + /* Current source. Current flows from "+" to "-", thus for a source we + * need negative current + */ + + RES(R2, 1000) + RES(R3, 1000) + CS(CS1, -0.001) + NET_C(CS1.P, R2.1) + NET_C(R2.2, R3.1) + NET_C(GND, CS1.N, R3.2) + + CAP(C1, CAP_U(1)) + NET_C(C1.1, R3.1) + NET_C(C1.2, R3.2) + + + LOG(tt, VS1.P) + LOG(tx, R2.2) + +NETLIST_END() diff --git a/src/emu/netlist/analog/nld_twoterm.c b/src/emu/netlist/analog/nld_twoterm.c index d0199c9671a..64e9ef042ba 100644 --- a/src/emu/netlist/analog/nld_twoterm.c +++ b/src/emu/netlist/analog/nld_twoterm.c @@ -281,4 +281,56 @@ NETLIB_UPDATE_TERMINALS(D) set(m_D.G(), 0.0, m_D.Ieq()); } +// ---------------------------------------------------------------------------------------- +// nld_VS +// ---------------------------------------------------------------------------------------- + +NETLIB_START(VS) +{ + NETLIB_NAME(twoterm)::start(); + + register_param("R", m_R, 0.1); + register_param("V", m_V, 0.0); + + register_terminal("P", m_P); + register_terminal("N", m_N); +} + +NETLIB_RESET(VS) +{ + NETLIB_NAME(twoterm)::reset(); + this->set(1.0 / m_R, m_V, 0.0); +} + +NETLIB_UPDATE(VS) +{ + NETLIB_NAME(twoterm)::update(); +} + +// ---------------------------------------------------------------------------------------- +// nld_CS +// ---------------------------------------------------------------------------------------- + +NETLIB_START(CS) +{ + NETLIB_NAME(twoterm)::start(); + + register_param("I", m_I, 1.0); + + register_terminal("P", m_P); + register_terminal("N", m_N); +} + +NETLIB_RESET(CS) +{ + NETLIB_NAME(twoterm)::reset(); + printf("m_I %f\n", m_I.Value()); + this->set(0.0, 0.0, m_I); +} + +NETLIB_UPDATE(CS) +{ + NETLIB_NAME(twoterm)::update(); +} + NETLIB_NAMESPACE_DEVICES_END() diff --git a/src/emu/netlist/analog/nld_twoterm.h b/src/emu/netlist/analog/nld_twoterm.h index 6ef9361b22d..9969c65830e 100644 --- a/src/emu/netlist/analog/nld_twoterm.h +++ b/src/emu/netlist/analog/nld_twoterm.h @@ -40,28 +40,36 @@ // ---------------------------------------------------------------------------------------- #define RES(_name, _R) \ - NET_REGISTER_DEV(R, _name) \ + NET_REGISTER_DEV(R, _name) \ NETDEV_PARAMI(_name, R, _R) -#define POT(_name, _R) \ - NET_REGISTER_DEV(POT, _name) \ +#define POT(_name, _R) \ + NET_REGISTER_DEV(POT, _name) \ NETDEV_PARAMI(_name, R, _R) /* Does not have pin 3 connected */ -#define POT2(_name, _R) \ - NET_REGISTER_DEV(POT2, _name) \ +#define POT2(_name, _R) \ + NET_REGISTER_DEV(POT2, _name) \ NETDEV_PARAMI(_name, R, _R) #define CAP(_name, _C) \ - NET_REGISTER_DEV(C, _name) \ + NET_REGISTER_DEV(C, _name) \ NETDEV_PARAMI(_name, C, _C) /* Generic Diode */ -#define DIODE(_name, _model) \ - NET_REGISTER_DEV(D, _name) \ +#define DIODE(_name, _model) \ + NET_REGISTER_DEV(D, _name) \ NETDEV_PARAMI(_name, model, _model) +#define VS(_name, _V) \ + NET_REGISTER_DEV(VS, _name) \ + NETDEV_PARAMI(_name, V, _V) + +#define CS(_name, _I) \ + NET_REGISTER_DEV(CS, _name) \ + NETDEV_PARAMI(_name, I, _I) + // ---------------------------------------------------------------------------------------- // Generic macros // ---------------------------------------------------------------------------------------- @@ -290,6 +298,43 @@ protected: generic_diode m_D; }; +// ---------------------------------------------------------------------------------------- +// nld_VS - Voltage source +// +// netlist voltage source must have inner resistance +// ---------------------------------------------------------------------------------------- + +class NETLIB_NAME(VS) : public NETLIB_NAME(twoterm) +{ +public: + ATTR_COLD NETLIB_NAME(VS)() : NETLIB_NAME(twoterm)(VS) { } + +protected: + virtual void start(); + virtual void reset(); + ATTR_HOT void update(); + + param_double_t m_R; + param_double_t m_V; +}; + +// ---------------------------------------------------------------------------------------- +// nld_CS - Current source +// ---------------------------------------------------------------------------------------- + +class NETLIB_NAME(CS) : public NETLIB_NAME(twoterm) +{ +public: + ATTR_COLD NETLIB_NAME(CS)() : NETLIB_NAME(twoterm)(CS) { } + +protected: + virtual void start(); + virtual void reset(); + ATTR_HOT void update(); + + param_double_t m_I; +}; + NETLIB_NAMESPACE_DEVICES_END() diff --git a/src/emu/netlist/devices/net_lib.c b/src/emu/netlist/devices/net_lib.c index 5335a34505c..88238cbca1a 100644 --- a/src/emu/netlist/devices/net_lib.c +++ b/src/emu/netlist/devices/net_lib.c @@ -53,6 +53,8 @@ void initialize_factory(factory_list_t &factory) ENTRY(VCVS, VCVS, "-") ENTRY(VCCS, VCCS, "-") ENTRY(CCCS, CCCS, "-") + ENTRY(VS, VS, "V") + ENTRY(CS, CS, "I") ENTRY(dummy_input, DUMMY_INPUT, "-") ENTRY(frontier, FRONTIER_DEV, "+I,G,Q") // not intended to be used directly ENTRY(QBJT_EB, QBJT_EB, "model") diff --git a/src/emu/netlist/nl_base.h b/src/emu/netlist/nl_base.h index 7f329d05003..fff7fedf204 100644 --- a/src/emu/netlist/nl_base.h +++ b/src/emu/netlist/nl_base.h @@ -389,6 +389,8 @@ namespace netlist VCVS, // Voltage controlled voltage source VCCS, // Voltage controlled current source CCCS, // Current controlled current source + VS, // Voltage Source + CS, // Current Source GND // GND device };