29 #include "component.h"
38 using namespace device;
40 mosfet::mosfet () :
circuit (4) {
50 matrix mosfet::calcMatrixY (nr_double_t frequency) {
98 matrix mosfet::calcMatrixCy (nr_double_t frequency) {
109 nr_double_t
i = 8 *
kelvin (T) /
T0 * gm / 3 +
110 Kf *
pow (Ids, Af) /
pow (frequency, Ffe) /
kB /
T0;
128 UdsPrev = UgsPrev - UgdPrev;
198 pol = !strcmp (type,
"pfet") ? -1 : 1;
203 if ((Leff = L - 2 * Ld) <= 0) {
205 "set to L = %g\n", Leff, L);
223 nr_double_t F1 =
exp (1.5 *
log (T1 / T2));
229 beta = Kp * W / Leff;
231 if (Cox > 0 && Uo > 0) {
232 beta = Uo * 1
e-4 * Cox * W / Leff;
235 "transconductance coefficient\n");
236 beta = 2
e-5 * W / Leff;
246 if ((Phi = P) <= 0) {
248 if (Nsub * 1e6 >=
NiSi) {
249 Phi = 2 * Ut *
log (Nsub * 1e6 /
NiSi);
252 "density, adjust Nsub >= %g\n",
NiSi / 1e6);
257 "surface potential\n");
265 if (Cox > 0 && Nsub > 0) {
266 Ga =
sqrt (2 *
Q *
ESi *
E0 * Nsub * 1e6) / Cox;
269 "valid bulk threshold\n");
276 if ((Vto = Vt0) == 0.0) {
279 nr_double_t PhiMS, PhiG, Eg;
283 PhiG = 4.15 + Eg / 2 -
pol * Tpg * Eg / 2;
287 PhiMS = PhiG - (4.15 + Eg / 2 +
pol * Phi / 2);
288 if (Nss >= 0 && Cox > 0) {
289 Vto = PhiMS -
Q * Nss * 1e4 / Cox +
pol * (Phi + Ga *
sqrt (Phi));
292 "valid threshold voltage\n");
297 Cox = Cox * W * Leff;
306 if (Nrd > 0) Rd += Rsh * Nrd;
307 if (Nrs > 0) Rs += Rsh * Nrs;
315 nr_double_t PbT, F2, F3;
322 if (Pb > 0 && Nsub >= 0) {
323 Cj =
sqrt (
ESi *
E0 *
Q * Nsub * 1e6 / 2 / Pb);
327 "valid square junction capacitance\n");
361 nr_double_t F4, E1, E2;
364 F4 =
exp (-
QoverkB / T2 * (T2 / T1 * E1 - E2));
367 nr_double_t Isd = (Ad > 0) ? Js * Ad : Is;
368 nr_double_t Iss = (As > 0) ? Js * As : Is;
374 Cox, beta, Ga, Phi, Vto);
387 nr_double_t Ut, IeqBS, IeqBD, IeqDS, UbsCrit, UbdCrit, gtiny;
415 Ubs =
pnVoltage (Ubs, UbsPrev, Ut * n, UbsCrit);
419 Ubd =
pnVoltage (Ubd, UbdPrev, Ut * n, UbdCrit);
422 UgsPrev = Ugs; UgdPrev = Ugd; UbdPrev = Ubd; UdsPrev = Uds; UbsPrev = Ubs;
437 MOSdir = (Uds >= 0) ? +1 : -1;
440 nr_double_t Upn = (MOSdir > 0) ? Ubs : Ubd;
441 nr_double_t Sarg, Sphi =
sqrt (Phi);
444 Sarg =
sqrt (Phi - Upn);
448 Sarg = Sphi - Upn / Sphi / 2;
449 Sarg =
MAX (Sarg, 0);
453 Uon = Vto *
pol + Ga * (Sarg - Sphi);
454 nr_double_t Utst = ((MOSdir > 0) ? Ugs : Ugd) - Uon;
456 nr_double_t
arg = (Sarg != 0.0) ? (Ga / Sarg / 2) : 0;
466 nr_double_t Vds = Uds * MOSdir;
467 nr_double_t
b = beta * (1 + l * Vds);
470 Ids = b * Utst * Utst / 2;
472 gds = l * beta * Utst * Utst / 2;
476 Ids = b * Vds * (Utst - Vds / 2);
478 gds = b * (Utst - Vds) + l * beta * Vds * (Utst - Vds / 2);
482 Udsat =
pol *
MAX (Utst, 0);
487 IeqBD = Ibd - gbd * Ubd;
488 IeqBS = Ibs - gbs * Ubs;
491 SourceControl = (MOSdir > 0) ? (gm + gmb) : 0;
492 DrainControl = (MOSdir < 0) ? (gm + gmb) : 0;
494 IeqDS = Ids - gm * Ugs - gmb * Ubs - gds * Uds;
496 IeqDS = Ids - gm * Ugd - gmb * Ubd - gds * Uds;
525 #define qgdState 0 // gate-drain charge state
526 #define igdState 1 // gate-drain current state
527 #define vgdState 2 // gate-drain voltage state
528 #define cgdState 3 // gate-drain capacitance state
529 #define qgsState 4 // gate-source charge state
530 #define igsState 5 // gate-source current state
531 #define vgsState 6 // gate-source voltage state
532 #define cgsState 7 // gate-source capacitance state
533 #define qbdState 8 // bulk-drain charge state
534 #define ibdState 9 // bulk-drain current state
535 #define qbsState 10 // bulk-source charge state
536 #define ibsState 11 // bulk-source current state
537 #define qgbState 12 // gate-bulk charge state
538 #define igbState 13 // gate-bulk current state
539 #define vgbState 14 // gate-bulk voltage state
540 #define cgbState 15 // gate-bulk capacitance state
543 nr_double_t Vgs, Vgd, Vbs, Vbd;
582 nr_double_t Cbs, Cbd, Cgd, Cgb, Cgs;
587 Qbd = Ibd * Tt +
pnCharge (Ubd, Cbd0, Pb, M, Fc) +
593 Qbs = Ibs * Tt +
pnCharge (Ubs, Cbs0, Pb, M, Fc) +
605 if (transientMode == 1) {
607 Qgs = transientChargeTR (
qgsState, Cgs, Ugs, Cgso * W);
609 Qgd = transientChargeTR (
qgdState, Cgd, Ugd, Cgdo * W);
611 Qgb = transientChargeTR (
qgbState, Cgb, Ugb, Cgbo * Leff);
613 else if (transientMode == 2) {
614 Qgs = transientChargeSR (
qgsState, Cgs, Ugs, Cgso * W);
615 Qgd = transientChargeSR (
qgdState, Cgd, Ugd, Cgdo * W);
616 Qgb = transientChargeSR (
qgbState, Cgb, Ugb, Cgbo * Leff);
688 nr_double_t mosfet::transientChargeTR (
int qstate, nr_double_t& cap,
689 nr_double_t voltage, nr_double_t ccap) {
690 int vstate = qstate + 2, cstate = qstate + 3;
692 cap = (cap +
getState (cstate, 1)) / 2 + ccap;
699 nr_double_t mosfet::transientChargeSR (
int qstate, nr_double_t& cap,
700 nr_double_t voltage, nr_double_t ccap) {
701 int vstate = qstate + 2, cstate = qstate + 3;