summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/emu/netlist/devices/nld_system.h23
-rw-r--r--src/emu/netlist/nl_base.c20
-rw-r--r--src/emu/netlist/nl_base.h25
-rw-r--r--src/emu/netlist/nl_setup.c10
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<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);
}
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<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++;