29 #include "component.h"
40 using namespace device;
43 cbcx = rb = re = rc = NULL;
52 matrix bjt::calcMatrixY (nr_double_t frequency) {
79 nr_double_t phase =
rad (Ptf) * Tf * 2 *
M_PI * frequency;
131 matrix bjt::calcMatrixCy (nr_double_t frequency) {
145 nr_double_t ib = 2 * Ibe *
QoverkB /
T0 +
146 (Kf *
pow (Ibe, Af) /
pow (frequency, Ffe) +
147 Kb *
pow (Ibe, Ab) / (1 +
sqr (frequency / Fb)))
164 void bjt::initModel (
void) {
174 nr_double_t T1, T2, IsT;
184 nr_double_t VjeT, VjcT, VjsT;
196 nr_double_t F =
exp (Xtb *
log (T2 / T1));
205 nr_double_t
G =
log (IsT / Is);
206 nr_double_t F1 =
exp (G / Ne);
207 nr_double_t F2 =
exp (G / Nc);
281 pol = !strcmp (type,
"pnp") ? -1 : 1;
327 if (Rbm <= 0.0) Rbm = Rb;
328 if (Rb < Rbm) Rbm = Rb;
352 #define cexState 6 // extra excess phase state
375 nr_double_t Ut, Q1, Q2;
376 nr_double_t Iben, Ibcn, Ibei, Ibci, Ibc, gbe, gbc, gtiny;
377 nr_double_t IeqB, IeqC, IeqE, IeqS, UbeCrit, UbcCrit;
381 Ikf = Ikf > 0 ? 1.0 / Ikf : 0;
382 Ikr = Ikr > 0 ? 1.0 / Ikr : 0;
383 Vaf = Vaf > 0 ? 1.0 / Vaf : 0;
384 Var = Var > 0 ? 1.0 / Var : 0;
394 UbePrev = Ube =
pnVoltage (Ube, UbePrev, Ut * Nf, UbeCrit);
395 UbcPrev = Ubc =
pnVoltage (Ubc, UbcPrev, Ut * Nr, UbcCrit);
400 gtiny = Ube < - 10 * Ut * Nf ? (Is + Ise) : 0;
408 Ibe = Ibei + Iben + gtiny * Ube;
409 gbe = gbei + gben + gtiny;
422 gtiny = Ubc < - 10 * Ut * Nr ? (Is + Isc) : 0;
430 Ibc = Ibci + Ibcn + gtiny * Ubc;
431 gbc = gbci + gbcn + gtiny;
444 Q1 = 1 / (1 - Ubc * Vaf - Ube * Var);
445 Q2 = If * Ikf + Ir * Ikr;
446 nr_double_t SArg = 1.0 + 4.0 * Q2;
447 nr_double_t Sqrt = SArg > 0 ?
sqrt (SArg) : 1;
448 Qb = Q1 * (1 + Sqrt) / 2;
449 dQbdUbe = Q1 * (Qb * Var + gif * Ikf / Sqrt);
450 dQbdUbc = Q1 * (Qb * Vaf + gir * Ikr / Sqrt);
464 gitf = (+gif - It * dQbdUbe) / Qb;
465 gitr = (-gir - It * dQbdUbc) / Qb;
477 a = (Ibci + Ibcn + Ibei + Iben) / Irb;
478 a =
MAX (a, NR_TINY);
481 Rbb = Rbm + 3 * (Rb - Rbm) * (b - z) / z /
sqr (b);
484 Rbb = Rbm + (Rb - Rbm) / Qb;
491 IeqB = Ibe - Ube * gbe;
492 IeqC = Ibc - Ubc * gbc;
494 IeqE = It - Ube * gitf - Ubc * gitr;
496 IeqE = It - Ube * gm - Uce * go;
543 nr_double_t Vbe, Vbc;
584 nr_double_t Cbe, Cbci, Cbcx, Ccs;
587 Vtf = Vtf > 0 ? 1.0 / Vtf : 0;
591 Qbe =
pnCharge (Ube, Cje0, Vje, Mje, Fc);
595 nr_double_t
e, Tff, dTffdUbe, dTffdUbc, a;
596 a = 1 / (1 + Itf / If);
597 e = 2 *
exp (
MIN (Ubc * Vtf, 709));
598 Tff = Tf * (1 + Xtf *
sqr (a) *
e);
599 dTffdUbe = Tf * Xtf * 2 * gif * Itf *
cubic (a) /
sqr (If) *
e;
600 Cbe += (If * dTffdUbe + Tff * (gif - If / Qb * dQbdUbe)) / Qb;
601 Qbe += If * Tff / Qb;
602 dTffdUbc = Tf * Xtf * Vtf *
sqr (a) *
e;
603 dQbedUbc = If / Qb * (dTffdUbc - Tff / Qb * dQbdUbc);
607 Cbci =
pnCapacitance (Ubc, Cjc0 * Xcjc, Vjc, Mjc, Fc) + Tr * gir;
608 Qbci =
pnCharge (Ubc, Cjc0 * Xcjc, Vjc, Mjc, Fc) + Tr * Ir;
612 Qbcx =
pnCharge (Ubx, Cjc0 * (1 - Xcjc), Vjc, Mjc, Fc);
616 Qcs =
pnCharge (Ucs, Cjs0, Vjs, Mjs);
641 void bjt::processCbcx (
void) {
648 if (Rbm != 0.0 && Cjc0 != 0.0 && Xcjc != 1.0) {
677 #define qbeState 0 // base-emitter charge state
678 #define cbeState 1 // base-emitter current state
679 #define qbcState 2 // base-collector charge state
680 #define cbcState 3 // base-collector current state
681 #define qcsState 4 // collector-substrate charge state
682 #define ccsState 5 // collector-substrate current state
684 #define qbxState 0 // external base-collector charge state
685 #define cbxState 1 // external base-collector current state
731 void bjt::excessPhase (
int istate, nr_double_t&
i, nr_double_t& g) {
736 nr_double_t td =
rad (Ptf) * Tf;
739 if (td == 0.0)
return;
746 nr_double_t c3, c2, c1, dn, ra;
752 ra = delta[0] / delta[1];
753 c2 = (1 + ra + c2) / dn;