From ecb50c0c09c9e2060fea275e36822957e2ea53f4 Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 17 Apr 2015 00:38:54 +0200 Subject: [PATCH] Minor netlist changes. (nw) --- src/emu/machine/netlist.c | 3 +- src/emu/netlist/analog/nld_solver.c | 25 +++++++++-------- src/emu/netlist/nl_base.c | 15 ++++++++-- src/emu/netlist/nl_base.h | 43 +++++++++++++---------------- src/emu/netlist/nl_config.h | 2 +- src/emu/netlist/nl_lists.h | 19 ++++++++----- 6 files changed, 61 insertions(+), 46 deletions(-) diff --git a/src/emu/machine/netlist.c b/src/emu/machine/netlist.c index ae88104f605..ad6153eca54 100644 --- a/src/emu/machine/netlist.c +++ b/src/emu/machine/netlist.c @@ -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); } diff --git a/src/emu/netlist/analog/nld_solver.c b/src/emu/netlist/analog/nld_solver.c index 22a10ea1a3d..e254f6587a1 100644 --- a/src/emu/netlist/analog/nld_solver.c +++ b/src/emu/netlist/analog/nld_solver.c @@ -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 diff --git a/src/emu/netlist/nl_base.c b/src/emu/netlist/nl_base.c index 8a4d0089c7b..8d4b67369f0 100644 --- a/src/emu/netlist/nl_base.c +++ b/src/emu/netlist/nl_base.c @@ -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); +} diff --git a/src/emu/netlist/nl_base.h b/src/emu/netlist/nl_base.h index d8af15e53f8..b6cb33ed724 100644 --- a/src/emu/netlist/nl_base.h +++ b/src/emu/netlist/nl_base.h @@ -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); } } diff --git a/src/emu/netlist/nl_config.h b/src/emu/netlist/nl_config.h index 966163bb053..c2ef152247d 100644 --- a/src/emu/netlist/nl_config.h +++ b/src/emu/netlist/nl_config.h @@ -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)) diff --git a/src/emu/netlist/nl_lists.h b/src/emu/netlist/nl_lists.h index ea2cf597e1b..b0bfdd9b517 100644 --- a/src/emu/netlist/nl_lists.h +++ b/src/emu/netlist/nl_lists.h @@ -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])