From 20a04fccddacfb6701a531013326dd79972e4ad4 Mon Sep 17 00:00:00 2001 From: dwarning Date: Tue, 30 Apr 2024 16:32:52 +0200 Subject: [PATCH] diode: add model parameter xw for mask and etching effect (level=3) --- src/spicelib/devices/dio/dio.c | 1 + src/spicelib/devices/dio/diodefs.h | 3 +++ src/spicelib/devices/dio/diomask.c | 3 +++ src/spicelib/devices/dio/diompar.c | 4 ++++ src/spicelib/devices/dio/diosetup.c | 7 +++++-- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/spicelib/devices/dio/dio.c b/src/spicelib/devices/dio/dio.c index b26ec58fe..03a8a656a 100644 --- a/src/spicelib/devices/dio/dio.c +++ b/src/spicelib/devices/dio/dio.c @@ -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") }; diff --git a/src/spicelib/devices/dio/diodefs.h b/src/spicelib/devices/dio/diodefs.h index bb0e102dc..5fc3c2cf9 100644 --- a/src/spicelib/devices/dio/diodefs.h +++ b/src/spicelib/devices/dio/diodefs.h @@ -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); diff --git a/src/spicelib/devices/dio/diomask.c b/src/spicelib/devices/dio/diomask.c index cb9da53f8..a62a63a9e 100644 --- a/src/spicelib/devices/dio/diomask.c +++ b/src/spicelib/devices/dio/diomask.c @@ -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); diff --git a/src/spicelib/devices/dio/diompar.c b/src/spicelib/devices/dio/diompar.c index b24aa10d3..3ea68c356 100644 --- a/src/spicelib/devices/dio/diompar.c +++ b/src/spicelib/devices/dio/diompar.c @@ -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 */ diff --git a/src/spicelib/devices/dio/diosetup.c b/src/spicelib/devices/dio/diosetup.c index 2c549e03d..86c4aea2b 100644 --- a/src/spicelib/devices/dio/diosetup.c +++ b/src/spicelib/devices/dio/diosetup.c @@ -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;