Removed a bug in the model that caused different results in repeated analyses.
This commit is contained in:
parent
7ec1d5d3d1
commit
ef0b33fdde
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue