mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
C++ and minor performance optimizations. (nw)
This commit is contained in:
parent
a368aad4b3
commit
47347fe43e
@ -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;
|
||||
|
@ -12,10 +12,14 @@ namespace netlist
|
||||
{
|
||||
namespace devices
|
||||
{
|
||||
NETLIB_OBJECT(7474sub)
|
||||
|
||||
NETLIB_OBJECT(7474)
|
||||
{
|
||||
NETLIB_CONSTRUCTOR(7474sub)
|
||||
, m_CLK(*this, "CLK")
|
||||
NETLIB_CONSTRUCTOR(7474)
|
||||
, 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)
|
||||
@ -24,42 +28,20 @@ namespace netlist
|
||||
|
||||
NETLIB_RESETI();
|
||||
NETLIB_UPDATEI();
|
||||
NETLIB_HANDLERI(clk);
|
||||
|
||||
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")
|
||||
{
|
||||
register_subalias("CLK", sub.m_CLK);
|
||||
|
||||
register_subalias("Q", sub.m_Q);
|
||||
register_subalias("QQ", sub.m_QQ);
|
||||
}
|
||||
|
||||
NETLIB_RESETI();
|
||||
NETLIB_UPDATEI();
|
||||
|
||||
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)
|
||||
|
@ -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)
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user