summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/devices/machine/netlist.cpp21
-rw-r--r--src/lib/netlist/devices/nld_7474.cpp96
-rw-r--r--src/lib/netlist/devices/nld_7493.cpp8
-rw-r--r--src/lib/netlist/devices/nld_9316.cpp38
-rw-r--r--src/lib/netlist/nl_base.h14
-rw-r--r--src/lib/netlist/plib/palloc.cpp54
-rw-r--r--src/lib/netlist/plib/palloc.h8
7 files changed, 110 insertions, 129 deletions
diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp
index 15a096a6536..137c9e6cf6c 100644
--- a/src/devices/machine/netlist.cpp
+++ b/src/devices/machine/netlist.cpp
@@ -1004,17 +1004,18 @@ void netlist_mame_cpu_device::device_start()
state_add(STATE_GENPC, "GENPC", m_genPC).noshow();
state_add(STATE_GENPCBASE, "CURPC", m_genPC).noshow();
- for (int i=0; i < netlist().m_nets.size(); i++)
+ int index = 0;
+ for (auto &n : netlist().m_nets)
{
- netlist::detail::net_t *n = netlist().m_nets[i].get();
if (n->is_logic())
{
- state_add(i*2, n->name().c_str(), *downcast<netlist::logic_net_t *>(n)->Q_state_ptr());
+ state_add(index, n->name().c_str(), *(downcast<netlist::logic_net_t &>(*n).Q_state_ptr()));
}
else
{
- state_add(i*2+1, n->name().c_str(), *downcast<netlist::analog_net_t *>(n)->Q_Analog_state_ptr());
+ state_add(index, n->name().c_str(), *(downcast<netlist::analog_net_t &>(*n).Q_Analog_state_ptr()));
}
+ index++;
}
// set our instruction counter
@@ -1116,15 +1117,15 @@ void netlist_mame_sound_device::device_start()
//m_num_outputs = outdevs.size();
/* resort channels */
- for (int i=0; i < outdevs.size(); i++)
+ for (auto &outdev : outdevs)
{
- int chan = outdevs[i]->m_channel();
+ int chan = outdev->m_channel();
- netlist().log().verbose("Output %d on channel %d", i, chan);
+ netlist().log().verbose("Output %s on channel %d", outdev->name(), chan);
- //if (chan < 0 || chan >= MAX_OUT || chan >= outdevs.size())
- // fatalerror("illegal channel number");
- m_out[chan] = outdevs[i];
+ if (chan < 0 || chan >= outdevs.size())
+ fatalerror("illegal channel number");
+ m_out[chan] = outdev;
m_out[chan]->m_sample_time = netlist::netlist_time::from_hz(clock());
m_out[chan]->m_buffer = nullptr;
m_out[chan]->m_bufsize = 0;
diff --git a/src/lib/netlist/devices/nld_7474.cpp b/src/lib/netlist/devices/nld_7474.cpp
index 60abeeef840..37646925ae4 100644
--- a/src/lib/netlist/devices/nld_7474.cpp
+++ b/src/lib/netlist/devices/nld_7474.cpp
@@ -12,54 +12,36 @@ namespace netlist
{
namespace devices
{
- NETLIB_OBJECT(7474sub)
- {
- NETLIB_CONSTRUCTOR(7474sub)
- , m_CLK(*this, "CLK")
- , m_Q(*this, "Q")
- , m_QQ(*this, "QQ")
- , m_nextD(*this, "m_nextD", 0)
- {
- }
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
-
- public:
- logic_input_t m_CLK;
- logic_output_t m_Q;
- logic_output_t m_QQ;
- state_var<netlist_sig_t> m_nextD;
-
- inline void newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ);
-
- private:
-
- };
NETLIB_OBJECT(7474)
{
NETLIB_CONSTRUCTOR(7474)
- , sub(*this, "sub")
, m_D(*this, "D")
, m_CLRQ(*this, "CLRQ")
, m_PREQ(*this, "PREQ")
+ , m_CLK(*this, "CLK", NETLIB_DELEGATE(7474, clk))
+ , m_Q(*this, "Q")
+ , m_QQ(*this, "QQ")
+ , m_nextD(*this, "m_nextD", 0)
{
- register_subalias("CLK", sub.m_CLK);
-
- register_subalias("Q", sub.m_Q);
- register_subalias("QQ", sub.m_QQ);
}
NETLIB_RESETI();
NETLIB_UPDATEI();
+ NETLIB_HANDLERI(clk);
public:
- NETLIB_SUB(7474sub) sub;
-
logic_input_t m_D;
logic_input_t m_CLRQ;
logic_input_t m_PREQ;
+ logic_input_t m_CLK;
+ logic_output_t m_Q;
+ logic_output_t m_QQ;
+
+ private:
+ state_var<netlist_sig_t> m_nextD;
+
+ inline void newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ);
};
NETLIB_OBJECT(7474_dip)
@@ -70,16 +52,16 @@ namespace netlist
{
register_subalias("1", m_1.m_CLRQ);
register_subalias("2", m_1.m_D);
- register_subalias("3", m_1.sub.m_CLK);
+ register_subalias("3", m_1.m_CLK);
register_subalias("4", m_1.m_PREQ);
- register_subalias("5", m_1.sub.m_Q);
- register_subalias("6", m_1.sub.m_QQ);
+ register_subalias("5", m_1.m_Q);
+ register_subalias("6", m_1.m_QQ);
// register_subalias("7", ); ==> GND
- register_subalias("8", m_2.sub.m_QQ);
- register_subalias("9", m_2.sub.m_Q);
+ register_subalias("8", m_2.m_QQ);
+ register_subalias("9", m_2.m_Q);
register_subalias("10", m_2.m_PREQ);
- register_subalias("11", m_2.sub.m_CLK);
+ register_subalias("11", m_2.m_CLK);
register_subalias("12", m_2.m_D);
register_subalias("13", m_2.m_CLRQ);
// register_subalias("14", ); ==> VCC
@@ -92,15 +74,15 @@ namespace netlist
NETLIB_SUB(7474) m_2;
};
- inline void NETLIB_NAME(7474sub)::newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ)
+ inline void NETLIB_NAME(7474)::newstate(const netlist_sig_t stateQ, const netlist_sig_t stateQQ)
{
// 0: High-to-low 40 ns, 1: Low-to-high 25 ns
- const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
+ static constexpr const netlist_time delay[2] = { NLTIME_FROM_NS(40), NLTIME_FROM_NS(25) };
m_Q.push(stateQ, delay[stateQ]);
m_QQ.push(stateQQ, delay[stateQQ]);
}
- NETLIB_UPDATE(7474sub)
+ NETLIB_HANDLER(7474, clk)
{
//if (INP_LH(m_CLK))
{
@@ -111,54 +93,34 @@ namespace netlist
NETLIB_UPDATE(7474)
{
- if (m_PREQ() && m_CLRQ())
+ const auto preq(m_PREQ());
+ const auto clrq(m_CLRQ());
+ if (preq & clrq)
{
m_D.activate();
- sub.m_nextD = m_D();
- sub.m_CLK.activate_lh();
- }
- else if (!m_PREQ() && m_CLRQ())
- {
- sub.newstate(1, 0);
- sub.m_CLK.inactivate();
- m_D.inactivate();
- }
- else if (!m_CLRQ() && m_PREQ())
- {
- sub.newstate(0, 1);
- sub.m_CLK.inactivate();
- m_D.inactivate();
+ m_nextD = m_D();
+ m_CLK.activate_lh();
}
else
{
- sub.newstate(1, 1);
- sub.m_CLK.inactivate();
+ newstate(preq ^ 1, clrq ^ 1);
+ m_CLK.inactivate();
m_D.inactivate();
}
}
NETLIB_RESET(7474)
{
- //sub.do_reset();
- }
-
- NETLIB_RESET(7474sub)
- {
m_CLK.activate_lh();
-
m_nextD = 0;
}
NETLIB_RESET(7474_dip)
{
- // m_1.do_reset();
- //m_2.do_reset();
}
NETLIB_UPDATE(7474_dip)
{
- //m_1.update_dev();
- //m_2.update_dev();
}
NETLIB_DEVICE_IMPL(7474)
diff --git a/src/lib/netlist/devices/nld_7493.cpp b/src/lib/netlist/devices/nld_7493.cpp
index 2ac3d557c57..a7a20635729 100644
--- a/src/lib/netlist/devices/nld_7493.cpp
+++ b/src/lib/netlist/devices/nld_7493.cpp
@@ -40,7 +40,7 @@ namespace netlist
NETLIB_HANDLERI(updA)
{
- if (m_reset)
+ //if (m_reset)
{
m_a ^= 1;
m_QA.push(m_a, out_delay);
@@ -49,7 +49,7 @@ namespace netlist
NETLIB_HANDLERI(updB)
{
- if (m_reset)
+ //if (m_reset)
{
++m_bcd &= static_cast<std::uint8_t>(0x07);
m_QD.push((m_bcd >> 2) & 1, out_delay3);
@@ -101,8 +101,8 @@ namespace netlist
{
m_reset = 1;
m_a = m_bcd = 0;
- m_CLKA.set_state(logic_t::STATE_INP_HL);
- m_CLKB.set_state(logic_t::STATE_INP_HL);
+ m_CLKA.activate_hl();
+ m_CLKB.activate_hl();
}
NETLIB_UPDATE(7493)
diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp
index 7c478fd4b05..ba3b4a58167 100644
--- a/src/lib/netlist/devices/nld_9316.cpp
+++ b/src/lib/netlist/devices/nld_9316.cpp
@@ -24,12 +24,13 @@ namespace netlist
, m_cnt(*this, "m_cnt", 0)
, m_ENP(*this, "ENP")
, m_CLRQ(*this, "CLRQ")
- , m_A(*this, "A", NETLIB_DELEGATE(9316, noop))
- , m_B(*this, "B", NETLIB_DELEGATE(9316, noop))
- , m_C(*this, "C", NETLIB_DELEGATE(9316, noop))
- , m_D(*this, "D", NETLIB_DELEGATE(9316, noop))
+ , m_A(*this, "A", NETLIB_DELEGATE(9316, abcd))
+ , m_B(*this, "B", NETLIB_DELEGATE(9316, abcd))
+ , m_C(*this, "C", NETLIB_DELEGATE(9316, abcd))
+ , m_D(*this, "D", NETLIB_DELEGATE(9316, abcd))
, m_Q(*this, {{ "QA", "QB", "QC", "QD" }})
, m_RC(*this, "RC")
+ , m_abcd(*this, "m_abcd", 0)
{
}
@@ -37,14 +38,17 @@ namespace netlist
NETLIB_RESETI();
NETLIB_UPDATEI();
NETLIB_HANDLERI(clk);
- NETLIB_HANDLERI(noop) { }
+ NETLIB_HANDLERI(abcd)
+ {
+ m_abcd = (m_D() << 3) | (m_C() << 2) | (m_B() << 1) | (m_A() << 0);
+ }
logic_input_t m_CLK;
logic_input_t m_ENT;
logic_input_t m_LOADQ;
- state_var<unsigned> m_cnt;
+ state_var_u8 m_cnt;
logic_input_t m_ENP;
logic_input_t m_CLRQ;
@@ -56,7 +60,7 @@ namespace netlist
object_array_t<logic_output_t, 4> m_Q;
logic_output_t m_RC;
-
+ state_var_u8 m_abcd;
private:
//inline void update_outputs_all(const unsigned &cnt, const netlist_time &out_delay) noexcept
@@ -95,8 +99,9 @@ namespace netlist
NETLIB_RESET(9316)
{
- m_CLK.set_state(logic_t::STATE_INP_LH);
+ m_CLK.activate_lh();
m_cnt = 0;
+ m_abcd = 0;
}
NETLIB_HANDLER(9316, clk)
@@ -105,6 +110,7 @@ namespace netlist
{
++m_cnt &= MAXCNT;
//m_RC.push(m_ENT() && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
+#if 0
if (m_cnt == MAXCNT)
{
m_RC.push(m_ENT(), NLTIME_FROM_NS(27));
@@ -117,10 +123,24 @@ namespace netlist
}
else
update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
+#else
+ if (m_cnt > 0 && m_cnt < MAXCNT)
+ update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
+ else if (m_cnt == 0)
+ {
+ m_RC.push(0, NLTIME_FROM_NS(27));
+ update_outputs_all(0, NLTIME_FROM_NS(20));
+ }
+ else
+ {
+ m_RC.push(m_ENT(), NLTIME_FROM_NS(27));
+ update_outputs_all(MAXCNT, NLTIME_FROM_NS(20));
+ }
+#endif
}
else
{
- m_cnt = (m_D() << 3) | (m_C() << 2) | (m_B() << 1) | (m_A() << 0);
+ m_cnt = m_abcd;
m_RC.push(m_ENT() && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
}
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index 16043eb8728..c61b09d7089 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -653,7 +653,7 @@ namespace netlist
nldelegate delegate = nldelegate());
virtual ~logic_input_t();
- inline netlist_sig_t operator()() const NL_NOEXCEPT
+ const netlist_sig_t &operator()() const NL_NOEXCEPT
{
return Q();
}
@@ -663,7 +663,7 @@ namespace netlist
void activate_hl() NL_NOEXCEPT;
void activate_lh() NL_NOEXCEPT;
private:
- netlist_sig_t Q() const NL_NOEXCEPT;
+ const netlist_sig_t &Q() const NL_NOEXCEPT;
};
// -----------------------------------------------------------------------------
@@ -778,10 +778,10 @@ namespace netlist
logic_net_t(netlist_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr);
virtual ~logic_net_t();
- inline netlist_sig_t Q() const NL_NOEXCEPT { return m_cur_Q; }
+ inline const netlist_sig_t & Q() const NL_NOEXCEPT { return m_cur_Q; }
void initial(const netlist_sig_t val) NL_NOEXCEPT { m_cur_Q = m_new_Q = val; }
- void set_Q_and_push(const netlist_sig_t newQ, const netlist_time &delay) NL_NOEXCEPT
+ inline void set_Q_and_push(const netlist_sig_t newQ, const netlist_time &delay) NL_NOEXCEPT
{
if (newQ != m_new_Q )
{
@@ -789,7 +789,7 @@ namespace netlist
push_to_queue(delay);
}
}
- void set_Q_and_push_force(const netlist_sig_t newQ, const netlist_time &delay) NL_NOEXCEPT
+ inline void set_Q_and_push_force(const netlist_sig_t newQ, const netlist_time &delay) NL_NOEXCEPT
{
if (newQ != m_new_Q || is_queued())
{
@@ -798,7 +798,7 @@ namespace netlist
}
}
- void set_Q_time(const netlist_sig_t newQ, const netlist_time &at) NL_NOEXCEPT
+ inline void set_Q_time(const netlist_sig_t newQ, const netlist_time &at) NL_NOEXCEPT
{
if (newQ != m_new_Q)
{
@@ -1462,7 +1462,7 @@ namespace netlist
return static_cast<const logic_net_t &>(core_terminal_t::net());
}
- inline netlist_sig_t logic_input_t::Q() const NL_NOEXCEPT
+ inline const netlist_sig_t & logic_input_t::Q() const NL_NOEXCEPT
{
nl_assert(state() != STATE_INP_PASSIVE);
return net().Q();
diff --git a/src/lib/netlist/plib/palloc.cpp b/src/lib/netlist/plib/palloc.cpp
index e4d31985b23..fa87c1cf94f 100644
--- a/src/lib/netlist/plib/palloc.cpp
+++ b/src/lib/netlist/plib/palloc.cpp
@@ -25,24 +25,24 @@ mempool::~mempool()
{
for (auto & b : m_blocks)
{
- if (b.m_num_alloc != 0)
+ if (b->m_num_alloc != 0)
{
- fprintf(stderr, "Found block with %d dangling allocations\n", static_cast<int>(b.m_num_alloc));
+ fprintf(stderr, "Found block with %d dangling allocations\n", static_cast<int>(b->m_num_alloc));
}
- ::operator delete(b.data);
+ ::operator delete(b->data);
}
m_blocks.clear();
}
-size_t mempool::new_block()
+mempool::block * mempool::new_block()
{
- block b;
- b.data = static_cast<char *>(::operator new(m_min_alloc));
- b.cur_ptr = b.data;
- b.m_free = m_min_alloc;
- b.m_num_alloc = 0;
+ block *b = new block();
+ b->data = static_cast<char *>(::operator new(m_min_alloc));
+ b->cur_ptr = b->data;
+ b->m_free = m_min_alloc;
+ b->m_num_alloc = 0;
m_blocks.push_back(b);
- return m_blocks.size() - 1;
+ return b;
}
size_t mempool::mininfosize()
@@ -59,29 +59,27 @@ size_t mempool::mininfosize()
void *mempool::alloc(size_t size)
{
size_t rs = (size + mininfosize() + m_min_align - 1) & ~(m_min_align - 1);
- for (size_t bn=0; bn < m_blocks.size(); bn++)
+ for (auto &b : m_blocks)
{
- auto &b = m_blocks[bn];
- if (b.m_free > rs)
+ if (b->m_free > rs)
{
- b.m_free -= rs;
- b.m_num_alloc++;
- auto i = reinterpret_cast<info *>(b.cur_ptr);
- i->m_block = bn;
- auto ret = reinterpret_cast<void *>(b.cur_ptr + mininfosize());
- b.cur_ptr += rs;
+ b->m_free -= rs;
+ b->m_num_alloc++;
+ auto i = reinterpret_cast<info *>(b->cur_ptr);
+ i->m_block = b;
+ auto ret = reinterpret_cast<void *>(b->cur_ptr + mininfosize());
+ b->cur_ptr += rs;
return ret;
}
}
{
- size_t bn = new_block();
- auto &b = m_blocks[bn];
- b.m_num_alloc = 1;
- b.m_free = m_min_alloc - rs;
- auto i = reinterpret_cast<info *>(b.cur_ptr);
- i->m_block = bn;
- auto ret = reinterpret_cast<void *>(b.cur_ptr + mininfosize());
- b.cur_ptr += rs;
+ block *b = new_block();
+ b->m_num_alloc = 1;
+ b->m_free = m_min_alloc - rs;
+ auto i = reinterpret_cast<info *>(b->cur_ptr);
+ i->m_block = b;
+ auto ret = reinterpret_cast<void *>(b->cur_ptr + mininfosize());
+ b->cur_ptr += rs;
return ret;
}
}
@@ -91,7 +89,7 @@ void mempool::free(void *ptr)
auto p = reinterpret_cast<char *>(ptr);
auto i = reinterpret_cast<info *>(p - mininfosize());
- block *b = &m_blocks[i->m_block];
+ block *b = i->m_block;
if (b->m_num_alloc == 0)
fprintf(stderr, "Argh .. double free\n");
else
diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h
index 3759d5819de..264cc656bbf 100644
--- a/src/lib/netlist/plib/palloc.h
+++ b/src/lib/netlist/plib/palloc.h
@@ -153,19 +153,19 @@ private:
char *data;
};
- size_t new_block();
+ block * new_block();
size_t mininfosize();
struct info
{
- info() : m_block(0) { }
- size_t m_block;
+ info() : m_block(nullptr) { }
+ block * m_block;
};
size_t m_min_alloc;
size_t m_min_align;
- std::vector<block> m_blocks;
+ std::vector<block *> m_blocks;
public:
mempool(size_t min_alloc, size_t min_align);