From 14eef00d5c017b81562c32a8a40a8d441a2cacfd Mon Sep 17 00:00:00 2001 From: pnenzi Date: Fri, 26 Dec 2003 09:46:48 +0000 Subject: [PATCH] Added "dtemp" anf "m" to jfet model. Added a test netlist and updated DEVICES. --- ChangeLog | 10 ++++ DEVICES | 13 +++++- src/spicelib/devices/jfet/jfet.c | 3 +- src/spicelib/devices/jfet/jfetacld.c | 54 +++++++++++----------- src/spicelib/devices/jfet/jfetask.c | 29 +++++++++--- src/spicelib/devices/jfet/jfetdefs.h | 6 +++ src/spicelib/devices/jfet/jfetdel.c | 6 +-- src/spicelib/devices/jfet/jfetdest.c | 4 +- src/spicelib/devices/jfet/jfetdist.c | 7 +-- src/spicelib/devices/jfet/jfetdset.c | 17 +++---- src/spicelib/devices/jfet/jfetext.h | 22 --------- src/spicelib/devices/jfet/jfetic.c | 5 +- src/spicelib/devices/jfet/jfetload.c | 46 ++++++++++--------- src/spicelib/devices/jfet/jfetmask.c | 7 +-- src/spicelib/devices/jfet/jfetmdel.c | 6 +-- src/spicelib/devices/jfet/jfetmpar.c | 6 +-- src/spicelib/devices/jfet/jfetnoi.c | 19 +++----- src/spicelib/devices/jfet/jfetpar.c | 15 +++--- src/spicelib/devices/jfet/jfetpzld.c | 69 ++++++++++++++-------------- src/spicelib/devices/jfet/jfetset.c | 14 ++---- src/spicelib/devices/jfet/jfettemp.c | 10 ++-- src/spicelib/devices/jfet/jfettrun.c | 6 +-- tests/jfet/jfet_vds-vgs.cir | 13 ++++++ 23 files changed, 193 insertions(+), 194 deletions(-) create mode 100644 tests/jfet/jfet_vds-vgs.cir diff --git a/ChangeLog b/ChangeLog index aff4197ed..61426abcd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2003-12-26 Paolo Nenzi + + * src/spicelibe/devices/jfet/*: Added parallel multiplier and + "dtemp" parameter. + + * DEVICES: Updated jfet status + + * tests/jfet, tests/jfet/jfet_vds-vgs.cir: added jfet directory + and one netlist. + 2003-12-24 Paolo Nenzi * src/maths/cmaths/cmath4.c: Applied diff --git a/DEVICES b/DEVICES index 37a993d58..95cd80a8d 100644 --- a/DEVICES +++ b/DEVICES @@ -171,7 +171,18 @@ BJT2 - Bipolar Junction Trasistor *************************************************************************** JFET - Junction Field Effect transistor - Initial Release + Initial Release. + Ver: N/A + Class: J + Level: 1 + Status: + + This is the original spice JFET model. + + Enhancements over the original model: + + - Parallel multiplier + - Instance temperature as difference for circuit temperature JFET2 - Jfet PS model Initial release. TO BE TESTED diff --git a/src/spicelib/devices/jfet/jfet.c b/src/spicelib/devices/jfet/jfet.c index 03a405b13..27c41d46b 100644 --- a/src/spicelib/devices/jfet/jfet.c +++ b/src/spicelib/devices/jfet/jfet.c @@ -7,7 +7,6 @@ Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern **********/ #include "ngspice.h" -#include #include "ifsim.h" #include "devdefs.h" #include "jfetdefs.h" @@ -17,9 +16,11 @@ IFparm JFETpTable[] = { /* device parameters */ IOPU("off", JFET_OFF, IF_FLAG, "Device initially off"), IOPAU("ic", JFET_IC, IF_REALVEC,"Initial VDS,VGS vector"), IOPU("area", JFET_AREA, IF_REAL, "Area factor"), + IOPU("m", JFET_M, IF_REAL, "Parallel multiplier"), IOPAU("ic-vds", JFET_IC_VDS, IF_REAL, "Initial D-S voltage"), IOPAU("ic-vgs", JFET_IC_VGS, IF_REAL, "Initial G-S volrage"), IOPU("temp", JFET_TEMP, IF_REAL, "Instance temperature"), + IOPU("dtemp", JFET_DTEMP, IF_REAL, "Instance temperature difference"), OPU("drain-node", JFET_DRAINNODE, IF_INTEGER,"Number of drain node"), OPU("gate-node", JFET_GATENODE, IF_INTEGER,"Number of gate node"), OPU("source-node", JFET_SOURCENODE, IF_INTEGER,"Number of source node"), diff --git a/src/spicelib/devices/jfet/jfetacld.c b/src/spicelib/devices/jfet/jfetacld.c index 86aab0d6f..053e49134 100644 --- a/src/spicelib/devices/jfet/jfetacld.c +++ b/src/spicelib/devices/jfet/jfetacld.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "jfetdefs.h" #include "sperror.h" @@ -14,9 +13,7 @@ Author: 1985 Thomas L. Quarles int -JFETacLoad(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +JFETacLoad(GENmodel *inModel, CKTcircuit *ckt) { JFETmodel *model = (JFETmodel*)inModel; JFETinstance *here; @@ -29,6 +26,8 @@ JFETacLoad(inModel,ckt) double ggd; double xgd; + double m; + for( ; model != NULL; model = model->JFETnextModel ) { for( here = model->JFETinstances; here != NULL; @@ -43,28 +42,31 @@ JFETacLoad(inModel,ckt) xgs= *(ckt->CKTstate0 + here->JFETqgs) * ckt->CKTomega ; ggd= *(ckt->CKTstate0 + here->JFETggd) ; xgd= *(ckt->CKTstate0 + here->JFETqgd) * ckt->CKTomega ; - *(here->JFETdrainDrainPtr ) += gdpr; - *(here->JFETgateGatePtr ) += ggd+ggs; - *(here->JFETgateGatePtr +1) += xgd+xgs; - *(here->JFETsourceSourcePtr ) += gspr; - *(here->JFETdrainPrimeDrainPrimePtr ) += gdpr+gds+ggd; - *(here->JFETdrainPrimeDrainPrimePtr +1) += xgd; - *(here->JFETsourcePrimeSourcePrimePtr ) += gspr+gds+gm+ggs; - *(here->JFETsourcePrimeSourcePrimePtr +1) += xgs; - *(here->JFETdrainDrainPrimePtr ) -= gdpr; - *(here->JFETgateDrainPrimePtr ) -= ggd; - *(here->JFETgateDrainPrimePtr +1) -= xgd; - *(here->JFETgateSourcePrimePtr ) -= ggs; - *(here->JFETgateSourcePrimePtr +1) -= xgs; - *(here->JFETsourceSourcePrimePtr ) -= gspr; - *(here->JFETdrainPrimeDrainPtr ) -= gdpr; - *(here->JFETdrainPrimeGatePtr ) += (-ggd+gm); - *(here->JFETdrainPrimeGatePtr +1) -= xgd; - *(here->JFETdrainPrimeSourcePrimePtr ) += (-gds-gm); - *(here->JFETsourcePrimeGatePtr ) += (-ggs-gm); - *(here->JFETsourcePrimeGatePtr +1) -= xgs; - *(here->JFETsourcePrimeSourcePtr ) -= gspr; - *(here->JFETsourcePrimeDrainPrimePtr ) -= gds; + + m = here->JFETm; + + *(here->JFETdrainDrainPtr ) += m * (gdpr); + *(here->JFETgateGatePtr ) += m * (ggd+ggs); + *(here->JFETgateGatePtr +1) += m * (xgd+xgs); + *(here->JFETsourceSourcePtr ) += m * (gspr); + *(here->JFETdrainPrimeDrainPrimePtr ) += m * (gdpr+gds+ggd); + *(here->JFETdrainPrimeDrainPrimePtr +1) += m * (xgd); + *(here->JFETsourcePrimeSourcePrimePtr ) += m * (gspr+gds+gm+ggs); + *(here->JFETsourcePrimeSourcePrimePtr +1) += m * (xgs); + *(here->JFETdrainDrainPrimePtr ) -= m * (gdpr); + *(here->JFETgateDrainPrimePtr ) -= m * (ggd); + *(here->JFETgateDrainPrimePtr +1) -= m * (xgd); + *(here->JFETgateSourcePrimePtr ) -= m * (ggs); + *(here->JFETgateSourcePrimePtr +1) -= m * (xgs); + *(here->JFETsourceSourcePrimePtr ) -= m * (gspr); + *(here->JFETdrainPrimeDrainPtr ) -= m * (gdpr); + *(here->JFETdrainPrimeGatePtr ) += m * (-ggd+gm); + *(here->JFETdrainPrimeGatePtr +1) -= m * (xgd); + *(here->JFETdrainPrimeSourcePrimePtr ) += m * (-gds-gm); + *(here->JFETsourcePrimeGatePtr ) += m * (-ggs-gm); + *(here->JFETsourcePrimeGatePtr +1) -= m * (xgs); + *(here->JFETsourcePrimeSourcePtr ) -= m * (gspr); + *(here->JFETsourcePrimeDrainPrimePtr ) -= m * (gds); } } diff --git a/src/spicelib/devices/jfet/jfetask.c b/src/spicelib/devices/jfet/jfetask.c index 1a3337e60..bb6762a7c 100644 --- a/src/spicelib/devices/jfet/jfetask.c +++ b/src/spicelib/devices/jfet/jfetask.c @@ -6,7 +6,6 @@ Author: 1987 Mathew Lew and Thomas L. Quarles */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "cktdefs.h" @@ -18,12 +17,8 @@ Author: 1987 Mathew Lew and Thomas L. Quarles /*ARGSUSED*/ int -JFETask(ckt,inst,which,value,select) - CKTcircuit *ckt; - GENinstance *inst; - int which; - IFvalue *value; - IFvalue *select; +JFETask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, + IFvalue *select) { JFETinstance *here = (JFETinstance*)inst; static char *msg = "Current and power not available for ac analysis"; @@ -31,8 +26,15 @@ JFETask(ckt,inst,which,value,select) case JFET_TEMP: value->rValue = here->JFETtemp-CONSTCtoK; return(OK); + case JFET_DTEMP: + value->rValue = here->JFETdtemp; + return(OK); case JFET_AREA: value->rValue = here->JFETarea; + value->rValue *= here->JFETm; + return(OK); + case JFET_M: + value->rValue = here->JFETm; return(OK); case JFET_IC_VDS: value->rValue = here->JFETicVDS; @@ -66,36 +68,47 @@ JFETask(ckt,inst,which,value,select) return(OK); case JFET_CG: value->rValue = *(ckt->CKTstate0 + here->JFETcg); + value->rValue *= here->JFETm; return(OK); case JFET_CD: value->rValue = *(ckt->CKTstate0 + here->JFETcd); + value->rValue *= here->JFETm; return(OK); case JFET_CGD: value->rValue = *(ckt->CKTstate0 + here->JFETcgd); + value->rValue *= here->JFETm; return(OK); case JFET_GM: value->rValue = *(ckt->CKTstate0 + here->JFETgm); + value->rValue *= here->JFETm; return(OK); case JFET_GDS: value->rValue = *(ckt->CKTstate0 + here->JFETgds); + value->rValue *= here->JFETm; return(OK); case JFET_GGS: value->rValue = *(ckt->CKTstate0 + here->JFETggs); + value->rValue *= here->JFETm; return(OK); case JFET_GGD: value->rValue = *(ckt->CKTstate0 + here->JFETggd); + value->rValue *= here->JFETm; return(OK); case JFET_QGS: value->rValue = *(ckt->CKTstate0 + here->JFETqgs); + value->rValue *= here->JFETm; return(OK); case JFET_CQGS: value->rValue = *(ckt->CKTstate0 + here->JFETcqgs); + value->rValue *= here->JFETm; return(OK); case JFET_QGD: value->rValue = *(ckt->CKTstate0 + here->JFETqgd); + value->rValue *= here->JFETm; return(OK); case JFET_CQGD: value->rValue = *(ckt->CKTstate0 + here->JFETcqgd); + value->rValue *= here->JFETm; return(OK); case JFET_CS : if (ckt->CKTcurrentAnalysis & DOING_AC) { @@ -106,6 +119,7 @@ JFETask(ckt,inst,which,value,select) } else { value->rValue = -*(ckt->CKTstate0 + here->JFETcd); value->rValue -= *(ckt->CKTstate0 + here->JFETcg); + value->rValue *= here->JFETm; } return(OK); case JFET_POWER : @@ -122,6 +136,7 @@ JFETask(ckt,inst,which,value,select) value->rValue -= (*(ckt->CKTstate0 + here->JFETcd) + *(ckt->CKTstate0 + here->JFETcg)) * *(ckt->CKTrhsOld + here->JFETsourceNode); + value->rValue *= here->JFETm; } return(OK); default: diff --git a/src/spicelib/devices/jfet/jfetdefs.h b/src/spicelib/devices/jfet/jfetdefs.h index 72564f812..995499433 100644 --- a/src/spicelib/devices/jfet/jfetdefs.h +++ b/src/spicelib/devices/jfet/jfetdefs.h @@ -127,15 +127,19 @@ typedef struct sJFETinstance { unsigned JFEToff :1; /* 'off' flag for jfet */ unsigned JFETareaGiven : 1; /* flag to indicate area was specified */ + unsigned JFETmGiven : 1; /* flag to indicate parallel multiplier given */ unsigned JFETicVDSGiven : 1; /* initial condition given flag for V D-S*/ unsigned JFETicVGSGiven : 1; /* initial condition given flag for V G-S*/ unsigned JFETtempGiven : 1; /* flag to indicate instance temp given */ + unsigned JFETdtempGiven : 1; /* flag to indicate instance dtemp given */ double JFETarea; /* area factor for the jfet */ + double JFETm; /* Parallel multiplier */ double JFETicVDS; /* initial condition voltage D-S*/ double JFETicVGS; /* initial condition voltage G-S*/ double JFETtemp; /* operating temperature */ + double JFETdtemp; /* instance temperature difference */ double JFETtSatCur; /* temperature adjusted saturation current */ double JFETtGatePot; /* temperature adjusted gate potential */ double JFETtCGS; /* temperature corrected G-S capacitance */ @@ -230,6 +234,8 @@ typedef struct sJFETmodel { /* model structure for a jfet */ #define JFET_IC 4 #define JFET_OFF 5 #define JFET_TEMP 6 +#define JFET_DTEMP 7 +#define JFET_M 8 /* model parameters */ #define JFET_MOD_VTO 101 diff --git a/src/spicelib/devices/jfet/jfetdel.c b/src/spicelib/devices/jfet/jfetdel.c index 71e3a7503..d236a6680 100644 --- a/src/spicelib/devices/jfet/jfetdel.c +++ b/src/spicelib/devices/jfet/jfetdel.c @@ -6,17 +6,13 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "jfetdefs.h" #include "sperror.h" #include "suffix.h" int -JFETdelete(inModel,name,inst) - GENmodel *inModel; - IFuid name; - GENinstance **inst; +JFETdelete(GENmodel *inModel, IFuid name, GENinstance **inst) { JFETmodel *model = (JFETmodel*)inModel; JFETinstance **fast = (JFETinstance**)inst; diff --git a/src/spicelib/devices/jfet/jfetdest.c b/src/spicelib/devices/jfet/jfetdest.c index fe51a23ed..ef68425a8 100644 --- a/src/spicelib/devices/jfet/jfetdest.c +++ b/src/spicelib/devices/jfet/jfetdest.c @@ -6,14 +6,12 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "jfetdefs.h" #include "suffix.h" void -JFETdestroy(inModel) - GENmodel **inModel; +JFETdestroy(GENmodel **inModel) { JFETmodel **model = (JFETmodel**)inModel; JFETinstance *here; diff --git a/src/spicelib/devices/jfet/jfetdist.c b/src/spicelib/devices/jfet/jfetdist.c index 522eb6a27..204b8fdd5 100644 --- a/src/spicelib/devices/jfet/jfetdist.c +++ b/src/spicelib/devices/jfet/jfetdist.c @@ -4,7 +4,6 @@ Author: 1988 Jaijeet S Roychowdhury **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "jfetdefs.h" #include "sperror.h" @@ -12,11 +11,7 @@ Author: 1988 Jaijeet S Roychowdhury #include "suffix.h" int -JFETdisto(mode,genmodel,ckt) - GENmodel *genmodel; - CKTcircuit *ckt; - int mode; - +JFETdisto(int mode, GENmodel *genmodel, CKTcircuit *ckt) /* assuming here that ckt->CKTomega has been initialised to * the correct value */ diff --git a/src/spicelib/devices/jfet/jfetdset.c b/src/spicelib/devices/jfet/jfetdset.c index d2aa4cc4b..5ee0ad1d2 100644 --- a/src/spicelib/devices/jfet/jfetdset.c +++ b/src/spicelib/devices/jfet/jfetdset.c @@ -4,7 +4,6 @@ Author: 1988 Jaijeet S Roychowdhury **********/ #include "ngspice.h" -#include #include "distodef.h" #include "cktdefs.h" #include "jfetdefs.h" @@ -15,9 +14,7 @@ Author: 1988 Jaijeet S Roychowdhury #include "suffix.h" int -JFETdSetup(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +JFETdSetup(GENmodel *inModel, CKTcircuit *ckt) /* actually load the current resistance value into the * sparse matrix previously provided */ @@ -81,10 +78,10 @@ JFETdSetup(inModel,ckt) /* * dc model parameters */ - beta = model->JFETbeta * here->JFETarea; - gdpr=model->JFETdrainConduct*here->JFETarea; - gspr=model->JFETsourceConduct*here->JFETarea; - csat=here->JFETtSatCur*here->JFETarea; + beta = model->JFETbeta * here->JFETarea * here->JFETm; + gdpr=model->JFETdrainConduct*here->JFETarea * here->JFETm; + gspr=model->JFETsourceConduct*here->JFETarea * here-> JFETm; + csat=here->JFETtSatCur*here->JFETarea * here-> JFETm; /* * initialization */ @@ -189,8 +186,8 @@ JFETdSetup(inModel,ckt) /* * charge storage elements */ - czgs=here->JFETtCGS*here->JFETarea; - czgd=here->JFETtCGD*here->JFETarea; + czgs=here->JFETtCGS*here->JFETarea * here->JFETm; + czgd=here->JFETtCGD*here->JFETarea * here->JFETm; twop=here->JFETtGatePot+here->JFETtGatePot; fcpb2=here->JFETcorDepCap*here->JFETcorDepCap; czgsf2=czgs/model->JFETf2; diff --git a/src/spicelib/devices/jfet/jfetext.h b/src/spicelib/devices/jfet/jfetext.h index 3a685d319..475bdbe1a 100644 --- a/src/spicelib/devices/jfet/jfetext.h +++ b/src/spicelib/devices/jfet/jfetext.h @@ -4,7 +4,6 @@ Author: 1985 Thomas L. Quarles Modified: 2000 AlansFixes **********/ -#ifdef __STDC__ extern int JFETacLoad(GENmodel*,CKTcircuit*); extern int JFETask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); extern int JFETdelete(GENmodel*,IFuid,GENinstance**); @@ -22,25 +21,4 @@ extern int JFETtemp(GENmodel*,CKTcircuit*); extern int JFETtrunc(GENmodel*,CKTcircuit*,double*); extern int JFETdisto(int,GENmodel*,CKTcircuit*); extern int JFETnoise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); - extern int JFETdSetup(GENmodel*,CKTcircuit*); - -#else /* stdc */ -extern int JFETacLoad(); -extern int JFETask(); -extern int JFETdelete(); -extern void JFETdestroy(); -extern int JFETgetic(); -extern int JFETload(); -extern int JFETmAsk(); -extern int JFETmDelete(); -extern int JFETmParam(); -extern int JFETparam(); -extern int JFETpzLoad(); -extern int JFETsetup(); -extern int JFETunsetup(); -extern int JFETtemp(); -extern int JFETtrunc(); -extern int JFETdisto(); -extern int JFETnoise(); -#endif /* stdc */ diff --git a/src/spicelib/devices/jfet/jfetic.c b/src/spicelib/devices/jfet/jfetic.c index cdad6d4d9..c4e309977 100644 --- a/src/spicelib/devices/jfet/jfetic.c +++ b/src/spicelib/devices/jfet/jfetic.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "jfetdefs.h" #include "sperror.h" @@ -14,9 +13,7 @@ Author: 1985 Thomas L. Quarles int -JFETgetic(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +JFETgetic(GENmodel *inModel, CKTcircuit *ckt) { JFETmodel *model = (JFETmodel*)inModel; JFETinstance *here; diff --git a/src/spicelib/devices/jfet/jfetload.c b/src/spicelib/devices/jfet/jfetload.c index e7a6835c0..954e8fcdd 100644 --- a/src/spicelib/devices/jfet/jfetload.c +++ b/src/spicelib/devices/jfet/jfetload.c @@ -8,7 +8,6 @@ Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "jfetdefs.h" #include "const.h" @@ -18,9 +17,7 @@ Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern #include "suffix.h" int -JFETload(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +JFETload(GENmodel *inModel, CKTcircuit *ckt) /* actually load the current resistance value into the * sparse matrix previously provided */ @@ -78,6 +75,8 @@ JFETload(inModel,ckt) double arg, vt_temp; + double m; + /* loop through all the models */ for( ; model != NULL; model = model->JFETnextModel ) { @@ -424,32 +423,35 @@ JFETload(inModel,ckt) * load current vector */ load: + + m = here->JFETm; + ceqgd=model->JFETtype*(cgd-ggd*vgd); ceqgs=model->JFETtype*((cg-cgd)-ggs*vgs); cdreq=model->JFETtype*((cd+cgd)-gds*vds-gm*vgs); - *(ckt->CKTrhs + here->JFETgateNode) += (-ceqgs-ceqgd); + *(ckt->CKTrhs + here->JFETgateNode) += m * (-ceqgs-ceqgd); *(ckt->CKTrhs + here->JFETdrainPrimeNode) += - (-cdreq+ceqgd); + m * (-cdreq+ceqgd); *(ckt->CKTrhs + here->JFETsourcePrimeNode) += - (cdreq+ceqgs); + m * (cdreq+ceqgs); /* * load y matrix */ - *(here->JFETdrainDrainPrimePtr) += (-gdpr); - *(here->JFETgateDrainPrimePtr) += (-ggd); - *(here->JFETgateSourcePrimePtr) += (-ggs); - *(here->JFETsourceSourcePrimePtr) += (-gspr); - *(here->JFETdrainPrimeDrainPtr) += (-gdpr); - *(here->JFETdrainPrimeGatePtr) += (gm-ggd); - *(here->JFETdrainPrimeSourcePrimePtr) += (-gds-gm); - *(here->JFETsourcePrimeGatePtr) += (-ggs-gm); - *(here->JFETsourcePrimeSourcePtr) += (-gspr); - *(here->JFETsourcePrimeDrainPrimePtr) += (-gds); - *(here->JFETdrainDrainPtr) += (gdpr); - *(here->JFETgateGatePtr) += (ggd+ggs); - *(here->JFETsourceSourcePtr) += (gspr); - *(here->JFETdrainPrimeDrainPrimePtr) += (gdpr+gds+ggd); - *(here->JFETsourcePrimeSourcePrimePtr) += (gspr+gds+gm+ggs); + *(here->JFETdrainDrainPrimePtr) += m * (-gdpr); + *(here->JFETgateDrainPrimePtr) += m * (-ggd); + *(here->JFETgateSourcePrimePtr) += m * (-ggs); + *(here->JFETsourceSourcePrimePtr) += m * (-gspr); + *(here->JFETdrainPrimeDrainPtr) += m * (-gdpr); + *(here->JFETdrainPrimeGatePtr) += m * (gm-ggd); + *(here->JFETdrainPrimeSourcePrimePtr) += m * (-gds-gm); + *(here->JFETsourcePrimeGatePtr) += m * (-ggs-gm); + *(here->JFETsourcePrimeSourcePtr) += m * (-gspr); + *(here->JFETsourcePrimeDrainPrimePtr) += m * (-gds); + *(here->JFETdrainDrainPtr) += m * (gdpr); + *(here->JFETgateGatePtr) += m * (ggd+ggs); + *(here->JFETsourceSourcePtr) += m * (gspr); + *(here->JFETdrainPrimeDrainPrimePtr) += m * (gdpr+gds+ggd); + *(here->JFETsourcePrimeSourcePrimePtr) += m * (gspr+gds+gm+ggs); } } return(OK); diff --git a/src/spicelib/devices/jfet/jfetmask.c b/src/spicelib/devices/jfet/jfetmask.c index 8a874ec98..6e1afa5a4 100644 --- a/src/spicelib/devices/jfet/jfetmask.c +++ b/src/spicelib/devices/jfet/jfetmask.c @@ -9,7 +9,6 @@ Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "cktdefs.h" @@ -21,11 +20,7 @@ Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern /*ARGSUSED*/ int -JFETmAsk(ckt,inModel,which,value) - CKTcircuit *ckt; - GENmodel *inModel; - int which; - IFvalue *value; +JFETmAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value) { JFETmodel *model = (JFETmodel*)inModel; switch(which) { diff --git a/src/spicelib/devices/jfet/jfetmdel.c b/src/spicelib/devices/jfet/jfetmdel.c index e6395f035..445eb8044 100644 --- a/src/spicelib/devices/jfet/jfetmdel.c +++ b/src/spicelib/devices/jfet/jfetmdel.c @@ -6,17 +6,13 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "jfetdefs.h" #include "sperror.h" #include "suffix.h" int -JFETmDelete(inModel,modname,kill) - GENmodel **inModel; - IFuid modname; - GENmodel *kill; +JFETmDelete(GENmodel **inModel, IFuid modname, GENmodel *kill) { JFETmodel **model = (JFETmodel**)inModel; JFETmodel *modfast = (JFETmodel*)kill; diff --git a/src/spicelib/devices/jfet/jfetmpar.c b/src/spicelib/devices/jfet/jfetmpar.c index fba72ce57..12f09c0df 100644 --- a/src/spicelib/devices/jfet/jfetmpar.c +++ b/src/spicelib/devices/jfet/jfetmpar.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "jfetdefs.h" @@ -15,10 +14,7 @@ Author: 1985 Thomas L. Quarles int -JFETmParam(param,value,inModels) - int param; - IFvalue *value; - GENmodel *inModels; +JFETmParam(int param, IFvalue *value, GENmodel *inModels) { JFETmodel *model = (JFETmodel*)inModels; switch(param) { diff --git a/src/spicelib/devices/jfet/jfetnoi.c b/src/spicelib/devices/jfet/jfetnoi.c index 0f30658bd..422d2f34a 100644 --- a/src/spicelib/devices/jfet/jfetnoi.c +++ b/src/spicelib/devices/jfet/jfetnoi.c @@ -4,7 +4,6 @@ Author: 1987 Gary W. Ng **********/ #include "ngspice.h" -#include #include "jfetdefs.h" #include "cktdefs.h" #include "iferrmsg.h" @@ -24,13 +23,8 @@ extern void NevalSrc(); extern double Nintegrate(); int -JFETnoise (mode, operation, genmodel, ckt, data, OnDens) - int mode; - int operation; - GENmodel *genmodel; - CKTcircuit *ckt; - Ndata *data; - double *OnDens; +JFETnoise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *data, + double *OnDens) { JFETmodel *firstModel = (JFETmodel *) genmodel; JFETmodel *model; @@ -117,21 +111,22 @@ if (!data->namelist) return(E_NOMEM); case N_DENS: NevalSrc(&noizDens[JFETRDNOIZ],&lnNdens[JFETRDNOIZ], ckt,THERMNOISE,inst->JFETdrainPrimeNode,inst->JFETdrainNode, - model->JFETdrainConduct * inst->JFETarea); + model->JFETdrainConduct * inst->JFETarea * inst->JFETm); NevalSrc(&noizDens[JFETRSNOIZ],&lnNdens[JFETRSNOIZ], ckt,THERMNOISE,inst->JFETsourcePrimeNode, - inst->JFETsourceNode,model->JFETsourceConduct*inst->JFETarea); + inst->JFETsourceNode,model->JFETsourceConduct + * inst->JFETarea * inst->JFETm); NevalSrc(&noizDens[JFETIDNOIZ],&lnNdens[JFETIDNOIZ], ckt,THERMNOISE,inst->JFETdrainPrimeNode, inst->JFETsourcePrimeNode, - (2.0/3.0 * fabs(*(ckt->CKTstate0 + inst->JFETgm)))); + (2.0/3.0 * inst->JFETm * fabs(*(ckt->CKTstate0 + inst->JFETgm)))); NevalSrc(&noizDens[JFETFLNOIZ],(double*)NULL,ckt, N_GAIN,inst->JFETdrainPrimeNode, inst->JFETsourcePrimeNode, (double)0.0); - noizDens[JFETFLNOIZ] *= model->JFETfNcoef * + noizDens[JFETFLNOIZ] *= inst->JFETm * model->JFETfNcoef * exp(model->JFETfNexp * log(MAX(fabs(*(ckt->CKTstate0 + inst->JFETcd)),N_MINLOG))) / data->freq; diff --git a/src/spicelib/devices/jfet/jfetpar.c b/src/spicelib/devices/jfet/jfetpar.c index 8c1550577..b4bf52909 100644 --- a/src/spicelib/devices/jfet/jfetpar.c +++ b/src/spicelib/devices/jfet/jfetpar.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "jfetdefs.h" @@ -16,11 +15,7 @@ Author: 1985 Thomas L. Quarles /* ARGSUSED */ int -JFETparam(param,value,inst,select) - int param; - IFvalue *value; - GENinstance *inst; - IFvalue *select; +JFETparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select) { JFETinstance *here = (JFETinstance *)inst; switch(param) { @@ -28,10 +23,18 @@ JFETparam(param,value,inst,select) here->JFETtemp = value->rValue+CONSTCtoK; here->JFETtempGiven = TRUE; break; + case JFET_DTEMP: + here->JFETdtemp = value->rValue; + here->JFETdtempGiven = TRUE; + break; case JFET_AREA: here->JFETarea = value->rValue; here->JFETareaGiven = TRUE; break; + case JFET_M: + here->JFETm = value->rValue; + here->JFETmGiven = TRUE; + break; case JFET_IC_VDS: here->JFETicVDS = value->rValue; here->JFETicVDSGiven = TRUE; diff --git a/src/spicelib/devices/jfet/jfetpzld.c b/src/spicelib/devices/jfet/jfetpzld.c index f7ac0de00..41bb39c59 100644 --- a/src/spicelib/devices/jfet/jfetpzld.c +++ b/src/spicelib/devices/jfet/jfetpzld.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "complex.h" #include "sperror.h" @@ -15,10 +14,7 @@ Author: 1985 Thomas L. Quarles int -JFETpzLoad(inModel,ckt,s) - GENmodel *inModel; - CKTcircuit *ckt; - SPcomplex *s; +JFETpzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) { JFETmodel *model = (JFETmodel*)inModel; JFETinstance *here; @@ -31,12 +27,16 @@ JFETpzLoad(inModel,ckt,s) double ggd; double xgd; + double m; + for( ; model != NULL; model = model->JFETnextModel ) { for( here = model->JFETinstances; here != NULL; here = here->JFETnextInstance) { if (here->JFETowner != ARCHme) continue; + m = here->JFETm; + gdpr=model->JFETdrainResist * here->JFETarea; gspr=model->JFETsourceResist * here->JFETarea; gm= *(ckt->CKTstate0 + here->JFETgm) ; @@ -45,35 +45,36 @@ JFETpzLoad(inModel,ckt,s) xgs= *(ckt->CKTstate0 + here->JFETqgs) ; ggd= *(ckt->CKTstate0 + here->JFETggd) ; xgd= *(ckt->CKTstate0 + here->JFETqgd) ; - *(here->JFETdrainDrainPtr ) += gdpr; - *(here->JFETgateGatePtr ) += ggd+ggs; - *(here->JFETgateGatePtr ) += (xgd+xgs) * s->real; - *(here->JFETgateGatePtr +1) += (xgd+xgs) * s->imag; - *(here->JFETsourceSourcePtr ) += gspr; - *(here->JFETdrainPrimeDrainPrimePtr ) += gdpr+gds+ggd; - *(here->JFETdrainPrimeDrainPrimePtr ) += xgd * s->real; - *(here->JFETdrainPrimeDrainPrimePtr +1) += xgd * s->imag; - *(here->JFETsourcePrimeSourcePrimePtr ) += gspr+gds+gm+ggs; - *(here->JFETsourcePrimeSourcePrimePtr ) += xgs * s->real; - *(here->JFETsourcePrimeSourcePrimePtr +1) += xgs * s->imag; - *(here->JFETdrainDrainPrimePtr ) -= gdpr; - *(here->JFETgateDrainPrimePtr ) -= ggd; - *(here->JFETgateDrainPrimePtr ) -= xgd * s->real; - *(here->JFETgateDrainPrimePtr +1) -= xgd * s->imag; - *(here->JFETgateSourcePrimePtr ) -= ggs; - *(here->JFETgateSourcePrimePtr ) -= xgs * s->real; - *(here->JFETgateSourcePrimePtr +1) -= xgs * s->imag; - *(here->JFETsourceSourcePrimePtr ) -= gspr; - *(here->JFETdrainPrimeDrainPtr ) -= gdpr; - *(here->JFETdrainPrimeGatePtr ) += (-ggd+gm); - *(here->JFETdrainPrimeGatePtr ) -= xgd * s->real; - *(here->JFETdrainPrimeGatePtr +1) -= xgd * s->imag; - *(here->JFETdrainPrimeSourcePrimePtr ) += (-gds-gm); - *(here->JFETsourcePrimeGatePtr ) += (-ggs-gm); - *(here->JFETsourcePrimeGatePtr ) -= xgs * s->real; - *(here->JFETsourcePrimeGatePtr +1) -= xgs * s->imag; - *(here->JFETsourcePrimeSourcePtr ) -= gspr; - *(here->JFETsourcePrimeDrainPrimePtr ) -= gds; + + *(here->JFETdrainDrainPtr ) += m * gdpr; + *(here->JFETgateGatePtr ) += m * (ggd+ggs); + *(here->JFETgateGatePtr ) += m * ((xgd+xgs) * s->real); + *(here->JFETgateGatePtr +1) += m * ((xgd+xgs) * s->imag); + *(here->JFETsourceSourcePtr ) += m * (gspr); + *(here->JFETdrainPrimeDrainPrimePtr ) += m * (gdpr+gds+ggd); + *(here->JFETdrainPrimeDrainPrimePtr ) += m * (xgd * s->real); + *(here->JFETdrainPrimeDrainPrimePtr +1) += m * (xgd * s->imag); + *(here->JFETsourcePrimeSourcePrimePtr ) += m * (gspr+gds+gm+ggs); + *(here->JFETsourcePrimeSourcePrimePtr ) += m * (xgs * s->real); + *(here->JFETsourcePrimeSourcePrimePtr +1) += m * (xgs * s->imag); + *(here->JFETdrainDrainPrimePtr ) -= m * (gdpr); + *(here->JFETgateDrainPrimePtr ) -= m * (ggd); + *(here->JFETgateDrainPrimePtr ) -= m * (xgd * s->real); + *(here->JFETgateDrainPrimePtr +1) -= m * (xgd * s->imag); + *(here->JFETgateSourcePrimePtr ) -= m * (ggs); + *(here->JFETgateSourcePrimePtr ) -= m * (xgs * s->real); + *(here->JFETgateSourcePrimePtr +1) -= m * (xgs * s->imag); + *(here->JFETsourceSourcePrimePtr ) -= m * (gspr); + *(here->JFETdrainPrimeDrainPtr ) -= m * (gdpr); + *(here->JFETdrainPrimeGatePtr ) += m * (-ggd+gm); + *(here->JFETdrainPrimeGatePtr ) -= m * (xgd * s->real); + *(here->JFETdrainPrimeGatePtr +1) -= m * (xgd * s->imag); + *(here->JFETdrainPrimeSourcePrimePtr ) += m * (-gds-gm); + *(here->JFETsourcePrimeGatePtr ) += m * (-ggs-gm); + *(here->JFETsourcePrimeGatePtr ) -= m * (xgs * s->real); + *(here->JFETsourcePrimeGatePtr +1) -= m * (xgs * s->imag); + *(here->JFETsourcePrimeSourcePtr ) -= m * (gspr); + *(here->JFETsourcePrimeDrainPrimePtr ) -= m * (gds); } } diff --git a/src/spicelib/devices/jfet/jfetset.c b/src/spicelib/devices/jfet/jfetset.c index e0d592194..f9375c32f 100644 --- a/src/spicelib/devices/jfet/jfetset.c +++ b/src/spicelib/devices/jfet/jfetset.c @@ -8,7 +8,6 @@ Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern **********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "jfetdefs.h" @@ -17,11 +16,7 @@ Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern #include "suffix.h" int -JFETsetup(matrix,inModel,ckt,states) - SMPmatrix *matrix; - GENmodel *inModel; - CKTcircuit *ckt; - int *states; +JFETsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* load the diode structure with those pointers needed later * for fast matrix loading */ @@ -99,6 +94,9 @@ JFETsetup(matrix,inModel,ckt,states) if(!here->JFETareaGiven) { here->JFETarea = 1; } + if(!here->JFETmGiven) { + here->JFETm = 1; + } here->JFETstate = *states; *states += 13; @@ -177,9 +175,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ } int -JFETunsetup(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +JFETunsetup(GENmodel *inModel, CKTcircuit *ckt) { JFETmodel *model; JFETinstance *here; diff --git a/src/spicelib/devices/jfet/jfettemp.c b/src/spicelib/devices/jfet/jfettemp.c index 6f048fce4..03b76f159 100644 --- a/src/spicelib/devices/jfet/jfettemp.c +++ b/src/spicelib/devices/jfet/jfettemp.c @@ -7,7 +7,6 @@ Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern **********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "jfetdefs.h" @@ -16,9 +15,7 @@ Sydney University mods Copyright(c) 1989 Anthony E. Parker, David J. Skellern #include "suffix.h" int -JFETtemp(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +JFETtemp(GENmodel *inModel, CKTcircuit *ckt) /* Pre-process the model parameters after a possible change */ { @@ -84,8 +81,11 @@ JFETtemp(inModel,ckt) here=here->JFETnextInstance) { if (here->JFETowner != ARCHme) continue; + if(!(here->JFETdtempGiven)) { + here->JFETdtemp = 0.0; + } if(!(here->JFETtempGiven)) { - here->JFETtemp = ckt->CKTtemp; + here->JFETtemp = ckt->CKTtemp + here->JFETdtemp; } vt = here->JFETtemp * CONSTKoverQ; fact2 = here->JFETtemp/REFTEMP; diff --git a/src/spicelib/devices/jfet/jfettrun.c b/src/spicelib/devices/jfet/jfettrun.c index 4dc854896..a3e548105 100644 --- a/src/spicelib/devices/jfet/jfettrun.c +++ b/src/spicelib/devices/jfet/jfettrun.c @@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles */ #include "ngspice.h" -#include #include "cktdefs.h" #include "jfetdefs.h" #include "sperror.h" @@ -14,10 +13,7 @@ Author: 1985 Thomas L. Quarles int -JFETtrunc(inModel,ckt,timeStep) - GENmodel *inModel; - CKTcircuit *ckt; - double *timeStep; +JFETtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) { JFETmodel *model = (JFETmodel*)inModel; JFETinstance *here; diff --git a/tests/jfet/jfet_vds-vgs.cir b/tests/jfet/jfet_vds-vgs.cir new file mode 100644 index 000000000..dba8349d4 --- /dev/null +++ b/tests/jfet/jfet_vds-vgs.cir @@ -0,0 +1,13 @@ +* I-V Characteristics of JFET 2N4221 +* +* +j1 2 1 0 MODJ +VD 2 0 25 +VG 1 0 -2 +* +.model MODJ NJF LEVEL=1 VTO=-3.5 BETA=4.1E-4 LAMBDA=0.002 RD=200 +* +.op +.dc VD 0 25 1 VG -3 0 1 +*.print DC I(VD) +.END \ No newline at end of file