Removed a bug in the model that caused different results in repeated analyses.

This commit is contained in:
pnenzi 2001-02-06 18:05:18 +00:00
parent 7ec1d5d3d1
commit ef0b33fdde
2 changed files with 2611 additions and 2590 deletions

View File

@ -21,7 +21,8 @@ GENmodel *inMod;
{ {
BSIM3model *mod = (BSIM3model *) inMod; BSIM3model *mod = (BSIM3model *) inMod;
switch (param) switch (param)
{ case BSIM3_MOD_MOBMOD : {
case BSIM3_MOD_MOBMOD:
mod->BSIM3mobMod = value->iValue; mod->BSIM3mobMod = value->iValue;
mod->BSIM3mobModGiven = TRUE; mod->BSIM3mobModGiven = TRUE;
break; break;
@ -1462,7 +1463,7 @@ GENmodel *inMod;
break; break;
case BSIM3_MOD_TNOM: case BSIM3_MOD_TNOM:
mod->BSIM3tnom = value->rValue; mod->BSIM3tnom = value->rValue + 273.15;
mod->BSIM3tnomGiven = TRUE; mod->BSIM3tnomGiven = TRUE;
break; break;
case BSIM3_MOD_CGSO: case BSIM3_MOD_CGSO:
@ -1655,13 +1656,15 @@ GENmodel *inMod;
mod->BSIM3kfGiven = TRUE; mod->BSIM3kfGiven = TRUE;
break; break;
case BSIM3_MOD_NMOS: case BSIM3_MOD_NMOS:
if(value->iValue) { if (value->iValue)
{
mod->BSIM3type = 1; mod->BSIM3type = 1;
mod->BSIM3typeGiven = TRUE; mod->BSIM3typeGiven = TRUE;
} }
break; break;
case BSIM3_MOD_PMOS: case BSIM3_MOD_PMOS:
if(value->iValue) { if (value->iValue)
{
mod->BSIM3type = -1; mod->BSIM3type = -1;
mod->BSIM3typeGiven = TRUE; mod->BSIM3typeGiven = TRUE;
} }
@ -1671,5 +1674,3 @@ GENmodel *inMod;
} }
return (OK); return (OK);
} }

View File

@ -714,8 +714,8 @@ CKTnode *tmp;
/* unit degree celcius */ /* unit degree celcius */
if (!model->BSIM3tnomGiven) if (!model->BSIM3tnomGiven)
model->BSIM3tnom = ckt->CKTnomTemp; model->BSIM3tnom = ckt->CKTnomTemp;
else /* else
model->BSIM3tnom = model->BSIM3tnom + 273.15; model->BSIM3tnom = model->BSIM3tnom + 273.15; */
if (!model->BSIM3LintGiven) if (!model->BSIM3LintGiven)
model->BSIM3Lint = 0.0; model->BSIM3Lint = 0.0;
if (!model->BSIM3LlGiven) if (!model->BSIM3LlGiven)
@ -768,16 +768,20 @@ CKTnode *tmp;
model->BSIM3cf = 2.0 * EPSOX / M_PI model->BSIM3cf = 2.0 * EPSOX / M_PI
* log (1.0 + 0.4e-6 / model->BSIM3tox); * log (1.0 + 0.4e-6 / model->BSIM3tox);
if (!model->BSIM3cgdoGiven) if (!model->BSIM3cgdoGiven)
{ if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) {
{ model->BSIM3cgdo = model->BSIM3dlc * model->BSIM3cox if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0))
{
model->BSIM3cgdo = model->BSIM3dlc * model->BSIM3cox
- model->BSIM3cgdl; - model->BSIM3cgdl;
} }
else else
model->BSIM3cgdo = 0.6 * model->BSIM3xj * model->BSIM3cox; model->BSIM3cgdo = 0.6 * model->BSIM3xj * model->BSIM3cox;
} }
if (!model->BSIM3cgsoGiven) if (!model->BSIM3cgsoGiven)
{ if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) {
{ model->BSIM3cgso = model->BSIM3dlc * model->BSIM3cox if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0))
{
model->BSIM3cgso = model->BSIM3dlc * model->BSIM3cox
- model->BSIM3cgsl; - model->BSIM3cgsl;
} }
else else
@ -785,7 +789,8 @@ CKTnode *tmp;
} }
if (!model->BSIM3cgboGiven) if (!model->BSIM3cgboGiven)
{ model->BSIM3cgbo = 2.0 * model->BSIM3dwc * model->BSIM3cox; {
model->BSIM3cgbo = 2.0 * model->BSIM3dwc * model->BSIM3cox;
} }
if (!model->BSIM3xpartGiven) if (!model->BSIM3xpartGiven)
model->BSIM3xpart = 0.0; model->BSIM3xpart = 0.0;
@ -796,7 +801,8 @@ CKTnode *tmp;
if (!model->BSIM3unitLengthSidewallJctCapGiven) if (!model->BSIM3unitLengthSidewallJctCapGiven)
model->BSIM3unitLengthSidewallJctCap = 5.0E-10; model->BSIM3unitLengthSidewallJctCap = 5.0E-10;
if (!model->BSIM3unitLengthGateSidewallJctCapGiven) if (!model->BSIM3unitLengthGateSidewallJctCapGiven)
model->BSIM3unitLengthGateSidewallJctCap = model->BSIM3unitLengthSidewallJctCap ; model->BSIM3unitLengthGateSidewallJctCap =
model->BSIM3unitLengthSidewallJctCap;
if (!model->BSIM3jctSatCurDensityGiven) if (!model->BSIM3jctSatCurDensityGiven)
model->BSIM3jctSatCurDensity = 1.0E-4; model->BSIM3jctSatCurDensity = 1.0E-4;
if (!model->BSIM3jctSidewallSatCurDensityGiven) if (!model->BSIM3jctSidewallSatCurDensityGiven)
@ -806,31 +812,36 @@ CKTnode *tmp;
if (!model->BSIM3sidewallJctPotentialGiven) if (!model->BSIM3sidewallJctPotentialGiven)
model->BSIM3sidewallJctPotential = 1.0; model->BSIM3sidewallJctPotential = 1.0;
if (!model->BSIM3GatesidewallJctPotentialGiven) if (!model->BSIM3GatesidewallJctPotentialGiven)
model->BSIM3GatesidewallJctPotential = model->BSIM3sidewallJctPotential; model->BSIM3GatesidewallJctPotential =
model->BSIM3sidewallJctPotential;
if (!model->BSIM3bulkJctBotGradingCoeffGiven) if (!model->BSIM3bulkJctBotGradingCoeffGiven)
model->BSIM3bulkJctBotGradingCoeff = 0.5; model->BSIM3bulkJctBotGradingCoeff = 0.5;
if (!model->BSIM3bulkJctSideGradingCoeffGiven) if (!model->BSIM3bulkJctSideGradingCoeffGiven)
model->BSIM3bulkJctSideGradingCoeff = 0.33; model->BSIM3bulkJctSideGradingCoeff = 0.33;
if (!model->BSIM3bulkJctGateSideGradingCoeffGiven) if (!model->BSIM3bulkJctGateSideGradingCoeffGiven)
model->BSIM3bulkJctGateSideGradingCoeff = model->BSIM3bulkJctSideGradingCoeff; model->BSIM3bulkJctGateSideGradingCoeff =
model->BSIM3bulkJctSideGradingCoeff;
if (!model->BSIM3jctEmissionCoeffGiven) if (!model->BSIM3jctEmissionCoeffGiven)
model->BSIM3jctEmissionCoeff = 1.0; model->BSIM3jctEmissionCoeff = 1.0;
if (!model->BSIM3jctTempExponentGiven) if (!model->BSIM3jctTempExponentGiven)
model->BSIM3jctTempExponent = 3.0; model->BSIM3jctTempExponent = 3.0;
if (!model->BSIM3oxideTrapDensityAGiven) if (!model->BSIM3oxideTrapDensityAGiven)
{ if (model->BSIM3type == NMOS) {
if (model->BSIM3type == NMOS)
model->BSIM3oxideTrapDensityA = 1e20; model->BSIM3oxideTrapDensityA = 1e20;
else else
model->BSIM3oxideTrapDensityA = 9.9e18; model->BSIM3oxideTrapDensityA = 9.9e18;
} }
if (!model->BSIM3oxideTrapDensityBGiven) if (!model->BSIM3oxideTrapDensityBGiven)
{ if (model->BSIM3type == NMOS) {
if (model->BSIM3type == NMOS)
model->BSIM3oxideTrapDensityB = 5e4; model->BSIM3oxideTrapDensityB = 5e4;
else else
model->BSIM3oxideTrapDensityB = 2.4e3; model->BSIM3oxideTrapDensityB = 2.4e3;
} }
if (!model->BSIM3oxideTrapDensityCGiven) if (!model->BSIM3oxideTrapDensityCGiven)
{ if (model->BSIM3type == NMOS) {
if (model->BSIM3type == NMOS)
model->BSIM3oxideTrapDensityC = -1.4e-12; model->BSIM3oxideTrapDensityC = -1.4e-12;
else else
model->BSIM3oxideTrapDensityC = 1.4e-12; model->BSIM3oxideTrapDensityC = 1.4e-12;
@ -848,7 +859,8 @@ CKTnode *tmp;
for (here = model->BSIM3instances; here != NULL; for (here = model->BSIM3instances; here != NULL;
here = here->BSIM3nextInstance) here = here->BSIM3nextInstance)
{ {
if (here->BSIM3owner == ARCHme) { if (here->BSIM3owner == ARCHme)
{
/* allocate a chunk of the state vector */ /* allocate a chunk of the state vector */
here->BSIM3states = *states; here->BSIM3states = *states;
@ -886,18 +898,21 @@ CKTnode *tmp;
/* process drain series resistance */ /* process drain series resistance */
if ((model->BSIM3sheetResistance > 0.0) && if ((model->BSIM3sheetResistance > 0.0) &&
(here->BSIM3drainSquares > 0.0 ) && (here->BSIM3drainSquares > 0.0) && (here->BSIM3dNodePrime == 0))
(here->BSIM3dNodePrime == 0))
{ {
error = CKTmkVolt (ckt, &tmp, here->BSIM3name, "drain"); error = CKTmkVolt (ckt, &tmp, here->BSIM3name, "drain");
if(error) return(error); if (error)
return (error);
here->BSIM3dNodePrime = tmp->number; here->BSIM3dNodePrime = tmp->number;
if (ckt->CKTcopyNodesets) { if (ckt->CKTcopyNodesets)
{
CKTnode *tmpNode; CKTnode *tmpNode;
IFuid tmpName; IFuid tmpName;
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { if (CKTinst2Node (ckt, here, 1, &tmpNode, &tmpName) == OK)
if (tmpNode->nsGiven) { {
if (tmpNode->nsGiven)
{
tmp->nodeset = tmpNode->nodeset; tmp->nodeset = tmpNode->nodeset;
tmp->nsGiven = tmpNode->nsGiven; tmp->nsGiven = tmpNode->nsGiven;
} }
@ -905,22 +920,28 @@ CKTnode *tmp;
} }
} }
else else
{ here->BSIM3dNodePrime = here->BSIM3dNode; {
here->BSIM3dNodePrime = here->BSIM3dNode;
} }
/* process source series resistance */ /* process source series resistance */
if ((model->BSIM3sheetResistance > 0.0) && if ((model->BSIM3sheetResistance > 0.0) &&
(here->BSIM3sourceSquares > 0.0) && (here->BSIM3sourceSquares > 0.0) &&
(here->BSIM3sNodePrime == 0)) (here->BSIM3sNodePrime == 0))
{ error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"source"); {
if(error) return(error); error = CKTmkVolt (ckt, &tmp, here->BSIM3name, "source");
if (error)
return (error);
here->BSIM3sNodePrime = tmp->number; here->BSIM3sNodePrime = tmp->number;
if (ckt->CKTcopyNodesets) { if (ckt->CKTcopyNodesets)
{
CKTnode *tmpNode; CKTnode *tmpNode;
IFuid tmpName; IFuid tmpName;
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { if (CKTinst2Node (ckt, here, 3, &tmpNode, &tmpName) == OK)
if (tmpNode->nsGiven) { {
if (tmpNode->nsGiven)
{
tmp->nodeset = tmpNode->nodeset; tmp->nodeset = tmpNode->nodeset;
tmp->nsGiven = tmpNode->nsGiven; tmp->nsGiven = tmpNode->nsGiven;
} }
@ -928,18 +949,22 @@ CKTnode *tmp;
} }
} }
else else
{ here->BSIM3sNodePrime = here->BSIM3sNode; {
here->BSIM3sNodePrime = here->BSIM3sNode;
} }
/* internal charge node */ /* internal charge node */
if ((here->BSIM3nqsMod) && (here->BSIM3qNode == 0)) if ((here->BSIM3nqsMod) && (here->BSIM3qNode == 0))
{ error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"charge"); {
if(error) return(error); error = CKTmkVolt (ckt, &tmp, here->BSIM3name, "charge");
if (error)
return (error);
here->BSIM3qNode = tmp->number; here->BSIM3qNode = tmp->number;
} }
else else
{ here->BSIM3qNode = 0; {
here->BSIM3qNode = 0;
} }
/* set Sparse Matrix Pointers */ /* set Sparse Matrix Pointers */
@ -972,9 +997,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
TSTALLOC (BSIM3DPbPtr, BSIM3dNodePrime, BSIM3bNode) TSTALLOC (BSIM3DPbPtr, BSIM3dNodePrime, BSIM3bNode)
TSTALLOC (BSIM3SPbPtr, BSIM3sNodePrime, BSIM3bNode) TSTALLOC (BSIM3SPbPtr, BSIM3sNodePrime, BSIM3bNode)
TSTALLOC (BSIM3SPdpPtr, BSIM3sNodePrime, BSIM3dNodePrime) TSTALLOC (BSIM3SPdpPtr, BSIM3sNodePrime, BSIM3dNodePrime)
TSTALLOC (BSIM3QqPtr, BSIM3qNode, BSIM3qNode) TSTALLOC (BSIM3QqPtr, BSIM3qNode, BSIM3qNode)
TSTALLOC (BSIM3QdpPtr, BSIM3qNode, BSIM3dNodePrime) TSTALLOC (BSIM3QdpPtr, BSIM3qNode, BSIM3dNodePrime)
TSTALLOC (BSIM3QspPtr, BSIM3qNode, BSIM3sNodePrime) TSTALLOC (BSIM3QspPtr, BSIM3qNode, BSIM3sNodePrime)
TSTALLOC (BSIM3QgPtr, BSIM3qNode, BSIM3gNode) TSTALLOC (BSIM3QgPtr, BSIM3qNode, BSIM3gNode)
@ -982,9 +1005,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
TSTALLOC (BSIM3DPqPtr, BSIM3dNodePrime, BSIM3qNode) TSTALLOC (BSIM3DPqPtr, BSIM3dNodePrime, BSIM3qNode)
TSTALLOC (BSIM3SPqPtr, BSIM3sNodePrime, BSIM3qNode) TSTALLOC (BSIM3SPqPtr, BSIM3sNodePrime, BSIM3qNode)
TSTALLOC (BSIM3GqPtr, BSIM3gNode, BSIM3qNode) TSTALLOC (BSIM3GqPtr, BSIM3gNode, BSIM3qNode)
TSTALLOC(BSIM3BqPtr, BSIM3bNode, BSIM3qNode) TSTALLOC (BSIM3BqPtr, BSIM3bNode, BSIM3qNode)}
}
} }
return (OK); return (OK);
} }
@ -1021,4 +1042,3 @@ BSIM3unsetup(inModel,ckt)
} }
return OK; return OK;
} }