diff --git a/src/spicelib/devices/jfet/jfet.c b/src/spicelib/devices/jfet/jfet.c index 2db17d4f7..29fc05982 100644 --- a/src/spicelib/devices/jfet/jfet.c +++ b/src/spicelib/devices/jfet/jfet.c @@ -67,10 +67,14 @@ IFparm JFETmPTable[] = { /* model parameters */ IOP("b", JFET_MOD_B, IF_REAL,"Doping tail parameter"), /* end Sydney University mod. */ IOPU("tnom", JFET_MOD_TNOM, IF_REAL,"parameter measurement temperature"), + IOP("tcv", JFET_MOD_TCV, IF_REAL, "Threshold voltage temperature coefficient"), + IOP("vtotc", JFET_MOD_VTOTC, IF_REAL, "Threshold voltage temperature coefficient alternative"), + IOP("bex", JFET_MOD_BEX, IF_REAL, "Mobility temperature exponent"), + IOP("betatce", JFET_MOD_BETATCE, IF_REAL, "Mobility temperature exponent alternative"), + IOP("xti", JFET_MOD_XTI, IF_REAL, "Gate junction saturation current temperature exponent"), + IOP("eg", JFET_MOD_EG, IF_REAL, "Bandgap voltage"), IOP("kf", JFET_MOD_KF, IF_REAL, "Flicker Noise Coefficient"), IOP("af", JFET_MOD_AF, IF_REAL, "Flicker Noise Exponent"), - IOP("tcv", JFET_MOD_TCV, IF_REAL, "Threshold voltage temperature coefficient"), - IOP("bex", JFET_MOD_BEX, IF_REAL, "Mobility temperature exponent"), IOP("nlev",JFET_MOD_NLEV, IF_INTEGER, "Noise equation selector"), IOP("gdsnoi", JFET_MOD_GDSNOI, IF_REAL, "Channel noise coefficient") }; diff --git a/src/spicelib/devices/jfet/jfetdefs.h b/src/spicelib/devices/jfet/jfetdefs.h index afa47b6b5..15ebe1882 100644 --- a/src/spicelib/devices/jfet/jfetdefs.h +++ b/src/spicelib/devices/jfet/jfetdefs.h @@ -207,9 +207,13 @@ typedef struct sJFETmodel { /* model structure for a jfet */ double JFETb; /* doping profile parameter */ double JFETbFac; /* internal derived doping profile parameter */ /* end Sydney University mod */ - double JFETtnom; /* temperature at which parameters were measured */ + double JFETtnom; /* temperature at which parameters were measured */ double JFETtcv; + double JFETvtotc; double JFETbex; + double JFETbetatce; + double JFETxti; + double JFETeg; unsigned JFETthresholdGiven : 1; unsigned JFETbetaGiven : 1; @@ -225,12 +229,16 @@ typedef struct sJFETmodel { /* model structure for a jfet */ unsigned JFETbGiven : 1; /* end Sydney University mod */ unsigned JFETtnomGiven : 1; /* user specified Tnom for model */ + unsigned JFETtcvGiven : 1; + unsigned JFETvtotcGiven : 1; + unsigned JFETbexGiven : 1; + unsigned JFETbetatceGiven : 1; + unsigned JFETxtiGiven : 1; + unsigned JFETegGiven : 1; unsigned JFETfNcoefGiven : 1; unsigned JFETfNexpGiven : 1; unsigned JFETnlevGiven : 1; unsigned JFETgdsnoiGiven : 1; - unsigned JFETtcvGiven : 1; - unsigned JFETbexGiven : 1; } JFETmodel; @@ -268,11 +276,15 @@ enum { JFET_MOD_NJF, JFET_MOD_PJF, JFET_MOD_TNOM, - JFET_MOD_KF, - JFET_MOD_AF, JFET_MOD_B, /* Modification for Sydney University JFET model */ JFET_MOD_TCV, + JFET_MOD_VTOTC, JFET_MOD_BEX, + JFET_MOD_BETATCE, + JFET_MOD_XTI, + JFET_MOD_EG, + JFET_MOD_KF, + JFET_MOD_AF, JFET_MOD_NLEV, JFET_MOD_GDSNOI, }; diff --git a/src/spicelib/devices/jfet/jfetmask.c b/src/spicelib/devices/jfet/jfetmask.c index 4c2084acc..cc18dbaf8 100644 --- a/src/spicelib/devices/jfet/jfetmask.c +++ b/src/spicelib/devices/jfet/jfetmask.c @@ -71,24 +71,36 @@ JFETmAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value) case JFET_MOD_SOURCECONDUCT: value->rValue = model->JFETsourceConduct; return(OK); - case JFET_MOD_KF: - value->rValue = model->JFETfNcoef; - return(OK); - case JFET_MOD_AF: - value->rValue = model->JFETfNexp; - return(OK); case JFET_MOD_TCV: value->rValue = model->JFETtcv; return(OK); + case JFET_MOD_VTOTC: + value->rValue = model->JFETvtotc; + return(OK); case JFET_MOD_BEX: value->rValue = model->JFETbex; return(OK); + case JFET_MOD_BETATCE: + value->rValue = model->JFETbetatce; + return(OK); + case JFET_MOD_XTI: + value->rValue = model->JFETxti; + return(OK); + case JFET_MOD_EG: + value->rValue = model->JFETeg; + return(OK); case JFET_MOD_TYPE: if (model->JFETtype == NJF) value->sValue = "njf"; else value->sValue = "pjf"; return(OK); + case JFET_MOD_KF: + value->rValue = model->JFETfNcoef; + return(OK); + case JFET_MOD_AF: + value->rValue = model->JFETfNexp; + return(OK); case JFET_MOD_NLEV: value->iValue = model->JFETnlev; return(OK); diff --git a/src/spicelib/devices/jfet/jfetmpar.c b/src/spicelib/devices/jfet/jfetmpar.c index 50f347d70..4eac5efe0 100644 --- a/src/spicelib/devices/jfet/jfetmpar.c +++ b/src/spicelib/devices/jfet/jfetmpar.c @@ -72,14 +72,6 @@ JFETmParam(int param, IFvalue *value, GENmodel *inModels) model->JFETtype = PJF; } break; - case JFET_MOD_KF: - model->JFETfNcoefGiven = TRUE; - model->JFETfNcoef = value->rValue; - break; - case JFET_MOD_AF: - model->JFETfNexpGiven = TRUE; - model->JFETfNexp = value->rValue; - break; /* Modification for Sydney University JFET model */ case JFET_MOD_B: model->JFETbGiven = TRUE; @@ -90,10 +82,34 @@ JFETmParam(int param, IFvalue *value, GENmodel *inModels) model->JFETtcvGiven = TRUE; model->JFETtcv = value->rValue; break; + case JFET_MOD_VTOTC: + model->JFETvtotcGiven = TRUE; + model->JFETvtotc = value->rValue; + break; + case JFET_MOD_BETATCE: + model->JFETbetatceGiven = TRUE; + model->JFETbetatce = value->rValue; + break; case JFET_MOD_BEX: model->JFETbexGiven = TRUE; model->JFETbex = value->rValue; break; + case JFET_MOD_XTI: + model->JFETxtiGiven = TRUE; + model->JFETxti = value->rValue; + break; + case JFET_MOD_EG: + model->JFETegGiven = TRUE; + model->JFETeg = value->rValue; + break; + case JFET_MOD_KF: + model->JFETfNcoefGiven = TRUE; + model->JFETfNcoef = value->rValue; + break; + case JFET_MOD_AF: + model->JFETfNexpGiven = TRUE; + model->JFETfNexp = value->rValue; + break; case JFET_MOD_NLEV: model->JFETnlevGiven = TRUE; model->JFETnlev = value->iValue; diff --git a/src/spicelib/devices/jfet/jfetset.c b/src/spicelib/devices/jfet/jfetset.c index 6202dae3e..662549662 100644 --- a/src/spicelib/devices/jfet/jfetset.c +++ b/src/spicelib/devices/jfet/jfetset.c @@ -62,12 +62,6 @@ JFETsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) if(!model->JFETdepletionCapCoeffGiven) { model->JFETdepletionCapCoeff = .5; } - if(!model->JFETfNcoefGiven) { - model->JFETfNcoef = 0; - } - if(!model->JFETfNexpGiven) { - model->JFETfNexp = 1; - } /* Modification for Sydney University JFET model */ if(!model->JFETbGiven) { @@ -78,9 +72,27 @@ JFETsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) if(!model->JFETtcvGiven) { model->JFETtcv = 0.0; } + if(!model->JFETvtotcGiven) { + model->JFETvtotc = 0.0; + } if(!model->JFETbexGiven) { model->JFETbex = 0.0; } + if(!model->JFETbetatceGiven) { + model->JFETbetatce = 0.0; + } + if(!model->JFETxtiGiven) { + model->JFETxti = 3.0; + } + if(!model->JFETegGiven) { + model->JFETeg = 1.11; + } + if(!model->JFETfNcoefGiven) { + model->JFETfNcoef = 0; + } + if(!model->JFETfNexpGiven) { + model->JFETfNexp = 1; + } if(!model->JFETnlevGiven) { model->JFETnlev = 2; } diff --git a/src/spicelib/devices/jfet/jfettemp.c b/src/spicelib/devices/jfet/jfettemp.c index 1a58db8fd..ab43aaf33 100644 --- a/src/spicelib/devices/jfet/jfettemp.c +++ b/src/spicelib/devices/jfet/jfettemp.c @@ -89,7 +89,11 @@ JFETtemp(GENmodel *inModel, CKTcircuit *ckt) vt = here->JFETtemp * CONSTKoverQ; fact2 = here->JFETtemp/REFTEMP; ratio1 = here->JFETtemp/model->JFETtnom -1; - here->JFETtSatCur = model->JFETgateSatCurrent * exp(ratio1*1.11/vt); + if (model->JFETxtiGiven) { + here->JFETtSatCur = model->JFETgateSatCurrent * exp(ratio1*model->JFETeg/vt) * pow(ratio1+1,model->JFETxti); + } else { + here->JFETtSatCur = model->JFETgateSatCurrent * exp(ratio1*model->JFETeg/vt); + } here->JFETtCGS = model->JFETcapGS * cjfact; here->JFETtCGD = model->JFETcapGD * cjfact; kt = CONSTboltz*here->JFETtemp; @@ -108,9 +112,16 @@ JFETtemp(GENmodel *inModel, CKTcircuit *ckt) here->JFETf1 = here->JFETtGatePot * (1 - exp((1-.5)*xfc))/(1-.5); here->JFETvcrit = vt * log(vt/(CONSTroot2 * here->JFETtSatCur)); - here->JFETtThreshold = model->JFETthreshold - model->JFETtcv*(here->JFETtemp-model->JFETtnom); - here->JFETtBeta = model->JFETbeta * pow(here->JFETtemp/model->JFETtnom,model->JFETbex); - + if (model->JFETvtotcGiven) { + here->JFETtThreshold = model->JFETthreshold + model->JFETvtotc*(here->JFETtemp-model->JFETtnom); + } else { + here->JFETtThreshold = model->JFETthreshold - model->JFETtcv*(here->JFETtemp-model->JFETtnom); + } + if (model->JFETbetatceGiven) { + here->JFETtBeta = model->JFETbeta * pow(1.01,model->JFETbetatce*(here->JFETtemp-model->JFETtnom)); + } else { + here->JFETtBeta = model->JFETbeta * pow(here->JFETtemp/model->JFETtnom,model->JFETbex); + } } } return(OK);