summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/analog/nld_bjt.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/analog/nld_bjt.cpp')
-rw-r--r--src/lib/netlist/analog/nld_bjt.cpp50
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());