Browse Source

Added dtemp and "m" to JFET2 and updated DEVICES file.

pre-master-46
pnenzi 23 years ago
parent
commit
1def649a82
  1. 8
      ChangeLog
  2. 19
      DEVICES
  3. 3
      src/spicelib/devices/jfet2/jfet2.c
  4. 67
      src/spicelib/devices/jfet2/jfet2acld.c
  5. 30
      src/spicelib/devices/jfet2/jfet2ask.c
  6. 6
      src/spicelib/devices/jfet2/jfet2defs.h
  7. 6
      src/spicelib/devices/jfet2/jfet2del.c
  8. 4
      src/spicelib/devices/jfet2/jfet2dest.c
  9. 19
      src/spicelib/devices/jfet2/jfet2ext.h
  10. 5
      src/spicelib/devices/jfet2/jfet2ic.c
  11. 46
      src/spicelib/devices/jfet2/jfet2load.c
  12. 7
      src/spicelib/devices/jfet2/jfet2mask.c
  13. 6
      src/spicelib/devices/jfet2/jfet2mdel.c
  14. 6
      src/spicelib/devices/jfet2/jfet2mpar.c
  15. 18
      src/spicelib/devices/jfet2/jfet2noi.c
  16. 15
      src/spicelib/devices/jfet2/jfet2par.c
  17. 42
      src/spicelib/devices/jfet2/jfet2set.c
  18. 15
      src/spicelib/devices/jfet2/jfet2temp.c
  19. 6
      src/spicelib/devices/jfet2/jfet2trun.c

8
ChangeLog

@ -1,3 +1,11 @@
2003-12-27 Paolo Nenzi <p.nenzi@ieee.org>
* 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 <p.nenzi@ieee.org> 2003-12-26 Paolo Nenzi <p.nenzi@ieee.org>
* src/spicelib/devices/jfet/*: Added parallel multiplier and * src/spicelib/devices/jfet/*: Added parallel multiplier and

19
DEVICES

@ -185,8 +185,23 @@ JFET - Junction Field Effect transistor
- Parallel multiplier - Parallel multiplier
- Instance temperature as difference for circuit temperature - 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 *************************** *************************** HFET devices ***************************

3
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 "ngspice.h"
#include <stdio.h>
#include "ifsim.h" #include "ifsim.h"
#include "devdefs.h" #include "devdefs.h"
#include "jfet2defs.h" #include "jfet2defs.h"
@ -20,9 +19,11 @@ IFparm JFET2pTable[] = { /* device parameters */
IOPU("off", JFET2_OFF, IF_FLAG, "Device initially off"), IOPU("off", JFET2_OFF, IF_FLAG, "Device initially off"),
IOPAU("ic", JFET2_IC, IF_REALVEC,"Initial VDS,VGS vector"), IOPAU("ic", JFET2_IC, IF_REALVEC,"Initial VDS,VGS vector"),
IOPU("area", JFET2_AREA, IF_REAL, "Area factor"), 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-vds", JFET2_IC_VDS, IF_REAL, "Initial D-S voltage"),
IOPAU("ic-vgs", JFET2_IC_VGS, IF_REAL, "Initial G-S volrage"), IOPAU("ic-vgs", JFET2_IC_VGS, IF_REAL, "Initial G-S volrage"),
IOPU("temp", JFET2_TEMP, IF_REAL, "Instance temperature"), 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("drain-node", JFET2_DRAINNODE, IF_INTEGER,"Number of drain node"),
OPU("gate-node", JFET2_GATENODE, IF_INTEGER,"Number of gate node"), OPU("gate-node", JFET2_GATENODE, IF_INTEGER,"Number of gate node"),
OPU("source-node", JFET2_SOURCENODE, IF_INTEGER,"Number of source node"), OPU("source-node", JFET2_SOURCENODE, IF_INTEGER,"Number of source node"),

67
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 "ngspice.h"
#include <stdio.h>
#include "cktdefs.h" #include "cktdefs.h"
#include "jfet2defs.h" #include "jfet2defs.h"
#include "sperror.h" #include "sperror.h"
@ -17,9 +16,7 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker )
#include "suffix.h" #include "suffix.h"
int int
JFET2acLoad(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
JFET2acLoad(GENmodel *inModel, CKTcircuit *ckt)
{ {
JFET2model *model = (JFET2model*)inModel; JFET2model *model = (JFET2model*)inModel;
JFET2instance *here; JFET2instance *here;
@ -33,10 +30,13 @@ JFET2acLoad(inModel,ckt)
double xgd; double xgd;
double xgm, xgds, vgd, vgs, cd; double xgm, xgds, vgd, vgs, cd;
double m;
for( ; model != NULL; model = model->JFET2nextModel ) { for( ; model != NULL; model = model->JFET2nextModel ) {
for( here = model->JFET2instances; here != NULL; for( here = model->JFET2instances; here != NULL;
here = here->JFET2nextInstance) { here = here->JFET2nextInstance) {
if (here->JFET2owner != ARCHme) continue; if (here->JFET2owner != ARCHme) continue;
gdpr=model->JFET2drainConduct * here->JFET2area; gdpr=model->JFET2drainConduct * here->JFET2area;
@ -54,35 +54,38 @@ JFET2acLoad(inModel,ckt)
PSacload(ckt,model, here, vgs, vgd, cd, ckt->CKTomega, PSacload(ckt,model, here, vgs, vgd, cd, ckt->CKTomega,
&gm, &xgm, &gds, &xgds); &gm, &xgm, &gds, &xgds);
xgds += *(ckt->CKTstate0 + here->JFET2qds) * ckt->CKTomega ; 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);
} }
} }

30
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 "ngspice.h"
#include <stdio.h>
#include "const.h" #include "const.h"
#include "ifsim.h" #include "ifsim.h"
#include "cktdefs.h" #include "cktdefs.h"
@ -21,12 +20,8 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker )
/*ARGSUSED*/ /*ARGSUSED*/
int 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; JFET2instance *here = (JFET2instance*)inst;
static char *msg = "Current and power not available for ac analysis"; static char *msg = "Current and power not available for ac analysis";
@ -34,8 +29,15 @@ JFET2ask(ckt,inst,which,value,select)
case JFET2_TEMP: case JFET2_TEMP:
value->rValue = here->JFET2temp-CONSTCtoK; value->rValue = here->JFET2temp-CONSTCtoK;
return(OK); return(OK);
case JFET2_DTEMP:
value->rValue = here->JFET2dtemp;
return(OK);
case JFET2_AREA: case JFET2_AREA:
value->rValue = here->JFET2area; value->rValue = here->JFET2area;
value->rValue *=here->JFET2m;
return(OK);
case JFET2_M:
value->rValue = here->JFET2m;
return(OK); return(OK);
case JFET2_IC_VDS: case JFET2_IC_VDS:
value->rValue = here->JFET2icVDS; value->rValue = here->JFET2icVDS;
@ -69,36 +71,47 @@ JFET2ask(ckt,inst,which,value,select)
return(OK); return(OK);
case JFET2_CG: case JFET2_CG:
value->rValue = *(ckt->CKTstate0 + here->JFET2cg); value->rValue = *(ckt->CKTstate0 + here->JFET2cg);
value->rValue *=here->JFET2m;
return(OK); return(OK);
case JFET2_CD: case JFET2_CD:
value->rValue = *(ckt->CKTstate0 + here->JFET2cd); value->rValue = *(ckt->CKTstate0 + here->JFET2cd);
value->rValue *=here->JFET2m;
return(OK); return(OK);
case JFET2_CGD: case JFET2_CGD:
value->rValue = *(ckt->CKTstate0 + here->JFET2cgd); value->rValue = *(ckt->CKTstate0 + here->JFET2cgd);
value->rValue *=here->JFET2m;
return(OK); return(OK);
case JFET2_GM: case JFET2_GM:
value->rValue = *(ckt->CKTstate0 + here->JFET2gm); value->rValue = *(ckt->CKTstate0 + here->JFET2gm);
value->rValue *=here->JFET2m;
return(OK); return(OK);
case JFET2_GDS: case JFET2_GDS:
value->rValue = *(ckt->CKTstate0 + here->JFET2gds); value->rValue = *(ckt->CKTstate0 + here->JFET2gds);
value->rValue *=here->JFET2m;
return(OK); return(OK);
case JFET2_GGS: case JFET2_GGS:
value->rValue = *(ckt->CKTstate0 + here->JFET2ggs); value->rValue = *(ckt->CKTstate0 + here->JFET2ggs);
value->rValue *=here->JFET2m;
return(OK); return(OK);
case JFET2_GGD: case JFET2_GGD:
value->rValue = *(ckt->CKTstate0 + here->JFET2ggd); value->rValue = *(ckt->CKTstate0 + here->JFET2ggd);
value->rValue *=here->JFET2m;
return(OK); return(OK);
case JFET2_QGS: case JFET2_QGS:
value->rValue = *(ckt->CKTstate0 + here->JFET2qgs); value->rValue = *(ckt->CKTstate0 + here->JFET2qgs);
value->rValue *=here->JFET2m;
return(OK); return(OK);
case JFET2_CQGS: case JFET2_CQGS:
value->rValue = *(ckt->CKTstate0 + here->JFET2cqgs); value->rValue = *(ckt->CKTstate0 + here->JFET2cqgs);
value->rValue *=here->JFET2m;
return(OK); return(OK);
case JFET2_QGD: case JFET2_QGD:
value->rValue = *(ckt->CKTstate0 + here->JFET2qgd); value->rValue = *(ckt->CKTstate0 + here->JFET2qgd);
value->rValue *=here->JFET2m;
return(OK); return(OK);
case JFET2_CQGD: case JFET2_CQGD:
value->rValue = *(ckt->CKTstate0 + here->JFET2cqgd); value->rValue = *(ckt->CKTstate0 + here->JFET2cqgd);
value->rValue *=here->JFET2m;
return(OK); return(OK);
case JFET2_VTRAP: case JFET2_VTRAP:
value->rValue = *(ckt->CKTstate0 + here->JFET2vtrap); value->rValue = *(ckt->CKTstate0 + here->JFET2vtrap);
@ -115,6 +128,7 @@ JFET2ask(ckt,inst,which,value,select)
} else { } else {
value->rValue = -*(ckt->CKTstate0 + here->JFET2cd); value->rValue = -*(ckt->CKTstate0 + here->JFET2cd);
value->rValue -= *(ckt->CKTstate0 + here->JFET2cg); value->rValue -= *(ckt->CKTstate0 + here->JFET2cg);
value->rValue *=here->JFET2m;
} }
return(OK); return(OK);
case JFET2_POWER : case JFET2_POWER :
@ -131,6 +145,8 @@ JFET2ask(ckt,inst,which,value,select)
value->rValue -= (*(ckt->CKTstate0 + here->JFET2cd) + value->rValue -= (*(ckt->CKTstate0 + here->JFET2cd) +
*(ckt->CKTstate0 + here->JFET2cg)) * *(ckt->CKTstate0 + here->JFET2cg)) *
*(ckt->CKTrhsOld + here->JFET2sourceNode); *(ckt->CKTrhsOld + here->JFET2sourceNode);
value->rValue *=here->JFET2m;
} }
return(OK); return(OK);
default: default:

6
src/spicelib/devices/jfet2/jfet2defs.h

@ -132,15 +132,19 @@ typedef struct sJFET2instance {
unsigned JFET2off :1; /* 'off' flag for jfet */ unsigned JFET2off :1; /* 'off' flag for jfet */
unsigned JFET2areaGiven : 1; /* flag to indicate area was specified */ 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 JFET2icVDSGiven : 1; /* initial condition given flag for V D-S*/
unsigned JFET2icVGSGiven : 1; /* initial condition given flag for V G-S*/ unsigned JFET2icVGSGiven : 1; /* initial condition given flag for V G-S*/
unsigned JFET2tempGiven : 1; /* flag to indicate instance temp given */ 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 JFET2area; /* area factor for the jfet */
double JFET2m; /* parallel multiplier for the diode */
double JFET2icVDS; /* initial condition voltage D-S*/ double JFET2icVDS; /* initial condition voltage D-S*/
double JFET2icVGS; /* initial condition voltage G-S*/ double JFET2icVGS; /* initial condition voltage G-S*/
double JFET2temp; /* operating temperature */ double JFET2temp; /* operating temperature */
double JFET2dtemp; /* Instance temperature difference */
double JFET2tSatCur; /* temperature adjusted saturation current */ double JFET2tSatCur; /* temperature adjusted saturation current */
double JFET2tGatePot; /* temperature adjusted gate potential */ double JFET2tGatePot; /* temperature adjusted gate potential */
double JFET2tCGS; /* temperature corrected G-S capacitance */ 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_IC 4
#define JFET2_OFF 5 #define JFET2_OFF 5
#define JFET2_TEMP 6 #define JFET2_TEMP 6
#define JFET2_DTEMP 7
#define JFET2_M 8
/* device questions */ /* device questions */
#define JFET2_DRAINNODE 301 #define JFET2_DRAINNODE 301

6
src/spicelib/devices/jfet2/jfet2del.c

@ -8,17 +8,13 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker )
**********/ **********/
#include "ngspice.h" #include "ngspice.h"
#include <stdio.h>
#include "jfet2defs.h" #include "jfet2defs.h"
#include "sperror.h" #include "sperror.h"
#include "suffix.h" #include "suffix.h"
int int
JFET2delete(inModel,name,inst)
GENmodel *inModel;
IFuid name;
GENinstance **inst;
JFET2delete(GENmodel *inModel, IFuid name, GENinstance **inst)
{ {
JFET2model *model = (JFET2model*)inModel; JFET2model *model = (JFET2model*)inModel;
JFET2instance **fast = (JFET2instance**)inst; JFET2instance **fast = (JFET2instance**)inst;

4
src/spicelib/devices/jfet2/jfet2dest.c

@ -10,14 +10,12 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker )
*/ */
#include "ngspice.h" #include "ngspice.h"
#include <stdio.h>
#include "jfet2defs.h" #include "jfet2defs.h"
#include "suffix.h" #include "suffix.h"
void void
JFET2destroy(inModel)
GENmodel **inModel;
JFET2destroy(GENmodel **inModel)
{ {
JFET2model **model = (JFET2model**)inModel; JFET2model **model = (JFET2model**)inModel;
JFET2instance *here; JFET2instance *here;

19
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. Copyright 1994 Macquarie University, Sydney Australia.
**********/ **********/
#ifdef __STDC__
extern int JFET2acLoad(GENmodel*,CKTcircuit*); extern int JFET2acLoad(GENmodel*,CKTcircuit*);
extern int JFET2ask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*); extern int JFET2ask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*);
extern int JFET2delete(GENmodel*,IFuid,GENinstance**); extern int JFET2delete(GENmodel*,IFuid,GENinstance**);
@ -23,21 +22,3 @@ extern int JFET2unsetup(GENmodel*,CKTcircuit*);
extern int JFET2temp(GENmodel*,CKTcircuit*); extern int JFET2temp(GENmodel*,CKTcircuit*);
extern int JFET2trunc(GENmodel*,CKTcircuit*,double*); extern int JFET2trunc(GENmodel*,CKTcircuit*,double*);
extern int JFET2noise(int,int,GENmodel*,CKTcircuit*,Ndata*,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 */

5
src/spicelib/devices/jfet2/jfet2ic.c

@ -10,7 +10,6 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker )
*/ */
#include "ngspice.h" #include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h" #include "cktdefs.h"
#include "jfet2defs.h" #include "jfet2defs.h"
#include "sperror.h" #include "sperror.h"
@ -18,9 +17,7 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker )
int int
JFET2getic(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
JFET2getic(GENmodel *inModel, CKTcircuit *ckt)
{ {
JFET2model *model = (JFET2model*)inModel; JFET2model *model = (JFET2model*)inModel;
JFET2instance *here; JFET2instance *here;

46
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 "ngspice.h"
#include <stdio.h>
#include "cktdefs.h" #include "cktdefs.h"
#include "jfet2defs.h" #include "jfet2defs.h"
#include "const.h" #include "const.h"
@ -20,9 +19,7 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker )
#include "suffix.h" #include "suffix.h"
int int
JFET2load(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
JFET2load(GENmodel *inModel, CKTcircuit *ckt)
/* actually load the current resistance value into the /* actually load the current resistance value into the
* sparse matrix previously provided * sparse matrix previously provided
*/ */
@ -58,6 +55,8 @@ JFET2load(inModel,ckt)
int ichk1; int ichk1;
int error; int error;
double m;
/* loop through all the models */ /* loop through all the models */
for( ; model != NULL; model = model->JFET2nextModel ) { for( ; model != NULL; model = model->JFET2nextModel ) {
@ -293,32 +292,35 @@ JFET2load(inModel,ckt)
* load current vector * load current vector
*/ */
load: load:
m = here->JFET2m;
ceqgd=model->JFET2type*(cgd-ggd*vgd); ceqgd=model->JFET2type*(cgd-ggd*vgd);
ceqgs=model->JFET2type*((cg-cgd)-ggs*vgs); ceqgs=model->JFET2type*((cg-cgd)-ggs*vgs);
cdreq=model->JFET2type*((cd+cgd)-gds*vds-gm*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) += *(ckt->CKTrhs + here->JFET2drainPrimeNode) +=
(-cdreq+ceqgd);
m * (-cdreq+ceqgd);
*(ckt->CKTrhs + here->JFET2sourcePrimeNode) += *(ckt->CKTrhs + here->JFET2sourcePrimeNode) +=
(cdreq+ceqgs);
m * (cdreq+ceqgs);
/* /*
* load y matrix * 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); return(OK);

7
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 "ngspice.h"
#include <stdio.h>
#include "const.h" #include "const.h"
#include "ifsim.h" #include "ifsim.h"
#include "cktdefs.h" #include "cktdefs.h"
@ -23,11 +22,7 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker )
/*ARGSUSED*/ /*ARGSUSED*/
int 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; JFET2model *model = (JFET2model*)inModel;
switch(which) { switch(which) {

6
src/spicelib/devices/jfet2/jfet2mdel.c

@ -10,17 +10,13 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker )
*/ */
#include "ngspice.h" #include "ngspice.h"
#include <stdio.h>
#include "jfet2defs.h" #include "jfet2defs.h"
#include "sperror.h" #include "sperror.h"
#include "suffix.h" #include "suffix.h"
int int
JFET2mDelete(inModel,modname,kill)
GENmodel **inModel;
IFuid modname;
GENmodel *kill;
JFET2mDelete(GENmodel **inModel, IFuid modname, GENmodel *kill)
{ {
JFET2model **model = (JFET2model**)inModel; JFET2model **model = (JFET2model**)inModel;
JFET2model *modfast = (JFET2model*)kill; JFET2model *modfast = (JFET2model*)kill;

6
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 "ngspice.h"
#include <stdio.h>
#include "const.h" #include "const.h"
#include "ifsim.h" #include "ifsim.h"
#include "jfet2defs.h" #include "jfet2defs.h"
@ -18,10 +17,7 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker )
int int
JFET2mParam(param,value,inModels)
int param;
IFvalue *value;
GENmodel *inModels;
JFET2mParam(int param, IFvalue *value, GENmodel *inModels)
{ {
JFET2model *model = (JFET2model*)inModels; JFET2model *model = (JFET2model*)inModels;
switch(param) { switch(param) {

18
src/spicelib/devices/jfet2/jfet2noi.c

@ -8,7 +8,6 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker )
**********/ **********/
#include "ngspice.h" #include "ngspice.h"
#include <stdio.h>
#include "jfet2defs.h" #include "jfet2defs.h"
#include "cktdefs.h" #include "cktdefs.h"
#include "iferrmsg.h" #include "iferrmsg.h"
@ -28,13 +27,7 @@ extern void NevalSrc();
extern double Nintegrate(); extern double Nintegrate();
int 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 *firstModel = (JFET2model *) genmodel;
JFET2model *model; JFET2model *model;
@ -123,21 +116,22 @@ if (!data->namelist) return(E_NOMEM);
case N_DENS: case N_DENS:
NevalSrc(&noizDens[JFET2RDNOIZ],&lnNdens[JFET2RDNOIZ], NevalSrc(&noizDens[JFET2RDNOIZ],&lnNdens[JFET2RDNOIZ],
ckt,THERMNOISE,inst->JFET2drainPrimeNode,inst->JFET2drainNode, ckt,THERMNOISE,inst->JFET2drainPrimeNode,inst->JFET2drainNode,
model->JFET2drainConduct * inst->JFET2area);
model->JFET2drainConduct * inst->JFET2area * inst->JFET2m);
NevalSrc(&noizDens[JFET2RSNOIZ],&lnNdens[JFET2RSNOIZ], NevalSrc(&noizDens[JFET2RSNOIZ],&lnNdens[JFET2RSNOIZ],
ckt,THERMNOISE,inst->JFET2sourcePrimeNode, ckt,THERMNOISE,inst->JFET2sourcePrimeNode,
inst->JFET2sourceNode,model->JFET2sourceConduct*inst->JFET2area);
inst->JFET2sourceNode,model->JFET2sourceConduct
* inst->JFET2area * inst->JFET2m);
NevalSrc(&noizDens[JFET2IDNOIZ],&lnNdens[JFET2IDNOIZ], NevalSrc(&noizDens[JFET2IDNOIZ],&lnNdens[JFET2IDNOIZ],
ckt,THERMNOISE,inst->JFET2drainPrimeNode, ckt,THERMNOISE,inst->JFET2drainPrimeNode,
inst->JFET2sourcePrimeNode, 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, NevalSrc(&noizDens[JFET2FLNOIZ],(double*)NULL,ckt,
N_GAIN,inst->JFET2drainPrimeNode, N_GAIN,inst->JFET2drainPrimeNode,
inst->JFET2sourcePrimeNode, (double)0.0); inst->JFET2sourcePrimeNode, (double)0.0);
noizDens[JFET2FLNOIZ] *= model->JFET2fNcoef *
noizDens[JFET2FLNOIZ] *= inst->JFET2m * model->JFET2fNcoef *
exp(model->JFET2fNexp * exp(model->JFET2fNexp *
log(MAX(fabs(*(ckt->CKTstate0 + inst->JFET2cd)),N_MINLOG))) / log(MAX(fabs(*(ckt->CKTstate0 + inst->JFET2cd)),N_MINLOG))) /
data->freq; data->freq;

15
src/spicelib/devices/jfet2/jfet2par.c

@ -10,7 +10,6 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker )
*/ */
#include "ngspice.h" #include "ngspice.h"
#include <stdio.h>
#include "const.h" #include "const.h"
#include "ifsim.h" #include "ifsim.h"
#include "jfet2defs.h" #include "jfet2defs.h"
@ -20,11 +19,7 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker )
/* ARGSUSED */ /* ARGSUSED */
int 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; JFET2instance *here = (JFET2instance *)inst;
switch(param) { switch(param) {
@ -32,10 +27,18 @@ JFET2param(param,value,inst,select)
here->JFET2temp = value->rValue+CONSTCtoK; here->JFET2temp = value->rValue+CONSTCtoK;
here->JFET2tempGiven = TRUE; here->JFET2tempGiven = TRUE;
break; break;
case JFET2_DTEMP:
here->JFET2temp = value->rValue;
here->JFET2tempGiven = TRUE;
break;
case JFET2_AREA: case JFET2_AREA:
here->JFET2area = value->rValue; here->JFET2area = value->rValue;
here->JFET2areaGiven = TRUE; here->JFET2areaGiven = TRUE;
break; break;
case JFET2_M:
here->JFET2m = value->rValue;
here->JFET2mGiven = TRUE;
break;
case JFET2_IC_VDS: case JFET2_IC_VDS:
here->JFET2icVDS = value->rValue; here->JFET2icVDS = value->rValue;
here->JFET2icVDSGiven = TRUE; here->JFET2icVDSGiven = TRUE;

42
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 "ngspice.h"
#include <stdio.h>
#include "smpdefs.h" #include "smpdefs.h"
#include "cktdefs.h" #include "cktdefs.h"
#include "jfet2defs.h" #include "jfet2defs.h"
@ -18,11 +17,7 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker )
#include "suffix.h" #include "suffix.h"
int 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 /* load the diode structure with those pointers needed later
* for fast matrix loading * for fast matrix loading
*/ */
@ -50,6 +45,11 @@ JFET2setup(matrix,inModel,ckt,states)
if(!here->JFET2areaGiven) { if(!here->JFET2areaGiven) {
here->JFET2area = 1; here->JFET2area = 1;
} }
if(!here->JFET2mGiven) {
here->JFET2m = 1;
}
here->JFET2state = *states; here->JFET2state = *states;
*states += JFET2_STATE_COUNT + 1; *states += JFET2_STATE_COUNT + 1;
@ -58,6 +58,19 @@ matrixpointers2:
error = CKTmkVolt(ckt,&tmp,here->JFET2name,"source"); error = CKTmkVolt(ckt,&tmp,here->JFET2name,"source");
if(error) return(error); if(error) return(error);
here->JFET2sourcePrimeNode = tmp->number; 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 { } else {
here->JFET2sourcePrimeNode = here->JFET2sourceNode; here->JFET2sourcePrimeNode = here->JFET2sourceNode;
} }
@ -65,6 +78,19 @@ matrixpointers2:
error = CKTmkVolt(ckt,&tmp,here->JFET2name,"drain"); error = CKTmkVolt(ckt,&tmp,here->JFET2name,"drain");
if(error) return(error); if(error) return(error);
here->JFET2drainPrimeNode = tmp->number; 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 { } else {
here->JFET2drainPrimeNode = here->JFET2drainNode; here->JFET2drainPrimeNode = here->JFET2drainNode;
} }
@ -102,9 +128,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
} }
int int
JFET2unsetup(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
JFET2unsetup(GENmodel *inModel, CKTcircuit *ckt)
{ {
JFET2model *model; JFET2model *model;
JFET2instance *here; JFET2instance *here;

15
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 "ngspice.h"
#include <stdio.h>
#include "smpdefs.h" #include "smpdefs.h"
#include "cktdefs.h" #include "cktdefs.h"
#include "jfet2defs.h" #include "jfet2defs.h"
@ -21,9 +20,7 @@ Modified to add PS model and new parameter definitions ( Anthony E. Parker )
#include "suffix.h" #include "suffix.h"
int int
JFET2temp(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
JFET2temp(GENmodel *inModel, CKTcircuit *ckt)
/* Pre-process the model parameters after a possible change /* Pre-process the model parameters after a possible change
*/ */
{ {
@ -83,9 +80,17 @@ JFET2temp(inModel,ckt)
/* loop through all the instances of the model */ /* loop through all the instances of the model */
for (here = model->JFET2instances; here != NULL ; for (here = model->JFET2instances; here != NULL ;
here=here->JFET2nextInstance) { here=here->JFET2nextInstance) {
if (here->JFET2owner != ARCHme) continue;
if(!(here->JFET2dtempGiven)) {
here->JFET2dtemp = 0.0;
}
if(!(here->JFET2tempGiven)) { if(!(here->JFET2tempGiven)) {
here->JFET2temp = ckt->CKTtemp;
here->JFET2temp = ckt->CKTtemp + here->JFET2dtemp;
} }
vt = here->JFET2temp * CONSTKoverQ; vt = here->JFET2temp * CONSTKoverQ;
fact2 = here->JFET2temp/REFTEMP; fact2 = here->JFET2temp/REFTEMP;
ratio1 = here->JFET2temp/model->JFET2tnom -1; ratio1 = here->JFET2temp/model->JFET2tnom -1;

6
src/spicelib/devices/jfet2/jfet2trun.c

@ -10,7 +10,6 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker )
*/ */
#include "ngspice.h" #include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h" #include "cktdefs.h"
#include "jfet2defs.h" #include "jfet2defs.h"
#include "sperror.h" #include "sperror.h"
@ -18,10 +17,7 @@ Modified to jfet2 for PS model definition ( Anthony E. Parker )
int int
JFET2trunc(inModel,ckt,timeStep)
GENmodel *inModel;
CKTcircuit *ckt;
double *timeStep;
JFET2trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep)
{ {
JFET2model *model = (JFET2model*)inModel; JFET2model *model = (JFET2model*)inModel;
JFET2instance *here; JFET2instance *here;

Loading…
Cancel
Save