Added dtemp and "m" to hfet1, pole-zero analysis and corrected a bug in unsetup function. Added two test netlists.

This commit is contained in:
pnenzi 2003-12-30 09:20:47 +00:00
parent 1def649a82
commit dab7eea4f5
23 changed files with 425 additions and 192 deletions

View File

@ -1,3 +1,14 @@
2003-12-30 Paolo Nenzi <p.nenzi@ieee.org>
* src/spicelib/devices/hfet1/*: Added parallel multiplier and "dtemp" to
the code. Added the pole-zero analysis and parallel code checks.
Corrected a bug in the unsetup function that caused a segfault.
* tests/hfet/, tests/hfet/id_vgs.cir, tests/inverter.cir: added hfet
test netlists.
* DEVICES: updated hfet1 status.
2003-12-27 Paolo Nenzi <p.nenzi@ieee.org>
* src/spicelib/devices/jfet2/*: Added parallel multiplier and "dtemp"

16
DEVICES
View File

@ -207,8 +207,20 @@ JFET2 - Junction Field Effect Transistor (PS model)
*************************** HFET devices ***************************
***************************************************************************
HFET - HFET Level 1
Initial release.
HFET - HFET Level 1 (Ytterdal)
Initial Release.
Ver: N/A
Class: Z
Level: 5
Status:
Enhancements over the original model:
- Parallel multiplier
- Instance temperature as difference for circuit temperature
- Added pole-zero analysis
HFET2 - HFET Level 2
Initial release.

View File

@ -19,6 +19,7 @@ libhfet_a_SOURCES = \
hfetmdel.c \
hfetmpar.c \
hfetparam.c \
hfetpzl.c \
hfetsetup.c \
hfettemp.c \
hfettrunc.c

View File

@ -1,5 +1,9 @@
/**********
Imported from MacSpice3f4 - Antony Wilson
Modified: Paolo Nenzi
**********/
#include "ngspice.h"
#include <stdio.h>
#include "ifsim.h"
#include "devdefs.h"
#include "hfetdefs.h"
@ -10,9 +14,11 @@ IFparm HFETApTable[] = { /* parameters */
OP("off", HFETA_OFF, IF_FLAG ,"Device initially off"),
IOP("l", HFETA_LENGTH, IF_REAL ,"Length of device"),
IOP("w", HFETA_WIDTH, IF_REAL ,"Width of device"),
IOP("m", HFETA_M, IF_REAL ,"Parallel Multiplier"),
IOP("icvds", HFETA_IC_VDS, IF_REAL ,"Initial D-S voltage"),
IOP("icvgs", HFETA_IC_VGS, IF_REAL ,"Initial G-S voltage"),
IOP("temp", HFETA_TEMP, IF_REAL ,"Instance temperature"),
IOP("dtemp", HFETA_DTEMP, IF_REAL ,"Instance temperature difference"),
OP("dnode", HFETA_DRAINNODE, IF_INTEGER,"Number of drain node"),
OP("gnode", HFETA_GATENODE, IF_INTEGER,"Number of gate node"),
OP("snode", HFETA_SOURCENODE, IF_INTEGER,"Number of source node"),

View File

@ -1,6 +1,9 @@
/**********
Imported from MacSpice3f4 - Antony Wilson
Modified: Paolo Nenzi
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "hfetdefs.h"
#include "sperror.h"
@ -8,9 +11,7 @@
int
HFETAacLoad(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
HFETAacLoad(GENmodel *inModel, CKTcircuit *ckt)
{
HFETAmodel *model = (HFETAmodel*)inModel;
HFETAinstance *here;
@ -25,11 +26,15 @@ HFETAacLoad(inModel,ckt)
double ggdpp;
double f;
double m;
for( ; model != NULL; model = model->HFETAnextModel )
{
for( here = model->HFETAinstances; here != NULL;
here = here->HFETAnextInstance)
{
here = here->HFETAnextInstance) {
if (here->HFETAowner != ARCHme) continue;
gm = *(ckt->CKTstate0 + here->HFETAgm);
gds = *(ckt->CKTstate0 + here->HFETAgds);
xds = CDS*ckt->CKTomega;
@ -43,45 +48,48 @@ HFETAacLoad(inModel,ckt)
f = ckt->CKTomega/2/M_PI;
gds = gds*(1+0.5*model->HFETAkappa*(1+tanh((f-here->HFETAfgds)/here->HFETAdelf)));
}
*(here->HFETAdrainDrainPtr) += model->HFETAdrainConduct;
*(here->HFETAsourceSourcePtr) += model->HFETAsourceConduct;
*(here->HFETAgatePrimeGatePrimePtr) += (ggd+ggs+ggspp+ggdpp+model->HFETAgateConduct);
*(here->HFETAdrainPrimeDrainPrimePtr) += (gds+ggd+model->HFETAdrainConduct+model->HFETAgf);
*(here->HFETAsourcePrimeSourcePrimePtr) += (gds+gm+ggs+model->HFETAsourceConduct+model->HFETAgi);
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += (model->HFETAgi+ggspp);
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += (model->HFETAgf+ggdpp);
*(here->HFETAdrainDrainPrimePtr) -= model->HFETAdrainConduct;
*(here->HFETAdrainPrimeDrainPtr) -= model->HFETAdrainConduct;
*(here->HFETAsourceSourcePrimePtr) -= model->HFETAsourceConduct;
*(here->HFETAsourcePrimeSourcePtr) -= model->HFETAsourceConduct;
*(here->HFETAgatePrimeDrainPrimePtr) -= ggd;
*(here->HFETAdrainPrimeGatePrimePtr) += (gm-ggd);
*(here->HFETAgatePrimeSourcePrimePtr) -= ggs;
*(here->HFETAsourcePrimeGatePrimePtr) += (-ggs-gm);
*(here->HFETAdrainPrimeSourcePrimePtr) += (-gds-gm);
*(here->HFETAsourcePrimeDrainPrimePtr) -= gds;
*(here->HFETAsourcePrimeSourcePrmPrmPtr) -= model->HFETAgi;
*(here->HFETAsourcePrmPrmSourcePrimePtr) -= model->HFETAgi;
*(here->HFETAgatePrimeSourcePrmPrmPtr) -= ggspp;
*(here->HFETAsourcePrmPrmGatePrimePtr) -= ggspp;
*(here->HFETAdrainPrimeDrainPrmPrmPtr) -= model->HFETAgf;
*(here->HFETAdrainPrmPrmDrainPrimePtr) -= model->HFETAgf;
*(here->HFETAgatePrimeDrainPrmPrmPtr) -= ggdpp;
*(here->HFETAdrainPrmPrmGatePrimePtr) -= ggdpp;
*(here->HFETAgateGatePtr) += model->HFETAgateConduct;
*(here->HFETAgateGatePrimePtr) -= model->HFETAgateConduct;
*(here->HFETAgatePrimeGatePtr) -= model->HFETAgateConduct;
*(here->HFETAgatePrimeGatePrimePtr+1) += xgd+xgs;
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr+1) += xgd;
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr+1) += xgs;
*(here->HFETAgatePrimeDrainPrmPrmPtr+1) -= xgd;
*(here->HFETAgatePrimeSourcePrmPrmPtr+1) -= xgs;
*(here->HFETAdrainPrmPrmGatePrimePtr+1) -= xgd;
*(here->HFETAsourcePrmPrmGatePrimePtr+1) -= xgs;
*(here->HFETAdrainPrimeDrainPrimePtr+1) += xds;
*(here->HFETAsourcePrimeSourcePrimePtr+1) += xds;
*(here->HFETAdrainPrimeSourcePrimePtr+1) -= xds;
*(here->HFETAsourcePrimeDrainPrimePtr+1) -= xds;
m = here->HFETAm;
*(here->HFETAdrainDrainPtr) += m * (model->HFETAdrainConduct);
*(here->HFETAsourceSourcePtr) += m * (model->HFETAsourceConduct);
*(here->HFETAgatePrimeGatePrimePtr) += m * (ggd+ggs+ggspp+ggdpp+model->HFETAgateConduct);
*(here->HFETAdrainPrimeDrainPrimePtr) += m * (gds+ggd+model->HFETAdrainConduct+model->HFETAgf);
*(here->HFETAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+model->HFETAsourceConduct+model->HFETAgi);
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += m * (model->HFETAgi+ggspp);
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += m * (model->HFETAgf+ggdpp);
*(here->HFETAdrainDrainPrimePtr) -= m * (model->HFETAdrainConduct);
*(here->HFETAdrainPrimeDrainPtr) -= m * (model->HFETAdrainConduct);
*(here->HFETAsourceSourcePrimePtr) -= m * (model->HFETAsourceConduct);
*(here->HFETAsourcePrimeSourcePtr) -= m * (model->HFETAsourceConduct);
*(here->HFETAgatePrimeDrainPrimePtr) -= m * (ggd);
*(here->HFETAdrainPrimeGatePrimePtr) += m * (gm-ggd);
*(here->HFETAgatePrimeSourcePrimePtr) -= m * (ggs);
*(here->HFETAsourcePrimeGatePrimePtr) += m * (-ggs-gm);
*(here->HFETAdrainPrimeSourcePrimePtr) += m * (-gds-gm);
*(here->HFETAsourcePrimeDrainPrimePtr) -= m * (gds);
*(here->HFETAsourcePrimeSourcePrmPrmPtr) -= m * (model->HFETAgi);
*(here->HFETAsourcePrmPrmSourcePrimePtr) -= m * (model->HFETAgi);
*(here->HFETAgatePrimeSourcePrmPrmPtr) -= m * (ggspp);
*(here->HFETAsourcePrmPrmGatePrimePtr) -= m * (ggspp);
*(here->HFETAdrainPrimeDrainPrmPrmPtr) -= m * (model->HFETAgf);
*(here->HFETAdrainPrmPrmDrainPrimePtr) -= m * (model->HFETAgf);
*(here->HFETAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp);
*(here->HFETAdrainPrmPrmGatePrimePtr) -= m * (ggdpp);
*(here->HFETAgateGatePtr) += m * (model->HFETAgateConduct);
*(here->HFETAgateGatePrimePtr) -= m * (model->HFETAgateConduct);
*(here->HFETAgatePrimeGatePtr) -= m * (model->HFETAgateConduct);
*(here->HFETAgatePrimeGatePrimePtr+1) += m * (xgd+xgs);
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr+1) += m * (xgd);
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr+1) += m * (xgs);
*(here->HFETAgatePrimeDrainPrmPrmPtr+1) -= m * (xgd);
*(here->HFETAgatePrimeSourcePrmPrmPtr+1) -= m * (xgs);
*(here->HFETAdrainPrmPrmGatePrimePtr+1) -= m * (xgd);
*(here->HFETAsourcePrmPrmGatePrimePtr+1) -= m * (xgs);
*(here->HFETAdrainPrimeDrainPrimePtr+1) += m * (xds);
*(here->HFETAsourcePrimeSourcePrimePtr+1) += m * (xds);
*(here->HFETAdrainPrimeSourcePrimePtr+1) -= m * (xds);
*(here->HFETAsourcePrimeDrainPrimePtr+1) -= m * (xds);
}
}
return(OK);

View File

@ -7,7 +7,6 @@ Imported into HFETA source: Paolo Nenzi 2001
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "devdefs.h"
#include "ifsim.h"
@ -18,12 +17,7 @@ Imported into HFETA source: Paolo Nenzi 2001
/* ARGSUSED */
int
HFETAask(ckt,inst,which,value,select)
CKTcircuit *ckt;
GENinstance *inst;
int which;
IFvalue *value;
IFvalue *select;
HFETAask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select)
{
HFETAinstance *here = (HFETAinstance*)inst;
static char *msg = "Current and power not available in ac analysis";
@ -32,7 +26,12 @@ HFETAask(ckt,inst,which,value,select)
value->rValue = here->HFETAlength;
return (OK);
case HFETA_WIDTH:
value->rValue = here->HFETAwidth;
value->rValue = here->HFETAwidth;
value->rValue *= here->HFETAm;
return (OK);
case HFETA_M:
value->rValue = here->HFETAm;
return (OK);
case HFETA_IC_VDS:
value->rValue = here->HFETAicVDS;
return (OK);
@ -58,7 +57,11 @@ HFETAask(ckt,inst,which,value,select)
value->iValue = here->HFETAsourcePrimeNode;
return (OK);
case HFETA_TEMP:
value->rValue = here->HFETAtemp;
value->rValue = here->HFETAtemp - CONSTCtoK;
return(OK);
case HFETA_DTEMP:
value->rValue = here->HFETAdtemp;
return(OK);
case HFETA_VGS:
value->rValue = *(ckt->CKTstate0 + here->HFETAvgs);
return (OK);
@ -67,36 +70,47 @@ HFETAask(ckt,inst,which,value,select)
return (OK);
case HFETA_CG:
value->rValue = *(ckt->CKTstate0 + here->HFETAcg);
value->rValue *= here->HFETAm;
return (OK);
case HFETA_CD:
value->rValue = *(ckt->CKTstate0 + here->HFETAcd);
value->rValue *= here->HFETAm;
return (OK);
case HFETA_CGD:
value->rValue = *(ckt->CKTstate0 + here->HFETAcgd);
value->rValue *= here->HFETAm;
return (OK);
case HFETA_GM:
value->rValue = *(ckt->CKTstate0 + here->HFETAgm);
value->rValue *= here->HFETAm;
return (OK);
case HFETA_GDS:
value->rValue = *(ckt->CKTstate0 + here->HFETAgds);
value->rValue *= here->HFETAm;
return (OK);
case HFETA_GGS:
value->rValue = *(ckt->CKTstate0 + here->HFETAggs);
value->rValue *= here->HFETAm;
return (OK);
case HFETA_GGD:
value->rValue = *(ckt->CKTstate0 + here->HFETAggd);
value->rValue *= here->HFETAm;
return (OK);
case HFETA_QGS:
value->rValue = *(ckt->CKTstate0 + here->HFETAqgs);
value->rValue *= here->HFETAm;
return (OK);
case HFETA_CQGS:
value->rValue = *(ckt->CKTstate0 + here->HFETAcqgs);
value->rValue *= here->HFETAm;
return (OK);
case HFETA_QGD:
value->rValue = *(ckt->CKTstate0 + here->HFETAqgd);
value->rValue *= here->HFETAm;
return (OK);
case HFETA_CQGD:
value->rValue = *(ckt->CKTstate0 + here->HFETAcqgd);
value->rValue *= here->HFETAm;
return (OK);
case HFETA_CS :
if (ckt->CKTcurrentAnalysis & DOING_AC) {
@ -107,6 +121,7 @@ HFETAask(ckt,inst,which,value,select)
} else {
value->rValue = -*(ckt->CKTstate0 + here->HFETAcd);
value->rValue -= *(ckt->CKTstate0 + here->HFETAcg);
value->rValue *= here->HFETAm;
}
return(OK);
case HFETA_POWER :
@ -123,6 +138,7 @@ HFETAask(ckt,inst,which,value,select)
value->rValue -= (*(ckt->CKTstate0+here->HFETAcd) +
*(ckt->CKTstate0 + here->HFETAcg)) *
*(ckt->CKTrhsOld + here->HFETAsourceNode);
value->rValue *= here->HFETAm;
}
return(OK);
default:

View File

@ -1,3 +1,8 @@
/**********
Imported from MacSpice3f4 - Antony Wilson
Modified: Paolo Nenzi
**********/
#ifndef HFETA
#define HFETA
@ -26,9 +31,11 @@ typedef struct sHFETAinstance {
int HFETAsourcePrmPrmNode;
double HFETAlength;
double HFETAwidth;
double HFETAm;
double HFETAicVDS;
double HFETAicVGS;
double HFETAtemp;
double HFETAdtemp;
double HFETAtVto;
double HFETAtMu;
double HFETAtLambda;
@ -92,10 +99,12 @@ typedef struct sHFETAinstance {
int HFETAoff;
unsigned HFETAlengthGiven : 1;
unsigned HFETAwidthGiven : 1;
unsigned HFETAicVDSGiven : 1;
unsigned HFETAicVGSGiven : 1;
unsigned HFETAtempGiven : 1;
unsigned HFETAwidthGiven : 1;
unsigned HFETAmGiven : 1;
unsigned HFETAicVDSGiven : 1;
unsigned HFETAicVGSGiven : 1;
unsigned HFETAtempGiven : 1;
unsigned HFETAdtempGiven : 1;
int HFETAmode;
double HFETAn0;
@ -280,6 +289,8 @@ typedef struct sHFETAmodel {
#define HFETA_OFF 7
#define HFETA_CS 8
#define HFETA_POWER 9
#define HFETA_DTEMP 10
#define HFETA_M 11
/* model parameters */
#define HFETA_MOD_VTO 101

View File

@ -7,17 +7,13 @@ Imported into hfeta model: Paolo Nenzi 2001
*/
#include "ngspice.h"
#include <stdio.h>
#include "hfetdefs.h"
#include "sperror.h"
#include "suffix.h"
int
HFETAdelete(inModel,name,inst)
GENmodel *inModel;
IFuid name;
GENinstance **inst;
HFETAdelete(GENmodel *inModel, IFuid name, GENinstance **inst)
{
HFETAmodel *model = (HFETAmodel*)inModel;
HFETAinstance **fast = (HFETAinstance**)inst;

View File

@ -1,13 +1,15 @@
/**********
Imported from MacSpice3f4 - Antony Wilson
Modified: Paolo Nenzi
**********/
#include "ngspice.h"
#include <stdio.h>
#include "hfetdefs.h"
#include "suffix.h"
void
HFETAdestroy(inModel)
GENmodel **inModel;
HFETAdestroy(GENmodel **inModel)
{
HFETAmodel **model = (HFETAmodel**)inModel;
HFETAinstance *here;

View File

@ -1,4 +1,8 @@
#ifdef __STDC__
/**********
Imported from MacSpice3f4 - Antony Wilson
Modified: Paolo Nenzi
**********/
extern int HFETAacLoad(GENmodel*,CKTcircuit*);
extern int HFETAask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*);
extern int HFETAdelete(GENmodel*,IFuid,GENinstance**);
@ -9,26 +13,8 @@ extern int HFETAmAsk(CKTcircuit*,GENmodel*,int,IFvalue*);
extern int HFETAmDelete(GENmodel**,IFuid,GENmodel*);
extern int HFETAmParam(int,IFvalue*,GENmodel*);
extern int HFETAparam(int,IFvalue*,GENinstance*,IFvalue*);
extern int HFETApzLoad(GENmodel*, CKTcircuit*, SPcomplex*);
extern int HFETAsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
extern int HFETAtemp(GENmodel*,CKTcircuit*);
extern int HFETAtrunc(GENmodel*,CKTcircuit*,double*);
extern int HFETAunsetup(GENmodel*,CKTcircuit*);
#else /*stdc*/
extern int HFETAacLoad();
extern int HFETAask();
extern int HFETAdelete();
extern void HFETAdestroy();
extern int HFETAgetic();
extern int HFETAload();
extern int HFETAmAsk();
extern int HFETAmDelete();
extern int HFETAmParam();
extern int HFETAparam();
extern int HFETAsetup();
extern int HFETAtemp();
extern int HFETAtrunc();
extern int HFETAunsetup();
#endif

View File

@ -1,6 +1,9 @@
/**********
Imported from MacSpice3f4 - Antony Wilson
Modified: Paolo Nenzi
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "hfetdefs.h"
#include "sperror.h"
@ -8,9 +11,7 @@
int
HFETAgetic(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
HFETAgetic(GENmodel *inModel, CKTcircuit *ckt)
{
HFETAmodel *model = (HFETAmodel*)inModel;
HFETAinstance *here;
@ -21,6 +22,8 @@ CKTcircuit *ckt;
for( ; model ; model = model->HFETAnextModel) {
for(here = model->HFETAinstances; here ; here = here->HFETAnextInstance) {
if (here->HFETAowner != ARCHme) continue;
if(!here->HFETAicVDSGiven) {
here->HFETAicVDS =
*(ckt->CKTrhs + here->HFETAdrainNode) -

View File

@ -57,7 +57,7 @@ SPICEdev HFETAinfo = {
DEVsetic : HFETAgetic,
DEVask : HFETAask,
DEVmodAsk : HFETAmAsk,
DEVpzLoad : NULL,
DEVpzLoad : HFETApzLoad,
DEVconvTest : NULL,
DEVsenSetup : NULL,
DEVsenLoad : NULL,

View File

@ -1,5 +1,9 @@
/**********
Imported from MacSpice3f4 - Antony Wilson
Modified: Paolo Nenzi
**********/
#include "ngspice.h"
#include <stdio.h>
#include "devdefs.h"
#include "cktdefs.h"
#include "hfetdefs.h"
@ -26,12 +30,10 @@ static void hfeta(HFETAmodel *model, HFETAinstance *here, CKTcircuit *ckt,
void Pause(void);
int HFETAload(inModel, ckt)
GENmodel *inModel;
register CKTcircuit *ckt;
int HFETAload(GENmodel *inModel, CKTcircuit *ckt)
{
register HFETAmodel *model = (HFETAmodel*)inModel;
register HFETAinstance *here;
HFETAmodel *model = (HFETAmodel*)inModel;
HFETAinstance *here;
double capgd;
double capgs;
double cd;
@ -78,9 +80,15 @@ register CKTcircuit *ckt;
int icheck;
int error;
double m;
for( ; model != NULL; model = model->HFETAnextModel ) {
for (here = model->HFETAinstances; here != NULL ;
here=here->HFETAnextInstance) {
if (here->HFETAowner != ARCHme) continue;
vcrit = here->HFETAvcrit;
vt = CONSTKoverQ * here->HFETAtemp;
icheck = 0;
@ -411,51 +419,54 @@ register CKTcircuit *ckt;
* load current vector
*/
load:
m = here->HFETAm;
ceqgd = model->HFETAtype*(cgd+cgdpp-ggd*vgd-gmg*vgs-gmd*vds-ggdpp*vgdpp);
ceqgs = model->HFETAtype*(cgs + cgspp - ggs*vgs - ggspp*vgspp);
cdreq = model->HFETAtype*(cd + cgd + cgdpp - gds*vds - gm*vgs);
*(ckt->CKTrhs + here->HFETAgatePrimeNode) += (-ceqgs-ceqgd);
cdreq = model->HFETAtype*(cd + cgd + cgdpp - gds*vds - gm*vgs);
*(ckt->CKTrhs + here->HFETAgatePrimeNode) += m * (-ceqgs-ceqgd);
ceqgd = model->HFETAtype*(cgd-ggd*vgd-gmg*vgs-gmd*vds);
*(ckt->CKTrhs + here->HFETAdrainPrimeNode) += (-cdreq+ceqgd);
*(ckt->CKTrhs + here->HFETAdrainPrimeNode) += m * (-cdreq+ceqgd);
ceqgd = model->HFETAtype*(cgdpp-ggdpp*vgdpp);
*(ckt->CKTrhs + here->HFETAdrainPrmPrmNode) += ceqgd;
*(ckt->CKTrhs + here->HFETAdrainPrmPrmNode) += m * ceqgd;
ceqgs = model->HFETAtype*(cgs-ggs*vgs);
*(ckt->CKTrhs + here->HFETAsourcePrimeNode) += (cdreq+ceqgs);
*(ckt->CKTrhs + here->HFETAsourcePrimeNode) += m * (cdreq+ceqgs);
ceqgs = model->HFETAtype*(cgspp-ggspp*vgspp);
*(ckt->CKTrhs + here->HFETAsourcePrmPrmNode) += ceqgs;
*(ckt->CKTrhs + here->HFETAsourcePrmPrmNode) += m * ceqgs;
/*
* load y matrix
*/
*(here->HFETAdrainDrainPtr) += model->HFETAdrainConduct;
*(here->HFETAsourceSourcePtr) += model->HFETAsourceConduct;
*(here->HFETAgatePrimeGatePrimePtr) += (ggd+ggs+ggspp+ggdpp+gmg+model->HFETAgateConduct);
*(here->HFETAdrainPrimeDrainPrimePtr) += (gds+ggd-gmd+model->HFETAdrainConduct+model->HFETAgf);
*(here->HFETAsourcePrimeSourcePrimePtr) += (gds+gm+ggs+model->HFETAsourceConduct+model->HFETAgi);
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += (model->HFETAgi+ggspp);
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += (model->HFETAgf+ggdpp);
*(here->HFETAdrainDrainPrimePtr) -= model->HFETAdrainConduct;
*(here->HFETAdrainPrimeDrainPtr) -= model->HFETAdrainConduct;
*(here->HFETAsourceSourcePrimePtr) -= model->HFETAsourceConduct;
*(here->HFETAsourcePrimeSourcePtr) -= model->HFETAsourceConduct;
*(here->HFETAgatePrimeDrainPrimePtr) += -ggd+gmd;
*(here->HFETAdrainPrimeGatePrimePtr) += (gm-ggd-gmg);
*(here->HFETAgatePrimeSourcePrimePtr) -= ggs+gmg+gmd;
*(here->HFETAsourcePrimeGatePrimePtr) += (-ggs-gm);
*(here->HFETAdrainPrimeSourcePrimePtr) += (-gds-gm+gmg+gmd);
*(here->HFETAsourcePrimeDrainPrimePtr) -= gds;
*(here->HFETAsourcePrimeSourcePrmPrmPtr) -= model->HFETAgi;
*(here->HFETAsourcePrmPrmSourcePrimePtr) -= model->HFETAgi;
*(here->HFETAgatePrimeSourcePrmPrmPtr) -= ggspp;
*(here->HFETAsourcePrmPrmGatePrimePtr) -= ggspp;
*(here->HFETAdrainPrimeDrainPrmPrmPtr) -= model->HFETAgf;
*(here->HFETAdrainPrmPrmDrainPrimePtr) -= model->HFETAgf;
*(here->HFETAgatePrimeDrainPrmPrmPtr) -= ggdpp;
*(here->HFETAdrainPrmPrmGatePrimePtr) -= ggdpp;
*(here->HFETAgateGatePtr) += model->HFETAgateConduct;
*(here->HFETAgateGatePrimePtr) -= model->HFETAgateConduct;
*(here->HFETAgatePrimeGatePtr) -= model->HFETAgateConduct;
*(here->HFETAdrainDrainPtr) += m * (model->HFETAdrainConduct);
*(here->HFETAsourceSourcePtr) += m * (model->HFETAsourceConduct);
*(here->HFETAgatePrimeGatePrimePtr) += m * (ggd+ggs+ggspp+ggdpp+gmg+model->HFETAgateConduct);
*(here->HFETAdrainPrimeDrainPrimePtr) += m * (gds+ggd-gmd+model->HFETAdrainConduct+model->HFETAgf);
*(here->HFETAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+model->HFETAsourceConduct+model->HFETAgi);
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += m * (model->HFETAgi+ggspp);
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += m * (model->HFETAgf+ggdpp);
*(here->HFETAdrainDrainPrimePtr) -= m * (model->HFETAdrainConduct);
*(here->HFETAdrainPrimeDrainPtr) -= m * (model->HFETAdrainConduct);
*(here->HFETAsourceSourcePrimePtr) -= m * (model->HFETAsourceConduct);
*(here->HFETAsourcePrimeSourcePtr) -= m * (model->HFETAsourceConduct);
*(here->HFETAgatePrimeDrainPrimePtr) += m * (-ggd+gmd);
*(here->HFETAdrainPrimeGatePrimePtr) += m * (gm-ggd-gmg);
*(here->HFETAgatePrimeSourcePrimePtr) -= m * (ggs+gmg+gmd);
*(here->HFETAsourcePrimeGatePrimePtr) += m * (-ggs-gm);
*(here->HFETAdrainPrimeSourcePrimePtr) += m * (-gds-gm+gmg+gmd);
*(here->HFETAsourcePrimeDrainPrimePtr) -= m * (gds);
*(here->HFETAsourcePrimeSourcePrmPrmPtr) -= m * (model->HFETAgi);
*(here->HFETAsourcePrmPrmSourcePrimePtr) -= m * (model->HFETAgi);
*(here->HFETAgatePrimeSourcePrmPrmPtr) -= m * (ggspp);
*(here->HFETAsourcePrmPrmGatePrimePtr) -= m * (ggspp);
*(here->HFETAdrainPrimeDrainPrmPrmPtr) -= m * (model->HFETAgf);
*(here->HFETAdrainPrmPrmDrainPrimePtr) -= m * (model->HFETAgf);
*(here->HFETAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp);
*(here->HFETAdrainPrmPrmGatePrimePtr) -= m * (ggdpp);
*(here->HFETAgateGatePtr) += m * (model->HFETAgateConduct);
*(here->HFETAgateGatePrimePtr) -= m * (model->HFETAgateConduct);
*(here->HFETAgatePrimeGatePtr) -= m * (model->HFETAgateConduct);
}

View File

@ -7,7 +7,6 @@ Imported into HFETA model: Paolo Nenzi 2001
*/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "devdefs.h"
#include "ifsim.h"
@ -18,11 +17,7 @@ Imported into HFETA model: Paolo Nenzi 2001
/* ARGSUSED */
int
HFETAmAsk(ckt,inst,which,value)
CKTcircuit *ckt;
GENmodel *inst;
int which;
IFvalue *value;
HFETAmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
{
HFETAmodel *here = (HFETAmodel*)inst;
switch(which) {

View File

@ -7,17 +7,13 @@ Imported into hfeta model: Paolo Nenzi 2001
*/
#include "ngspice.h"
#include <stdio.h>
#include "hfetdefs.h"
#include "sperror.h"
#include "suffix.h"
int
HFETAmDelete(inModel,modname,kill)
GENmodel **inModel;
IFuid modname;
GENmodel *kill;
HFETAmDelete(GENmodel **inModel, IFuid modname, GENmodel *kill)
{
HFETAmodel **model = (HFETAmodel**)inModel;
HFETAmodel *modfast = (HFETAmodel*)kill;

View File

@ -1,6 +1,9 @@
/**********
Imported from MacSpice3f4 - Antony Wilson
Modified: Paolo Nenzi
**********/
#include "ngspice.h"
#include <stdio.h>
#include "const.h"
#include "ifsim.h"
#include "hfetdefs.h"
@ -9,10 +12,7 @@
int
HFETAmParam(param,value,inModel)
int param;
IFvalue *value;
GENmodel *inModel;
HFETAmParam(int param, IFvalue *value, GENmodel *inModel)
{
HFETAmodel *model = (HFETAmodel*)inModel;
switch(param)

View File

@ -1,6 +1,9 @@
/**********
Imported from MacSpice3f4 - Antony Wilson
Modified: Paolo Nenzi
**********/
#include "ngspice.h"
#include <stdio.h>
#include "ifsim.h"
#include "hfetdefs.h"
#include "sperror.h"
@ -9,11 +12,7 @@
/* ARGSUSED */
int
HFETAparam(param,value,inst,select)
int param;
IFvalue *value;
GENinstance *inst;
IFvalue *select;
HFETAparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
{
HFETAinstance *here = (HFETAinstance*)inst;
switch(param) {
@ -25,6 +24,10 @@ HFETAparam(param,value,inst,select)
here->HFETAwidth = value->rValue;
here->HFETAwidthGiven = TRUE;
break;
case HFETA_M:
here->HFETAm = value->rValue;
here->HFETAmGiven = TRUE;
break;
case HFETA_IC_VDS:
here->HFETAicVDS = value->rValue;
here->HFETAicVDSGiven = TRUE;
@ -50,9 +53,13 @@ HFETAparam(param,value,inst,select)
}
break;
case HFETA_TEMP:
here->HFETAtemp = value->rValue+CONSTCtoK;
here->HFETAtemp = value->rValue + CONSTCtoK;
here->HFETAtempGiven = TRUE;
break;
case HFETA_DTEMP:
here->HFETAdtemp = value->rValue;
here->HFETAdtempGiven = TRUE;
break;
default:
return(E_BADPARM);
}

View File

@ -0,0 +1,111 @@
/**********
Author: 2003 Paolo Nenzi
**********/
/*
*/
#include "ngspice.h"
#include "cktdefs.h"
#include "complex.h"
#include "hfetdefs.h"
#include "sperror.h"
#include "suffix.h"
int
HFETApzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
{
HFETAmodel *model = (HFETAmodel*)inModel;
HFETAinstance *here;
double gm;
double gds;
double xds;
double ggs;
double xgs;
double ggd;
double xgd;
double ggspp;
double ggdpp;
double f;
double m;
for( ; model != NULL; model = model->HFETAnextModel )
{
for( here = model->HFETAinstances; here != NULL;
here = here->HFETAnextInstance) {
if (here->HFETAowner != ARCHme) continue;
gm = *(ckt->CKTstate0 + here->HFETAgm);
gds = *(ckt->CKTstate0 + here->HFETAgds);
xds = CDS*ckt->CKTomega;
ggs = *(ckt->CKTstate0 + here->HFETAggs);
xgs = *(ckt->CKTstate0 + here->HFETAqgs);
ggd = *(ckt->CKTstate0 + here->HFETAggd);
xgd = *(ckt->CKTstate0 + here->HFETAqgd);
ggspp = *(ckt->CKTstate0 + here->HFETAggspp);
ggdpp = *(ckt->CKTstate0 + here->HFETAggdpp);
if(model->HFETAkappaGiven && here->HFETAdelf != 0.0) {
f = ckt->CKTomega/2/M_PI;
gds = gds*(1+0.5*model->HFETAkappa*(1+tanh((f-here->HFETAfgds)/here->HFETAdelf)));
}
m = here->HFETAm;
*(here->HFETAdrainDrainPtr) += m * (model->HFETAdrainConduct);
*(here->HFETAsourceSourcePtr) += m * (model->HFETAsourceConduct);
*(here->HFETAgatePrimeGatePrimePtr) += m * (ggd+ggs+ggspp+ggdpp+model->HFETAgateConduct);
*(here->HFETAdrainPrimeDrainPrimePtr) += m * (gds+ggd+model->HFETAdrainConduct+model->HFETAgf);
*(here->HFETAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+model->HFETAsourceConduct+model->HFETAgi);
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += m * (model->HFETAgi+ggspp);
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += m * (model->HFETAgf+ggdpp);
*(here->HFETAdrainDrainPrimePtr) -= m * (model->HFETAdrainConduct);
*(here->HFETAdrainPrimeDrainPtr) -= m * (model->HFETAdrainConduct);
*(here->HFETAsourceSourcePrimePtr) -= m * (model->HFETAsourceConduct);
*(here->HFETAsourcePrimeSourcePtr) -= m * (model->HFETAsourceConduct);
*(here->HFETAgatePrimeDrainPrimePtr) -= m * (ggd);
*(here->HFETAdrainPrimeGatePrimePtr) += m * (gm-ggd);
*(here->HFETAgatePrimeSourcePrimePtr) -= m * (ggs);
*(here->HFETAsourcePrimeGatePrimePtr) += m * (-ggs-gm);
*(here->HFETAdrainPrimeSourcePrimePtr) += m * (-gds-gm);
*(here->HFETAsourcePrimeDrainPrimePtr) -= m * (gds);
*(here->HFETAsourcePrimeSourcePrmPrmPtr) -= m * (model->HFETAgi);
*(here->HFETAsourcePrmPrmSourcePrimePtr) -= m * (model->HFETAgi);
*(here->HFETAgatePrimeSourcePrmPrmPtr) -= m * (ggspp);
*(here->HFETAsourcePrmPrmGatePrimePtr) -= m * (ggspp);
*(here->HFETAdrainPrimeDrainPrmPrmPtr) -= m * (model->HFETAgf);
*(here->HFETAdrainPrmPrmDrainPrimePtr) -= m * (model->HFETAgf);
*(here->HFETAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp);
*(here->HFETAdrainPrmPrmGatePrimePtr) -= m * (ggdpp);
*(here->HFETAgateGatePtr) += m * (model->HFETAgateConduct);
*(here->HFETAgateGatePrimePtr) -= m * (model->HFETAgateConduct);
*(here->HFETAgatePrimeGatePtr) -= m * (model->HFETAgateConduct);
*(here->HFETAgatePrimeGatePrimePtr) += m * ((xgd+xgs) * s->real);
*(here->HFETAgatePrimeGatePrimePtr+1) += m * ((xgd+xgs) * s->imag);
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += m * (xgd * s->real);
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr+1) += m * (xgd * s->imag);
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += m * (xgs * s->real);
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr+1) += m * (xgs * s->imag);
*(here->HFETAgatePrimeDrainPrmPrmPtr) -= m * (xgd * s->real);
*(here->HFETAgatePrimeDrainPrmPrmPtr+1) -= m * (xgd * s->imag);
*(here->HFETAgatePrimeSourcePrmPrmPtr) -= m * (xgs * s->real);
*(here->HFETAgatePrimeSourcePrmPrmPtr+1) -= m * (xgs * s->imag);
*(here->HFETAdrainPrmPrmGatePrimePtr) -= m * (xgd * s->real);
*(here->HFETAdrainPrmPrmGatePrimePtr+1) -= m * (xgd * s->imag);
*(here->HFETAsourcePrmPrmGatePrimePtr) -= m * (xgs * s->real);
*(here->HFETAsourcePrmPrmGatePrimePtr+1) -= m * (xgs * s->imag);
*(here->HFETAdrainPrimeDrainPrimePtr) += m * (xds * s->real);
*(here->HFETAdrainPrimeDrainPrimePtr+1) += m * (xds * s->imag);
*(here->HFETAsourcePrimeSourcePrimePtr) += m * (xds * s->real);
*(here->HFETAsourcePrimeSourcePrimePtr+1) += m * (xds * s->imag);
*(here->HFETAdrainPrimeSourcePrimePtr) -= m * (xds * s->real);
*(here->HFETAdrainPrimeSourcePrimePtr+1) -= m * (xds * s->imag);
*(here->HFETAsourcePrimeDrainPrimePtr) -= m * (xds * s->real);
*(here->HFETAsourcePrimeDrainPrimePtr+1) -= m * (xds * s->imag);
}
}
return(OK);
}

View File

@ -1,6 +1,9 @@
/**********
Imported from MacSpice3f4 - Antony Wilson
Modified: Paolo Nenzi
**********/
#include "ngspice.h"
#include <stdio.h>
#include "smpdefs.h"
#include "cktdefs.h"
#include "hfetdefs.h"
@ -12,11 +15,7 @@
//#define CHARGE 1.60219e-19
int
HFETAsetup(matrix,inModel,ckt,states)
SMPmatrix *matrix;
GENmodel *inModel;
CKTcircuit *ckt;
int *states;
HFETAsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
/* load the diode structure with those pointers needed later
* for fast matrix loading
*/
@ -230,17 +229,19 @@ HFETAsetup(matrix,inModel,ckt,states)
/* loop through all the instances of the model */
for (here = model->HFETAinstances; here != NULL ;
here=here->HFETAnextInstance) {
if (here->HFETAowner != ARCHme) goto matrixpointers;
if(!here->HFETAlengthGiven) {
here->HFETAlength = 1e-6;
}
if(!here->HFETAwidthGiven) {
here->HFETAwidth = 20e-6;
}
if(!here->HFETAtempGiven) {
here->HFETAtemp = ckt->CKTtemp;
if(!here->HFETAmGiven) {
here->HFETAm = 1.0;
}
here->HFETAstate = *states;
// *states += 24;
*states += HFETAnumStates;
@ -272,8 +273,7 @@ matrixpointers:
error = CKTmkVolt(ckt,&tmp,here->HFETAname,"drain");
if(error) return(error);
here->HFETAdrainPrimeNode = tmp->number;
/* XXX: Applied AlansFixes */
if (ckt->CKTcopyNodesets) {
CKTnode *tmpNode;
IFuid tmpName;
@ -294,13 +294,12 @@ matrixpointers:
error = CKTmkVolt(ckt,&tmp,here->HFETAname,"gate");
if(error) return(error);
here->HFETAgatePrimeNode = tmp->number;
/* XXX: Applied AlansFixes */
if (ckt->CKTcopyNodesets) {
CKTnode *tmpNode;
IFuid tmpName;
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) {
if (tmpNode->nsGiven) {
tmp->nodeset=tmpNode->nodeset;
tmp->nsGiven=tmpNode->nsGiven;
@ -315,8 +314,7 @@ matrixpointers:
error = CKTmkVolt(ckt,&tmp,here->HFETAname,"gd");
if(error) return(error);
here->HFETAdrainPrmPrmNode = tmp->number;
/* XXX: Applied AlansFixes */
if (ckt->CKTcopyNodesets) {
CKTnode *tmpNode;
IFuid tmpName;
@ -337,13 +335,12 @@ matrixpointers:
error = CKTmkVolt(ckt,&tmp,here->HFETAname,"gs");
if(error) return(error);
here->HFETAsourcePrmPrmNode = tmp->number;
/* XXX: Applied AlanFixes */
if (ckt->CKTcopyNodesets) {
CKTnode *tmpNode;
IFuid tmpName;
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
if (tmpNode->nsGiven) {
tmp->nodeset=tmpNode->nodeset;
tmp->nsGiven=tmpNode->nsGiven;
@ -395,9 +392,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
}
int
HFETAunsetup(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
HFETAunsetup(GENmodel *inModel, CKTcircuit *ckt)
{
HFETAmodel *model;
HFETAinstance *here;
@ -420,12 +415,27 @@ HFETAunsetup(inModel,ckt)
CKTdltNNum(ckt, here->HFETAsourcePrimeNode);
here->HFETAsourcePrimeNode = 0;
}
} if (here->HFETAgatePrimeNode
if (here->HFETAgatePrimeNode
&& here->HFETAgatePrimeNode != here->HFETAgateNode)
{
{
CKTdltNNum(ckt, here->HFETAgatePrimeNode);
here->HFETAgatePrimeNode = 0;
}
}
if (here->HFETAdrainPrmPrmNode
&& here->HFETAdrainPrmPrmNode != here->HFETAdrainPrimeNode)
{
CKTdltNNum(ckt, here->HFETAdrainPrmPrmNode);
here->HFETAdrainPrmPrmNode = 0;
}
if (here->HFETAsourcePrmPrmNode
&& here->HFETAsourcePrmPrmNode != here->HFETAsourcePrimeNode)
{
CKTdltNNum(ckt, here->HFETAsourcePrmPrmNode);
here->HFETAsourcePrmPrmNode = 0;
}
}
}
return OK;
}

View File

@ -1,6 +1,9 @@
/**********
Imported from MacSpice3f4 - Antony Wilson
Modified: Paolo Nenzi
**********/
#include "ngspice.h"
#include <stdio.h>
#include "smpdefs.h"
#include "cktdefs.h"
#include "hfetdefs.h"
@ -11,9 +14,7 @@
/* ARGSUSED */
int
HFETAtemp(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
HFETAtemp(GENmodel *inModel, CKTcircuit *ckt)
{
HFETAmodel *model = (HFETAmodel*)inModel;
HFETAinstance *here;
@ -57,6 +58,16 @@ HFETAtemp(inModel,ckt)
for (here = model->HFETAinstances; here != NULL ;
here=here->HFETAnextInstance) {
if (here->HFETAowner != ARCHme) continue;
if(!here->HFETAdtempGiven) {
here->HFETAdtemp = 0.0;
}
if(!here->HFETAtempGiven) {
here->HFETAtemp = ckt->CKTtemp + here->HFETAdtemp;
}
vt = CONSTKoverQ*TEMP;
TLAMBDA = LAMBDA + KLAMBDA*(TEMP-ckt->CKTnomTemp);
TMU = MU - KMU*(TEMP-ckt->CKTnomTemp);

View File

@ -1,6 +1,9 @@
/**********
Imported from MacSpice3f4 - Antony Wilson
Modified: Paolo Nenzi
**********/
#include "ngspice.h"
#include <stdio.h>
#include "cktdefs.h"
#include "hfetdefs.h"
#include "sperror.h"
@ -8,16 +11,15 @@
int
HFETAtrunc(inModel,ckt,timeStep)
GENmodel *inModel;
CKTcircuit *ckt;
double *timeStep;
HFETAtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep)
{
HFETAmodel *model = (HFETAmodel*)inModel;
HFETAinstance *here;
for( ; model != NULL; model = model->HFETAnextModel) {
for(here=model->HFETAinstances;here!=NULL;here = here->HFETAnextInstance){
if (here->HFETAowner != ARCHme) continue;
CKTterr(here->HFETAqgs,ckt,timeStep);
CKTterr(here->HFETAqgd,ckt,timeStep);
}

13
tests/hfet/id_vgs.cir Normal file
View File

@ -0,0 +1,13 @@
HFET Id versus Vgs characteristic
z1 1 2 0 hfet l=1u w=10u
vgs 2 0 dc 0.3
vds 1 0 dc 1.0
.model hfet nhfet level=5 rdi=0 rsi=0 m=2.57 lambda=0.17
+ vs=1.5e5 mu=0.385 vt0=0.13 eta=1.32 sigma0=0.04
+ vsigma=0.1 Vsigmat=0.3 js1s=0 js1d=0 nmax=6e15
.dc vds 0 1 0.01
.end

25
tests/hfet/inverter.cir Normal file
View File

@ -0,0 +1,25 @@
DCFL inverter circuit
.subckt inv 1 2 3
*
*Vdd 1.0
*Vin 2 0
*Vout 3 0
z1 1 3 3 aload l=1u w=10u
z2 3 2 0 adrv l=1u w=10u
.ends
vdd 1 0 dc 2
vin 2 0 dc 0 pwl(0,0V 1ns,0V 1.005ns,1V 2ns,1V)
x1 1 2 3 inv
x2 1 3 4 inv
.model adrv nhfet level=5 rd=60 rs=60 m=2.57 lambda=0.17
+ vs=1.5e5 mu=0.385 vt0=0.3 eta=1.32 sigma0=0.04
+ vsigma=0.1 vsigmat=0.3 js1s=1e-12 js1d=1e-12
+ nmax=6e15
.model aload nhfet level=5 rd=60 rs=60 m=2.57 lambda=0.17
+ vs=1.5e5 mu=0.385 vt0=-0.3 eta=1.32 sigma0=0.04
+ vsigma=0.1 vsigmat=0.3 js1s=1e-12 js1d=1e-12
+ nmax=6e15
.end