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( "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( "xw", DIO_MOD_XW, IF_REAL, "Masking and etching effects (level=3)"),
|
||||
|
||||
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 DIOmetalMaskOffsetGiven : 1; /* Masking and etching effects in metal (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 */
|
||||
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 DIOmetalMaskOffset; /* Masking and etching effects in metal (level=3)") */
|
||||
double DIOpolyMaskOffset; /* Masking and etching effects in polysilicon (level=3) */
|
||||
double DIOmaskOffset; /* Masking and etching effects (level=3) */
|
||||
|
||||
} DIOmodel;
|
||||
|
||||
|
|
@ -474,6 +476,7 @@ enum {
|
|||
DIO_MOD_XOI,
|
||||
DIO_MOD_XM,
|
||||
DIO_MOD_XP,
|
||||
DIO_MOD_XW,
|
||||
};
|
||||
|
||||
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:
|
||||
value->rValue = model->DIOpolyMaskOffset;
|
||||
return(OK);
|
||||
case DIO_MOD_XW:
|
||||
value->rValue = model->DIOmaskOffset;
|
||||
return(OK);
|
||||
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
|
|
|
|||
|
|
@ -270,6 +270,10 @@ DIOmParam(int param, IFvalue *value, GENmodel *inModel)
|
|||
model->DIOpolyMaskOffset = value->rValue;
|
||||
model->DIOpolyMaskOffsetGiven = TRUE;
|
||||
break;
|
||||
case DIO_MOD_XW:
|
||||
model->DIOmaskOffset = value->rValue;
|
||||
model->DIOmaskOffsetGiven = TRUE;
|
||||
break;
|
||||
|
||||
case DIO_MOD_D:
|
||||
/* 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) {
|
||||
model->DIOpolyMaskOffset = 0.0;
|
||||
}
|
||||
if(!model->DIOmaskOffsetGiven) {
|
||||
model->DIOmaskOffset = 0.0;
|
||||
}
|
||||
|
||||
/* loop through all the instances of the model */
|
||||
for (here = DIOinstances(model); here != NULL ;
|
||||
|
|
@ -273,8 +276,8 @@ DIOsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
|||
if (model->DIOlevel == 3) {
|
||||
double wm, lm, wp, lp;
|
||||
if((here->DIOwGiven) && (here->DIOlGiven)) {
|
||||
here->DIOarea = here->DIOw * here->DIOl * here->DIOm;
|
||||
here->DIOpj = (2 * here->DIOw + 2 * here->DIOl) * here->DIOm;
|
||||
here->DIOarea = (here->DIOw+model->DIOmaskOffset) * (here->DIOl+model->DIOmaskOffset) * here->DIOm;
|
||||
here->DIOpj = (2 * (here->DIOw+model->DIOmaskOffset) + 2 * (here->DIOl+model->DIOmaskOffset)) * here->DIOm;
|
||||
}
|
||||
here->DIOarea = here->DIOarea * scale * scale;
|
||||
here->DIOpj = here->DIOpj * scale;
|
||||
|
|
|
|||
Loading…
Reference in New Issue