Small object tree maintenance. (nw)

This commit is contained in:
couriersud 2015-05-05 21:43:23 +02:00
parent 0bb61ddc43
commit 1dd58681aa
4 changed files with 51 additions and 27 deletions

View File

@ -230,17 +230,17 @@ private:
class nld_a_to_d_proxy : public netlist_device_t
{
public:
ATTR_COLD nld_a_to_d_proxy(netlist_input_t &in_proxied)
ATTR_COLD nld_a_to_d_proxy(netlist_logic_input_t &in_proxied)
: netlist_device_t()
{
nl_assert(in_proxied.family() == LOGIC);
m_I.set_logic_family(in_proxied.logic_family());
m_logic_family = in_proxied.logic_family();
}
ATTR_COLD virtual ~nld_a_to_d_proxy() {}
netlist_analog_input_t m_I;
netlist_ttl_output_t m_Q;
netlist_logic_output_t m_Q;
protected:
ATTR_COLD void start()
@ -255,14 +255,15 @@ protected:
ATTR_HOT ATTR_ALIGN void update()
{
if (m_I.Q_Analog() > m_I.logic_family()->m_high_thresh_V)
if (m_I.Q_Analog() > m_logic_family->m_high_thresh_V)
OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(1));
else if (m_I.Q_Analog() < m_I.logic_family()->m_low_thresh_V)
else if (m_I.Q_Analog() < m_logic_family->m_low_thresh_V)
OUTLOGIC(m_Q, 0, NLTIME_FROM_NS(1));
//else
// OUTLOGIC(m_Q, m_Q.net().last_Q(), NLTIME_FROM_NS(1));
}
private:
const netlist_logic_family_desc_t *m_logic_family;
};
// -----------------------------------------------------------------------------
@ -272,7 +273,7 @@ protected:
class nld_base_d_to_a_proxy : public netlist_device_t
{
public:
ATTR_COLD nld_base_d_to_a_proxy(netlist_output_t &out_proxied)
ATTR_COLD nld_base_d_to_a_proxy(netlist_logic_output_t &out_proxied)
: netlist_device_t()
{
nl_assert(out_proxied.family() == LOGIC);
@ -282,8 +283,7 @@ public:
ATTR_COLD virtual ~nld_base_d_to_a_proxy() {}
ATTR_COLD virtual netlist_core_terminal_t &out() = 0;
netlist_ttl_input_t m_I;
ATTR_COLD virtual netlist_logic_input_t &in() { return m_I; }
protected:
ATTR_COLD virtual void start()
@ -297,6 +297,9 @@ protected:
}
const netlist_logic_family_desc_t *m_logic_family;
netlist_ttl_input_t m_I;
private:
};
@ -340,7 +343,7 @@ private:
class nld_d_to_a_proxy : public nld_base_d_to_a_proxy
{
public:
ATTR_COLD nld_d_to_a_proxy(netlist_output_t &out_proxied)
ATTR_COLD nld_d_to_a_proxy(netlist_logic_output_t &out_proxied)
: nld_base_d_to_a_proxy(out_proxied)
, m_RV(TWOTERM)
, m_last_state(-1)

View File

@ -453,19 +453,32 @@ ATTR_COLD void netlist_device_t::register_terminal(const pstring &name, netlist_
m_terminals.add(port.name());
}
ATTR_COLD void netlist_device_t::register_output(const pstring &name, netlist_output_t &port)
ATTR_COLD void netlist_device_t::register_output(const pstring &name, netlist_logic_output_t &port)
{
port.set_logic_family(this->logic_family());
setup().register_object(*this, name, port);
}
ATTR_COLD void netlist_device_t::register_input(const pstring &name, netlist_input_t &inp)
ATTR_COLD void netlist_device_t::register_output(const pstring &name, netlist_output_t &port)
{
//port.set_logic_family(this->logic_family());
setup().register_object(*this, name, port);
}
ATTR_COLD void netlist_device_t::register_input(const pstring &name, netlist_logic_input_t &inp)
{
inp.set_logic_family(this->logic_family());
setup().register_object(*this, name, inp);
m_terminals.add(inp.name());
}
ATTR_COLD void netlist_device_t::register_input(const pstring &name, netlist_input_t &inp)
{
//inp.set_logic_family(this->logic_family());
setup().register_object(*this, name, inp);
m_terminals.add(inp.name());
}
ATTR_COLD void netlist_device_t::connect(netlist_core_terminal_t &t1, netlist_core_terminal_t &t2)
{
setup().connect(t1, t2);
@ -788,7 +801,6 @@ ATTR_COLD netlist_core_terminal_t::netlist_core_terminal_t(const type_t atype, c
, plinkedlist_element_t<netlist_core_terminal_t>()
, m_net(NULL)
, m_state(STATE_NONEX)
, m_logic_family(NULL)
{
}
@ -873,7 +885,7 @@ ATTR_COLD void netlist_output_t::init_object(netlist_core_device_t &dev, const p
// ----------------------------------------------------------------------------------------
ATTR_COLD netlist_logic_output_t::netlist_logic_output_t()
: netlist_output_t(OUTPUT, LOGIC), m_proxy(NULL)
: netlist_output_t(OUTPUT, LOGIC), m_proxy(NULL), m_logic_family(NULL)
{
this->set_net(m_my_net);
}

View File

@ -457,9 +457,6 @@ public:
m_state = astate;
}
ATTR_HOT inline const netlist_logic_family_desc_t *logic_family() { return m_logic_family; }
ATTR_COLD void set_logic_family(const netlist_logic_family_desc_t *fam) { m_logic_family = fam; }
protected:
ATTR_COLD virtual void save_register()
{
@ -470,7 +467,6 @@ protected:
private:
netlist_net_t * RESTRICT m_net;
state_e m_state;
const netlist_logic_family_desc_t *m_logic_family;
};
NETLIST_SAVE_TYPE(netlist_core_terminal_t::state_e, DT_INT);
@ -564,7 +560,7 @@ class netlist_logic_input_t : public netlist_input_t
{
public:
ATTR_COLD netlist_logic_input_t()
: netlist_input_t(INPUT, LOGIC)
: netlist_input_t(INPUT, LOGIC), m_logic_family(NULL)
{
}
@ -574,6 +570,11 @@ public:
ATTR_HOT inline void activate_hl();
ATTR_HOT inline void activate_lh();
ATTR_HOT inline const netlist_logic_family_desc_t *logic_family() { return m_logic_family; }
ATTR_COLD void set_logic_family(const netlist_logic_family_desc_t *fam) { m_logic_family = fam; }
private:
const netlist_logic_family_desc_t *m_logic_family;
};
// -----------------------------------------------------------------------------
@ -813,18 +814,22 @@ public:
ATTR_COLD void initial(const netlist_sig_t val);
ATTR_COLD bool has_proxy() const { return (m_proxy != NULL); }
ATTR_COLD nld_base_d_to_a_proxy *get_proxy() const { return m_proxy; }
ATTR_COLD void set_proxy(nld_base_d_to_a_proxy *proxy) { m_proxy = proxy; }
ATTR_HOT inline void set_Q(const netlist_sig_t newQ, const netlist_time &delay)
{
net().as_logic().set_Q(newQ, delay);
}
ATTR_COLD bool has_proxy() const { return (m_proxy != NULL); }
ATTR_COLD nld_base_d_to_a_proxy *get_proxy() const { return m_proxy; }
ATTR_COLD void set_proxy(nld_base_d_to_a_proxy *proxy) { m_proxy = proxy; }
ATTR_HOT inline const netlist_logic_family_desc_t *logic_family() { return m_logic_family; }
ATTR_COLD void set_logic_family(const netlist_logic_family_desc_t *fam) { m_logic_family = fam; }
private:
netlist_logic_net_t m_my_net;
nld_base_d_to_a_proxy *m_proxy;
const netlist_logic_family_desc_t *m_logic_family;
};
class netlist_ttl_output_t : public netlist_logic_output_t
@ -1067,7 +1072,9 @@ public:
ATTR_COLD void register_subalias(const pstring &name, netlist_core_terminal_t &term);
ATTR_COLD void register_terminal(const pstring &name, netlist_terminal_t &port);
ATTR_COLD void register_output(const pstring &name, netlist_output_t &out);
ATTR_COLD void register_output(const pstring &name, netlist_logic_output_t &out);
ATTR_COLD void register_input(const pstring &name, netlist_input_t &in);
ATTR_COLD void register_input(const pstring &name, netlist_logic_input_t &in);
ATTR_COLD void connect(netlist_core_terminal_t &t1, netlist_core_terminal_t &t2);

View File

@ -399,7 +399,7 @@ nld_base_d_to_a_proxy *netlist_setup_t::get_d_a_proxy(netlist_output_t &out)
if (proxy == NULL)
{
// create a new one ...
proxy = out.logic_family()->create_d_a_proxy(out_cast);
proxy = out_cast.logic_family()->create_d_a_proxy(out_cast);
pstring x = pstring::sprintf("proxy_da_%s_%d", out.name().cstr(), m_proxy_cnt);
m_proxy_cnt++;
@ -417,7 +417,7 @@ nld_base_d_to_a_proxy *netlist_setup_t::get_d_a_proxy(netlist_output_t &out)
}
out.net().m_core_terms.clear(); // clear the list
#endif
out.net().register_con(proxy->m_I);
out.net().register_con(proxy->in());
out_cast.set_proxy(proxy);
}
@ -428,7 +428,8 @@ void netlist_setup_t::connect_input_output(netlist_input_t &in, netlist_output_t
{
if (out.isFamily(netlist_terminal_t::ANALOG) && in.isFamily(netlist_terminal_t::LOGIC))
{
nld_a_to_d_proxy *proxy = nl_alloc(nld_a_to_d_proxy, in);
netlist_logic_input_t &incast = dynamic_cast<netlist_logic_input_t &>(in);
nld_a_to_d_proxy *proxy = nl_alloc(nld_a_to_d_proxy, incast);
pstring x = pstring::sprintf("proxy_ad_%s_%d", in.name().cstr(), m_proxy_cnt);
m_proxy_cnt++;
@ -463,8 +464,9 @@ void netlist_setup_t::connect_terminal_input(netlist_terminal_t &term, netlist_i
}
else if (inp.isFamily(netlist_terminal_t::LOGIC))
{
netlist_logic_input_t &incast = dynamic_cast<netlist_logic_input_t &>(inp);
NL_VERBOSE_OUT(("connect_terminal_input: connecting proxy\n"));
nld_a_to_d_proxy *proxy = nl_alloc(nld_a_to_d_proxy, inp);
nld_a_to_d_proxy *proxy = nl_alloc(nld_a_to_d_proxy, incast);
pstring x = pstring::sprintf("proxy_ad_%s_%d", inp.name().cstr(), m_proxy_cnt);
m_proxy_cnt++;