diff --git a/src/spicelib/devices/vdmos/vdmos.c b/src/spicelib/devices/vdmos/vdmos.c index f394fc174..4492c11f1 100644 --- a/src/spicelib/devices/vdmos/vdmos.c +++ b/src/spicelib/devices/vdmos/vdmos.c @@ -87,6 +87,7 @@ IFparm VDMOSmPTable[] = { /* model parameters */ /* weak inversion */ IOP("subslope", VDMOS_MOD_SUBSLOPE, IF_REAL, "Slope of weak inversion log current versus vgs - vth"), IOP("subshift", VDMOS_MOD_SUBSHIFT, IF_REAL, "Shift of weak inversion plot on the vgs axis"), + IOP("ksubthres", VDMOS_MOD_KSUBTHRES, IF_REAL, "Shift of weak inversion plot on the vgs axis"), /* body diode */ IOP("bv", VDMOS_MOD_BV, IF_REAL, "Vds breakdown voltage"), diff --git a/src/spicelib/devices/vdmos/vdmosdefs.h b/src/spicelib/devices/vdmos/vdmosdefs.h index 63f5d0512..a37143cfc 100644 --- a/src/spicelib/devices/vdmos/vdmosdefs.h +++ b/src/spicelib/devices/vdmos/vdmosdefs.h @@ -334,6 +334,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */ double VDMOScgs; double VDMOSsubsl; double VDMOSsubshift; + double VDMOSksubthres; double VDMOSmtr; /* bulk diode */ @@ -383,6 +384,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */ unsigned VDMOSaGiven :1; unsigned VDMOSsubslGiven :1; unsigned VDMOSsubshiftGiven :1; + unsigned VDMOSksubthresGiven :1; unsigned VDMOSmtrGiven :1; unsigned VDMOSDbvGiven :1; @@ -452,6 +454,7 @@ enum { VDMOS_MOD_MTRIODE, VDMOS_MOD_SUBSLOPE, VDMOS_MOD_SUBSHIFT, + VDMOS_MOD_KSUBTHRES, VDMOS_MOD_BV, VDMOS_MOD_IBV, VDMOS_MOD_NBV, diff --git a/src/spicelib/devices/vdmos/vdmosload.c b/src/spicelib/devices/vdmos/vdmosload.c index a14932b3c..e61872736 100644 --- a/src/spicelib/devices/vdmos/vdmosload.c +++ b/src/spicelib/devices/vdmos/vdmosload.c @@ -367,7 +367,29 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt) arg = 0; /* drain current including subthreshold current * numerical differentiation for gd and gm with a delta of 2 mV */ - if (model->VDMOSsubslGiven && (here->VDMOSmode == 1)) { + if (model->VDMOSksubthresGiven && (here->VDMOSmode == 1)) { + double delta = 0.001; + cdrain = cweakinv(model->VDMOSksubthres, model->VDMOSsubshift, vgst, vds, model->VDMOSlambda, + Beta, vt, model->VDMOSmtr); + /* gd */ + double vds1 = vds + delta; + double cdrp = cweakinv(model->VDMOSksubthres, model->VDMOSsubshift, vgst, vds1, model->VDMOSlambda, + Beta, vt, model->VDMOSmtr); + vds1 = vds - delta; + double cdrm = cweakinv(model->VDMOSksubthres, model->VDMOSsubshift, vgst, vds1, model->VDMOSlambda, + Beta, vt, model->VDMOSmtr); + here->VDMOSgds = (cdrp - cdrm) / (2. * delta); + /* gm */ + double vgst1 = vgst + delta; + cdrp = cweakinv(model->VDMOSksubthres, model->VDMOSsubshift, vgst1, vds, model->VDMOSlambda, + Beta, vt, model->VDMOSmtr); + vgst1 = vgst - delta; + cdrm = cweakinv(model->VDMOSksubthres, model->VDMOSsubshift, vgst1, vds, model->VDMOSlambda, + Beta, vt, model->VDMOSmtr); + here->VDMOSgm = (cdrp - cdrm) / (2. * delta); + here->VDMOSgmbs = 0.; + } + else if (model->VDMOSsubslGiven && (here->VDMOSmode == 1)) { double delta = 0.001; cdrain = cweakinv(model->VDMOSsubsl, model->VDMOSsubshift, vgst, vds, model->VDMOSlambda, Beta, vt, model->VDMOSmtr); diff --git a/src/spicelib/devices/vdmos/vdmosmask.c b/src/spicelib/devices/vdmos/vdmosmask.c index 110aebe94..c45edd65e 100644 --- a/src/spicelib/devices/vdmos/vdmosmask.c +++ b/src/spicelib/devices/vdmos/vdmosmask.c @@ -60,6 +60,9 @@ VDMOSmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case VDMOS_MOD_SUBSHIFT: value->rValue = model->VDMOSsubshift; return(OK); + case VDMOS_MOD_KSUBTHRES: + value->rValue = model->VDMOSksubthres; + return(OK); case VDMOS_MOD_TYPE: if (model->VDMOStype > 0) value->sValue = "vdmosn"; diff --git a/src/spicelib/devices/vdmos/vdmosmpar.c b/src/spicelib/devices/vdmos/vdmosmpar.c index 3d9c46d57..e44d4f730 100644 --- a/src/spicelib/devices/vdmos/vdmosmpar.c +++ b/src/spicelib/devices/vdmos/vdmosmpar.c @@ -141,6 +141,10 @@ VDMOSmParam(int param, IFvalue *value, GENmodel *inModel) model->VDMOSsubshift = value->rValue; model->VDMOSsubshiftGiven = TRUE; break; + case VDMOS_MOD_KSUBTHRES: + model->VDMOSksubthres = value->rValue; + model->VDMOSksubthresGiven = TRUE; + break; case VDMOS_MOD_BV: model->VDMOSDbv = value->rValue; model->VDMOSDbvGiven = TRUE; diff --git a/src/spicelib/devices/vdmos/vdmosset.c b/src/spicelib/devices/vdmos/vdmosset.c index 2e520bd6c..60b1954ef 100644 --- a/src/spicelib/devices/vdmos/vdmosset.c +++ b/src/spicelib/devices/vdmos/vdmosset.c @@ -78,6 +78,9 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, if (!model->VDMOSsubshiftGiven) { model->VDMOSsubshift = 0; } + if (!model->VDMOSksubthresGiven) { + model->VDMOSksubthres = 0; + } if (!model->VDMOSmtrGiven) { model->VDMOSmtr = 1.; }