diode: add model parameter xw for mask and etching effect (level=3)
This commit is contained in:
parent
ca8d150872
commit
20a04fccdd
|
|
@ -133,6 +133,7 @@ IFparm DIOmPTable[] = { /* model parameters */
|
||||||
IOP( "xoi", DIO_MOD_XOI, IF_REAL, "Thickness of the polysilicon to bulk oxide (level=3)"),
|
IOP( "xoi", DIO_MOD_XOI, IF_REAL, "Thickness of the polysilicon to bulk oxide (level=3)"),
|
||||||
IOP( "xm", DIO_MOD_XM, IF_REAL, "Masking and etching effects in metal (level=3)"),
|
IOP( "xm", DIO_MOD_XM, IF_REAL, "Masking and etching effects in metal (level=3)"),
|
||||||
IOP( "xp", DIO_MOD_XP, IF_REAL, "Masking and etching effects in polysilicon (level=3)"),
|
IOP( "xp", DIO_MOD_XP, IF_REAL, "Masking and etching effects in polysilicon (level=3)"),
|
||||||
|
IOP( "xw", DIO_MOD_XW, IF_REAL, "Masking and etching effects (level=3)"),
|
||||||
|
|
||||||
IP( "d", DIO_MOD_D, IF_FLAG, "Diode model")
|
IP( "d", DIO_MOD_D, IF_FLAG, "Diode model")
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -302,6 +302,7 @@ typedef struct sDIOmodel { /* model structure for a diode */
|
||||||
unsigned DIOpolyOxideThickGiven : 1; /* Thickness of the polysilicon to bulk oxide (level=3) */
|
unsigned DIOpolyOxideThickGiven : 1; /* Thickness of the polysilicon to bulk oxide (level=3) */
|
||||||
unsigned DIOmetalMaskOffsetGiven : 1; /* Masking and etching effects in metal (level=3)") */
|
unsigned DIOmetalMaskOffsetGiven : 1; /* Masking and etching effects in metal (level=3)") */
|
||||||
unsigned DIOpolyMaskOffsetGiven : 1; /* Masking and etching effects in polysilicon (level=3) */
|
unsigned DIOpolyMaskOffsetGiven : 1; /* Masking and etching effects in polysilicon (level=3) */
|
||||||
|
unsigned DIOmaskOffsetGiven : 1; /* Masking and etching effects (level=3) */
|
||||||
|
|
||||||
int DIOlevel; /* level selector */
|
int DIOlevel; /* level selector */
|
||||||
double DIOsatCur; /* saturation current */
|
double DIOsatCur; /* saturation current */
|
||||||
|
|
@ -372,6 +373,7 @@ typedef struct sDIOmodel { /* model structure for a diode */
|
||||||
double DIOpolyOxideThick; /* Thickness of the polysilicon to bulk oxide (level=3) */
|
double DIOpolyOxideThick; /* Thickness of the polysilicon to bulk oxide (level=3) */
|
||||||
double DIOmetalMaskOffset; /* Masking and etching effects in metal (level=3)") */
|
double DIOmetalMaskOffset; /* Masking and etching effects in metal (level=3)") */
|
||||||
double DIOpolyMaskOffset; /* Masking and etching effects in polysilicon (level=3) */
|
double DIOpolyMaskOffset; /* Masking and etching effects in polysilicon (level=3) */
|
||||||
|
double DIOmaskOffset; /* Masking and etching effects (level=3) */
|
||||||
|
|
||||||
} DIOmodel;
|
} DIOmodel;
|
||||||
|
|
||||||
|
|
@ -474,6 +476,7 @@ enum {
|
||||||
DIO_MOD_XOI,
|
DIO_MOD_XOI,
|
||||||
DIO_MOD_XM,
|
DIO_MOD_XM,
|
||||||
DIO_MOD_XP,
|
DIO_MOD_XP,
|
||||||
|
DIO_MOD_XW,
|
||||||
};
|
};
|
||||||
|
|
||||||
void DIOtempUpdate(DIOmodel *inModel, DIOinstance *here, double Temp, CKTcircuit *ckt);
|
void DIOtempUpdate(DIOmodel *inModel, DIOinstance *here, double Temp, CKTcircuit *ckt);
|
||||||
|
|
|
||||||
|
|
@ -218,6 +218,9 @@ DIOmAsk (CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value)
|
||||||
case DIO_MOD_XP:
|
case DIO_MOD_XP:
|
||||||
value->rValue = model->DIOpolyMaskOffset;
|
value->rValue = model->DIOpolyMaskOffset;
|
||||||
return(OK);
|
return(OK);
|
||||||
|
case DIO_MOD_XW:
|
||||||
|
value->rValue = model->DIOmaskOffset;
|
||||||
|
return(OK);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return(E_BADPARM);
|
return(E_BADPARM);
|
||||||
|
|
|
||||||
|
|
@ -270,6 +270,10 @@ DIOmParam(int param, IFvalue *value, GENmodel *inModel)
|
||||||
model->DIOpolyMaskOffset = value->rValue;
|
model->DIOpolyMaskOffset = value->rValue;
|
||||||
model->DIOpolyMaskOffsetGiven = TRUE;
|
model->DIOpolyMaskOffsetGiven = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case DIO_MOD_XW:
|
||||||
|
model->DIOmaskOffset = value->rValue;
|
||||||
|
model->DIOmaskOffsetGiven = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
case DIO_MOD_D:
|
case DIO_MOD_D:
|
||||||
/* no action - we already know we are a diode, but this */
|
/* no action - we already know we are a diode, but this */
|
||||||
|
|
|
||||||
|
|
@ -243,6 +243,9 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
||||||
if(!model->DIOpolyMaskOffsetGiven) {
|
if(!model->DIOpolyMaskOffsetGiven) {
|
||||||
model->DIOpolyMaskOffset = 0.0;
|
model->DIOpolyMaskOffset = 0.0;
|
||||||
}
|
}
|
||||||
|
if(!model->DIOmaskOffsetGiven) {
|
||||||
|
model->DIOmaskOffset = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
/* loop through all the instances of the model */
|
/* loop through all the instances of the model */
|
||||||
for (here = DIOinstances(model); here != NULL ;
|
for (here = DIOinstances(model); here != NULL ;
|
||||||
|
|
@ -273,8 +276,8 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
||||||
if (model->DIOlevel == 3) {
|
if (model->DIOlevel == 3) {
|
||||||
double wm, lm, wp, lp;
|
double wm, lm, wp, lp;
|
||||||
if((here->DIOwGiven) && (here->DIOlGiven)) {
|
if((here->DIOwGiven) && (here->DIOlGiven)) {
|
||||||
here->DIOarea = here->DIOw * here->DIOl * here->DIOm;
|
here->DIOarea = (here->DIOw+model->DIOmaskOffset) * (here->DIOl+model->DIOmaskOffset) * here->DIOm;
|
||||||
here->DIOpj = (2 * here->DIOw + 2 * here->DIOl) * here->DIOm;
|
here->DIOpj = (2 * (here->DIOw+model->DIOmaskOffset) + 2 * (here->DIOl+model->DIOmaskOffset)) * here->DIOm;
|
||||||
}
|
}
|
||||||
here->DIOarea = here->DIOarea * scale * scale;
|
here->DIOarea = here->DIOarea * scale * scale;
|
||||||
here->DIOpj = here->DIOpj * scale;
|
here->DIOpj = here->DIOpj * scale;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue