mirror of
https://github.com/holub/mame
synced 2025-04-25 09:50:04 +03:00
Fix startup when there are no timestep devices present, i.e. Capacitors
or inductors. (nw)
This commit is contained in:
parent
02108b60e8
commit
e788dc5dbe
@ -119,25 +119,38 @@ NETLIB_UPDATE(R_base)
|
||||
NETLIB_UPDATE_PARAM(R)
|
||||
{
|
||||
update_dev();
|
||||
if (m_R() > 1e-9)
|
||||
set_R(m_R());
|
||||
else
|
||||
set_R(1e-9);
|
||||
set_R(std::max(m_R(), netlist().gmin()));
|
||||
}
|
||||
|
||||
NETLIB_RESET(R)
|
||||
{
|
||||
NETLIB_NAME(twoterm)::reset();
|
||||
set_R(std::max(m_R(), netlist().gmin()));
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
// nld_POT
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
NETLIB_UPDATE_PARAM(POT)
|
||||
NETLIB_RESET(POT)
|
||||
{
|
||||
nl_double v = m_Dial();
|
||||
if (m_DialIsLog())
|
||||
v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0);
|
||||
|
||||
m_R1.set_R(std::max(m_R() * v, netlist().gmin()));
|
||||
m_R2.set_R(std::max(m_R() * (NL_FCONST(1.0) - v), netlist().gmin()));
|
||||
}
|
||||
|
||||
NETLIB_UPDATE_PARAM(POT)
|
||||
{
|
||||
m_R1.update_dev();
|
||||
m_R2.update_dev();
|
||||
|
||||
nl_double v = m_Dial();
|
||||
if (m_DialIsLog())
|
||||
v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0);
|
||||
|
||||
m_R1.set_R(std::max(m_R() * v, netlist().gmin()));
|
||||
m_R2.set_R(std::max(m_R() * (NL_FCONST(1.0) - v), netlist().gmin()));
|
||||
|
||||
@ -147,7 +160,7 @@ NETLIB_UPDATE_PARAM(POT)
|
||||
// nld_POT2
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
NETLIB_UPDATE_PARAM(POT2)
|
||||
NETLIB_RESET(POT2)
|
||||
{
|
||||
nl_double v = m_Dial();
|
||||
|
||||
@ -155,9 +168,20 @@ NETLIB_UPDATE_PARAM(POT2)
|
||||
v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0);
|
||||
if (m_Reverse())
|
||||
v = 1.0 - v;
|
||||
m_R1.set_R(std::max(m_R() * v, netlist().gmin()));
|
||||
}
|
||||
|
||||
|
||||
NETLIB_UPDATE_PARAM(POT2)
|
||||
{
|
||||
m_R1.update_dev();
|
||||
|
||||
nl_double v = m_Dial();
|
||||
|
||||
if (m_DialIsLog())
|
||||
v = (std::exp(v) - 1.0) / (std::exp(1.0) - 1.0);
|
||||
if (m_Reverse())
|
||||
v = 1.0 - v;
|
||||
m_R1.set_R(std::max(m_R() * v, netlist().gmin()));
|
||||
}
|
||||
|
||||
@ -222,6 +246,15 @@ NETLIB_TIMESTEP(L)
|
||||
// nld_D
|
||||
// ----------------------------------------------------------------------------------------
|
||||
|
||||
NETLIB_RESET(D)
|
||||
{
|
||||
nl_double Is = m_model.model_value("IS");
|
||||
nl_double n = m_model.model_value("N");
|
||||
|
||||
m_D.set_param(Is, n, netlist().gmin());
|
||||
set(m_D.G(), 0.0, m_D.Ieq());
|
||||
}
|
||||
|
||||
NETLIB_UPDATE_PARAM(D)
|
||||
{
|
||||
nl_double Is = m_model.model_value("IS");
|
||||
|
@ -189,7 +189,7 @@ NETLIB_OBJECT_DERIVED(R, R_base)
|
||||
|
||||
protected:
|
||||
|
||||
//NETLIB_RESETI() { }
|
||||
NETLIB_RESETI();
|
||||
//NETLIB_UPDATEI() { }
|
||||
NETLIB_UPDATE_PARAMI();
|
||||
};
|
||||
@ -216,7 +216,7 @@ NETLIB_OBJECT(POT)
|
||||
}
|
||||
|
||||
//NETLIB_UPDATEI();
|
||||
//NETLIB_RESETI();
|
||||
NETLIB_RESETI();
|
||||
NETLIB_UPDATE_PARAMI();
|
||||
|
||||
private:
|
||||
@ -243,7 +243,7 @@ NETLIB_OBJECT(POT2)
|
||||
}
|
||||
|
||||
//NETLIB_UPDATEI();
|
||||
//NETLIB_RESETI();
|
||||
NETLIB_RESETI();
|
||||
NETLIB_UPDATE_PARAMI();
|
||||
|
||||
private:
|
||||
@ -375,7 +375,7 @@ public:
|
||||
param_model_t m_model;
|
||||
|
||||
protected:
|
||||
//NETLIB_RESETI();
|
||||
NETLIB_RESETI();
|
||||
NETLIB_UPDATEI();
|
||||
NETLIB_UPDATE_PARAMI();
|
||||
|
||||
|
@ -449,7 +449,6 @@ const netlist_time matrix_solver_t::solve()
|
||||
step(delta);
|
||||
solve_base();
|
||||
const netlist_time next_time_step = compute_next_timestep(delta.as_double());
|
||||
|
||||
update_inputs();
|
||||
|
||||
return next_time_step;
|
||||
|
@ -87,6 +87,9 @@ NETLIB_UPDATE(solver)
|
||||
if (m_params.m_dynamic)
|
||||
return;
|
||||
|
||||
/* force solving during start up if there are no time-step devices */
|
||||
/* FIXME: Needs a more elegant solution */
|
||||
bool force_solve = (netlist().time() < netlist_time::from_double(2 * m_params.m_max_timestep));
|
||||
|
||||
#if HAS_OPENMP && USE_OPENMP
|
||||
const std::size_t t_cnt = m_mat_solvers.size();
|
||||
@ -114,7 +117,7 @@ NETLIB_UPDATE(solver)
|
||||
}
|
||||
#else
|
||||
for (auto & solver : m_mat_solvers)
|
||||
if (solver->has_timestep_devices())
|
||||
if (solver->has_timestep_devices() || force_solve)
|
||||
// Ignore return value
|
||||
ATTR_UNUSED const netlist_time ts = solver->solve();
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user