Browse Source

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

pre-master-46
dwarning 5 years ago
committed by Holger Vogt
parent
commit
8a04d049ab
  1. 17
      src/spicelib/devices/dio/dioparam.c
  2. 14
      src/spicelib/devices/dio/diosetup.c

17
src/spicelib/devices/dio/dioparam.c

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

14
src/spicelib/devices/dio/diosetup.c

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

Loading…
Cancel
Save