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:
parent
1def649a82
commit
dab7eea4f5
11
ChangeLog
11
ChangeLog
|
|
@ -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
16
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.
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ libhfet_a_SOURCES = \
|
|||
hfetmdel.c \
|
||||
hfetmpar.c \
|
||||
hfetparam.c \
|
||||
hfetpzl.c \
|
||||
hfetsetup.c \
|
||||
hfettemp.c \
|
||||
hfettrunc.c
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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) -
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ SPICEdev HFETAinfo = {
|
|||
DEVsetic : HFETAgetic,
|
||||
DEVask : HFETAask,
|
||||
DEVmodAsk : HFETAmAsk,
|
||||
DEVpzLoad : NULL,
|
||||
DEVpzLoad : HFETApzLoad,
|
||||
DEVconvTest : NULL,
|
||||
DEVsenSetup : NULL,
|
||||
DEVsenLoad : NULL,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
Loading…
Reference in New Issue