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;