mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
An output should have at most one d-to-a proxy connected to it. No WN
This commit is contained in:
parent
6f9f359229
commit
247b525c49
@ -593,6 +593,18 @@ ATTR_COLD void netlist_output_t::init_object(netlist_core_device_t &dev, const p
|
||||
net().register_railterminal(*this);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// netlist_logic_output_t
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
ATTR_COLD netlist_logic_output_t::netlist_logic_output_t()
|
||||
: netlist_output_t(OUTPUT, LOGIC), m_proxy(NULL)
|
||||
{
|
||||
// Default to TTL
|
||||
m_low_V = 0.1; // these depend on sinked/sourced current. Values should be suitable for typical applications.
|
||||
m_high_V = 4.8;
|
||||
}
|
||||
|
||||
ATTR_COLD void netlist_logic_output_t::initial(const netlist_sig_t val)
|
||||
{
|
||||
net().m_cur.Q = val;
|
||||
@ -600,14 +612,6 @@ ATTR_COLD void netlist_logic_output_t::initial(const netlist_sig_t val)
|
||||
net().m_last.Q = !val;
|
||||
}
|
||||
|
||||
ATTR_COLD netlist_logic_output_t::netlist_logic_output_t()
|
||||
: netlist_output_t(OUTPUT, LOGIC)
|
||||
{
|
||||
// Default to TTL
|
||||
m_low_V = 0.1; // these depend on sinked/sourced current. Values should be suitable for typical applications.
|
||||
m_high_V = 4.8;
|
||||
}
|
||||
|
||||
ATTR_COLD void netlist_logic_output_t::set_levels(const double low, const double high)
|
||||
{
|
||||
m_low_V = low;
|
||||
|
@ -247,6 +247,7 @@ class netlist_base_t;
|
||||
class netlist_matrix_solver_t;
|
||||
class NETLIB_NAME(solver);
|
||||
class NETLIB_NAME(mainclock);
|
||||
class nld_d_to_a_proxy;
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// netlist_object_t
|
||||
@ -711,6 +712,9 @@ public:
|
||||
ATTR_COLD void initial(const netlist_sig_t val);
|
||||
ATTR_COLD void set_levels(const double low, const double high);
|
||||
|
||||
ATTR_COLD nld_d_to_a_proxy *get_proxy() { return m_proxy; }
|
||||
ATTR_COLD void set_proxy(nld_d_to_a_proxy *proxy) { m_proxy = proxy; }
|
||||
|
||||
ATTR_HOT inline void set_Q(const netlist_sig_t newQ, const netlist_time delay)
|
||||
{
|
||||
if (EXPECTED(newQ != net().m_new.Q))
|
||||
@ -719,6 +723,8 @@ public:
|
||||
net().push_to_queue(delay);
|
||||
}
|
||||
}
|
||||
private:
|
||||
nld_d_to_a_proxy *m_proxy;
|
||||
};
|
||||
|
||||
class netlist_ttl_output_t : public netlist_logic_output_t
|
||||
|
@ -349,6 +349,29 @@ netlist_param_t *netlist_setup_t::find_param(const pstring ¶m_in, bool requi
|
||||
return ret;
|
||||
}
|
||||
|
||||
nld_d_to_a_proxy *netlist_setup_t::get_d_a_proxy(netlist_output_t &out)
|
||||
{
|
||||
assert(out.isFamily(netlist_terminal_t::LOGIC));
|
||||
|
||||
netlist_logic_output_t &out_cast = dynamic_cast<netlist_logic_output_t &>(out);
|
||||
nld_d_to_a_proxy *proxy = out_cast.get_proxy();
|
||||
|
||||
if (proxy == NULL)
|
||||
{
|
||||
// create a new one ...
|
||||
proxy = new nld_d_to_a_proxy(out);
|
||||
pstring x = pstring::sprintf("proxy_da_%d", m_proxy_cnt);
|
||||
m_proxy_cnt++;
|
||||
|
||||
proxy->init(netlist(), x);
|
||||
register_dev(proxy, x);
|
||||
|
||||
out.net().register_con(proxy->m_I);
|
||||
out_cast.set_proxy(proxy);
|
||||
|
||||
}
|
||||
return proxy;
|
||||
}
|
||||
|
||||
void netlist_setup_t::connect_input_output(netlist_input_t &in, netlist_output_t &out)
|
||||
{
|
||||
@ -367,15 +390,9 @@ void netlist_setup_t::connect_input_output(netlist_input_t &in, netlist_output_t
|
||||
}
|
||||
else if (out.isFamily(netlist_terminal_t::LOGIC) && in.isFamily(netlist_terminal_t::ANALOG))
|
||||
{
|
||||
nld_d_to_a_proxy *proxy = new nld_d_to_a_proxy(out);
|
||||
pstring x = pstring::sprintf("proxy_da_%d", m_proxy_cnt);
|
||||
m_proxy_cnt++;
|
||||
nld_d_to_a_proxy *proxy = get_d_a_proxy(out);
|
||||
|
||||
proxy->init(netlist(), x);
|
||||
register_dev(proxy, x);
|
||||
|
||||
proxy->m_Q.net().register_con(in);
|
||||
out.net().register_con(proxy->m_I);
|
||||
proxy->m_Q.net().register_con(in);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -428,14 +445,7 @@ void netlist_setup_t::connect_terminal_output(netlist_terminal_t &in, netlist_ou
|
||||
else if (out.isFamily(netlist_terminal_t::LOGIC))
|
||||
{
|
||||
NL_VERBOSE_OUT(("connect_terminal_output: connecting proxy\n"));
|
||||
nld_d_to_a_proxy *proxy = new nld_d_to_a_proxy(out);
|
||||
pstring x = pstring::sprintf("proxy_da_%d", m_proxy_cnt);
|
||||
m_proxy_cnt++;
|
||||
|
||||
proxy->init(netlist(), x);
|
||||
register_dev(proxy, x);
|
||||
|
||||
out.net().register_con(proxy->m_I);
|
||||
nld_d_to_a_proxy *proxy = get_d_a_proxy(out);
|
||||
|
||||
if (in.has_net())
|
||||
proxy->m_Q.net().merge_net(&in.net());
|
||||
|
@ -162,6 +162,7 @@ private:
|
||||
pstring objtype_as_astr(netlist_object_t &in);
|
||||
|
||||
const pstring resolve_alias(const pstring &name) const;
|
||||
nld_d_to_a_proxy *get_d_a_proxy(netlist_output_t &out);
|
||||
};
|
||||
|
||||
#endif /* NLSETUP_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user