From dab7eea4f52b44e96a55a6b21afbc603f927627f Mon Sep 17 00:00:00 2001 From: pnenzi Date: Tue, 30 Dec 2003 09:20:47 +0000 Subject: [PATCH] Added dtemp and "m" to hfet1, pole-zero analysis and corrected a bug in unsetup function. Added two test netlists. --- ChangeLog | 11 +++ DEVICES | 16 +++- src/spicelib/devices/hfet1/Makefile.am | 1 + src/spicelib/devices/hfet1/hfet.c | 8 +- src/spicelib/devices/hfet1/hfetacl.c | 98 ++++++++++++---------- src/spicelib/devices/hfet1/hfetask.c | 34 ++++++-- src/spicelib/devices/hfet1/hfetdefs.h | 19 ++++- src/spicelib/devices/hfet1/hfetdel.c | 6 +- src/spicelib/devices/hfet1/hfetdest.c | 8 +- src/spicelib/devices/hfet1/hfetext.h | 26 ++---- src/spicelib/devices/hfet1/hfetgetic.c | 11 ++- src/spicelib/devices/hfet1/hfetinit.c | 2 +- src/spicelib/devices/hfet1/hfetload.c | 91 +++++++++++--------- src/spicelib/devices/hfet1/hfetmask.c | 7 +- src/spicelib/devices/hfet1/hfetmdel.c | 6 +- src/spicelib/devices/hfet1/hfetmpar.c | 10 +-- src/spicelib/devices/hfet1/hfetparam.c | 21 +++-- src/spicelib/devices/hfet1/hfetpzl.c | 111 +++++++++++++++++++++++++ src/spicelib/devices/hfet1/hfetsetup.c | 62 ++++++++------ src/spicelib/devices/hfet1/hfettemp.c | 19 ++++- src/spicelib/devices/hfet1/hfettrunc.c | 12 +-- tests/hfet/id_vgs.cir | 13 +++ tests/hfet/inverter.cir | 25 ++++++ 23 files changed, 425 insertions(+), 192 deletions(-) create mode 100644 src/spicelib/devices/hfet1/hfetpzl.c create mode 100644 tests/hfet/id_vgs.cir create mode 100644 tests/hfet/inverter.cir 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