diode: add model parameter xw for mask and etching effect (level=3)

This commit is contained in:
dwarning 2024-04-30 16:32:52 +02:00
parent ca8d150872
commit 20a04fccdd
5 changed files with 16 additions and 2 deletions

View File

@ -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")
};

View File

@ -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);

View File

@ -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);

View File

@ -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 */

View File

@ -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;