Correct scaling for area and pj geometry scaled diode (level=3)
This commit is contained in:
parent
a7cf70e615
commit
8a04d049ab
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue