Previous 199869 Revisions Next

r26296 Wednesday 20th November, 2013 at 01:16:46 UTC by Couriersud
Netlist: Added large signal diode model and fixed a number of bugs.
Things like

   // astable NAND Multivibrator
   NETDEV_R(R1, 1000)
   NETDEV_C(C1, 1e-6)
   TTL_7400_NAND(n1,R1.1,R1.1)
   TTL_7400_NAND(n2,R1.2,R1.2)
   NET_C(n1.Q, R1.2)
   NET_C(n2.Q, C1.1)
   NET_C(C1.2, R1.1)

now work, though too many proxy devices are currently needed.
[src/emu/netlist]nl_base.c nl_base.h nl_setup.c nl_setup.h
[src/emu/netlist/devices]net_lib.c net_lib.h nld_system.c nld_system.h
[src/mame/drivers]pong.c

trunk/src/emu/netlist/nl_setup.h
r26295r26296
1616//  MACROS / inline netlist definitions
1717//============================================================
1818
19#define NET_STR(_x) # _x
20
1921#define NET_ALIAS(_alias, _name)                                                    \
2022   netlist.register_alias(# _alias, # _name);
2123#define NET_NEW(_type , _name)  net_create_device_by_classname(NETLIB_NAME_STR(_type), netlist, # _name)
r26295r26296
2931#define NET_CONNECT(_name, _input, _output)                                         \
3032      netlist.register_link(# _name "." # _input, # _output);
3133#define NET_C(_input, _output)                                                      \
32        netlist.register_link(# _input , # _output);
34        netlist.register_link(NET_STR(_input) , NET_STR(_output));
3335#define NETDEV_PARAM(_name, _val)                                                   \
3436      netlist.find_param(# _name).initial(_val);
3537#define NETDEV_PARAMI(_name, _param, _val)                                           \
trunk/src/emu/netlist/devices/nld_system.h
r26295r26296
3434        NET_REGISTER_DEV(solver, _name)
3535
3636// ----------------------------------------------------------------------------------------
37// 2 terminal devices
38// ----------------------------------------------------------------------------------------
39
40#define NETDEV_R(_name, _R)                                                         \
41        NET_REGISTER_DEV(R, _name)                                                  \
42        NETDEV_PARAMI(_name, R, _R)
43
44#define NETDEV_C(_name, _C)                                                         \
45        NET_REGISTER_DEV(C, _name)                                                  \
46        NETDEV_PARAMI(_name, C, _C)
47
48/* Generic Diode */
49#define NETDEV_D(_name)                                                             \
50        NET_REGISTER_DEV(D, _name)
51
52// ----------------------------------------------------------------------------------------
3753// netdev_*_const
3854// ----------------------------------------------------------------------------------------
3955
r26295r26296
8197        netlist_ttl_input_t m_feedback;
8298        netlist_ttl_output_t m_Q;
8399
100        netlist_param_t m_freq;
101
84102        netlist_time m_inc;
85103        netlist_time m_last_step;
104
86105        netlist_list_t<netlist_terminal_t *> m_terms;
87106        netlist_list_t<netlist_terminal_t *> m_inps;
88107
r26295r26296
153172
154173    ATTR_HOT ATTR_ALIGN virtual void update_terminals()
155174    {
175        m_P.m_g = m_N.m_g = m_g;
156176        m_N.m_Idr = (m_P.net().Q_Analog() - m_V) * m_g + m_I;
157177        m_P.m_Idr = (m_N.net().Q_Analog() + m_V) * m_g - m_I;
158178        //printf("%f %f %f %f\n", m_N.m_Idr, m_P.m_Idr, m_N.net().Q_Analog(), m_P.net().Q_Analog());
r26295r26296
192212    virtual void update_param()
193213    {
194214        m_g = 1.0 / m_R.Value();
195        m_P.m_g = m_g;
196        m_N.m_g = m_g;
197215    }
198216
199217private:
r26295r26296
220238
221239    virtual void update_param()
222240    {
223        // set to some very big step time for now
224        // ==> large resistance
241        // set to some very small step time for now
225242        step_time(1e-9);
226243    }
227244
r26295r26296
233250private:
234251};
235252
253class nld_D : public nld_twoterm
254{
255public:
256    nld_D()
257    : nld_twoterm()
258    {
259    }
260
261    netlist_param_t m_Vt;
262    netlist_param_t m_Is;
263    netlist_param_t m_Rmin;
264
265    double m_VtInv;
266    double m_Vcrit;
267    double m_Vd;
268
269protected:
270    void start()
271    {
272        register_terminal("A", m_P);
273        register_terminal("K", m_N);
274
275        register_param("Vt", m_Vt, 0.0258);
276        register_param("Is", m_Is, 1e-15);
277        register_param("Rmin", m_Rmin, 1.4);
278        m_Vd = 0.7;
279    }
280
281    virtual void update_param()
282    {
283        m_Vcrit = m_Vt.Value() * log(m_Vt.Value() / m_Is.Value() / sqrt(2.0));
284        m_VtInv = 1.0 / m_Vt.Value();
285        NL_VERBOSE_OUT(("VCutoff: %f\n", m_Vcrit));
286    }
287
288    ATTR_HOT ATTR_ALIGN virtual void update_terminals()
289    {
290        const double nVd = m_P.net().Q_Analog()- m_N.net().Q_Analog();
291
292        //FIXME: Optimize cutoff case
293        m_Vd = (nVd > m_Vcrit) ? m_Vd + log((nVd - m_Vd) * m_VtInv + 1.0) * m_Vt.Value() : nVd;
294
295        const double eVDVt = exp(m_Vd * m_VtInv);
296        const double Id = m_Is.Value() * (eVDVt - 1.0);
297
298        m_g = m_Is.Value() * m_VtInv * eVDVt;
299
300        m_I = (Id - m_Vd * m_g);
301        //printf("Vd: %f %f %f %f\n", m_Vd, m_g, Id, m_I);
302
303        nld_twoterm::update_terminals();
304    }
305
306private:
307};
308
236309#endif /* NLD_SYSTEM_H_ */
trunk/src/emu/netlist/devices/net_lib.c
r26295r26296
951951{
952952    ENTRY(R,                    NETDEV_R)
953953    ENTRY(C,                    NETDEV_C)
954    ENTRY(D,                    NETDEV_D)
954955   ENTRY(ttl_const,            NETDEV_TTL_CONST)
955956   ENTRY(analog_const,         NETDEV_ANALOG_CONST)
956957   ENTRY(logic_input,          NETDEV_LOGIC_INPUT)
trunk/src/emu/netlist/devices/net_lib.h
r26295r26296
6464// this is a bad hack
6565#define USE_OLD7493 (0)
6666
67
6867// ----------------------------------------------------------------------------------------
69// 2 terminal devices
70// ----------------------------------------------------------------------------------------
71
72#define NETDEV_R(_name, _R)                                                         \
73        NET_REGISTER_DEV(R, _name)                                                  \
74        NETDEV_PARAMI(_name, R, _R)
75
76#define NETDEV_C(_name, _C)                                                         \
77        NET_REGISTER_DEV(C, _name)                                                  \
78        NETDEV_PARAMI(_name, C, _C)
79
80
81// ----------------------------------------------------------------------------------------
8268// Special chips
8369// ----------------------------------------------------------------------------------------
8470
trunk/src/emu/netlist/devices/nld_system.c
r26295r26296
8585    register_output("Q", m_Q);
8686    //register_input("FB", m_feedback);
8787
88    m_inc = netlist_time::from_hz(50000);
88    register_param("FREQ", m_freq, 50000);
89    m_inc = netlist_time::from_hz(m_freq.Value());
8990
9091    register_link_internal(m_feedback, m_Q, netlist_input_t::STATE_INP_ACTIVE);
9192    m_last_step = netlist_time::zero;
r26295r26296
9495
9596NETLIB_UPDATE_PARAM(solver)
9697{
97    //m_inc = netlist_time::from_hz(m_freq.Value()*2);
98    m_inc = netlist_time::from_hz(m_freq.Value());
9899}
99100
100101NETLIB_FUNC_VOID(solver, post_start, ())
101102{
103    NL_VERBOSE_OUT(("post start solver ...\n"));
102104    for (netlist_net_t **pn = m_nets.first(); pn != NULL; pn = m_nets.next(pn))
103105    {
106        NL_VERBOSE_OUT(("setting up net\n"));
104107        for (netlist_terminal_t *p = (*pn)->m_head; p != NULL; p = p->m_update_list_next)
105108        {
106109            switch (p->type())
107110            {
108111                case netlist_terminal_t::TERMINAL:
109112                    m_terms.add(p);
113                    NL_VERBOSE_OUT(("Added terminal\n"));
110114                    break;
111115                case netlist_terminal_t::INPUT:
112116                    m_inps.add(p);
117                    NL_VERBOSE_OUT(("Added input\n"));
113118                    break;
114119                default:
115120                    fatalerror("unhandled element found\n");
116121                    break;
117122            }
118123        }
124        if ((*pn)->m_head == NULL)
125        {
126            NL_VERBOSE_OUT(("Deleting net ...\n"));
127            netlist_net_t *to_delete = *pn;
128            m_nets.del(to_delete);
129            delete to_delete;
130            pn--;
131        }
119132    }
120133}
121134
r26295r26296
142155
143156        for (netlist_terminal_t *p = (*pn)->m_head; p != NULL; p = p->m_update_list_next)
144157        {
145            p->netdev().update_terminals();
146            gtot += p->m_g;
147            iIdr += p->m_Idr;
158            if (p->isType(netlist_terminal_t::TERMINAL))
159            {
160                p->netdev().update_terminals();
161                gtot += p->m_g;
162                iIdr += p->m_Idr;
163            }
148164        }
149165
150166        double new_val = iIdr / gtot;
r26295r26296
152168            resched = true;
153169        (*pn)->m_cur.Analog = (*pn)->m_new.Analog = new_val;
154170
155        //printf("New: %d %lld %f %f\n", ts_cnt, netlist().time().as_raw(), netlist().time().as_double(), new_val);
171        NL_VERBOSE_OUT(("Info: %d\n", (*pn)->m_num_cons));
172        NL_VERBOSE_OUT(("New: %lld %f %f\n", netlist().time().as_raw(), netlist().time().as_double(), new_val));
156173    }
157174    if (resched)
158175    {
r26295r26296
160177    }
161178    else
162179    {
163        /* update all inputs connected to this drive */
180        /* update all inputs connected */
164181        for (netlist_terminal_t **p = m_inps.first(); p != NULL; p = m_inps.next(p))
165182            (*p)->netdev().update_dev();
166183        /* step circuit */
trunk/src/emu/netlist/nl_base.c
r26295r26296
7979         update_time(e.time(), atime);
8080
8181         //if (FATAL_ERROR_AFTER_NS)
82         //   printf("%s\n", e.object().netdev()->name().cstr());
82         //   NL_VERBOSE_OUT(("%s\n", e.object().netdev()->name().cstr());
8383
8484         e.object().update_devs();
8585
r26295r26296
200200
201201netlist_device_t::~netlist_device_t()
202202{
203   //printf("~net_device_t\n");
203   //NL_VERBOSE_OUT(("~net_device_t\n");
204204}
205205
206206ATTR_COLD void netlist_device_t::init(netlist_setup_t &setup, const astring &name)
r26295r26296
218218
219219ATTR_COLD void netlist_device_t::register_output(netlist_core_device_t &dev, const astring &name, netlist_output_t &port)
220220{
221   m_setup->register_object(*this, dev, name, port, netlist_terminal_t::STATE_NONE);
221   m_setup->register_object(*this, dev, name, port, netlist_terminal_t::STATE_OUT);
222222}
223223
224224ATTR_COLD void netlist_device_t::register_terminal(const astring &name, netlist_terminal_t &port)
225225{
226    m_setup->register_object(*this,*this,name, port, netlist_terminal_t::STATE_NONE);
226    m_setup->register_object(*this,*this,name, port, netlist_terminal_t::STATE_INP_ACTIVE);
227227}
228228
229229ATTR_COLD void netlist_device_t::register_output(const astring &name, netlist_output_t &port)
230230{
231   m_setup->register_object(*this,*this,name, port, netlist_terminal_t::STATE_NONE);
231   m_setup->register_object(*this,*this,name, port, netlist_terminal_t::STATE_OUT);
232232}
233233
234234ATTR_COLD void netlist_device_t::register_input(netlist_core_device_t &dev, const astring &name, netlist_input_t &inp, netlist_input_t::state_e type)
r26295r26296
244244
245245ATTR_COLD void netlist_device_t::register_link_internal(netlist_core_device_t &dev, netlist_input_t &in, netlist_output_t &out, netlist_input_t::state_e aState)
246246{
247    in.init_terminal(dev);
248    in.set_state(aState);
247    in.init_terminal(dev, aState);
249248    // ensure we are not yet initialized ...
250249    if (!out.net().isRailNet())
251250        out.init_terminal(dev);
r26295r26296
262261{
263262   param.set_netdev(dev);
264263   param.initial(initialVal);
265   m_setup->register_object(*this, *this, name, param, netlist_terminal_t::STATE_NONE);
264   m_setup->register_object(*this, *this, name, param, netlist_terminal_t::STATE_NONEX);
266265}
267266
268267ATTR_COLD void netlist_device_t::register_param(const astring &name, netlist_param_t &param, double initialVal)
r26295r26296
290289
291290ATTR_COLD void netlist_net_t::merge_net(netlist_net_t *othernet)
292291{
292    NL_VERBOSE_OUT(("merging nets ...\n"));
293293    if (othernet == NULL)
294294        return; // Nothing to do
295295
r26295r26296
297297        fatalerror("Trying to merge to rail nets\n");
298298
299299    if (othernet->isRailNet())
300    {
301        NL_VERBOSE_OUT(("othernet is railnet\n"));
300302        othernet->merge_net(this);
303    }
301304    else
302305    {
303306        netlist_terminal_t *p = othernet->m_head;
304        if (p == NULL)
305            return;
306        if (m_head == NULL)
307        {
308            m_head = p;
309            m_head->set_net(*this);
310            p = p->m_update_list_next;
311        }
312307        while (p != NULL)
313308        {
314309            netlist_terminal_t *pn = p->m_update_list_next;
315            p->m_update_list_next = m_head;
316            p->set_net(*this);
317            m_head = p;
310            register_con(*p);
318311            p = pn;
319312        }
313
320314        othernet->m_head = NULL; // FIXME: othernet needs to be free'd from memory
321315    }
322316}
r26295r26296
324318ATTR_COLD void netlist_net_t::register_con(netlist_terminal_t &terminal)
325319{
326320    terminal.set_net(*this);
327    if (m_head == NULL)
328        m_head = &terminal;
329    else
330    {
331        terminal.m_update_list_next = m_head;
332        m_head = &terminal;
333    }
321
322    terminal.m_update_list_next = m_head;
323    m_head = &terminal;
334324    m_num_cons++;
335325
336326    if (terminal.state() != netlist_input_t::STATE_INP_PASSIVE)
r26295r26296
387377// netlist_terminal_t
388378// ----------------------------------------------------------------------------------------
389379
390ATTR_COLD void netlist_terminal_t::init_terminal(netlist_core_device_t &dev)
380ATTR_COLD void netlist_terminal_t::init_terminal(netlist_core_device_t &dev, const state_e astate)
391381{
392382   m_netdev = &dev;
383   set_state(astate);
393384   init_object(dev.netlist());
394385}
395386
r26295r26296
413404
414405ATTR_COLD void netlist_output_t::init_terminal(netlist_core_device_t &dev)
415406{
416    netlist_terminal_t::init_terminal(dev);
407    netlist_terminal_t::init_terminal(dev, STATE_OUT);
417408    net().init_object(dev.netlist());
418409    net().register_railterminal(*this);
419410}
trunk/src/emu/netlist/nl_base.h
r26295r26296
287287        STATE_INP_ACTIVE = 1,
288288        STATE_INP_HL = 2,
289289        STATE_INP_LH = 4,
290        STATE_NONE = 128
290        STATE_OUT = 128,
291        STATE_NONEX = 256
291292    };
292293
293294   ATTR_COLD netlist_terminal_t(const type_t atype, const family_t afamily)
r26295r26296
297298    , m_update_list_next(NULL)
298299   , m_netdev(NULL)
299300    , m_net(NULL)
300    , m_state(STATE_NONE)
301    , m_state(STATE_NONEX)
301302   {}
302303
303304    ATTR_COLD netlist_terminal_t()
r26295r26296
306307    , m_update_list_next(NULL)
307308    , m_netdev(NULL)
308309    , m_net(NULL)
309    , m_state(STATE_NONE)
310    , m_state(STATE_NONEX)
310311    {}
311312
312   ATTR_COLD virtual void init_terminal(netlist_core_device_t &dev);
313   ATTR_COLD void init_terminal(netlist_core_device_t &dev, const state_e astate);
313314
314315    ATTR_COLD void set_net(netlist_net_t &anet)   { m_net = &anet; }
315316    ATTR_COLD bool has_net() { return (m_net != NULL); }
r26295r26296
319320
320321    ATTR_HOT inline const bool is_state(const state_e astate) const { return (m_state == astate); }
321322    ATTR_HOT inline const state_e state() const { return m_state; }
322    ATTR_HOT inline void set_state(const state_e astate) { m_state = astate; }
323    ATTR_HOT inline void set_state(const state_e astate)
324    {
325        assert(astate != STATE_NONEX);
326        m_state = astate;
327    }
323328
324329    ATTR_HOT inline netlist_core_device_t & RESTRICT netdev() const { return *m_netdev; }
325330
r26295r26296
522527
523528   netlist_output_t(const type_t atype, const family_t afamily);
524529
525    ATTR_COLD virtual void init_terminal(netlist_core_device_t &dev);
530    ATTR_COLD void init_terminal(netlist_core_device_t &dev);
526531
527532   double m_low_V;
528533   double m_high_V;
r26295r26296
576581      : netlist_output_t(OUTPUT, ANALOG)
577582    {
578583       net().m_cur.Analog = 0.0;
579       net().m_new.Analog = 0.0;
584       net().m_new.Analog = 99.0;
580585    }
581586
582587    ATTR_COLD void initial(const double val)
583588    {
584589        net().m_cur.Analog = val;
585        net().m_new.Analog = val;
590        net().m_new.Analog = 99.0;
586591    }
587592
588593   ATTR_HOT inline void set_Q(const double newQ, const netlist_time &delay)
r26295r26296
830835protected:
831836   void start()
832837   {
833      m_I.init_terminal(*this);
838      m_I.init_terminal(*this, netlist_terminal_t::STATE_INP_ACTIVE);
834839
835840      m_Q.init_terminal(*this);
836841      m_Q.initial(1);
r26295r26296
842847         OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(1));
843848      else if (m_I.Q_Analog() < m_I.m_low_thresh_V)
844849         OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(1));
850      else
851          OUTLOGIC(m_Q, m_Q.net().last_Q(), NLTIME_FROM_NS(1));
845852   }
846853
847854};
r26295r26296
870877protected:
871878   void start()
872879   {
873      m_I.init_terminal(*this);
880      m_I.init_terminal(*this, netlist_terminal_t::STATE_INP_ACTIVE);
874881      m_Q.init_terminal(*this);
875882      m_Q.initial(0);
876883   }
trunk/src/emu/netlist/nl_setup.c
r26295r26296
146146                astring temp = dev.name();
147147                temp.cat(".");
148148                temp.cat(name);
149                term.init_terminal(upd_dev);
150                term.set_state(state);
149                if (obj.isType(netlist_terminal_t::OUTPUT))
150                    dynamic_cast<netlist_output_t &>(term).init_terminal(upd_dev);
151                else
152                    term.init_terminal(upd_dev, state);
153
151154                if (!(m_terminals.add(temp, &term, false)==TMERR_NONE))
152155                    fatalerror("Error adding %s %s to terminal list\n", objtype_as_astr(term).cstr(), temp.cstr());
153156                NL_VERBOSE_OUT(("%s %s\n", objtype_as_astr(term).cstr(), name.cstr()));
r26295r26296
278281{
279282    if (inp.isFamily(netlist_terminal_t::ANALOG))
280283    {
281        connect_terminals(term, inp);
284        connect_terminals(inp, term);
282285    }
283286    else if (inp.isFamily(netlist_terminal_t::LOGIC))
284287    {
285        //printf("here 1\n");
288        NL_VERBOSE_OUT(("connect_terminal_input: connecting proxy\n"));
286289        nld_a_to_d_proxy *proxy = new nld_a_to_d_proxy(inp);
287290        astring x = "";
288291        x.printf("proxy_da_%d", m_proxy_cnt++);
r26295r26296
292295        connect_terminals(term, proxy->m_I);
293296
294297        if (inp.has_net())
298            //fatalerror("logic inputs can only belong to one net!\n");
295299            proxy->m_Q.net().merge_net(&inp.net());
296300        else
297301            proxy->m_Q.net().register_con(inp);
r26295r26296
316320    }
317321    else if (out.isFamily(netlist_terminal_t::LOGIC))
318322    {
319        //printf("here 1\n");
323        NL_VERBOSE_OUT(("connect_terminal_output: connecting proxy\n"));
320324        nld_d_to_a_proxy *proxy = new nld_d_to_a_proxy(out);
321325        astring x = "";
322326        x.printf("proxy_da_%d", m_proxy_cnt++);
r26295r26296
336340    }
337341}
338342
339void netlist_setup_t::connect_terminals(netlist_terminal_t &in, netlist_terminal_t &out)
343void netlist_setup_t::connect_terminals(netlist_terminal_t &t1, netlist_terminal_t &t2)
340344{
341    assert(in.isType(netlist_terminal_t::TERMINAL));
342    assert(out.isType(netlist_terminal_t::TERMINAL));
345    //assert(in.isType(netlist_terminal_t::TERMINAL));
346    //assert(out.isType(netlist_terminal_t::TERMINAL));
343347
344    if (in.has_net() && out.has_net())
348    if (t1.has_net() && t2.has_net())
345349    {
346        in.net().merge_net(&out.net());
350        NL_VERBOSE_OUT(("T2 and T1 have net\n"));
351        t1.net().merge_net(&t2.net());
347352    }
348    else if (out.has_net())
353    else if (t2.has_net())
349354    {
350        out.net().register_con(in);
355        NL_VERBOSE_OUT(("T2 has net\n"));
356        t2.net().register_con(t1);
351357    }
352    else if (in.has_net())
358    else if (t1.has_net())
353359    {
354        in.net().register_con(out);
360        NL_VERBOSE_OUT(("T1 has net\n"));
361        t1.net().register_con(t2);
355362    }
356363    else
357364    {
358365        NL_VERBOSE_OUT(("adding net ...\n"));
359366        netlist_net_t *anet =  new netlist_net_t(netlist_object_t::NET, netlist_object_t::ANALOG);
360        in.set_net(*anet);
367        t1.set_net(*anet);
361368        m_netlist.solver()->m_nets.add(anet);
362        in.net().init_object(netlist());
363        in.net().register_con(out);
364        in.net().register_con(in);
369        t1.net().init_object(netlist());
370        t1.net().register_con(t2);
371        t1.net().register_con(t1);
365372    }
366373}
367374
r26295r26296
390397        netlist_terminal_t &t1 = find_terminal(t1s);
391398        netlist_terminal_t &t2 = find_terminal(t2s);
392399
400        NL_VERBOSE_OUT(("Connecting %s to %s\n", t1s.cstr(), t2s.cstr()));
401
393402        // FIXME: amend device design so that warnings can be turned into errors
394403        //        Only variable inputs have this issue
395404        if (t1.isType(netlist_terminal_t::OUTPUT) && t2.isType(netlist_terminal_t::INPUT))
trunk/src/mame/drivers/pong.c
r26295r26296
467467
468468    NETDEV_SOLVER(Solver)
469469    NETDEV_ANALOG_CONST(V5, 5)
470    NETDEV_ANALOG_CONST(V1, 1)
470471    NETDEV_ANALOG_CONST(V0, 0)
471#if 1
472#if 0
472473    NETDEV_R(R1, 10)
473474    NETDEV_R(R2, 10)
474475    NETDEV_R(R3, 10)
r26295r26296
477478    NET_C(R2.2, R3.1)
478479    NET_C(R3.2, V0)
479480#endif
480#if 1
481#if 0
481482    NETDEV_R(R4, 1000)
482483    NETDEV_C(C1, 1e-6)
483484    NET_C(V5,R4.1)
r26295r26296
485486    NET_C(C1.2, V0)
486487    //NETDEV_LOG(log1, C1.1)
487488#endif
489
490
491#define tt(_n) \
492    NETDEV_R(R ## _n, 1000) \
493   NETDEV_D(D ## _n) \
494    NET_C(V5, R ## _n.1) \
495    NET_C(R ## _n.2, D ## _n.A) \
496    NET_C(D ## _n.K, V0)
497
498/*    tt(20)
499    tt(21)
500    tt(22)
501    tt(23)
502    tt(24)
503    tt(25)
504    tt(26)
505    tt(27)
506    tt(28)
507    tt(29)
508*/
509#if 0
510    NETDEV_R(R5, 1000)
511    NETDEV_D(D1)
512    NET_C(V5, R5.1)
513    NET_C(R5.2, D1.A)
514    NET_C(D1.K, V0)
515    //NETDEV_LOG(log1, D1.A)
516#endif
517
518    // astable NAND Multivibrator
519    NETDEV_R(R1, 1000)
520    NETDEV_C(C1, 1e-6)
521    TTL_7400_NAND(n1,R1.1,R1.1)
522    TTL_7400_NAND(n2,R1.2,R1.2)
523    NET_C(n1.Q, R1.2)
524    NET_C(n2.Q, C1.1)
525    NET_C(C1.2, R1.1)
526    //NETDEV_LOG(log2, C1.2)
527    //NETDEV_LOG(log2, n1.Q)
528    //NETDEV_LOG(log3, n2.Q)
488529NETLIST_END
489530
490531static NETLIST_START(pong)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team