Previous 199869 Revisions Next

r26407 Monday 25th November, 2013 at 00:31:54 UTC by Couriersud
Netlist: fixed crash when using analog chips. Did some preparation work to generalize internal links.
[src/emu/netlist]nl_base.c nl_base.h nl_lists.h nl_setup.c nl_setup.h
[src/emu/netlist/devices]nld_system.c

trunk/src/emu/netlist/nl_base.h
r26406r26407
250250   virtual ~netlist_object_t();
251251
252252   ATTR_COLD void init_object(netlist_base_t &nl, const pstring &aname);
253    ATTR_COLD bool isInitalized() { return (m_netlist != NULL); }
253254
254255    ATTR_COLD const pstring &name() const;
255256
trunk/src/emu/netlist/nl_setup.c
r26406r26407
410410    }
411411}
412412
413void netlist_setup_t::connect(netlist_terminal_t &t1, netlist_terminal_t &t2)
414{
415    NL_VERBOSE_OUT(("Connecting %s to %s\n", t1.name().cstr(), t2s.name().cstr()));
416
417    // FIXME: amend device design so that warnings can be turned into errors
418    //        Only variable inputs have this issue
419    if (t1.isType(netlist_terminal_t::OUTPUT) && t2.isType(netlist_terminal_t::INPUT))
420    {
421        if (t2.has_net())
422            mame_printf_warning("Input %s already connected\n", t2.name().cstr());
423        connect_input_output(dynamic_cast<netlist_input_t &>(t2), dynamic_cast<netlist_output_t &>(t1));
424    }
425    else if (t1.isType(netlist_terminal_t::INPUT) && t2.isType(netlist_terminal_t::OUTPUT))
426    {
427        if (t1.has_net())
428            mame_printf_warning("Input %s already connected\n", t1.name().cstr());
429        connect_input_output(dynamic_cast<netlist_input_t &>(t1), dynamic_cast<netlist_output_t &>(t2));
430    }
431    else if (t1.isType(netlist_terminal_t::OUTPUT) && t2.isType(netlist_terminal_t::TERMINAL))
432    {
433        connect_terminal_output(dynamic_cast<netlist_terminal_t &>(t2), dynamic_cast<netlist_output_t &>(t1));
434    }
435    else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::OUTPUT))
436    {
437        connect_terminal_output(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_output_t &>(t2));
438    }
439    else if (t1.isType(netlist_terminal_t::INPUT) && t2.isType(netlist_terminal_t::TERMINAL))
440    {
441        connect_terminal_input(dynamic_cast<netlist_terminal_t &>(t2), dynamic_cast<netlist_input_t &>(t1));
442    }
443    else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::INPUT))
444    {
445        connect_terminal_input(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_input_t &>(t2));
446    }
447    else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::TERMINAL))
448    {
449        connect_terminals(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_terminal_t &>(t2));
450    }
451    else
452        fatalerror("Connecting %s to %s not supported!\n", t1.name().cstr(), t2.name().cstr());
453}
454
413455void netlist_setup_t::resolve_inputs(void)
414456{
415457    NL_VERBOSE_OUT(("Searching for mainclock and solver ...\n"));
r26406r26407
435477        netlist_terminal_t &t1 = find_terminal(t1s);
436478        netlist_terminal_t &t2 = find_terminal(t2s);
437479
438        NL_VERBOSE_OUT(("Connecting %s to %s\n", t1s.cstr(), t2s.cstr()));
439
440        // FIXME: amend device design so that warnings can be turned into errors
441        //        Only variable inputs have this issue
442        if (t1.isType(netlist_terminal_t::OUTPUT) && t2.isType(netlist_terminal_t::INPUT))
443        {
444            if (t2.has_net())
445                mame_printf_warning("Input %s already connected\n", t2s.cstr());
446            connect_input_output(dynamic_cast<netlist_input_t &>(t2), dynamic_cast<netlist_output_t &>(t1));
447        }
448        else if (t1.isType(netlist_terminal_t::INPUT) && t2.isType(netlist_terminal_t::OUTPUT))
449        {
450            if (t1.has_net())
451                mame_printf_warning("Input %s already connected\n", t1s.cstr());
452            connect_input_output(dynamic_cast<netlist_input_t &>(t1), dynamic_cast<netlist_output_t &>(t2));
453        }
454        else if (t1.isType(netlist_terminal_t::OUTPUT) && t2.isType(netlist_terminal_t::TERMINAL))
455        {
456            connect_terminal_output(dynamic_cast<netlist_terminal_t &>(t2), dynamic_cast<netlist_output_t &>(t1));
457        }
458        else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::OUTPUT))
459        {
460            connect_terminal_output(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_output_t &>(t2));
461        }
462        else if (t1.isType(netlist_terminal_t::INPUT) && t2.isType(netlist_terminal_t::TERMINAL))
463        {
464            connect_terminal_input(dynamic_cast<netlist_terminal_t &>(t2), dynamic_cast<netlist_input_t &>(t1));
465        }
466        else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::INPUT))
467        {
468            connect_terminal_input(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_input_t &>(t2));
469        }
470        else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::TERMINAL))
471        {
472            connect_terminals(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_terminal_t &>(t2));
473        }
474        else
475            fatalerror("Connecting %s to %s not supported!\n", t1s.cstr(), t2s.cstr());
480        connect(t1, t2);
476481    }
477482
478483    /* print all outputs */
trunk/src/emu/netlist/nl_lists.h
r26406r26407
6565        {
6666            if (i->object() == elem)
6767            {
68                while (i <= m_ptr)
68                while (i < m_ptr)
6969                {
7070                    *i = *(i+1);
7171                    i++;
trunk/src/emu/netlist/nl_setup.h
r26406r26407
108108    void register_param(const pstring &param, const double value);
109109
110110    void register_object(netlist_device_t &dev, netlist_core_device_t &upd_dev, const pstring &name, netlist_object_t &obj, netlist_input_t::state_e state);
111    void connect(netlist_terminal_t &t1, netlist_terminal_t &t2);
111112
112113    netlist_terminal_t &find_terminal(const pstring &outname_in);
113114    netlist_terminal_t &find_terminal(const pstring &outname_in, netlist_object_t::type_t atype);
trunk/src/emu/netlist/devices/nld_system.c
r26406r26407
103103    net_list_t::entry_t *p = m_nets.first();
104104    while (p != NULL)
105105    {
106        net_list_t::entry_t *pn = m_nets.next(pn);
107        delete pn->object();
106        net_list_t::entry_t *pn = m_nets.next(p);
107        delete p->object();
108108        p = pn;
109109    }
110110}
trunk/src/emu/netlist/nl_base.c
r26406r26407
292292   register_input(*this, name, inp, type);
293293}
294294
295static void init_term(netlist_core_device_t &dev, netlist_terminal_t &term, netlist_input_t::state_e aState)
296{
297    if (!term.isInitalized())
298    {
299        switch (term.type())
300        {
301            case netlist_terminal_t::OUTPUT:
302                dynamic_cast<netlist_output_t &>(term).init_object(dev, "internal output");
303                break;
304            case netlist_terminal_t::INPUT:
305                dynamic_cast<netlist_input_t &>(term).init_object(dev, "internal input", aState);
306                break;
307            case netlist_terminal_t::TERMINAL:
308                dynamic_cast<netlist_terminal_t &>(term).init_object(dev, "internal terminal", aState);
309                break;
310            default:
311                fatalerror("Unknown terminal type");
312        }
313    }
314}
315
295316// FIXME: Revise internal links ...
296317ATTR_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)
297318{
298    in.init_object(dev, "internal input", aState);
299    // ensure we are not yet initialized ...
300    if (!out.net().isRailNet())
301        out.init_object(dev, "internal output");
302   //if (in.state() != net_input_t::INP_STATE_PASSIVE)
303      out.net().register_con(in);
319    init_term(dev, in, aState);
320    init_term(dev, out, aState);
321    m_setup->connect(in, out);
304322}
305323
306324ATTR_COLD void netlist_device_t::register_link_internal(netlist_input_t &in, netlist_output_t &out, netlist_input_t::state_e aState)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team