Correct scaling for area and pj geometry scaled diode (level=3)

This commit is contained in:
dwarning 2021-04-05 12:20:53 +02:00 committed by Holger Vogt
parent a7cf70e615
commit 8a04d049ab
2 changed files with 16 additions and 15 deletions

View File

@ -19,15 +19,10 @@ Modified by Paolo Nenzi 2003 and Dietmar Warning 2012
int
DIOparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
{
double scale;
DIOinstance *here = (DIOinstance*)inst;
NG_IGNORE(select);
if (!cp_getvar("scale", CP_REAL, &scale, 0))
scale = 1;
switch(param) {
case DIO_AREA:
here->DIOarea = value->rValue;
@ -38,11 +33,11 @@ DIOparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
here->DIOpjGiven = TRUE;
break;
case DIO_W:
here->DIOw = value->rValue * scale;
here->DIOw = value->rValue;
here->DIOwGiven = TRUE;
break;
case DIO_L:
here->DIOl = value->rValue * scale;
here->DIOl = value->rValue;
here->DIOlGiven = TRUE;
break;
case DIO_M:
@ -69,19 +64,19 @@ DIOparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
break;
case DIO_LM:
here->DIOlengthMetal = value->rValue * scale;
here->DIOlengthMetal = value->rValue;
here->DIOlengthMetalGiven = TRUE;
break;
case DIO_LP:
here->DIOlengthPoly = value->rValue * scale;
here->DIOlengthPoly = value->rValue;
here->DIOlengthPolyGiven = TRUE;
break;
case DIO_WM:
here->DIOwidthMetal = value->rValue * scale;
here->DIOwidthMetal = value->rValue;
here->DIOwidthMetalGiven = TRUE;
break;
case DIO_WP:
here->DIOwidthPoly = value->rValue * scale;
here->DIOwidthPoly = value->rValue;
here->DIOwidthPolyGiven = TRUE;
break;

View File

@ -24,6 +24,10 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
DIOinstance *here;
int error;
CKTnode *tmp;
double scale;
if (!cp_getvar("scale", CP_REAL, &scale, 0))
scale = 1;
/* loop through all the diode models */
for( ; model != NULL; model = DIOnextModel(model)) {
@ -224,6 +228,8 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
here->DIOarea = here->DIOw * here->DIOl * here->DIOm;
here->DIOpj = (2 * here->DIOw + 2 * here->DIOl) * here->DIOm;
}
here->DIOarea = here->DIOarea * scale * scale;
here->DIOpj = here->DIOpj * scale;
if (here->DIOwidthMetalGiven)
wm = here->DIOwidthMetal;
else
@ -241,11 +247,11 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
else
lp = model->DIOlengthPoly;
here->DIOcmetal = CONSTepsSiO2 / model->DIOmetalOxideThick * here->DIOm
* (wm + model->DIOmetalMaskOffset)
* (lm + model->DIOmetalMaskOffset);
* (wm * scale + model->DIOmetalMaskOffset)
* (lm * scale + model->DIOmetalMaskOffset);
here->DIOcpoly = CONSTepsSiO2 / model->DIOpolyOxideThick * here->DIOm
* (wp + model->DIOpolyMaskOffset)
* (lp + model->DIOpolyMaskOffset);
* (wp * scale + model->DIOpolyMaskOffset)
* (lp * scale + model->DIOpolyMaskOffset);
}
here->DIOforwardKneeCurrent = model->DIOforwardKneeCurrent * here->DIOarea;
here->DIOreverseKneeCurrent = model->DIOreverseKneeCurrent * here->DIOarea;