Browse Source

mobility and substrate related parameters and equations removed

pre-master-46
Holger Vogt 8 years ago
committed by rlar
parent
commit
5b8c8072f3
  1. 13
      src/spicelib/devices/vdmos/vdmos.c
  2. 37
      src/spicelib/devices/vdmos/vdmosdefs.h
  3. 44
      src/spicelib/devices/vdmos/vdmosdset.c
  4. 18
      src/spicelib/devices/vdmos/vdmosload.c
  5. 30
      src/spicelib/devices/vdmos/vdmosmask.c
  6. 40
      src/spicelib/devices/vdmos/vdmosmpar.c
  7. 9
      src/spicelib/devices/vdmos/vdmosset.c
  8. 103
      src/spicelib/devices/vdmos/vdmostemp.c

13
src/spicelib/devices/vdmos/vdmos.c

@ -115,19 +115,6 @@ IFparm VDMOSmPTable[] = { /* model parameters */
IP("vdmosn", VDMOS_MOD_NMOS, IF_FLAG, "N type DMOSfet model"),
IP("vdmosp", VDMOS_MOD_PMOS, IF_FLAG, "P type DMOSfet model"),
IP("vdmos", VDMOS_MOD_DMOS, IF_REAL, "DMOS transistor"),
/* MOS1 */
IOP("gamma", VDMOS_MOD_GAMMA, IF_REAL, "Bulk threshold parameter"),
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"),
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"),
IOPR("uo", VDMOS_MOD_U0, IF_REAL, "Surface mobility"),
IOP("nsub", VDMOS_MOD_NSUB, IF_REAL, "Substrate doping"),
IOP("tpg", VDMOS_MOD_TPG, IF_INTEGER,"Gate type"),
IOP("nss", VDMOS_MOD_NSS, IF_REAL, "Surface state density")
};
char *VDMOSnames[] = {

37
src/spicelib/devices/vdmos/vdmosdefs.h

@ -57,18 +57,11 @@ typedef struct sVDMOSinstance {
double VDMOSdtemp; /* operating temperature of the instance relative to circuit temperature*/
double VDMOStTransconductance; /* temperature corrected transconductance*/
double VDMOStSurfMob; /* temperature corrected surface mobility */
double VDMOStPhi; /* temperature corrected Phi */
double VDMOStVto; /* temperature corrected Vto */
double VDMOStSatCur; /* temperature corrected saturation Cur. */
double VDMOStSatCurDens; /* temperature corrected saturation Cur. density*/
double VDMOStCbd; /* temperature corrected B-D Capacitance */
double VDMOStCbs; /* temperature corrected B-S Capacitance */
double VDMOStCj; /* temperature corrected Bulk bottom Capacitance */
double VDMOStBulkPot; /* temperature corrected Bulk potential */
double VDMOStDepCap; /* temperature adjusted transition point in */
/* the cureve matching Fc * Vj */
double VDMOStVbi; /* temperature adjusted Vbi */
double VDMOSicVBS; /* initial condition B-S voltage */
double VDMOSicVDS; /* initial condition D-S voltage */
@ -285,7 +278,6 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */
int VDMOStype; /* device type : 1 = nmos, -1 = pmos */
double VDMOStnom; /* temperature at which parameters measured */
double VDMOSjctSatCurDensity; /* input - use tSatCurDens */
double VDMOSjctSatCur; /* input - use tSatCur */
double VDMOSdrainResistance;
double VDMOSsourceResistance;
@ -294,20 +286,11 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */
double VDMOStransconductance; /* input - use tTransconductance */
double VDMOSoxideCapFactor;
double VDMOSvt0; /* input - use tVto */
double VDMOScapBD; /* input - use tCbd */
double VDMOScapBS; /* input - use tCbs */
double VDMOSbulkCapFactor; /* input - use tCj */
double VDMOSbulkJctPotential; /* input - use tBulkPot */
double VDMOSbulkJctBotGradingCoeff;
double VDMOSfwdCapDepCoeff;
double VDMOSphi; /* input - use tPhi */
double VDMOSgamma;
double VDMOSlambda;
double VDMOSsubstrateDoping;
int VDMOSgateType;
double VDMOSsurfaceStateDensity;
double VDMOSoxideThickness;
double VDMOSsurfaceMobility; /* input - use tSurfMob */
double VDMOSfNcoef;
double VDMOSfNexp;
double VDMOScgdmin;
@ -316,27 +299,17 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */
double VDMOScgs;
unsigned VDMOStypeGiven :1;
unsigned VDMOSjctSatCurDensityGiven :1;
unsigned VDMOSjctSatCurGiven :1;
unsigned VDMOSdrainResistanceGiven :1;
unsigned VDMOSsourceResistanceGiven :1;
unsigned VDMOSgateResistanceGiven :1;
unsigned VDMOStransconductanceGiven :1;
unsigned VDMOSvt0Given :1;
unsigned VDMOScapBDGiven :1;
unsigned VDMOScapBSGiven :1;
unsigned VDMOSbulkCapFactorGiven :1;
unsigned VDMOSbulkJctPotentialGiven :1;
unsigned VDMOSbulkJctBotGradingCoeffGiven :1;
unsigned VDMOSfwdCapDepCoeffGiven :1;
unsigned VDMOSphiGiven :1;
unsigned VDMOSgammaGiven :1;
unsigned VDMOSlambdaGiven :1;
unsigned VDMOSsubstrateDopingGiven :1;
unsigned VDMOSgateTypeGiven :1;
unsigned VDMOSsurfaceStateDensityGiven :1;
unsigned VDMOSoxideThicknessGiven :1;
unsigned VDMOSsurfaceMobilityGiven :1;
unsigned VDMOStnomGiven :1;
unsigned VDMOSfNcoefGiven :1;
unsigned VDMOSfNexpGiven :1;
@ -375,25 +348,15 @@ enum {
enum {
VDMOS_MOD_VTO = 101,
VDMOS_MOD_KP,
VDMOS_MOD_GAMMA,
VDMOS_MOD_PHI,
VDMOS_MOD_LAMBDA,
VDMOS_MOD_RD,
VDMOS_MOD_RS,
VDMOS_MOD_RG,
VDMOS_MOD_CBD,
VDMOS_MOD_CBS,
VDMOS_MOD_IS,
VDMOS_MOD_VJ,
VDMOS_MOD_CJ,
VDMOS_MOD_MJ,
VDMOS_MOD_JS,
VDMOS_MOD_TOX,
VDMOS_MOD_U0,
VDMOS_MOD_FC,
VDMOS_MOD_NSUB,
VDMOS_MOD_TPG,
VDMOS_MOD_NSS,
VDMOS_MOD_NMOS,
VDMOS_MOD_PMOS,
VDMOS_MOD_TNOM,

44
src/spicelib/devices/vdmos/vdmosdset.c

@ -29,16 +29,12 @@ VDMOSdSetup(GENmodel *inModel, CKTcircuit *ckt)
double ebd;
double vgst;
double evbs;
double sargsw;
double vbd;
double vbs;
double vds;
double arg;
double sarg;
double vdsat;
double vgd;
double vgs;
double von;
double vt;
double lgbs;
double lgbs2;
@ -67,10 +63,10 @@ VDMOSdSetup(GENmodel *inModel, CKTcircuit *ckt)
double lcapgs3;
double lcapgd2;
double lcapgd3;
double lcapbs2;
double lcapbs3;
double lcapbd2;
double lcapbd3;
double lcapbs2 = 0;
double lcapbs3 = 0;
double lcapbd2 = 0;
double lcapbd3 = 0;
double gmbds = 0.0;
@ -158,37 +154,9 @@ VDMOSdSetup(GENmodel *inModel, CKTcircuit *ckt)
double d2vondvbs2;
double d3vondvbs3;
if ((here->VDMOSmode==1?vbs:vbd) <= 0 ) {
sarg=sqrt(here->VDMOStPhi-(here->VDMOSmode==1?vbs:vbd));
if (-model->VDMOSgamma != 0.0) {
dvondvbs = -model->VDMOSgamma*0.5/sarg;
d2vondvbs2 = - dvondvbs*0.5/(sarg*sarg);
d3vondvbs3 = 1.5*d2vondvbs2/(sarg*sarg);
}
else {
dvondvbs = d2vondvbs2 = d3vondvbs3 = 0.0;
}
} else {
sarg=sqrt(here->VDMOStPhi);
if (model->VDMOSgamma != 0.0) {
dvondvbs = -model->VDMOSgamma/(sarg+sarg);
}
else {
dvondvbs = 0.0;
}
d2vondvbs2 = d3vondvbs3 = 0;
sarg=sarg-(here->VDMOSmode==1?vbs:vbd)/(sarg+sarg);
sarg=MAX(0,sarg);
dvondvbs = (sarg<=0?0:dvondvbs);
}
von=(here->VDMOStVbi*model->VDMOStype)+model->VDMOSgamma*sarg;
vgst=(here->VDMOSmode==1?vgs:vgd)-von;
vgst=(here->VDMOSmode==1?vgs:vgd);
vdsat=MAX(vgst,0);
/* if (sarg <= 0) {
arg=0;
} else {
arg=model->VDMOSgamma/(sarg+sarg);
} */
if (vgst <= 0) {
/*
* cutoff region
@ -314,7 +282,7 @@ VDMOSdSetup(GENmodel *inModel, CKTcircuit *ckt)
phi = here->VDMOStPhi;
phi = 0.6;
cox = 0;/*FIXME: can we do disto without knowing the oxide thickness?*/
if (vgst <= -phi) {
lcapgb2=lcapgb3=lcapgs2=lcapgs3=lcapgd2=lcapgd3=0;

18
src/spicelib/devices/vdmos/vdmosload.c

@ -394,26 +394,12 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt)
*/
double arg;
double betap;
double sarg;
double vgst;
if ((here->VDMOSmode == 1 ? vbs : vbd) <= 0) {
sarg = sqrt(here->VDMOStPhi - (here->VDMOSmode == 1 ? vbs : vbd));
}
else {
sarg = sqrt(here->VDMOStPhi);
sarg = sarg - (here->VDMOSmode == 1 ? vbs : vbd) / (sarg + sarg);
sarg = MAX(0, sarg);
}
von = (here->VDMOStVbi*model->VDMOStype) + model->VDMOSgamma*sarg;
von = (model->VDMOSvt0*model->VDMOStype);
vgst = (here->VDMOSmode == 1 ? vgs : vgd) - von;
vdsat = MAX(vgst, 0);
if (sarg <= 0) {
arg = 0;
}
else {
arg = model->VDMOSgamma / (sarg + sarg);
}
arg = 0;
if (vgst <= 0) {
/*
* cutoff region

30
src/spicelib/devices/vdmos/vdmosmask.c

@ -30,9 +30,6 @@ VDMOSmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
case VDMOS_MOD_KP:
value->rValue = model->VDMOStransconductance;
return(OK);
case VDMOS_MOD_GAMMA:
value->rValue = model->VDMOSgamma;
return(OK);
case VDMOS_MOD_PHI:
value->rValue = model->VDMOSphi;
return(OK);
@ -48,9 +45,6 @@ VDMOSmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
case VDMOS_MOD_RG:
value->rValue = model->VDMOSgateResistance;
return(OK);
case VDMOS_MOD_CBD:
value->rValue = model->VDMOScapBD;
return(OK);
case VDMOS_MOD_TYPE:
if (model->VDMOStype > 0)
value->sValue = "vdmosn";
@ -60,9 +54,6 @@ VDMOSmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
case VDMOS_MOD_CGDMIN:
value->rValue = model->VDMOScgdmin;
return(OK);
case VDMOS_MOD_CBS:
value->rValue = model->VDMOScapBS;
return(OK);
case VDMOS_MOD_CGDMAX:
value->rValue = model->VDMOScgdmax;
return(OK);
@ -78,33 +69,12 @@ VDMOSmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
case VDMOS_MOD_VJ:
value->rValue = model->VDMOSbulkJctPotential;
return(OK);
case VDMOS_MOD_CJ:
value->rValue = model->VDMOSbulkCapFactor;
return(OK);
case VDMOS_MOD_MJ:
value->rValue = model->VDMOSbulkJctBotGradingCoeff;
return(OK);
case VDMOS_MOD_JS:
value->rValue = model->VDMOSjctSatCurDensity;
return(OK);
case VDMOS_MOD_TOX:
value->rValue = model->VDMOSoxideThickness;
return(OK);
case VDMOS_MOD_U0:
value->rValue = model->VDMOSsurfaceMobility;
return(OK);
case VDMOS_MOD_FC:
value->rValue = model->VDMOSfwdCapDepCoeff;
return(OK);
case VDMOS_MOD_NSUB:
value->rValue = model->VDMOSsubstrateDoping;
return(OK);
case VDMOS_MOD_TPG:
value->iValue = model->VDMOSgateType;
return(OK);
case VDMOS_MOD_NSS:
value->rValue = model->VDMOSsurfaceStateDensity;
return(OK);
default:
return(E_BADPARM);
}

40
src/spicelib/devices/vdmos/vdmosmpar.c

@ -27,10 +27,6 @@ VDMOSmParam(int param, IFvalue *value, GENmodel *inModel)
model->VDMOStransconductance = value->rValue;
model->VDMOStransconductanceGiven = TRUE;
break;
case VDMOS_MOD_GAMMA:
model->VDMOSgamma = value->rValue;
model->VDMOSgammaGiven = TRUE;
break;
case VDMOS_MOD_PHI:
model->VDMOSphi = value->rValue;
model->VDMOSphiGiven = TRUE;
@ -51,14 +47,6 @@ VDMOSmParam(int param, IFvalue *value, GENmodel *inModel)
model->VDMOSgateResistance = value->rValue;
model->VDMOSgateResistanceGiven = TRUE;
break;
case VDMOS_MOD_CBD:
model->VDMOScapBD = value->rValue;
model->VDMOScapBDGiven = TRUE;
break;
case VDMOS_MOD_CBS:
model->VDMOScapBS = value->rValue;
model->VDMOScapBSGiven = TRUE;
break;
case VDMOS_MOD_IS:
model->VDMOSjctSatCur = value->rValue;
model->VDMOSjctSatCurGiven = TRUE;
@ -67,42 +55,14 @@ VDMOSmParam(int param, IFvalue *value, GENmodel *inModel)
model->VDMOSbulkJctPotential = value->rValue;
model->VDMOSbulkJctPotentialGiven = TRUE;
break;
case VDMOS_MOD_CJ:
model->VDMOSbulkCapFactor = value->rValue;
model->VDMOSbulkCapFactorGiven = TRUE;
break;
case VDMOS_MOD_MJ:
model->VDMOSbulkJctBotGradingCoeff = value->rValue;
model->VDMOSbulkJctBotGradingCoeffGiven = TRUE;
break;
case VDMOS_MOD_JS:
model->VDMOSjctSatCurDensity = value->rValue;
model->VDMOSjctSatCurDensityGiven = TRUE;
break;
case VDMOS_MOD_TOX:
model->VDMOSoxideThickness = value->rValue;
model->VDMOSoxideThicknessGiven = TRUE;
break;
case VDMOS_MOD_U0:
model->VDMOSsurfaceMobility = value->rValue;
model->VDMOSsurfaceMobilityGiven = TRUE;
break;
case VDMOS_MOD_FC:
model->VDMOSfwdCapDepCoeff = value->rValue;
model->VDMOSfwdCapDepCoeffGiven = TRUE;
break;
case VDMOS_MOD_NSS:
model->VDMOSsurfaceStateDensity = value->rValue;
model->VDMOSsurfaceStateDensityGiven = TRUE;
break;
case VDMOS_MOD_NSUB:
model->VDMOSsubstrateDoping = value->rValue;
model->VDMOSsubstrateDopingGiven = TRUE;
break;
case VDMOS_MOD_TPG:
model->VDMOSgateType = value->iValue;
model->VDMOSgateTypeGiven = TRUE;
break;
case VDMOS_MOD_NMOS:
if(value->iValue) {
model->VDMOStype = 1;

9
src/spicelib/devices/vdmos/vdmosset.c

@ -30,9 +30,6 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
if (!model->VDMOStypeGiven) {
model->VDMOStype = NMOS;
}
if (!model->VDMOSjctSatCurDensityGiven) {
model->VDMOSjctSatCurDensity = 0;
}
if (!model->VDMOSjctSatCurGiven) {
model->VDMOSjctSatCur = 1e-14;
}
@ -42,9 +39,6 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
if (!model->VDMOSvt0Given) {
model->VDMOSvt0 = 0;
}
if (!model->VDMOSbulkCapFactorGiven) {
model->VDMOSbulkCapFactor = 0;
}
if (!model->VDMOSbulkJctPotentialGiven) {
model->VDMOSbulkJctPotential = .8;
}
@ -60,9 +54,6 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
if (!model->VDMOSlambdaGiven) {
model->VDMOSlambda = 0;
}
if (!model->VDMOSgammaGiven) {
model->VDMOSgamma = 0;
}
if (!model->VDMOSfNcoefGiven) {
model->VDMOSfNcoef = 0;
}

103
src/spicelib/devices/vdmos/vdmostemp.c

@ -22,17 +22,8 @@ VDMOStemp(GENmodel *inModel, CKTcircuit *ckt)
double kt,kt1;
double arg1;
double ratio,ratio4;
double phio;
double pbo;
double gmanew,gmaold;
double capfact;
double pbfact1,pbfact;
double vt,vtnom;
double wkfngs;
double wkfng;
double fermig;
double fermis;
double vfb;
/* loop through all the resistor models */
for( ; model != NULL; model = VDMOSnextModel(model)) {
@ -52,65 +43,7 @@ VDMOStemp(GENmodel *inModel, CKTcircuit *ckt)
/* now model parameter preprocessing */
if (model->VDMOSphi <= 0.0) {
SPfrontEnd->IFerrorf (ERR_FATAL,
"%s: Phi is not positive.", model->VDMOSmodName);
return(E_BADPARM);
}
if(!model->VDMOSoxideThicknessGiven || model->VDMOSoxideThickness == 0) {
model->VDMOSoxideCapFactor = 0;
} else {
model->VDMOSoxideCapFactor = 3.9 * 8.854214871e-12/
model->VDMOSoxideThickness;
if(!model->VDMOStransconductanceGiven) {
if(!model->VDMOSsurfaceMobilityGiven) {
model->VDMOSsurfaceMobility=600;
}
model->VDMOStransconductance = model->VDMOSsurfaceMobility *
model->VDMOSoxideCapFactor * 1e-4 /*(m**2/cm**2)*/;
}
if(model->VDMOSsubstrateDopingGiven) {
if(model->VDMOSsubstrateDoping*1e6 /*(cm**3/m**3)*/ >1.45e16) {
if(!model->VDMOSphiGiven) {
model->VDMOSphi = 2*vtnom*
log(model->VDMOSsubstrateDoping*
1e6/*(cm**3/m**3)*//1.45e16);
model->VDMOSphi = MAX(.1,model->VDMOSphi);
}
fermis = model->VDMOStype * .5 * model->VDMOSphi;
wkfng = 3.2;
if(!model->VDMOSgateTypeGiven) model->VDMOSgateType=1;
if(model->VDMOSgateType != 0) {
fermig = model->VDMOStype *model->VDMOSgateType*.5*egfet1;
wkfng = 3.25 + .5 * egfet1 - fermig;
}
wkfngs = wkfng - (3.25 + .5 * egfet1 +fermis);
if(!model->VDMOSgammaGiven) {
model->VDMOSgamma = sqrt(2 * 11.70 * 8.854214871e-12 *
CHARGE * model->VDMOSsubstrateDoping*
1e6/*(cm**3/m**3)*/)/
model->VDMOSoxideCapFactor;
}
if(!model->VDMOSvt0Given) {
if(!model->VDMOSsurfaceStateDensityGiven)
model->VDMOSsurfaceStateDensity=0;
vfb = wkfngs -
model->VDMOSsurfaceStateDensity *
1e4 /*(cm**2/m**2)*/ *
CHARGE/model->VDMOSoxideCapFactor;
model->VDMOSvt0 = vfb + model->VDMOStype *
(model->VDMOSgamma * sqrt(model->VDMOSphi)+
model->VDMOSphi);
}
} else {
model->VDMOSsubstrateDoping = 0;
SPfrontEnd->IFerrorf (ERR_FATAL,
"%s: Nsub < Ni", model->VDMOSmodName);
return(E_BADPARM);
}
}
}
model->VDMOSoxideCapFactor = 0;
/* loop through all instances of the model */
@ -147,39 +80,7 @@ VDMOStemp(GENmodel *inModel, CKTcircuit *ckt)
ratio4 = ratio * sqrt(ratio);
here->VDMOStTransconductance = model->VDMOStransconductance / ratio4;
here->VDMOStSurfMob = model->VDMOSsurfaceMobility/ratio4;
phio= (model->VDMOSphi-pbfact1)/fact1;
here->VDMOStPhi = fact2 * phio + pbfact;
here->VDMOStVbi =
model->VDMOSvt0 - model->VDMOStype *
(model->VDMOSgamma* sqrt(model->VDMOSphi))
+.5*(egfet1-egfet)
+ model->VDMOStype*.5* (here->VDMOStPhi-model->VDMOSphi);
here->VDMOStVto = here->VDMOStVbi + model->VDMOStype *
model->VDMOSgamma * sqrt(here->VDMOStPhi);
here->VDMOStSatCur = model->VDMOSjctSatCur*
exp(-egfet/vt+egfet1/vtnom);
here->VDMOStSatCurDens = model->VDMOSjctSatCurDensity *
exp(-egfet/vt+egfet1/vtnom);
pbo = (model->VDMOSbulkJctPotential - pbfact1)/fact1;
gmaold = (model->VDMOSbulkJctPotential-pbo)/pbo;
capfact = 1/(1+model->VDMOSbulkJctBotGradingCoeff*
(4e-4*(model->VDMOStnom-REFTEMP)-gmaold));
here->VDMOStCbd = model->VDMOScapBD * capfact;
here->VDMOStCbs = model->VDMOScapBS * capfact;
here->VDMOStCj = model->VDMOSbulkCapFactor * capfact;
here->VDMOStBulkPot = fact2 * pbo+pbfact;
gmanew = (here->VDMOStBulkPot-pbo)/pbo;
capfact = (1+model->VDMOSbulkJctBotGradingCoeff*
(4e-4*(here->VDMOStemp-REFTEMP)-gmanew));
here->VDMOStCbd *= capfact;
here->VDMOStCbs *= capfact;
here->VDMOStCj *= capfact;
here->VDMOStDepCap = model->VDMOSfwdCapDepCoeff * here->VDMOStBulkPot;
if (here->VDMOStSatCurDens == 0) {
here->VDMOSsourceVcrit = here->VDMOSdrainVcrit =
vt*log(vt/(CONSTroot2*here->VDMOSm*here->VDMOStSatCur));
}
here->VDMOStVto = model->VDMOSvt0;
here->VDMOSCbd = 0;
here->VDMOSf2d = 0;

Loading…
Cancel
Save