summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author couriersud <couriersud@arcor.de>2015-08-14 20:30:30 +0200
committer couriersud <couriersud@arcor.de>2015-08-14 20:30:41 +0200
commit6ac50ea052b040224791090dc96040d7ca5b2db8 (patch)
tree41bd7eb99f2bebbc525477a1d969c01e3ee7a6e5 /src
parent32fd6a03421212dac72d2c87455c390eef639425 (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)
Diffstat (limited to 'src')
-rw-r--r--src/emu/machine/netlist.c35
-rw-r--r--src/emu/machine/netlist.h4
-rw-r--r--src/emu/netlist/nl_time.h73
-rw-r--r--src/emu/netlist/plib/pconfig.h12
-rw-r--r--src/emu/netlist/plib/pstate.c3
-rw-r--r--src/emu/netlist/plib/pstate.h7
-rw-r--r--src/emu/netlist/solver/nld_solver.c2
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();