diff options
Diffstat (limited to 'src/emu/netlist/devices/nld_twoterm.h')
| -rw-r--r-- | src/emu/netlist/devices/nld_twoterm.h | 376 |
1 files changed, 187 insertions, 189 deletions
diff --git a/src/emu/netlist/devices/nld_twoterm.h b/src/emu/netlist/devices/nld_twoterm.h index 49b6ca3c629..6ebebf36903 100644 --- a/src/emu/netlist/devices/nld_twoterm.h +++ b/src/emu/netlist/devices/nld_twoterm.h @@ -40,30 +40,30 @@ // ---------------------------------------------------------------------------------------- #define NETDEV_R(_name, _R) \ - NET_REGISTER_DEV(R, _name) \ - NETDEV_PARAMI(_name, R, _R) + NET_REGISTER_DEV(R, _name) \ + NETDEV_PARAMI(_name, R, _R) #define NETDEV_POT(_name, _R) \ - NET_REGISTER_DEV(POT, _name) \ - NETDEV_PARAMI(_name, R, _R) + NET_REGISTER_DEV(POT, _name) \ + NETDEV_PARAMI(_name, R, _R) #define NETDEV_C(_name, _C) \ - NET_REGISTER_DEV(C, _name) \ - NETDEV_PARAMI(_name, C, _C) + NET_REGISTER_DEV(C, _name) \ + NETDEV_PARAMI(_name, C, _C) /* Generic Diode */ #define NETDEV_D(_name, _model) \ - NET_REGISTER_DEV(D, _name) \ - NETDEV_PARAMI(_name, model, # _model) + NET_REGISTER_DEV(D, _name) \ + NETDEV_PARAMI(_name, model, # _model) #define NETDEV_QPNP(_name, _model) \ - NET_REGISTER_DEV(QPNP_switch, _name) \ - NETDEV_PARAMI(_name, model, # _model) + NET_REGISTER_DEV(QPNP_switch, _name) \ + NETDEV_PARAMI(_name, model, # _model) #define NETDEV_QNPN(_name, _model) \ - NET_REGISTER_DEV(QNPN_switch, _name) \ - NETDEV_PARAMI(_name, model, # _model) + NET_REGISTER_DEV(QNPN_switch, _name) \ + NETDEV_PARAMI(_name, model, # _model) // ---------------------------------------------------------------------------------------- // Implementation @@ -76,24 +76,24 @@ class NETLIB_NAME(twoterm) : public netlist_device_t { public: - ATTR_COLD NETLIB_NAME(twoterm)(const family_t afamily); + ATTR_COLD NETLIB_NAME(twoterm)(const family_t afamily); - netlist_terminal_t m_P; - netlist_terminal_t m_N; + netlist_terminal_t m_P; + netlist_terminal_t m_N; - virtual NETLIB_UPDATE_TERMINALS() - { - } + virtual NETLIB_UPDATE_TERMINALS() + { + } - ATTR_HOT inline void set(const double G, const double V, const double I) - { - m_P.m_go = m_N.m_go = m_P.m_gt = m_N.m_gt = G; - m_N.m_Idr = ( -V) * G + I; - m_P.m_Idr = ( V) * G - I; - } + ATTR_HOT inline void set(const double G, const double V, const double I) + { + m_P.m_go = m_N.m_go = m_P.m_gt = m_N.m_gt = G; + m_N.m_Idr = ( -V) * G + I; + m_P.m_Idr = ( V) * G - I; + } protected: - ATTR_COLD virtual void start(); - ATTR_HOT ATTR_ALIGN void update(); + ATTR_COLD virtual void start(); + ATTR_HOT ATTR_ALIGN void update(); private: }; @@ -105,17 +105,17 @@ private: class NETLIB_NAME(R_base) : public NETLIB_NAME(twoterm) { public: - ATTR_COLD NETLIB_NAME(R_base)() : NETLIB_NAME(twoterm)(RESISTOR) { } + ATTR_COLD NETLIB_NAME(R_base)() : NETLIB_NAME(twoterm)(RESISTOR) { } - inline void set_R(const double R) { set(1.0 / R, 0.0, 0.0); } + inline void set_R(const double R) { set(1.0 / R, 0.0, 0.0); } protected: - ATTR_COLD virtual void start(); - ATTR_HOT ATTR_ALIGN void update(); + ATTR_COLD virtual void start(); + ATTR_HOT ATTR_ALIGN void update(); }; NETLIB_DEVICE_WITH_PARAMS_DERIVED(R, R_base, - netlist_param_double_t m_R; + netlist_param_double_t m_R; ); // ---------------------------------------------------------------------------------------- @@ -123,11 +123,11 @@ NETLIB_DEVICE_WITH_PARAMS_DERIVED(R, R_base, // ---------------------------------------------------------------------------------------- NETLIB_DEVICE_WITH_PARAMS(POT, - NETLIB_NAME(R_base) m_R1; - NETLIB_NAME(R_base) m_R2; + NETLIB_NAME(R_base) m_R1; + NETLIB_NAME(R_base) m_R2; - netlist_param_double_t m_R; - netlist_param_double_t m_Dial; + netlist_param_double_t m_R; + netlist_param_double_t m_Dial; ); @@ -138,21 +138,21 @@ NETLIB_DEVICE_WITH_PARAMS(POT, class NETLIB_NAME(C) : public NETLIB_NAME(twoterm) { public: - ATTR_COLD NETLIB_NAME(C)() : NETLIB_NAME(twoterm)(CAPACITOR) { } + ATTR_COLD NETLIB_NAME(C)() : NETLIB_NAME(twoterm)(CAPACITOR) { } - ATTR_HOT void step_time(const double st) - { - double G = m_C.Value() / st; - double I = -G * (m_P.net().Q_Analog()- m_N.net().Q_Analog()); - set(G, 0.0, I); - } + ATTR_HOT void step_time(const double st) + { + double G = m_C.Value() / st; + double I = -G * (m_P.net().Q_Analog()- m_N.net().Q_Analog()); + set(G, 0.0, I); + } protected: - ATTR_COLD virtual void start(); - ATTR_COLD virtual void update_param(); - ATTR_HOT ATTR_ALIGN void update(); + ATTR_COLD virtual void start(); + ATTR_COLD virtual void update_param(); + ATTR_HOT ATTR_ALIGN void update(); - netlist_param_double_t m_C; + netlist_param_double_t m_C; }; @@ -167,87 +167,87 @@ protected: #if 0 inline double fastexp_h(const double x) { - static const double ln2r = 1.442695040888963387; - static const double ln2 = 0.693147180559945286; - //static const double c3 = 0.166666666666666667; + static const double ln2r = 1.442695040888963387; + static const double ln2 = 0.693147180559945286; + //static const double c3 = 0.166666666666666667; - const double y = x * ln2r; - const unsigned int t = y; - const double z = (x - ln2 * (double) t); - const double zz = z * z; - //const double zzz = zz * z; + const double y = x * ln2r; + const unsigned int t = y; + const double z = (x - ln2 * (double) t); + const double zz = z * z; + //const double zzz = zz * z; - return (double)(1 << t)*(1.0 + z + 0.5 * zz); // + c3*zzz; + return (double)(1 << t)*(1.0 + z + 0.5 * zz); // + c3*zzz; } inline double fastexp(const double x) { - if (x<0) - return 1.0 / fastexp_h(-x); - else - return fastexp_h(x); + if (x<0) + return 1.0 / fastexp_h(-x); + else + return fastexp_h(x); } #endif class NETLIB_NAME(D) : public NETLIB_NAME(twoterm) { public: - ATTR_COLD NETLIB_NAME(D)() : NETLIB_NAME(twoterm)(DIODE) { } - - NETLIB_UPDATE_TERMINALS() - { - const double nVd = m_P.net().Q_Analog()- m_N.net().Q_Analog(); - - //FIXME: Optimize cutoff case - - double Id; - double G; - - if (nVd < -5.0 * m_Vt) - { - m_Vd = nVd; - G = NETLIST_GMIN; - Id = - m_Is; - } - else if (nVd < m_Vcrit) - { - m_Vd = nVd; - - const double eVDVt = exp(m_Vd * m_VtInv); - Id = m_Is * (eVDVt - 1.0); - G = m_Is * m_VtInv * eVDVt; - } - else - { + ATTR_COLD NETLIB_NAME(D)() : NETLIB_NAME(twoterm)(DIODE) { } + + NETLIB_UPDATE_TERMINALS() + { + const double nVd = m_P.net().Q_Analog()- m_N.net().Q_Analog(); + + //FIXME: Optimize cutoff case + + double Id; + double G; + + if (nVd < -5.0 * m_Vt) + { + m_Vd = nVd; + G = NETLIST_GMIN; + Id = - m_Is; + } + else if (nVd < m_Vcrit) + { + m_Vd = nVd; + + const double eVDVt = exp(m_Vd * m_VtInv); + Id = m_Is * (eVDVt - 1.0); + G = m_Is * m_VtInv * eVDVt; + } + else + { #if defined(_MSC_VER) && _MSC_VER < 1800 - m_Vd = m_Vd + log((nVd - m_Vd) * m_VtInv + 1.0) * m_Vt; + m_Vd = m_Vd + log((nVd - m_Vd) * m_VtInv + 1.0) * m_Vt; #else - m_Vd = m_Vd + log1p((nVd - m_Vd) * m_VtInv) * m_Vt; + m_Vd = m_Vd + log1p((nVd - m_Vd) * m_VtInv) * m_Vt; #endif - const double eVDVt = exp(m_Vd * m_VtInv); - Id = m_Is * (eVDVt - 1.0); + const double eVDVt = exp(m_Vd * m_VtInv); + Id = m_Is * (eVDVt - 1.0); - G = m_Is * m_VtInv * eVDVt; - } + G = m_Is * m_VtInv * eVDVt; + } - double I = (Id - m_Vd * G); - set(G, 0.0, I); - } + double I = (Id - m_Vd * G); + set(G, 0.0, I); + } protected: - ATTR_COLD virtual void start(); - ATTR_COLD virtual void update_param(); - ATTR_HOT ATTR_ALIGN void update(); + ATTR_COLD virtual void start(); + ATTR_COLD virtual void update_param(); + ATTR_HOT ATTR_ALIGN void update(); - netlist_param_model_t m_model; + netlist_param_model_t m_model; - double m_Vt; - double m_Is; - double m_n; + double m_Vt; + double m_Is; + double m_n; - double m_VtInv; - double m_Vcrit; - double m_Vd; + double m_VtInv; + double m_Vcrit; + double m_Vd; }; @@ -269,32 +269,32 @@ protected: class NETLIB_NAME(Q) : public netlist_device_t { public: - enum q_type { - BJT_NPN, - BJT_PNP - }; + enum q_type { + BJT_NPN, + BJT_PNP + }; - ATTR_COLD NETLIB_NAME(Q)(const q_type atype, const family_t afamily) - : netlist_device_t(afamily) - , m_qtype(atype) { } + ATTR_COLD NETLIB_NAME(Q)(const q_type atype, const family_t afamily) + : netlist_device_t(afamily) + , m_qtype(atype) { } - inline q_type qtype() const { return m_qtype; } - inline bool is_qtype(q_type atype) const { return m_qtype == atype; } + inline q_type qtype() const { return m_qtype; } + inline bool is_qtype(q_type atype) const { return m_qtype == atype; } protected: - ATTR_COLD virtual void start(); - ATTR_HOT ATTR_ALIGN void update(); + ATTR_COLD virtual void start(); + ATTR_HOT ATTR_ALIGN void update(); - netlist_param_model_t m_model; + netlist_param_model_t m_model; private: - q_type m_qtype; + q_type m_qtype; }; class NETLIB_NAME(QBJT) : public NETLIB_NAME(Q) { public: - ATTR_COLD NETLIB_NAME(QBJT)(const q_type atype, const family_t afamily) - : NETLIB_NAME(Q)(atype, afamily) { } + ATTR_COLD NETLIB_NAME(QBJT)(const q_type atype, const family_t afamily) + : NETLIB_NAME(Q)(atype, afamily) { } protected: @@ -306,51 +306,51 @@ template <NETLIB_NAME(Q)::q_type _type> class NETLIB_NAME(QBJT_switch) : public NETLIB_NAME(QBJT) { public: - ATTR_COLD NETLIB_NAME(QBJT_switch)() - : NETLIB_NAME(QBJT)(_type, BJT_SWITCH), m_gB(NETLIST_GMIN), m_gC(NETLIST_GMIN), m_V(0.0), m_state_on(0) { } - - NETLIB_UPDATEI() - { - double vE = INPANALOG(m_EV); - double vB = INPANALOG(m_BV); - - int new_state = (vB - vE > m_V ) ? 1 : 0; - if (m_state_on ^ new_state) - { - double gb = m_gB; - double gc = m_gC; - double v = m_V; - if (!new_state ) - { - // not conducting - gb = NETLIST_GMIN; - v = 0; - gc = NETLIST_GMIN; - } - m_RB.set(gb, v, 0.0); - m_RC.set(gc, 0.0, 0.0); - m_state_on = new_state; - m_RB.update_dev(); - m_RC.update_dev(); - } - - } - - NETLIB_NAME(R) m_RB; - NETLIB_NAME(R) m_RC; - - netlist_analog_input_t m_BV; - netlist_analog_input_t m_EV; + ATTR_COLD NETLIB_NAME(QBJT_switch)() + : NETLIB_NAME(QBJT)(_type, BJT_SWITCH), m_gB(NETLIST_GMIN), m_gC(NETLIST_GMIN), m_V(0.0), m_state_on(0) { } + + NETLIB_UPDATEI() + { + double vE = INPANALOG(m_EV); + double vB = INPANALOG(m_BV); + + int new_state = (vB - vE > m_V ) ? 1 : 0; + if (m_state_on ^ new_state) + { + double gb = m_gB; + double gc = m_gC; + double v = m_V; + if (!new_state ) + { + // not conducting + gb = NETLIST_GMIN; + v = 0; + gc = NETLIST_GMIN; + } + m_RB.set(gb, v, 0.0); + m_RC.set(gc, 0.0, 0.0); + m_state_on = new_state; + m_RB.update_dev(); + m_RC.update_dev(); + } + + } + + NETLIB_NAME(R) m_RB; + NETLIB_NAME(R) m_RC; + + netlist_analog_input_t m_BV; + netlist_analog_input_t m_EV; protected: - ATTR_COLD virtual void start(); - ATTR_COLD void update_param(); + ATTR_COLD virtual void start(); + ATTR_COLD void update_param(); - double m_gB; // base conductance / switch on - double m_gC; // collector conductance / switch on - double m_V; // internal voltage source - UINT8 m_state_on; + double m_gB; // base conductance / switch on + double m_gC; // collector conductance / switch on + double m_V; // internal voltage source + UINT8 m_state_on; private: }; @@ -380,35 +380,34 @@ typedef NETLIB_NAME(QBJT_switch)<NETLIB_NAME(Q)::BJT_NPN> NETLIB_NAME(QNPN_switc */ #define NETDEV_VCCS(_name) \ - NET_REGISTER_DEV(VCCS, _name) \ - + NET_REGISTER_DEV(VCCS, _name) //NETDEV_PARAMI(_name, model, _model) class NETLIB_NAME(VCCS) : public netlist_device_t { public: - ATTR_COLD NETLIB_NAME(VCCS)() - : netlist_device_t(VCCS) { } - ATTR_COLD NETLIB_NAME(VCCS)(const family_t afamily) - : netlist_device_t(afamily) { } + ATTR_COLD NETLIB_NAME(VCCS)() + : netlist_device_t(VCCS) { } + ATTR_COLD NETLIB_NAME(VCCS)(const family_t afamily) + : netlist_device_t(afamily) { } protected: - ATTR_COLD virtual void start(); - ATTR_COLD virtual void update_param(); - ATTR_HOT ATTR_ALIGN void update(); + ATTR_COLD virtual void start(); + ATTR_COLD virtual void update_param(); + ATTR_HOT ATTR_ALIGN void update(); - ATTR_COLD void configure(const double Gfac, const double GI); + ATTR_COLD void configure(const double Gfac, const double GI); - netlist_terminal_t m_OP; - netlist_terminal_t m_ON; + netlist_terminal_t m_OP; + netlist_terminal_t m_ON; - netlist_terminal_t m_IP; - netlist_terminal_t m_IN; + netlist_terminal_t m_IP; + netlist_terminal_t m_IN; - netlist_terminal_t m_OP1; - netlist_terminal_t m_ON1; + netlist_terminal_t m_OP1; + netlist_terminal_t m_ON1; - netlist_param_double_t m_G; + netlist_param_double_t m_G; }; // ---------------------------------------------------------------------------------------- @@ -439,28 +438,27 @@ protected: */ #define NETDEV_VCVS(_name) \ - NET_REGISTER_DEV(VCVS, _name) \ - + NET_REGISTER_DEV(VCVS, _name) //NETDEV_PARAMI(_name, model, _model) class NETLIB_NAME(VCVS) : public NETLIB_NAME(VCCS) { public: - ATTR_COLD NETLIB_NAME(VCVS)() - : NETLIB_NAME(VCCS)(VCVS) { } + ATTR_COLD NETLIB_NAME(VCVS)() + : NETLIB_NAME(VCCS)(VCVS) { } protected: - ATTR_COLD virtual void start(); - ATTR_COLD virtual void update_param(); - //ATTR_HOT ATTR_ALIGN void update(); + ATTR_COLD virtual void start(); + ATTR_COLD virtual void update_param(); + //ATTR_HOT ATTR_ALIGN void update(); - netlist_terminal_t m_OP2; - netlist_terminal_t m_ON2; + netlist_terminal_t m_OP2; + netlist_terminal_t m_ON2; - double m_mult; + double m_mult; - netlist_param_double_t m_RO; + netlist_param_double_t m_RO; }; |
