From 1dd58681aa0ee817568c0cac7e033b13dbe8a8ea Mon Sep 17 00:00:00 2001 From: couriersud Date: Tue, 5 May 2015 21:43:23 +0200 Subject: [PATCH] Small object tree maintenance. (nw) --- src/emu/netlist/devices/nld_system.h | 23 +++++++++++++---------- src/emu/netlist/nl_base.c | 20 ++++++++++++++++---- src/emu/netlist/nl_base.h | 25 ++++++++++++++++--------- src/emu/netlist/nl_setup.c | 10 ++++++---- 4 files changed, 51 insertions(+), 27 deletions(-) diff --git a/src/emu/netlist/devices/nld_system.h b/src/emu/netlist/devices/nld_system.h index 2d126313e22..4ae3f9e0844 100644 --- a/src/emu/netlist/devices/nld_system.h +++ b/src/emu/netlist/devices/nld_system.h @@ -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) diff --git a/src/emu/netlist/nl_base.c b/src/emu/netlist/nl_base.c index 32257559bc3..c0c46858777 100644 --- a/src/emu/netlist/nl_base.c +++ b/src/emu/netlist/nl_base.c @@ -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() , 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); } diff --git a/src/emu/netlist/nl_base.h b/src/emu/netlist/nl_base.h index 86a6a50f876..fb318a7ce70 100644 --- a/src/emu/netlist/nl_base.h +++ b/src/emu/netlist/nl_base.h @@ -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); diff --git a/src/emu/netlist/nl_setup.c b/src/emu/netlist/nl_setup.c index e7d3b3d24ee..8387f7b2918 100644 --- a/src/emu/netlist/nl_setup.c +++ b/src/emu/netlist/nl_setup.c @@ -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(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(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++;