introduce parameter ksubthres, compatible to LTSPICE
This commit is contained in:
parent
a0867ff1a3
commit
93e34540b8
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue