Minor netlist changes. (nw)

This commit is contained in:
couriersud 2015-04-17 00:38:54 +02:00
parent beda6531ef
commit ecb50c0c09
6 changed files with 61 additions and 46 deletions

View File

@ -537,7 +537,7 @@ ATTR_COLD offs_t netlist_mame_cpu_device_t::disasm_disassemble(char *buffer, off
int relpc = pc - m_genPC;
//UINT16 opcode = (oprom[pc - startpc] << 8) | oprom[pc+1 - startpc];
//UINT8 inst = opcode >> 13;
#if 0
if (relpc >= 0 && relpc < netlist().queue().count())
{
// sprintf(buffer, "%04x %02d %s", pc, relpc, netlist().queue()[netlist().queue().count() - relpc - 1].object().name().cstr());
@ -547,6 +547,7 @@ ATTR_COLD offs_t netlist_mame_cpu_device_t::disasm_disassemble(char *buffer, off
}
else
sprintf(buffer, "%s", "");
#endif
pc+=1;
return (pc - startpc);
}

View File

@ -400,25 +400,28 @@ NETLIB_UPDATE(solver)
{
#pragma omp for nowait
for (int i = 0; i < t_cnt; i++)
{
this_resched[i] = m_mat_solvers[i]->solve();
}
if (m_mat_solvers[i]->is_timestep())
{
// Ignore return value
ATTR_UNUSED const nl_double ts = m_mat_solvers[i]->solve();
}
}
}
else
for (int i = 0; i < t_cnt; i++)
{
if (do_full || (m_mat_solvers[i]->is_timestep()))
this_resched[i] = m_mat_solvers[i]->solve();
}
#else
for (int i = 0; i < t_cnt; i++)
{
if (m_mat_solvers[i]->is_timestep())
if (m_mat_solvers[i]->is_timestep())
{
// Ignore return value
ATTR_UNUSED const nl_double ts = m_mat_solvers[i]->solve();
}
#else
for (int i = 0; i < t_cnt; i++)
{
if (m_mat_solvers[i]->is_timestep())
{
// Ignore return value
ATTR_UNUSED const nl_double ts = m_mat_solvers[i]->solve();
}
}
#endif

View File

@ -249,7 +249,7 @@ ATTR_COLD void netlist_base_t::reset()
}
ATTR_HOT ATTR_ALIGN void netlist_base_t::process_queue(const netlist_time delta)
ATTR_HOT ATTR_ALIGN void netlist_base_t::process_queue(const netlist_time &delta)
{
m_stop = m_time + delta;
@ -508,7 +508,7 @@ ATTR_HOT void netlist_net_t::inc_active(netlist_core_terminal_t &term)
if (m_time > netlist().time())
{
m_in_queue = 1; /* pending */
netlist().push_to_queue(this, m_time);
netlist().push_to_queue(*this, m_time);
}
else
{
@ -671,6 +671,7 @@ ATTR_COLD void netlist_net_t::merge_net(netlist_net_t *othernet)
}
}
// ----------------------------------------------------------------------------------------
// netlist_logic_net_t
// ----------------------------------------------------------------------------------------
@ -1001,3 +1002,13 @@ NETLIB_UPDATE(mainclock)
net.toggle_new_Q();
net.set_time(netlist().time() + m_inc);
}
ATTR_HOT void netlist_base_t::push_to_queue(netlist_net_t &out, const netlist_time &attime)
{
m_queue.push(netlist_queue_t::entry_t(attime, &out));
}
ATTR_HOT void netlist_base_t::remove_from_queue(netlist_net_t &out)
{
m_queue.remove(&out);
}

View File

@ -166,7 +166,9 @@
// Type definitions
// ----------------------------------------------------------------------------------------
typedef UINT8 netlist_sig_t;
//typedef UINT8 netlist_sig_t;
#define netlist_sig_t UINT8
class netlist_core_device_t;
@ -619,14 +621,14 @@ public:
ATTR_HOT void update_devs();
ATTR_HOT inline const netlist_time time() const { return m_time; }
ATTR_HOT inline void set_time(const netlist_time ntime) { m_time = ntime; }
ATTR_HOT inline const netlist_time &time() const { return m_time; }
ATTR_HOT inline void set_time(const netlist_time &ntime) { m_time = ntime; }
ATTR_HOT inline bool isRailNet() const { return !(m_railterminal == NULL); }
ATTR_HOT inline const netlist_core_terminal_t & RESTRICT railterminal() const { return *m_railterminal; }
ATTR_HOT inline void push_to_queue(const netlist_time delay);
ATTR_HOT inline void reschedule_in_queue(const netlist_time delay);
ATTR_HOT inline void push_to_queue(const netlist_time &delay);
ATTR_HOT inline void reschedule_in_queue(const netlist_time &delay);
ATTR_HOT bool inline is_queued() const { return m_in_queue == 1; }
ATTR_HOT inline int num_cons() const { return m_core_terms.count(); }
@ -685,7 +687,7 @@ public:
return m_new_Q;
}
ATTR_HOT inline void set_Q(const netlist_sig_t newQ, const netlist_time delay)
ATTR_HOT inline void set_Q(const netlist_sig_t &newQ, const netlist_time &delay)
{
if (EXPECTED(newQ != m_new_Q))
{
@ -806,7 +808,7 @@ public:
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)
ATTR_HOT inline void set_Q(const netlist_sig_t newQ, const netlist_time &delay)
{
net().as_logic().set_Q(newQ, delay);
}
@ -992,7 +994,7 @@ public:
return inp.Q();
}
ATTR_HOT inline void OUTLOGIC(netlist_logic_output_t &out, const netlist_sig_t val, const netlist_time delay)
ATTR_HOT inline void OUTLOGIC(netlist_logic_output_t &out, const netlist_sig_t val, const netlist_time &delay)
{
out.set_Q(val, delay);
}
@ -1117,22 +1119,15 @@ public:
ATTR_HOT inline const netlist_queue_t &queue() const { return m_queue; }
ATTR_HOT inline netlist_queue_t &queue() { return m_queue; }
ATTR_HOT inline const netlist_time time() const { return m_time; }
ATTR_HOT inline const netlist_time &time() const { return m_time; }
ATTR_HOT inline NETLIB_NAME(solver) *solver() const { return m_solver; }
ATTR_HOT inline NETLIB_NAME(gnd) *gnd() const { return m_gnd; }
ATTR_HOT const nl_double gmin() const;
ATTR_HOT inline void push_to_queue(netlist_net_t *out, const netlist_time attime)
{
m_queue.push(netlist_queue_t::entry_t(attime, out));
}
ATTR_HOT void push_to_queue(netlist_net_t &out, const netlist_time &attime);
ATTR_HOT void remove_from_queue(netlist_net_t &out);
ATTR_HOT inline void remove_from_queue(netlist_net_t *out)
{
m_queue.remove(out);
}
ATTR_HOT void process_queue(const netlist_time delta);
ATTR_HOT void process_queue(const netlist_time &delta);
ATTR_HOT inline void abort_current_queue_slice() { m_stop = netlist_time::zero; }
ATTR_COLD void rebuild_lists(); /* must be called after post_load ! */
@ -1322,7 +1317,7 @@ ATTR_HOT inline void netlist_logic_input_t::activate_lh()
}
ATTR_HOT inline void netlist_net_t::push_to_queue(const netlist_time delay)
ATTR_HOT inline void netlist_net_t::push_to_queue(const netlist_time &delay)
{
//if (UNEXPECTED(m_num_cons == 0 || is_queued()))
if (!is_queued())
@ -1331,22 +1326,22 @@ ATTR_HOT inline void netlist_net_t::push_to_queue(const netlist_time delay)
m_in_queue = (m_active > 0); /* queued ? */
if (EXPECTED(m_in_queue))
{
netlist().push_to_queue(this, m_time);
netlist().push_to_queue(*this, m_time);
}
}
}
ATTR_HOT inline void netlist_net_t::reschedule_in_queue(const netlist_time delay)
ATTR_HOT inline void netlist_net_t::reschedule_in_queue(const netlist_time &delay)
{
//if (UNEXPECTED(m_num_cons == 0 || is_queued()))
if (is_queued())
netlist().remove_from_queue(this);
netlist().remove_from_queue(*this);
m_time = netlist().time() + delay;
m_in_queue = (m_active > 0); /* queued ? */
if (EXPECTED(m_in_queue))
{
netlist().push_to_queue(this, m_time);
netlist().push_to_queue(*this, m_time);
}
}

View File

@ -39,7 +39,7 @@
// The following adds about 10% performance ...
#define USE_OPENMP (0)
#define USE_OPENMP (1)
// Use nano-second resolution - Sufficient for now
#define NETLIST_INTERNAL_RES (U64(1000000000))

View File

@ -27,14 +27,20 @@ public:
{
public:
ATTR_HOT inline entry_t()
: m_exec_time(), m_object() {}
ATTR_HOT inline entry_t(const _Time atime, const _Element elem) : m_exec_time(atime), m_object(elem) {}
: m_object(), m_exec_time() {}
ATTR_HOT inline entry_t(const _Time &atime, const _Element &elem) : m_object(elem), m_exec_time(atime) {}
ATTR_HOT inline const _Time exec_time() const { return m_exec_time; }
ATTR_HOT inline const _Element object() const { return m_object; }
ATTR_HOT inline entry_t &operator=(const entry_t &right) {
m_object = right.m_object;
m_exec_time = right.m_exec_time;
return *this;
}
private:
_Time m_exec_time;
_Element m_object;
_Time m_exec_time;
};
netlist_timed_queue()
@ -47,11 +53,10 @@ public:
ATTR_HOT inline bool is_empty() const { return (m_end == &m_list[0]); }
ATTR_HOT inline bool is_not_empty() const { return (m_end > &m_list[0]); }
ATTR_HOT ATTR_ALIGN void push(const entry_t &e)
ATTR_HOT /*ATTR_ALIGN*/ void push(const entry_t &e)
{
entry_t * i = m_end++;
const _Time e_time = e.exec_time();
while ((i > &m_list[0]) && (e_time > (i - 1)->exec_time()) )
while ((i > &m_list[0]) && (e.exec_time() > (i - 1)->exec_time()) )
{
*(i) = *(i-1);
i--;
@ -72,7 +77,7 @@ public:
return (m_end-1);
}
ATTR_HOT inline void remove(const _Element elem)
ATTR_HOT /*inline*/ void remove(const _Element &elem)
{
entry_t * i = m_end - 1;
while (i > &m_list[0])