diff --git a/src/lib/netlist/analog/nld_twoterm.cpp b/src/lib/netlist/analog/nld_twoterm.cpp index 977674a2f0e..5a59296a422 100644 --- a/src/lib/netlist/analog/nld_twoterm.cpp +++ b/src/lib/netlist/analog/nld_twoterm.cpp @@ -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"); diff --git a/src/lib/netlist/analog/nld_twoterm.h b/src/lib/netlist/analog/nld_twoterm.h index 4938c569f0d..d280f95044b 100644 --- a/src/lib/netlist/analog/nld_twoterm.h +++ b/src/lib/netlist/analog/nld_twoterm.h @@ -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(); diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp index d6032e65912..128a2bc2031 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.cpp +++ b/src/lib/netlist/solver/nld_matrix_solver.cpp @@ -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; diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 25b32401620..7b86a3e46e6 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -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