summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/devices/machine/netlist.cpp12
-rw-r--r--src/devices/machine/netlist.h2
-rw-r--r--src/lib/netlist/analog/nld_switches.cpp29
-rw-r--r--src/lib/netlist/analog/nlid_fourterm.cpp10
-rw-r--r--src/lib/netlist/analog/nlid_fourterm.h4
-rw-r--r--src/lib/netlist/analog/nlid_twoterm.cpp85
-rw-r--r--src/lib/netlist/analog/nlid_twoterm.h52
-rw-r--r--src/lib/netlist/devices/nld_7475.cpp2
-rw-r--r--src/lib/netlist/devices/nld_74ls629.cpp5
-rw-r--r--src/lib/netlist/devices/nld_r2r_dac.cpp2
-rw-r--r--src/lib/netlist/devices/nld_system.cpp37
-rw-r--r--src/lib/netlist/devices/nlid_proxy.cpp5
-rw-r--r--src/lib/netlist/devices/nlid_system.h16
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.cpp9
-rw-r--r--src/lib/netlist/nl_base.cpp23
-rw-r--r--src/lib/netlist/nl_base.h22
-rw-r--r--src/lib/netlist/nl_factory.cpp4
-rw-r--r--src/lib/netlist/plib/gmres.h1
-rw-r--r--src/lib/netlist/plib/palloc.cpp3
-rw-r--r--src/lib/netlist/plib/pfunction.cpp1
-rw-r--r--src/lib/netlist/plib/pstate.cpp1
-rw-r--r--src/lib/netlist/plib/pstream.cpp1
-rw-r--r--src/lib/netlist/plib/putil.cpp4
-rw-r--r--src/lib/netlist/prg/nltool.cpp4
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.cpp18
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.h4
-rw-r--r--src/lib/netlist/solver/nld_ms_sor_mat.h2
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp9
-rw-r--r--src/lib/netlist/tools/nl_convert.cpp1
-rw-r--r--src/mame/audio/nl_kidniki.cpp6
30 files changed, 137 insertions, 237 deletions
diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp
index 9f588368f8e..6795dcb9d6a 100644
--- a/src/devices/machine/netlist.cpp
+++ b/src/devices/machine/netlist.cpp
@@ -144,7 +144,7 @@ public:
// avoid calls due to noise
if (std::fabs(cur - m_last) > 1e-6)
{
- m_cpu_device->update_icount();
+ m_cpu_device->update_icount(exec().time());
m_callback(cur, m_cpu_device->local_time());
m_cpu_device->check_mame_abort_slice();
m_last = cur;
@@ -192,7 +192,7 @@ public:
// avoid calls due to noise
if (cur != m_last)
{
- m_cpu_device->update_icount();
+ m_cpu_device->update_icount(exec().time());
m_callback(cur, m_cpu_device->local_time());
m_cpu_device->check_mame_abort_slice();
m_last = cur;
@@ -933,9 +933,9 @@ ATTR_COLD void netlist_mame_device::device_pre_save()
netlist().run_state_manager().pre_save();
}
-void netlist_mame_device::update_icount()
+void netlist_mame_device::update_icount(netlist::netlist_time time)
{
- const netlist::netlist_time newt(netlist().time());
+ const netlist::netlist_time newt(time);
const netlist::netlist_time delta(newt - m_old + m_rem);
const uint64_t d = delta / m_div;
m_old = newt;
@@ -1061,13 +1061,13 @@ ATTR_HOT void netlist_mame_cpu_device::execute_run()
m_genPC &= 255;
debugger_instruction_hook(m_genPC);
netlist().process_queue(m_div);
- update_icount();
+ update_icount(netlist().time());
}
}
else
{
netlist().process_queue(m_div * m_icount);
- update_icount();
+ update_icount(netlist().time());
}
}
diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h
index 68723c0d982..d79e9e298c2 100644
--- a/src/devices/machine/netlist.h
+++ b/src/devices/machine/netlist.h
@@ -110,7 +110,7 @@ public:
ATTR_HOT inline netlist_mame_t &netlist() { return *m_netlist; }
ATTR_HOT inline const netlist::netlist_time last_time_update() { return m_old; }
- ATTR_HOT void update_icount();
+ ATTR_HOT void update_icount(netlist::netlist_time time);
ATTR_HOT void check_mame_abort_slice();
static void register_memregion_source(netlist::setup_t &setup, const char *name);
diff --git a/src/lib/netlist/analog/nld_switches.cpp b/src/lib/netlist/analog/nld_switches.cpp
index 042b61ce7e7..1ecfae06f9d 100644
--- a/src/lib/netlist/analog/nld_switches.cpp
+++ b/src/lib/netlist/analog/nld_switches.cpp
@@ -49,6 +49,11 @@ namespace netlist
NETLIB_UPDATE(switch1)
{
+ }
+
+ NETLIB_UPDATE_PARAM(switch1)
+ {
+ m_R.solve_now();
if (!m_POS())
{
m_R.set_R(R_OFF);
@@ -58,12 +63,6 @@ namespace netlist
m_R.set_R(R_ON);
}
- m_R.update_dev();
- }
-
- NETLIB_UPDATE_PARAM(switch1)
- {
- update();
}
// ----------------------------------------------------------------------------------------
@@ -113,13 +112,25 @@ namespace netlist
m_R2.set_R(R_ON);
}
- m_R1.update_dev();
- m_R2.update_dev();
+ //m_R1.update_dev(time);
+ //m_R2.update_dev(time);
}
NETLIB_UPDATE_PARAM(switch2)
{
- update();
+ if (!m_POS())
+ {
+ m_R1.set_R(R_ON);
+ m_R2.set_R(R_OFF);
+ }
+ else
+ {
+ m_R1.set_R(R_OFF);
+ m_R2.set_R(R_ON);
+ }
+
+ m_R1.solve_now();
+ m_R2.solve_now();
}
} //namespace analog
diff --git a/src/lib/netlist/analog/nlid_fourterm.cpp b/src/lib/netlist/analog/nlid_fourterm.cpp
index aa2723fe8e1..89784812fbe 100644
--- a/src/lib/netlist/analog/nlid_fourterm.cpp
+++ b/src/lib/netlist/analog/nlid_fourterm.cpp
@@ -63,11 +63,6 @@ NETLIB_UPDATE_PARAM(LVCCS)
NETLIB_NAME(VCCS)::update_param();
}
-NETLIB_UPDATE(LVCCS)
-{
- NETLIB_NAME(VCCS)::update();
-}
-
NETLIB_UPDATE_TERMINALS(LVCCS)
{
const nl_double m_mult = m_G() * m_gfac; // 1.0 ==> 1V ==> 1A
@@ -105,11 +100,6 @@ NETLIB_UPDATE_PARAM(CCCS)
NETLIB_NAME(VCCS)::update_param();
}
-NETLIB_UPDATE(CCCS)
-{
- NETLIB_NAME(VCCS)::update();
-}
-
// ----------------------------------------------------------------------------------------
// nld_VCVS
// ----------------------------------------------------------------------------------------
diff --git a/src/lib/netlist/analog/nlid_fourterm.h b/src/lib/netlist/analog/nlid_fourterm.h
index 641fc72427b..a0984221cae 100644
--- a/src/lib/netlist/analog/nlid_fourterm.h
+++ b/src/lib/netlist/analog/nlid_fourterm.h
@@ -101,7 +101,7 @@ namespace netlist {
param_double_t m_cur_limit; /* current limit */
protected:
- NETLIB_UPDATEI();
+ //NETLIB_UPDATEI();
NETLIB_RESETI();
NETLIB_UPDATE_PARAMI();
NETLIB_UPDATE_TERMINALSI();
@@ -141,7 +141,7 @@ namespace netlist {
}
protected:
- NETLIB_UPDATEI();
+ //NETLIB_UPDATEI();
NETLIB_RESETI();
NETLIB_UPDATE_PARAMI();
};
diff --git a/src/lib/netlist/analog/nlid_twoterm.cpp b/src/lib/netlist/analog/nlid_twoterm.cpp
index 0f6fc3688c2..3b57279ffca 100644
--- a/src/lib/netlist/analog/nlid_twoterm.cpp
+++ b/src/lib/netlist/analog/nlid_twoterm.cpp
@@ -83,9 +83,8 @@ void generic_diode::update_diode(const nl_double nVd)
// nld_twoterm
// ----------------------------------------------------------------------------------------
-NETLIB_UPDATE(twoterm)
+void NETLIB_NAME(twoterm)::solve_now()
{
- /* only called if connected to a rail net ==> notify the solver to recalculate */
/* we only need to call the non-rail terminal */
if (m_P.has_net() && !m_P.net().isRailNet())
m_P.solve_now();
@@ -93,6 +92,13 @@ NETLIB_UPDATE(twoterm)
m_N.solve_now();
}
+
+NETLIB_UPDATE(twoterm)
+{
+ /* only called if connected to a rail net ==> notify the solver to recalculate */
+ solve_now();
+}
+
// ----------------------------------------------------------------------------------------
// nld_R_base
// ----------------------------------------------------------------------------------------
@@ -103,18 +109,13 @@ NETLIB_RESET(R_base)
set_R(1.0 / exec().gmin());
}
-NETLIB_UPDATE(R_base)
-{
- NETLIB_NAME(twoterm)::update();
-}
-
// ----------------------------------------------------------------------------------------
// nld_R
// ----------------------------------------------------------------------------------------
NETLIB_UPDATE_PARAM(R)
{
- update_dev();
+ solve_now();
set_R(std::max(m_R(), exec().gmin()));
}
@@ -140,8 +141,8 @@ NETLIB_RESET(POT)
NETLIB_UPDATE_PARAM(POT)
{
- m_R1.update_dev();
- m_R2.update_dev();
+ m_R1.solve_now();
+ m_R2.solve_now();
nl_double v = m_Dial();
if (m_DialIsLog())
@@ -170,7 +171,7 @@ NETLIB_RESET(POT2)
NETLIB_UPDATE_PARAM(POT2)
{
- m_R1.update_dev();
+ m_R1.solve_now();
nl_double v = m_Dial();
@@ -197,11 +198,6 @@ NETLIB_UPDATE_PARAM(C)
m_GParallel = exec().gmin();
}
-NETLIB_UPDATE(C)
-{
- NETLIB_NAME(twoterm)::update();
-}
-
NETLIB_TIMESTEP(C)
{
/* Gpar should support convergence */
@@ -230,11 +226,6 @@ NETLIB_UPDATE_PARAM(L)
{
}
-NETLIB_UPDATE(L)
-{
- NETLIB_NAME(twoterm)::update();
-}
-
NETLIB_TIMESTEP(L)
{
/* Gpar should support convergence */
@@ -266,11 +257,6 @@ NETLIB_UPDATE_PARAM(D)
m_D.set_param(Is, n, exec().gmin());
}
-NETLIB_UPDATE(D)
-{
- NETLIB_NAME(twoterm)::update();
-}
-
NETLIB_UPDATE_TERMINALS(D)
{
m_D.update_diode(deltaV());
@@ -281,53 +267,6 @@ NETLIB_UPDATE_TERMINALS(D)
//set(m_D.G(), 0.0, m_D.Ieq());
}
-// ----------------------------------------------------------------------------------------
-// nld_VS
-// ----------------------------------------------------------------------------------------
-
-NETLIB_RESET(VS)
-{
- NETLIB_NAME(twoterm)::reset();
- this->set(1.0 / m_R(), m_V(), 0.0);
-}
-
-NETLIB_UPDATE(VS)
-{
- NETLIB_NAME(twoterm)::update();
-}
-
-NETLIB_TIMESTEP(VS)
-{
- this->set(1.0 / m_R(),
- m_compiled.evaluate(std::vector<double>({exec().time().as_double()})),
- 0.0);
-}
-
-// ----------------------------------------------------------------------------------------
-// nld_CS
-// ----------------------------------------------------------------------------------------
-
-NETLIB_RESET(CS)
-{
- NETLIB_NAME(twoterm)::reset();
- const nl_double I = m_I();
-
- set_mat(0.0, 0.0, -I,
- 0.0, 0.0, I);
- //this->set(0.0, 0.0, m_I());
-}
-
-NETLIB_UPDATE(CS)
-{
- NETLIB_NAME(twoterm)::update();
-}
-
-NETLIB_TIMESTEP(CS)
-{
- const double I = m_compiled.evaluate(std::vector<double>({exec().time().as_double()}));
- set_mat(0.0, 0.0, -I,
- 0.0, 0.0, I);
-}
} //namespace analog
diff --git a/src/lib/netlist/analog/nlid_twoterm.h b/src/lib/netlist/analog/nlid_twoterm.h
index cb856763176..ad59246643d 100644
--- a/src/lib/netlist/analog/nlid_twoterm.h
+++ b/src/lib/netlist/analog/nlid_twoterm.h
@@ -81,6 +81,8 @@ NETLIB_OBJECT(twoterm)
NETLIB_UPDATEI();
public:
+ void solve_now();
+
void set(const nl_double G, const nl_double V, const nl_double I)
{
/* GO, GT, I */
@@ -125,7 +127,7 @@ public:
protected:
NETLIB_RESETI();
- NETLIB_UPDATEI();
+ //NETLIB_UPDATEI();
};
@@ -233,7 +235,7 @@ public:
protected:
NETLIB_RESETI();
- NETLIB_UPDATEI();
+ //NETLIB_UPDATEI();
NETLIB_UPDATE_PARAMI();
private:
@@ -265,7 +267,7 @@ public:
protected:
NETLIB_RESETI();
- NETLIB_UPDATEI();
+ //NETLIB_UPDATEI();
NETLIB_UPDATE_PARAMI();
private:
@@ -381,7 +383,7 @@ public:
protected:
NETLIB_RESETI();
- NETLIB_UPDATEI();
+ //NETLIB_UPDATEI();
NETLIB_UPDATE_PARAMI();
generic_diode m_D;
@@ -398,6 +400,7 @@ NETLIB_OBJECT_DERIVED(VS, twoterm)
{
public:
NETLIB_CONSTRUCTOR_DERIVED(VS, twoterm)
+ , m_t(*this, "m_t", 0.0)
, m_R(*this, "R", 0.1)
, m_V(*this, "V", 0.0)
, m_func(*this,"FUNC", "")
@@ -410,12 +413,26 @@ public:
}
NETLIB_IS_TIMESTEP(m_func() != "")
- NETLIB_TIMESTEPI();
+
+ NETLIB_TIMESTEPI()
+ {
+ m_t += step;
+ this->set(1.0 / m_R(),
+ m_compiled.evaluate(std::vector<double>({m_t})),
+ 0.0);
+ }
protected:
- NETLIB_UPDATEI();
- NETLIB_RESETI();
+ // NETLIB_UPDATEI() { NETLIB_NAME(twoterm)::update(time); }
+
+ NETLIB_RESETI()
+ {
+ NETLIB_NAME(twoterm)::reset();
+ this->set(1.0 / m_R(), m_V(), 0.0);
+ }
+private:
+ state_var<double> m_t;
param_double_t m_R;
param_double_t m_V;
param_str_t m_func;
@@ -430,6 +447,7 @@ NETLIB_OBJECT_DERIVED(CS, twoterm)
{
public:
NETLIB_CONSTRUCTOR_DERIVED(CS, twoterm)
+ , m_t(*this, "m_t", 0.0)
, m_I(*this, "I", 1.0)
, m_func(*this,"FUNC", "")
, m_compiled(this->name() + ".FUNCC", this, this->state().run_state_manager())
@@ -441,12 +459,26 @@ public:
}
NETLIB_IS_TIMESTEP(m_func() != "")
- NETLIB_TIMESTEPI();
+ NETLIB_TIMESTEPI()
+ {
+ m_t += step;
+ const double I = m_compiled.evaluate(std::vector<double>({m_t}));
+ set_mat(0.0, 0.0, -I,
+ 0.0, 0.0, I);
+ }
+
protected:
- NETLIB_UPDATEI();
- NETLIB_RESETI();
+ //NETLIB_UPDATEI() { NETLIB_NAME(twoterm)::update(time); }
+ NETLIB_RESETI()
+ {
+ NETLIB_NAME(twoterm)::reset();
+ set_mat(0.0, 0.0, -m_I(),
+ 0.0, 0.0, m_I());
+ }
+private:
+ state_var<double> m_t;
param_double_t m_I;
param_str_t m_func;
plib::pfunction m_compiled;
diff --git a/src/lib/netlist/devices/nld_7475.cpp b/src/lib/netlist/devices/nld_7475.cpp
index 544cd84e73c..06e3c588081 100644
--- a/src/lib/netlist/devices/nld_7475.cpp
+++ b/src/lib/netlist/devices/nld_7475.cpp
@@ -101,7 +101,7 @@ namespace netlist
{
unsigned start_q = m_last_Q;
- NETLIB_PARENT_UPDATE(7477);
+ NETLIB_NAME(7477)::update();
for (std::size_t i=0; i<4; i++)
{
diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp
index e25a1d21d88..b08654c5e40 100644
--- a/src/lib/netlist/devices/nld_74ls629.cpp
+++ b/src/lib/netlist/devices/nld_74ls629.cpp
@@ -104,7 +104,10 @@ namespace netlist
}
NETLIB_UPDATEI();
- NETLIB_UPDATE_PARAMI() { update_dev(); }
+ NETLIB_UPDATE_PARAMI()
+ {
+ /* update param may be called from anywhere, update_dev(time) is not a good idea */
+ }
public:
NETLIB_SUB(SN74LS629clk) m_clock;
diff --git a/src/lib/netlist/devices/nld_r2r_dac.cpp b/src/lib/netlist/devices/nld_r2r_dac.cpp
index 4c29389d491..3a0ec2aea80 100644
--- a/src/lib/netlist/devices/nld_r2r_dac.cpp
+++ b/src/lib/netlist/devices/nld_r2r_dac.cpp
@@ -39,7 +39,7 @@ namespace netlist
NETLIB_UPDATE_PARAM(r2r_dac)
{
- update_dev();
+ solve_now();
double V = m_VIN() / static_cast<double>(1 << m_num())
* static_cast<double>(m_val());
diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp
index fa3726340a0..864362de783 100644
--- a/src/lib/netlist/devices/nld_system.cpp
+++ b/src/lib/netlist/devices/nld_system.cpp
@@ -51,43 +51,6 @@ namespace netlist
m_cnt = 0;
}
- // ----------------------------------------------------------------------------------------
- // logic_input
- // ----------------------------------------------------------------------------------------
-
- NETLIB_RESET(logic_input)
- {
- m_Q.initial(0);
- }
-
- NETLIB_UPDATE(logic_input)
- {
- m_Q.push(m_IN() & 1, netlist_time::from_nsec(1));
- }
-
- NETLIB_UPDATE_PARAM(logic_input)
- {
- }
-
- // ----------------------------------------------------------------------------------------
- // analog_input
- // ----------------------------------------------------------------------------------------
-
- NETLIB_RESET(analog_input)
- {
- m_Q.initial(0.0);
- }
-
- NETLIB_UPDATE(analog_input)
- {
- m_Q.push(m_IN());
- }
-
- NETLIB_UPDATE_PARAM(analog_input)
- {
- }
-
-
// -----------------------------------------------------------------------------
// nld_res_sw
// -----------------------------------------------------------------------------
diff --git a/src/lib/netlist/devices/nlid_proxy.cpp b/src/lib/netlist/devices/nlid_proxy.cpp
index d4163a74c42..24396bb54d7 100644
--- a/src/lib/netlist/devices/nlid_proxy.cpp
+++ b/src/lib/netlist/devices/nlid_proxy.cpp
@@ -126,11 +126,6 @@ namespace netlist
log().warning(MW_1_NO_POWER_TERMINALS_ON_DEVICE_1, out_proxied->device().name());
else
log().verbose("D/A Proxy: Found power terminals on device {1}", out_proxied->device().name());
-#if (0)
- printf("%s %s\n", out_proxied->name().c_str(), out_proxied->device().name().c_str());
- auto x = netlist().setup().find_terminal(out_proxied->name(), detail::device_object_t::terminal_type::OUTPUT, false);
- if (x) printf("==> %s\n", x->name().c_str());
-#endif
}
diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h
index 498ce657818..3d878646549 100644
--- a/src/lib/netlist/devices/nlid_system.h
+++ b/src/lib/netlist/devices/nlid_system.h
@@ -187,11 +187,9 @@ namespace netlist
set_logic_family(setup().family_from_model(m_FAMILY()));
}
- NETLIB_UPDATE_AFTER_PARAM_CHANGE()
-
- NETLIB_UPDATEI();
- NETLIB_RESETI();
- NETLIB_UPDATE_PARAMI();
+ NETLIB_UPDATEI() { }
+ NETLIB_RESETI() { m_Q.initial(0); }
+ NETLIB_UPDATE_PARAMI() { m_Q.push(m_IN() & 1, netlist_time::from_nsec(1)); }
protected:
logic_output_t m_Q;
@@ -207,11 +205,11 @@ namespace netlist
, m_IN(*this, "IN", 0.0)
{
}
- NETLIB_UPDATE_AFTER_PARAM_CHANGE()
- NETLIB_UPDATEI();
- NETLIB_RESETI();
- NETLIB_UPDATE_PARAMI();
+ NETLIB_UPDATEI() { }
+ NETLIB_RESETI() { m_Q.initial(0.0); }
+ NETLIB_UPDATE_PARAMI() { m_Q.push(m_IN()); }
+
protected:
analog_output_t m_Q;
param_double_t m_IN;
diff --git a/src/lib/netlist/devices/nlid_truthtable.cpp b/src/lib/netlist/devices/nlid_truthtable.cpp
index 4cebc8c1b4c..2377071c4e2 100644
--- a/src/lib/netlist/devices/nlid_truthtable.cpp
+++ b/src/lib/netlist/devices/nlid_truthtable.cpp
@@ -209,15 +209,6 @@ namespace netlist
}
m_ign = 0;
-
-#if 0
- printf("%s\n", name().c_str());
- for (int j=0; j < m_size; j++)
- printf("%05x %04x %04x %04x\n", j, m_ttp->m_out_state[j] & ((1 << m_NO)-1),
- m_ttp->m_out_state[j] >> m_NO, m_ttp->m_timing[j * m_NO + 0]);
- for (int k=0; m_ttp->m_timing_nt[k] != netlist_time::zero(); k++)
- printf("%d %f\n", k, m_ttp->m_timing_nt[k].as_double() * 1000000.0);
-#endif
}
// ----------------------------------------------------------------------------------------
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp
index bd4c8d77b41..f878be1e48a 100644
--- a/src/lib/netlist/nl_base.cpp
+++ b/src/lib/netlist/nl_base.cpp
@@ -168,7 +168,7 @@ void detail::queue_t::on_pre_save()
{
state().log().debug("on_pre_save\n");
m_qsize = this->size();
- state().log().debug("current time {1} qsize {2}\n", exec().time().as_double(), m_qsize);
+ state().log().debug("qsize {1}\n", m_qsize);
for (std::size_t i = 0; i < m_qsize; i++ )
{
m_times[i] = this->listptr()[i].m_exec_time.as_raw();
@@ -180,7 +180,7 @@ void detail::queue_t::on_pre_save()
void detail::queue_t::on_post_load()
{
this->clear();
- state().log().debug("current time {1} qsize {2}\n", exec().time().as_double(), m_qsize);
+ state().log().debug("qsize {1}\n", m_qsize);
for (std::size_t i = 0; i < m_qsize; i++ )
{
detail::net_t *n = state().nets()[m_net_ids[i]].get();
@@ -352,14 +352,20 @@ void netlist_state_t::reset()
std::unordered_map<core_device_t *, bool> m;
// Reset all nets once !
+ log().verbose("Call reset on all nets:");
for (auto & n : nets())
n->reset();
// Reset all devices once !
+ log().verbose("Call reset on all devices:");
for (auto & dev : m_devices)
dev->do_reset();
// Make sure everything depending on parameters is set
+ // Currently analog input and logic input also
+ // push their outputs to queue.
+
+ log().verbose("Call update_param on all devices:");
for (auto & dev : m_devices)
dev->update_param();
@@ -391,17 +397,6 @@ void netlist_state_t::reset()
if (!plib::container::contains(d, dev))
d.push_back(dev);
}
- log().verbose("Call update on devices which need parameter update:");
- for (auto & dev : m_devices)
- if (dev->needs_update_after_param_change())
- {
- if (!plib::container::contains(d, dev.get()))
- {
- d.push_back(dev.get());
- log().verbose("\t ...{1}", dev->name());
- dev->update_dev();
- }
- }
log().verbose("Devices not yet updated:");
for (auto &dev : m_devices)
if (!plib::container::contains(d, dev.get()))
@@ -1061,8 +1056,6 @@ param_t::param_type_t param_t::param_type() const
void param_t::update_param()
{
device().update_param();
- if (device().needs_update_after_param_change())
- device().update_dev();
}
pstring param_t::get_initial(const device_t &dev, bool *found)
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index 4029ba2f99b..69e7ede2b80 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -123,9 +123,6 @@ class NETLIB_NAME(name) : public device_t
#define NETLIB_TIMESTEPI() \
public: virtual void timestep(const nl_double step) override
-#define NETLIB_UPDATE_AFTER_PARAM_CHANGE() \
- public: virtual bool needs_update_after_param_change() const override { return true; }
-
#define NETLIB_FAMILY(family) , m_famsetter(*this, family)
#define NETLIB_DELEGATE(chip, name) nldelegate(&NETLIB_NAME(chip) :: name, this)
@@ -141,18 +138,15 @@ class NETLIB_NAME(name) : public device_t
#define NETLIB_SUB(chip) nld_ ## chip
#define NETLIB_SUBXX(ns, chip) std::unique_ptr< ns :: nld_ ## chip >
-#define NETLIB_HANDLER(chip, name) void NETLIB_NAME(chip) :: name(void) NL_NOEXCEPT
+#define NETLIB_HANDLER(chip, name) void NETLIB_NAME(chip) :: name() NL_NOEXCEPT
#define NETLIB_UPDATE(chip) NETLIB_HANDLER(chip, update)
-// FIXME: NETLIB_PARENT_UPDATE should disappear
-#define NETLIB_PARENT_UPDATE(chip) NETLIB_NAME(chip) :: update()
-
#define NETLIB_RESET(chip) void NETLIB_NAME(chip) :: reset(void)
-#define NETLIB_UPDATE_PARAM(chip) void NETLIB_NAME(chip) :: update_param(void)
+#define NETLIB_UPDATE_PARAM(chip) void NETLIB_NAME(chip) :: update_param()
#define NETLIB_FUNC_VOID(chip, name, params) void NETLIB_NAME(chip) :: name params
-#define NETLIB_UPDATE_TERMINALS(chip) void NETLIB_NAME(chip) :: update_terminals(void)
+#define NETLIB_UPDATE_TERMINALS(chip) void NETLIB_NAME(chip) :: update_terminals()
//============================================================
// Asserts
@@ -727,19 +721,19 @@ namespace netlist
void toggle_new_Q() noexcept { m_new_Q = (m_cur_Q ^ 1); }
- void toggle_and_push_to_queue(const netlist_time delay) NL_NOEXCEPT
+ void toggle_and_push_to_queue(netlist_time delay) NL_NOEXCEPT
{
toggle_new_Q();
push_to_queue(delay);
}
- void push_to_queue(const netlist_time delay) NL_NOEXCEPT;
+ void push_to_queue(netlist_time delay) NL_NOEXCEPT;
bool is_queued() const noexcept { return m_in_queue == QS_QUEUED; }
void update_devs() NL_NOEXCEPT;
const netlist_time time() const noexcept { return m_time; }
- void set_time(const netlist_time ntime) noexcept { m_time = ntime; }
+ void set_time(netlist_time ntime) noexcept { m_time = ntime; }
bool isRailNet() const noexcept { return !(m_railterminal == nullptr); }
core_terminal_t & railterminal() const noexcept { return *m_railterminal; }
@@ -979,7 +973,7 @@ namespace netlist
virtual ~param_str_t();
const pstring &operator()() const NL_NOEXCEPT { return Value(); }
- void setTo(const pstring &param) NL_NOEXCEPT
+ void setTo(netlist_time time, const pstring &param) NL_NOEXCEPT
{
if (m_param != param)
{
@@ -1086,6 +1080,7 @@ namespace netlist
virtual ~core_device_t();
+ // FIXME: useless trampoline
void update_dev() NL_NOEXCEPT
{
do_update();
@@ -1139,7 +1134,6 @@ namespace netlist
virtual void update_param() {}
virtual bool is_dynamic() const { return false; }
virtual bool is_timestep() const { return false; }
- virtual bool needs_update_after_param_change() const { return false; }
private:
bool m_hint_deactivate;
diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp
index 973b1b7814f..998f1a5870b 100644
--- a/src/lib/netlist/nl_factory.cpp
+++ b/src/lib/netlist/nl_factory.cpp
@@ -67,11 +67,7 @@ void list_t::register_device(std::unique_ptr<element_t> &&factory)
{
for (auto & e : *this)
if (e->name() == factory->name())
- {
- // FIXME: throws pure virtual exception
- printf("%s\n", e->name().c_str());
m_setup.log().fatal(MF_1_FACTORY_ALREADY_CONTAINS_1, factory->name());
- }
push_back(std::move(factory));
}
diff --git a/src/lib/netlist/plib/gmres.h b/src/lib/netlist/plib/gmres.h
index 7a24de8e03f..edda011dc19 100644
--- a/src/lib/netlist/plib/gmres.h
+++ b/src/lib/netlist/plib/gmres.h
@@ -213,7 +213,6 @@ namespace plib
const float_type rho_to_accuracy = std::sqrt(vec_mult2<FT>(n, Ax)) / accuracy;
rho_delta = accuracy * rho_to_accuracy;
- //printf("%e %e\n", rho_delta, accuracy * std::sqrt(static_cast<FT>(n)));
}
else
rho_delta = accuracy * std::sqrt(static_cast<FT>(n));
diff --git a/src/lib/netlist/plib/palloc.cpp b/src/lib/netlist/plib/palloc.cpp
index fa87c1cf94f..80fd2098a66 100644
--- a/src/lib/netlist/plib/palloc.cpp
+++ b/src/lib/netlist/plib/palloc.cpp
@@ -8,6 +8,7 @@
#include "pconfig.h"
#include "palloc.h"
#include "pfmtlog.h"
+#include "pexception.h"
#include <algorithm>
@@ -91,7 +92,7 @@ void mempool::free(void *ptr)
auto i = reinterpret_cast<info *>(p - mininfosize());
block *b = i->m_block;
if (b->m_num_alloc == 0)
- fprintf(stderr, "Argh .. double free\n");
+ plib::pexception("mempool::free - double free was called\n");
else
{
//b->m_free = m_min_alloc;
diff --git a/src/lib/netlist/plib/pfunction.cpp b/src/lib/netlist/plib/pfunction.cpp
index f08fa2c60ea..3a1ef9d841b 100644
--- a/src/lib/netlist/plib/pfunction.cpp
+++ b/src/lib/netlist/plib/pfunction.cpp
@@ -117,7 +117,6 @@ void pfunction::compile_infix(const std::vector<pstring> &inputs, const pstring
std::stack<pstring> opstk;
std::vector<pstring> postfix;
- //printf("dbg: %s\n", expr.c_str());
for (unsigned i = 0; i < sexpr.size(); i++)
{
pstring &s = sexpr[i];
diff --git a/src/lib/netlist/plib/pstate.cpp b/src/lib/netlist/plib/pstate.cpp
index 043033ed1ea..3cab5dec127 100644
--- a/src/lib/netlist/plib/pstate.cpp
+++ b/src/lib/netlist/plib/pstate.cpp
@@ -59,7 +59,6 @@ void state_manager_t::post_load()
template<> void state_manager_t::save_item(const void *owner, callback_t &state, const pstring &stname)
{
- //save_state_ptr(stname, DT_CUSTOM, 0, 1, &state);
callback_t *state_p = &state;
auto p = plib::make_unique<entry_t>(stname, owner, state_p);
m_custom.push_back(std::move(p));
diff --git a/src/lib/netlist/plib/pstream.cpp b/src/lib/netlist/plib/pstream.cpp
index 9c99438811c..a204bdcfe33 100644
--- a/src/lib/netlist/plib/pstream.cpp
+++ b/src/lib/netlist/plib/pstream.cpp
@@ -169,7 +169,6 @@ void pofilestream::vwrite(const value_type *buf, const pos_type n)
std::size_t r = fwrite(buf, 1, n, static_cast<FILE *>(m_file));
if (r < n)
{
- //printf("%ld %ld %s\n", r, n, strerror(errno));
if (ferror(static_cast<FILE *>(m_file)))
throw file_write_e(m_filename);
}
diff --git a/src/lib/netlist/plib/putil.cpp b/src/lib/netlist/plib/putil.cpp
index 92e0e6b3ab1..19f66ba6cbb 100644
--- a/src/lib/netlist/plib/putil.cpp
+++ b/src/lib/netlist/plib/putil.cpp
@@ -33,10 +33,10 @@ namespace plib
const pstring environment(const pstring &var, const pstring &default_val)
{
- if (getenv(var.c_str()) == nullptr)
+ if (std::getenv(var.c_str()) == nullptr)
return default_val;
else
- return pstring(getenv(var.c_str()));
+ return pstring(std::getenv(var.c_str()));
}
}
diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp
index 1a82df36dcc..f77a5966b0e 100644
--- a/src/lib/netlist/prg/nltool.cpp
+++ b/src/lib/netlist/prg/nltool.cpp
@@ -693,10 +693,6 @@ int tool_app_t::execute()
plib::fpsignalenabler::global_enable(true);
plib::fpsignalenabler sigen(plib::FP_ALL & ~plib::FP_INEXACT & ~plib::FP_UNDERFLOW);
- //perr("{}", "WARNING: This is Work In Progress! - It may fail anytime\n");
- //perr("Update dispatching using method {}\n", pmf_verbose[NL_PMF_TYPE]);
- //printf("test2 %f\n", std::exp(-14362.38064713));
-
if (opt_help())
{
pout(usage());
diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp
index 2c530b219cc..30e47c9ba72 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.cpp
+++ b/src/lib/netlist/solver/nld_matrix_solver.cpp
@@ -429,7 +429,7 @@ void matrix_solver_t::reset()
void matrix_solver_t::update() NL_NOEXCEPT
{
- const netlist_time new_timestep = solve();
+ const netlist_time new_timestep = solve(exec().time());
update_inputs();
if (m_params.m_dynamic_ts && has_timestep_devices() && new_timestep > netlist_time::zero())
@@ -438,9 +438,15 @@ void matrix_solver_t::update() NL_NOEXCEPT
}
}
+/* update_forced is called from within param_update
+ *
+ * this should only occur outside of execution and thus
+ * using time should be safe.
+ *
+ */
void matrix_solver_t::update_forced()
{
- const netlist_time new_timestep = solve();
+ const netlist_time new_timestep = solve(exec().time());
plib::unused_var(new_timestep);
update_inputs();
@@ -458,7 +464,7 @@ void matrix_solver_t::step(const netlist_time &delta)
m_step_devices[k]->timestep(dd);
}
-void matrix_solver_t::solve_base()
+void matrix_solver_t::solve_base(netlist_time time)
{
++m_stat_vsolver_calls;
if (has_dynamic_devices())
@@ -487,9 +493,8 @@ void matrix_solver_t::solve_base()
}
}
-const netlist_time matrix_solver_t::solve()
+const netlist_time matrix_solver_t::solve(netlist_time now)
{
- const netlist_time now = exec().time();
const netlist_time delta = now - m_last_step;
// We are already up to date. Avoid oscillations.
@@ -500,7 +505,7 @@ const netlist_time matrix_solver_t::solve()
/* update all terminals for new time step */
m_last_step = now;
step(delta);
- solve_base();
+ solve_base(now);
const netlist_time next_time_step = compute_next_timestep(delta.as_double());
return next_time_step;
@@ -614,7 +619,6 @@ netlist_time matrix_solver_t::compute_next_timestep(const double cur_ts)
const nl_double DD_n = (n->Q_Analog() - t->m_last_V);
const nl_double hn = cur_ts;
- //printf("%f %f %f %f\n", DD_n, t->m_DD_n_m_1, hn, t->m_h_n_m_1);
nl_double DD2 = (DD_n / hn - t->m_DD_n_m_1 / t->m_h_n_m_1) / (hn + t->m_h_n_m_1);
nl_double new_net_timestep;
diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h
index cd785db9cba..2f4e692ed6f 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.h
+++ b/src/lib/netlist/solver/nld_matrix_solver.h
@@ -143,12 +143,12 @@ public:
vsetup(nets);
}
- void solve_base();
+ void solve_base(netlist_time time);
/* after every call to solve, update inputs must be called.
* this can be done as well as a batch to ease parallel processing.
*/
- const netlist_time solve();
+ const netlist_time solve(netlist_time now);
void update_inputs();
bool has_dynamic_devices() const { return m_dynamic_devices.size() > 0; }
diff --git a/src/lib/netlist/solver/nld_ms_sor_mat.h b/src/lib/netlist/solver/nld_ms_sor_mat.h
index 1892ed472f5..a64d6a9659a 100644
--- a/src/lib/netlist/solver/nld_ms_sor_mat.h
+++ b/src/lib/netlist/solver/nld_ms_sor_mat.h
@@ -161,11 +161,9 @@ unsigned matrix_solver_SOR_mat_t<FT, SIZE>::vsolve_non_dynamic(const bool newton
lambda1 = akk;
#endif
}
- //printf("lambda: %f %f\n", lambda, 2.0 / (1.0 + 2 * sqrt(lambda)) );
//ws = 2.0 / (2.0 - lambdaN - lambda1);
m_omega = 2.0 / (2.0 - lambda1);
- //printf("%f %f %f\n", m_omega, lambda1, lambdaN);
}
#endif
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp
index a7c2f1fc196..ac7f9155feb 100644
--- a/src/lib/netlist/solver/nld_solver.cpp
+++ b/src/lib/netlist/solver/nld_solver.cpp
@@ -93,9 +93,10 @@ NETLIB_UPDATE(solver)
if (m_params.m_dynamic_ts)
return;
+ netlist_time now(exec().time());
/* force solving during start up if there are no time-step devices */
/* FIXME: Needs a more elegant solution */
- bool force_solve = (exec().time() < netlist_time::from_double(2 * m_params.m_max_timestep));
+ bool force_solve = (now < netlist_time::from_double(2 * m_params.m_max_timestep));
std::size_t nthreads = std::min(static_cast<std::size_t>(m_parallel()), plib::omp::get_max_threads());
@@ -104,16 +105,16 @@ NETLIB_UPDATE(solver)
if (nthreads > 1 && solvers.size() > 1)
{
plib::omp::set_num_threads(nthreads);
- plib::omp::for_static(static_cast<std::size_t>(0), solvers.size(), [&solvers](std::size_t i)
+ plib::omp::for_static(static_cast<std::size_t>(0), solvers.size(), [&solvers, now](std::size_t i)
{
- const netlist_time ts = solvers[i]->solve();
+ const netlist_time ts = solvers[i]->solve(now);
plib::unused_var(ts);
});
}
else
for (auto & solver : solvers)
{
- const netlist_time ts = solver->solve();
+ const netlist_time ts = solver->solve(now);
plib::unused_var(ts);
}
diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp
index 998ebf53c7e..da9325d70d9 100644
--- a/src/lib/netlist/tools/nl_convert.cpp
+++ b/src/lib/netlist/tools/nl_convert.cpp
@@ -165,7 +165,6 @@ void nl_convert_base_t::dump_nl()
net_t * net = i.second.get();
if (!net->is_no_export())
{
- //printf("Net {}\n", net->name().c_str());
out("NET_C({}", net->terminals()[0].c_str() );
for (std::size_t j=1; j<net->terminals().size(); j++)
{
diff --git a/src/mame/audio/nl_kidniki.cpp b/src/mame/audio/nl_kidniki.cpp
index 835ed884545..7865ea40750 100644
--- a/src/mame/audio/nl_kidniki.cpp
+++ b/src/mame/audio/nl_kidniki.cpp
@@ -2,7 +2,7 @@
// copyright-holders:Andrew Gardner, Couriersud
#include "netlist/devices/net_lib.h"
-#define USE_FRONTIERS 0
+#define USE_FRONTIERS 1
#define USE_FIXED_STV 1
/* ----------------------------------------------------------------------------
@@ -326,8 +326,8 @@ NETLIST_START(kidniki)
PARAM(Solver.ACCURACY, 1e-7)
PARAM(Solver.NR_LOOPS, 100)
PARAM(Solver.GS_LOOPS, 300)
- //PARAM(Solver.METHOD, "MAT_CR")
- PARAM(Solver.METHOD, "GMRES")
+ PARAM(Solver.METHOD, "MAT_CR")
+ //PARAM(Solver.METHOD, "GMRES")
//PARAM(Solver.SOR_FACTOR, 1.73)
//PARAM(Solver.METHOD, "SOR")
#endif