diff options
author | 2015-08-14 20:30:30 +0200 | |
---|---|---|
committer | 2015-08-14 20:30:41 +0200 | |
commit | 6ac50ea052b040224791090dc96040d7ca5b2db8 (patch) | |
tree | 41bd7eb99f2bebbc525477a1d969c01e3ee7a6e5 | |
parent | 32fd6a03421212dac72d2c87455c390eef639425 (diff) |
Some netlist_time maintenance. Straightened code using it and added
support for 128 bit resolution on systems supporting it. This is however
disabled since all platforms I know don't have native support but
emulate 128 bit. (nw)
-rw-r--r-- | src/emu/machine/netlist.c | 35 | ||||
-rw-r--r-- | src/emu/machine/netlist.h | 4 | ||||
-rw-r--r-- | src/emu/netlist/nl_time.h | 73 | ||||
-rw-r--r-- | src/emu/netlist/plib/pconfig.h | 12 | ||||
-rw-r--r-- | src/emu/netlist/plib/pstate.c | 3 | ||||
-rw-r--r-- | src/emu/netlist/plib/pstate.h | 7 | ||||
-rw-r--r-- | src/emu/netlist/solver/nld_solver.c | 2 |
7 files changed, 83 insertions, 53 deletions
diff --git a/src/emu/machine/netlist.c b/src/emu/machine/netlist.c index 79d3b4e6943..2f782802151 100644 --- a/src/emu/machine/netlist.c +++ b/src/emu/machine/netlist.c @@ -255,8 +255,6 @@ ADDRESS_MAP_END netlist_mame_device_t::netlist_mame_device_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, NETLIST_CORE, "Netlist core device", tag, owner, clock, "netlist_core", __FILE__), m_icount(0), - m_div(0), - m_rem(0), m_old(netlist::netlist_time::zero), m_netlist(NULL), m_setup(NULL), @@ -267,8 +265,6 @@ netlist_mame_device_t::netlist_mame_device_t(const machine_config &mconfig, cons netlist_mame_device_t::netlist_mame_device_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *file) : device_t(mconfig, type, name, tag, owner, clock, shortname, file), m_icount(0), - m_div(0), - m_rem(0), m_old(netlist::netlist_time::zero), m_netlist(NULL), m_setup(NULL), @@ -326,17 +322,17 @@ void netlist_mame_device_t::device_start() save_state(); m_old = netlist::netlist_time::zero; - m_rem = 0; + m_rem = netlist::netlist_time::zero; } void netlist_mame_device_t::device_clock_changed() { //printf("device_clock_changed\n"); - m_div = netlist::netlist_time::from_hz(clock()).as_raw(); + m_div = netlist::netlist_time::from_hz(clock()); //m_rem = 0; //NL_VERBOSE_OUT(("Setting clock %" I64FMT "d and divisor %d\n", clock(), m_div)); - NL_VERBOSE_OUT(("Setting clock %d and divisor %d\n", clock(), m_div)); + NL_VERBOSE_OUT(("Setting clock %d and divisor %f\n", clock(), m_div.as_double())); //printf("Setting clock %d and divisor %d\n", clock(), m_div); } @@ -345,7 +341,7 @@ void netlist_mame_device_t::device_reset() { LOG_DEV_CALLS(("device_reset\n")); m_old = netlist::netlist_time::zero; - m_rem = 0; + m_rem = netlist::netlist_time::zero; netlist().do_reset(); } @@ -383,9 +379,12 @@ void netlist_mame_device_t::device_timer(emu_timer &timer, device_timer_id id, i ATTR_HOT ATTR_ALIGN void netlist_mame_device_t::update_time_x() { - const netlist::netlist_time delta = netlist().time() - m_old + netlist::netlist_time::from_raw(m_rem); - m_old = netlist().time(); - m_icount -= divu_64x32_rem(delta.as_raw(), m_div, &m_rem); + const netlist::netlist_time newt = netlist().time(); + const netlist::netlist_time delta = newt - m_old + m_rem; + const UINT64 d = delta / m_div; + m_old = newt; + m_rem = delta - (m_div * d); + m_icount -= d; } ATTR_HOT ATTR_ALIGN void netlist_mame_device_t::check_mame_abort_slice() @@ -414,6 +413,12 @@ ATTR_COLD void netlist_mame_device_t::save_state() if (td != NULL) save_pointer(td, s->m_name.cstr(), s->m_count); } break; +#if (PHAS_INT128) + case DT_INT128: + // FIXME: we are cheating here + save_pointer((char *) s->m_ptr, s->m_name.cstr(), s->m_count * sizeof(INT128)); + break; +#endif case DT_INT64: save_pointer((INT64 *) s->m_ptr, s->m_name.cstr(), s->m_count); break; @@ -529,13 +534,13 @@ ATTR_HOT void netlist_mame_cpu_device_t::execute_run() m_genPC++; m_genPC &= 255; debugger_instruction_hook(this, m_genPC); - netlist().process_queue(netlist::netlist_time::from_raw(m_div)); + netlist().process_queue(m_div); update_time_x(); } } else { - netlist().process_queue(netlist::netlist_time::from_raw(m_div) * m_icount); + netlist().process_queue(m_div * m_icount); update_time_x(); } } @@ -623,9 +628,9 @@ void netlist_mame_sound_device_t::sound_stream_update(sound_stream &stream, stre netlist::netlist_time cur = netlist().time(); - netlist().process_queue(netlist::netlist_time::from_raw(m_div) * samples); + netlist().process_queue(m_div * samples); - cur += (netlist::netlist_time::from_raw(m_div) * samples); + cur += (m_div * samples); for (int i=0; i < m_num_outputs; i++) { diff --git a/src/emu/machine/netlist.h b/src/emu/machine/netlist.h index 73ad52b0ddd..d3818ab1955 100644 --- a/src/emu/machine/netlist.h +++ b/src/emu/machine/netlist.h @@ -143,13 +143,13 @@ protected: //virtual void device_debug_setup(); virtual void device_clock_changed(); - UINT32 m_div; + netlist::netlist_time m_div; private: void save_state(); /* timing support here - so sound can hijack it ... */ - UINT32 m_rem; + netlist::netlist_time m_rem; netlist::netlist_time m_old; netlist_mame_t * m_netlist; diff --git a/src/emu/netlist/nl_time.h b/src/emu/netlist/nl_time.h index 4473b67d2c8..ddb3c85d14e 100644 --- a/src/emu/netlist/nl_time.h +++ b/src/emu/netlist/nl_time.h @@ -23,7 +23,8 @@ // net_list_time // ---------------------------------------------------------------------------------------- -#define RESOLUTION NETLIST_INTERNAL_RES +#undef ATTR_HOT +#define ATTR_HOT namespace netlist { @@ -31,71 +32,73 @@ namespace netlist { public: +#if (PHAS_INT128) + typedef UINT128 INTERNALTYPE; + static const pstate_data_type_e STATETYPE = DT_INT128; +#else typedef UINT64 INTERNALTYPE; + static const pstate_data_type_e STATETYPE = DT_INT64; +#endif + static const INTERNALTYPE RESOLUTION = NETLIST_INTERNAL_RES; - ATTR_HOT /* inline */ netlist_time() : m_time(0) {} + ATTR_HOT netlist_time() : m_time(0) {} + ATTR_HOT netlist_time(const netlist_time &rhs) : m_time(rhs.m_time) {} - ATTR_HOT friend /* inline */ const netlist_time operator-(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend /* inline */ const netlist_time operator+(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend /* inline */ const netlist_time operator*(const netlist_time &left, const UINT32 factor); - ATTR_HOT friend /* inline */ UINT32 operator/(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend /* inline */ bool operator>(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend /* inline */ bool operator<(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend /* inline */ bool operator>=(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend /* inline */ bool operator<=(const netlist_time &left, const netlist_time &right); - ATTR_HOT friend /* inline */ bool operator!=(const netlist_time &left, const netlist_time &right); + ATTR_HOT friend const netlist_time operator-(const netlist_time &left, const netlist_time &right); + ATTR_HOT friend const netlist_time operator+(const netlist_time &left, const netlist_time &right); + ATTR_HOT friend const netlist_time operator*(const netlist_time &left, const UINT64 factor); + ATTR_HOT friend UINT64 operator/(const netlist_time &left, const netlist_time &right); + ATTR_HOT friend bool operator>(const netlist_time &left, const netlist_time &right); + ATTR_HOT friend bool operator<(const netlist_time &left, const netlist_time &right); + ATTR_HOT friend bool operator>=(const netlist_time &left, const netlist_time &right); + ATTR_HOT friend bool operator<=(const netlist_time &left, const netlist_time &right); + ATTR_HOT friend bool operator!=(const netlist_time &left, const netlist_time &right); - ATTR_HOT /* inline */ const netlist_time &operator=(const netlist_time &right) { m_time = right.m_time; return *this; } - ATTR_HOT /* inline */ const netlist_time &operator=(const double &right) { m_time = (INTERNALTYPE) ( right * (double) RESOLUTION); return *this; } + ATTR_HOT const netlist_time &operator=(const netlist_time &right) { m_time = right.m_time; return *this; } - // issues with ISO C++ standard - //ATTR_HOT /* inline */ operator double() const { return as_double(); } + ATTR_HOT const netlist_time &operator+=(const netlist_time &right) { m_time += right.m_time; return *this; } - ATTR_HOT /* inline */ const netlist_time &operator+=(const netlist_time &right) { m_time += right.m_time; return *this; } - - ATTR_HOT /* inline */ INTERNALTYPE as_raw() const { return m_time; } - ATTR_HOT /* inline */ double as_double() const { return (double) m_time / (double) RESOLUTION; } + ATTR_HOT INTERNALTYPE as_raw() const { return m_time; } + ATTR_HOT double as_double() const { return (double) m_time / (double) RESOLUTION; } // for save states .... - ATTR_HOT /* inline */ INTERNALTYPE *get_internaltype_ptr() { return &m_time; } + ATTR_HOT INTERNALTYPE *get_internaltype_ptr() { return &m_time; } - ATTR_HOT static /* inline */ const netlist_time from_nsec(const int ns) { return netlist_time((UINT64) ns * (RESOLUTION / U64(1000000000))); } - ATTR_HOT static /* inline */ const netlist_time from_usec(const int us) { return netlist_time((UINT64) us * (RESOLUTION / U64(1000000))); } - ATTR_HOT static /* inline */ const netlist_time from_msec(const int ms) { return netlist_time((UINT64) ms * (RESOLUTION / U64(1000))); } - ATTR_HOT static /* inline */ const netlist_time from_hz(const UINT64 hz) { return netlist_time(RESOLUTION / hz); } - ATTR_HOT static /* inline */ const netlist_time from_double(const double t) { return netlist_time((INTERNALTYPE) ( t * (double) RESOLUTION)); } - ATTR_HOT static /* inline */ const netlist_time from_raw(const INTERNALTYPE raw) { return netlist_time(raw); } + ATTR_HOT static const netlist_time from_nsec(const INTERNALTYPE ns) { return netlist_time(ns * (RESOLUTION / U64(1000000000))); } + ATTR_HOT static const netlist_time from_usec(const INTERNALTYPE us) { return netlist_time(us * (RESOLUTION / U64(1000000))); } + ATTR_HOT static const netlist_time from_msec(const INTERNALTYPE ms) { return netlist_time(ms * (RESOLUTION / U64(1000))); } + ATTR_HOT static const netlist_time from_hz(const INTERNALTYPE hz) { return netlist_time(RESOLUTION / hz); } + ATTR_HOT static const netlist_time from_double(const double t) { return netlist_time((INTERNALTYPE) ( t * (double) RESOLUTION)); } + ATTR_HOT static const netlist_time from_raw(const INTERNALTYPE raw) { return netlist_time(raw); } static const netlist_time zero; protected: - ATTR_HOT /* inline */ netlist_time(const INTERNALTYPE val) : m_time(val) {} + ATTR_HOT netlist_time(const INTERNALTYPE val) : m_time(val) {} private: INTERNALTYPE m_time; }; - #undef RESOLUTION - ATTR_HOT inline const netlist_time operator-(const netlist_time &left, const netlist_time &right) { - return netlist_time::from_raw(left.m_time - right.m_time); + return netlist_time(left.m_time - right.m_time); } - ATTR_HOT inline const netlist_time operator*(const netlist_time &left, const UINT32 factor) + ATTR_HOT inline const netlist_time operator*(const netlist_time &left, const UINT64 factor) { - return netlist_time::from_raw(left.m_time * factor); + return netlist_time(left.m_time * factor); } - ATTR_HOT inline UINT32 operator/(const netlist_time &left, const netlist_time &right) + ATTR_HOT inline UINT64 operator/(const netlist_time &left, const netlist_time &right) { return left.m_time / right.m_time; } ATTR_HOT inline const netlist_time operator+(const netlist_time &left, const netlist_time &right) { - return netlist_time::from_raw(left.m_time + right.m_time); + return netlist_time(left.m_time + right.m_time); } ATTR_HOT inline bool operator<(const netlist_time &left, const netlist_time &right) @@ -127,7 +130,7 @@ namespace netlist template<> ATTR_COLD inline void pstate_manager_t::save_item(netlist::netlist_time &nlt, const void *owner, const pstring &stname) { - save_state_ptr(stname, DT_INT64, owner, sizeof(netlist::netlist_time::INTERNALTYPE), 1, nlt.get_internaltype_ptr(), false); + save_state_ptr(stname, netlist::netlist_time::STATETYPE, owner, sizeof(netlist::netlist_time::INTERNALTYPE), 1, nlt.get_internaltype_ptr(), false); } diff --git a/src/emu/netlist/plib/pconfig.h b/src/emu/netlist/plib/pconfig.h index 434a59e2df1..3be33d01503 100644 --- a/src/emu/netlist/plib/pconfig.h +++ b/src/emu/netlist/plib/pconfig.h @@ -19,6 +19,18 @@ #define PSTANDALONE (0) #endif +#define PHAS_INT128 (0) + +#ifndef PHAS_INT128 +#define PHAS_INT128 (0) +#endif + +#if (PHAS_INT128) +typedef __uint128_t UINT128; +typedef __int128_t INT128; +#endif + + #if !(PSTANDALONE) #include "osdcore.h" #include "eminline.h" diff --git a/src/emu/netlist/plib/pstate.c b/src/emu/netlist/plib/pstate.c index 326eb13fe49..cf2c863ed11 100644 --- a/src/emu/netlist/plib/pstate.c +++ b/src/emu/netlist/plib/pstate.c @@ -25,6 +25,9 @@ ATTR_COLD void pstate_manager_t::save_state_ptr(const pstring &stname, const pst "NOT_SUPPORTED", "DT_CUSTOM", "DT_DOUBLE", +#if (PHAS_INT128) + "DT_INT128", +#endif "DT_INT64", "DT_INT16", "DT_INT8", diff --git a/src/emu/netlist/plib/pstate.h b/src/emu/netlist/plib/pstate.h index 0350b0fe309..b42d3dac882 100644 --- a/src/emu/netlist/plib/pstate.h +++ b/src/emu/netlist/plib/pstate.h @@ -32,6 +32,9 @@ enum pstate_data_type_e { NOT_SUPPORTED, DT_CUSTOM, DT_DOUBLE, +#if (PHAS_INT128) + DT_INT128, +#endif DT_INT64, DT_INT16, DT_INT8, @@ -63,6 +66,10 @@ NETLIST_SAVE_TYPE(double, DT_DOUBLE); NETLIST_SAVE_TYPE(float, DT_FLOAT); NETLIST_SAVE_TYPE(INT8, DT_INT8); NETLIST_SAVE_TYPE(UINT8, DT_INT8); +#if (PHAS_INT128) +NETLIST_SAVE_TYPE(INT128, DT_INT128); +NETLIST_SAVE_TYPE(UINT128, DT_INT128); +#endif NETLIST_SAVE_TYPE(INT64, DT_INT64); NETLIST_SAVE_TYPE(UINT64, DT_INT64); NETLIST_SAVE_TYPE(bool, DT_BOOLEAN); diff --git a/src/emu/netlist/solver/nld_solver.c b/src/emu/netlist/solver/nld_solver.c index 631ec438458..ce3bb36826b 100644 --- a/src/emu/netlist/solver/nld_solver.c +++ b/src/emu/netlist/solver/nld_solver.c @@ -477,7 +477,7 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start() m_params.m_accuracy = m_accuracy.Value(); m_params.m_gs_loops = m_gs_loops.Value(); m_params.m_nr_loops = m_nr_loops.Value(); - m_params.m_nt_sync_delay = m_sync_delay.Value(); + m_params.m_nt_sync_delay = netlist_time::from_double(m_sync_delay.Value()); m_params.m_lte = m_lte.Value(); m_params.m_sor = m_sor.Value(); |