From ef547eb8ffe13653b3b43dad9c6686bc8b0228b1 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Wed, 4 Apr 2018 13:10:38 +0200 Subject: [PATCH] sidewall capacitance calculation removed --- src/spicelib/devices/vdmos/vdmos.c | 2 - src/spicelib/devices/vdmos/vdmosdefs.h | 7 -- src/spicelib/devices/vdmos/vdmosdset.c | 112 ------------------------- src/spicelib/devices/vdmos/vdmosload.c | 39 +-------- src/spicelib/devices/vdmos/vdmosmask.c | 6 -- src/spicelib/devices/vdmos/vdmosmpar.c | 8 -- src/spicelib/devices/vdmos/vdmosset.c | 6 -- src/spicelib/devices/vdmos/vdmostemp.c | 42 +++------- 8 files changed, 13 insertions(+), 209 deletions(-) diff --git a/src/spicelib/devices/vdmos/vdmos.c b/src/spicelib/devices/vdmos/vdmos.c index 618ab6cf2..9b0c5dd84 100644 --- a/src/spicelib/devices/vdmos/vdmos.c +++ b/src/spicelib/devices/vdmos/vdmos.c @@ -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"), diff --git a/src/spicelib/devices/vdmos/vdmosdefs.h b/src/spicelib/devices/vdmos/vdmosdefs.h index 5e0058f9c..6f1a3dd2d 100644 --- a/src/spicelib/devices/vdmos/vdmosdefs.h +++ b/src/spicelib/devices/vdmos/vdmosdefs.h @@ -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, diff --git a/src/spicelib/devices/vdmos/vdmosdset.c b/src/spicelib/devices/vdmos/vdmosdset.c index 4ce39d746..f69b32768 100644 --- a/src/spicelib/devices/vdmos/vdmosdset.c +++ b/src/spicelib/devices/vdmos/vdmosdset.c @@ -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 */ diff --git a/src/spicelib/devices/vdmos/vdmosload.c b/src/spicelib/devices/vdmos/vdmosload.c index 0230729b5..bcb3ef384 100644 --- a/src/spicelib/devices/vdmos/vdmosload.c +++ b/src/spicelib/devices/vdmos/vdmosload.c @@ -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; } diff --git a/src/spicelib/devices/vdmos/vdmosmask.c b/src/spicelib/devices/vdmos/vdmosmask.c index d3e3c187f..2bfe5c92e 100644 --- a/src/spicelib/devices/vdmos/vdmosmask.c +++ b/src/spicelib/devices/vdmos/vdmosmask.c @@ -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); diff --git a/src/spicelib/devices/vdmos/vdmosmpar.c b/src/spicelib/devices/vdmos/vdmosmpar.c index aaa56a58c..9b68bde0c 100644 --- a/src/spicelib/devices/vdmos/vdmosmpar.c +++ b/src/spicelib/devices/vdmos/vdmosmpar.c @@ -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; diff --git a/src/spicelib/devices/vdmos/vdmosset.c b/src/spicelib/devices/vdmos/vdmosset.c index 63abdf95d..ee7307075 100644 --- a/src/spicelib/devices/vdmos/vdmosset.c +++ b/src/spicelib/devices/vdmos/vdmosset.c @@ -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; } diff --git a/src/spicelib/devices/vdmos/vdmostemp.c b/src/spicelib/devices/vdmos/vdmostemp.c index 9f003968b..d2e1b83ed 100644 --- a/src/spicelib/devices/vdmos/vdmostemp.c +++ b/src/spicelib/devices/vdmos/vdmostemp.c @@ -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;