From f9b66af074089da04470a39ebbf726fca354f728 Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Mon, 9 Apr 2018 23:12:32 +0200 Subject: [PATCH] add the mtriode parameter scale the triode region independently from saturation current --- src/spicelib/devices/vdmos/vdmos.c | 1 + src/spicelib/devices/vdmos/vdmosdefs.h | 3 +++ src/spicelib/devices/vdmos/vdmosload.c | 16 +++++++++------- src/spicelib/devices/vdmos/vdmosmask.c | 3 +++ src/spicelib/devices/vdmos/vdmosmpar.c | 4 ++++ src/spicelib/devices/vdmos/vdmosset.c | 3 +++ 6 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/spicelib/devices/vdmos/vdmos.c b/src/spicelib/devices/vdmos/vdmos.c index 76d68f391..4b053c4ff 100644 --- a/src/spicelib/devices/vdmos/vdmos.c +++ b/src/spicelib/devices/vdmos/vdmos.c @@ -91,6 +91,7 @@ IFparm VDMOSmPTable[] = { /* model parameters */ IOP("rd", VDMOS_MOD_RD, IF_REAL, "Drain ohmic resistance"), IOP("rs", VDMOS_MOD_RS, IF_REAL, "Source ohmic resistance"), IOP("rg", VDMOS_MOD_RG, IF_REAL, "Gate ohmic resistance"), + IOP("mtriode", VDMOS_MOD_MTRIODE, IF_REAL, "Conductance multiplier in triode region"), /* 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 b9fdfee5a..451b13803 100644 --- a/src/spicelib/devices/vdmos/vdmosdefs.h +++ b/src/spicelib/devices/vdmos/vdmosdefs.h @@ -326,6 +326,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */ double VDMOScgdmax; double VDMOSa; double VDMOScgs; + double VDMOSmtr; /* bulk diode */ double VDIOjunctionCap; /* input - use tCj */ @@ -368,6 +369,7 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */ unsigned VDMOScgdmaxGiven :1; unsigned VDMOScgsGiven :1; unsigned VDMOSaGiven :1; + unsigned VDMOSmtrGiven :1; unsigned VDMOSDbvGiven :1; unsigned VDMOSDibvGiven :1; @@ -431,6 +433,7 @@ enum { VDMOS_MOD_A, VDMOS_MOD_CGS, VDMOS_MOD_RB, + VDMOS_MOD_MTRIODE, 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 34bf7e832..1b1fd3e9e 100644 --- a/src/spicelib/devices/vdmos/vdmosload.c +++ b/src/spicelib/devices/vdmos/vdmosload.c @@ -403,8 +403,10 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt) /* * saturation region */ + /* scale vds with mtr */ + double mtr = model->VDMOSmtr; betap = Beta*(1 + model->VDMOSlambda*(vds*here->VDMOSmode)); - if (vgst <= (vds * here->VDMOSmode)) { + if (vgst <= (vds * here->VDMOSmode) * mtr) { cdrain = betap*vgst*vgst*.5; here->VDMOSgm = betap*vgst; here->VDMOSgds = model->VDMOSlambda*Beta*vgst*vgst*.5; @@ -413,13 +415,13 @@ VDMOSload(GENmodel *inModel, CKTcircuit *ckt) /* * linear region */ - cdrain = betap * (vds * here->VDMOSmode) * - (vgst - .5 * (vds * here->VDMOSmode)); - here->VDMOSgm = betap * (vds * here->VDMOSmode); - here->VDMOSgds = betap * (vgst - (vds * here->VDMOSmode)) + + cdrain = betap * (vds * here->VDMOSmode) * mtr * + (vgst - .5 * (vds*here->VDMOSmode) * mtr); + here->VDMOSgm = betap * (vds * here->VDMOSmode) * mtr; + here->VDMOSgds = betap * (vgst - (vds * here->VDMOSmode) * mtr) + model->VDMOSlambda * Beta * - (vds * here->VDMOSmode) * - (vgst - .5 * (vds * here->VDMOSmode)); + (vds * here->VDMOSmode) * mtr * + (vgst - .5 * (vds * here->VDMOSmode) * mtr); here->VDMOSgmbs = here->VDMOSgm * arg; } } diff --git a/src/spicelib/devices/vdmos/vdmosmask.c b/src/spicelib/devices/vdmos/vdmosmask.c index d3f32909a..eedb0b01d 100644 --- a/src/spicelib/devices/vdmos/vdmosmask.c +++ b/src/spicelib/devices/vdmos/vdmosmask.c @@ -45,6 +45,9 @@ VDMOSmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case VDMOS_MOD_RG: value->rValue = model->VDMOSgateResistance; return(OK); + case VDMOS_MOD_MTRIODE: + value->rValue = model->VDMOSmtr; + 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 0da011b00..b77610214 100644 --- a/src/spicelib/devices/vdmos/vdmosmpar.c +++ b/src/spicelib/devices/vdmos/vdmosmpar.c @@ -117,6 +117,10 @@ VDMOSmParam(int param, IFvalue *value, GENmodel *inModel) model->VDMOScgs = value->rValue; model->VDMOScgsGiven = TRUE; break; + case VDMOS_MOD_MTRIODE: + model->VDMOSmtr = value->rValue; + model->VDMOSmtrGiven = 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 75c5902c3..145c7772f 100644 --- a/src/spicelib/devices/vdmos/vdmosset.c +++ b/src/spicelib/devices/vdmos/vdmosset.c @@ -72,6 +72,9 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, if (!model->VDMOSaGiven) { model->VDMOSa = 1.; } + if (!model->VDMOSmtrGiven) { + model->VDMOSmtr = 1.; + } if (!model->VDMOSDbvGiven) { model->VDMOSDbv = 1.0e30; }