From e65dd38acfde2f8b90158c5929928d72263c7e82 Mon Sep 17 00:00:00 2001 From: Couriersud Date: Sun, 23 Feb 2014 14:08:10 +0000 Subject: [PATCH] Minor netlist updates with focus on performance. Also added 16bit int to pstate. --- src/emu/machine/netlist.c | 3 ++ src/emu/netlist/devices/nld_signal.h | 70 +++++++++++++++++----------- src/emu/netlist/devices/nld_system.h | 6 ++- src/emu/netlist/nl_base.c | 59 +++++++++++++++++++++-- src/emu/netlist/nl_base.h | 33 ++++++------- src/emu/netlist/nl_lists.h | 11 ++--- src/emu/netlist/pstate.c | 2 + src/emu/netlist/pstate.h | 3 ++ 8 files changed, 133 insertions(+), 54 deletions(-) diff --git a/src/emu/machine/netlist.c b/src/emu/machine/netlist.c index 54f2c7744a9..4713b0dc512 100644 --- a/src/emu/machine/netlist.c +++ b/src/emu/machine/netlist.c @@ -440,6 +440,9 @@ ATTR_COLD void netlist_mame_device_t::save_state() case DT_INT64: save_pointer((INT64 *) s->m_ptr, s->m_name, s->m_count); break; + case DT_INT16: + save_pointer((INT16 *) s->m_ptr, s->m_name, s->m_count); + break; case DT_INT8: save_pointer((INT8 *) s->m_ptr, s->m_name, s->m_count); break; diff --git a/src/emu/netlist/devices/nld_signal.h b/src/emu/netlist/devices/nld_signal.h index e8e2b240bcb..866cdd1cd17 100644 --- a/src/emu/netlist/devices/nld_signal.h +++ b/src/emu/netlist/devices/nld_signal.h @@ -123,29 +123,26 @@ public: } #endif - virtual void update() - { - static const netlist_time times[2] = { NLTIME_FROM_NS(22), NLTIME_FROM_NS(15) }; - int pos = -1; + virtual void update() + { + static const netlist_time times[2] = { NLTIME_FROM_NS(22), NLTIME_FROM_NS(15) }; - for (int i = 0; i< _numdev; i++) - { - this->m_i[i].activate(); - if (INPLOGIC(this->m_i[i]) == _check) - { - OUTLOGIC(this->m_Q, _check ^ (1 ^ _invert), times[_check]);// ? 15000 : 22000); - pos = i; - break; - } - } - if (pos >= 0) - { - for (int i = 0; i < _numdev; i++) - if (i != pos) - this->m_i[i].inactivate(); - } else - OUTLOGIC(this->m_Q,_check ^ (_invert), times[1-_check]);// ? 22000 : 15000); - } + for (int i = 0; i< _numdev; i++) + { + this->m_i[i].activate(); + if (INPLOGIC(this->m_i[i]) == _check) + { + for (int j = 0; j < i; j++) + this->m_i[j].inactivate(); + for (int j = i + 1; j < _numdev; j++) + this->m_i[j].inactivate(); + + OUTLOGIC(this->m_Q, _check ^ (1 ^ _invert), times[_check]);// ? 15000 : 22000); + return; + } + } + OUTLOGIC(this->m_Q,_check ^ (_invert), times[1-_check]);// ? 22000 : 15000); + } public: netlist_ttl_input_t m_i[_numdev]; @@ -178,7 +175,7 @@ public: } #if (USE_DEACTIVE_DEVICE) - ATTR_HOT void inc_active() + ATTR_HOT virtual void inc_active() { if (++m_active == 1) { @@ -186,7 +183,7 @@ public: } } - ATTR_HOT void dec_active() + ATTR_HOT virtual void dec_active() { if (--m_active == 0) { @@ -196,14 +193,14 @@ public: } #endif - ATTR_HOT ATTR_ALIGN void update() { - static const netlist_time times[2] = { NLTIME_FROM_NS(22), NLTIME_FROM_NS(15) }; + static const netlist_time times[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22)}; - int res = _invert ^ 1 ^_check; m_i[0].activate(); m_i[1].activate(); +#if 0 + UINT8 res = _invert ^ 1 ^_check; if (INPLOGIC(m_i[0]) ^ _check) { if (INPLOGIC(m_i[1]) ^ _check) @@ -216,7 +213,24 @@ public: if (INPLOGIC(m_i[1]) ^ _check) m_i[1].inactivate(); } - OUTLOGIC(m_Q, res, times[(res & 1) ^ 1]);// ? 22000 : 15000); + OUTLOGIC(m_Q, res, times[res & 1]);// ? 22000 : 15000); +#else + UINT8 val = (INPLOGIC(m_i[0]) ^ _check) | ((INPLOGIC(m_i[1]) ^ _check) << 1); + UINT8 res = _invert ^ 1 ^_check; + switch (val) + { + case 1: + m_i[0].inactivate(); + break; + case 2: + m_i[1].inactivate(); + break; + case 3: + res = _invert ^ _check; + break; + } + OUTLOGIC(m_Q, res, times[res]);// ? 22000 : 15000); +#endif } public: diff --git a/src/emu/netlist/devices/nld_system.h b/src/emu/netlist/devices/nld_system.h index 4cbd8cbd2c1..fc1329b854e 100644 --- a/src/emu/netlist/devices/nld_system.h +++ b/src/emu/netlist/devices/nld_system.h @@ -47,7 +47,11 @@ public: netlist_param_double_t m_freq; netlist_time m_inc; - ATTR_HOT inline static void mc_update(netlist_net_t &net, const netlist_time curtime); +#if 0 + ATTR_HOT inline static void mc_update(netlist_net_t &net, const netlist_time curtime); +#else + ATTR_HOT inline static void mc_update(netlist_net_t &net); +#endif ); // ---------------------------------------------------------------------------------------- diff --git a/src/emu/netlist/nl_base.c b/src/emu/netlist/nl_base.c index 828bd38f93b..ad7f9308864 100644 --- a/src/emu/netlist/nl_base.c +++ b/src/emu/netlist/nl_base.c @@ -239,6 +239,7 @@ ATTR_HOT ATTR_ALIGN void netlist_base_t::process_queue(const netlist_time delta) m_time = m_stop; } else { +#if 0 netlist_net_t &mcQ = m_mainclock->m_Q.net(); const netlist_time inc = m_mainclock->m_inc; @@ -266,6 +267,43 @@ ATTR_HOT ATTR_ALIGN void netlist_base_t::process_queue(const netlist_time delta) add_to_stat(m_perf_out_processed, 1); } +#else + netlist_net_t &mcQ = m_mainclock->m_Q.net(); + const netlist_time inc = m_mainclock->m_inc; + netlist_time mc_time = mcQ.time(); + netlist_time cur_time = m_time; + + while (cur_time < m_stop) + { + if (m_queue.is_not_empty()) + { + while (m_queue.peek().time() > mc_time) + { + cur_time = mc_time; + mc_time += inc; + m_time = cur_time; + NETLIB_NAME(mainclock)::mc_update(mcQ); + } + + const netlist_queue_t::entry_t &e = m_queue.pop(); + cur_time = e.time(); + m_time = cur_time; + e.object()->update_devs(); + } else { + cur_time = mc_time; + mc_time += inc; + m_time = cur_time; + NETLIB_NAME(mainclock)::mc_update(mcQ); + } + if (FATAL_ERROR_AFTER_NS) + if (time() > NLTIME_FROM_NS(FATAL_ERROR_AFTER_NS)) + error("Stopped"); + + add_to_stat(m_perf_out_processed, 1); + } + mcQ.set_time(mc_time); + m_time = cur_time; +#endif } } @@ -533,7 +571,7 @@ ATTR_COLD void netlist_net_t::register_con(netlist_core_terminal_t &terminal) m_active++; } -ATTR_HOT inline void netlist_net_t::update_dev(const netlist_core_terminal_t *inp, const UINT32 mask) const +ATTR_HOT inline static void update_dev(const netlist_core_terminal_t *inp, const UINT32 mask) { if ((inp->state() & mask) != 0) { @@ -548,7 +586,6 @@ ATTR_HOT inline void netlist_net_t::update_dev(const netlist_core_terminal_t *in ATTR_HOT inline void netlist_net_t::update_devs() { assert(m_num_cons != 0); - assert(this->isRailNet()); static const UINT32 masks[4] = { 1, 5, 3, 1 }; @@ -559,6 +596,7 @@ ATTR_HOT inline void netlist_net_t::update_devs() netlist_core_terminal_t *p = m_head; +#if 1 switch (m_num_cons) { case 2: @@ -574,8 +612,15 @@ ATTR_HOT inline void netlist_net_t::update_devs() p = p->m_update_list_next; } while (p != NULL); break; - } +#else + while (p != NULL) + { + update_dev(p, mask); + p = p->m_update_list_next; + } +#endif + } m_last = m_cur; } @@ -780,12 +825,20 @@ ATTR_COLD double netlist_param_model_t::model_value(const pstring &entity, const // mainclock // ---------------------------------------------------------------------------------------- +#if 0 ATTR_HOT inline void NETLIB_NAME(mainclock)::mc_update(netlist_net_t &net, const netlist_time curtime) { net.m_new.Q ^= 1; net.set_time(curtime); net.update_devs(); } +#else +ATTR_HOT inline void NETLIB_NAME(mainclock)::mc_update(netlist_net_t &net) +{ + net.m_new.Q ^= 1; + net.update_devs(); +} +#endif NETLIB_START(mainclock) { diff --git a/src/emu/netlist/nl_base.h b/src/emu/netlist/nl_base.h index 5f8323c19f1..c98b2cfe94e 100644 --- a/src/emu/netlist/nl_base.h +++ b/src/emu/netlist/nl_base.h @@ -586,8 +586,6 @@ public: ATTR_HOT inline void inc_active(); ATTR_HOT inline void dec_active(); - ATTR_HOT inline const int active_count() const { return m_active; } - ATTR_HOT inline const netlist_sig_t Q() const { assert(family() == LOGIC); @@ -647,7 +645,7 @@ public: protected: //FIXME: needed by current solver code - UINT32 m_num_cons; + UINT16 m_num_cons; public: hybrid_t m_last; @@ -673,11 +671,9 @@ protected: private: - ATTR_HOT void update_dev(const netlist_core_terminal_t *inp, const UINT32 mask) const; - netlist_time m_time; INT32 m_active; - UINT32 m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ + UINT8 m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ netlist_core_terminal_t * RESTRICT m_railterminal; }; @@ -693,6 +689,7 @@ class netlist_output_t : public netlist_core_terminal_t public: ATTR_COLD netlist_output_t(const type_t atype, const family_t afamily); + ATTR_COLD virtual ~netlist_output_t() {} ATTR_COLD void init_object(netlist_core_device_t &dev, const pstring &aname); ATTR_COLD virtual void reset() @@ -1223,13 +1220,12 @@ ATTR_HOT inline void netlist_input_t::activate_lh() ATTR_HOT inline void netlist_net_t::push_to_queue(const netlist_time delay) { - if (is_queued()) + if (is_queued() || m_num_cons == 0) return; m_time = netlist().time() + delay; - m_in_queue = (m_active > 0) ? 1 : 0; /* queued ? */ + m_in_queue = (m_active > 0); /* queued ? */ if (m_in_queue) { - //m_in_queue = 1; /* pending */ netlist().push_to_queue(this, m_time); } } @@ -1238,11 +1234,14 @@ ATTR_HOT inline void netlist_net_t::inc_active() { m_active++; - if (USE_DEACTIVE_DEVICE && m_active == 1 && m_in_queue > 0) + if (USE_DEACTIVE_DEVICE) { - m_last = m_cur; - railterminal().netdev().inc_active(); - m_cur = m_new; + if (m_active == 1 && m_in_queue > 0) + { + m_last = m_cur; + railterminal().netdev().inc_active(); + m_cur = m_new; + } } if (m_active == 1 && m_in_queue == 0) @@ -1263,9 +1262,11 @@ ATTR_HOT inline void netlist_net_t::inc_active() ATTR_HOT inline void netlist_net_t::dec_active() { m_active--; - if (USE_DEACTIVE_DEVICE && (m_active == 0)) - railterminal().netdev().dec_active(); - + if (USE_DEACTIVE_DEVICE) + { + if (m_active == 0) + railterminal().netdev().dec_active(); + } } ATTR_HOT inline const netlist_sig_t netlist_logic_input_t::Q() const diff --git a/src/emu/netlist/nl_lists.h b/src/emu/netlist/nl_lists.h index 40d08fc1011..53ef0978ad1 100644 --- a/src/emu/netlist/nl_lists.h +++ b/src/emu/netlist/nl_lists.h @@ -146,7 +146,6 @@ private: int m_count; _ListClass * m_list; int m_num_elements; - //_ListClass m_list[_NumElements]; }; // ---------------------------------------------------------------------------------------- @@ -164,9 +163,9 @@ public: public: ATTR_HOT inline entry_t() : m_time(), m_object() {} - ATTR_HOT inline entry_t(const _Time atime, _Element elem) : m_time(atime), m_object(elem) {} - ATTR_HOT inline _Time time() const { return m_time; } - ATTR_HOT inline _Element object() const { return m_object; } + ATTR_HOT inline entry_t(const _Time atime, const _Element elem) : m_time(atime), m_object(elem) {} + ATTR_HOT inline const _Time time() const { return m_time; } + ATTR_HOT inline const _Element object() const { return m_object; } private: _Time m_time; @@ -183,7 +182,7 @@ 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 inline void push(const entry_t &e) { entry_t * RESTRICT i = m_end++; while ((i > &m_list[0]) && (e.time() > (i - 1)->time()) ) @@ -197,7 +196,7 @@ public: assert(m_end - m_list < _Size); } - ATTR_HOT inline entry_t pop() + ATTR_HOT inline const entry_t &pop() { return *--m_end; } diff --git a/src/emu/netlist/pstate.c b/src/emu/netlist/pstate.c index 38cf979a792..3297f5acc3d 100644 --- a/src/emu/netlist/pstate.c +++ b/src/emu/netlist/pstate.c @@ -17,8 +17,10 @@ ATTR_COLD void pstate_manager_t::save_state_ptr(const pstring &stname, const pst pstring fullname = stname; ATTR_UNUSED pstring ts[] = { "NOT_SUPPORTED", + "DT_CUSTOM", "DT_DOUBLE", "DT_INT64", + "DT_INT16", "DT_INT8", "DT_INT", "DT_BOOLEAN" diff --git a/src/emu/netlist/pstate.h b/src/emu/netlist/pstate.h index 0d6fb896229..4265da06b8d 100644 --- a/src/emu/netlist/pstate.h +++ b/src/emu/netlist/pstate.h @@ -29,6 +29,7 @@ enum pstate_data_type_e { DT_CUSTOM, DT_DOUBLE, DT_INT64, + DT_INT16, DT_INT8, DT_INT, DT_BOOLEAN @@ -48,6 +49,8 @@ NETLIST_SAVE_TYPE(UINT64, DT_INT64); NETLIST_SAVE_TYPE(bool, DT_BOOLEAN); NETLIST_SAVE_TYPE(UINT32, DT_INT); NETLIST_SAVE_TYPE(INT32, DT_INT); +NETLIST_SAVE_TYPE(UINT16, DT_INT16); +NETLIST_SAVE_TYPE(INT16, DT_INT16); //NETLIST_SAVE_TYPE(netlist_time::INTERNALTYPE, DT_INT64); class pstate_manager_t;