diff options
Diffstat (limited to 'src/lib/netlist/analog/nld_bjt.cpp')
-rw-r--r-- | src/lib/netlist/analog/nld_bjt.cpp | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/src/lib/netlist/analog/nld_bjt.cpp b/src/lib/netlist/analog/nld_bjt.cpp index f1d66c2344f..2eed4711322 100644 --- a/src/lib/netlist/analog/nld_bjt.cpp +++ b/src/lib/netlist/analog/nld_bjt.cpp @@ -21,17 +21,22 @@ namespace analog class diode { public: - diode() : m_Is(1e-15), m_VT(0.0258), m_VT_inv(plib::reciprocal(m_VT)) {} + diode() + : m_Is(plib::constants<nl_fptype>::cast(1e-15)) + , m_VT(plib::constants<nl_fptype>::cast(0.0258)) + , m_VT_inv(plib::reciprocal(m_VT)) + {} + diode(const nl_fptype Is, const nl_fptype n) { m_Is = Is; - m_VT = 0.0258 * n; + m_VT = plib::constants<nl_fptype>::cast(0.0258) * n; m_VT_inv = plib::reciprocal(m_VT); } void set(const nl_fptype Is, const nl_fptype n) { m_Is = Is; - m_VT = 0.0258 * n; + m_VT = plib::constants<nl_fptype>::cast(0.0258) * n; m_VT_inv = plib::reciprocal(m_VT); } nl_fptype I(const nl_fptype V) const { return m_Is * std::exp(V * m_VT_inv) - m_Is; } @@ -179,9 +184,9 @@ namespace analog , m_RB(*this, "m_RB", true) , m_RC(*this, "m_RC", true) , m_BC(*this, "m_BC", true) - , m_gB(1e-9) - , m_gC(1e-9) - , m_V(0.0) + , m_gB(plib::constants<nl_fptype>::cast(1e-9)) + , m_gC(plib::constants<nl_fptype>::cast(1e-9)) + , m_V(plib::constants<nl_fptype>::zero()) , m_state_on(*this, "m_state_on", 0) { register_subalias("B", m_RB.m_P); @@ -237,13 +242,13 @@ namespace analog connect(m_D_EB.m_N, m_D_CB.m_N); connect(m_D_CB.m_P, m_D_EC.m_N); - if (m_model.m_CJE > 0.0) + if (m_model.m_CJE > plib::constants<nl_fptype>::zero()) { create_and_register_subdevice("m_CJE", m_CJE); connect("B", "m_CJE.1"); connect("E", "m_CJE.2"); } - if (m_model.m_CJC > 0.0) + if (m_model.m_CJC > plib::constants<nl_fptype>::zero()) { create_and_register_subdevice("m_CJC", m_CJC); connect("B", "m_CJC.1"); @@ -292,13 +297,14 @@ namespace analog NETLIB_RESET(QBJT_switch) { NETLIB_NAME(QBJT)::reset(); + const auto zero(plib::constants<nl_fptype>::zero()); m_state_on = 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_RB.set_G_V_I(exec().gmin(), zero, zero); + m_RC.set_G_V_I(exec().gmin(), zero, zero); - m_BC.set_G_V_I(exec().gmin() / 10.0, 0.0, 0.0); + m_BC.set_G_V_I(exec().gmin() / plib::constants<nl_fptype>::cast(10.0), zero, zero); } @@ -323,24 +329,25 @@ namespace analog set_qtype((m_model.type() == "NPN") ? BJT_NPN : BJT_PNP); - nl_fptype alpha = BF / (1.0 + BF); + nl_fptype alpha = BF / (plib::constants<nl_fptype>::one() + BF); diode d(IS, NF); // Assume 5mA Collector current for switch operation - m_V = d.V(0.005 / alpha); + const auto cc(plib::constants<nl_fptype>::cast(0.005)); + m_V = d.V(cc / alpha); /* Base current is 0.005 / beta * as a rough estimate, we just scale the conductance down */ - m_gB = plib::reciprocal((m_V/(0.005 / BF))); + m_gB = plib::reciprocal((m_V/(cc / BF))); //m_gB = d.gI(0.005 / alpha); if (m_gB < exec().gmin()) m_gB = exec().gmin(); - m_gC = d.gI(0.005); // very rough estimate + m_gC = d.gI(cc); // very rough estimate } NETLIB_UPDATE_TERMINALS(QBJT_switch) @@ -350,12 +357,13 @@ namespace analog const unsigned new_state = (m_RB.deltaV() * m > m_V ) ? 1 : 0; if (m_state_on ^ new_state) { + const auto zero(plib::constants<nl_fptype>::zero()); const nl_fptype gb = new_state ? m_gB : exec().gmin(); const nl_fptype gc = new_state ? m_gC : exec().gmin(); - const nl_fptype v = new_state ? m_V * m : 0; + const nl_fptype v = new_state ? m_V * m : zero; - m_RB.set_G_V_I(gb, v, 0.0); - m_RC.set_G_V_I(gc, 0.0, 0.0); + m_RB.set_G_V_I(gb, v, zero); + m_RC.set_G_V_I(gc, zero, zero); m_state_on = new_state; } } @@ -395,7 +403,7 @@ namespace analog NETLIB_UPDATE_TERMINALS(QBJT_EB) { - const nl_fptype polarity = (qtype() == BJT_NPN ? 1.0 : -1.0); + const nl_fptype polarity = plib::constants<nl_fptype>::cast(qtype() == BJT_NPN ? 1.0 : -1.0); m_gD_BE.update_diode(-m_D_EB.deltaV() * polarity); m_gD_BC.update_diode(-m_D_CB.deltaV() * polarity); @@ -431,8 +439,8 @@ namespace analog set_qtype((m_model.type() == "NPN") ? BJT_NPN : BJT_PNP); - m_alpha_f = BF / (1.0 + BF); - m_alpha_r = BR / (1.0 + BR); + m_alpha_f = BF / (plib::constants<nl_fptype>::one() + BF); + m_alpha_r = BR / (plib::constants<nl_fptype>::one() + BR); m_gD_BE.set_param(IS / m_alpha_f, NF, exec().gmin(), constants::T0()); m_gD_BC.set_param(IS / m_alpha_r, NR, exec().gmin(), constants::T0()); |