C++ and minor performance optimizations. (nw)

This commit is contained in:
couriersud 2019-01-09 18:16:17 +01:00
parent a368aad4b3
commit 47347fe43e
7 changed files with 113 additions and 132 deletions

View File

@ -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;

View File

@ -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)

View File

@ -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)

View File

@ -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));
}

View File

@ -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();

View File

@ -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

View File

@ -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);