diff --git a/src/lib/netlist/analog/nld_bjt.cpp b/src/lib/netlist/analog/nld_bjt.cpp index 06835009f50..0f50a9103fb 100644 --- a/src/lib/netlist/analog/nld_bjt.cpp +++ b/src/lib/netlist/analog/nld_bjt.cpp @@ -293,10 +293,10 @@ NETLIB_RESET(QBJT_switch) m_state_on = 0; - m_RB.set(exec().gmin(), 0.0, 0.0); - m_RC.set(exec().gmin(), 0.0, 0.0); + m_RB.set_G_V_I(exec().gmin(), 0.0, 0.0); + m_RC.set_G_V_I(exec().gmin(), 0.0, 0.0); - m_BC_dummy.set(exec().gmin() / 10.0, 0.0, 0.0); + m_BC_dummy.set_G_V_I(exec().gmin() / 10.0, 0.0, 0.0); } @@ -351,8 +351,8 @@ NETLIB_UPDATE_TERMINALS(QBJT_switch) const nl_double gc = new_state ? m_gC : exec().gmin(); const nl_double v = new_state ? m_V * m : 0; - m_RB.set(gb, v, 0.0); - m_RC.set(gc, 0.0, 0.0); + m_RB.set_G_V_I(gb, v, 0.0); + m_RC.set_G_V_I(gc, 0.0, 0.0); m_state_on = new_state; } } diff --git a/src/lib/netlist/analog/nlid_fourterm.cpp b/src/lib/netlist/analog/nlid_fourterm.cpp index 9e5c2e46932..7fa6a2f3809 100644 --- a/src/lib/netlist/analog/nlid_fourterm.cpp +++ b/src/lib/netlist/analog/nlid_fourterm.cpp @@ -26,14 +26,14 @@ NETLIB_RESET(VCCS) const nl_double m_mult = m_G() * m_gfac; // 1.0 ==> 1V ==> 1A const nl_double GI = plib::constants::one() / m_RI(); - m_IP.set(GI); - m_IN.set(GI); + m_IP.set_conductivity(GI); + m_IN.set_conductivity(GI); - m_OP.set(m_mult, plib::constants::zero()); - m_OP1.set(-m_mult, plib::constants::zero()); + m_OP.set_go_gt(-m_mult, plib::constants::zero()); + m_OP1.set_go_gt(m_mult, plib::constants::zero()); - m_ON.set(-m_mult, plib::constants::zero()); - m_ON1.set(m_mult, plib::constants::zero()); + m_ON.set_go_gt(m_mult, plib::constants::zero()); + m_ON1.set_go_gt(-m_mult, plib::constants::zero()); } NETLIB_UPDATE(VCCS) @@ -79,11 +79,11 @@ NETLIB_UPDATE_TERMINALS(LVCCS) const nl_double beta = m_mult * (1.0 - X*X); const nl_double I = m_cur_limit() * X - beta * m_vi; - m_OP.set(beta, plib::constants::zero(), I); - m_OP1.set(-beta, plib::constants::zero()); + m_OP.set_go_gt_I(-beta, plib::constants::zero(), I); + m_OP1.set_go_gt(beta, plib::constants::zero()); - m_ON.set(-beta, plib::constants::zero(), -I); - m_ON1.set(beta, plib::constants::zero()); + m_ON.set_go_gt_I(beta, plib::constants::zero(), -I); + m_ON1.set_go_gt(-beta, plib::constants::zero()); } // ---------------------------------------------------------------------------------------- @@ -109,8 +109,8 @@ NETLIB_RESET(VCVS) m_gfac = plib::constants::one() / m_RO(); NETLIB_NAME(VCCS)::reset(); - m_OP2.set(plib::constants::one() / m_RO()); - m_ON2.set(plib::constants::one() / m_RO()); + m_OP2.set_conductivity(plib::constants::one() / m_RO()); + m_ON2.set_conductivity(plib::constants::one() / m_RO()); } } //namespace analog diff --git a/src/lib/netlist/analog/nlid_twoterm.cpp b/src/lib/netlist/analog/nlid_twoterm.cpp index 9b79c323ba4..d5578ccd5bb 100644 --- a/src/lib/netlist/analog/nlid_twoterm.cpp +++ b/src/lib/netlist/analog/nlid_twoterm.cpp @@ -198,7 +198,7 @@ NETLIB_UPDATE_PARAM(POT2) NETLIB_RESET(C) { // FIXME: Startup conditions - set(exec().gmin(), 0.0, -5.0 / exec().gmin()); + set_G_V_I(exec().gmin(), 0.0, -5.0 / exec().gmin()); //set(exec().gmin(), 0.0, 0.0); } @@ -255,7 +255,7 @@ NETLIB_RESET(D) nl_double n = m_model.m_N; m_D.set_param(Is, n, exec().gmin()); - set(m_D.G(), 0.0, m_D.Ieq()); + set_G_V_I(m_D.G(), 0.0, m_D.Ieq()); } NETLIB_UPDATE_PARAM(D) diff --git a/src/lib/netlist/analog/nlid_twoterm.h b/src/lib/netlist/analog/nlid_twoterm.h index 06c278d58a3..06a4bc6e1d7 100644 --- a/src/lib/netlist/analog/nlid_twoterm.h +++ b/src/lib/netlist/analog/nlid_twoterm.h @@ -86,11 +86,11 @@ public: void solve_later(netlist_time delay = netlist_time::from_nsec(1)); - void set(const nl_double G, const nl_double V, const nl_double I) + void set_G_V_I(const nl_double G, const nl_double V, const nl_double I) { /* GO, GT, I */ - m_P.set( G, G, ( V) * G - I); - m_N.set( G, G, ( -V) * G + I); + m_P.set_go_gt_I( -G, G, ( V) * G - I); + m_N.set_go_gt_I( -G, G, ( -V) * G + I); } nl_double deltaV() const @@ -98,12 +98,12 @@ public: return m_P.net().Q_Analog() - m_N.net().Q_Analog(); } - void set_mat(const nl_double a11, const nl_double a12, const nl_double r1, - const nl_double a21, const nl_double a22, const nl_double r2) + void set_mat(const nl_double a11, const nl_double a12, const nl_double rhs1, + const nl_double a21, const nl_double a22, const nl_double rhs2) { /* GO, GT, I */ - m_P.set(-a12, a11, r1); - m_N.set(-a21, a22, r2); + m_P.set_go_gt_I(a12, a11, rhs1); + m_N.set_go_gt_I(a21, a22, rhs2); } private: @@ -420,7 +420,7 @@ public: NETLIB_TIMESTEPI() { m_t += step; - this->set(1.0 / m_R(), + this->set_G_V_I(1.0 / m_R(), m_compiled.evaluate(std::vector({m_t})), 0.0); } @@ -431,7 +431,7 @@ protected: NETLIB_RESETI() { NETLIB_NAME(twoterm)::reset(); - this->set(1.0 / m_R(), m_V(), 0.0); + this->set_G_V_I(1.0 / m_R(), m_V(), 0.0); } private: diff --git a/src/lib/netlist/devices/nld_mm5837.cpp b/src/lib/netlist/devices/nld_mm5837.cpp index 917fcee4221..f6c2566bd43 100644 --- a/src/lib/netlist/devices/nld_mm5837.cpp +++ b/src/lib/netlist/devices/nld_mm5837.cpp @@ -69,7 +69,7 @@ namespace netlist { //m_V0.initial(0.0); //m_RV.do_reset(); - m_RV.set(plib::constants::one() / R_LOW, 0.0, 0.0); + m_RV.set_G_V_I(plib::constants::one() / R_LOW, 0.0, 0.0); m_inc = netlist_time::from_double(1.0 / m_FREQ()); if (m_FREQ() < 24000 || m_FREQ() > 56000) log().warning(MW_1_FREQUENCY_OUTSIDE_OF_SPECS_1, m_FREQ()); @@ -108,7 +108,7 @@ namespace netlist // We only need to update the net first if this is a time stepping net if (m_is_timestep) m_RV.update(); - m_RV.set(plib::constants::one() / R, V, plib::constants::zero()); + m_RV.set_G_V_I(plib::constants::one() / R, V, plib::constants::zero()); m_RV.solve_later(NLTIME_FROM_NS(1)); } diff --git a/src/lib/netlist/devices/nld_r2r_dac.cpp b/src/lib/netlist/devices/nld_r2r_dac.cpp index ac1e26a4e1d..284b6673f76 100644 --- a/src/lib/netlist/devices/nld_r2r_dac.cpp +++ b/src/lib/netlist/devices/nld_r2r_dac.cpp @@ -44,7 +44,7 @@ namespace netlist double V = m_VIN() / static_cast(1 << m_num()) * static_cast(m_val()); - this->set(1.0 / m_R(), V, 0.0); + this->set_G_V_I(1.0 / m_R(), V, 0.0); } } //namespace analog diff --git a/src/lib/netlist/devices/nld_schmitt.cpp b/src/lib/netlist/devices/nld_schmitt.cpp index 92bf75b5a89..f219d215520 100644 --- a/src/lib/netlist/devices/nld_schmitt.cpp +++ b/src/lib/netlist/devices/nld_schmitt.cpp @@ -85,8 +85,8 @@ namespace netlist m_RVI.reset(); m_RVO.reset(); m_is_timestep = m_RVO.m_P.net().solver()->has_timestep_devices(); - m_RVI.set(plib::constants::one() / m_model.m_RI, m_model.m_VI, 0.0); - m_RVO.set(plib::constants::one() / m_model.m_ROL, m_model.m_VOL, 0.0); + m_RVI.set_G_V_I(plib::constants::one() / m_model.m_RI, m_model.m_VI, 0.0); + m_RVO.set_G_V_I(plib::constants::one() / m_model.m_ROL, m_model.m_VOL, 0.0); } NETLIB_UPDATEI() @@ -98,7 +98,7 @@ namespace netlist m_last_state = 0; if (m_is_timestep) m_RVO.update(); - m_RVO.set(plib::constants::one() / m_model.m_ROH, m_model.m_VOH, 0.0); + m_RVO.set_G_V_I(plib::constants::one() / m_model.m_ROH, m_model.m_VOH, 0.0); m_RVO.solve_later(); } } @@ -109,7 +109,7 @@ namespace netlist m_last_state = 1; if (m_is_timestep) m_RVO.update(); - m_RVO.set(plib::constants::one() / m_model.m_ROL, m_model.m_VOL, 0.0); + m_RVO.set_G_V_I(plib::constants::one() / m_model.m_ROL, m_model.m_VOL, 0.0); m_RVO.solve_later(); } } diff --git a/src/lib/netlist/devices/nlid_proxy.cpp b/src/lib/netlist/devices/nlid_proxy.cpp index 883aea738f0..a2fd18e85a7 100644 --- a/src/lib/netlist/devices/nlid_proxy.cpp +++ b/src/lib/netlist/devices/nlid_proxy.cpp @@ -122,7 +122,7 @@ namespace netlist m_last_state = -1; m_RV.reset(); m_is_timestep = m_RV.m_P.net().solver()->has_timestep_devices(); - m_RV.set(plib::constants::one() / logic_family()->R_low(), + m_RV.set_G_V_I(plib::constants::one() / logic_family()->R_low(), logic_family()->low_V(0.0, supply_V), 0.0); } @@ -143,7 +143,7 @@ namespace netlist { m_RV.update(); } - m_RV.set(plib::constants::one() / R, V, 0.0); + m_RV.set_G_V_I(plib::constants::one() / R, V, 0.0); m_RV.solve_later(); } } diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index b5febc6ae3b..95712fc3416 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -280,8 +280,8 @@ namespace netlist NETLIB_RESETI() { - m_RIN.set(1.0 / m_p_RIN(),0,0); - m_ROUT.set(1.0 / m_p_ROUT(),0,0); + m_RIN.set_G_V_I(1.0 / m_p_RIN(),0,0); + m_ROUT.set_G_V_I(1.0 / m_p_ROUT(),0,0); } NETLIB_UPDATEI() diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 3d2b8cd1364..572dba272b9 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -601,17 +601,17 @@ namespace netlist nl_double operator ()() const NL_NOEXCEPT; - void set(const nl_double G) noexcept + void set_conductivity(const nl_double G) noexcept { - set(G,G, 0.0); + set_go_gt_I(-G, G, 0.0); } - void set(const nl_double GO, const nl_double GT) noexcept + void set_go_gt(const nl_double GO, const nl_double GT) noexcept { - set(GO, GT, 0.0); + set_go_gt_I(GO, GT, 0.0); } - void set(const nl_double GO, const nl_double GT, const nl_double I) noexcept + void set_go_gt_I(const nl_double GO, const nl_double GT, const nl_double I) noexcept { if (m_go1 != nullptr) { diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp index 3fcdd591e83..756c7817c03 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.cpp +++ b/src/lib/netlist/solver/nld_matrix_solver.cpp @@ -357,7 +357,7 @@ namespace devices state().save(*this, m_terms[k]->m_h_n_m_1, this->name(), "m_h_n_m_1." + num); // FIXME: This shouldn't be necessary, recalculate on each entry ... - state().save(*this, m_gon[k],"GO" + num, this->name(), m_terms[k]->count()); + state().save(*this, m_gonn[k],"GO" + num, this->name(), m_terms[k]->count()); state().save(*this, m_gtn[k],"GT" + num, this->name(), m_terms[k]->count()); state().save(*this, m_Idrn[k],"IDR" + num, this->name(), m_terms[k]->count()); } diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index efd60a0c5fa..e4cff24c43a 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -182,7 +182,7 @@ namespace devices m_mat_ptr.resize(iN, max_rail+1); m_gtn.resize(iN, max_count); - m_gon.resize(iN, max_count); + m_gonn.resize(iN, max_count); m_Idrn.resize(iN, max_count); m_connected_net_Vn.resize(iN, max_count); @@ -192,7 +192,7 @@ namespace devices for (std::size_t i = 0; i < count; i++) { - m_terms[k]->terms()[i]->set_ptrs(&m_gtn[k][i], &m_gon[k][i], &m_Idrn[k][i]); + m_terms[k]->terms()[i]->set_ptrs(&m_gtn[k][i], &m_gonn[k][i], &m_Idrn[k][i]); m_connected_net_Vn[k][i] = m_terms[k]->terms()[i]->otherterm()->net().Q_Analog_state_ptr(); } } @@ -208,13 +208,13 @@ namespace devices const std::size_t term_count = net->count(); const std::size_t railstart = net->m_railstart; - const auto &go = m_gon[k]; + const auto &go = m_gonn[k]; const auto > = m_gtn[k]; const auto &Idr = m_Idrn[k]; const auto &cnV = m_connected_net_Vn[k]; for (std::size_t i = 0; i < railstart; i++) - *tcr_r[i] -= go[i]; + *tcr_r[i] += go[i]; typename FT::value_type gtot_t = 0.0; typename FT::value_type RHS_t = 0.0; @@ -232,7 +232,7 @@ namespace devices for (std::size_t i = railstart; i < term_count; i++) { - RHS_t += (/*m_Idr[i]*/ + go[i] * *cnV[i]); + RHS_t += (/*m_Idr[i]*/ (- go[i]) * *cnV[i]); } RHS[k] = RHS_t; @@ -245,7 +245,7 @@ namespace devices template using aligned_alloc = plib::aligned_allocator; - plib::pmatrix2d> m_gon; + plib::pmatrix2d> m_gonn; plib::pmatrix2d> m_gtn; plib::pmatrix2d> m_Idrn; plib::pmatrix2d> m_mat_ptr; @@ -335,11 +335,11 @@ namespace devices Ak[k] = akk; } - const float_type * const go = m_gon[k]; + const float_type * const go = m_gonn[k]; int * net_other = terms->m_connected_net_idx.data(); for (std::size_t i = 0; i < railstart; i++) - Ak[net_other[i]] -= go[i]; + Ak[net_other[i]] += go[i]; } } @@ -356,7 +356,7 @@ namespace devices float_type rhsk_b = 0.0; const std::size_t terms_count = m_terms[k]->count(); - const float_type * const go = m_gon[k]; + const float_type * const go = m_gonn[k]; const float_type * const Idr = m_Idrn[k]; const float_type * const * other_cur_analog = m_connected_net_Vn[k]; @@ -365,7 +365,7 @@ namespace devices for (std::size_t i = m_terms[k]->m_railstart; i < terms_count; i++) //rhsk = rhsk + go[i] * terms[i]->m_otherterm->net().as_analog().Q_Analog(); - rhsk_b = rhsk_b + go[i] * *other_cur_analog[i]; + rhsk_b = rhsk_b - go[i] * *other_cur_analog[i]; child.RHS(k) = rhsk_a + rhsk_b; } diff --git a/src/lib/netlist/solver/nld_ms_sor.h b/src/lib/netlist/solver/nld_ms_sor.h index 9e11cb67d75..fd1df9d6759 100644 --- a/src/lib/netlist/solver/nld_ms_sor.h +++ b/src/lib/netlist/solver/nld_ms_sor.h @@ -86,7 +86,7 @@ unsigned matrix_solver_SOR_t::vsolve_non_dynamic(const bool newton_rap const std::size_t term_count = this->m_terms[k]->count(); const float_type * const gt = this->m_gtn[k]; - const float_type * const go = this->m_gon[k]; + const float_type * const go = this->m_gonn[k]; const float_type * const Idr = this->m_Idrn[k]; auto other_cur_analog = this->m_connected_net_Vn[k]; @@ -99,7 +99,7 @@ unsigned matrix_solver_SOR_t::vsolve_non_dynamic(const bool newton_rap } for (std::size_t i = this->m_terms[k]->m_railstart; i < term_count; i++) - RHS_t = RHS_t + go[i] * *other_cur_analog[i]; + RHS_t = RHS_t - go[i] * *other_cur_analog[i]; RHS[k] = RHS_t; @@ -136,11 +136,11 @@ unsigned matrix_solver_SOR_t::vsolve_non_dynamic(const bool newton_rap { const int * net_other = this->m_terms[k]->m_connected_net_idx.data(); const std::size_t railstart = this->m_terms[k]->m_railstart; - const float_type * go = this->m_gon[k]; + const float_type * go = this->m_gonn[k]; float_type Idrive = 0.0; for (std::size_t i = 0; i < railstart; i++) - Idrive = Idrive + go[i] * this->m_new_V[static_cast(net_other[i])]; + Idrive = Idrive - go[i] * this->m_new_V[static_cast(net_other[i])]; const float_type new_val = this->m_new_V[k] * one_m_w[k] + (Idrive + RHS[k]) * w[k];