From 1def649a821109ce3640e0e74805c0f3d5fc0fa6 Mon Sep 17 00:00:00 2001 From: pnenzi Date: Sat, 27 Dec 2003 12:04:53 +0000 Subject: [PATCH] Added dtemp and "m" to JFET2 and updated DEVICES file. --- ChangeLog | 8 +++ DEVICES | 19 +++++++- src/spicelib/devices/jfet2/jfet2.c | 3 +- src/spicelib/devices/jfet2/jfet2acld.c | 67 ++++++++++++++------------ src/spicelib/devices/jfet2/jfet2ask.c | 30 +++++++++--- src/spicelib/devices/jfet2/jfet2defs.h | 6 +++ src/spicelib/devices/jfet2/jfet2del.c | 6 +-- src/spicelib/devices/jfet2/jfet2dest.c | 4 +- src/spicelib/devices/jfet2/jfet2ext.h | 19 -------- src/spicelib/devices/jfet2/jfet2ic.c | 5 +- src/spicelib/devices/jfet2/jfet2load.c | 46 +++++++++--------- src/spicelib/devices/jfet2/jfet2mask.c | 7 +-- src/spicelib/devices/jfet2/jfet2mdel.c | 6 +-- src/spicelib/devices/jfet2/jfet2mpar.c | 6 +-- src/spicelib/devices/jfet2/jfet2noi.c | 18 +++---- src/spicelib/devices/jfet2/jfet2par.c | 15 +++--- src/spicelib/devices/jfet2/jfet2set.c | 42 ++++++++++++---- src/spicelib/devices/jfet2/jfet2temp.c | 15 ++++-- src/spicelib/devices/jfet2/jfet2trun.c | 6 +-- 19 files changed, 180 insertions(+), 148 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5e6a6b538..0c973ce1e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2003-12-27 Paolo Nenzi + + * src/spicelib/devices/jfet2/*: Added parallel multiplier and "dtemp" + parameter. Added Alan's CopyNodeSet, and inserted a missing + instruction in JFET2temp (for parallel code). + + * DEVICES: Updated documentation for JFET2 model + 2003-12-26 Paolo Nenzi * src/spicelib/devices/jfet/*: Added parallel multiplier and diff --git a/DEVICES b/DEVICES index 4c4b4a335..b73a6ab82 100644 --- a/DEVICES +++ b/DEVICES @@ -185,8 +185,23 @@ JFET - Junction Field Effect transistor - Parallel multiplier - Instance temperature as difference for circuit temperature -JFET2 - Jfet PS model - Initial release. TO BE TESTED +JFET2 - Junction Field Effect Transistor (PS model) + Initial Release. + Ver: N/A + Class: J + Level: 2 + Status: + + This is the Parker Skellern model. + + Web Site: + http://www.elec.mq.edu.au/cnerf/models/psmodel/ + + Enhancements over the original model: + + - Parallel multiplier + - Instance temperature as difference for circuit temperature + *************************************************************************** *************************** HFET devices *************************** diff --git a/src/spicelib/devices/jfet2/jfet2.c b/src/spicelib/devices/jfet2/jfet2.c index a5087340a..26efd0577 100644 --- a/src/spicelib/devices/jfet2/jfet2.c +++ b/src/spicelib/devices/jfet2/jfet2.c @@ -10,7 +10,6 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) **********/ #include "ngspice.h" -#include #include "ifsim.h" #include "devdefs.h" #include "jfet2defs.h" @@ -20,9 +19,11 @@ IFparm JFET2pTable[] = { /* device parameters */ IOPU("off", JFET2_OFF, IF_FLAG, "Device initially off"), IOPAU("ic", JFET2_IC, IF_REALVEC,"Initial VDS,VGS vector"), IOPU("area", JFET2_AREA, IF_REAL, "Area factor"), + IOPU("m", JFET2_M, IF_REAL, "Parallel Multiplier"), IOPAU("ic-vds", JFET2_IC_VDS, IF_REAL, "Initial D-S voltage"), IOPAU("ic-vgs", JFET2_IC_VGS, IF_REAL, "Initial G-S volrage"), IOPU("temp", JFET2_TEMP, IF_REAL, "Instance temperature"), + IOPU("dtemp", JFET2_DTEMP, IF_REAL, "Instance temperature difference"), OPU("drain-node", JFET2_DRAINNODE, IF_INTEGER,"Number of drain node"), OPU("gate-node", JFET2_GATENODE, IF_INTEGER,"Number of gate node"), OPU("source-node", JFET2_SOURCENODE, IF_INTEGER,"Number of source node"), diff --git a/src/spicelib/devices/jfet2/jfet2acld.c b/src/spicelib/devices/jfet2/jfet2acld.c index 622162d40..d61c3f795 100644 --- a/src/spicelib/devices/jfet2/jfet2acld.c +++ b/src/spicelib/devices/jfet2/jfet2acld.c @@ -9,7 +9,6 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "jfet2defs.h" #include "sperror.h" @@ -17,9 +16,7 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) #include "suffix.h" int -JFET2acLoad(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +JFET2acLoad(GENmodel *inModel, CKTcircuit *ckt) { JFET2model *model = (JFET2model*)inModel; JFET2instance *here; @@ -33,10 +30,13 @@ JFET2acLoad(inModel,ckt) double xgd; double xgm, xgds, vgd, vgs, cd; + double m; + for( ; model != NULL; model = model->JFET2nextModel ) { for( here = model->JFET2instances; here != NULL; here = here->JFET2nextInstance) { + if (here->JFET2owner != ARCHme) continue; gdpr=model->JFET2drainConduct * here->JFET2area; @@ -54,35 +54,38 @@ JFET2acLoad(inModel,ckt) PSacload(ckt,model, here, vgs, vgd, cd, ckt->CKTomega, &gm, &xgm, &gds, &xgds); xgds += *(ckt->CKTstate0 + here->JFET2qds) * ckt->CKTomega ; - *(here->JFET2drainPrimeDrainPrimePtr +1) += xgds; - *(here->JFET2sourcePrimeSourcePrimePtr +1) += xgds+xgm; - *(here->JFET2drainPrimeGatePtr +1) += xgm; - *(here->JFET2drainPrimeSourcePrimePtr +1) -= xgds+xgm; - *(here->JFET2sourcePrimeGatePtr +1) -= xgm; - *(here->JFET2sourcePrimeDrainPrimePtr +1) -= xgds; - *(here->JFET2drainDrainPtr ) += gdpr; - *(here->JFET2gateGatePtr ) += ggd+ggs; - *(here->JFET2gateGatePtr +1) += xgd+xgs; - *(here->JFET2sourceSourcePtr ) += gspr; - *(here->JFET2drainPrimeDrainPrimePtr ) += gdpr+gds+ggd; - *(here->JFET2drainPrimeDrainPrimePtr +1) += xgd; - *(here->JFET2sourcePrimeSourcePrimePtr ) += gspr+gds+gm+ggs; - *(here->JFET2sourcePrimeSourcePrimePtr +1) += xgs; - *(here->JFET2drainDrainPrimePtr ) -= gdpr; - *(here->JFET2gateDrainPrimePtr ) -= ggd; - *(here->JFET2gateDrainPrimePtr +1) -= xgd; - *(here->JFET2gateSourcePrimePtr ) -= ggs; - *(here->JFET2gateSourcePrimePtr +1) -= xgs; - *(here->JFET2sourceSourcePrimePtr ) -= gspr; - *(here->JFET2drainPrimeDrainPtr ) -= gdpr; - *(here->JFET2drainPrimeGatePtr ) += (-ggd+gm); - *(here->JFET2drainPrimeGatePtr +1) -= xgd; - *(here->JFET2drainPrimeSourcePrimePtr ) += (-gds-gm); - *(here->JFET2sourcePrimeGatePtr ) += (-ggs-gm); - *(here->JFET2sourcePrimeGatePtr +1) -= xgs; - *(here->JFET2sourcePrimeSourcePtr ) -= gspr; - *(here->JFET2sourcePrimeDrainPrimePtr ) -= gds; + m = here->JFET2m; + + *(here->JFET2drainPrimeDrainPrimePtr +1) += m * (xgds); + *(here->JFET2sourcePrimeSourcePrimePtr +1) += m * (xgds+xgm); + *(here->JFET2drainPrimeGatePtr +1) += m * (xgm); + *(here->JFET2drainPrimeSourcePrimePtr +1) -= m * (xgds+xgm); + *(here->JFET2sourcePrimeGatePtr +1) -= m * (xgm); + *(here->JFET2sourcePrimeDrainPrimePtr +1) -= m * (xgds); + + *(here->JFET2drainDrainPtr ) += m * (gdpr); + *(here->JFET2gateGatePtr ) += m * (ggd+ggs); + *(here->JFET2gateGatePtr +1) += m * (xgd+xgs); + *(here->JFET2sourceSourcePtr ) += m * (gspr); + *(here->JFET2drainPrimeDrainPrimePtr ) += m * (gdpr+gds+ggd); + *(here->JFET2drainPrimeDrainPrimePtr +1) += m * (xgd); + *(here->JFET2sourcePrimeSourcePrimePtr ) += m * (gspr+gds+gm+ggs); + *(here->JFET2sourcePrimeSourcePrimePtr +1) += m * (xgs); + *(here->JFET2drainDrainPrimePtr ) -= m * (gdpr); + *(here->JFET2gateDrainPrimePtr ) -= m * (ggd); + *(here->JFET2gateDrainPrimePtr +1) -= m * (xgd); + *(here->JFET2gateSourcePrimePtr ) -= m * (ggs); + *(here->JFET2gateSourcePrimePtr +1) -= m * (xgs); + *(here->JFET2sourceSourcePrimePtr ) -= m * (gspr); + *(here->JFET2drainPrimeDrainPtr ) -= m * (gdpr); + *(here->JFET2drainPrimeGatePtr ) += m * (-ggd+gm); + *(here->JFET2drainPrimeGatePtr +1) -= m * (xgd); + *(here->JFET2drainPrimeSourcePrimePtr ) += m * (-gds-gm); + *(here->JFET2sourcePrimeGatePtr ) += m * (-ggs-gm); + *(here->JFET2sourcePrimeGatePtr +1) -= m * (xgs); + *(here->JFET2sourcePrimeSourcePtr ) -= m * (gspr); + *(here->JFET2sourcePrimeDrainPrimePtr ) -= m * (gds); } } diff --git a/src/spicelib/devices/jfet2/jfet2ask.c b/src/spicelib/devices/jfet2/jfet2ask.c index c472ecc85..8216d20ac 100644 --- a/src/spicelib/devices/jfet2/jfet2ask.c +++ b/src/spicelib/devices/jfet2/jfet2ask.c @@ -9,7 +9,6 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) **********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "cktdefs.h" @@ -21,12 +20,8 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) /*ARGSUSED*/ int -JFET2ask(ckt,inst,which,value,select) - CKTcircuit *ckt; - GENinstance *inst; - int which; - IFvalue *value; - IFvalue *select; +JFET2ask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, + IFvalue *select) { JFET2instance *here = (JFET2instance*)inst; static char *msg = "Current and power not available for ac analysis"; @@ -34,8 +29,15 @@ JFET2ask(ckt,inst,which,value,select) case JFET2_TEMP: value->rValue = here->JFET2temp-CONSTCtoK; return(OK); + case JFET2_DTEMP: + value->rValue = here->JFET2dtemp; + return(OK); case JFET2_AREA: value->rValue = here->JFET2area; + value->rValue *=here->JFET2m; + return(OK); + case JFET2_M: + value->rValue = here->JFET2m; return(OK); case JFET2_IC_VDS: value->rValue = here->JFET2icVDS; @@ -69,36 +71,47 @@ JFET2ask(ckt,inst,which,value,select) return(OK); case JFET2_CG: value->rValue = *(ckt->CKTstate0 + here->JFET2cg); + value->rValue *=here->JFET2m; return(OK); case JFET2_CD: value->rValue = *(ckt->CKTstate0 + here->JFET2cd); + value->rValue *=here->JFET2m; return(OK); case JFET2_CGD: value->rValue = *(ckt->CKTstate0 + here->JFET2cgd); + value->rValue *=here->JFET2m; return(OK); case JFET2_GM: value->rValue = *(ckt->CKTstate0 + here->JFET2gm); + value->rValue *=here->JFET2m; return(OK); case JFET2_GDS: value->rValue = *(ckt->CKTstate0 + here->JFET2gds); + value->rValue *=here->JFET2m; return(OK); case JFET2_GGS: value->rValue = *(ckt->CKTstate0 + here->JFET2ggs); + value->rValue *=here->JFET2m; return(OK); case JFET2_GGD: value->rValue = *(ckt->CKTstate0 + here->JFET2ggd); + value->rValue *=here->JFET2m; return(OK); case JFET2_QGS: value->rValue = *(ckt->CKTstate0 + here->JFET2qgs); + value->rValue *=here->JFET2m; return(OK); case JFET2_CQGS: value->rValue = *(ckt->CKTstate0 + here->JFET2cqgs); + value->rValue *=here->JFET2m; return(OK); case JFET2_QGD: value->rValue = *(ckt->CKTstate0 + here->JFET2qgd); + value->rValue *=here->JFET2m; return(OK); case JFET2_CQGD: value->rValue = *(ckt->CKTstate0 + here->JFET2cqgd); + value->rValue *=here->JFET2m; return(OK); case JFET2_VTRAP: value->rValue = *(ckt->CKTstate0 + here->JFET2vtrap); @@ -115,6 +128,7 @@ JFET2ask(ckt,inst,which,value,select) } else { value->rValue = -*(ckt->CKTstate0 + here->JFET2cd); value->rValue -= *(ckt->CKTstate0 + here->JFET2cg); + value->rValue *=here->JFET2m; } return(OK); case JFET2_POWER : @@ -131,6 +145,8 @@ JFET2ask(ckt,inst,which,value,select) value->rValue -= (*(ckt->CKTstate0 + here->JFET2cd) + *(ckt->CKTstate0 + here->JFET2cg)) * *(ckt->CKTrhsOld + here->JFET2sourceNode); + + value->rValue *=here->JFET2m; } return(OK); default: diff --git a/src/spicelib/devices/jfet2/jfet2defs.h b/src/spicelib/devices/jfet2/jfet2defs.h index 4469a35ae..a7fa8ff0c 100644 --- a/src/spicelib/devices/jfet2/jfet2defs.h +++ b/src/spicelib/devices/jfet2/jfet2defs.h @@ -132,15 +132,19 @@ typedef struct sJFET2instance { unsigned JFET2off :1; /* 'off' flag for jfet */ unsigned JFET2areaGiven : 1; /* flag to indicate area was specified */ + unsigned JFET2mGiven : 1; /* flag to indicate multiplier given */ unsigned JFET2icVDSGiven : 1; /* initial condition given flag for V D-S*/ unsigned JFET2icVGSGiven : 1; /* initial condition given flag for V G-S*/ unsigned JFET2tempGiven : 1; /* flag to indicate instance temp given */ + unsigned JFET2dtempGiven : 1; /* flag to indicate temperature difference given */ double JFET2area; /* area factor for the jfet */ + double JFET2m; /* parallel multiplier for the diode */ double JFET2icVDS; /* initial condition voltage D-S*/ double JFET2icVGS; /* initial condition voltage G-S*/ double JFET2temp; /* operating temperature */ + double JFET2dtemp; /* Instance temperature difference */ double JFET2tSatCur; /* temperature adjusted saturation current */ double JFET2tGatePot; /* temperature adjusted gate potential */ double JFET2tCGS; /* temperature corrected G-S capacitance */ @@ -215,6 +219,8 @@ typedef struct sJFET2model { /* model structure for a jfet */ #define JFET2_IC 4 #define JFET2_OFF 5 #define JFET2_TEMP 6 +#define JFET2_DTEMP 7 +#define JFET2_M 8 /* device questions */ #define JFET2_DRAINNODE 301 diff --git a/src/spicelib/devices/jfet2/jfet2del.c b/src/spicelib/devices/jfet2/jfet2del.c index 41606e4b2..a500a3b9c 100644 --- a/src/spicelib/devices/jfet2/jfet2del.c +++ b/src/spicelib/devices/jfet2/jfet2del.c @@ -8,17 +8,13 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker ) **********/ #include "ngspice.h" -#include #include "jfet2defs.h" #include "sperror.h" #include "suffix.h" int -JFET2delete(inModel,name,inst) - GENmodel *inModel; - IFuid name; - GENinstance **inst; +JFET2delete(GENmodel *inModel, IFuid name, GENinstance **inst) { JFET2model *model = (JFET2model*)inModel; JFET2instance **fast = (JFET2instance**)inst; diff --git a/src/spicelib/devices/jfet2/jfet2dest.c b/src/spicelib/devices/jfet2/jfet2dest.c index 730448513..3129012aa 100644 --- a/src/spicelib/devices/jfet2/jfet2dest.c +++ b/src/spicelib/devices/jfet2/jfet2dest.c @@ -10,14 +10,12 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker ) */ #include "ngspice.h" -#include #include "jfet2defs.h" #include "suffix.h" void -JFET2destroy(inModel) - GENmodel **inModel; +JFET2destroy(GENmodel **inModel) { JFET2model **model = (JFET2model**)inModel; JFET2instance *here; diff --git a/src/spicelib/devices/jfet2/jfet2ext.h b/src/spicelib/devices/jfet2/jfet2ext.h index 0f401100a..fc330fe59 100644 --- a/src/spicelib/devices/jfet2/jfet2ext.h +++ b/src/spicelib/devices/jfet2/jfet2ext.h @@ -7,7 +7,6 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) Copyright 1994 Macquarie University, Sydney Australia. **********/ -#ifdef __STDC__ extern int JFET2acLoad(GENmodel*,CKTcircuit*); extern int JFET2ask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); extern int JFET2delete(GENmodel*,IFuid,GENinstance**); @@ -23,21 +22,3 @@ extern int JFET2unsetup(GENmodel*,CKTcircuit*); extern int JFET2temp(GENmodel*,CKTcircuit*); extern int JFET2trunc(GENmodel*,CKTcircuit*,double*); extern int JFET2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); - -#else /* stdc */ -extern int JFET2acLoad(); -extern int JFET2ask(); -extern int JFET2delete(); -extern void JFET2destroy(); -extern int JFET2getic(); -extern int JFET2load(); -extern int JFET2mAsk(); -extern int JFET2mDelete(); -extern int JFET2mParam(); -extern int JFET2param(); -extern int JFET2setup(); -extern int JFET2unsetup(); -extern int JFET2temp(); -extern int JFET2trunc(); -extern int JFET2noise(); -#endif /* stdc */ diff --git a/src/spicelib/devices/jfet2/jfet2ic.c b/src/spicelib/devices/jfet2/jfet2ic.c index 7c252f174..d68a02796 100644 --- a/src/spicelib/devices/jfet2/jfet2ic.c +++ b/src/spicelib/devices/jfet2/jfet2ic.c @@ -10,7 +10,6 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker ) */ #include "ngspice.h" -#include #include "cktdefs.h" #include "jfet2defs.h" #include "sperror.h" @@ -18,9 +17,7 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker ) int -JFET2getic(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +JFET2getic(GENmodel *inModel, CKTcircuit *ckt) { JFET2model *model = (JFET2model*)inModel; JFET2instance *here; diff --git a/src/spicelib/devices/jfet2/jfet2load.c b/src/spicelib/devices/jfet2/jfet2load.c index a04d9342a..cffbd4629 100644 --- a/src/spicelib/devices/jfet2/jfet2load.c +++ b/src/spicelib/devices/jfet2/jfet2load.c @@ -9,7 +9,6 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) **********/ #include "ngspice.h" -#include #include "cktdefs.h" #include "jfet2defs.h" #include "const.h" @@ -20,9 +19,7 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) #include "suffix.h" int -JFET2load(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +JFET2load(GENmodel *inModel, CKTcircuit *ckt) /* actually load the current resistance value into the * sparse matrix previously provided */ @@ -58,6 +55,8 @@ JFET2load(inModel,ckt) int ichk1; int error; + double m; + /* loop through all the models */ for( ; model != NULL; model = model->JFET2nextModel ) { @@ -293,32 +292,35 @@ JFET2load(inModel,ckt) * load current vector */ load: + + m = here->JFET2m; + ceqgd=model->JFET2type*(cgd-ggd*vgd); ceqgs=model->JFET2type*((cg-cgd)-ggs*vgs); cdreq=model->JFET2type*((cd+cgd)-gds*vds-gm*vgs); - *(ckt->CKTrhs + here->JFET2gateNode) += (-ceqgs-ceqgd); + *(ckt->CKTrhs + here->JFET2gateNode) += m * (-ceqgs-ceqgd); *(ckt->CKTrhs + here->JFET2drainPrimeNode) += - (-cdreq+ceqgd); + m * (-cdreq+ceqgd); *(ckt->CKTrhs + here->JFET2sourcePrimeNode) += - (cdreq+ceqgs); + m * (cdreq+ceqgs); /* * load y matrix */ - *(here->JFET2drainDrainPrimePtr) += (-gdpr); - *(here->JFET2gateDrainPrimePtr) += (-ggd); - *(here->JFET2gateSourcePrimePtr) += (-ggs); - *(here->JFET2sourceSourcePrimePtr) += (-gspr); - *(here->JFET2drainPrimeDrainPtr) += (-gdpr); - *(here->JFET2drainPrimeGatePtr) += (gm-ggd); - *(here->JFET2drainPrimeSourcePrimePtr) += (-gds-gm); - *(here->JFET2sourcePrimeGatePtr) += (-ggs-gm); - *(here->JFET2sourcePrimeSourcePtr) += (-gspr); - *(here->JFET2sourcePrimeDrainPrimePtr) += (-gds); - *(here->JFET2drainDrainPtr) += (gdpr); - *(here->JFET2gateGatePtr) += (ggd+ggs); - *(here->JFET2sourceSourcePtr) += (gspr); - *(here->JFET2drainPrimeDrainPrimePtr) += (gdpr+gds+ggd); - *(here->JFET2sourcePrimeSourcePrimePtr) += (gspr+gds+gm+ggs); + *(here->JFET2drainDrainPrimePtr) += m * (-gdpr); + *(here->JFET2gateDrainPrimePtr) += m * (-ggd); + *(here->JFET2gateSourcePrimePtr) += m * (-ggs); + *(here->JFET2sourceSourcePrimePtr) += m * (-gspr); + *(here->JFET2drainPrimeDrainPtr) += m * (-gdpr); + *(here->JFET2drainPrimeGatePtr) += m * (gm-ggd); + *(here->JFET2drainPrimeSourcePrimePtr) += m * (-gds-gm); + *(here->JFET2sourcePrimeGatePtr) += m * (-ggs-gm); + *(here->JFET2sourcePrimeSourcePtr) += m * (-gspr); + *(here->JFET2sourcePrimeDrainPrimePtr) += m * (-gds); + *(here->JFET2drainDrainPtr) += m * (gdpr); + *(here->JFET2gateGatePtr) += m * (ggd+ggs); + *(here->JFET2sourceSourcePtr) += m * (gspr); + *(here->JFET2drainPrimeDrainPrimePtr) += m * (gdpr+gds+ggd); + *(here->JFET2sourcePrimeSourcePrimePtr) += m * (gspr+gds+gm+ggs); } } return(OK); diff --git a/src/spicelib/devices/jfet2/jfet2mask.c b/src/spicelib/devices/jfet2/jfet2mask.c index 48615aae1..1cc18c93e 100644 --- a/src/spicelib/devices/jfet2/jfet2mask.c +++ b/src/spicelib/devices/jfet2/jfet2mask.c @@ -11,7 +11,6 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "cktdefs.h" @@ -23,11 +22,7 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) /*ARGSUSED*/ int -JFET2mAsk(ckt,inModel,which,value) - CKTcircuit *ckt; - GENmodel *inModel; - int which; - IFvalue *value; +JFET2mAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value) { JFET2model *model = (JFET2model*)inModel; switch(which) { diff --git a/src/spicelib/devices/jfet2/jfet2mdel.c b/src/spicelib/devices/jfet2/jfet2mdel.c index edaf8df58..a7bf49073 100644 --- a/src/spicelib/devices/jfet2/jfet2mdel.c +++ b/src/spicelib/devices/jfet2/jfet2mdel.c @@ -10,17 +10,13 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker ) */ #include "ngspice.h" -#include #include "jfet2defs.h" #include "sperror.h" #include "suffix.h" int -JFET2mDelete(inModel,modname,kill) - GENmodel **inModel; - IFuid modname; - GENmodel *kill; +JFET2mDelete(GENmodel **inModel, IFuid modname, GENmodel *kill) { JFET2model **model = (JFET2model**)inModel; JFET2model *modfast = (JFET2model*)kill; diff --git a/src/spicelib/devices/jfet2/jfet2mpar.c b/src/spicelib/devices/jfet2/jfet2mpar.c index a2a2222ed..cd1da1e99 100644 --- a/src/spicelib/devices/jfet2/jfet2mpar.c +++ b/src/spicelib/devices/jfet2/jfet2mpar.c @@ -9,7 +9,6 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) **********/ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "jfet2defs.h" @@ -18,10 +17,7 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) int -JFET2mParam(param,value,inModels) - int param; - IFvalue *value; - GENmodel *inModels; +JFET2mParam(int param, IFvalue *value, GENmodel *inModels) { JFET2model *model = (JFET2model*)inModels; switch(param) { diff --git a/src/spicelib/devices/jfet2/jfet2noi.c b/src/spicelib/devices/jfet2/jfet2noi.c index a7dc49aca..d27e101c0 100644 --- a/src/spicelib/devices/jfet2/jfet2noi.c +++ b/src/spicelib/devices/jfet2/jfet2noi.c @@ -8,7 +8,6 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker ) **********/ #include "ngspice.h" -#include #include "jfet2defs.h" #include "cktdefs.h" #include "iferrmsg.h" @@ -28,13 +27,7 @@ extern void NevalSrc(); extern double Nintegrate(); int -JFET2noise (mode, operation, genmodel, ckt, data, OnDens) - int mode; - int operation; - GENmodel *genmodel; - CKTcircuit *ckt; - Ndata *data; - double *OnDens; +JFET2noise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt, Ndata *data, double *OnDens) { JFET2model *firstModel = (JFET2model *) genmodel; JFET2model *model; @@ -123,21 +116,22 @@ if (!data->namelist) return(E_NOMEM); case N_DENS: NevalSrc(&noizDens[JFET2RDNOIZ],&lnNdens[JFET2RDNOIZ], ckt,THERMNOISE,inst->JFET2drainPrimeNode,inst->JFET2drainNode, - model->JFET2drainConduct * inst->JFET2area); + model->JFET2drainConduct * inst->JFET2area * inst->JFET2m); NevalSrc(&noizDens[JFET2RSNOIZ],&lnNdens[JFET2RSNOIZ], ckt,THERMNOISE,inst->JFET2sourcePrimeNode, - inst->JFET2sourceNode,model->JFET2sourceConduct*inst->JFET2area); + inst->JFET2sourceNode,model->JFET2sourceConduct + * inst->JFET2area * inst->JFET2m); NevalSrc(&noizDens[JFET2IDNOIZ],&lnNdens[JFET2IDNOIZ], ckt,THERMNOISE,inst->JFET2drainPrimeNode, inst->JFET2sourcePrimeNode, - (2.0/3.0 * fabs(*(ckt->CKTstate0 + inst->JFET2gm)))); + (2.0/3.0 * inst->JFET2m * fabs(*(ckt->CKTstate0 + inst->JFET2gm)))); NevalSrc(&noizDens[JFET2FLNOIZ],(double*)NULL,ckt, N_GAIN,inst->JFET2drainPrimeNode, inst->JFET2sourcePrimeNode, (double)0.0); - noizDens[JFET2FLNOIZ] *= model->JFET2fNcoef * + noizDens[JFET2FLNOIZ] *= inst->JFET2m * model->JFET2fNcoef * exp(model->JFET2fNexp * log(MAX(fabs(*(ckt->CKTstate0 + inst->JFET2cd)),N_MINLOG))) / data->freq; diff --git a/src/spicelib/devices/jfet2/jfet2par.c b/src/spicelib/devices/jfet2/jfet2par.c index 4695390a2..638d0dc3c 100644 --- a/src/spicelib/devices/jfet2/jfet2par.c +++ b/src/spicelib/devices/jfet2/jfet2par.c @@ -10,7 +10,6 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker ) */ #include "ngspice.h" -#include #include "const.h" #include "ifsim.h" #include "jfet2defs.h" @@ -20,11 +19,7 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker ) /* ARGSUSED */ int -JFET2param(param,value,inst,select) - int param; - IFvalue *value; - GENinstance *inst; - IFvalue *select; +JFET2param(int param, IFvalue *value, GENinstance *inst, IFvalue *select) { JFET2instance *here = (JFET2instance *)inst; switch(param) { @@ -32,10 +27,18 @@ JFET2param(param,value,inst,select) here->JFET2temp = value->rValue+CONSTCtoK; here->JFET2tempGiven = TRUE; break; + case JFET2_DTEMP: + here->JFET2temp = value->rValue; + here->JFET2tempGiven = TRUE; + break; case JFET2_AREA: here->JFET2area = value->rValue; here->JFET2areaGiven = TRUE; break; + case JFET2_M: + here->JFET2m = value->rValue; + here->JFET2mGiven = TRUE; + break; case JFET2_IC_VDS: here->JFET2icVDS = value->rValue; here->JFET2icVDSGiven = TRUE; diff --git a/src/spicelib/devices/jfet2/jfet2set.c b/src/spicelib/devices/jfet2/jfet2set.c index 7cd8ca6a3..ba096efb2 100644 --- a/src/spicelib/devices/jfet2/jfet2set.c +++ b/src/spicelib/devices/jfet2/jfet2set.c @@ -9,7 +9,6 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) **********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "jfet2defs.h" @@ -18,11 +17,7 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) #include "suffix.h" int -JFET2setup(matrix,inModel,ckt,states) - SMPmatrix *matrix; - GENmodel *inModel; - CKTcircuit *ckt; - int *states; +JFET2setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) /* load the diode structure with those pointers needed later * for fast matrix loading */ @@ -50,6 +45,11 @@ JFET2setup(matrix,inModel,ckt,states) if(!here->JFET2areaGiven) { here->JFET2area = 1; } + + if(!here->JFET2mGiven) { + here->JFET2m = 1; + } + here->JFET2state = *states; *states += JFET2_STATE_COUNT + 1; @@ -58,6 +58,19 @@ matrixpointers2: error = CKTmkVolt(ckt,&tmp,here->JFET2name,"source"); if(error) return(error); here->JFET2sourcePrimeNode = tmp->number; + + if (ckt->CKTcopyNodesets) { + CKTnode *tmpNode; + IFuid tmpName; + + if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } + } + } else { here->JFET2sourcePrimeNode = here->JFET2sourceNode; } @@ -65,6 +78,19 @@ matrixpointers2: error = CKTmkVolt(ckt,&tmp,here->JFET2name,"drain"); if(error) return(error); here->JFET2drainPrimeNode = tmp->number; + + if (ckt->CKTcopyNodesets) { + CKTnode *tmpNode; + IFuid tmpName; + + if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { + if (tmpNode->nsGiven) { + tmp->nodeset=tmpNode->nodeset; + tmp->nsGiven=tmpNode->nsGiven; + } + } + } + } else { here->JFET2drainPrimeNode = here->JFET2drainNode; } @@ -102,9 +128,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ } int -JFET2unsetup(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +JFET2unsetup(GENmodel *inModel, CKTcircuit *ckt) { JFET2model *model; JFET2instance *here; diff --git a/src/spicelib/devices/jfet2/jfet2temp.c b/src/spicelib/devices/jfet2/jfet2temp.c index 64c919806..361b4d65a 100644 --- a/src/spicelib/devices/jfet2/jfet2temp.c +++ b/src/spicelib/devices/jfet2/jfet2temp.c @@ -11,7 +11,6 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) **********/ #include "ngspice.h" -#include #include "smpdefs.h" #include "cktdefs.h" #include "jfet2defs.h" @@ -21,9 +20,7 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker ) #include "suffix.h" int -JFET2temp(inModel,ckt) - GENmodel *inModel; - CKTcircuit *ckt; +JFET2temp(GENmodel *inModel, CKTcircuit *ckt) /* Pre-process the model parameters after a possible change */ { @@ -83,9 +80,17 @@ JFET2temp(inModel,ckt) /* loop through all the instances of the model */ for (here = model->JFET2instances; here != NULL ; here=here->JFET2nextInstance) { + + if (here->JFET2owner != ARCHme) continue; + + if(!(here->JFET2dtempGiven)) { + here->JFET2dtemp = 0.0; + } + if(!(here->JFET2tempGiven)) { - here->JFET2temp = ckt->CKTtemp; + here->JFET2temp = ckt->CKTtemp + here->JFET2dtemp; } + vt = here->JFET2temp * CONSTKoverQ; fact2 = here->JFET2temp/REFTEMP; ratio1 = here->JFET2temp/model->JFET2tnom -1; diff --git a/src/spicelib/devices/jfet2/jfet2trun.c b/src/spicelib/devices/jfet2/jfet2trun.c index 9df728ad4..c285e177e 100644 --- a/src/spicelib/devices/jfet2/jfet2trun.c +++ b/src/spicelib/devices/jfet2/jfet2trun.c @@ -10,7 +10,6 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker ) */ #include "ngspice.h" -#include #include "cktdefs.h" #include "jfet2defs.h" #include "sperror.h" @@ -18,10 +17,7 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker ) int -JFET2trunc(inModel,ckt,timeStep) - GENmodel *inModel; - CKTcircuit *ckt; - double *timeStep; +JFET2trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep) { JFET2model *model = (JFET2model*)inModel; JFET2instance *here;