Previous 199869 Revisions Next

r26110 Monday 11th November, 2013 at 21:52:08 UTC by Couriersud
Netlist: Added some documentation to nl_base.h. Cleared namespace - all classes now have prefix netlist_.
[src/emu/netlist]nl_base.c nl_base.h nl_config.h nl_parser.c nl_setup.c nl_setup.h
[src/emu/netlist/devices]net_lib.c net_lib.h nld_signal.h nld_system.c nld_system.h
[src/mame/drivers]pong.c

trunk/src/emu/netlist/nl_base.c
r26109r26110
2323{
2424}
2525
26ATTR_COLD void netlist_base_t::set_mainclock_dev(NETLIB_NAME(netdev_mainclock) *dev)
26ATTR_COLD void netlist_base_t::set_mainclock_dev(NETLIB_NAME(mainclock) *dev)
2727{
2828   m_mainclock = dev;
2929}
r26109r26110
9191         atime = 0;
9292      }
9393   } else {
94      net_net_t &mcQ = m_mainclock->m_Q.net();
94      netlist_net_t &mcQ = m_mainclock->m_Q.net();
9595      const netlist_time inc = m_mainclock->m_inc;
9696
9797      while (atime > 0)
r26109r26110
102102            {
103103               update_time(mcQ.time(), atime);
104104
105               NETLIB_NAME(netdev_mainclock)::mc_update(mcQ, time() + inc);
105               NETLIB_NAME(mainclock)::mc_update(mcQ, time() + inc);
106106
107107            }
108108            const queue_t::entry_t e = m_queue.pop();
r26109r26110
114114         } else {
115115            update_time(mcQ.time(), atime);
116116
117            NETLIB_NAME(netdev_mainclock)::mc_update(mcQ, time() + inc);
117            NETLIB_NAME(mainclock)::mc_update(mcQ, time() + inc);
118118         }
119119         if (FATAL_ERROR_AFTER_NS)
120120            if (time() > NLTIME_FROM_NS(FATAL_ERROR_AFTER_NS))
r26109r26110
142142// ----------------------------------------------------------------------------------------
143143
144144netlist_core_device_t::netlist_core_device_t()
145: net_object_t(DEVICE)
145: netlist_object_t(DEVICE, ALL)
146146{
147147}
148148
r26109r26110
171171// net_device_t
172172// ----------------------------------------------------------------------------------------
173173
174ATTR_HOT ATTR_ALIGN const netlist_sig_t netlist_core_device_t::INPLOGIC_PASSIVE(logic_input_t &inp)
174ATTR_HOT ATTR_ALIGN const netlist_sig_t netlist_core_device_t::INPLOGIC_PASSIVE(netlist_logic_input_t &inp)
175175{
176   if (inp.state() == net_input_t::INP_STATE_PASSIVE)
176   if (inp.state() == netlist_input_t::INP_STATE_PASSIVE)
177177   {
178178      inp.activate();
179179      const netlist_sig_t ret = inp.Q();
r26109r26110
185185
186186}
187187
188net_device_t::net_device_t()
188netlist_device_t::netlist_device_t()
189189   : netlist_core_device_t(),
190      m_inputs(20),
190      m_terminals(20),
191191      m_setup(NULL),
192192      m_variable_input_count(false)
193193{
194194}
195195
196net_device_t::~net_device_t()
196netlist_device_t::~netlist_device_t()
197197{
198198   //printf("~net_device_t\n");
199199}
200200
201ATTR_COLD void net_device_t::init(netlist_setup_t &setup, const astring &name)
201ATTR_COLD void netlist_device_t::init(netlist_setup_t &setup, const astring &name)
202202{
203203   netlist_core_device_t::init(setup, name);
204204   m_setup = &setup;
r26109r26110
206206}
207207
208208
209ATTR_COLD void net_device_t::register_sub(netlist_core_device_t &dev, const astring &name)
209ATTR_COLD void netlist_device_t::register_sub(netlist_core_device_t &dev, const astring &name)
210210{
211211   dev.init(*m_setup, name);
212212}
213213
214void net_device_t::register_output(netlist_core_device_t &dev, const astring &name, net_output_t &port)
214void netlist_device_t::register_output(netlist_core_device_t &dev, const astring &name, netlist_output_t &port)
215215{
216216   m_setup->register_output(*this, dev, name, port);
217217}
218218
219void net_device_t::register_output(const astring &name, net_output_t &port)
219void netlist_device_t::register_output(const astring &name, netlist_output_t &port)
220220{
221221   m_setup->register_output(*this,*this,name, port);
222222}
223223
224void net_device_t::register_input(netlist_core_device_t &dev, const astring &name, net_input_t &inp, net_input_t::net_input_state type)
224void netlist_device_t::register_input(netlist_core_device_t &dev, const astring &name, netlist_input_t &inp, netlist_input_t::net_input_state type)
225225{
226226   m_setup->register_input(*this, dev, name, inp, type);
227227}
228228
229void net_device_t::register_input(const astring &name, net_input_t &inp, net_input_t::net_input_state type)
229void netlist_device_t::register_input(const astring &name, netlist_input_t &inp, netlist_input_t::net_input_state type)
230230{
231231   register_input(*this, name, inp, type);
232232}
233233
234void net_device_t::register_link_internal(netlist_core_device_t &dev, net_input_t &in, net_output_t &out, net_input_t::net_input_state aState)
234void netlist_device_t::register_link_internal(netlist_core_device_t &dev, netlist_input_t &in, netlist_output_t &out, netlist_input_t::net_input_state aState)
235235{
236236    in.init_input(dev, aState);
237237    out.init_terminal(dev);
r26109r26110
239239      out.net().register_con(in);
240240}
241241
242void net_device_t::register_link_internal(net_input_t &in, net_output_t &out, net_input_t::net_input_state aState)
242void netlist_device_t::register_link_internal(netlist_input_t &in, netlist_output_t &out, netlist_input_t::net_input_state aState)
243243{
244244   register_link_internal(*this, in, out, aState);
245245}
246246
247void net_device_t::register_param(netlist_core_device_t &dev, const astring &name, net_param_t &param, double initialVal)
247void netlist_device_t::register_param(netlist_core_device_t &dev, const astring &name, netlist_param_t &param, double initialVal)
248248{
249249   param.set_netdev(dev);
250250   param.initial(initialVal);
251251   m_setup->register_param(name, &param);
252252}
253253
254void net_device_t::register_param(const astring &name, net_param_t &param, double initialVal)
254void netlist_device_t::register_param(const astring &name, netlist_param_t &param, double initialVal)
255255{
256256   register_param(*this,name, param, initialVal);
257257}
r26109r26110
260260// net_net_t
261261// ----------------------------------------------------------------------------------------
262262
263ATTR_COLD net_net_t::net_net_t(const int atype)
264    : net_object_t(atype)
265    #if USE_LINKED_LIST
263ATTR_COLD netlist_net_t::netlist_net_t(const type_t atype, const family_t afamily)
264    : netlist_object_t(atype, afamily)
266265    ,  m_head(NULL)
267    #endif
268266    , m_num_cons(0)
269267    , m_time(netlist_time::zero)
270268    , m_active(0)
271269    , m_in_queue(2)
272    , m_raildev(NULL)
270    , m_railterminal(NULL)
273271{
274272    m_cur.Q = 0;
275273    m_new.Q = 0;
276274    m_last.Q = 0;
277275};
278276
279ATTR_COLD void net_net_t::register_con(net_input_t &input)
277ATTR_COLD void netlist_net_t::register_con(netlist_terminal_t &terminal)
280278{
281    input.set_net(*this);
282#if USE_LINKED_LIST
279    terminal.set_net(*this);
283280    if (m_head == NULL)
284        m_head = &input;
281        m_head = &terminal;
285282    else
286283    {
287        input.m_next = m_head;
288        m_head = &input;
284        terminal.m_update_list_next = m_head;
285        m_head = &terminal;
289286    }
290#else
291   if (m_num_cons >= OUTPUT_MAX_CONNECTIONS)
292      fatalerror("Connections exceeded for %s\n", netdev()->name().cstr());
293
294#if 0
295    int i;
296   /* keep similar devices together */
297   for (i = 0; i < m_num_cons; i++)
298      if (m_cons[i]->netdev() == input.netdev())
299         break;
300
301   for (int j = m_num_cons; j > i; j--)
302      m_cons[j] = m_cons[j - 1];
303
304   m_cons[i] = &input;
305#else
306    m_cons[m_num_cons] = &input;
307#endif
308#endif
309287    m_num_cons++;
310    if (input.state() != net_input_t::INP_STATE_PASSIVE)
288
289    if (terminal.state() != netlist_input_t::INP_STATE_PASSIVE)
311290        m_active++;
312291}
313292
314ATTR_HOT inline void net_net_t::update_dev(const net_input_t *inp, const UINT32 mask)
293ATTR_HOT inline void netlist_net_t::update_dev(const netlist_terminal_t *inp, const UINT32 mask)
315294{
316295   if ((inp->state() & mask) != 0)
317296   {
318      ATTR_UNUSED netlist_core_device_t *netdev = inp->netdev();
319      begin_timing(netdev->total_time);
320      inc_stat(netdev->stat_count);
321      netdev->update_dev();
322      end_timing(netdev()->total_time);
297      netlist_core_device_t &netdev = inp->netdev();
298      begin_timing(netdev.total_time);
299      inc_stat(netdev.stat_count);
300      netdev.update_dev();
301      end_timing(netdev().total_time);
323302   }
324303}
325304
326ATTR_HOT inline void net_net_t::update_devs()
305ATTR_HOT inline void netlist_net_t::update_devs()
327306{
328307   assert(m_num_cons != 0);
329308
r26109r26110
333312
334313   const UINT32 mask = masks[ (m_last.Q  << 1) | m_cur.Q ];
335314
336#if USE_LINKED_LIST
337    net_input_t *p = m_head;
315    netlist_terminal_t *p = m_head;
338316    switch (m_num_cons)
339317    {
340318    case 2:
341319        update_dev(p, mask);
342        p = p->m_next;
320        p = p->m_update_list_next;
343321    case 1:
344322        update_dev(p, mask);
345323        break;
r26109r26110
347325        do
348326        {
349327            update_dev(p, mask);
350            p = p->m_next;
328            p = p->m_update_list_next;
351329        } while (p != NULL);
352330        break;
353331    }
354
355#else
356   switch (m_num_cons)
357   {
358   case 2:
359      update_dev(m_cons[1], mask);
360   case 1:
361      update_dev(m_cons[0], mask);
362      break;
363   default:
364      {
365         for (int i=0; i < m_num_cons; i++)
366            update_dev(m_cons[i], mask);
367      }
368      break;
369   }
370#endif
371332   m_last = m_cur;
372333}
373334
374335// ----------------------------------------------------------------------------------------
375// net_terminal_t
336// netlist_terminal_t
376337// ----------------------------------------------------------------------------------------
377338
378ATTR_COLD void net_terminal_t::init_terminal(netlist_core_device_t &dev)
339ATTR_COLD void netlist_terminal_t::init_terminal(netlist_core_device_t &dev)
379340{
380341   m_netdev = &dev;
381   init_object(*dev.netlist());
342   init_object(dev.netlist());
382343}
383344
384345// ----------------------------------------------------------------------------------------
385346// net_input_t
386347// ----------------------------------------------------------------------------------------
387348
388ATTR_COLD void net_input_t::init_input(netlist_core_device_t &dev, net_input_state astate)
349ATTR_COLD void netlist_input_t::init_input(netlist_core_device_t &dev, net_input_state astate)
389350{
390351   init_terminal(dev);
391   m_state = astate;
352   set_state(astate);
392353}
393354
394355// ----------------------------------------------------------------------------------------
395356// net_output_t
396357// ----------------------------------------------------------------------------------------
397358
398net_output_t::net_output_t(int atype)
399   : net_terminal_t(atype)
359netlist_output_t::netlist_output_t(const type_t atype, const family_t afamily)
360   : netlist_terminal_t(atype, afamily)
400361   , m_low_V(0.0)
401362   , m_high_V(0.0)
402    , m_my_net(NET_DIGITAL)
363    , m_my_net(NET, afamily)
403364{
404365    //m_net = new net_net_t(NET_DIGITAL);
405366    this->set_net(m_my_net);
406367}
407368
408ATTR_COLD void net_output_t::init_terminal(netlist_core_device_t &dev)
369ATTR_COLD void netlist_output_t::init_terminal(netlist_core_device_t &dev)
409370{
410    net_terminal_t::init_terminal(dev);
411    net().init_object(*dev.netlist());
412    net().register_raildev(dev);
371    netlist_terminal_t::init_terminal(dev);
372    net().init_object(dev.netlist());
373    net().register_railterminal(*this);
413374}
414375
415ATTR_COLD void logic_output_t::initial(const netlist_sig_t val)
376ATTR_COLD void netlist_logic_output_t::initial(const netlist_sig_t val)
416377{
417378    net().m_cur.Q = val;
418379    net().m_new.Q = val;
419380    net().m_last.Q = !val;
420381}
421382
422ATTR_COLD logic_output_t::logic_output_t()
423    : net_output_t(OUTPUT | SIGNAL_DIGITAL)
383ATTR_COLD netlist_logic_output_t::netlist_logic_output_t()
384    : netlist_output_t(OUTPUT, LOGIC)
424385{
425386    // Default to TTL
426387    m_low_V = 0.1;  // these depend on sinked/sourced current. Values should be suitable for typical applications.
427388    m_high_V = 4.8;
428389}
429390
430ATTR_COLD void logic_output_t::set_levels(const double low, const double high)
391ATTR_COLD void netlist_logic_output_t::set_levels(const double low, const double high)
431392{
432393    m_low_V = low;
433394    m_high_V = high;
r26109r26110
435396
436397
437398// ----------------------------------------------------------------------------------------
438// netdev_mainclock
399// mainclock
439400// ----------------------------------------------------------------------------------------
440401
441ATTR_HOT inline void NETLIB_NAME(netdev_mainclock)::mc_update(net_net_t &net, const netlist_time curtime)
402ATTR_HOT inline void NETLIB_NAME(mainclock)::mc_update(netlist_net_t &net, const netlist_time curtime)
442403{
443404   net.m_new.Q = !net.m_new.Q;
444405   net.set_time(curtime);
445406   net.update_devs();
446407}
447408
448ATTR_COLD NETLIB_START(netdev_mainclock)
409ATTR_COLD NETLIB_START(mainclock)
449410{
450411   register_output("Q", m_Q);
451412
r26109r26110
454415
455416}
456417
457ATTR_HOT NETLIB_UPDATE_PARAM(netdev_mainclock)
418ATTR_HOT NETLIB_UPDATE_PARAM(mainclock)
458419{
459420   m_inc = netlist_time::from_hz(m_freq.Value()*2);
460421}
461422
462ATTR_HOT NETLIB_UPDATE(netdev_mainclock)
423ATTR_HOT NETLIB_UPDATE(mainclock)
463424{
464    net_net_t &net = m_Q.net();
425    netlist_net_t &net = m_Q.net();
465426   // this is only called during setup ...
466427   net.m_new.Q = !net.m_new.Q;
467   net.set_time(netlist()->time() + m_inc);
428   net.set_time(netlist().time() + m_inc);
468429}
trunk/src/emu/netlist/nl_config.h
r26109r26110
1616//  SETUP
1717//============================================================
1818
19#define USE_LINKED_LIST         (1)
20
2119#define USE_DELEGATES           (0)
2220/*
2321 * The next options needs -Wno-pmf-conversions to compile and gcc
r26109r26110
2927// Next if enabled adds 20% performance ... but is not guaranteed to be absolutely timing correct.
3028#define USE_DEACTIVE_DEVICE     (0)
3129
32#define OUTPUT_MAX_CONNECTIONS  (48)
33
3430// Use nano-second resolution - Sufficient for now
3531#define NETLIST_INTERNAL_RES        (U64(1000000000))
3632#define NETLIST_DIV_BITS            (0)
trunk/src/emu/netlist/nl_parser.c
r26109r26110
6060void netlist_parser::netdev_const(const astring &dev_name)
6161{
6262   astring name;
63   net_device_t *dev;
63   netlist_device_t *dev;
6464   astring paramfq;
6565   double val;
6666
r26109r26110
8080void netlist_parser::netdev_device(const astring &dev_type)
8181{
8282   astring devname;
83   net_device_t *dev;
83   netlist_device_t *dev;
8484   int cnt;
8585
8686   skipws();
r26109r26110
9696      skipws();
9797      astring output_name = getname2(',', ')');
9898      NL_VERBOSE_OUT(("Parser: ID: %s %s\n", output_name.cstr(), dev->m_inputs.item(cnt)->cstr()));
99      m_setup.register_link(*dev->m_inputs.item(cnt), output_name);
99      m_setup.register_link(*dev->m_terminals.item(cnt), output_name);
100100      skipws();
101101      cnt++;
102102   }
103   if (cnt != dev->m_inputs.count() && !dev->variable_input_count())
104      fatalerror("netlist: input count mismatch for %s - expected %d found %d\n", devname.cstr(), dev->m_inputs.count(), cnt);
103   if (cnt != dev->m_terminals.count() && !dev->variable_input_count())
104      fatalerror("netlist: input count mismatch for %s - expected %d found %d\n", devname.cstr(), dev->m_terminals.count(), cnt);
105105   if (dev->variable_input_count())
106106   {
107107      NL_VERBOSE_OUT(("variable inputs %s: %d\n", dev->name().cstr(), cnt));
trunk/src/emu/netlist/nl_base.h
r26109r26110
33/*
44 * nlbase.h
55 *
6 *  A mixed signal circuit simulation
7 *
8 *  D: Device
9 *  O: Rail output (output)
10 *  I: Infinite impedance input (input)
11 *  T: Terminal (finite impedance)
12 *
13 *  +---+     +---+     +---+     +---+     +---+
14 *  |   |     |   |     |   |     |   |     |   |
15 *  | D |     | D |     | D |     | D |     | D |
16 *  |   |     |   |     |   |     |   |     |   |
17 *  +-O-+     +-I-+     +-I-+     +-T-+     +-T-+
18 *    |         |         |         |         |
19 *  +-+---------+---------+---------+---------+-+
20 *  | rail net                                  |
21 *  +-------------------------------------------+
22 *
23 *  A rail net is a net which is driven by exactly one output with an (idealized) internal resistance
24 *  of zero. Ideally, it can deliver infinite current.
25 *
26 *  A infinite resistance input does not source or sink current.
27 *
28 *  Terminals source or sink finite (but never zero) current.
29 *
30 *  The system differentiates between analog and logic input and outputs and analog terminals.
31 *  Analog and logic devices can not be connected to the same net. Instead, proxy devices
32 *  are inserted automatically:
33 *
34 *  +---+     +---+
35 *  |   |     |   |
36 *  | D1|     | D2|
37 *  | A |     | L |
38 *  +-O-+     +-I-+
39 *    |         |
40 *  +-+---------+---+
41 *  | rail net      |
42 *  +---------------+
43 *
44 *  is converted into
45 *              +----------+
46 *              |          |
47 *  +---+     +-+-+        |   +---+
48 *  |   |     | L |  A-L   |   |   |
49 *  | D1|     | D | Proxy  |   | D2|
50 *  | A |     | A |        |   |   |
51 *  +-O-+     +-I-+        |   +-I-+
52 *    |         |          |     |
53 *  +-+---------+--+     +-+-----+-------+
54 *  | rail net (A) |     | rail net (L)  |
55 *  +--------------|     +---------------+
56 *
57 *  This works both analog to logic as well as logic to analog.
58 *
59 *  The above is an advanced implementation of the existing discrete
60 *  subsystem in MAME. Instead of relying on a fixed time-step, analog devices could
61 *  either connect to fixed time-step clock or use an internal clock to update them.
62 *  This would however introduce macro devices for RC, diodes and transistors again.
63 *
64 *  ====================================================================================
65 *  FIXME: Terminals are not yet implemented.
66 *
67 *  Instead, the following approach in case of a pure terminal/input network is taken:
68 *
69 *  +---+     +---+     +---+     +---+     +---+
70 *  |   |     |   |     |   |     |   |     |   |
71 *  | D |     | D |     | D |     | D |     | D |
72 *  |   |     |   |     |   |     |   |     |   |
73 *  +-T-+     +-I-+     +-I-+     +-T-+     +-T-+
74 *    |         |         |         |         |
75 *   '+'        |         |        '-'       '-'
76 *  +-+---------+---------+---------+---------+-+
77 *  | Calculated net                            |
78 *  +-------------------------------------------+
79 *
80 *  SPICE uses the following basic two terminal device:
81 *
82 *       (k)
83 *  +-----T-----+
84 *  |     |     |
85 *  |  +--+--+  |
86 *  |  |     |  |
87 *  |  R     |  |
88 *  |  R     |  |
89 *  |  R     I  |
90 *  |  |     I  |  Device n
91 *  |  V+    I  |
92 *  |  V     |  |
93 *  |  V-    |  |
94 *  |  |     |  |
95 *  |  +--+--+  |
96 *  |     |     |
97 *  +-----T-----+
98 *       (l)
99 *
100 *  This is a resistance in series to a voltage source and paralleled by a current source.
101 *  This is suitable to model voltage sources, current sources, resistors, capacitors,
102 *  inductances and diodes.
103 *
104 *  I(n,l) = - I(n,k) = ( V(k) - V - V(l) ) * (1/R(n)) + I(n)
105 *
106 *  Now, the sum of all currents for a given net must be 0:
107 *
108 *  Sum(n,I(n,l)) = 0 = sum(n, ( V(k) - V(n) - V(l) ) * (1/R(n)) + I(n) )
109 *
110 *  With G(n) = 1 / R(n) and sum(n, G(n)) = Gtot and k=k(n)
111 *
112 *  0 = - V(l) * Gtot + sum(n, (V(k(n)) - V(n)) * G(n) + I(n))
113 *
114 *  and with l=l(n) and fixed k
115 *
116 *  0 =  -V(k) * Gtot + sum(n, ( V(l(n) + V(n) ) * G(n) - I(n))
117 *
118 *  These equations represent a linear Matrix equation (with more math).
119 *
120 *  In the context of this exercise, in a first step, we will not solve it. Instead,
121 *  we calculate the net voltage V(l) by using a mirror of the above device on each terminal.
122 *
123 *  Each terminal thus has three properties:
124 *
125 *  a) Resistance
126 *  b) Voltage source
127 *  c) Current source/sink
128 *
129 *  Going forward, approach can be extended to use a linear equation solver.
130 *
131 *  The formal representation of the circuit will stay the same, thus scales.
132 *
6133 */
7134
8135#ifndef NLBASE_H_
r26109r26110
44171#define NETLIB_FUNC_VOID(_chip, _name, _params) ATTR_HOT ATTR_ALIGN inline void NETLIB_NAME(_chip) :: _name _params
45172
46173#define NETLIB_DEVICE(_name, _priv)                                                 \
47   class NETLIB_NAME(_name) : public net_device_t                                  \
174   class NETLIB_NAME(_name) : public netlist_device_t                              \
48175   {                                                                               \
49176   public:                                                                         \
50177      NETLIB_NAME(_name) ()                                                       \
51      : net_device_t()    { }                                                     \
178      : netlist_device_t()    { }                                                 \
52179   protected:                                                                      \
53180      ATTR_HOT void update();                                                     \
54181      ATTR_HOT void start();                                                      \
r26109r26110
68195   }
69196
70197#define NETLIB_DEVICE_WITH_PARAMS(_name, _priv)                                     \
71   class NETLIB_NAME(_name) : public net_device_t                                  \
198   class NETLIB_NAME(_name) : public netlist_device_t                              \
72199   {                                                                               \
73200   public:                                                                         \
74201      NETLIB_NAME(_name) ()                                                       \
75      : net_device_t() { }                                                        \
202      : netlist_device_t() { }                                                    \
76203      ATTR_HOT void update_param();                                               \
77204      ATTR_HOT void update();                                                     \
78205      ATTR_HOT void start();                                                      \
r26109r26110
84211// forward definitions
85212// ----------------------------------------------------------------------------------------
86213
87class net_net_t;
88class net_output_t;
89class net_param_t;
214class netlist_net_t;
215class netlist_output_t;
216class netlist_param_t;
90217class netlist_setup_t;
91218class netlist_base_t;
92219
r26109r26110
95222// net_object_t
96223// ----------------------------------------------------------------------------------------
97224
98class net_object_t
225class netlist_object_t
99226{
100227public:
101228   enum type_t {
102      INPUT = 0,
103      OUTPUT = 1,
104      DEVICE = 2,
105      PARAM = 3,
106      TERMINAL = 4,
107      NET_ANALOG = 5,
108      NET_DIGITAL = 6,
109      TYPE_MASK = 0x0f,
110      SIGNAL_DIGITAL = 0x00,
111      SIGNAL_ANALOG =  0x10,
112      SIGNAL_MASK =    0x10,
229        TERMINAL = 0,
230      INPUT    = 1,
231      OUTPUT   = 2,
232      DEVICE   = 3,
233      PARAM    = 4,
234      NET      = 5
113235   };
236    enum family_t {
237        LOGIC    = 1,
238        ANALOG   = 2,
239        CURRENT  = 3,
240        ALL      = 4   // <== devices usually fall into this category
241    };
114242
115   net_object_t(const int atype)
116      : m_objtype(atype) {}
243   ATTR_COLD netlist_object_t(const type_t atype, const family_t afamily)
244      : m_objtype(atype)
245        , m_family(afamily)
246        , m_netlist(NULL)
247        {}
117248
118   virtual ~net_object_t() {}
249   virtual ~netlist_object_t() {}
119250
120251    ATTR_COLD void init_object(netlist_base_t &nl)
121252    {
122253        m_netlist = &nl;
123254    }
124255
125   ATTR_HOT inline int object_type() const { return m_objtype; }
126   ATTR_HOT inline int object_type(const UINT32 mask) const { return m_objtype & mask; }
256   ATTR_HOT inline const type_t object_type() const { return m_objtype; }
257    ATTR_HOT inline const family_t family() const { return m_family; }
127258
128    ATTR_HOT inline netlist_base_t * RESTRICT netlist() { return m_netlist; }
129    ATTR_HOT inline const netlist_base_t * RESTRICT netlist() const { return m_netlist; }
259   ATTR_HOT inline const bool isType(const type_t atype) const { return (m_objtype == atype); }
260    ATTR_HOT inline const bool isFamily(const family_t afamily) const { return (m_family == afamily); }
130261
262    ATTR_HOT inline netlist_base_t & RESTRICT netlist() { return *m_netlist; }
263    ATTR_HOT inline const netlist_base_t & RESTRICT netlist() const { return *m_netlist; }
264
131265private:
132   const int m_objtype;
266   const type_t m_objtype;
267    const family_t m_family;
133268    netlist_base_t * RESTRICT m_netlist;
134269};
135270
r26109r26110
137272// net_terminal_t
138273// ----------------------------------------------------------------------------------------
139274
140class net_terminal_t : public net_object_t
275class netlist_terminal_t : public netlist_object_t
141276{
142277public:
143278
144   net_terminal_t(const int atype)
145   : net_object_t(atype)
279    /* needed here ... */
280
281    enum net_input_state {
282        INP_STATE_PASSIVE = 0,
283        INP_STATE_ACTIVE = 1,
284        INP_STATE_HL = 2,
285        INP_STATE_LH = 4,
286    };
287
288   ATTR_COLD netlist_terminal_t(const type_t atype, const family_t afamily)
289   : netlist_object_t(atype, afamily)
290    , m_update_list_next(NULL)
146291   , m_netdev(NULL)
147292    , m_net(NULL)
293    , m_state(INP_STATE_ACTIVE)
148294   {}
149295
150296   ATTR_COLD virtual void init_terminal(netlist_core_device_t &dev);
151297
152    ATTR_COLD void set_net(net_net_t &anet)   { m_net = &anet; }
298    ATTR_COLD void set_net(netlist_net_t &anet)   { m_net = &anet; }
153299
154    ATTR_HOT inline const net_net_t & RESTRICT net() const { return *m_net;}
155    ATTR_HOT inline net_net_t & RESTRICT net() { return *m_net;}
300    ATTR_HOT inline const netlist_net_t & RESTRICT net() const { return *m_net;}
301    ATTR_HOT inline netlist_net_t & RESTRICT net() { return *m_net;}
156302
157    ATTR_HOT inline netlist_core_device_t * RESTRICT netdev() const { return m_netdev; }
303    ATTR_HOT inline const bool is_state(const net_input_state astate) const { return (m_state == astate); }
304    ATTR_HOT inline const net_input_state state() const { return m_state; }
305    ATTR_HOT inline void set_state(const net_input_state astate) { m_state = astate; }
158306
307    ATTR_HOT inline netlist_core_device_t & RESTRICT netdev() const { return *m_netdev; }
308
309    netlist_terminal_t *m_update_list_next;
310
159311private:
160312   netlist_core_device_t * RESTRICT m_netdev;
161    net_net_t * RESTRICT m_net;
313    netlist_net_t * RESTRICT m_net;
314    net_input_state m_state;
162315};
163316
164317
165318// ----------------------------------------------------------------------------------------
166// net_input_t
319// netlist_input_t
167320// ----------------------------------------------------------------------------------------
168321
169class net_input_t : public net_terminal_t
322class netlist_input_t : public netlist_terminal_t
170323{
171324public:
172325
173   enum net_input_state {
174      INP_STATE_PASSIVE = 0,
175      INP_STATE_ACTIVE = 1,
176      INP_STATE_HL = 2,
177      INP_STATE_LH = 4,
178   };
179326
180   ATTR_COLD net_input_t(const int atype)
181      : net_terminal_t(atype)
327   ATTR_COLD netlist_input_t(const type_t atype, const family_t afamily)
328      : netlist_terminal_t(atype, afamily)
182329        , m_low_thresh_V(0)
183330        , m_high_thresh_V(0)
184#if USE_LINKED_LIST
185       , m_next(NULL)
186#endif
187      , m_state(INP_STATE_ACTIVE)
188331   {}
189332
190333   ATTR_COLD void init_input(netlist_core_device_t &dev, net_input_state astate = INP_STATE_ACTIVE);
191334
192   ATTR_HOT inline const bool is_state(const net_input_state astate) const { return (m_state == astate); }
193   ATTR_HOT inline const net_input_state state() const { return m_state; }
194
195335   ATTR_HOT inline void inactivate();
196336   ATTR_HOT inline void activate();
197337   ATTR_HOT inline void activate_hl();
r26109r26110
200340   double m_low_thresh_V;
201341   double m_high_thresh_V;
202342
203#if USE_LINKED_LIST
204   net_input_t *m_next;
205#endif
206
207343private:
208   net_input_state m_state;
209344};
210345
211346// ----------------------------------------------------------------------------------------
212// logic_input_t
347// netlist_logic_input_t
213348// ----------------------------------------------------------------------------------------
214349
215class logic_input_t : public net_input_t
350class netlist_logic_input_t : public netlist_input_t
216351{
217352public:
218   logic_input_t()
219      : net_input_t(INPUT | SIGNAL_DIGITAL)
353   netlist_logic_input_t()
354      : netlist_input_t(INPUT, LOGIC)
220355   {
221356      // default to TTL
222357      m_low_thresh_V = 0.8;
r26109r26110
234369};
235370
236371// ----------------------------------------------------------------------------------------
237// ttl_input_t
372// netlist_ttl_input_t
238373// ----------------------------------------------------------------------------------------
239374
240class ttl_input_t : public logic_input_t
375class netlist_ttl_input_t : public netlist_logic_input_t
241376{
242377public:
243   ttl_input_t()
244      : logic_input_t() { set_thresholds(0.8 , 2.0); }
378   netlist_ttl_input_t()
379      : netlist_logic_input_t() { set_thresholds(0.8 , 2.0); }
245380};
246381
247class analog_input_t : public net_input_t
382// ----------------------------------------------------------------------------------------
383// netlist_analog_input_t
384// ----------------------------------------------------------------------------------------
385
386class netlist_analog_input_t : public netlist_input_t
248387{
249388public:
250   analog_input_t()
251      : net_input_t(INPUT | SIGNAL_ANALOG) { }
389   netlist_analog_input_t()
390      : netlist_input_t(INPUT, ANALOG) { }
252391
253392   ATTR_HOT inline const bool is_highz() const;
254393   ATTR_HOT inline const double Q_Analog() const;
r26109r26110
260399// net_net_t
261400// ----------------------------------------------------------------------------------------
262401
263class net_net_t : public net_object_t
402class netlist_net_t : public netlist_object_t
264403{
265404public:
266405
267    friend class NETLIB_NAME(netdev_mainclock);
268    friend class net_output_t;
269    friend class net_input_t;
270    friend class logic_output_t;
271    friend class analog_output_t;
272    friend class logic_input_t;
273    friend class analog_input_t;
406    friend class NETLIB_NAME(mainclock);
407    friend class netlist_output_t;
408    friend class netlist_input_t;
409    friend class netlist_logic_output_t;
410    friend class netlist_analog_output_t;
411    friend class netlist_logic_input_t;
412    friend class netlist_analog_input_t;
274413
275414    // FIXME: union does not work
276415    typedef struct
r26109r26110
279418        double        Analog;
280419    } hybrid_t;
281420
282    ATTR_COLD net_net_t(const int atype);
421    ATTR_COLD netlist_net_t(const type_t atype, const family_t afamily);
283422
284    ATTR_COLD void register_con(net_input_t &inp);
285    ATTR_COLD void register_raildev(netlist_core_device_t &mr)
423    ATTR_COLD void register_con(netlist_terminal_t &terminal);
424    ATTR_COLD void register_railterminal(netlist_terminal_t &mr)
286425    {
287        assert(m_raildev == NULL);
288        m_raildev = &mr;
426        assert(m_railterminal == NULL);
427        m_railterminal = &mr;
289428    }
290429
291    ATTR_HOT inline bool isRailNet() { return m_raildev == NULL; }
292
293430    /* inline not always works out */
294    ATTR_HOT /*inline*/ void update_devs();
431    ATTR_HOT inline void update_devs();
295432
433    ATTR_HOT inline const netlist_time time() const { return m_time; }
434    ATTR_HOT inline void set_time(const netlist_time ntime) { m_time = ntime; }
435
436    ATTR_HOT inline bool isRailNet() { return !(m_railterminal == NULL); }
437    ATTR_HOT inline const netlist_terminal_t & RESTRICT  railterminal() const { return *m_railterminal; }
438    ATTR_HOT inline netlist_terminal_t & RESTRICT railterminal() { return *m_railterminal; }
439
296440    /* Everything below is used by the logic subsystem */
297441
298442    ATTR_HOT inline void inc_active();
299443    ATTR_HOT inline void dec_active();
300444
301445    ATTR_HOT inline const int active_count() const { return m_active; }
302    ATTR_HOT inline const netlist_time time() const { return m_time; }
303    ATTR_HOT inline void set_time(const netlist_time ntime) { m_time = ntime; }
304446
305447    ATTR_HOT inline const netlist_sig_t last_Q() const  { return m_last.Q;  }
306448    ATTR_HOT inline const netlist_sig_t new_Q() const   { return m_new.Q;   }
307449
308    ATTR_HOT inline const netlist_core_device_t * RESTRICT  raildev() const { return m_raildev; }
309    ATTR_HOT inline netlist_core_device_t * RESTRICT raildev() { return m_raildev; }
310
311450protected:
312451
313452    /* prohibit use in device functions
r26109r26110
324463        return m_cur.Analog;
325464    }
326465
327
328466    ATTR_HOT inline void push_to_queue(const netlist_time &delay);
329467
330468    hybrid_t m_last;
331469    hybrid_t m_cur;
332470    hybrid_t m_new;
333471
334#if USE_LINKED_LIST
335    net_input_t *m_head;
336#endif
472    netlist_terminal_t *m_head;
337473    UINT32 m_num_cons;
338474
339475private:
340    ATTR_HOT void update_dev(const net_input_t *inp, const UINT32 mask);
476    ATTR_HOT void update_dev(const netlist_terminal_t *inp, const UINT32 mask);
341477
342478    netlist_time m_time;
343479    INT32        m_active;
344480    UINT32       m_in_queue;    /* 0: not in queue, 1: in queue, 2: last was taken */
345481
346#if !USE_LINKED_LIST
347    net_input_t *  RESTRICT m_cons[OUTPUT_MAX_CONNECTIONS];
348#endif
349    netlist_core_device_t * RESTRICT m_raildev;
482    netlist_terminal_t * RESTRICT m_railterminal;
350483};
351484
352485
r26109r26110
354487// net_output_t
355488// ----------------------------------------------------------------------------------------
356489
357class NETLIB_NAME(netdev_mainclock);
490class NETLIB_NAME(mainclock);
358491
359class net_output_t : public net_terminal_t
492class netlist_output_t : public netlist_terminal_t
360493{
361494public:
362495
363   net_output_t(int atype);
496   netlist_output_t(const type_t atype, const family_t afamily);
364497
365498    ATTR_COLD virtual void init_terminal(netlist_core_device_t &dev);
366499
r26109r26110
370503protected:
371504
372505private:
373   net_net_t m_my_net;
506   netlist_net_t m_my_net;
374507};
375508
376509
377class logic_output_t : public net_output_t
510class netlist_logic_output_t : public netlist_output_t
378511{
379512public:
380513
381   ATTR_COLD logic_output_t();
514   ATTR_COLD netlist_logic_output_t();
382515
383516   ATTR_COLD void initial(const netlist_sig_t val);
384517    ATTR_COLD void set_levels(const double low, const double high);
385518
386519   ATTR_HOT inline void set_Q(const netlist_sig_t newQ, const netlist_time &delay)
387520   {
388       net_net_t &anet = net();
521       netlist_net_t &anet = net();
389522
390523      if (EXPECTED(newQ != anet.m_new.Q))
391524      {
r26109r26110
396529   }
397530};
398531
399class ttl_output_t : public logic_output_t
532class netlist_ttl_output_t : public netlist_logic_output_t
400533{
401534public:
402535
403   ttl_output_t()
404      : logic_output_t()
536   netlist_ttl_output_t()
537      : netlist_logic_output_t()
405538   {
406539       set_levels(0.3, 3.4);
407540   }
408541
409542};
410543
411class analog_output_t : public net_output_t
544class netlist_analog_output_t : public netlist_output_t
412545{
413546public:
414547
415   ATTR_COLD analog_output_t()
416      : net_output_t(OUTPUT | SIGNAL_ANALOG)
548   ATTR_COLD netlist_analog_output_t()
549      : netlist_output_t(OUTPUT, ANALOG)
417550    {
418551       net().m_cur.Analog = 0.0;
419552       net().m_new.Analog = 0.0;
r26109r26110
440573// net_device_t
441574// ----------------------------------------------------------------------------------------
442575
443class netlist_core_device_t : public net_object_t
576class netlist_core_device_t : public netlist_object_t
444577{
445578public:
446579
r26109r26110
467600#endif
468601   }
469602
470    ATTR_HOT const netlist_sig_t INPLOGIC_PASSIVE(logic_input_t &inp);
603    ATTR_HOT const netlist_sig_t INPLOGIC_PASSIVE(netlist_logic_input_t &inp);
471604
472   ATTR_HOT inline const netlist_sig_t INPLOGIC(const logic_input_t &inp) const
605   ATTR_HOT inline const netlist_sig_t INPLOGIC(const netlist_logic_input_t &inp) const
473606   {
474      assert(inp.state() != net_input_t::INP_STATE_PASSIVE);
607      assert(inp.state() != netlist_input_t::INP_STATE_PASSIVE);
475608      return inp.Q();
476609   }
477610
478   ATTR_HOT inline void OUTLOGIC(logic_output_t &out, const netlist_sig_t val, const netlist_time &delay)
611   ATTR_HOT inline void OUTLOGIC(netlist_logic_output_t &out, const netlist_sig_t val, const netlist_time &delay)
479612   {
480613      out.set_Q(val, delay);
481614   }
482615
483   ATTR_HOT inline bool INP_HL(const logic_input_t &inp) const
616   ATTR_HOT inline bool INP_HL(const netlist_logic_input_t &inp) const
484617   {
485618      return ((inp.last_Q() & !inp.Q()) == 1);
486619   }
487620
488   ATTR_HOT inline bool INP_LH(const logic_input_t &inp) const
621   ATTR_HOT inline bool INP_LH(const netlist_logic_input_t &inp) const
489622   {
490623      return ((!inp.last_Q() & inp.Q()) == 1);
491624   }
492625
493   ATTR_HOT inline const double INPANALOG(const analog_input_t &inp) const { return inp.Q_Analog(); }
626   ATTR_HOT inline const double INPANALOG(const netlist_analog_input_t &inp) const { return inp.Q_Analog(); }
494627
495   ATTR_HOT inline void OUTANALOG(analog_output_t &out, const double val, const netlist_time &delay)
628   ATTR_HOT inline void OUTANALOG(netlist_analog_output_t &out, const double val, const netlist_time &delay)
496629   {
497630      out.set_Q(val, delay);
498631   }
r26109r26110
519652};
520653
521654
522class net_device_t : public netlist_core_device_t
655class netlist_device_t : public netlist_core_device_t
523656{
524657public:
525658
526   ATTR_COLD net_device_t();
659   ATTR_COLD netlist_device_t();
527660
528   virtual ~net_device_t();
661   virtual ~netlist_device_t();
529662
530663   ATTR_COLD virtual void init(netlist_setup_t &setup, const astring &name);
531664
r26109r26110
535668
536669   ATTR_COLD void register_sub(netlist_core_device_t &dev, const astring &name);
537670
538   ATTR_COLD void register_output(const astring &name, net_output_t &out);
539   ATTR_COLD void register_output(netlist_core_device_t &dev, const astring &name, net_output_t &out);
671   ATTR_COLD void register_output(const astring &name, netlist_output_t &out);
672   ATTR_COLD void register_output(netlist_core_device_t &dev, const astring &name, netlist_output_t &out);
540673
541   ATTR_COLD void register_input(const astring &name, net_input_t &in, net_input_t::net_input_state state = net_input_t::INP_STATE_ACTIVE);
542   ATTR_COLD void register_input(netlist_core_device_t &dev, const astring &name, net_input_t &in, net_input_t::net_input_state state = net_input_t::INP_STATE_ACTIVE);
674   ATTR_COLD void register_input(const astring &name, netlist_input_t &in, netlist_input_t::net_input_state state = netlist_input_t::INP_STATE_ACTIVE);
675   ATTR_COLD void register_input(netlist_core_device_t &dev, const astring &name, netlist_input_t &in, netlist_input_t::net_input_state state = netlist_input_t::INP_STATE_ACTIVE);
543676
544   ATTR_COLD void register_link_internal(net_input_t &in, net_output_t &out, net_input_t::net_input_state aState);
545   ATTR_COLD void register_link_internal(netlist_core_device_t &dev, net_input_t &in, net_output_t &out, net_input_t::net_input_state aState);
677   ATTR_COLD void register_link_internal(netlist_input_t &in, netlist_output_t &out, netlist_input_t::net_input_state aState);
678   ATTR_COLD void register_link_internal(netlist_core_device_t &dev, netlist_input_t &in, netlist_output_t &out, netlist_input_t::net_input_state aState);
546679
547   netlist_list_t<astring> m_inputs;
680   /* driving logic outputs don't count in here */
681   netlist_list_t<astring> m_terminals;
548682
549683protected:
550684
551685   virtual void update() { }
552686   virtual void start() { }
553687
554   ATTR_COLD void register_param(const astring &sname, net_param_t &param, const double initialVal = 0.0);
555   ATTR_COLD void register_param(netlist_core_device_t &dev, const astring &sname, net_param_t &param, const double initialVal = 0.0);
688   ATTR_COLD void register_param(const astring &sname, netlist_param_t &param, const double initialVal = 0.0);
689   ATTR_COLD void register_param(netlist_core_device_t &dev, const astring &sname, netlist_param_t &param, const double initialVal = 0.0);
556690
557691   netlist_setup_t *m_setup;
558692   bool m_variable_input_count;
r26109r26110
560694private:
561695};
562696
563class net_param_t
697class netlist_param_t : public netlist_object_t
564698{
565699public:
566   net_param_t()
567   : m_param(0.0)
700   netlist_param_t()
701   : netlist_object_t(PARAM, ANALOG)
702    , m_param(0.0)
568703   , m_netdev(NULL)
569704   {  }
570705
r26109r26110
586721};
587722
588723
589
590class netdev_mainclock;
591
592724// ----------------------------------------------------------------------------------------
593725// netlist_base_t
594726// ----------------------------------------------------------------------------------------
r26109r26110
597729{
598730public:
599731
600   typedef netlist_timed_queue1<net_net_t, netlist_time, 512> queue_t;
732   typedef netlist_timed_queue1<netlist_net_t, netlist_time, 512> queue_t;
601733
602734   netlist_base_t();
603735   virtual ~netlist_base_t();
604736
605737   void set_clock_freq(UINT64 clockfreq);
606738
607   ATTR_HOT inline void push_to_queue(net_net_t &out, const netlist_time &attime)
739   ATTR_HOT inline void push_to_queue(netlist_net_t &out, const netlist_time &attime)
608740   {
609741      m_queue.push(queue_t::entry_t(attime, out));
610742   }
r26109r26110
613745
614746   ATTR_HOT inline const netlist_time &time() const { return m_time_ps; }
615747
616   ATTR_COLD void set_mainclock_dev(NETLIB_NAME(netdev_mainclock) *dev);
748   ATTR_COLD void set_mainclock_dev(NETLIB_NAME(mainclock) *dev);
617749
618750   ATTR_COLD void reset();
619751
r26109r26110
627759   int m_perf_inp_active;
628760
629761private:
630   NETLIB_NAME(netdev_mainclock) *m_mainclock;
762   NETLIB_NAME(mainclock) *m_mainclock;
631763   netlist_time m_time_ps;
632764   UINT32   m_rem;
633765   UINT32  m_div;
r26109r26110
641773// netdev_a_to_d
642774// ----------------------------------------------------------------------------------------
643775
644class netdev_a_to_d_proxy : public net_device_t
776class nld_a_to_d_proxy : public netlist_device_t
645777{
646778public:
647   netdev_a_to_d_proxy(net_input_t &in_proxied)
648         : net_device_t()
779   nld_a_to_d_proxy(netlist_input_t &in_proxied)
780         : netlist_device_t()
649781   {
650782      assert(in_proxied.object_type(SIGNAL_MASK) == SIGNAL_DIGITAL);
651783      m_I.m_high_thresh_V = in_proxied.m_high_thresh_V;
652784      m_I.m_low_thresh_V = in_proxied.m_low_thresh_V;
653785   }
654786
655   virtual ~netdev_a_to_d_proxy() {}
787   virtual ~nld_a_to_d_proxy() {}
656788
657   analog_input_t m_I;
658   ttl_output_t m_Q;
789   netlist_analog_input_t m_I;
790   netlist_ttl_output_t m_Q;
659791
660792protected:
661793   void start()
r26109r26110
680812// netdev_d_to_a
681813// ----------------------------------------------------------------------------------------
682814
683class netdev_d_to_a_proxy : public net_device_t
815class nld_d_to_a_proxy : public netlist_device_t
684816{
685817public:
686   netdev_d_to_a_proxy(net_output_t &out_proxied)
687         : net_device_t()
818   nld_d_to_a_proxy(netlist_output_t &out_proxied)
819         : netlist_device_t()
688820   {
689821      assert(out_proxied.object_type(SIGNAL_MASK) == SIGNAL_DIGITAL);
690822      m_low_V = out_proxied.m_low_V;
691823      m_high_V = out_proxied.m_high_V;
692824   }
693825
694   virtual ~netdev_d_to_a_proxy() {}
826   virtual ~nld_d_to_a_proxy() {}
695827
696   ttl_input_t m_I;
697   analog_output_t m_Q;
828   netlist_ttl_input_t m_I;
829   netlist_analog_output_t m_Q;
698830
699831protected:
700832   void start()
r26109r26110
719851// Inline implementations
720852// ----------------------------------------------------------------------------------------
721853
722ATTR_HOT inline void net_input_t::inactivate()
854ATTR_HOT inline void netlist_input_t::inactivate()
723855{
724   if (m_state != INP_STATE_PASSIVE)
856   if (!is_state(INP_STATE_PASSIVE))
725857   {
726      m_state = INP_STATE_PASSIVE;
858      set_state(INP_STATE_PASSIVE);
727859      net().dec_active();
728860   }
729861}
730862
731ATTR_HOT inline void net_input_t::activate()
863ATTR_HOT inline void netlist_input_t::activate()
732864{
733   if (m_state == INP_STATE_PASSIVE)
865   if (is_state(INP_STATE_PASSIVE))
734866   {
735867      net().inc_active();
736      m_state = INP_STATE_ACTIVE;
868      set_state(INP_STATE_ACTIVE);
737869   }
738870}
739871
740ATTR_HOT inline void net_input_t::activate_hl()
872ATTR_HOT inline void netlist_input_t::activate_hl()
741873{
742   if (m_state == INP_STATE_PASSIVE)
874   if (is_state(INP_STATE_PASSIVE))
743875   {
744876      net().inc_active();
745      m_state = INP_STATE_HL;
877      set_state(INP_STATE_HL);
746878   }
747879}
748880
749ATTR_HOT inline void net_input_t::activate_lh()
881ATTR_HOT inline void netlist_input_t::activate_lh()
750882{
751   if (m_state == INP_STATE_PASSIVE)
883   if (is_state(INP_STATE_PASSIVE))
752884   {
753885      net().inc_active();
754      m_state = INP_STATE_LH;
886      set_state(INP_STATE_LH);
755887   }
756888}
757889
758890
759ATTR_HOT inline void net_net_t::push_to_queue(const netlist_time &delay)
891ATTR_HOT inline void netlist_net_t::push_to_queue(const netlist_time &delay)
760892{
761893   // if (m_in_queue == 1) return; FIXME: check this at some time
762   m_time = netlist()->time() + delay;
894   m_time = netlist().time() + delay;
763895   m_in_queue = (m_active > 0) ? 1 : 0;     /* queued ? */
764896   if (m_in_queue)
765897   {
766898      //m_in_queue = 1;     /* pending */
767      netlist()->push_to_queue(*this, m_time);
899      netlist().push_to_queue(*this, m_time);
768900   }
769901}
770902
771ATTR_HOT inline void net_net_t::inc_active()
903ATTR_HOT inline void netlist_net_t::inc_active()
772904{
773905   m_active++;
774906
775#if USE_DEACTIVE_DEVICE
776   if (m_active == 1 && m_in_queue > 0)
777   {
778      m_last = m_cur;
779      raildev()->inc_active();
780      m_cur = m_new;
781   }
782#endif
907   if (USE_DEACTIVE_DEVICE)
908        if (m_active == 1 && m_in_queue > 0)
909        {
910            m_last = m_cur;
911            railterminal().netdev().inc_active();
912            m_cur = m_new;
913        }
783914
784915   if (EXPECTED(m_active == 1 && m_in_queue == 0))
785916   {
786      if (EXPECTED(m_time > netlist()->time()))
917      if (EXPECTED(m_time > netlist().time()))
787918      {
788919         m_in_queue = 1;     /* pending */
789         netlist()->push_to_queue(*this, m_time);
920         netlist().push_to_queue(*this, m_time);
790921      }
791922      else
792923      {
r26109r26110
796927   }
797928}
798929
799ATTR_HOT inline void net_net_t::dec_active()
930ATTR_HOT inline void netlist_net_t::dec_active()
800931{
801932   m_active--;
802#if (USE_DEACTIVE_DEVICE)
803   if (m_active == 0)
804       raildev()->dec_active();
805#endif
933   if (USE_DEACTIVE_DEVICE)
934       if (m_active == 0)
935           railterminal().netdev().dec_active();
936
806937}
807938
808ATTR_HOT inline const netlist_sig_t logic_input_t::Q() const
939ATTR_HOT inline const netlist_sig_t netlist_logic_input_t::Q() const
809940{
810941   return net().Q();
811942}
812943
813ATTR_HOT inline const netlist_sig_t logic_input_t::last_Q() const
944ATTR_HOT inline const netlist_sig_t netlist_logic_input_t::last_Q() const
814945{
815946   return net().last_Q();
816947}
817948
818ATTR_HOT inline const double analog_input_t::Q_Analog() const
949ATTR_HOT inline const double netlist_analog_input_t::Q_Analog() const
819950{
820951   return net().Q_Analog();
821952}
822953
823ATTR_HOT inline const bool analog_input_t::is_highz() const
954ATTR_HOT inline const bool netlist_analog_input_t::is_highz() const
824955{
825956   return (net().Q_Analog() == NETLIST_HIGHIMP_V);
826957}
r26109r26110
838969
839970   virtual ~net_device_t_base_factory() {}
840971
841   virtual net_device_t *Create() const = 0;
972   virtual netlist_device_t *Create() const = 0;
842973
843974   const astring &name() const { return m_name; }
844975   const astring &classname() const { return m_classname; }
r26109r26110
854985   net_device_t_factory(const astring &name, const astring &classname)
855986   : net_device_t_base_factory(name, classname) { }
856987
857   net_device_t *Create() const
988   netlist_device_t *Create() const
858989   {
859      net_device_t *r = new C();
990      netlist_device_t *r = new C();
860991      //r->init(setup, name);
861992      return r;
862993   }
863994};
864995
865net_device_t *net_create_device_by_classname(const astring &classname, netlist_setup_t &setup, const astring &icname);
866net_device_t *net_create_device_by_name(const astring &name, netlist_setup_t &setup, const astring &icname);
996netlist_device_t *net_create_device_by_classname(const astring &classname, netlist_setup_t &setup, const astring &icname);
997netlist_device_t *net_create_device_by_name(const astring &name, netlist_setup_t &setup, const astring &icname);
867998
868999
8691000#endif /* NLBASE_H_ */
trunk/src/emu/netlist/nl_setup.c
r26109r26110
4646   m_terminals.reset();
4747}
4848
49net_device_t *netlist_setup_t::register_dev(net_device_t *dev)
49netlist_device_t *netlist_setup_t::register_dev(netlist_device_t *dev)
5050{
5151   if (!(m_devices.add(dev->name(), dev, false)==TMERR_NONE))
5252      fatalerror("Error adding %s to device list\n", dev->name().cstr());
r26109r26110
7171
7272void netlist_setup_t::remove_dev(const astring &name)
7373{
74   net_device_t *dev = m_devices.find(name);
74   netlist_device_t *dev = m_devices.find(name);
7575   astring temp = name;
7676   if (dev == NULL)
7777      fatalerror("Device %s does not exist\n", name.cstr());
r26109r26110
8787
8888void netlist_setup_t::register_callback(const astring &devname, netlist_output_delegate delegate)
8989{
90   NETLIB_NAME(netdev_analog_callback) *dev = (NETLIB_NAME(netdev_analog_callback) *) m_devices.find(devname);
90   NETLIB_NAME(analog_callback) *dev = (NETLIB_NAME(analog_callback) *) m_devices.find(devname);
9191   if (dev == NULL)
9292      fatalerror("did not find device %s\n", devname.cstr());
9393   dev->register_callback(delegate);
r26109r26110
9999      fatalerror("Error adding alias %s to alias list\n", alias.cstr());
100100}
101101
102void netlist_setup_t::register_output(netlist_core_device_t &dev, netlist_core_device_t &upd_dev, const astring &name, net_output_t &out)
102void netlist_setup_t::register_output(netlist_core_device_t &dev, netlist_core_device_t &upd_dev, const astring &name, netlist_output_t &out)
103103{
104   NL_VERBOSE_OUT(("out %s\n", name.cstr()));
104   NL_VERBOSE_OUT(("output %s\n", name.cstr()));
105105   astring temp = dev.name();
106106   temp.cat(".");
107107   temp.cat(name);
108108   out.init_terminal(upd_dev);
109109   if (!(m_terminals.add(temp, &out, false)==TMERR_NONE))
110      fatalerror("Error adding output %s to output list\n", name.cstr());
110      fatalerror("Error adding output %s to terminal list\n", name.cstr());
111111}
112112
113void netlist_setup_t::register_input(net_device_t &dev, netlist_core_device_t &upd_dev, const astring &name, net_input_t &inp, net_input_t::net_input_state type)
113void netlist_setup_t::register_input(netlist_device_t &dev, netlist_core_device_t &upd_dev, const astring &name, netlist_input_t &inp, netlist_input_t::net_input_state type)
114114{
115115   NL_VERBOSE_OUT(("input %s\n", name.cstr()));
116116   astring temp = dev.name();
117117   temp.cat(".");
118118   temp.cat(name);
119119   inp.init_input(upd_dev, type);
120   dev.m_inputs.add(temp);
120   /* add to list of terminals so logic devices are supported in parser */
121   dev.m_terminals.add(temp);
121122   if (!(m_terminals.add(temp, &inp, false) == TMERR_NONE))
122      fatalerror("Error adding input %s to input list\n", name.cstr());
123      fatalerror("Error adding input %s to terminal list\n", name.cstr());
123124}
124125
125126void netlist_setup_t::register_link(const astring &sin, const astring &sout)
r26109r26110
131132}
132133
133134
134void netlist_setup_t::register_param(const astring &name, net_param_t *param)
135void netlist_setup_t::register_param(const astring &name, netlist_param_t *param)
135136{
136137   astring temp = param->netdev().name();
137138   temp.cat(".");
r26109r26110
149150   return name;
150151}
151152
152net_output_t *netlist_setup_t::find_output_exact(const astring &outname_in)
153netlist_output_t *netlist_setup_t::find_output_exact(const astring &outname_in)
153154{
154   net_terminal_t *term = m_terminals.find(outname_in);
155   return dynamic_cast<net_output_t *>(term);
155   netlist_terminal_t *term = m_terminals.find(outname_in);
156   return dynamic_cast<netlist_output_t *>(term);
156157}
157158
158net_output_t &netlist_setup_t::find_output(const astring &outname_in)
159netlist_output_t &netlist_setup_t::find_output(const astring &outname_in)
159160{
160161   const astring &outname = resolve_alias(outname_in);
161   net_output_t *ret;
162   netlist_output_t *ret;
162163
163164   ret = find_output_exact(outname);
164165   /* look for default */
r26109r26110
175176   return *ret;
176177}
177178
178net_param_t &netlist_setup_t::find_param(const astring &param_in)
179netlist_param_t &netlist_setup_t::find_param(const astring &param_in)
179180{
180181   const astring &outname = resolve_alias(param_in);
181   net_param_t *ret;
182   netlist_param_t *ret;
182183
183184   ret = m_params.find(outname);
184185   if (ret == NULL)
r26109r26110
195196   {
196197      const astring *sout = entry->object();
197198      astring sin = entry->tag();
198      net_input_t *in = dynamic_cast<net_input_t *>(m_terminals.find(sin));
199      netlist_input_t *in = dynamic_cast<netlist_input_t *>(m_terminals.find(sin));
199200
200201      if (in == NULL)
201202         fatalerror("Unable to find %s\n", sin.cstr());
202203
203      net_output_t  &out = find_output(sout->cstr());
204      if (out.object_type(net_output_t::SIGNAL_MASK) == net_output_t::SIGNAL_ANALOG
205            && in->object_type(net_output_t::SIGNAL_MASK) == net_output_t::SIGNAL_DIGITAL)
204      netlist_output_t  &out = find_output(sout->cstr());
205      if (out.isFamily(netlist_terminal_t::ANALOG) && in->isFamily(netlist_terminal_t::LOGIC))
206206      {
207         netdev_a_to_d_proxy *proxy = new netdev_a_to_d_proxy(*in);
207         nld_a_to_d_proxy *proxy = new nld_a_to_d_proxy(*in);
208208         astring x = "";
209209         x.printf("proxy_ad_%d", proxy_cnt++);
210210
r26109r26110
215215         out.net().register_con(proxy->m_I);
216216
217217      }
218      else if (out.object_type(net_output_t::SIGNAL_MASK) == net_output_t::SIGNAL_DIGITAL
219            && in->object_type(net_output_t::SIGNAL_MASK) == net_output_t::SIGNAL_ANALOG)
218      else if (out.isFamily(netlist_terminal_t::LOGIC) && in->isFamily(netlist_terminal_t::ANALOG))
220219      {
221220         //printf("here 1\n");
222         netdev_d_to_a_proxy *proxy = new netdev_d_to_a_proxy(out);
221         nld_d_to_a_proxy *proxy = new nld_d_to_a_proxy(out);
223222         astring x = "";
224223         x.printf("proxy_da_%d", proxy_cnt++);
225224         proxy->init(*this, x.cstr());
r26109r26110
237236   /* find the main clock ... */
238237   for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry))
239238   {
240      net_device_t *dev = entry->object();
241      if (dynamic_cast<NETLIB_NAME(netdev_mainclock)*>(dev) != NULL)
239      netlist_device_t *dev = entry->object();
240      if (dynamic_cast<NETLIB_NAME(mainclock)*>(dev) != NULL)
242241      {
243         m_netlist.set_mainclock_dev(dynamic_cast<NETLIB_NAME(netdev_mainclock)*>(dev));
242         m_netlist.set_mainclock_dev(dynamic_cast<NETLIB_NAME(mainclock)*>(dev));
244243      }
245244   }
246245
247246   /* print all outputs */
248247   for (tagmap_terminal_t::entry_t *entry = m_terminals.first(); entry != NULL; entry = m_terminals.next(entry))
249248   {
250      ATTR_UNUSED net_output_t *out = dynamic_cast<net_output_t *>(entry->object());
249      ATTR_UNUSED netlist_output_t *out = dynamic_cast<netlist_output_t *>(entry->object());
251250      //if (out != NULL)
252251         //VERBOSE_OUT(("%s %d\n", out->netdev()->name(), *out->Q_ptr()));
253252   }
r26109r26110
265264
266265   for (tagmap_devices_t::entry_t *entry = m_devices.first(); entry != NULL; entry = m_devices.next(entry))
267266   {
268      net_device_t *dev = entry->object();
267      netlist_device_t *dev = entry->object();
269268      dev->update_dev();
270269   }
271270}
trunk/src/emu/netlist/nl_setup.h
r26109r26110
4848// FIXME: Clean this up
4949// ----------------------------------------------------------------------------------------
5050
51class NETLIB_NAME(netdev_analog_callback);
51//class NETLIB_NAME(analog_callback);
5252
5353// ----------------------------------------------------------------------------------------
5454// netlist_setup_t
r26109r26110
5858{
5959public:
6060
61   typedef tagmap_t<net_device_t *, 393> tagmap_devices_t;
61   typedef tagmap_t<netlist_device_t *, 393> tagmap_devices_t;
6262   typedef tagmap_t<const astring *, 393> tagmap_astring_t;
63   typedef tagmap_t<net_param_t *, 393> tagmap_param_t;
64   typedef tagmap_t<net_terminal_t *, 393> tagmap_terminal_t;
63   typedef tagmap_t<netlist_param_t *, 393> tagmap_param_t;
64   typedef tagmap_t<netlist_terminal_t *, 393> tagmap_terminal_t;
6565
6666   netlist_setup_t(netlist_base_t &netlist);
6767   ~netlist_setup_t();
6868
6969   netlist_base_t &netlist() { return m_netlist; }
7070
71   net_device_t *register_dev(net_device_t *dev);
71   netlist_device_t *register_dev(netlist_device_t *dev);
7272   void remove_dev(const astring &name);
7373
74   void register_output(netlist_core_device_t &dev, netlist_core_device_t &upd_dev, const astring &name, net_output_t &out);
75   void register_input(net_device_t &dev, netlist_core_device_t &upd_dev, const astring &name, net_input_t &inp, net_input_t::net_input_state type);
74   void register_output(netlist_core_device_t &dev, netlist_core_device_t &upd_dev, const astring &name, netlist_output_t &out);
75   void register_input(netlist_device_t &dev, netlist_core_device_t &upd_dev, const astring &name, netlist_input_t &inp, netlist_input_t::net_input_state type);
7676   void register_alias(const astring &alias, const astring &out);
77   void register_param(const astring &sname, net_param_t *param);
77   void register_param(const astring &sname, netlist_param_t *param);
7878
7979   void register_link(const astring &sin, const astring &sout);
8080
81   net_output_t &find_output(const astring &outname_in);
82   net_param_t &find_param(const astring &param_in);
81   netlist_output_t &find_output(const astring &outname_in);
82   netlist_param_t &find_param(const astring &param_in);
8383
8484   void register_callback(const astring &devname, netlist_output_delegate delegate);
8585
r26109r26110
105105   tagmap_param_t  m_params;
106106   tagmap_astring_t  m_links;
107107
108   net_output_t *find_output_exact(const astring &outname_in);
108   netlist_output_t *find_output_exact(const astring &outname_in);
109109   const astring &resolve_alias(const astring &name) const;
110110};
111111
trunk/src/emu/netlist/devices/net_lib.c
r26109r26110
5050#include "net_lib.h"
5151#include "nld_system.h"
5252
53NETLIB_START(netdev_logic_input)
53NETLIB_START(logic_input)
5454{
5555   register_output("Q", m_Q);
5656}
5757
58NETLIB_UPDATE(netdev_logic_input)
58NETLIB_UPDATE(logic_input)
5959{
6060}
6161
62NETLIB_START(netdev_analog_input)
62NETLIB_START(analog_input)
6363{
6464   register_output("Q", m_Q);
6565}
6666
67NETLIB_UPDATE(netdev_analog_input)
67NETLIB_UPDATE(analog_input)
6868{
6969}
7070
71NETLIB_START(netdev_log)
71NETLIB_START(log)
7272{
7373   register_input("I", m_I);
7474}
7575
76NETLIB_UPDATE(netdev_log)
76NETLIB_UPDATE(log)
7777{
78   printf("%s: %d %d\n", name().cstr(), (UINT32) (netlist()->time().as_raw() / 1000000), INPLOGIC(m_I));
78   printf("%s: %d %d\n", name().cstr(), (UINT32) (netlist().time().as_raw() / 1000000), INPLOGIC(m_I));
7979}
8080
81NETLIB_START(netdev_clock)
81NETLIB_START(clock)
8282{
8383   register_output("Q", m_Q);
8484   //register_input("FB", m_feedback);
r26109r26110
8686   register_param("FREQ", m_freq, 7159000.0 * 5);
8787   m_inc = netlist_time::from_hz(m_freq.Value()*2);
8888
89   register_link_internal(m_feedback, m_Q, net_input_t::INP_STATE_ACTIVE);
89   register_link_internal(m_feedback, m_Q, netlist_input_t::INP_STATE_ACTIVE);
9090
9191}
9292
93NETLIB_UPDATE_PARAM(netdev_clock)
93NETLIB_UPDATE_PARAM(clock)
9494{
9595   m_inc = netlist_time::from_hz(m_freq.Value()*2);
9696}
9797
98NETLIB_UPDATE(netdev_clock)
98NETLIB_UPDATE(clock)
9999{
100100   //m_Q.setToNoCheck(!m_Q.new_Q(), m_inc  );
101101   OUTLOGIC(m_Q, !m_Q.net().new_Q(), m_inc  );
r26109r26110
217217   register_param("VL", m_VL, 0.0 *5.0);
218218
219219   m_THRESHOLD_OUT.init_terminal(*this);
220   register_link_internal(m_THRESHOLD, m_THRESHOLD_OUT, net_input_t::INP_STATE_ACTIVE);
220   register_link_internal(m_THRESHOLD, m_THRESHOLD_OUT, netlist_input_t::INP_STATE_ACTIVE);
221221
222222   m_Q.initial(5.0 * 0.4);
223223   m_last = false;
r26109r26110
503503NETLIB_START(nic7474)
504504{
505505   register_sub(sub, "sub");
506   register_input(sub, "CLK",  sub.m_clk, net_input_t::INP_STATE_LH);
506   register_input(sub, "CLK",  sub.m_clk, netlist_input_t::INP_STATE_LH);
507507   register_input("D",    m_D);
508508   register_input("CLRQ", m_clrQ);
509509   register_input("PREQ", m_preQ);
r26109r26110
614614   register_sub(C, "C");
615615   register_sub(D, "D");
616616
617   register_input(A, "CLKA", A.m_I, net_input_t::INP_STATE_HL);
618   register_input(B, "CLKB", B.m_I, net_input_t::INP_STATE_HL);
617   register_input(A, "CLKA", A.m_I, netlist_input_t::INP_STATE_HL);
618   register_input(B, "CLKB", B.m_I, netlist_input_t::INP_STATE_HL);
619619   register_input("R1",  m_R1);
620620   register_input("R2",  m_R2);
621621
r26109r26110
625625   register_output(D, "QD", D.m_Q);
626626
627627   //B.register_link_internal(B.m_I, A.m_Q);
628   register_link_internal(C, C.m_I, B.m_Q, net_input_t::INP_STATE_HL);
629   register_link_internal(D, D.m_I, C.m_Q, net_input_t::INP_STATE_HL);
628   register_link_internal(C, C.m_I, B.m_Q, netlist_input_t::INP_STATE_HL);
629   register_link_internal(D, D.m_I, C.m_Q, netlist_input_t::INP_STATE_HL);
630630
631631}
632632
r26109r26110
665665{
666666   m_cnt = 0;
667667
668   register_input("CLKA", m_CLK, net_input_t::INP_STATE_HL);
669   register_input("CLKB", m_CLKB, net_input_t::INP_STATE_HL);
668   register_input("CLKA", m_CLK, netlist_input_t::INP_STATE_HL);
669   register_input("CLKB", m_CLKB, netlist_input_t::INP_STATE_HL);
670670   register_input("R1",  m_R1);
671671   register_input("R2",  m_R2);
672672
r26109r26110
745745{
746746   register_sub(sub, "sub");
747747
748   register_input(sub, "CLK", sub.m_clk, net_input_t::INP_STATE_HL);
748   register_input(sub, "CLK", sub.m_clk, netlist_input_t::INP_STATE_HL);
749749   register_input("J", m_J);
750750   register_input("K", m_K);
751751   register_input("CLRQ", m_clrQ);
r26109r26110
855855   sub.m_loadq = 1;
856856   sub.m_ent = 1;
857857
858   register_input(sub, "CLK", sub.m_clk, net_input_t::INP_STATE_LH);
858   register_input(sub, "CLK", sub.m_clk, netlist_input_t::INP_STATE_LH);
859859
860860   register_input("ENP", m_ENP);
861861   register_input("ENT", m_ENT);
862862   register_input("CLRQ", m_CLRQ);
863863   register_input("LOADQ", m_LOADQ);
864864
865   register_input(sub, "A", sub.m_A, net_input_t::INP_STATE_PASSIVE);
866   register_input(sub, "B", sub.m_B, net_input_t::INP_STATE_PASSIVE);
867   register_input(sub, "C", sub.m_C, net_input_t::INP_STATE_PASSIVE);
868   register_input(sub, "D", sub.m_D, net_input_t::INP_STATE_PASSIVE);
865   register_input(sub, "A", sub.m_A, netlist_input_t::INP_STATE_PASSIVE);
866   register_input(sub, "B", sub.m_B, netlist_input_t::INP_STATE_PASSIVE);
867   register_input(sub, "C", sub.m_C, netlist_input_t::INP_STATE_PASSIVE);
868   register_input(sub, "D", sub.m_D, netlist_input_t::INP_STATE_PASSIVE);
869869
870870   register_output(sub, "QA", sub.m_QA);
871871   register_output(sub, "QB", sub.m_QB);
r26109r26110
972972
973973static const net_device_t_base_factory *netregistry[] =
974974{
975   ENTRY(netdev_ttl_const,     NETDEV_TTL_CONST)
976   ENTRY(netdev_analog_const,  NETDEV_ANALOG_CONST)
977   ENTRY(netdev_logic_input,   NETDEV_LOGIC_INPUT)
978   ENTRY(netdev_analog_input,  NETDEV_ANALOG_INPUT)
979   ENTRY(netdev_log,           NETDEV_LOG)
980   ENTRY(netdev_clock,         NETDEV_CLOCK)
981   ENTRY(netdev_mainclock,     NETDEV_MAINCLOCK)
982   ENTRY(netdev_analog_callback,NETDEV_CALLBACK)
975   ENTRY(ttl_const,            NETDEV_TTL_CONST)
976   ENTRY(analog_const,         NETDEV_ANALOG_CONST)
977   ENTRY(logic_input,          NETDEV_LOGIC_INPUT)
978   ENTRY(analog_input,         NETDEV_ANALOG_INPUT)
979   ENTRY(log,                  NETDEV_LOG)
980   ENTRY(clock,                NETDEV_CLOCK)
981   ENTRY(mainclock,            NETDEV_MAINCLOCK)
982   ENTRY(analog_callback,      NETDEV_CALLBACK)
983983   ENTRY(nicMultiSwitch,       NETDEV_SWITCH2)
984984   ENTRY(nicRSFF,              NETDEV_RSFF)
985985   ENTRY(nicMixer8,            NETDEV_MIXER)
r26109r26110
10061006   NULL
10071007};
10081008
1009net_device_t *net_create_device_by_classname(const astring &classname, netlist_setup_t &setup, const astring &icname)
1009netlist_device_t *net_create_device_by_classname(const astring &classname, netlist_setup_t &setup, const astring &icname)
10101010{
10111011   const net_device_t_base_factory **p = &netregistry[0];
10121012   while (*p != NULL)
10131013   {
10141014      if (strcmp((*p)->classname(), classname) == 0)
10151015      {
1016         net_device_t *ret = (*p)->Create();
1016         netlist_device_t *ret = (*p)->Create();
10171017         ret->init(setup, icname);
10181018         return ret;
10191019      }
r26109r26110
10231023   return NULL; // appease code analysis
10241024}
10251025
1026net_device_t *net_create_device_by_name(const astring &name, netlist_setup_t &setup, const astring &icname)
1026netlist_device_t *net_create_device_by_name(const astring &name, netlist_setup_t &setup, const astring &icname)
10271027{
10281028   const net_device_t_base_factory **p = &netregistry[0];
10291029   while (*p != NULL)
10301030   {
10311031      if (strcmp((*p)->name(), name) == 0)
10321032      {
1033         net_device_t *ret = (*p)->Create();
1033         netlist_device_t *ret = (*p)->Create();
10341034         ret->init(setup, icname);
10351035         return ret;
10361036      }
trunk/src/emu/netlist/devices/nld_signal.h
r26109r26110
2727// ----------------------------------------------------------------------------------------
2828
2929template <int _numdev>
30class net_signal_base_t : public net_device_t
30class net_signal_base_t : public netlist_device_t
3131{
3232public:
3333   net_signal_base_t()
34   : net_device_t(), m_active(1) { }
34   : netlist_device_t(), m_active(1) { }
3535
3636   ATTR_COLD void start()
3737   {
r26109r26110
4040      register_output("Q", m_Q);
4141      for (int i=0; i < _numdev; i++)
4242      {
43         register_input(sIN[i], m_i[i], net_input_t::INP_STATE_ACTIVE);
43         register_input(sIN[i], m_i[i], netlist_input_t::INP_STATE_ACTIVE);
4444      }
4545      m_Q.initial(1);
4646   }
r26109r26110
6767#endif
6868
6969public:
70   ttl_input_t m_i[_numdev];
71   ttl_output_t m_Q;
70   netlist_ttl_input_t m_i[_numdev];
71   netlist_ttl_output_t m_Q;
7272   INT8 m_active;
7373};
7474
7575
7676template <int _numdev, int _check, int _invert>
77class net_signal_t : public net_device_t
77class net_signal_t : public netlist_device_t
7878{
7979public:
8080   net_signal_t()
81   : net_device_t(), m_active(1)
81   : netlist_device_t(), m_active(1)
8282   {
8383      m_Q.initial(1);
8484   }
r26109r26110
9090      register_output("Q", m_Q);
9191      for (int i=0; i < _numdev; i++)
9292      {
93         register_input(sIN[i], m_i[i], net_input_t::INP_STATE_ACTIVE);
93         register_input(sIN[i], m_i[i], netlist_input_t::INP_STATE_ACTIVE);
9494      }
9595   }
9696
r26109r26110
140140   }
141141
142142public:
143   ttl_input_t m_i[_numdev];
144   ttl_output_t m_Q;
143   netlist_ttl_input_t m_i[_numdev];
144   netlist_ttl_output_t m_Q;
145145   INT8 m_active;
146146};
147147
148148#if 1
149149template <int _check, int _invert>
150class xx_net_signal_t: public net_device_t
150class xx_net_signal_t: public netlist_device_t
151151{
152152public:
153153   xx_net_signal_t()
154   : net_device_t(), m_active(1)
154   : netlist_device_t(), m_active(1)
155155   {
156156      m_Q.initial(1);
157157   }
r26109r26110
163163      register_output("Q", m_Q);
164164      for (int i=0; i < 2; i++)
165165      {
166         register_input(sIN[i], m_i[i], net_input_t::INP_STATE_ACTIVE);
166         register_input(sIN[i], m_i[i], netlist_input_t::INP_STATE_ACTIVE);
167167      }
168168   }
169169
r26109r26110
212212   }
213213
214214public:
215   ttl_input_t m_i[2];
216   ttl_output_t m_Q;
215   netlist_ttl_input_t m_i[2];
216   netlist_ttl_output_t m_Q;
217217   INT8 m_active;
218218
219219};
r26109r26110
223223#if 0
224224
225225template <UINT8 _check, UINT8 _invert>
226class net_signal_t<3, _check, _invert> : public net_device_t
226class net_signal_t<3, _check, _invert> : public netlist_device_t
227227{
228228public:
229   net_signal_t() : net_device_t(), m_active(1) { }
229   net_signal_t() : netlist_device_t(), m_active(1) { }
230230
231231   ATTR_COLD void start()
232232   {
r26109r26110
235235      register_output("Q", m_Q);
236236      for (int i=0; i < 3; i++)
237237      {
238         register_input(sIN[i], m_i[i], net_input_t::INP_STATE_ACTIVE);
238         register_input(sIN[i], m_i[i], netlist_input_t::INP_STATE_ACTIVE);
239239      }
240240      m_Q.initial(1);
241241   }
r26109r26110
275275      OUTLOGIC(m_Q, res, times[1 - res]);// ? 22000 : 15000);
276276   }
277277public:
278   ttl_input_t m_i[3];
279   ttl_output_t m_Q;
278   netlist_ttl_input_t m_i[3];
279   netlist_ttl_output_t m_Q;
280280   INT8 m_active;
281281
282282};
trunk/src/emu/netlist/devices/net_lib.h
r26109r26110
6969// ----------------------------------------------------------------------------------------
7070
7171#define NETDEV_MAINCLOCK(_name)                                                     \
72      NET_REGISTER_DEV(netdev_mainclock, _name)
72      NET_REGISTER_DEV(mainclock, _name)
7373#define NETDEV_CLOCK(_name)                                                         \
74      NET_REGISTER_DEV(netdev_clock, _name)
74      NET_REGISTER_DEV(clock, _name)
7575#define NETDEV_LOGIC_INPUT(_name)                                                   \
76      NET_REGISTER_DEV(netdev_logic_input, _name)
76      NET_REGISTER_DEV(logic_input, _name)
7777#define NETDEV_ANALOG_INPUT(_name)                                                  \
78      NET_REGISTER_DEV(netdev_analog_input, _name)
78      NET_REGISTER_DEV(analog_input, _name)
7979#define NETDEV_CALLBACK(_name, _IN)                                                 \
80      NET_REGISTER_DEV(netdev_analog_callback, _name)                             \
80      NET_REGISTER_DEV(analog_callback, _name)                             \
8181      NET_CONNECT(_name, IN, _IN)
8282#define NETDEV_SWITCH2(_name, _i1, _i2)                                             \
8383      NET_REGISTER_DEV(nicMultiSwitch, _name)                                     \
8484      NET_CONNECT(_name, i1, _i1)                                                 \
8585      NET_CONNECT(_name, i2, _i2)
8686#define NETDEV_DELAY_RISE(_name, _CLK, _D)                                          \
87      NET_REGISTER_DEV(netdev_delay_lh, _name)                                    \
87      NET_REGISTER_DEV(delay_lh, _name)                                    \
8888      NET_CONNECT(_name, CLK, _CLK)                                               \
8989      NET_CONNECT(_name, D, _D)
9090#define NETDEV_RSFF(_name, _S, _R)                                                  \
r26109r26110
9393      NET_CONNECT(_name, R, _R)
9494
9595#define NETDEV_LOG(_name, _I)                                                       \
96      NET_REGISTER_DEV(netdev_log, _name)                                         \
96      NET_REGISTER_DEV(log, _name)                                         \
9797      NET_CONNECT(_name, I, _I)
9898
9999
r26109r26110
223223// Special support devices ...
224224// ----------------------------------------------------------------------------------------
225225
226NETLIB_DEVICE(netdev_logic_input,
227   ttl_output_t m_Q;
226NETLIB_DEVICE(logic_input,
227   netlist_ttl_output_t m_Q;
228228);
229229
230NETLIB_DEVICE(netdev_analog_input,
231   analog_output_t m_Q;
230NETLIB_DEVICE(analog_input,
231   netlist_analog_output_t m_Q;
232232);
233233
234NETLIB_DEVICE(netdev_log,
235   ttl_input_t m_I;
234NETLIB_DEVICE(log,
235   netlist_ttl_input_t m_I;
236236);
237237
238238
r26109r26110
241241// ----------------------------------------------------------------------------------------
242242
243243
244NETLIB_DEVICE_WITH_PARAMS(netdev_clock,
245   ttl_input_t m_feedback;
246   ttl_output_t m_Q;
244NETLIB_DEVICE_WITH_PARAMS(clock,
245   netlist_ttl_input_t m_feedback;
246   netlist_ttl_output_t m_Q;
247247
248   net_param_t m_freq;
248   netlist_param_t m_freq;
249249   netlist_time m_inc;
250250);
251251
252252NETLIB_DEVICE_WITH_PARAMS(nicMultiSwitch,
253   analog_input_t m_I[8];
253   netlist_analog_input_t m_I[8];
254254
255   analog_output_t m_Q;
256   analog_output_t m_low;
255   netlist_analog_output_t m_Q;
256   netlist_analog_output_t m_low;
257257
258   net_param_t m_POS;
258   netlist_param_t m_POS;
259259
260260   int m_position;
261261);
262262
263263NETLIB_DEVICE(nicRSFF,
264   ttl_input_t m_S;
265   ttl_input_t m_R;
264   netlist_ttl_input_t m_S;
265   netlist_ttl_input_t m_R;
266266
267   ttl_output_t m_Q;
268   ttl_output_t m_QQ;
267   netlist_ttl_output_t m_Q;
268   netlist_ttl_output_t m_QQ;
269269);
270270
271271NETLIB_DEVICE_WITH_PARAMS(nicMixer8,
272   analog_input_t m_I[8];
272   netlist_analog_input_t m_I[8];
273273
274   analog_output_t m_Q;
275   analog_output_t m_low;
274   netlist_analog_output_t m_Q;
275   netlist_analog_output_t m_low;
276276
277   net_param_t m_R[8];
277   netlist_param_t m_R[8];
278278
279279   double m_w[8];
280280);
r26109r26110
287287
288288   //ATTR_HOT void timer_cb(INT32 timer_id);
289289
290   analog_input_t m_trigger;
291   analog_input_t m_CV;
292   analog_input_t m_THRESHOLD; /* internal */
290   netlist_analog_input_t m_trigger;
291   netlist_analog_input_t m_CV;
292   netlist_analog_input_t m_THRESHOLD; /* internal */
293293
294294   bool m_last;
295295
296   analog_output_t m_Q;
297   analog_output_t m_THRESHOLD_OUT; /* internal */
296   netlist_analog_output_t m_Q;
297   netlist_analog_output_t m_THRESHOLD_OUT; /* internal */
298298
299299   //netlist_base_timer_t *m_timer;
300   net_param_t m_R;
301   net_param_t m_C;
302   net_param_t m_VS;
303   net_param_t m_VL;
300   netlist_param_t m_R;
301   netlist_param_t m_C;
302   netlist_param_t m_VS;
303   netlist_param_t m_VL;
304304);
305305
306306NETLIB_SIGNAL(nic7430, 8, 0, 0);
307307
308308NETLIB_DEVICE(nic7404,
309   ttl_input_t m_I;
310   ttl_output_t m_Q;
309   netlist_ttl_input_t m_I;
310   netlist_ttl_output_t m_Q;
311311);
312312
313313NETLIB_DEVICE(nic7450,
314   ttl_input_t m_I0;
315   ttl_input_t m_I1;
316   ttl_input_t m_I2;
317   ttl_input_t m_I3;
318   ttl_output_t m_Q;
314   netlist_ttl_input_t m_I0;
315   netlist_ttl_input_t m_I1;
316   netlist_ttl_input_t m_I2;
317   netlist_ttl_input_t m_I3;
318   netlist_ttl_output_t m_Q;
319319);
320320
321321NETLIB_SUBDEVICE(nic7474sub,
322   ttl_input_t m_clk;
322   netlist_ttl_input_t m_clk;
323323
324324   UINT8 m_nextD;
325   ttl_output_t m_Q;
326   ttl_output_t m_QQ;
325   netlist_ttl_output_t m_Q;
326   netlist_ttl_output_t m_QQ;
327327
328328   ATTR_HOT inline void newstate(const UINT8 state);
329329);
r26109r26110
331331NETLIB_DEVICE(nic7474,
332332   NETLIB_NAME(nic7474sub) sub;
333333
334   ttl_input_t m_D;
335   ttl_input_t m_clrQ;
336   ttl_input_t m_preQ;
334   netlist_ttl_input_t m_D;
335   netlist_ttl_input_t m_clrQ;
336   netlist_ttl_input_t m_preQ;
337337);
338338
339339NETLIB_DEVICE(nic7486,
340      ttl_input_t m_I0;
341      ttl_input_t m_I1;
342      ttl_output_t m_Q;
340      netlist_ttl_input_t m_I0;
341      netlist_ttl_input_t m_I1;
342      netlist_ttl_output_t m_Q;
343343);
344344
345345/* 74107 does latch data during high !
r26109r26110
348348
349349
350350NETLIB_SUBDEVICE(nic74107Asub,
351   ttl_input_t m_clk;
351   netlist_ttl_input_t m_clk;
352352
353   ttl_output_t m_Q;
354   ttl_output_t m_QQ;
353   netlist_ttl_output_t m_Q;
354   netlist_ttl_output_t m_QQ;
355355
356356   netlist_sig_t m_Q1;
357357   netlist_sig_t m_Q2;
r26109r26110
364364NETLIB_DEVICE(nic74107A,
365365   NETLIB_NAME(nic74107Asub) sub;
366366
367   ttl_input_t m_J;
368   ttl_input_t m_K;
369   ttl_input_t m_clrQ;
367   netlist_ttl_input_t m_J;
368   netlist_ttl_input_t m_K;
369   netlist_ttl_input_t m_clrQ;
370370
371371);
372372
r26109r26110
380380
381381
382382NETLIB_SUBDEVICE(nic7493ff,
383   ttl_input_t m_I;
384   ttl_output_t m_Q;
383   netlist_ttl_input_t m_I;
384   netlist_ttl_output_t m_Q;
385385
386386   UINT8 m_reset;
387387);
388388
389389#if !USE_OLD7493
390390NETLIB_DEVICE(nic7493,
391   ttl_input_t m_R1;
392   ttl_input_t m_R2;
391   netlist_ttl_input_t m_R1;
392   netlist_ttl_input_t m_R2;
393393
394394   NETLIB_NAME(nic7493ff) A;
395395   NETLIB_NAME(nic7493ff) B;
r26109r26110
399399
400400#else
401401NETLIB_DEVICE(nic7493,
402   ttl_input_t m_CLK;
403   ttl_input_t m_CLKB; /* dummy ! */
404   ttl_input_t m_R1;
405   ttl_input_t m_R2;
402   netlist_ttl_input_t m_CLK;
403   netlist_ttl_input_t m_CLKB; /* dummy ! */
404   netlist_ttl_input_t m_R1;
405   netlist_ttl_input_t m_R2;
406406
407   ttl_output_t m_QA;
408   ttl_output_t m_QB;
409   ttl_output_t m_QC;
410   ttl_output_t m_QD;
407   netlist_ttl_output_t m_QA;
408   netlist_ttl_output_t m_QB;
409   netlist_ttl_output_t m_QC;
410   netlist_ttl_output_t m_QD;
411411
412412   UINT8 m_cnt;
413413   ATTR_HOT void update_outputs();
r26109r26110
417417NETLIB_DEVICE(nic7490,
418418   ATTR_HOT void update_outputs();
419419
420   ttl_input_t m_R1;
421   ttl_input_t m_R2;
422   ttl_input_t m_R91;
423   ttl_input_t m_R92;
424   ttl_input_t m_clk;
420   netlist_ttl_input_t m_R1;
421   netlist_ttl_input_t m_R2;
422   netlist_ttl_input_t m_R91;
423   netlist_ttl_input_t m_R92;
424   netlist_ttl_input_t m_clk;
425425
426426   UINT8 m_cnt;
427427
428   ttl_output_t m_Q[4];
428   netlist_ttl_output_t m_Q[4];
429429);
430430
431431/* ripple-carry counter on low-high clock transition */
r26109r26110
434434   ATTR_HOT void update_outputs_all();
435435   ATTR_HOT void update_outputs();
436436
437   ttl_input_t m_clk;
437   netlist_ttl_input_t m_clk;
438438
439   ttl_input_t m_A;
440   ttl_input_t m_B;
441   ttl_input_t m_C;
442   ttl_input_t m_D;
439   netlist_ttl_input_t m_A;
440   netlist_ttl_input_t m_B;
441   netlist_ttl_input_t m_C;
442   netlist_ttl_input_t m_D;
443443
444444   UINT8 m_cnt;
445445   netlist_sig_t m_loadq;
446446   netlist_sig_t m_ent;
447447
448   ttl_output_t m_QA;
449   ttl_output_t m_QB;
450   ttl_output_t m_QC;
451   ttl_output_t m_QD;
452   ttl_output_t m_RC;
448   netlist_ttl_output_t m_QA;
449   netlist_ttl_output_t m_QB;
450   netlist_ttl_output_t m_QC;
451   netlist_ttl_output_t m_QD;
452   netlist_ttl_output_t m_RC;
453453);
454454
455455NETLIB_DEVICE(nic9316,
456456   NETLIB_NAME(nic9316_sub) sub;
457   ttl_input_t m_ENP;
458   ttl_input_t m_ENT;
459   ttl_input_t m_CLRQ;
460   ttl_input_t m_LOADQ;
457   netlist_ttl_input_t m_ENP;
458   netlist_ttl_input_t m_ENT;
459   netlist_ttl_input_t m_CLRQ;
460   netlist_ttl_input_t m_LOADQ;
461461);
462462
463463NETLIB_DEVICE(nic7483,
464   ttl_input_t m_CI;
465   ttl_input_t m_A1;
466   ttl_input_t m_A2;
467   ttl_input_t m_A3;
468   ttl_input_t m_A4;
469   ttl_input_t m_B1;
470   ttl_input_t m_B2;
471   ttl_input_t m_B3;
472   ttl_input_t m_B4;
473   ttl_input_t m_clk;
464   netlist_ttl_input_t m_CI;
465   netlist_ttl_input_t m_A1;
466   netlist_ttl_input_t m_A2;
467   netlist_ttl_input_t m_A3;
468   netlist_ttl_input_t m_A4;
469   netlist_ttl_input_t m_B1;
470   netlist_ttl_input_t m_B2;
471   netlist_ttl_input_t m_B3;
472   netlist_ttl_input_t m_B4;
473   netlist_ttl_input_t m_clk;
474474
475475   UINT8 m_lastr;
476476
477   ttl_output_t m_SA;
478   ttl_output_t m_SB;
479   ttl_output_t m_SC;
480   ttl_output_t m_SD;
481   ttl_output_t m_CO;
477   netlist_ttl_output_t m_SA;
478   netlist_ttl_output_t m_SB;
479   netlist_ttl_output_t m_SC;
480   netlist_ttl_output_t m_SD;
481   netlist_ttl_output_t m_CO;
482482
483483);
484484
485485/* one half of a nic74153 */
486486
487487NETLIB_DEVICE(nic74153,
488   ttl_input_t m_I[4];
489   ttl_input_t m_A;
490   ttl_input_t m_B;
491   ttl_input_t m_GA;
488   netlist_ttl_input_t m_I[4];
489   netlist_ttl_input_t m_A;
490   netlist_ttl_input_t m_B;
491   netlist_ttl_input_t m_GA;
492492
493   ttl_output_t m_AY;
493   netlist_ttl_output_t m_AY;
494494);
495495
496496NETLIB_SUBDEVICE(nic7448_sub,
497497   ATTR_HOT void update_outputs(UINT8 v);
498498   static const UINT8 tab7448[16][7];
499499
500   ttl_input_t m_A0;
501   ttl_input_t m_A1;
502   ttl_input_t m_A2;
503   ttl_input_t m_A3;
504   ttl_input_t m_RBIQ;
500   netlist_ttl_input_t m_A0;
501   netlist_ttl_input_t m_A1;
502   netlist_ttl_input_t m_A2;
503   netlist_ttl_input_t m_A3;
504   netlist_ttl_input_t m_RBIQ;
505505
506506   UINT8 m_state;
507507
508   ttl_output_t m_a;
509   ttl_output_t m_b;
510   ttl_output_t m_c;
511   ttl_output_t m_d;
512   ttl_output_t m_e;
513   ttl_output_t m_f;
514   ttl_output_t m_g;
508   netlist_ttl_output_t m_a;
509   netlist_ttl_output_t m_b;
510   netlist_ttl_output_t m_c;
511   netlist_ttl_output_t m_d;
512   netlist_ttl_output_t m_e;
513   netlist_ttl_output_t m_f;
514   netlist_ttl_output_t m_g;
515515);
516516
517517NETLIB_DEVICE(nic7448,
518518
519519   NETLIB_NAME(nic7448_sub) sub;
520520
521   ttl_input_t m_LTQ;
522   ttl_input_t m_BIQ;
521   netlist_ttl_input_t m_LTQ;
522   netlist_ttl_input_t m_BIQ;
523523);
524524
525525#endif
trunk/src/emu/netlist/devices/nld_system.c
r26109r26110
99// netdev_const
1010// ----------------------------------------------------------------------------------------
1111
12NETLIB_START(netdev_ttl_const)
12NETLIB_START(ttl_const)
1313{
1414    register_output("Q", m_Q);
1515    register_param("CONST", m_const, 0.0);
1616}
1717
18NETLIB_UPDATE(netdev_ttl_const)
18NETLIB_UPDATE(ttl_const)
1919{
2020}
2121
22NETLIB_UPDATE_PARAM(netdev_ttl_const)
22NETLIB_UPDATE_PARAM(ttl_const)
2323{
2424    OUTLOGIC(m_Q, m_const.ValueInt(), NLTIME_IMMEDIATE);
2525}
2626
27NETLIB_START(netdev_analog_const)
27NETLIB_START(analog_const)
2828{
2929    register_output("Q", m_Q);
3030    register_param("CONST", m_const, 0.0);
3131}
3232
33NETLIB_UPDATE(netdev_analog_const)
33NETLIB_UPDATE(analog_const)
3434{
3535}
3636
37NETLIB_UPDATE_PARAM(netdev_analog_const)
37NETLIB_UPDATE_PARAM(analog_const)
3838{
3939    m_Q.initial(m_const.Value());
4040}
4141
42NETLIB_UPDATE(netdev_analog_callback)
42NETLIB_UPDATE(analog_callback)
4343{
4444    // FIXME: Remove after device cleanup
4545    if (!m_callback.isnull())
trunk/src/emu/netlist/devices/nld_system.h
r26109r26110
1717// ----------------------------------------------------------------------------------------
1818
1919#define NETDEV_TTL_CONST(_name, _v)                                                 \
20      NET_REGISTER_DEV(netdev_ttl_const, _name)                                   \
20      NET_REGISTER_DEV(ttl_const, _name)                                          \
2121      NETDEV_PARAM(_name.CONST, _v)
2222
2323#define NETDEV_ANALOG_CONST(_name, _v)                                              \
24      NET_REGISTER_DEV(netdev_analog_const, _name)                                \
24      NET_REGISTER_DEV(analog_const, _name)                                       \
2525      NETDEV_PARAM(_name.CONST, _v)
2626
2727// ----------------------------------------------------------------------------------------
2828// netdev_*_const
2929// ----------------------------------------------------------------------------------------
3030
31NETLIB_DEVICE_WITH_PARAMS(netdev_ttl_const,
32   ttl_output_t m_Q;
33   net_param_t m_const;
31NETLIB_DEVICE_WITH_PARAMS(ttl_const,
32   netlist_ttl_output_t m_Q;
33   netlist_param_t m_const;
3434);
3535
36NETLIB_DEVICE_WITH_PARAMS(netdev_analog_const,
37   analog_output_t m_Q;
38   net_param_t m_const;
36NETLIB_DEVICE_WITH_PARAMS(analog_const,
37   netlist_analog_output_t m_Q;
38   netlist_param_t m_const;
3939);
4040
4141// ----------------------------------------------------------------------------------------
42// netdev_mainclock
42// mainclock
4343// ----------------------------------------------------------------------------------------
4444
45NETLIB_DEVICE_WITH_PARAMS(netdev_mainclock,
46   ttl_output_t m_Q;
45NETLIB_DEVICE_WITH_PARAMS(mainclock,
46   netlist_ttl_output_t m_Q;
4747
48   net_param_t m_freq;
48   netlist_param_t m_freq;
4949   netlist_time m_inc;
5050
51   ATTR_HOT inline static void mc_update(net_net_t &net, const netlist_time curtime);
51   ATTR_HOT inline static void mc_update(netlist_net_t &net, const netlist_time curtime);
5252);
5353
5454// ----------------------------------------------------------------------------------------
5555// netdev_callback
5656// ----------------------------------------------------------------------------------------
5757
58class NETLIB_NAME(netdev_analog_callback) : public net_device_t
58class NETLIB_NAME(analog_callback) : public netlist_device_t
5959{
6060public:
61   NETLIB_NAME(netdev_analog_callback)()
62      : net_device_t() { }
61   NETLIB_NAME(analog_callback)()
62      : netlist_device_t() { }
6363
6464   ATTR_COLD void start()
6565   {
r26109r26110
7575
7676
7777private:
78   analog_input_t m_in;
78   netlist_analog_input_t m_in;
7979   netlist_output_delegate m_callback;
8080};
8181
trunk/src/mame/drivers/pong.c
r26109r26110
515515   required_device<dac_device> m_dac; /* just to have a sound device */
516516
517517   // sub devices
518   netlist_mame_device::required_output<logic_output_t> m_srst;
519   netlist_mame_device::required_output<analog_output_t> m_p_V0;
520   netlist_mame_device::required_output<analog_output_t> m_p_V1;
518   netlist_mame_device::required_output<netlist_logic_output_t> m_srst;
519   netlist_mame_device::required_output<netlist_analog_output_t> m_p_V0;
520   netlist_mame_device::required_output<netlist_analog_output_t> m_p_V1;
521521   netlist_mame_device::required_param m_sw1a;
522522   netlist_mame_device::required_param m_sw1b;
523523   netlist_mame_device::required_param m_p_R0;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team