mirror of
https://github.com/holub/mame
synced 2025-07-04 01:18:59 +03:00
Netlist: fixed crash when using analog chips. Did some preparation work to generalize internal links.
This commit is contained in:
parent
6e7e019afd
commit
d05677b0e6
@ -103,8 +103,8 @@ NETLIB_NAME(solver)::~NETLIB_NAME(solver)()
|
|||||||
net_list_t::entry_t *p = m_nets.first();
|
net_list_t::entry_t *p = m_nets.first();
|
||||||
while (p != NULL)
|
while (p != NULL)
|
||||||
{
|
{
|
||||||
net_list_t::entry_t *pn = m_nets.next(pn);
|
net_list_t::entry_t *pn = m_nets.next(p);
|
||||||
delete pn->object();
|
delete p->object();
|
||||||
p = pn;
|
p = pn;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -292,15 +292,33 @@ ATTR_COLD void netlist_device_t::register_input(const pstring &name, netlist_inp
|
|||||||
register_input(*this, name, inp, type);
|
register_input(*this, name, inp, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void init_term(netlist_core_device_t &dev, netlist_terminal_t &term, netlist_input_t::state_e aState)
|
||||||
|
{
|
||||||
|
if (!term.isInitalized())
|
||||||
|
{
|
||||||
|
switch (term.type())
|
||||||
|
{
|
||||||
|
case netlist_terminal_t::OUTPUT:
|
||||||
|
dynamic_cast<netlist_output_t &>(term).init_object(dev, "internal output");
|
||||||
|
break;
|
||||||
|
case netlist_terminal_t::INPUT:
|
||||||
|
dynamic_cast<netlist_input_t &>(term).init_object(dev, "internal input", aState);
|
||||||
|
break;
|
||||||
|
case netlist_terminal_t::TERMINAL:
|
||||||
|
dynamic_cast<netlist_terminal_t &>(term).init_object(dev, "internal terminal", aState);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fatalerror("Unknown terminal type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME: Revise internal links ...
|
// FIXME: Revise internal links ...
|
||||||
ATTR_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)
|
ATTR_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)
|
||||||
{
|
{
|
||||||
in.init_object(dev, "internal input", aState);
|
init_term(dev, in, aState);
|
||||||
// ensure we are not yet initialized ...
|
init_term(dev, out, aState);
|
||||||
if (!out.net().isRailNet())
|
m_setup->connect(in, out);
|
||||||
out.init_object(dev, "internal output");
|
|
||||||
//if (in.state() != net_input_t::INP_STATE_PASSIVE)
|
|
||||||
out.net().register_con(in);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ATTR_COLD void netlist_device_t::register_link_internal(netlist_input_t &in, netlist_output_t &out, netlist_input_t::state_e aState)
|
ATTR_COLD void netlist_device_t::register_link_internal(netlist_input_t &in, netlist_output_t &out, netlist_input_t::state_e aState)
|
||||||
|
@ -250,6 +250,7 @@ public:
|
|||||||
virtual ~netlist_object_t();
|
virtual ~netlist_object_t();
|
||||||
|
|
||||||
ATTR_COLD void init_object(netlist_base_t &nl, const pstring &aname);
|
ATTR_COLD void init_object(netlist_base_t &nl, const pstring &aname);
|
||||||
|
ATTR_COLD bool isInitalized() { return (m_netlist != NULL); }
|
||||||
|
|
||||||
ATTR_COLD const pstring &name() const;
|
ATTR_COLD const pstring &name() const;
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ public:
|
|||||||
{
|
{
|
||||||
if (i->object() == elem)
|
if (i->object() == elem)
|
||||||
{
|
{
|
||||||
while (i <= m_ptr)
|
while (i < m_ptr)
|
||||||
{
|
{
|
||||||
*i = *(i+1);
|
*i = *(i+1);
|
||||||
i++;
|
i++;
|
||||||
|
@ -410,6 +410,48 @@ void netlist_setup_t::connect_terminals(netlist_terminal_t &t1, netlist_terminal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void netlist_setup_t::connect(netlist_terminal_t &t1, netlist_terminal_t &t2)
|
||||||
|
{
|
||||||
|
NL_VERBOSE_OUT(("Connecting %s to %s\n", t1.name().cstr(), t2s.name().cstr()));
|
||||||
|
|
||||||
|
// FIXME: amend device design so that warnings can be turned into errors
|
||||||
|
// Only variable inputs have this issue
|
||||||
|
if (t1.isType(netlist_terminal_t::OUTPUT) && t2.isType(netlist_terminal_t::INPUT))
|
||||||
|
{
|
||||||
|
if (t2.has_net())
|
||||||
|
mame_printf_warning("Input %s already connected\n", t2.name().cstr());
|
||||||
|
connect_input_output(dynamic_cast<netlist_input_t &>(t2), dynamic_cast<netlist_output_t &>(t1));
|
||||||
|
}
|
||||||
|
else if (t1.isType(netlist_terminal_t::INPUT) && t2.isType(netlist_terminal_t::OUTPUT))
|
||||||
|
{
|
||||||
|
if (t1.has_net())
|
||||||
|
mame_printf_warning("Input %s already connected\n", t1.name().cstr());
|
||||||
|
connect_input_output(dynamic_cast<netlist_input_t &>(t1), dynamic_cast<netlist_output_t &>(t2));
|
||||||
|
}
|
||||||
|
else if (t1.isType(netlist_terminal_t::OUTPUT) && t2.isType(netlist_terminal_t::TERMINAL))
|
||||||
|
{
|
||||||
|
connect_terminal_output(dynamic_cast<netlist_terminal_t &>(t2), dynamic_cast<netlist_output_t &>(t1));
|
||||||
|
}
|
||||||
|
else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::OUTPUT))
|
||||||
|
{
|
||||||
|
connect_terminal_output(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_output_t &>(t2));
|
||||||
|
}
|
||||||
|
else if (t1.isType(netlist_terminal_t::INPUT) && t2.isType(netlist_terminal_t::TERMINAL))
|
||||||
|
{
|
||||||
|
connect_terminal_input(dynamic_cast<netlist_terminal_t &>(t2), dynamic_cast<netlist_input_t &>(t1));
|
||||||
|
}
|
||||||
|
else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::INPUT))
|
||||||
|
{
|
||||||
|
connect_terminal_input(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_input_t &>(t2));
|
||||||
|
}
|
||||||
|
else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::TERMINAL))
|
||||||
|
{
|
||||||
|
connect_terminals(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_terminal_t &>(t2));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fatalerror("Connecting %s to %s not supported!\n", t1.name().cstr(), t2.name().cstr());
|
||||||
|
}
|
||||||
|
|
||||||
void netlist_setup_t::resolve_inputs(void)
|
void netlist_setup_t::resolve_inputs(void)
|
||||||
{
|
{
|
||||||
NL_VERBOSE_OUT(("Searching for mainclock and solver ...\n"));
|
NL_VERBOSE_OUT(("Searching for mainclock and solver ...\n"));
|
||||||
@ -435,44 +477,7 @@ void netlist_setup_t::resolve_inputs(void)
|
|||||||
netlist_terminal_t &t1 = find_terminal(t1s);
|
netlist_terminal_t &t1 = find_terminal(t1s);
|
||||||
netlist_terminal_t &t2 = find_terminal(t2s);
|
netlist_terminal_t &t2 = find_terminal(t2s);
|
||||||
|
|
||||||
NL_VERBOSE_OUT(("Connecting %s to %s\n", t1s.cstr(), t2s.cstr()));
|
connect(t1, t2);
|
||||||
|
|
||||||
// FIXME: amend device design so that warnings can be turned into errors
|
|
||||||
// Only variable inputs have this issue
|
|
||||||
if (t1.isType(netlist_terminal_t::OUTPUT) && t2.isType(netlist_terminal_t::INPUT))
|
|
||||||
{
|
|
||||||
if (t2.has_net())
|
|
||||||
mame_printf_warning("Input %s already connected\n", t2s.cstr());
|
|
||||||
connect_input_output(dynamic_cast<netlist_input_t &>(t2), dynamic_cast<netlist_output_t &>(t1));
|
|
||||||
}
|
|
||||||
else if (t1.isType(netlist_terminal_t::INPUT) && t2.isType(netlist_terminal_t::OUTPUT))
|
|
||||||
{
|
|
||||||
if (t1.has_net())
|
|
||||||
mame_printf_warning("Input %s already connected\n", t1s.cstr());
|
|
||||||
connect_input_output(dynamic_cast<netlist_input_t &>(t1), dynamic_cast<netlist_output_t &>(t2));
|
|
||||||
}
|
|
||||||
else if (t1.isType(netlist_terminal_t::OUTPUT) && t2.isType(netlist_terminal_t::TERMINAL))
|
|
||||||
{
|
|
||||||
connect_terminal_output(dynamic_cast<netlist_terminal_t &>(t2), dynamic_cast<netlist_output_t &>(t1));
|
|
||||||
}
|
|
||||||
else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::OUTPUT))
|
|
||||||
{
|
|
||||||
connect_terminal_output(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_output_t &>(t2));
|
|
||||||
}
|
|
||||||
else if (t1.isType(netlist_terminal_t::INPUT) && t2.isType(netlist_terminal_t::TERMINAL))
|
|
||||||
{
|
|
||||||
connect_terminal_input(dynamic_cast<netlist_terminal_t &>(t2), dynamic_cast<netlist_input_t &>(t1));
|
|
||||||
}
|
|
||||||
else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::INPUT))
|
|
||||||
{
|
|
||||||
connect_terminal_input(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_input_t &>(t2));
|
|
||||||
}
|
|
||||||
else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::TERMINAL))
|
|
||||||
{
|
|
||||||
connect_terminals(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_terminal_t &>(t2));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
fatalerror("Connecting %s to %s not supported!\n", t1s.cstr(), t2s.cstr());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* print all outputs */
|
/* print all outputs */
|
||||||
|
@ -108,6 +108,7 @@ public:
|
|||||||
void register_param(const pstring ¶m, const double value);
|
void register_param(const pstring ¶m, const double value);
|
||||||
|
|
||||||
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);
|
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);
|
||||||
|
void connect(netlist_terminal_t &t1, netlist_terminal_t &t2);
|
||||||
|
|
||||||
netlist_terminal_t &find_terminal(const pstring &outname_in);
|
netlist_terminal_t &find_terminal(const pstring &outname_in);
|
||||||
netlist_terminal_t &find_terminal(const pstring &outname_in, netlist_object_t::type_t atype);
|
netlist_terminal_t &find_terminal(const pstring &outname_in, netlist_object_t::type_t atype);
|
||||||
|
Loading…
Reference in New Issue
Block a user