An output should have at most one d-to-a proxy connected to it. No WN

This commit is contained in:
Couriersud 2014-01-12 15:02:50 +00:00
parent 6f9f359229
commit 247b525c49
4 changed files with 45 additions and 24 deletions

View File

@ -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;

View File

@ -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

View File

@ -349,6 +349,29 @@ netlist_param_t *netlist_setup_t::find_param(const pstring &param_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());

View File

@ -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_ */