sidewall capacitance calculation removed

This commit is contained in:
Holger Vogt 2018-04-04 13:10:38 +02:00 committed by rlar
parent 7df59a750e
commit ef547eb8ff
8 changed files with 13 additions and 209 deletions

View File

@ -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"),

View File

@ -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,

View File

@ -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
*/

View File

@ -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;
}

View File

@ -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);

View File

@ -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;

View File

@ -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;
}

View File

@ -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;