sidewall capacitance calculation removed
This commit is contained in:
parent
7df59a750e
commit
ef547eb8ff
|
|
@ -121,8 +121,6 @@ IFparm VDMOSmPTable[] = { /* model parameters */
|
|||
IOPA("cbd", VDMOS_MOD_CBD, IF_REAL, "B-D junction capacitance"),
|
||||
IOPA("cbs", VDMOS_MOD_CBS, IF_REAL, "B-S junction capacitance"),
|
||||
IOPA("cj", VDMOS_MOD_CJ, IF_REAL, "Bottom junction cap per area"),
|
||||
IOPA("cjsw", VDMOS_MOD_CJSW, IF_REAL, "Side junction cap per area"),
|
||||
IOP("mjsw", VDMOS_MOD_MJSW, IF_REAL, "Side grading coefficient"),
|
||||
IOP("js", VDMOS_MOD_JS, IF_REAL, "Bulk jct. sat. current density"),
|
||||
IOP("tox", VDMOS_MOD_TOX, IF_REAL, "Oxide thickness"),
|
||||
IOP("u0", VDMOS_MOD_U0, IF_REAL, "Surface mobility"),
|
||||
|
|
|
|||
|
|
@ -65,7 +65,6 @@ typedef struct sVDMOSinstance {
|
|||
double VDMOStCbd; /* temperature corrected B-D Capacitance */
|
||||
double VDMOStCbs; /* temperature corrected B-S Capacitance */
|
||||
double VDMOStCj; /* temperature corrected Bulk bottom Capacitance */
|
||||
double VDMOStCjsw; /* temperature corrected Bulk side Capacitance */
|
||||
double VDMOStBulkPot; /* temperature corrected Bulk potential */
|
||||
double VDMOStDepCap; /* temperature adjusted transition point in */
|
||||
/* the cureve matching Fc * Vj */
|
||||
|
|
@ -300,10 +299,8 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */
|
|||
double VDMOScapBD; /* input - use tCbd */
|
||||
double VDMOScapBS; /* input - use tCbs */
|
||||
double VDMOSbulkCapFactor; /* input - use tCj */
|
||||
double VDMOSsideWallCapFactor; /* input - use tCjsw */
|
||||
double VDMOSbulkJctPotential; /* input - use tBulkPot */
|
||||
double VDMOSbulkJctBotGradingCoeff;
|
||||
double VDMOSbulkJctSideGradingCoeff;
|
||||
double VDMOSfwdCapDepCoeff;
|
||||
double VDMOSphi; /* input - use tPhi */
|
||||
double VDMOSgamma;
|
||||
|
|
@ -331,10 +328,8 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */
|
|||
unsigned VDMOScapBDGiven :1;
|
||||
unsigned VDMOScapBSGiven :1;
|
||||
unsigned VDMOSbulkCapFactorGiven :1;
|
||||
unsigned VDMOSsideWallCapFactorGiven :1;
|
||||
unsigned VDMOSbulkJctPotentialGiven :1;
|
||||
unsigned VDMOSbulkJctBotGradingCoeffGiven :1;
|
||||
unsigned VDMOSbulkJctSideGradingCoeffGiven :1;
|
||||
unsigned VDMOSfwdCapDepCoeffGiven :1;
|
||||
unsigned VDMOSphiGiven :1;
|
||||
unsigned VDMOSgammaGiven :1;
|
||||
|
|
@ -394,8 +389,6 @@ enum {
|
|||
VDMOS_MOD_VJ,
|
||||
VDMOS_MOD_CJ,
|
||||
VDMOS_MOD_MJ,
|
||||
VDMOS_MOD_CJSW,
|
||||
VDMOS_MOD_MJSW,
|
||||
VDMOS_MOD_JS,
|
||||
VDMOS_MOD_TOX,
|
||||
VDMOS_MOD_U0,
|
||||
|
|
|
|||
|
|
@ -285,118 +285,6 @@ VDMOSdSetup(GENmodel *inModel, CKTcircuit *ckt)
|
|||
*
|
||||
*.. bulk-drain and bulk-source depletion capacitances
|
||||
*/
|
||||
if (vbs < here->VDMOStDepCap){
|
||||
arg=1-vbs/here->VDMOStBulkPot;
|
||||
/*
|
||||
* the following block looks somewhat long and messy,
|
||||
* but since most users use the default grading
|
||||
* coefficients of .5, and sqrt is MUCH faster than an
|
||||
* exp(log()) we use this special case code to buy time.
|
||||
* (as much as 10% of total job time!)
|
||||
*/
|
||||
if(model->VDMOSbulkJctBotGradingCoeff ==
|
||||
model->VDMOSbulkJctSideGradingCoeff) {
|
||||
if(model->VDMOSbulkJctBotGradingCoeff == .5) {
|
||||
sarg = sargsw = 1/sqrt(arg);
|
||||
} else {
|
||||
sarg = sargsw =
|
||||
exp(-model->VDMOSbulkJctBotGradingCoeff*
|
||||
log(arg));
|
||||
}
|
||||
} else {
|
||||
if(model->VDMOSbulkJctBotGradingCoeff == .5) {
|
||||
sarg = 1/sqrt(arg);
|
||||
} else {
|
||||
sarg = exp(-model->VDMOSbulkJctBotGradingCoeff*
|
||||
log(arg));
|
||||
}
|
||||
if(model->VDMOSbulkJctSideGradingCoeff == .5) {
|
||||
sargsw = 1/sqrt(arg);
|
||||
} else {
|
||||
sargsw =exp(-model->VDMOSbulkJctSideGradingCoeff*
|
||||
log(arg));
|
||||
}
|
||||
}
|
||||
/*
|
||||
lcapbs=here->VDMOSCbs*sarg+
|
||||
here->VDMOSCbssw*sargsw;
|
||||
*/
|
||||
lcapbs2 = model->VDMOStype*0.5/here->VDMOStBulkPot*(
|
||||
here->VDMOSCbs*model->VDMOSbulkJctBotGradingCoeff*
|
||||
sarg/arg + here->VDMOSCbssw*
|
||||
model->VDMOSbulkJctSideGradingCoeff*sargsw/arg);
|
||||
lcapbs3 = here->VDMOSCbs*sarg*
|
||||
model->VDMOSbulkJctBotGradingCoeff*
|
||||
(model->VDMOSbulkJctBotGradingCoeff+1);
|
||||
lcapbs3 += here->VDMOSCbssw*sargsw*
|
||||
model->VDMOSbulkJctSideGradingCoeff*
|
||||
(model->VDMOSbulkJctSideGradingCoeff+1);
|
||||
lcapbs3 = lcapbs3/(6*here->VDMOStBulkPot*
|
||||
here->VDMOStBulkPot*arg*arg);
|
||||
} else {
|
||||
/* *(ckt->CKTstate0 + here->VDMOSqbs)= here->VDMOSf4s +
|
||||
vbs*(here->VDMOSf2s+vbs*(here->VDMOSf3s/2));*/
|
||||
/*
|
||||
lcapbs=here->VDMOSf2s+here->VDMOSf3s*vbs;
|
||||
*/
|
||||
lcapbs2 = 0.5*here->VDMOSf3s;
|
||||
lcapbs3 = 0;
|
||||
}
|
||||
if (vbd < here->VDMOStDepCap) {
|
||||
arg=1-vbd/here->VDMOStBulkPot;
|
||||
/*
|
||||
* the following block looks somewhat long and messy,
|
||||
* but since most users use the default grading
|
||||
* coefficients of .5, and sqrt is MUCH faster than an
|
||||
* exp(log()) we use this special case code to buy time.
|
||||
* (as much as 10% of total job time!)
|
||||
*/
|
||||
#ifndef NOSQRT
|
||||
if(model->VDMOSbulkJctBotGradingCoeff == .5 &&
|
||||
model->VDMOSbulkJctSideGradingCoeff == .5) {
|
||||
sarg = sargsw = 1/sqrt(arg);
|
||||
} else {
|
||||
if(model->VDMOSbulkJctBotGradingCoeff == .5) {
|
||||
sarg = 1/sqrt(arg);
|
||||
} else {
|
||||
#endif /*NOSQRT*/
|
||||
sarg = exp(-model->VDMOSbulkJctBotGradingCoeff*
|
||||
log(arg));
|
||||
#ifndef NOSQRT
|
||||
}
|
||||
if(model->VDMOSbulkJctSideGradingCoeff == .5) {
|
||||
sargsw = 1/sqrt(arg);
|
||||
} else {
|
||||
#endif /*NOSQRT*/
|
||||
sargsw =exp(-model->VDMOSbulkJctSideGradingCoeff*
|
||||
log(arg));
|
||||
#ifndef NOSQRT
|
||||
}
|
||||
}
|
||||
#endif /*NOSQRT*/
|
||||
/*
|
||||
lcapbd=here->VDMOSCbd*sarg+
|
||||
here->VDMOSCbdsw*sargsw;
|
||||
*/
|
||||
lcapbd2 = model->VDMOStype*0.5/here->VDMOStBulkPot*(
|
||||
here->VDMOSCbd*model->VDMOSbulkJctBotGradingCoeff*
|
||||
sarg/arg + here->VDMOSCbdsw*
|
||||
model->VDMOSbulkJctSideGradingCoeff*sargsw/arg);
|
||||
lcapbd3 = here->VDMOSCbd*sarg*
|
||||
model->VDMOSbulkJctBotGradingCoeff*
|
||||
(model->VDMOSbulkJctBotGradingCoeff+1);
|
||||
lcapbd3 += here->VDMOSCbdsw*sargsw*
|
||||
model->VDMOSbulkJctSideGradingCoeff*
|
||||
(model->VDMOSbulkJctSideGradingCoeff+1);
|
||||
lcapbd3 = lcapbd3/(6*here->VDMOStBulkPot*
|
||||
here->VDMOStBulkPot*arg*arg);
|
||||
} else {
|
||||
/*
|
||||
lcapbd=here->VDMOSf2d + vbd * here->VDMOSf3d;
|
||||
*/
|
||||
lcapbd2=0.5*here->VDMOSf3d;
|
||||
lcapbd3=0;
|
||||
}
|
||||
/*
|
||||
* meyer's capacitor model
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -493,8 +493,6 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
* exp(log()) we use this special case code to buy time.
|
||||
* (as much as 10% of total job time!)
|
||||
*/
|
||||
if (model->VDMOSbulkJctBotGradingCoeff ==
|
||||
model->VDMOSbulkJctSideGradingCoeff) {
|
||||
if (model->VDMOSbulkJctBotGradingCoeff == .5) {
|
||||
sarg = sargsw = 1 / sqrt(arg);
|
||||
}
|
||||
|
|
@ -503,29 +501,9 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
exp(-model->VDMOSbulkJctBotGradingCoeff*
|
||||
log(arg));
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (model->VDMOSbulkJctBotGradingCoeff == .5) {
|
||||
sarg = 1 / sqrt(arg);
|
||||
}
|
||||
else {
|
||||
sarg = exp(-model->VDMOSbulkJctBotGradingCoeff*
|
||||
log(arg));
|
||||
}
|
||||
if (model->VDMOSbulkJctSideGradingCoeff == .5) {
|
||||
sargsw = 1 / sqrt(arg);
|
||||
}
|
||||
else {
|
||||
sargsw = exp(-model->VDMOSbulkJctSideGradingCoeff*
|
||||
log(arg));
|
||||
}
|
||||
}
|
||||
*(ckt->CKTstate0 + here->VDMOSqbs) =
|
||||
here->VDMOStBulkPot*(here->VDMOSCbs*
|
||||
(1 - arg*sarg) / (1 - model->VDMOSbulkJctBotGradingCoeff)
|
||||
+ here->VDMOSCbssw*
|
||||
(1 - arg*sargsw) /
|
||||
(1 - model->VDMOSbulkJctSideGradingCoeff));
|
||||
(1 - arg*sarg) / (1 - model->VDMOSbulkJctBotGradingCoeff));
|
||||
here->VDMOScapbs = here->VDMOSCbs*sarg +
|
||||
here->VDMOSCbssw*sargsw;
|
||||
}
|
||||
|
|
@ -551,8 +529,7 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
* exp(log()) we use this special case code to buy time.
|
||||
* (as much as 10% of total job time!)
|
||||
*/
|
||||
if (model->VDMOSbulkJctBotGradingCoeff == .5 &&
|
||||
model->VDMOSbulkJctSideGradingCoeff == .5) {
|
||||
if (model->VDMOSbulkJctBotGradingCoeff == .5) {
|
||||
sarg = sargsw = 1 / sqrt(arg);
|
||||
}
|
||||
else {
|
||||
|
|
@ -563,21 +540,11 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
|
|||
sarg = exp(-model->VDMOSbulkJctBotGradingCoeff*
|
||||
log(arg));
|
||||
}
|
||||
if (model->VDMOSbulkJctSideGradingCoeff == .5) {
|
||||
sargsw = 1 / sqrt(arg);
|
||||
}
|
||||
else {
|
||||
sargsw = exp(-model->VDMOSbulkJctSideGradingCoeff*
|
||||
log(arg));
|
||||
}
|
||||
}
|
||||
*(ckt->CKTstate0 + here->VDMOSqbd) =
|
||||
here->VDMOStBulkPot*(here->VDMOSCbd*
|
||||
(1 - arg*sarg)
|
||||
/ (1 - model->VDMOSbulkJctBotGradingCoeff)
|
||||
+ here->VDMOSCbdsw*
|
||||
(1 - arg*sargsw)
|
||||
/ (1 - model->VDMOSbulkJctSideGradingCoeff));
|
||||
/ (1 - model->VDMOSbulkJctBotGradingCoeff));
|
||||
here->VDMOScapbd = here->VDMOSCbd*sarg +
|
||||
here->VDMOSCbdsw*sargsw;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -84,12 +84,6 @@ VDMOSmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
|
|||
case VDMOS_MOD_MJ:
|
||||
value->rValue = model->VDMOSbulkJctBotGradingCoeff;
|
||||
return(OK);
|
||||
case VDMOS_MOD_CJSW:
|
||||
value->rValue = model->VDMOSsideWallCapFactor;
|
||||
return(OK);
|
||||
case VDMOS_MOD_MJSW:
|
||||
value->rValue = model->VDMOSbulkJctSideGradingCoeff;
|
||||
return(OK);
|
||||
case VDMOS_MOD_JS:
|
||||
value->rValue = model->VDMOSjctSatCurDensity;
|
||||
return(OK);
|
||||
|
|
|
|||
|
|
@ -75,14 +75,6 @@ VDMOSmParam(int param, IFvalue *value, GENmodel *inModel)
|
|||
model->VDMOSbulkJctBotGradingCoeff = value->rValue;
|
||||
model->VDMOSbulkJctBotGradingCoeffGiven = TRUE;
|
||||
break;
|
||||
case VDMOS_MOD_CJSW:
|
||||
model->VDMOSsideWallCapFactor = value->rValue;
|
||||
model->VDMOSsideWallCapFactorGiven = TRUE;
|
||||
break;
|
||||
case VDMOS_MOD_MJSW:
|
||||
model->VDMOSbulkJctSideGradingCoeff = value->rValue;
|
||||
model->VDMOSbulkJctSideGradingCoeffGiven = TRUE;
|
||||
break;
|
||||
case VDMOS_MOD_JS:
|
||||
model->VDMOSjctSatCurDensity = value->rValue;
|
||||
model->VDMOSjctSatCurDensityGiven = TRUE;
|
||||
|
|
|
|||
|
|
@ -45,18 +45,12 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
|||
if (!model->VDMOSbulkCapFactorGiven) {
|
||||
model->VDMOSbulkCapFactor = 0;
|
||||
}
|
||||
if (!model->VDMOSsideWallCapFactorGiven) {
|
||||
model->VDMOSsideWallCapFactor = 0;
|
||||
}
|
||||
if (!model->VDMOSbulkJctPotentialGiven) {
|
||||
model->VDMOSbulkJctPotential = .8;
|
||||
}
|
||||
if (!model->VDMOSbulkJctBotGradingCoeffGiven) {
|
||||
model->VDMOSbulkJctBotGradingCoeff = .5;
|
||||
}
|
||||
if (!model->VDMOSbulkJctSideGradingCoeffGiven) {
|
||||
model->VDMOSbulkJctSideGradingCoeff = .5;
|
||||
}
|
||||
if (!model->VDMOSfwdCapDepCoeffGiven) {
|
||||
model->VDMOSfwdCapDepCoeff = .5;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -174,9 +174,6 @@ VDMOStemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
here->VDMOStCbd = model->VDMOScapBD * capfact;
|
||||
here->VDMOStCbs = model->VDMOScapBS * capfact;
|
||||
here->VDMOStCj = model->VDMOSbulkCapFactor * capfact;
|
||||
capfact = 1/(1+model->VDMOSbulkJctSideGradingCoeff*
|
||||
(4e-4*(model->VDMOStnom-REFTEMP)-gmaold));
|
||||
here->VDMOStCjsw = model->VDMOSsideWallCapFactor * capfact;
|
||||
here->VDMOStBulkPot = fact2 * pbo+pbfact;
|
||||
gmanew = (here->VDMOStBulkPot-pbo)/pbo;
|
||||
capfact = (1+model->VDMOSbulkJctBotGradingCoeff*
|
||||
|
|
@ -184,9 +181,6 @@ VDMOStemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
here->VDMOStCbd *= capfact;
|
||||
here->VDMOStCbs *= capfact;
|
||||
here->VDMOStCj *= capfact;
|
||||
capfact = (1+model->VDMOSbulkJctSideGradingCoeff*
|
||||
(4e-4*(here->VDMOStemp-REFTEMP)-gmanew));
|
||||
here->VDMOStCjsw *= capfact;
|
||||
here->VDMOStDepCap = model->VDMOSfwdCapDepCoeff * here->VDMOStBulkPot;
|
||||
if (here->VDMOStSatCurDens == 0) {
|
||||
here->VDMOSsourceVcrit = here->VDMOSdrainVcrit =
|
||||
|
|
@ -201,22 +195,14 @@ VDMOStemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
czbdsw=0;
|
||||
arg = 1-model->VDMOSfwdCapDepCoeff;
|
||||
sarg = exp( (-model->VDMOSbulkJctBotGradingCoeff) * log(arg) );
|
||||
sargsw = exp( (-model->VDMOSbulkJctSideGradingCoeff) * log(arg) );
|
||||
here->VDMOSCbd = czbd;
|
||||
here->VDMOSCbdsw = czbdsw;
|
||||
here->VDMOSf2d = czbd*(1-model->VDMOSfwdCapDepCoeff*
|
||||
(1+model->VDMOSbulkJctBotGradingCoeff))* sarg/arg
|
||||
+ czbdsw*(1-model->VDMOSfwdCapDepCoeff*
|
||||
(1+model->VDMOSbulkJctSideGradingCoeff))*
|
||||
sargsw/arg;
|
||||
here->VDMOSf3d = czbd * model->VDMOSbulkJctBotGradingCoeff * sarg/arg/
|
||||
here->VDMOStBulkPot
|
||||
+ czbdsw * model->VDMOSbulkJctSideGradingCoeff * sargsw/arg /
|
||||
here->VDMOStBulkPot;
|
||||
here->VDMOSf4d = czbd*here->VDMOStBulkPot*(1-arg*sarg)/
|
||||
(1-model->VDMOSbulkJctBotGradingCoeff)
|
||||
+ czbdsw*here->VDMOStBulkPot*(1-arg*sargsw)/
|
||||
(1-model->VDMOSbulkJctSideGradingCoeff)
|
||||
here->VDMOSf2d = czbd * (1 - model->VDMOSfwdCapDepCoeff *
|
||||
(1 + model->VDMOSbulkJctBotGradingCoeff)) * sarg / arg;
|
||||
here->VDMOSf3d = czbd * model->VDMOSbulkJctBotGradingCoeff * sarg / arg /
|
||||
here->VDMOStBulkPot;
|
||||
here->VDMOSf4d = czbd * here->VDMOStBulkPot * (1 - arg * sarg) /
|
||||
(1 - model->VDMOSbulkJctBotGradingCoeff);
|
||||
-here->VDMOSf3d/2*
|
||||
(here->VDMOStDepCap*here->VDMOStDepCap)
|
||||
-here->VDMOStDepCap * here->VDMOSf2d;
|
||||
|
|
@ -228,22 +214,14 @@ VDMOStemp(GENmodel *inModel, CKTcircuit *ckt)
|
|||
czbssw=0;
|
||||
arg = 1-model->VDMOSfwdCapDepCoeff;
|
||||
sarg = exp( (-model->VDMOSbulkJctBotGradingCoeff) * log(arg) );
|
||||
sargsw = exp( (-model->VDMOSbulkJctSideGradingCoeff) * log(arg) );
|
||||
here->VDMOSCbs = czbs;
|
||||
here->VDMOSCbssw = czbssw;
|
||||
here->VDMOSf2s = czbs*(1-model->VDMOSfwdCapDepCoeff*
|
||||
(1+model->VDMOSbulkJctBotGradingCoeff))* sarg/arg
|
||||
+ czbssw*(1-model->VDMOSfwdCapDepCoeff*
|
||||
(1+model->VDMOSbulkJctSideGradingCoeff))*
|
||||
sargsw/arg;
|
||||
here->VDMOSf3s = czbs * model->VDMOSbulkJctBotGradingCoeff * sarg/arg/
|
||||
here->VDMOStBulkPot
|
||||
+ czbssw * model->VDMOSbulkJctSideGradingCoeff * sargsw/arg /
|
||||
here->VDMOStBulkPot;
|
||||
here->VDMOSf2s = czbs * (1 - model->VDMOSfwdCapDepCoeff *
|
||||
(1 + model->VDMOSbulkJctBotGradingCoeff)) * sarg / arg;
|
||||
here->VDMOSf3s = czbs * model->VDMOSbulkJctBotGradingCoeff * sarg / arg /
|
||||
here->VDMOStBulkPot;
|
||||
here->VDMOSf4s = czbs*here->VDMOStBulkPot*(1-arg*sarg)/
|
||||
(1-model->VDMOSbulkJctBotGradingCoeff)
|
||||
+ czbssw*here->VDMOStBulkPot*(1-arg*sargsw)/
|
||||
(1-model->VDMOSbulkJctSideGradingCoeff)
|
||||
-here->VDMOSf3s/2*
|
||||
(here->VDMOStDepCap*here->VDMOStDepCap)
|
||||
-here->VDMOStDepCap * here->VDMOSf2s;
|
||||
|
|
|
|||
Loading…
Reference in New Issue