diff --git a/ChangeLog b/ChangeLog
index 0c973ce1e..4f477535b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2003-12-30 Paolo Nenzi
+
+ * 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
* src/spicelib/devices/jfet2/*: Added parallel multiplier and "dtemp"
diff --git a/DEVICES b/DEVICES
index b73a6ab82..0f65d4f27 100644
--- a/DEVICES
+++ b/DEVICES
@@ -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.
diff --git a/src/spicelib/devices/hfet1/Makefile.am b/src/spicelib/devices/hfet1/Makefile.am
index 23291d981..d7a86fb89 100644
--- a/src/spicelib/devices/hfet1/Makefile.am
+++ b/src/spicelib/devices/hfet1/Makefile.am
@@ -19,6 +19,7 @@ libhfet_a_SOURCES = \
hfetmdel.c \
hfetmpar.c \
hfetparam.c \
+ hfetpzl.c \
hfetsetup.c \
hfettemp.c \
hfettrunc.c
diff --git a/src/spicelib/devices/hfet1/hfet.c b/src/spicelib/devices/hfet1/hfet.c
index 9453412dc..fa442bf77 100644
--- a/src/spicelib/devices/hfet1/hfet.c
+++ b/src/spicelib/devices/hfet1/hfet.c
@@ -1,5 +1,9 @@
+/**********
+Imported from MacSpice3f4 - Antony Wilson
+Modified: Paolo Nenzi
+**********/
+
#include "ngspice.h"
-#include
#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"),
diff --git a/src/spicelib/devices/hfet1/hfetacl.c b/src/spicelib/devices/hfet1/hfetacl.c
index 859c87f56..0d59dc2d0 100644
--- a/src/spicelib/devices/hfet1/hfetacl.c
+++ b/src/spicelib/devices/hfet1/hfetacl.c
@@ -1,6 +1,9 @@
+/**********
+Imported from MacSpice3f4 - Antony Wilson
+Modified: Paolo Nenzi
+**********/
#include "ngspice.h"
-#include
#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);
diff --git a/src/spicelib/devices/hfet1/hfetask.c b/src/spicelib/devices/hfet1/hfetask.c
index 0aa7d9822..edd132010 100644
--- a/src/spicelib/devices/hfet1/hfetask.c
+++ b/src/spicelib/devices/hfet1/hfetask.c
@@ -7,7 +7,6 @@ Imported into HFETA source: Paolo Nenzi 2001
*/
#include "ngspice.h"
-#include
#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:
diff --git a/src/spicelib/devices/hfet1/hfetdefs.h b/src/spicelib/devices/hfet1/hfetdefs.h
index 72ed92093..ec2d7f6b1 100644
--- a/src/spicelib/devices/hfet1/hfetdefs.h
+++ b/src/spicelib/devices/hfet1/hfetdefs.h
@@ -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
diff --git a/src/spicelib/devices/hfet1/hfetdel.c b/src/spicelib/devices/hfet1/hfetdel.c
index 36a69b378..a7b138222 100644
--- a/src/spicelib/devices/hfet1/hfetdel.c
+++ b/src/spicelib/devices/hfet1/hfetdel.c
@@ -7,17 +7,13 @@ Imported into hfeta model: Paolo Nenzi 2001
*/
#include "ngspice.h"
-#include
#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;
diff --git a/src/spicelib/devices/hfet1/hfetdest.c b/src/spicelib/devices/hfet1/hfetdest.c
index 9869b401a..6cf89b9f6 100644
--- a/src/spicelib/devices/hfet1/hfetdest.c
+++ b/src/spicelib/devices/hfet1/hfetdest.c
@@ -1,13 +1,15 @@
+/**********
+Imported from MacSpice3f4 - Antony Wilson
+Modified: Paolo Nenzi
+**********/
#include "ngspice.h"
-#include
#include "hfetdefs.h"
#include "suffix.h"
void
-HFETAdestroy(inModel)
-GENmodel **inModel;
+HFETAdestroy(GENmodel **inModel)
{
HFETAmodel **model = (HFETAmodel**)inModel;
HFETAinstance *here;
diff --git a/src/spicelib/devices/hfet1/hfetext.h b/src/spicelib/devices/hfet1/hfetext.h
index c65cc3e01..36d866f2d 100644
--- a/src/spicelib/devices/hfet1/hfetext.h
+++ b/src/spicelib/devices/hfet1/hfetext.h
@@ -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
\ No newline at end of file
diff --git a/src/spicelib/devices/hfet1/hfetgetic.c b/src/spicelib/devices/hfet1/hfetgetic.c
index 30836a269..89b063c05 100644
--- a/src/spicelib/devices/hfet1/hfetgetic.c
+++ b/src/spicelib/devices/hfet1/hfetgetic.c
@@ -1,6 +1,9 @@
+/**********
+Imported from MacSpice3f4 - Antony Wilson
+Modified: Paolo Nenzi
+**********/
#include "ngspice.h"
-#include
#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) -
diff --git a/src/spicelib/devices/hfet1/hfetinit.c b/src/spicelib/devices/hfet1/hfetinit.c
index 032ecef9f..286e64379 100644
--- a/src/spicelib/devices/hfet1/hfetinit.c
+++ b/src/spicelib/devices/hfet1/hfetinit.c
@@ -57,7 +57,7 @@ SPICEdev HFETAinfo = {
DEVsetic : HFETAgetic,
DEVask : HFETAask,
DEVmodAsk : HFETAmAsk,
- DEVpzLoad : NULL,
+ DEVpzLoad : HFETApzLoad,
DEVconvTest : NULL,
DEVsenSetup : NULL,
DEVsenLoad : NULL,
diff --git a/src/spicelib/devices/hfet1/hfetload.c b/src/spicelib/devices/hfet1/hfetload.c
index 672c3a369..692eacc5a 100644
--- a/src/spicelib/devices/hfet1/hfetload.c
+++ b/src/spicelib/devices/hfet1/hfetload.c
@@ -1,5 +1,9 @@
+/**********
+Imported from MacSpice3f4 - Antony Wilson
+Modified: Paolo Nenzi
+**********/
+
#include "ngspice.h"
-#include
#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);
}
diff --git a/src/spicelib/devices/hfet1/hfetmask.c b/src/spicelib/devices/hfet1/hfetmask.c
index 0c942afbd..45cccda81 100644
--- a/src/spicelib/devices/hfet1/hfetmask.c
+++ b/src/spicelib/devices/hfet1/hfetmask.c
@@ -7,7 +7,6 @@ Imported into HFETA model: Paolo Nenzi 2001
*/
#include "ngspice.h"
-#include
#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) {
diff --git a/src/spicelib/devices/hfet1/hfetmdel.c b/src/spicelib/devices/hfet1/hfetmdel.c
index 2dd7aa40e..fb4d219f4 100644
--- a/src/spicelib/devices/hfet1/hfetmdel.c
+++ b/src/spicelib/devices/hfet1/hfetmdel.c
@@ -7,17 +7,13 @@ Imported into hfeta model: Paolo Nenzi 2001
*/
#include "ngspice.h"
-#include
#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;
diff --git a/src/spicelib/devices/hfet1/hfetmpar.c b/src/spicelib/devices/hfet1/hfetmpar.c
index 4a3a05b8f..ac9b2997a 100644
--- a/src/spicelib/devices/hfet1/hfetmpar.c
+++ b/src/spicelib/devices/hfet1/hfetmpar.c
@@ -1,6 +1,9 @@
+/**********
+Imported from MacSpice3f4 - Antony Wilson
+Modified: Paolo Nenzi
+**********/
#include "ngspice.h"
-#include
#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)
diff --git a/src/spicelib/devices/hfet1/hfetparam.c b/src/spicelib/devices/hfet1/hfetparam.c
index 5fef5ff9c..360eccd10 100644
--- a/src/spicelib/devices/hfet1/hfetparam.c
+++ b/src/spicelib/devices/hfet1/hfetparam.c
@@ -1,6 +1,9 @@
+/**********
+Imported from MacSpice3f4 - Antony Wilson
+Modified: Paolo Nenzi
+**********/
#include "ngspice.h"
-#include
#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);
}
diff --git a/src/spicelib/devices/hfet1/hfetpzl.c b/src/spicelib/devices/hfet1/hfetpzl.c
new file mode 100644
index 000000000..762a1207c
--- /dev/null
+++ b/src/spicelib/devices/hfet1/hfetpzl.c
@@ -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);
+}
diff --git a/src/spicelib/devices/hfet1/hfetsetup.c b/src/spicelib/devices/hfet1/hfetsetup.c
index 5b5f36f7e..d5530fa3a 100644
--- a/src/spicelib/devices/hfet1/hfetsetup.c
+++ b/src/spicelib/devices/hfet1/hfetsetup.c
@@ -1,6 +1,9 @@
+/**********
+Imported from MacSpice3f4 - Antony Wilson
+Modified: Paolo Nenzi
+**********/
#include "ngspice.h"
-#include
#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;
}
diff --git a/src/spicelib/devices/hfet1/hfettemp.c b/src/spicelib/devices/hfet1/hfettemp.c
index 66ec1b6cf..4bb490299 100644
--- a/src/spicelib/devices/hfet1/hfettemp.c
+++ b/src/spicelib/devices/hfet1/hfettemp.c
@@ -1,6 +1,9 @@
+/**********
+Imported from MacSpice3f4 - Antony Wilson
+Modified: Paolo Nenzi
+**********/
#include "ngspice.h"
-#include
#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);
diff --git a/src/spicelib/devices/hfet1/hfettrunc.c b/src/spicelib/devices/hfet1/hfettrunc.c
index 31f9c392c..3e952fb1b 100644
--- a/src/spicelib/devices/hfet1/hfettrunc.c
+++ b/src/spicelib/devices/hfet1/hfettrunc.c
@@ -1,6 +1,9 @@
+/**********
+Imported from MacSpice3f4 - Antony Wilson
+Modified: Paolo Nenzi
+**********/
#include "ngspice.h"
-#include
#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);
}
diff --git a/tests/hfet/id_vgs.cir b/tests/hfet/id_vgs.cir
new file mode 100644
index 000000000..8e993a01c
--- /dev/null
+++ b/tests/hfet/id_vgs.cir
@@ -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
diff --git a/tests/hfet/inverter.cir b/tests/hfet/inverter.cir
new file mode 100644
index 000000000..91e446fc8
--- /dev/null
+++ b/tests/hfet/inverter.cir
@@ -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