Previous 199869 Revisions Next

r31137 Sunday 29th June, 2014 at 19:07:59 UTC by Couriersud
Added more device to netlist:
- R2R resistor network DAC.
- Dummy input device. This is used so that devices can exhibit terminals not yet used
 such as V+ for opamps.
- Added a very basic macro model for norton opamps (LM3900)
- Added a current controlled current source (CCCS)
[src/emu/netlist]netlist.mak nl_base.h
[src/emu/netlist/analog]nld_fourterm.c nld_fourterm.h nld_ms_gauss_seidel.h nld_opamps.c* nld_opamps.h* nld_twoterm.c nld_twoterm.h
[src/emu/netlist/devices]net_lib.c net_lib.h nld_74ls629.c nld_r2r_dac.c* nld_r2r_dac.h* nld_system.h

trunk/src/emu/netlist/devices/nld_r2r_dac.c
r0r31137
1/*
2 * nld_R2R_dac.c
3 *
4 */
5
6#include "nld_r2r_dac.h"
7
8NETLIB_START(r2r_dac)
9{
10    NETLIB_NAME(twoterm)::start();
11    register_terminal("VOUT", m_P);
12    register_terminal("VGND", m_N);
13    register_param("R", m_R, 1.0);
14    register_param("VIN", m_VIN, 1.0);
15    register_param("N", m_num, 1);
16    register_param("VAL", m_val, 1);
17}
18
19NETLIB_RESET(r2r_dac)
20{
21    NETLIB_NAME(twoterm)::reset();
22}
23
24NETLIB_UPDATE(r2r_dac)
25{
26    NETLIB_NAME(twoterm)::update();
27}
28
29NETLIB_UPDATE_PARAM(r2r_dac)
30{
31    //printf("updating %s to %f\n", name().cstr(), m_R.Value());
32
33    update_dev();
34
35    double V = m_VIN.Value() / (double) (1 << m_num.Value()) * (double) m_val.Value();
36
37    this->set(1.0 / m_R.Value(), V, 0.0);
38}
39
Property changes on: trunk/src/emu/netlist/devices/nld_r2r_dac.c
Added: svn:eol-style
   + native
Added: svn:mime-type
   + text/plain
trunk/src/emu/netlist/devices/nld_r2r_dac.h
r0r31137
1// license:GPL-2.0+
2// copyright-holders:Couriersud
3/*
4 * nld_R2R_DAC.h
5 *
6 *  DMR2R_DAC: R-2R DAC
7 *
8 *  Generic R-2R DAC ... This is fast.
9 *                 2R
10 *  Bit n    >----RRR----+---------> Vout
11 *                       |
12 *                       R
13 *                       R R
14 *                       R
15 *                       |
16 *                       .
17 *                       .
18 *                 2R    |
19 *  Bit 2    >----RRR----+
20 *                       |
21 *                       R
22 *                       R R
23 *                       R
24 *                       |
25 *                 2R    |
26 *  Bit 1    >----RRR----+
27 *                       |
28 *                       R
29 *                       R 2R
30 *                       R
31 *                       |
32 *                      V0
33 *
34 * Using Thevenin's Theorem, this can be written as
35 *
36 *          +---RRR-----------> Vout
37 *          |
38 *          V
39 *          V  V = VAL / 2^n * Vin
40 *          V
41 *          |
42 *          V0
43 *
44 */
45
46#ifndef NLD_R2R_DAC_H_
47#define NLD_R2R_DAC_H_
48
49#include "../nl_base.h"
50#include "../analog/nld_twoterm.h"
51
52#define R2R_DAC(_name, _VIN, _R, _N)                                            \
53      NET_REGISTER_DEV(r2r_dac, _name)                                       \
54        NETDEV_PARAMI(_name, VIN, _VIN)                                        \
55        NETDEV_PARAMI(_name, R,   _R)                                          \
56        NETDEV_PARAMI(_name, N,   _N)
57
58NETLIB_DEVICE_WITH_PARAMS_DERIVED(r2r_dac, twoterm,
59    netlist_param_double_t m_VIN;
60    netlist_param_double_t m_R;
61    netlist_param_int_t m_num;
62    netlist_param_int_t m_val;
63);
64
65
66#endif /* NLD_R2R_DAC_H_ */
Property changes on: trunk/src/emu/netlist/devices/nld_r2r_dac.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/netlist/devices/net_lib.c
r31136r31137
8989   ENTRY(D,                    DIODE,                  "model")
9090   ENTRY(VCVS,                 VCVS,                   "-")        // FIXME: STD parameters ?
9191   ENTRY(VCCS,                 VCCS,                   "-")
92    ENTRY(CCCS,                 CCCS,                   "-")
93    ENTRY(dummy_input,          DUMMY_INPUT,            "-")
9294   ENTRY(QBJT_EB,              QBJT_EB,                "model")
9395   ENTRY(QBJT_switch,          QBJT_SW,                "model")
9496   ENTRY(ttl_input,            TTL_INPUT,              "IN")
r31136r31137
129131   ENTRY(SN74LS629,            SN74LS629,              "CAP")
130132   ENTRY(9316,                 TTL_9316,               "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D")
131133   ENTRY(NE555,                NE555,                  "-")
134    ENTRY(r2r_dac,              R2R_DAC,                "+VIN,R,N")
132135   ENTRY(4020_dip,             CD_4020_DIP,            "-")
133136    ENTRY(4066_dip,             CD_4066_DIP,            "-")
134137   ENTRY(7400_dip,             TTL_7400_DIP,           "-")
trunk/src/emu/netlist/devices/net_lib.h
r31136r31137
8383
8484#include "nld_ne555.h"
8585
86#include "nld_r2r_dac.h"
87
8688#include "nld_log.h"
8789
8890#include "../analog/nld_bjt.h"
r31136r31137
9092#include "../analog/nld_solver.h"
9193#include "../analog/nld_switches.h"
9294#include "../analog/nld_twoterm.h"
95#include "../analog/nld_opamps.h"
9396
9497#include "nld_legacy.h"
9598
trunk/src/emu/netlist/devices/nld_system.h
r31136r31137
1313#include "../nl_base.h"
1414#include "../analog/nld_twoterm.h"
1515
16// ----------------------------------------------------------------------------------------
16// -----------------------------------------------------------------------------
1717// Macros
18// ----------------------------------------------------------------------------------------
18// -----------------------------------------------------------------------------
1919
20#define TTL_INPUT(_name, _v)                                                 \
21      NET_REGISTER_DEV(ttl_input, _name)                                   \
20#define TTL_INPUT(_name, _v)                                                   \
21      NET_REGISTER_DEV(ttl_input, _name)                                     \
2222      PARAM(_name.IN, _v)
2323
24#define ANALOG_INPUT(_name, _v)                                              \
25      NET_REGISTER_DEV(analog_input, _name)                                \
24#define ANALOG_INPUT(_name, _v)                                                \
25      NET_REGISTER_DEV(analog_input, _name)                                  \
2626      PARAM(_name.IN, _v)
2727
28#define MAINCLOCK(_name, _freq)                                              \
29      NET_REGISTER_DEV(mainclock, _name)                                   \
28#define MAINCLOCK(_name, _freq)                                                \
29      NET_REGISTER_DEV(mainclock, _name)                                     \
3030      PARAM(_name.FREQ, _freq)
3131
32#define CLOCK(_name, _freq)                                                  \
33      NET_REGISTER_DEV(clock, _name)                                       \
32#define CLOCK(_name, _freq)                                                    \
33      NET_REGISTER_DEV(clock, _name)                                         \
3434      PARAM(_name.FREQ, _freq)
3535
36#define GNDA()                                                                \
36#define GNDA()                                                                \
3737      NET_REGISTER_DEV(gnd, GND)
3838
39// ----------------------------------------------------------------------------------------
39#define DUMMY_INPUT(_name)                                                     \
40        NET_REGISTER_DEV(dummy_input, _name)
41
42// -----------------------------------------------------------------------------
4043// mainclock
41// ----------------------------------------------------------------------------------------
44// -----------------------------------------------------------------------------
4245
4346NETLIB_DEVICE_WITH_PARAMS(mainclock,
4447public:
r31136r31137
5053   ATTR_HOT inline static void mc_update(netlist_logic_net_t &net);
5154);
5255
53// ----------------------------------------------------------------------------------------
56// -----------------------------------------------------------------------------
5457// clock
55// ----------------------------------------------------------------------------------------
58// -----------------------------------------------------------------------------
5659
5760NETLIB_DEVICE_WITH_PARAMS(clock,
5861   netlist_ttl_input_t m_feedback;
r31136r31137
6366);
6467
6568
66// ----------------------------------------------------------------------------------------
69// -----------------------------------------------------------------------------
6770// Special support devices ...
68// ----------------------------------------------------------------------------------------
71// -----------------------------------------------------------------------------
6972
7073NETLIB_DEVICE_WITH_PARAMS(ttl_input,
7174   netlist_ttl_output_t m_Q;
r31136r31137
7982   netlist_param_double_t m_IN;
8083);
8184
82// ----------------------------------------------------------------------------------------
85// -----------------------------------------------------------------------------
8386// nld_gnd
84// ----------------------------------------------------------------------------------------
87// -----------------------------------------------------------------------------
8588
86class nld_gnd : public netlist_device_t
89class NETLIB_NAME(gnd) : public netlist_device_t
8790{
8891public:
89   ATTR_COLD nld_gnd()
92   ATTR_COLD NETLIB_NAME(gnd)()
9093         : netlist_device_t(GND) { }
9194
92   ATTR_COLD virtual ~nld_gnd() {}
95   ATTR_COLD virtual ~NETLIB_NAME(gnd)() {}
9396
9497protected:
9598
r31136r31137
112115
113116};
114117
118// -----------------------------------------------------------------------------
119// nld_dummy_input
120// -----------------------------------------------------------------------------
115121
116// ----------------------------------------------------------------------------------------
122class NETLIB_NAME(dummy_input) : public netlist_device_t
123{
124public:
125    ATTR_COLD NETLIB_NAME(dummy_input)()
126            : netlist_device_t(DUMMY) { }
127
128    ATTR_COLD virtual ~NETLIB_NAME(dummy_input)() {}
129
130protected:
131
132    ATTR_COLD void start()
133    {
134        register_input("I", m_I);
135    }
136
137    ATTR_COLD void reset()
138    {
139    }
140
141    ATTR_HOT ATTR_ALIGN void update()
142    {
143    }
144
145private:
146    netlist_analog_input_t m_I;
147
148};
149
150
151// -----------------------------------------------------------------------------
117152// netdev_a_to_d
118// ----------------------------------------------------------------------------------------
153// -----------------------------------------------------------------------------
119154
120155class nld_a_to_d_proxy : public netlist_device_t
121156{
r31136r31137
155190
156191};
157192
158// ----------------------------------------------------------------------------------------
193// -----------------------------------------------------------------------------
159194// nld_base_d_to_a_proxy
160// ----------------------------------------------------------------------------------------
195// -----------------------------------------------------------------------------
161196
162197class nld_base_d_to_a_proxy : public netlist_device_t
163198{
trunk/src/emu/netlist/devices/nld_74ls629.c
r31136r31137
103103NETLIB_UPDATE(SN74LS629)
104104{
105105   {
106      // recompute
106       // recompute
107107      double  freq;
108108      double  v_freq_2, v_freq_3, v_freq_4;
109109      double  v_freq = INPANALOG(m_FC);
r31136r31137
124124      /* scale due to input resistance */
125125
126126      /* Polyfunctional3D_model created by zunzun.com using sum of squared absolute error */
127
127128      v_freq_2 = v_freq * v_freq;
128129      v_freq_3 = v_freq_2 * v_freq;
129130      v_freq_4 = v_freq_3 * v_freq;
trunk/src/emu/netlist/netlist.mak
r31136r31137
3333   $(NETLISTOBJ)/analog/nld_solver.o \
3434   $(NETLISTOBJ)/analog/nld_switches.o \
3535   $(NETLISTOBJ)/analog/nld_twoterm.o \
36   $(NETLISTOBJ)/analog/nld_opamps.o \
3637   $(NETLISTOBJ)/devices/nld_4020.o \
3738   $(NETLISTOBJ)/devices/nld_4066.o \
3839   $(NETLISTOBJ)/devices/nld_7400.o \
r31136r31137
6061   $(NETLISTOBJ)/devices/nld_74ls629.o \
6162   $(NETLISTOBJ)/devices/nld_9316.o \
6263   $(NETLISTOBJ)/devices/nld_ne555.o \
64   $(NETLISTOBJ)/devices/nld_r2r_dac.o \
6365   $(NETLISTOBJ)/devices/nld_legacy.o \
6466   $(NETLISTOBJ)/devices/net_lib.o \
6567   $(NETLISTOBJ)/devices/nld_log.o \
trunk/src/emu/netlist/nl_base.h
r31136r31137
336336      RESISTOR,   // Resistor
337337      CAPACITOR,  // Capacitor
338338      DIODE,      // Diode
339        DUMMY,      // DUMMY device without function
339340        BJT_EB,     // BJT(Ebers-Moll)
340341      BJT_SWITCH, // BJT(Switch)
341342      VCVS,       // Voltage controlled voltage source
342343      VCCS,       // Voltage controlled current source
344        CCCS,       // Current controlled current source
343345      GND,        // GND device
344346   };
345347
trunk/src/emu/netlist/analog/nld_opamps.c
r0r31137
1/*
2 * nld_opamps.c
3 *
4 */
5
6#include "nld_opamps.h"
7#include "../devices/net_lib.h"
8
9NETLIST_START(opamp_lm3900)
10
11    /*
12     *  Fast norton opamp model without bandwidth
13     */
14
15    /* Terminal definitions for calling netlists */
16
17    ALIAS(PLUS, R1.1) // Positive input
18    ALIAS(MINUS, R2.1) // Negative input
19    ALIAS(OUT, G1.OP) // Opamp output ...
20    ALIAS(VM, G1.ON)  // V- terminal
21    ALIAS(VP, DUMMY.I)  // V+ terminal
22
23    DUMMY_INPUT(DUMMY)
24
25    /* The opamp model */
26
27    RES(R1, 1)
28    RES(R2, 1)
29    NET_C(R1.1, G1.IP)
30    NET_C(R2.1, G1.IN)
31    NET_C(R1.2, R2.2, G1.ON)
32    VCVS(G1)
33    PARAM(G1.G, 10000000)
34    //PARAM(G1.RI, 100)
35    PARAM(G1.RO, RES_K(8))
36
37NETLIST_END()
38
Property changes on: trunk/src/emu/netlist/analog/nld_opamps.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/netlist/analog/nld_twoterm.c
r31136r31137
4646   m_N.m_otherterm = &m_P;
4747}
4848
49ATTR_COLD NETLIB_NAME(twoterm)::NETLIB_NAME(twoterm)()
50        : netlist_device_t(TWOTERM)
51{
52    m_P.m_otherterm = &m_N;
53    m_N.m_otherterm = &m_P;
54}
55
4956NETLIB_START(twoterm)
5057{
5158}
trunk/src/emu/netlist/analog/nld_fourterm.c
r31136r31137
1313
1414NETLIB_START(VCCS)
1515{
16   register_param("G", m_G, 1.0);
17   register_param("RI", m_RI, 1.0 / netlist().gmin());
16    start_internal(1.0 / netlist().gmin());
17   m_gfac = 1.0;
18}
1819
19   register_terminal("IP", m_IP);
20   register_terminal("IN", m_IN);
21   register_terminal("OP", m_OP);
22   register_terminal("ON", m_ON);
20void NETLIB_NAME(VCCS)::start_internal(const double def_RI)
21{
22    register_param("G", m_G, 1.0);
23    register_param("RI", m_RI, def_RI);
2324
24   register_terminal("_OP1", m_OP1);
25   register_terminal("_ON1", m_ON1);
25    register_terminal("IP", m_IP);
26    register_terminal("IN", m_IN);
27    register_terminal("OP", m_OP);
28    register_terminal("ON", m_ON);
2629
27   m_IP.m_otherterm = &m_IN; // <= this should be NULL and terminal be filtered out prior to solving...
28   m_IN.m_otherterm = &m_IP; // <= this should be NULL and terminal be filtered out prior to solving...
30    register_terminal("_OP1", m_OP1);
31    register_terminal("_ON1", m_ON1);
2932
30   m_OP.m_otherterm = &m_IP;
31   m_OP1.m_otherterm = &m_IN;
33    m_IP.m_otherterm = &m_IN; // <= this should be NULL and terminal be filtered out prior to solving...
34    m_IN.m_otherterm = &m_IP; // <= this should be NULL and terminal be filtered out prior to solving...
3235
33   m_ON.m_otherterm = &m_IP;
34   m_ON1.m_otherterm = &m_IN;
36    m_OP.m_otherterm = &m_IP;
37    m_OP1.m_otherterm = &m_IN;
3538
36   connect(m_OP, m_OP1);
37   connect(m_ON, m_ON1);
39    m_ON.m_otherterm = &m_IP;
40    m_ON1.m_otherterm = &m_IN;
3841
39   m_gfac = 1.0;
42    connect(m_OP, m_OP1);
43    connect(m_ON, m_ON1);
4044}
4145
4246NETLIB_RESET(VCCS)
r31136r31137
7377}
7478
7579// ----------------------------------------------------------------------------------------
80// nld_CCCS
81// ----------------------------------------------------------------------------------------
82
83NETLIB_START(CCCS)
84{
85    start_internal(1.0);
86    m_gfac = 1.0 / m_RI.Value();
87}
88
89NETLIB_RESET(CCCS)
90{
91    NETLIB_NAME(VCCS)::reset();
92}
93
94NETLIB_UPDATE_PARAM(CCCS)
95{
96    NETLIB_NAME(VCCS)::update_param();
97}
98
99NETLIB_UPDATE(CCCS)
100{
101    NETLIB_NAME(VCCS)::update();
102}
103
104// ----------------------------------------------------------------------------------------
76105// nld_VCVS
77106// ----------------------------------------------------------------------------------------
78107
trunk/src/emu/netlist/analog/nld_opamps.h
r0r31137
1// license:GPL-2.0+
2// copyright-holders:Couriersud
3/*
4 * nld_opamps.h
5 *
6 */
7
8#pragma once
9
10#ifndef NLD_OPAMPS_H_
11#define NLD_OPAMPS_H_
12
13#include "../nl_base.h"
14#include "../nl_setup.h"
15#include "nld_twoterm.h"
16
17// ----------------------------------------------------------------------------------------
18// Macros
19// ----------------------------------------------------------------------------------------
20
21#define LM3900(_name)                                                          \
22    SUBMODEL(_name, opamp_lm3900)
23
24// ----------------------------------------------------------------------------------------
25// Devices ...
26// ----------------------------------------------------------------------------------------
27
28NETLIST_EXTERNAL(opamp_lm3900);
29
30
31
32#endif /* NLD_OPAMPS_H_ */
Property changes on: trunk/src/emu/netlist/analog/nld_opamps.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/netlist/analog/nld_twoterm.h
r31136r31137
8888{
8989public:
9090   ATTR_COLD NETLIB_NAME(twoterm)(const family_t afamily);
91    ATTR_COLD NETLIB_NAME(twoterm)();
9192
9293   netlist_terminal_t m_P;
9394   netlist_terminal_t m_N;
trunk/src/emu/netlist/analog/nld_fourterm.h
r31136r31137
1717#define VCCS(_name)                                                                \
1818      NET_REGISTER_DEV(VCCS, _name)
1919
20#define CCCS(_name)                                                                \
21        NET_REGISTER_DEV(CCCS, _name)
22
2023#define VCVS(_name)                                                                \
2124      NET_REGISTER_DEV(VCVS, _name)
2225
23// ----------------------------------------------------------------------------------------
24// nld_CCCS
25// ----------------------------------------------------------------------------------------
2626
27/*
28 *   Current controlled current source
29 *
30 *   IP ---+           +------> OP
31 *         |           |
32 *         RI          I
33 *         RI => G =>  I    IOut = (V(IP)-V(IN)) / RI  * G
34 *         RI          I
35 *         |           |
36 *   IN ---+           +------< ON
37 *
38 *   G=1 ==> 1A ==> 1A
39 *
40 *   RI = 1
41 *
42 *   FIXME: This needs extremely high levels of accuracy to work
43 *          With the current default of 1mv we can only measure
44 *          currents of 1mA. Therefore not yet implemented.
45 *
46 */
47
48
4927// ----------------------------------------------------------------------------------------
5028// nld_VCCS
5129// ----------------------------------------------------------------------------------------
r31136r31137
8159   ATTR_COLD virtual void update_param();
8260   ATTR_HOT ATTR_ALIGN void update();
8361
62   ATTR_COLD void start_internal(const double def_RI);
63
8464   netlist_terminal_t m_OP;
8565   netlist_terminal_t m_ON;
8666
r31136r31137
9777};
9878
9979// ----------------------------------------------------------------------------------------
80// nld_CCCS
81// ----------------------------------------------------------------------------------------
82
83/*
84 *   Current controlled current source
85 *
86 *   IP ---+           +------> OP
87 *         |           |
88 *         RI          I
89 *         RI => G =>  I    IOut = (V(IP)-V(IN)) / RI  * G
90 *         RI          I
91 *         |           |
92 *   IN ---+           +------< ON
93 *
94 *   G=1 ==> 1A ==> 1A
95 *
96 *   RI = 1
97 *
98 *   FIXME: This needs extremely high levels of accuracy to work
99 *          With the current default of 1mv we can only measure
100 *          currents of 1mA.
101 *
102 */
103
104class NETLIB_NAME(CCCS) : public NETLIB_NAME(VCCS)
105{
106public:
107    ATTR_COLD NETLIB_NAME(CCCS)()
108    : NETLIB_NAME(VCCS)(CCCS), m_gfac(1.0) {  }
109    //ATTR_COLD NETLIB_NAME(CCCS)(const family_t afamily)
110    //: netlist_device_t(afamily), m_gfac(1.0) {  }
111
112protected:
113    ATTR_COLD virtual void start();
114    ATTR_COLD virtual void reset();
115    ATTR_COLD virtual void update_param();
116    ATTR_HOT ATTR_ALIGN void update();
117
118    double m_gfac;
119};
120
121
122// ----------------------------------------------------------------------------------------
100123// nld_VCVS
101124// ----------------------------------------------------------------------------------------
102125
trunk/src/emu/netlist/analog/nld_ms_gauss_seidel.h
r31136r31137
144144            if (s>rmax)
145145                rmax = s;
146146        }
147        //if (fabs(rmax) > 0.01)
148        //    printf("rmin %f rmax %f\n", rmin, rmax);
149147#if 0
150148        double frobA = sqrt(frob /(iN));
151149        if (1 &&frobA < 1.0)
r31136r31137
167165            ws = 2.0 / (1.0 + sqrt(1.0-rm));
168166        else
169167            ws = 1.0;
168        if (ws > 1.02 && rmax > 1.001)
169            printf("rmin %f rmax %f ws %f\n", rmin, rmax, ws);
170170#endif
171171    }
172172

Previous 199869 Revisions Next


© 1997-2024 The MAME Team