|
|
|
@ -80,7 +80,6 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt) |
|
|
|
double tempv; |
|
|
|
#endif /*NOBYPASS*/ |
|
|
|
int error; |
|
|
|
int SenCond; |
|
|
|
|
|
|
|
/* loop through all the VDMOS device models */ |
|
|
|
for( ; model != NULL; model = VDMOSnextModel(model)) { |
|
|
|
@ -91,17 +90,6 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt) |
|
|
|
|
|
|
|
vt = CONSTKoverQ * here->VDMOStemp; |
|
|
|
Check=1; |
|
|
|
if(ckt->CKTsenInfo){ |
|
|
|
#ifdef SENSDEBUG |
|
|
|
printf("VDMOSload \n"); |
|
|
|
#endif /* SENSDEBUG */ |
|
|
|
|
|
|
|
if((ckt->CKTsenInfo->SENstatus == PERTURBATION)&& |
|
|
|
(here->VDMOSsenPertFlag == OFF))continue; |
|
|
|
|
|
|
|
} |
|
|
|
SenCond = ckt->CKTsenInfo && here->VDMOSsenPertFlag; |
|
|
|
|
|
|
|
/* |
|
|
|
|
|
|
|
*/ |
|
|
|
@ -145,44 +133,6 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt) |
|
|
|
* share some code, so we put them first - others later on |
|
|
|
*/ |
|
|
|
|
|
|
|
if(SenCond){ |
|
|
|
#ifdef SENSDEBUG |
|
|
|
printf("VDMOSsenPertFlag = ON \n"); |
|
|
|
#endif /* SENSDEBUG */ |
|
|
|
if((ckt->CKTsenInfo->SENmode == TRANSEN) && |
|
|
|
(ckt->CKTmode & MODEINITTRAN)) { |
|
|
|
vgs = *(ckt->CKTstate1 + here->VDMOSvgs); |
|
|
|
vds = *(ckt->CKTstate1 + here->VDMOSvds); |
|
|
|
vbs = *(ckt->CKTstate1 + here->VDMOSvbs); |
|
|
|
vbd = *(ckt->CKTstate1 + here->VDMOSvbd); |
|
|
|
vgb = vgs - vbs; |
|
|
|
vgd = vgs - vds; |
|
|
|
} |
|
|
|
else if (ckt->CKTsenInfo->SENmode == ACSEN){ |
|
|
|
vgb = model->VDMOStype * ( |
|
|
|
*(ckt->CKTrhsOp+here->VDMOSgNode) - |
|
|
|
*(ckt->CKTrhsOp+here->VDMOSbNode)); |
|
|
|
vbs = *(ckt->CKTstate0 + here->VDMOSvbs); |
|
|
|
vbd = *(ckt->CKTstate0 + here->VDMOSvbd); |
|
|
|
vgd = vgb + vbd ; |
|
|
|
vgs = vgb + vbs ; |
|
|
|
vds = vbs - vbd ; |
|
|
|
} |
|
|
|
else{ |
|
|
|
vgs = *(ckt->CKTstate0 + here->VDMOSvgs); |
|
|
|
vds = *(ckt->CKTstate0 + here->VDMOSvds); |
|
|
|
vbs = *(ckt->CKTstate0 + here->VDMOSvbs); |
|
|
|
vbd = *(ckt->CKTstate0 + here->VDMOSvbd); |
|
|
|
vgb = vgs - vbs; |
|
|
|
vgd = vgs - vds; |
|
|
|
} |
|
|
|
#ifdef SENSDEBUG |
|
|
|
printf(" vbs = %.7e ,vbd = %.7e,vgb = %.7e\n",vbs,vbd,vgb); |
|
|
|
printf(" vgs = %.7e ,vds = %.7e,vgd = %.7e\n",vgs,vds,vgd); |
|
|
|
#endif /* SENSDEBUG */ |
|
|
|
goto next1; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if((ckt->CKTmode & (MODEINITFLOAT | MODEINITPRED | MODEINITSMSIG |
|
|
|
| MODEINITTRAN)) || |
|
|
|
@ -322,11 +272,6 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt) |
|
|
|
*(ckt->CKTstate1+here->VDMOScapgb) + |
|
|
|
GateBulkOverlapCap ); |
|
|
|
|
|
|
|
if(ckt->CKTsenInfo){ |
|
|
|
here->VDMOScgs = capgs; |
|
|
|
here->VDMOScgd = capgd; |
|
|
|
here->VDMOScgb = capgb; |
|
|
|
} |
|
|
|
} |
|
|
|
goto bypass; |
|
|
|
} |
|
|
|
@ -418,7 +363,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt) |
|
|
|
* here we just evaluate the ideal diode current and the |
|
|
|
* corresponding derivative (conductance). |
|
|
|
*/ |
|
|
|
next1: if(vbs <= -3*vt) { |
|
|
|
if(vbs <= -3*vt) { |
|
|
|
here->VDMOSgbs = ckt->CKTgmin; |
|
|
|
here->VDMOScbs = here->VDMOSgbs*vbs-SourceSatCur; |
|
|
|
} else { |
|
|
|
@ -649,7 +594,6 @@ next1: if(vbs <= -3*vt) { |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
if(SenCond && (ckt->CKTsenInfo->SENmode==TRANSEN)) goto next2; |
|
|
|
|
|
|
|
if ( (ckt->CKTmode & MODETRAN) || ( (ckt->CKTmode&MODEINITTRAN) |
|
|
|
&& !(ckt->CKTmode&MODEUIC)) ) { |
|
|
|
@ -681,8 +625,6 @@ next1: if(vbs <= -3*vt) { |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
if(SenCond) goto next2; |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
* check convergence |
|
|
|
@ -700,7 +642,7 @@ next1: if(vbs <= -3*vt) { |
|
|
|
|
|
|
|
/* save things away for next time */ |
|
|
|
|
|
|
|
next2: *(ckt->CKTstate0 + here->VDMOSvbs) = vbs; |
|
|
|
*(ckt->CKTstate0 + here->VDMOSvbs) = vbs; |
|
|
|
*(ckt->CKTstate0 + here->VDMOSvbd) = vbd; |
|
|
|
*(ckt->CKTstate0 + here->VDMOSvgs) = vgs; |
|
|
|
*(ckt->CKTstate0 + here->VDMOSvds) = vds; |
|
|
|
@ -757,26 +699,10 @@ next1: if(vbs <= -3*vt) { |
|
|
|
*(ckt->CKTstate1+here->VDMOScapgb) + |
|
|
|
GateBulkOverlapCap ); |
|
|
|
} |
|
|
|
if(ckt->CKTsenInfo){ |
|
|
|
here->VDMOScgs = capgs; |
|
|
|
here->VDMOScgd = capgd; |
|
|
|
here->VDMOScgb = capgb; |
|
|
|
} |
|
|
|
/* |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
/* |
|
|
|
* store small-signal parameters (for meyer's model) |
|
|
|
* all parameters already stored, so done... |
|
|
|
*/ |
|
|
|
if(SenCond){ |
|
|
|
if((ckt->CKTsenInfo->SENmode == DCSEN)|| |
|
|
|
(ckt->CKTsenInfo->SENmode == ACSEN)){ |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#ifndef PREDICTOR |
|
|
|
if (ckt->CKTmode & (MODEINITPRED | MODEINITTRAN) ) { |
|
|
|
*(ckt->CKTstate0 + here->VDMOSqgs) = |
|
|
|
@ -810,7 +736,6 @@ next1: if(vbs <= -3*vt) { |
|
|
|
#ifndef NOBYPASS |
|
|
|
bypass: |
|
|
|
#endif |
|
|
|
if(SenCond) continue; |
|
|
|
|
|
|
|
if ( (ckt->CKTmode & (MODEINITTRAN)) || |
|
|
|
(! (ckt->CKTmode & (MODETRAN)) ) ) { |
|
|
|
|