19 #define P66 .66666666666667 20 #define P33 .33333333333333 26 static int mos_pnjlim(
double*,
double,
double,
double);
102 mos_iv(ckt,model,here,&ms);
106 if (error)
return(error);
133 ms.
ms_vbs = xf1* *(ckt->CKTstate1 + here->MOSvbs)
134 + xf2* *(ckt->CKTstate2 + here->MOSvbs);
136 ms.
ms_vgs = xf1* *(ckt->CKTstate1 + here->MOSvgs)
137 + xf2* *(ckt->CKTstate2 + here->MOSvgs);
139 ms.
ms_vds = xf1* *(ckt->CKTstate1 + here->MOSvds)
140 + xf2* *(ckt->CKTstate2 + here->MOSvds);
150 *(ckt->CKTstate0 + here->MOSvbs) =
151 *(ckt->CKTstate1 + here->MOSvbs);
152 *(ckt->CKTstate0 + here->MOSvgs) =
153 *(ckt->CKTstate1 + here->MOSvgs);
154 *(ckt->CKTstate0 + here->MOSvds) =
155 *(ckt->CKTstate1 + here->MOSvds);
156 *(ckt->CKTstate0 + here->MOSvbd) =
157 *(ckt->CKTstate0 + here->MOSvbs)-
158 *(ckt->CKTstate0 + here->MOSvds);
162 mos_iv(ckt,model,here,&ms);
166 if (error)
return(error);
232 mos_iv(ckt,model,here,&ms);
250 ms.
ms_vbs = *(ckt->CKTstate1 + here->MOSvbs);
251 ms.
ms_vgs = *(ckt->CKTstate1 + here->MOSvgs);
252 ms.
ms_vds = *(ckt->CKTstate1 + here->MOSvds);
257 mos_iv(ckt,model,here,&ms);
260 if (error)
return(error);
277 ms.
ms_vbs = *(ckt->CKTstate0 + here->MOSvbs);
278 ms.
ms_vgs = *(ckt->CKTstate0 + here->MOSvgs);
279 ms.
ms_vds = *(ckt->CKTstate0 + here->MOSvds);
284 mos_iv(ckt,model,here,&ms);
312 *(ckt->CKTstate0 + here->MOSvds) = ms.
ms_vds;
313 *(ckt->CKTstate0 + here->MOSvgs) = ms.
ms_vgs;
314 *(ckt->CKTstate0 + here->MOSvbs) = ms.
ms_vbs;
366 mos_iv(ckt,model,here,&ms);
391 if (*(ckt->CKTstate0 + here->MOSvds) >= 0) {
398 vgdo = *(ckt->CKTstate0 + here->MOSvgs) -
399 *(ckt->CKTstate0 + here->MOSvds);
402 if (!ckt->CKTfixLimit) {
476 if ((vn > vcrit) && (
FABS(vn - vold) > (vt + vt))) {
478 arg = 1 + (vn - vold)/vt;
480 *vnew = vold + vt*log(arg);
487 *vnew = vt*log(vn/vt);
513 vtsthi =
FABS(2*(vold - vto)) + 2;
514 vtstlo = .5*vtsthi + 2;
523 if (-delv > vtstlo) {
524 *vnew = vold - vtstlo;
535 if (delv >= vtsthi) {
536 *vnew = vold + vtsthi;
559 if (-delv > vtsthi) {
560 *vnew = vold - vtsthi;
567 *vnew = vold + vtstlo;
598 delvbs = ms->
ms_vbs - *(ckt->CKTstate0 + here->MOSvbs);
599 delvgs = ms->
ms_vgs - *(ckt->CKTstate0 + here->MOSvgs);
600 delvds = ms->
ms_vds - *(ckt->CKTstate0 + here->MOSvds);
601 delvbd = ms->
ms_vbd - *(ckt->CKTstate0 + here->MOSvbd);
602 delvgd = ms->
ms_vgd - (*(ckt->CKTstate0 + here->MOSvgs) -
603 *(ckt->CKTstate0 + here->MOSvds));
613 A3 =
MAX(A1,A2) + ckt->CKTabstol;
615 if (
FABS(A1) >= ckt->CKTreltol*A3)
619 A2 =
FABS(*(ckt->CKTstate0 + here->MOSvbs));
620 if (
FABS(delvbs) >= (ckt->CKTreltol*
MAX(A1,A2) + ckt->CKTvoltTol))
624 A2 =
FABS(*(ckt->CKTstate0 + here->MOSvbd));
625 if (
FABS(delvbd) >= (ckt->CKTreltol*
MAX(A1,A2) + ckt->CKTvoltTol))
629 A2 =
FABS(*(ckt->CKTstate0 + here->MOSvgs));
630 if (
FABS(delvgs) >= (ckt->CKTreltol*
MAX(A1,A2) + ckt->CKTvoltTol))
634 A2 =
FABS(*(ckt->CKTstate0 + here->MOSvds));
635 if (
FABS(delvds) >= (ckt->CKTreltol*
MAX(A1,A2) + ckt->CKTvoltTol))
639 cdhat = here->
MOScd -
644 cdhat = here->
MOScd +
649 A1 = cdhat - here->
MOScd;
652 if ((
FABS(A1) >= ckt->CKTreltol*
MAX(A2,A3) + ckt->CKTabstol))
661 ms->
ms_vbs = *(ckt->CKTstate0 + here->MOSvbs);
662 ms->
ms_vgs = *(ckt->CKTstate0 + here->MOSvgs);
663 ms->
ms_vds = *(ckt->CKTstate0 + here->MOSvds);
664 ms->
ms_vbd = *(ckt->CKTstate0 + here->MOSvbd);
672 ms->
ms_capgs = *(ckt->CKTstate0 + here->MOScapgs) +
673 *(ckt->CKTstate1 + here->MOScapgs) +
676 ms->
ms_capgd = *(ckt->CKTstate0 + here->MOScapgd) +
677 *(ckt->CKTstate1 + here->MOScapgd) +
680 ms->
ms_capgb = *(ckt->CKTstate0 + here->MOScapgb) +
681 *(ckt->CKTstate1 + here->MOScapgb) +
695 ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOSqgs)
698 ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOSqgd)
701 ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOSqgb)
740 here->
MOSgbs += ckt->CKTgmin;
751 here->
MOSgbd += ckt->CKTgmin;
860 *(ckt->CKTstate0 + here->MOSqbs) = here->
MOStBulkPot *
869 *(ckt->CKTstate0 + here->MOSqbs) = here->
MOSf4s +
875 *(ckt->CKTstate0 + here->MOSqbs) = 0;
886 *(ckt->CKTstate0 + here->MOSqbd) = here->
MOStBulkPot *
895 *(ckt->CKTstate0 + here->MOSqbd) = here->
MOSf4d +
901 *(ckt->CKTstate0 + here->MOSqbd) = 0;
918 px = (ckt->CKTstate0 + here->MOScapgs);
919 py = (ckt->CKTstate0 + here->MOScapgd);
924 px = (ckt->CKTstate0 + here->MOScapgd);
925 py = (ckt->CKTstate0 + here->MOScapgs);
934 if (vgxt <= -here->MOStPhi) {
935 *(ckt->CKTstate0 + here->MOScapgb) = .5*here->
MOSoxideCap;
939 else if (vgxt <= -.5*here->MOStPhi) {
940 *(ckt->CKTstate0 + here->MOScapgb) =
945 else if (vgxt <= 0) {
946 *(ckt->CKTstate0 + here->MOScapgb) =
961 vddif2 = 1.0/(vddif2*vddif2);
965 P33*(1.0 - vddif1*vddif1*vddif2);
967 *(ckt->CKTstate0 + here->MOScapgb) = 0;
974 *(ckt->CKTstate0 + here->MOScapgb) = 0;
982 *(ckt->CKTstate1 + here->MOScapgs) =
983 *(ckt->CKTstate0 + here->MOScapgs);
984 *(ckt->CKTstate1 + here->MOScapgd) =
985 *(ckt->CKTstate0 + here->MOScapgd);
986 *(ckt->CKTstate1 + here->MOScapgb) =
987 *(ckt->CKTstate0 + here->MOScapgb);
989 ms->
ms_capgs = *(ckt->CKTstate0 + here->MOScapgs) +
990 *(ckt->CKTstate0 + here->MOScapgs) +
992 ms->
ms_capgd = *(ckt->CKTstate0 + here->MOScapgd) +
993 *(ckt->CKTstate0 + here->MOScapgd) +
995 ms->
ms_capgb = *(ckt->CKTstate0 + here->MOScapgb) +
996 *(ckt->CKTstate0 + here->MOScapgb) +
1003 *(ckt->CKTstate1 + here->MOSqbd) =
1004 *(ckt->CKTstate0 + here->MOSqbd);
1005 *(ckt->CKTstate1 + here->MOSqbs) =
1006 *(ckt->CKTstate0 + here->MOSqbs);
1007 *(ckt->CKTstate1 + here->MOSqgs) =
1008 *(ckt->CKTstate0 + here->MOSqgs);
1009 *(ckt->CKTstate1 + here->MOSqgd) =
1010 *(ckt->CKTstate0 + here->MOSqgd);
1011 *(ckt->CKTstate1 + here->MOSqgb) =
1012 *(ckt->CKTstate0 + here->MOSqgb);
1016 ms->
ms_capgs = *(ckt->CKTstate0 + here->MOScapgs) +
1017 *(ckt->CKTstate1 + here->MOScapgs) +
1019 ms->
ms_capgd = *(ckt->CKTstate0 + here->MOScapgd) +
1020 *(ckt->CKTstate1 + here->MOScapgd) +
1022 ms->
ms_capgb = *(ckt->CKTstate0 + here->MOScapgb) +
1023 *(ckt->CKTstate1 + here->MOScapgb) +
1026 vgx = *(ckt->CKTstate1 + here->MOSvgs);
1027 vgy = vgx - *(ckt->CKTstate1 + here->MOSvds);
1028 vxy = vgx - *(ckt->CKTstate1 + here->MOSvbs);
1030 *(ckt->CKTstate0 + here->MOSqgs) =
1032 *(ckt->CKTstate1 + here->MOSqgs);
1033 *(ckt->CKTstate0 + here->MOSqgd) =
1035 *(ckt->CKTstate1 + here->MOSqgd);
1036 *(ckt->CKTstate0 + here->MOSqgb) =
1038 *(ckt->CKTstate1 + here->MOSqgb);
1061 here->
MOScbd += *(ckt->CKTstate0 + here->MOScqbd);
1062 here->
MOScd -= *(ckt->CKTstate0 + here->MOScqbd);
1067 here->
MOScbs += *(ckt->CKTstate0 + here->MOScqbs);
1070 *(ckt->CKTstate0 + here->MOScqgs) = 0;
1072 *(ckt->CKTstate0 + here->MOScqgd) = 0;
1074 *(ckt->CKTstate0 + here->MOScqgb) = 0;
1087 ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOSqgs)
1090 ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOSqgd)
1093 ckt->CKTag[0]* *(ckt->CKTstate0 + here->MOSqgb)
1115 *(ckt->CKTstate0 + here->MOSvbs) = ms->
ms_vbs;
1116 *(ckt->CKTstate0 + here->MOSvbd) = ms->
ms_vbd;
1117 *(ckt->CKTstate0 + here->MOSvgs) = ms->
ms_vgs;
1118 *(ckt->CKTstate0 + here->MOSvds) = ms->
ms_vds;
1237 *(ckt->CKTstate0 + here->MOSvbs) = ms->
ms_vbs;
1238 *(ckt->CKTstate0 + here->MOSvbd) = ms->
ms_vbd;
1239 *(ckt->CKTstate0 + here->MOSvgs) = ms->
ms_vgs;
1240 *(ckt->CKTstate0 + here->MOSvds) = ms->
ms_vds;
1259 *(ckt->CKTrhs + here->
MOSbNode) -= ceqbs + ceqbd;
1264 *(ckt->CKTrhs + here->
MOSbNode) += ceqbs + ceqbd;
struct sMOSmodel * MOSnextModel
double MOSgateBulkOverlapCap
MOSinstance * MOSinstances
double MOSbulkJctBotGradingCoeff
static void mos_load_dc()
double MOSbulkJctSideGradingCoeff
double MOSgateSourceOverlapCap
#define SARGS(arg, bot, side, sarg, sargsw)
#define NI_INTEG(ckt, geq, ceq, cap, qcap)
double MOSgateDrainOverlapCap
double MOSsourceConductance
struct sMOSinstance * MOSnextInstance
static int mos_limiting()
int MOSload(GENmodel *inModel, CKTcircuit *ckt)
double MOSdrainConductance