summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/netlist/analog/nld_bjt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/netlist/analog/nld_bjt.c')
-rw-r--r--src/emu/netlist/analog/nld_bjt.c175
1 files changed, 87 insertions, 88 deletions
diff --git a/src/emu/netlist/analog/nld_bjt.c b/src/emu/netlist/analog/nld_bjt.c
index 93893a97d10..c5feca26848 100644
--- a/src/emu/netlist/analog/nld_bjt.c
+++ b/src/emu/netlist/analog/nld_bjt.c
@@ -10,28 +10,28 @@
class diode
{
public:
- diode() : m_Is(1e-15), m_VT(0.0258), m_VT_inv(1.0 / m_VT) {}
- diode(const double Is, const double n)
- {
- m_Is = Is;
- m_VT = 0.0258 * n;
- m_VT_inv = 1.0 / m_VT;
- }
- void set(const double Is, const double n)
- {
- m_Is = Is;
- m_VT = 0.0258 * n;
- m_VT_inv = 1.0 / m_VT;
- }
- double I(const double V) const { return m_Is * exp(V * m_VT_inv) - m_Is; }
- double g(const double V) const { return m_Is * m_VT_inv * exp(V * m_VT_inv); }
- double V(const double I) const { return log(1.0 + I / m_Is) * m_VT; }
- double gI(const double I) const { return m_VT_inv * (I + m_Is); }
+ diode() : m_Is(1e-15), m_VT(0.0258), m_VT_inv(1.0 / m_VT) {}
+ diode(const double Is, const double n)
+ {
+ m_Is = Is;
+ m_VT = 0.0258 * n;
+ m_VT_inv = 1.0 / m_VT;
+ }
+ void set(const double Is, const double n)
+ {
+ m_Is = Is;
+ m_VT = 0.0258 * n;
+ m_VT_inv = 1.0 / m_VT;
+ }
+ double I(const double V) const { return m_Is * exp(V * m_VT_inv) - m_Is; }
+ double g(const double V) const { return m_Is * m_VT_inv * exp(V * m_VT_inv); }
+ double V(const double I) const { return log(1.0 + I / m_Is) * m_VT; }
+ double gI(const double I) const { return m_VT_inv * (I + m_Is); }
private:
- double m_Is;
- double m_VT;
- double m_VT_inv;
+ double m_Is;
+ double m_VT;
+ double m_VT_inv;
};
@@ -42,7 +42,7 @@ private:
NETLIB_START(Q)
{
- register_param("model", m_model, "");
+ register_param("model", m_model, "");
}
NETLIB_RESET(Q)
@@ -60,56 +60,56 @@ NETLIB_UPDATE(Q)
NETLIB_START(QBJT_switch)
{
- NETLIB_NAME(Q)::start();
+ NETLIB_NAME(Q)::start();
- register_terminal("B", m_RB.m_P);
- register_terminal("E", m_RB.m_N);
- register_terminal("C", m_RC.m_P);
- register_terminal("_E1", m_RC.m_N);
+ register_terminal("B", m_RB.m_P);
+ register_terminal("E", m_RB.m_N);
+ register_terminal("C", m_RC.m_P);
+ register_terminal("_E1", m_RC.m_N);
- register_terminal("_B1", m_BC_dummy.m_P);
- register_terminal("_C1", m_BC_dummy.m_N);
+ register_terminal("_B1", m_BC_dummy.m_P);
+ register_terminal("_C1", m_BC_dummy.m_N);
- connect(m_RB.m_N, m_RC.m_N);
+ connect(m_RB.m_N, m_RC.m_N);
- connect(m_RB.m_P, m_BC_dummy.m_P);
- connect(m_RC.m_P, m_BC_dummy.m_N);
+ connect(m_RB.m_P, m_BC_dummy.m_P);
+ connect(m_RC.m_P, m_BC_dummy.m_N);
- save(NAME(m_state_on));
+ save(NAME(m_state_on));
- m_RB.set(netlist().gmin(), 0.0, 0.0);
- m_RC.set(netlist().gmin(), 0.0, 0.0);
+ m_RB.set(netlist().gmin(), 0.0, 0.0);
+ m_RC.set(netlist().gmin(), 0.0, 0.0);
- m_BC_dummy.set(netlist().gmin(), 0.0, 0.0);
+ m_BC_dummy.set(netlist().gmin(), 0.0, 0.0);
- m_state_on = 0;
+ m_state_on = 0;
- {
- double IS = m_model.model_value("IS", 1e-15);
- double BF = m_model.model_value("BF", 100);
- double NF = m_model.model_value("NF", 1);
- //double VJE = m_model.dValue("VJE", 0.75);
+ {
+ double IS = m_model.model_value("IS", 1e-15);
+ double BF = m_model.model_value("BF", 100);
+ double NF = m_model.model_value("NF", 1);
+ //double VJE = m_model.dValue("VJE", 0.75);
- set_qtype((m_model.model_type() == "NPN") ? BJT_NPN : BJT_PNP);
+ set_qtype((m_model.model_type() == "NPN") ? BJT_NPN : BJT_PNP);
- double alpha = BF / (1.0 + BF);
+ double alpha = BF / (1.0 + BF);
- diode d(IS, NF);
+ diode d(IS, NF);
- // Assume 5mA Collector current for switch operation
+ // Assume 5mA Collector current for switch operation
- m_V = d.V(0.005 / alpha);
+ m_V = d.V(0.005 / alpha);
- /* Base current is 0.005 / beta
- * as a rough estimate, we just scale the conductance down */
+ /* Base current is 0.005 / beta
+ * as a rough estimate, we just scale the conductance down */
- m_gB = d.gI(0.005 / alpha);
+ m_gB = d.gI(0.005 / alpha);
- if (m_gB < netlist().gmin())
- m_gB = netlist().gmin();
- m_gC = d.gI(0.005); // very rough estimate
- //printf("%f %f \n", m_V, m_gB);
- }
+ if (m_gB < netlist().gmin())
+ m_gB = netlist().gmin();
+ m_gC = d.gI(0.005); // very rough estimate
+ //printf("%f %f \n", m_V, m_gB);
+ }
}
@@ -125,56 +125,56 @@ NETLIB_UPDATE_PARAM(QBJT_switch)
NETLIB_START(QBJT_EB)
{
- NETLIB_NAME(Q)::start();
+ NETLIB_NAME(Q)::start();
- register_terminal("E", m_D_EB.m_P); // Cathode
- register_terminal("B", m_D_EB.m_N); // Anode
+ register_terminal("E", m_D_EB.m_P); // Cathode
+ register_terminal("B", m_D_EB.m_N); // Anode
- register_terminal("C", m_D_CB.m_P); // Cathode
- register_terminal("_B1", m_D_CB.m_N); // Anode
+ register_terminal("C", m_D_CB.m_P); // Cathode
+ register_terminal("_B1", m_D_CB.m_N); // Anode
- register_terminal("_E1", m_D_EC.m_P);
- register_terminal("_C1", m_D_EC.m_N);
+ register_terminal("_E1", m_D_EC.m_P);
+ register_terminal("_C1", m_D_EC.m_N);
- connect(m_D_EB.m_P, m_D_EC.m_P);
- connect(m_D_EB.m_N, m_D_CB.m_N);
- connect(m_D_CB.m_P, m_D_EC.m_N);
+ connect(m_D_EB.m_P, m_D_EC.m_P);
+ connect(m_D_EB.m_N, m_D_CB.m_N);
+ connect(m_D_CB.m_P, m_D_EC.m_N);
- m_gD_BE.save("m_D_BE", *this);
- m_gD_BC.save("m_D_BC", *this);
+ m_gD_BE.save("m_D_BE", *this);
+ m_gD_BC.save("m_D_BC", *this);
- {
- double IS = m_model.model_value("IS", 1e-15);
- double BF = m_model.model_value("BF", 100);
- double NF = m_model.model_value("NF", 1);
- double BR = m_model.model_value("BR", 1);
- double NR = m_model.model_value("NR", 1);
- //double VJE = m_model.dValue("VJE", 0.75);
+ {
+ double IS = m_model.model_value("IS", 1e-15);
+ double BF = m_model.model_value("BF", 100);
+ double NF = m_model.model_value("NF", 1);
+ double BR = m_model.model_value("BR", 1);
+ double NR = m_model.model_value("NR", 1);
+ //double VJE = m_model.dValue("VJE", 0.75);
- set_qtype((m_model.model_type() == "NPN") ? BJT_NPN : BJT_PNP);
- //printf("type %s\n", m_model.model_type().cstr());
+ set_qtype((m_model.model_type() == "NPN") ? BJT_NPN : BJT_PNP);
+ //printf("type %s\n", m_model.model_type().cstr());
- m_alpha_f = BF / (1.0 + BF);
- m_alpha_r = BR / (1.0 + BR);
+ m_alpha_f = BF / (1.0 + BF);
+ m_alpha_r = BR / (1.0 + BR);
- m_gD_BE.set_param(IS / m_alpha_f, NF, netlist().gmin());
- m_gD_BC.set_param(IS / m_alpha_r, NR, netlist().gmin());
- }
+ m_gD_BE.set_param(IS / m_alpha_f, NF, netlist().gmin());
+ m_gD_BC.set_param(IS / m_alpha_r, NR, netlist().gmin());
+ }
}
NETLIB_UPDATE(QBJT_EB)
{
- if (!m_D_EB.m_P.net().isRailNet())
- m_D_EB.m_P.net().solve(); // Basis
- else if (!m_D_EB.m_N.net().isRailNet())
- m_D_EB.m_N.net().solve(); // Emitter
- else
- m_D_CB.m_N.net().solve(); // Collector
+ if (!m_D_EB.m_P.net().isRailNet())
+ m_D_EB.m_P.net().solve(); // Basis
+ else if (!m_D_EB.m_N.net().isRailNet())
+ m_D_EB.m_N.net().solve(); // Emitter
+ else
+ m_D_CB.m_N.net().solve(); // Collector
}
NETLIB_RESET(QBJT_EB)
{
- NETLIB_NAME(Q)::reset();
+ NETLIB_NAME(Q)::reset();
}
@@ -182,4 +182,3 @@ NETLIB_RESET(QBJT_EB)
NETLIB_UPDATE_PARAM(QBJT_EB)
{
}
-