From d00de16b41f8a504e6d9b1b486d0338bd6a030e1 Mon Sep 17 00:00:00 2001 From: couriersud Date: Mon, 25 Feb 2019 21:40:02 +0100 Subject: [PATCH] netlist: analog readability refactoring. (nw) Change the sign of go (or in other terms a12 and a21 matrix stencil elements). This should make further optimization of matrix population easier. In addition hopefully improve the readability of the code by sacrifying overloads for more verbose member names. --- src/lib/netlist/analog/nld_bjt.cpp | 10 ++++---- src/lib/netlist/analog/nlid_fourterm.cpp | 24 ++++++++++---------- src/lib/netlist/analog/nlid_twoterm.cpp | 4 ++-- src/lib/netlist/analog/nlid_twoterm.h | 18 +++++++-------- src/lib/netlist/devices/nld_mm5837.cpp | 4 ++-- src/lib/netlist/devices/nld_r2r_dac.cpp | 2 +- src/lib/netlist/devices/nld_schmitt.cpp | 8 +++---- src/lib/netlist/devices/nlid_proxy.cpp | 4 ++-- src/lib/netlist/devices/nlid_system.h | 4 ++-- src/lib/netlist/nl_base.h | 10 ++++---- src/lib/netlist/solver/nld_matrix_solver.cpp | 2 +- src/lib/netlist/solver/nld_matrix_solver.h | 20 ++++++++-------- src/lib/netlist/solver/nld_ms_sor.h | 8 +++---- 13 files changed, 59 insertions(+), 59 deletions(-) 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];