diff --git a/src/spicelib/devices/vdmos/vdmos.c b/src/spicelib/devices/vdmos/vdmos.c index a4c634e5d..22bb4d783 100644 --- a/src/spicelib/devices/vdmos/vdmos.c +++ b/src/spicelib/devices/vdmos/vdmos.c @@ -107,6 +107,12 @@ IFparm VDMOSmPTable[] = { /* model parameters */ Xti Body diode saturation current temperature exponent */ + /* gate-source and gate-drain capacitances */ + IOPA("cgdmin", VDMOS_MOD_CGDMIN, IF_REAL, "Minimum non-linear G-D capacitance"), + IOPA("cgdmax", VDMOS_MOD_CGDMAX, IF_REAL, "Maximum non-linear G-D capacitance"), + IOPA("a", VDMOS_MOD_A, IF_REAL, "Non-linear Cgd capacitance parameter"), + IOPA("cgs", VDMOS_MOD_CGS, IF_REAL, "Gate-source capacitance"), + IOP("tnom", VDMOS_MOD_TNOM, IF_REAL, "Parameter measurement temperature"), IOP("kf", VDMOS_MOD_KF, IF_REAL, "Flicker noise coefficient"), IOP("af", VDMOS_MOD_AF, IF_REAL, "Flicker noise exponent"), diff --git a/src/spicelib/devices/vdmos/vdmosdefs.h b/src/spicelib/devices/vdmos/vdmosdefs.h index 5ebca172d..ef727fa13 100644 --- a/src/spicelib/devices/vdmos/vdmosdefs.h +++ b/src/spicelib/devices/vdmos/vdmosdefs.h @@ -309,6 +309,10 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */ double VDMOSsurfaceMobility; /* input - use tSurfMob */ double VDMOSfNcoef; double VDMOSfNexp; + double VDMOScgdmin; + double VDMOScgdmax; + double VDMOSa; + double VDMOScgs; unsigned VDMOStypeGiven :1; unsigned VDMOSlatDiffGiven :1; @@ -342,6 +346,11 @@ typedef struct sVDMOSmodel { /* model structure for a resistor */ unsigned VDMOSfNcoefGiven :1; unsigned VDMOSfNexpGiven :1; + unsigned VDMOScgdminGiven :1; + unsigned VDMOScgdmaxGiven :1; + unsigned VDMOScgsGiven :1; + unsigned VDMOSaGiven :1; + } VDMOSmodel; #ifndef NMOS @@ -409,6 +418,10 @@ enum { VDMOS_MOD_AF, VDMOS_MOD_TYPE, VDMOS_MOD_DMOS, + VDMOS_MOD_CGDMIN, + VDMOS_MOD_CGDMAX, + VDMOS_MOD_A, + VDMOS_MOD_CGS, }; /* device questions */ diff --git a/src/spicelib/devices/vdmos/vdmosmask.c b/src/spicelib/devices/vdmos/vdmosmask.c index 071e47551..d877dea7c 100644 --- a/src/spicelib/devices/vdmos/vdmosmask.c +++ b/src/spicelib/devices/vdmos/vdmosmask.c @@ -54,9 +54,21 @@ VDMOSmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) else value->sValue = "vdmosp"; return(OK); + case VDMOS_MOD_CGDMIN: + value->rValue = model->VDMOScgdmin; + return(OK); case VDMOS_MOD_CBS: value->rValue = model->VDMOScapBS; return(OK); + case VDMOS_MOD_CGDMAX: + value->rValue = model->VDMOScgdmax; + return(OK); + case VDMOS_MOD_A: + value->rValue = model->VDMOSa; + return(OK); + case VDMOS_MOD_CGS: + value->rValue = model->VDMOScgs; + return(OK); case VDMOS_MOD_IS: value->rValue = model->VDMOSjctSatCur; return(OK); diff --git a/src/spicelib/devices/vdmos/vdmosmpar.c b/src/spicelib/devices/vdmos/vdmosmpar.c index 44636c293..e1b3a84e1 100644 --- a/src/spicelib/devices/vdmos/vdmosmpar.c +++ b/src/spicelib/devices/vdmos/vdmosmpar.c @@ -153,6 +153,22 @@ VDMOSmParam(int param, IFvalue *value, GENmodel *inModel) model->VDMOStypeGiven = TRUE; } break; + case VDMOS_MOD_CGDMIN: + model->VDMOScgdmin = value->rValue; + model->VDMOScgdminGiven = TRUE; + break; + case VDMOS_MOD_CGDMAX: + model->VDMOScgdmax = value->rValue; + model->VDMOScgdmaxGiven = TRUE; + break; + case VDMOS_MOD_A: + model->VDMOSa = value->rValue; + model->VDMOSaGiven = TRUE; + break; + case VDMOS_MOD_CGS: + model->VDMOScgs = value->rValue; + model->VDMOScgsGiven = TRUE; + break; default: return(E_BADPARM); } diff --git a/src/spicelib/devices/vdmos/vdmosset.c b/src/spicelib/devices/vdmos/vdmosset.c index f6d3e5600..99e62f679 100644 --- a/src/spicelib/devices/vdmos/vdmosset.c +++ b/src/spicelib/devices/vdmos/vdmosset.c @@ -87,6 +87,18 @@ VDMOSsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, if(!model->VDMOSfNexpGiven) { model->VDMOSfNexp = 1; } + if (!model->VDMOScgdminGiven) { + model->VDMOScgdmin = 0; + } + if (!model->VDMOScgdmaxGiven) { + model->VDMOScgdmax = 0; + } + if (!model->VDMOScgsGiven) { + model->VDMOScgs = 0; + } + if (!model->VDMOSaGiven) { + model->VDMOSa = 1.; + } /* loop through all the instances of the model */ for (here = VDMOSinstances(model); here != NULL ;