diff --git a/src/spicelib/devices/dio/dioparam.c b/src/spicelib/devices/dio/dioparam.c index be0d81c18..f6fb0a736 100644 --- a/src/spicelib/devices/dio/dioparam.c +++ b/src/spicelib/devices/dio/dioparam.c @@ -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; diff --git a/src/spicelib/devices/dio/diosetup.c b/src/spicelib/devices/dio/diosetup.c index a9a518802..252c2f80d 100644 --- a/src/spicelib/devices/dio/diosetup.c +++ b/src/spicelib/devices/dio/diosetup.c @@ -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;