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>
|
2003-12-27 Paolo Nenzi <p.nenzi@ieee.org>
|
||||||
|
|
||||||
* src/spicelib/devices/jfet2/*: Added parallel multiplier and "dtemp"
|
* 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 devices ***************************
|
||||||
***************************************************************************
|
***************************************************************************
|
||||||
|
|
||||||
HFET - HFET Level 1
|
HFET - HFET Level 1 (Ytterdal)
|
||||||
Initial release.
|
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
|
HFET2 - HFET Level 2
|
||||||
Initial release.
|
Initial release.
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ libhfet_a_SOURCES = \
|
||||||
hfetmdel.c \
|
hfetmdel.c \
|
||||||
hfetmpar.c \
|
hfetmpar.c \
|
||||||
hfetparam.c \
|
hfetparam.c \
|
||||||
|
hfetpzl.c \
|
||||||
hfetsetup.c \
|
hfetsetup.c \
|
||||||
hfettemp.c \
|
hfettemp.c \
|
||||||
hfettrunc.c
|
hfettrunc.c
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,9 @@
|
||||||
|
/**********
|
||||||
|
Imported from MacSpice3f4 - Antony Wilson
|
||||||
|
Modified: Paolo Nenzi
|
||||||
|
**********/
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include "ifsim.h"
|
#include "ifsim.h"
|
||||||
#include "devdefs.h"
|
#include "devdefs.h"
|
||||||
#include "hfetdefs.h"
|
#include "hfetdefs.h"
|
||||||
|
|
@ -10,9 +14,11 @@ IFparm HFETApTable[] = { /* parameters */
|
||||||
OP("off", HFETA_OFF, IF_FLAG ,"Device initially off"),
|
OP("off", HFETA_OFF, IF_FLAG ,"Device initially off"),
|
||||||
IOP("l", HFETA_LENGTH, IF_REAL ,"Length of device"),
|
IOP("l", HFETA_LENGTH, IF_REAL ,"Length of device"),
|
||||||
IOP("w", HFETA_WIDTH, IF_REAL ,"Width 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("icvds", HFETA_IC_VDS, IF_REAL ,"Initial D-S voltage"),
|
||||||
IOP("icvgs", HFETA_IC_VGS, IF_REAL ,"Initial G-S voltage"),
|
IOP("icvgs", HFETA_IC_VGS, IF_REAL ,"Initial G-S voltage"),
|
||||||
IOP("temp", HFETA_TEMP, IF_REAL ,"Instance temperature"),
|
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("dnode", HFETA_DRAINNODE, IF_INTEGER,"Number of drain node"),
|
||||||
OP("gnode", HFETA_GATENODE, IF_INTEGER,"Number of gate node"),
|
OP("gnode", HFETA_GATENODE, IF_INTEGER,"Number of gate node"),
|
||||||
OP("snode", HFETA_SOURCENODE, IF_INTEGER,"Number of source 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 "ngspice.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "hfetdefs.h"
|
#include "hfetdefs.h"
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
|
|
@ -8,9 +11,7 @@
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
HFETAacLoad(inModel,ckt)
|
HFETAacLoad(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
GENmodel *inModel;
|
|
||||||
CKTcircuit *ckt;
|
|
||||||
{
|
{
|
||||||
HFETAmodel *model = (HFETAmodel*)inModel;
|
HFETAmodel *model = (HFETAmodel*)inModel;
|
||||||
HFETAinstance *here;
|
HFETAinstance *here;
|
||||||
|
|
@ -25,11 +26,15 @@ HFETAacLoad(inModel,ckt)
|
||||||
double ggdpp;
|
double ggdpp;
|
||||||
double f;
|
double f;
|
||||||
|
|
||||||
|
double m;
|
||||||
|
|
||||||
for( ; model != NULL; model = model->HFETAnextModel )
|
for( ; model != NULL; model = model->HFETAnextModel )
|
||||||
{
|
{
|
||||||
for( here = model->HFETAinstances; here != NULL;
|
for( here = model->HFETAinstances; here != NULL;
|
||||||
here = here->HFETAnextInstance)
|
here = here->HFETAnextInstance) {
|
||||||
{
|
|
||||||
|
if (here->HFETAowner != ARCHme) continue;
|
||||||
|
|
||||||
gm = *(ckt->CKTstate0 + here->HFETAgm);
|
gm = *(ckt->CKTstate0 + here->HFETAgm);
|
||||||
gds = *(ckt->CKTstate0 + here->HFETAgds);
|
gds = *(ckt->CKTstate0 + here->HFETAgds);
|
||||||
xds = CDS*ckt->CKTomega;
|
xds = CDS*ckt->CKTomega;
|
||||||
|
|
@ -43,45 +48,48 @@ HFETAacLoad(inModel,ckt)
|
||||||
f = ckt->CKTomega/2/M_PI;
|
f = ckt->CKTomega/2/M_PI;
|
||||||
gds = gds*(1+0.5*model->HFETAkappa*(1+tanh((f-here->HFETAfgds)/here->HFETAdelf)));
|
gds = gds*(1+0.5*model->HFETAkappa*(1+tanh((f-here->HFETAfgds)/here->HFETAdelf)));
|
||||||
}
|
}
|
||||||
*(here->HFETAdrainDrainPtr) += model->HFETAdrainConduct;
|
|
||||||
*(here->HFETAsourceSourcePtr) += model->HFETAsourceConduct;
|
m = here->HFETAm;
|
||||||
*(here->HFETAgatePrimeGatePrimePtr) += (ggd+ggs+ggspp+ggdpp+model->HFETAgateConduct);
|
|
||||||
*(here->HFETAdrainPrimeDrainPrimePtr) += (gds+ggd+model->HFETAdrainConduct+model->HFETAgf);
|
*(here->HFETAdrainDrainPtr) += m * (model->HFETAdrainConduct);
|
||||||
*(here->HFETAsourcePrimeSourcePrimePtr) += (gds+gm+ggs+model->HFETAsourceConduct+model->HFETAgi);
|
*(here->HFETAsourceSourcePtr) += m * (model->HFETAsourceConduct);
|
||||||
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += (model->HFETAgi+ggspp);
|
*(here->HFETAgatePrimeGatePrimePtr) += m * (ggd+ggs+ggspp+ggdpp+model->HFETAgateConduct);
|
||||||
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += (model->HFETAgf+ggdpp);
|
*(here->HFETAdrainPrimeDrainPrimePtr) += m * (gds+ggd+model->HFETAdrainConduct+model->HFETAgf);
|
||||||
*(here->HFETAdrainDrainPrimePtr) -= model->HFETAdrainConduct;
|
*(here->HFETAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+model->HFETAsourceConduct+model->HFETAgi);
|
||||||
*(here->HFETAdrainPrimeDrainPtr) -= model->HFETAdrainConduct;
|
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += m * (model->HFETAgi+ggspp);
|
||||||
*(here->HFETAsourceSourcePrimePtr) -= model->HFETAsourceConduct;
|
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += m * (model->HFETAgf+ggdpp);
|
||||||
*(here->HFETAsourcePrimeSourcePtr) -= model->HFETAsourceConduct;
|
*(here->HFETAdrainDrainPrimePtr) -= m * (model->HFETAdrainConduct);
|
||||||
*(here->HFETAgatePrimeDrainPrimePtr) -= ggd;
|
*(here->HFETAdrainPrimeDrainPtr) -= m * (model->HFETAdrainConduct);
|
||||||
*(here->HFETAdrainPrimeGatePrimePtr) += (gm-ggd);
|
*(here->HFETAsourceSourcePrimePtr) -= m * (model->HFETAsourceConduct);
|
||||||
*(here->HFETAgatePrimeSourcePrimePtr) -= ggs;
|
*(here->HFETAsourcePrimeSourcePtr) -= m * (model->HFETAsourceConduct);
|
||||||
*(here->HFETAsourcePrimeGatePrimePtr) += (-ggs-gm);
|
*(here->HFETAgatePrimeDrainPrimePtr) -= m * (ggd);
|
||||||
*(here->HFETAdrainPrimeSourcePrimePtr) += (-gds-gm);
|
*(here->HFETAdrainPrimeGatePrimePtr) += m * (gm-ggd);
|
||||||
*(here->HFETAsourcePrimeDrainPrimePtr) -= gds;
|
*(here->HFETAgatePrimeSourcePrimePtr) -= m * (ggs);
|
||||||
*(here->HFETAsourcePrimeSourcePrmPrmPtr) -= model->HFETAgi;
|
*(here->HFETAsourcePrimeGatePrimePtr) += m * (-ggs-gm);
|
||||||
*(here->HFETAsourcePrmPrmSourcePrimePtr) -= model->HFETAgi;
|
*(here->HFETAdrainPrimeSourcePrimePtr) += m * (-gds-gm);
|
||||||
*(here->HFETAgatePrimeSourcePrmPrmPtr) -= ggspp;
|
*(here->HFETAsourcePrimeDrainPrimePtr) -= m * (gds);
|
||||||
*(here->HFETAsourcePrmPrmGatePrimePtr) -= ggspp;
|
*(here->HFETAsourcePrimeSourcePrmPrmPtr) -= m * (model->HFETAgi);
|
||||||
*(here->HFETAdrainPrimeDrainPrmPrmPtr) -= model->HFETAgf;
|
*(here->HFETAsourcePrmPrmSourcePrimePtr) -= m * (model->HFETAgi);
|
||||||
*(here->HFETAdrainPrmPrmDrainPrimePtr) -= model->HFETAgf;
|
*(here->HFETAgatePrimeSourcePrmPrmPtr) -= m * (ggspp);
|
||||||
*(here->HFETAgatePrimeDrainPrmPrmPtr) -= ggdpp;
|
*(here->HFETAsourcePrmPrmGatePrimePtr) -= m * (ggspp);
|
||||||
*(here->HFETAdrainPrmPrmGatePrimePtr) -= ggdpp;
|
*(here->HFETAdrainPrimeDrainPrmPrmPtr) -= m * (model->HFETAgf);
|
||||||
*(here->HFETAgateGatePtr) += model->HFETAgateConduct;
|
*(here->HFETAdrainPrmPrmDrainPrimePtr) -= m * (model->HFETAgf);
|
||||||
*(here->HFETAgateGatePrimePtr) -= model->HFETAgateConduct;
|
*(here->HFETAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp);
|
||||||
*(here->HFETAgatePrimeGatePtr) -= model->HFETAgateConduct;
|
*(here->HFETAdrainPrmPrmGatePrimePtr) -= m * (ggdpp);
|
||||||
*(here->HFETAgatePrimeGatePrimePtr+1) += xgd+xgs;
|
*(here->HFETAgateGatePtr) += m * (model->HFETAgateConduct);
|
||||||
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr+1) += xgd;
|
*(here->HFETAgateGatePrimePtr) -= m * (model->HFETAgateConduct);
|
||||||
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr+1) += xgs;
|
*(here->HFETAgatePrimeGatePtr) -= m * (model->HFETAgateConduct);
|
||||||
*(here->HFETAgatePrimeDrainPrmPrmPtr+1) -= xgd;
|
*(here->HFETAgatePrimeGatePrimePtr+1) += m * (xgd+xgs);
|
||||||
*(here->HFETAgatePrimeSourcePrmPrmPtr+1) -= xgs;
|
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr+1) += m * (xgd);
|
||||||
*(here->HFETAdrainPrmPrmGatePrimePtr+1) -= xgd;
|
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr+1) += m * (xgs);
|
||||||
*(here->HFETAsourcePrmPrmGatePrimePtr+1) -= xgs;
|
*(here->HFETAgatePrimeDrainPrmPrmPtr+1) -= m * (xgd);
|
||||||
*(here->HFETAdrainPrimeDrainPrimePtr+1) += xds;
|
*(here->HFETAgatePrimeSourcePrmPrmPtr+1) -= m * (xgs);
|
||||||
*(here->HFETAsourcePrimeSourcePrimePtr+1) += xds;
|
*(here->HFETAdrainPrmPrmGatePrimePtr+1) -= m * (xgd);
|
||||||
*(here->HFETAdrainPrimeSourcePrimePtr+1) -= xds;
|
*(here->HFETAsourcePrmPrmGatePrimePtr+1) -= m * (xgs);
|
||||||
*(here->HFETAsourcePrimeDrainPrimePtr+1) -= xds;
|
*(here->HFETAdrainPrimeDrainPrimePtr+1) += m * (xds);
|
||||||
|
*(here->HFETAsourcePrimeSourcePrimePtr+1) += m * (xds);
|
||||||
|
*(here->HFETAdrainPrimeSourcePrimePtr+1) -= m * (xds);
|
||||||
|
*(here->HFETAsourcePrimeDrainPrimePtr+1) -= m * (xds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return(OK);
|
return(OK);
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ Imported into HFETA source: Paolo Nenzi 2001
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "devdefs.h"
|
#include "devdefs.h"
|
||||||
#include "ifsim.h"
|
#include "ifsim.h"
|
||||||
|
|
@ -18,12 +17,7 @@ Imported into HFETA source: Paolo Nenzi 2001
|
||||||
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
int
|
int
|
||||||
HFETAask(ckt,inst,which,value,select)
|
HFETAask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select)
|
||||||
CKTcircuit *ckt;
|
|
||||||
GENinstance *inst;
|
|
||||||
int which;
|
|
||||||
IFvalue *value;
|
|
||||||
IFvalue *select;
|
|
||||||
{
|
{
|
||||||
HFETAinstance *here = (HFETAinstance*)inst;
|
HFETAinstance *here = (HFETAinstance*)inst;
|
||||||
static char *msg = "Current and power not available in ac analysis";
|
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;
|
value->rValue = here->HFETAlength;
|
||||||
return (OK);
|
return (OK);
|
||||||
case HFETA_WIDTH:
|
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:
|
case HFETA_IC_VDS:
|
||||||
value->rValue = here->HFETAicVDS;
|
value->rValue = here->HFETAicVDS;
|
||||||
return (OK);
|
return (OK);
|
||||||
|
|
@ -58,7 +57,11 @@ HFETAask(ckt,inst,which,value,select)
|
||||||
value->iValue = here->HFETAsourcePrimeNode;
|
value->iValue = here->HFETAsourcePrimeNode;
|
||||||
return (OK);
|
return (OK);
|
||||||
case HFETA_TEMP:
|
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:
|
case HFETA_VGS:
|
||||||
value->rValue = *(ckt->CKTstate0 + here->HFETAvgs);
|
value->rValue = *(ckt->CKTstate0 + here->HFETAvgs);
|
||||||
return (OK);
|
return (OK);
|
||||||
|
|
@ -67,36 +70,47 @@ HFETAask(ckt,inst,which,value,select)
|
||||||
return (OK);
|
return (OK);
|
||||||
case HFETA_CG:
|
case HFETA_CG:
|
||||||
value->rValue = *(ckt->CKTstate0 + here->HFETAcg);
|
value->rValue = *(ckt->CKTstate0 + here->HFETAcg);
|
||||||
|
value->rValue *= here->HFETAm;
|
||||||
return (OK);
|
return (OK);
|
||||||
case HFETA_CD:
|
case HFETA_CD:
|
||||||
value->rValue = *(ckt->CKTstate0 + here->HFETAcd);
|
value->rValue = *(ckt->CKTstate0 + here->HFETAcd);
|
||||||
|
value->rValue *= here->HFETAm;
|
||||||
return (OK);
|
return (OK);
|
||||||
case HFETA_CGD:
|
case HFETA_CGD:
|
||||||
value->rValue = *(ckt->CKTstate0 + here->HFETAcgd);
|
value->rValue = *(ckt->CKTstate0 + here->HFETAcgd);
|
||||||
|
value->rValue *= here->HFETAm;
|
||||||
return (OK);
|
return (OK);
|
||||||
case HFETA_GM:
|
case HFETA_GM:
|
||||||
value->rValue = *(ckt->CKTstate0 + here->HFETAgm);
|
value->rValue = *(ckt->CKTstate0 + here->HFETAgm);
|
||||||
|
value->rValue *= here->HFETAm;
|
||||||
return (OK);
|
return (OK);
|
||||||
case HFETA_GDS:
|
case HFETA_GDS:
|
||||||
value->rValue = *(ckt->CKTstate0 + here->HFETAgds);
|
value->rValue = *(ckt->CKTstate0 + here->HFETAgds);
|
||||||
|
value->rValue *= here->HFETAm;
|
||||||
return (OK);
|
return (OK);
|
||||||
case HFETA_GGS:
|
case HFETA_GGS:
|
||||||
value->rValue = *(ckt->CKTstate0 + here->HFETAggs);
|
value->rValue = *(ckt->CKTstate0 + here->HFETAggs);
|
||||||
|
value->rValue *= here->HFETAm;
|
||||||
return (OK);
|
return (OK);
|
||||||
case HFETA_GGD:
|
case HFETA_GGD:
|
||||||
value->rValue = *(ckt->CKTstate0 + here->HFETAggd);
|
value->rValue = *(ckt->CKTstate0 + here->HFETAggd);
|
||||||
|
value->rValue *= here->HFETAm;
|
||||||
return (OK);
|
return (OK);
|
||||||
case HFETA_QGS:
|
case HFETA_QGS:
|
||||||
value->rValue = *(ckt->CKTstate0 + here->HFETAqgs);
|
value->rValue = *(ckt->CKTstate0 + here->HFETAqgs);
|
||||||
|
value->rValue *= here->HFETAm;
|
||||||
return (OK);
|
return (OK);
|
||||||
case HFETA_CQGS:
|
case HFETA_CQGS:
|
||||||
value->rValue = *(ckt->CKTstate0 + here->HFETAcqgs);
|
value->rValue = *(ckt->CKTstate0 + here->HFETAcqgs);
|
||||||
|
value->rValue *= here->HFETAm;
|
||||||
return (OK);
|
return (OK);
|
||||||
case HFETA_QGD:
|
case HFETA_QGD:
|
||||||
value->rValue = *(ckt->CKTstate0 + here->HFETAqgd);
|
value->rValue = *(ckt->CKTstate0 + here->HFETAqgd);
|
||||||
|
value->rValue *= here->HFETAm;
|
||||||
return (OK);
|
return (OK);
|
||||||
case HFETA_CQGD:
|
case HFETA_CQGD:
|
||||||
value->rValue = *(ckt->CKTstate0 + here->HFETAcqgd);
|
value->rValue = *(ckt->CKTstate0 + here->HFETAcqgd);
|
||||||
|
value->rValue *= here->HFETAm;
|
||||||
return (OK);
|
return (OK);
|
||||||
case HFETA_CS :
|
case HFETA_CS :
|
||||||
if (ckt->CKTcurrentAnalysis & DOING_AC) {
|
if (ckt->CKTcurrentAnalysis & DOING_AC) {
|
||||||
|
|
@ -107,6 +121,7 @@ HFETAask(ckt,inst,which,value,select)
|
||||||
} else {
|
} else {
|
||||||
value->rValue = -*(ckt->CKTstate0 + here->HFETAcd);
|
value->rValue = -*(ckt->CKTstate0 + here->HFETAcd);
|
||||||
value->rValue -= *(ckt->CKTstate0 + here->HFETAcg);
|
value->rValue -= *(ckt->CKTstate0 + here->HFETAcg);
|
||||||
|
value->rValue *= here->HFETAm;
|
||||||
}
|
}
|
||||||
return(OK);
|
return(OK);
|
||||||
case HFETA_POWER :
|
case HFETA_POWER :
|
||||||
|
|
@ -123,6 +138,7 @@ HFETAask(ckt,inst,which,value,select)
|
||||||
value->rValue -= (*(ckt->CKTstate0+here->HFETAcd) +
|
value->rValue -= (*(ckt->CKTstate0+here->HFETAcd) +
|
||||||
*(ckt->CKTstate0 + here->HFETAcg)) *
|
*(ckt->CKTstate0 + here->HFETAcg)) *
|
||||||
*(ckt->CKTrhsOld + here->HFETAsourceNode);
|
*(ckt->CKTrhsOld + here->HFETAsourceNode);
|
||||||
|
value->rValue *= here->HFETAm;
|
||||||
}
|
}
|
||||||
return(OK);
|
return(OK);
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
/**********
|
||||||
|
Imported from MacSpice3f4 - Antony Wilson
|
||||||
|
Modified: Paolo Nenzi
|
||||||
|
**********/
|
||||||
|
|
||||||
#ifndef HFETA
|
#ifndef HFETA
|
||||||
#define HFETA
|
#define HFETA
|
||||||
|
|
||||||
|
|
@ -26,9 +31,11 @@ typedef struct sHFETAinstance {
|
||||||
int HFETAsourcePrmPrmNode;
|
int HFETAsourcePrmPrmNode;
|
||||||
double HFETAlength;
|
double HFETAlength;
|
||||||
double HFETAwidth;
|
double HFETAwidth;
|
||||||
|
double HFETAm;
|
||||||
double HFETAicVDS;
|
double HFETAicVDS;
|
||||||
double HFETAicVGS;
|
double HFETAicVGS;
|
||||||
double HFETAtemp;
|
double HFETAtemp;
|
||||||
|
double HFETAdtemp;
|
||||||
double HFETAtVto;
|
double HFETAtVto;
|
||||||
double HFETAtMu;
|
double HFETAtMu;
|
||||||
double HFETAtLambda;
|
double HFETAtLambda;
|
||||||
|
|
@ -92,10 +99,12 @@ typedef struct sHFETAinstance {
|
||||||
|
|
||||||
int HFETAoff;
|
int HFETAoff;
|
||||||
unsigned HFETAlengthGiven : 1;
|
unsigned HFETAlengthGiven : 1;
|
||||||
unsigned HFETAwidthGiven : 1;
|
unsigned HFETAwidthGiven : 1;
|
||||||
unsigned HFETAicVDSGiven : 1;
|
unsigned HFETAmGiven : 1;
|
||||||
unsigned HFETAicVGSGiven : 1;
|
unsigned HFETAicVDSGiven : 1;
|
||||||
unsigned HFETAtempGiven : 1;
|
unsigned HFETAicVGSGiven : 1;
|
||||||
|
unsigned HFETAtempGiven : 1;
|
||||||
|
unsigned HFETAdtempGiven : 1;
|
||||||
int HFETAmode;
|
int HFETAmode;
|
||||||
|
|
||||||
double HFETAn0;
|
double HFETAn0;
|
||||||
|
|
@ -280,6 +289,8 @@ typedef struct sHFETAmodel {
|
||||||
#define HFETA_OFF 7
|
#define HFETA_OFF 7
|
||||||
#define HFETA_CS 8
|
#define HFETA_CS 8
|
||||||
#define HFETA_POWER 9
|
#define HFETA_POWER 9
|
||||||
|
#define HFETA_DTEMP 10
|
||||||
|
#define HFETA_M 11
|
||||||
|
|
||||||
/* model parameters */
|
/* model parameters */
|
||||||
#define HFETA_MOD_VTO 101
|
#define HFETA_MOD_VTO 101
|
||||||
|
|
|
||||||
|
|
@ -7,17 +7,13 @@ Imported into hfeta model: Paolo Nenzi 2001
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include "hfetdefs.h"
|
#include "hfetdefs.h"
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
HFETAdelete(inModel,name,inst)
|
HFETAdelete(GENmodel *inModel, IFuid name, GENinstance **inst)
|
||||||
GENmodel *inModel;
|
|
||||||
IFuid name;
|
|
||||||
GENinstance **inst;
|
|
||||||
{
|
{
|
||||||
HFETAmodel *model = (HFETAmodel*)inModel;
|
HFETAmodel *model = (HFETAmodel*)inModel;
|
||||||
HFETAinstance **fast = (HFETAinstance**)inst;
|
HFETAinstance **fast = (HFETAinstance**)inst;
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,15 @@
|
||||||
|
/**********
|
||||||
|
Imported from MacSpice3f4 - Antony Wilson
|
||||||
|
Modified: Paolo Nenzi
|
||||||
|
**********/
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include "hfetdefs.h"
|
#include "hfetdefs.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
HFETAdestroy(inModel)
|
HFETAdestroy(GENmodel **inModel)
|
||||||
GENmodel **inModel;
|
|
||||||
{
|
{
|
||||||
HFETAmodel **model = (HFETAmodel**)inModel;
|
HFETAmodel **model = (HFETAmodel**)inModel;
|
||||||
HFETAinstance *here;
|
HFETAinstance *here;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,8 @@
|
||||||
#ifdef __STDC__
|
/**********
|
||||||
|
Imported from MacSpice3f4 - Antony Wilson
|
||||||
|
Modified: Paolo Nenzi
|
||||||
|
**********/
|
||||||
|
|
||||||
extern int HFETAacLoad(GENmodel*,CKTcircuit*);
|
extern int HFETAacLoad(GENmodel*,CKTcircuit*);
|
||||||
extern int HFETAask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*);
|
extern int HFETAask(CKTcircuit*,GENinstance*,int,IFvalue*,IFvalue*);
|
||||||
extern int HFETAdelete(GENmodel*,IFuid,GENinstance**);
|
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 HFETAmDelete(GENmodel**,IFuid,GENmodel*);
|
||||||
extern int HFETAmParam(int,IFvalue*,GENmodel*);
|
extern int HFETAmParam(int,IFvalue*,GENmodel*);
|
||||||
extern int HFETAparam(int,IFvalue*,GENinstance*,IFvalue*);
|
extern int HFETAparam(int,IFvalue*,GENinstance*,IFvalue*);
|
||||||
|
extern int HFETApzLoad(GENmodel*, CKTcircuit*, SPcomplex*);
|
||||||
extern int HFETAsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
|
extern int HFETAsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
|
||||||
extern int HFETAtemp(GENmodel*,CKTcircuit*);
|
extern int HFETAtemp(GENmodel*,CKTcircuit*);
|
||||||
extern int HFETAtrunc(GENmodel*,CKTcircuit*,double*);
|
extern int HFETAtrunc(GENmodel*,CKTcircuit*,double*);
|
||||||
extern int HFETAunsetup(GENmodel*,CKTcircuit*);
|
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 "ngspice.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "hfetdefs.h"
|
#include "hfetdefs.h"
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
|
|
@ -8,9 +11,7 @@
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
HFETAgetic(inModel,ckt)
|
HFETAgetic(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
GENmodel *inModel;
|
|
||||||
CKTcircuit *ckt;
|
|
||||||
{
|
{
|
||||||
HFETAmodel *model = (HFETAmodel*)inModel;
|
HFETAmodel *model = (HFETAmodel*)inModel;
|
||||||
HFETAinstance *here;
|
HFETAinstance *here;
|
||||||
|
|
@ -21,6 +22,8 @@ CKTcircuit *ckt;
|
||||||
|
|
||||||
for( ; model ; model = model->HFETAnextModel) {
|
for( ; model ; model = model->HFETAnextModel) {
|
||||||
for(here = model->HFETAinstances; here ; here = here->HFETAnextInstance) {
|
for(here = model->HFETAinstances; here ; here = here->HFETAnextInstance) {
|
||||||
|
if (here->HFETAowner != ARCHme) continue;
|
||||||
|
|
||||||
if(!here->HFETAicVDSGiven) {
|
if(!here->HFETAicVDSGiven) {
|
||||||
here->HFETAicVDS =
|
here->HFETAicVDS =
|
||||||
*(ckt->CKTrhs + here->HFETAdrainNode) -
|
*(ckt->CKTrhs + here->HFETAdrainNode) -
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ SPICEdev HFETAinfo = {
|
||||||
DEVsetic : HFETAgetic,
|
DEVsetic : HFETAgetic,
|
||||||
DEVask : HFETAask,
|
DEVask : HFETAask,
|
||||||
DEVmodAsk : HFETAmAsk,
|
DEVmodAsk : HFETAmAsk,
|
||||||
DEVpzLoad : NULL,
|
DEVpzLoad : HFETApzLoad,
|
||||||
DEVconvTest : NULL,
|
DEVconvTest : NULL,
|
||||||
DEVsenSetup : NULL,
|
DEVsenSetup : NULL,
|
||||||
DEVsenLoad : NULL,
|
DEVsenLoad : NULL,
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,9 @@
|
||||||
|
/**********
|
||||||
|
Imported from MacSpice3f4 - Antony Wilson
|
||||||
|
Modified: Paolo Nenzi
|
||||||
|
**********/
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include "devdefs.h"
|
#include "devdefs.h"
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "hfetdefs.h"
|
#include "hfetdefs.h"
|
||||||
|
|
@ -26,12 +30,10 @@ static void hfeta(HFETAmodel *model, HFETAinstance *here, CKTcircuit *ckt,
|
||||||
|
|
||||||
void Pause(void);
|
void Pause(void);
|
||||||
|
|
||||||
int HFETAload(inModel, ckt)
|
int HFETAload(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
GENmodel *inModel;
|
|
||||||
register CKTcircuit *ckt;
|
|
||||||
{
|
{
|
||||||
register HFETAmodel *model = (HFETAmodel*)inModel;
|
HFETAmodel *model = (HFETAmodel*)inModel;
|
||||||
register HFETAinstance *here;
|
HFETAinstance *here;
|
||||||
double capgd;
|
double capgd;
|
||||||
double capgs;
|
double capgs;
|
||||||
double cd;
|
double cd;
|
||||||
|
|
@ -78,9 +80,15 @@ register CKTcircuit *ckt;
|
||||||
int icheck;
|
int icheck;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
|
double m;
|
||||||
|
|
||||||
for( ; model != NULL; model = model->HFETAnextModel ) {
|
for( ; model != NULL; model = model->HFETAnextModel ) {
|
||||||
for (here = model->HFETAinstances; here != NULL ;
|
for (here = model->HFETAinstances; here != NULL ;
|
||||||
here=here->HFETAnextInstance) {
|
here=here->HFETAnextInstance) {
|
||||||
|
|
||||||
|
if (here->HFETAowner != ARCHme) continue;
|
||||||
|
|
||||||
|
|
||||||
vcrit = here->HFETAvcrit;
|
vcrit = here->HFETAvcrit;
|
||||||
vt = CONSTKoverQ * here->HFETAtemp;
|
vt = CONSTKoverQ * here->HFETAtemp;
|
||||||
icheck = 0;
|
icheck = 0;
|
||||||
|
|
@ -411,51 +419,54 @@ register CKTcircuit *ckt;
|
||||||
* load current vector
|
* load current vector
|
||||||
*/
|
*/
|
||||||
load:
|
load:
|
||||||
|
|
||||||
|
m = here->HFETAm;
|
||||||
|
|
||||||
ceqgd = model->HFETAtype*(cgd+cgdpp-ggd*vgd-gmg*vgs-gmd*vds-ggdpp*vgdpp);
|
ceqgd = model->HFETAtype*(cgd+cgdpp-ggd*vgd-gmg*vgs-gmd*vds-ggdpp*vgdpp);
|
||||||
ceqgs = model->HFETAtype*(cgs + cgspp - ggs*vgs - ggspp*vgspp);
|
ceqgs = model->HFETAtype*(cgs + cgspp - ggs*vgs - ggspp*vgspp);
|
||||||
cdreq = model->HFETAtype*(cd + cgd + cgdpp - gds*vds - gm*vgs);
|
cdreq = model->HFETAtype*(cd + cgd + cgdpp - gds*vds - gm*vgs);
|
||||||
*(ckt->CKTrhs + here->HFETAgatePrimeNode) += (-ceqgs-ceqgd);
|
*(ckt->CKTrhs + here->HFETAgatePrimeNode) += m * (-ceqgs-ceqgd);
|
||||||
ceqgd = model->HFETAtype*(cgd-ggd*vgd-gmg*vgs-gmd*vds);
|
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);
|
ceqgd = model->HFETAtype*(cgdpp-ggdpp*vgdpp);
|
||||||
*(ckt->CKTrhs + here->HFETAdrainPrmPrmNode) += ceqgd;
|
*(ckt->CKTrhs + here->HFETAdrainPrmPrmNode) += m * ceqgd;
|
||||||
ceqgs = model->HFETAtype*(cgs-ggs*vgs);
|
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);
|
ceqgs = model->HFETAtype*(cgspp-ggspp*vgspp);
|
||||||
*(ckt->CKTrhs + here->HFETAsourcePrmPrmNode) += ceqgs;
|
*(ckt->CKTrhs + here->HFETAsourcePrmPrmNode) += m * ceqgs;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* load y matrix
|
* load y matrix
|
||||||
*/
|
*/
|
||||||
|
|
||||||
*(here->HFETAdrainDrainPtr) += model->HFETAdrainConduct;
|
*(here->HFETAdrainDrainPtr) += m * (model->HFETAdrainConduct);
|
||||||
*(here->HFETAsourceSourcePtr) += model->HFETAsourceConduct;
|
*(here->HFETAsourceSourcePtr) += m * (model->HFETAsourceConduct);
|
||||||
*(here->HFETAgatePrimeGatePrimePtr) += (ggd+ggs+ggspp+ggdpp+gmg+model->HFETAgateConduct);
|
*(here->HFETAgatePrimeGatePrimePtr) += m * (ggd+ggs+ggspp+ggdpp+gmg+model->HFETAgateConduct);
|
||||||
*(here->HFETAdrainPrimeDrainPrimePtr) += (gds+ggd-gmd+model->HFETAdrainConduct+model->HFETAgf);
|
*(here->HFETAdrainPrimeDrainPrimePtr) += m * (gds+ggd-gmd+model->HFETAdrainConduct+model->HFETAgf);
|
||||||
*(here->HFETAsourcePrimeSourcePrimePtr) += (gds+gm+ggs+model->HFETAsourceConduct+model->HFETAgi);
|
*(here->HFETAsourcePrimeSourcePrimePtr) += m * (gds+gm+ggs+model->HFETAsourceConduct+model->HFETAgi);
|
||||||
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += (model->HFETAgi+ggspp);
|
*(here->HFETAsourcePrmPrmSourcePrmPrmPtr) += m * (model->HFETAgi+ggspp);
|
||||||
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += (model->HFETAgf+ggdpp);
|
*(here->HFETAdrainPrmPrmDrainPrmPrmPtr) += m * (model->HFETAgf+ggdpp);
|
||||||
*(here->HFETAdrainDrainPrimePtr) -= model->HFETAdrainConduct;
|
*(here->HFETAdrainDrainPrimePtr) -= m * (model->HFETAdrainConduct);
|
||||||
*(here->HFETAdrainPrimeDrainPtr) -= model->HFETAdrainConduct;
|
*(here->HFETAdrainPrimeDrainPtr) -= m * (model->HFETAdrainConduct);
|
||||||
*(here->HFETAsourceSourcePrimePtr) -= model->HFETAsourceConduct;
|
*(here->HFETAsourceSourcePrimePtr) -= m * (model->HFETAsourceConduct);
|
||||||
*(here->HFETAsourcePrimeSourcePtr) -= model->HFETAsourceConduct;
|
*(here->HFETAsourcePrimeSourcePtr) -= m * (model->HFETAsourceConduct);
|
||||||
*(here->HFETAgatePrimeDrainPrimePtr) += -ggd+gmd;
|
*(here->HFETAgatePrimeDrainPrimePtr) += m * (-ggd+gmd);
|
||||||
*(here->HFETAdrainPrimeGatePrimePtr) += (gm-ggd-gmg);
|
*(here->HFETAdrainPrimeGatePrimePtr) += m * (gm-ggd-gmg);
|
||||||
*(here->HFETAgatePrimeSourcePrimePtr) -= ggs+gmg+gmd;
|
*(here->HFETAgatePrimeSourcePrimePtr) -= m * (ggs+gmg+gmd);
|
||||||
*(here->HFETAsourcePrimeGatePrimePtr) += (-ggs-gm);
|
*(here->HFETAsourcePrimeGatePrimePtr) += m * (-ggs-gm);
|
||||||
*(here->HFETAdrainPrimeSourcePrimePtr) += (-gds-gm+gmg+gmd);
|
*(here->HFETAdrainPrimeSourcePrimePtr) += m * (-gds-gm+gmg+gmd);
|
||||||
*(here->HFETAsourcePrimeDrainPrimePtr) -= gds;
|
*(here->HFETAsourcePrimeDrainPrimePtr) -= m * (gds);
|
||||||
*(here->HFETAsourcePrimeSourcePrmPrmPtr) -= model->HFETAgi;
|
*(here->HFETAsourcePrimeSourcePrmPrmPtr) -= m * (model->HFETAgi);
|
||||||
*(here->HFETAsourcePrmPrmSourcePrimePtr) -= model->HFETAgi;
|
*(here->HFETAsourcePrmPrmSourcePrimePtr) -= m * (model->HFETAgi);
|
||||||
*(here->HFETAgatePrimeSourcePrmPrmPtr) -= ggspp;
|
*(here->HFETAgatePrimeSourcePrmPrmPtr) -= m * (ggspp);
|
||||||
*(here->HFETAsourcePrmPrmGatePrimePtr) -= ggspp;
|
*(here->HFETAsourcePrmPrmGatePrimePtr) -= m * (ggspp);
|
||||||
*(here->HFETAdrainPrimeDrainPrmPrmPtr) -= model->HFETAgf;
|
*(here->HFETAdrainPrimeDrainPrmPrmPtr) -= m * (model->HFETAgf);
|
||||||
*(here->HFETAdrainPrmPrmDrainPrimePtr) -= model->HFETAgf;
|
*(here->HFETAdrainPrmPrmDrainPrimePtr) -= m * (model->HFETAgf);
|
||||||
*(here->HFETAgatePrimeDrainPrmPrmPtr) -= ggdpp;
|
*(here->HFETAgatePrimeDrainPrmPrmPtr) -= m * (ggdpp);
|
||||||
*(here->HFETAdrainPrmPrmGatePrimePtr) -= ggdpp;
|
*(here->HFETAdrainPrmPrmGatePrimePtr) -= m * (ggdpp);
|
||||||
*(here->HFETAgateGatePtr) += model->HFETAgateConduct;
|
*(here->HFETAgateGatePtr) += m * (model->HFETAgateConduct);
|
||||||
*(here->HFETAgateGatePrimePtr) -= model->HFETAgateConduct;
|
*(here->HFETAgateGatePrimePtr) -= m * (model->HFETAgateConduct);
|
||||||
*(here->HFETAgatePrimeGatePtr) -= model->HFETAgateConduct;
|
*(here->HFETAgatePrimeGatePtr) -= m * (model->HFETAgateConduct);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ Imported into HFETA model: Paolo Nenzi 2001
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "devdefs.h"
|
#include "devdefs.h"
|
||||||
#include "ifsim.h"
|
#include "ifsim.h"
|
||||||
|
|
@ -18,11 +17,7 @@ Imported into HFETA model: Paolo Nenzi 2001
|
||||||
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
int
|
int
|
||||||
HFETAmAsk(ckt,inst,which,value)
|
HFETAmAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
|
||||||
CKTcircuit *ckt;
|
|
||||||
GENmodel *inst;
|
|
||||||
int which;
|
|
||||||
IFvalue *value;
|
|
||||||
{
|
{
|
||||||
HFETAmodel *here = (HFETAmodel*)inst;
|
HFETAmodel *here = (HFETAmodel*)inst;
|
||||||
switch(which) {
|
switch(which) {
|
||||||
|
|
|
||||||
|
|
@ -7,17 +7,13 @@ Imported into hfeta model: Paolo Nenzi 2001
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include "hfetdefs.h"
|
#include "hfetdefs.h"
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
#include "suffix.h"
|
#include "suffix.h"
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
HFETAmDelete(inModel,modname,kill)
|
HFETAmDelete(GENmodel **inModel, IFuid modname, GENmodel *kill)
|
||||||
GENmodel **inModel;
|
|
||||||
IFuid modname;
|
|
||||||
GENmodel *kill;
|
|
||||||
{
|
{
|
||||||
HFETAmodel **model = (HFETAmodel**)inModel;
|
HFETAmodel **model = (HFETAmodel**)inModel;
|
||||||
HFETAmodel *modfast = (HFETAmodel*)kill;
|
HFETAmodel *modfast = (HFETAmodel*)kill;
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
|
/**********
|
||||||
|
Imported from MacSpice3f4 - Antony Wilson
|
||||||
|
Modified: Paolo Nenzi
|
||||||
|
**********/
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include "const.h"
|
#include "const.h"
|
||||||
#include "ifsim.h"
|
#include "ifsim.h"
|
||||||
#include "hfetdefs.h"
|
#include "hfetdefs.h"
|
||||||
|
|
@ -9,10 +12,7 @@
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
HFETAmParam(param,value,inModel)
|
HFETAmParam(int param, IFvalue *value, GENmodel *inModel)
|
||||||
int param;
|
|
||||||
IFvalue *value;
|
|
||||||
GENmodel *inModel;
|
|
||||||
{
|
{
|
||||||
HFETAmodel *model = (HFETAmodel*)inModel;
|
HFETAmodel *model = (HFETAmodel*)inModel;
|
||||||
switch(param)
|
switch(param)
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
|
/**********
|
||||||
|
Imported from MacSpice3f4 - Antony Wilson
|
||||||
|
Modified: Paolo Nenzi
|
||||||
|
**********/
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include "ifsim.h"
|
#include "ifsim.h"
|
||||||
#include "hfetdefs.h"
|
#include "hfetdefs.h"
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
|
|
@ -9,11 +12,7 @@
|
||||||
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
int
|
int
|
||||||
HFETAparam(param,value,inst,select)
|
HFETAparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
|
||||||
int param;
|
|
||||||
IFvalue *value;
|
|
||||||
GENinstance *inst;
|
|
||||||
IFvalue *select;
|
|
||||||
{
|
{
|
||||||
HFETAinstance *here = (HFETAinstance*)inst;
|
HFETAinstance *here = (HFETAinstance*)inst;
|
||||||
switch(param) {
|
switch(param) {
|
||||||
|
|
@ -25,6 +24,10 @@ HFETAparam(param,value,inst,select)
|
||||||
here->HFETAwidth = value->rValue;
|
here->HFETAwidth = value->rValue;
|
||||||
here->HFETAwidthGiven = TRUE;
|
here->HFETAwidthGiven = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case HFETA_M:
|
||||||
|
here->HFETAm = value->rValue;
|
||||||
|
here->HFETAmGiven = TRUE;
|
||||||
|
break;
|
||||||
case HFETA_IC_VDS:
|
case HFETA_IC_VDS:
|
||||||
here->HFETAicVDS = value->rValue;
|
here->HFETAicVDS = value->rValue;
|
||||||
here->HFETAicVDSGiven = TRUE;
|
here->HFETAicVDSGiven = TRUE;
|
||||||
|
|
@ -50,9 +53,13 @@ HFETAparam(param,value,inst,select)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case HFETA_TEMP:
|
case HFETA_TEMP:
|
||||||
here->HFETAtemp = value->rValue+CONSTCtoK;
|
here->HFETAtemp = value->rValue + CONSTCtoK;
|
||||||
here->HFETAtempGiven = TRUE;
|
here->HFETAtempGiven = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case HFETA_DTEMP:
|
||||||
|
here->HFETAdtemp = value->rValue;
|
||||||
|
here->HFETAdtempGiven = TRUE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return(E_BADPARM);
|
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 "ngspice.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include "smpdefs.h"
|
#include "smpdefs.h"
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "hfetdefs.h"
|
#include "hfetdefs.h"
|
||||||
|
|
@ -12,11 +15,7 @@
|
||||||
//#define CHARGE 1.60219e-19
|
//#define CHARGE 1.60219e-19
|
||||||
|
|
||||||
int
|
int
|
||||||
HFETAsetup(matrix,inModel,ckt,states)
|
HFETAsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
|
||||||
SMPmatrix *matrix;
|
|
||||||
GENmodel *inModel;
|
|
||||||
CKTcircuit *ckt;
|
|
||||||
int *states;
|
|
||||||
/* load the diode structure with those pointers needed later
|
/* load the diode structure with those pointers needed later
|
||||||
* for fast matrix loading
|
* for fast matrix loading
|
||||||
*/
|
*/
|
||||||
|
|
@ -230,17 +229,19 @@ HFETAsetup(matrix,inModel,ckt,states)
|
||||||
/* loop through all the instances of the model */
|
/* loop through all the instances of the model */
|
||||||
for (here = model->HFETAinstances; here != NULL ;
|
for (here = model->HFETAinstances; here != NULL ;
|
||||||
here=here->HFETAnextInstance) {
|
here=here->HFETAnextInstance) {
|
||||||
|
|
||||||
|
if (here->HFETAowner != ARCHme) goto matrixpointers;
|
||||||
|
|
||||||
if(!here->HFETAlengthGiven) {
|
if(!here->HFETAlengthGiven) {
|
||||||
here->HFETAlength = 1e-6;
|
here->HFETAlength = 1e-6;
|
||||||
}
|
}
|
||||||
if(!here->HFETAwidthGiven) {
|
if(!here->HFETAwidthGiven) {
|
||||||
here->HFETAwidth = 20e-6;
|
here->HFETAwidth = 20e-6;
|
||||||
}
|
}
|
||||||
if(!here->HFETAtempGiven) {
|
if(!here->HFETAmGiven) {
|
||||||
here->HFETAtemp = ckt->CKTtemp;
|
here->HFETAm = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
here->HFETAstate = *states;
|
here->HFETAstate = *states;
|
||||||
// *states += 24;
|
// *states += 24;
|
||||||
*states += HFETAnumStates;
|
*states += HFETAnumStates;
|
||||||
|
|
@ -272,8 +273,7 @@ matrixpointers:
|
||||||
error = CKTmkVolt(ckt,&tmp,here->HFETAname,"drain");
|
error = CKTmkVolt(ckt,&tmp,here->HFETAname,"drain");
|
||||||
if(error) return(error);
|
if(error) return(error);
|
||||||
here->HFETAdrainPrimeNode = tmp->number;
|
here->HFETAdrainPrimeNode = tmp->number;
|
||||||
|
|
||||||
/* XXX: Applied AlansFixes */
|
|
||||||
if (ckt->CKTcopyNodesets) {
|
if (ckt->CKTcopyNodesets) {
|
||||||
CKTnode *tmpNode;
|
CKTnode *tmpNode;
|
||||||
IFuid tmpName;
|
IFuid tmpName;
|
||||||
|
|
@ -294,13 +294,12 @@ matrixpointers:
|
||||||
error = CKTmkVolt(ckt,&tmp,here->HFETAname,"gate");
|
error = CKTmkVolt(ckt,&tmp,here->HFETAname,"gate");
|
||||||
if(error) return(error);
|
if(error) return(error);
|
||||||
here->HFETAgatePrimeNode = tmp->number;
|
here->HFETAgatePrimeNode = tmp->number;
|
||||||
|
|
||||||
/* XXX: Applied AlansFixes */
|
|
||||||
if (ckt->CKTcopyNodesets) {
|
if (ckt->CKTcopyNodesets) {
|
||||||
CKTnode *tmpNode;
|
CKTnode *tmpNode;
|
||||||
IFuid tmpName;
|
IFuid tmpName;
|
||||||
|
|
||||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
if (CKTinst2Node(ckt,here,2,&tmpNode,&tmpName)==OK) {
|
||||||
if (tmpNode->nsGiven) {
|
if (tmpNode->nsGiven) {
|
||||||
tmp->nodeset=tmpNode->nodeset;
|
tmp->nodeset=tmpNode->nodeset;
|
||||||
tmp->nsGiven=tmpNode->nsGiven;
|
tmp->nsGiven=tmpNode->nsGiven;
|
||||||
|
|
@ -315,8 +314,7 @@ matrixpointers:
|
||||||
error = CKTmkVolt(ckt,&tmp,here->HFETAname,"gd");
|
error = CKTmkVolt(ckt,&tmp,here->HFETAname,"gd");
|
||||||
if(error) return(error);
|
if(error) return(error);
|
||||||
here->HFETAdrainPrmPrmNode = tmp->number;
|
here->HFETAdrainPrmPrmNode = tmp->number;
|
||||||
|
|
||||||
/* XXX: Applied AlansFixes */
|
|
||||||
if (ckt->CKTcopyNodesets) {
|
if (ckt->CKTcopyNodesets) {
|
||||||
CKTnode *tmpNode;
|
CKTnode *tmpNode;
|
||||||
IFuid tmpName;
|
IFuid tmpName;
|
||||||
|
|
@ -337,13 +335,12 @@ matrixpointers:
|
||||||
error = CKTmkVolt(ckt,&tmp,here->HFETAname,"gs");
|
error = CKTmkVolt(ckt,&tmp,here->HFETAname,"gs");
|
||||||
if(error) return(error);
|
if(error) return(error);
|
||||||
here->HFETAsourcePrmPrmNode = tmp->number;
|
here->HFETAsourcePrmPrmNode = tmp->number;
|
||||||
|
|
||||||
/* XXX: Applied AlanFixes */
|
|
||||||
if (ckt->CKTcopyNodesets) {
|
if (ckt->CKTcopyNodesets) {
|
||||||
CKTnode *tmpNode;
|
CKTnode *tmpNode;
|
||||||
IFuid tmpName;
|
IFuid tmpName;
|
||||||
|
|
||||||
if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {
|
if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {
|
||||||
if (tmpNode->nsGiven) {
|
if (tmpNode->nsGiven) {
|
||||||
tmp->nodeset=tmpNode->nodeset;
|
tmp->nodeset=tmpNode->nodeset;
|
||||||
tmp->nsGiven=tmpNode->nsGiven;
|
tmp->nsGiven=tmpNode->nsGiven;
|
||||||
|
|
@ -395,9 +392,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
HFETAunsetup(inModel,ckt)
|
HFETAunsetup(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
GENmodel *inModel;
|
|
||||||
CKTcircuit *ckt;
|
|
||||||
{
|
{
|
||||||
HFETAmodel *model;
|
HFETAmodel *model;
|
||||||
HFETAinstance *here;
|
HFETAinstance *here;
|
||||||
|
|
@ -420,12 +415,27 @@ HFETAunsetup(inModel,ckt)
|
||||||
CKTdltNNum(ckt, here->HFETAsourcePrimeNode);
|
CKTdltNNum(ckt, here->HFETAsourcePrimeNode);
|
||||||
here->HFETAsourcePrimeNode = 0;
|
here->HFETAsourcePrimeNode = 0;
|
||||||
}
|
}
|
||||||
} if (here->HFETAgatePrimeNode
|
if (here->HFETAgatePrimeNode
|
||||||
&& here->HFETAgatePrimeNode != here->HFETAgateNode)
|
&& here->HFETAgatePrimeNode != here->HFETAgateNode)
|
||||||
{
|
{
|
||||||
CKTdltNNum(ckt, here->HFETAgatePrimeNode);
|
CKTdltNNum(ckt, here->HFETAgatePrimeNode);
|
||||||
here->HFETAgatePrimeNode = 0;
|
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;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
|
/**********
|
||||||
|
Imported from MacSpice3f4 - Antony Wilson
|
||||||
|
Modified: Paolo Nenzi
|
||||||
|
**********/
|
||||||
|
|
||||||
#include "ngspice.h"
|
#include "ngspice.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include "smpdefs.h"
|
#include "smpdefs.h"
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "hfetdefs.h"
|
#include "hfetdefs.h"
|
||||||
|
|
@ -11,9 +14,7 @@
|
||||||
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
int
|
int
|
||||||
HFETAtemp(inModel,ckt)
|
HFETAtemp(GENmodel *inModel, CKTcircuit *ckt)
|
||||||
GENmodel *inModel;
|
|
||||||
CKTcircuit *ckt;
|
|
||||||
{
|
{
|
||||||
HFETAmodel *model = (HFETAmodel*)inModel;
|
HFETAmodel *model = (HFETAmodel*)inModel;
|
||||||
HFETAinstance *here;
|
HFETAinstance *here;
|
||||||
|
|
@ -57,6 +58,16 @@ HFETAtemp(inModel,ckt)
|
||||||
|
|
||||||
for (here = model->HFETAinstances; here != NULL ;
|
for (here = model->HFETAinstances; here != NULL ;
|
||||||
here=here->HFETAnextInstance) {
|
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;
|
vt = CONSTKoverQ*TEMP;
|
||||||
TLAMBDA = LAMBDA + KLAMBDA*(TEMP-ckt->CKTnomTemp);
|
TLAMBDA = LAMBDA + KLAMBDA*(TEMP-ckt->CKTnomTemp);
|
||||||
TMU = MU - KMU*(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 "ngspice.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include "cktdefs.h"
|
#include "cktdefs.h"
|
||||||
#include "hfetdefs.h"
|
#include "hfetdefs.h"
|
||||||
#include "sperror.h"
|
#include "sperror.h"
|
||||||
|
|
@ -8,16 +11,15 @@
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
HFETAtrunc(inModel,ckt,timeStep)
|
HFETAtrunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep)
|
||||||
GENmodel *inModel;
|
|
||||||
CKTcircuit *ckt;
|
|
||||||
double *timeStep;
|
|
||||||
{
|
{
|
||||||
HFETAmodel *model = (HFETAmodel*)inModel;
|
HFETAmodel *model = (HFETAmodel*)inModel;
|
||||||
HFETAinstance *here;
|
HFETAinstance *here;
|
||||||
|
|
||||||
for( ; model != NULL; model = model->HFETAnextModel) {
|
for( ; model != NULL; model = model->HFETAnextModel) {
|
||||||
for(here=model->HFETAinstances;here!=NULL;here = here->HFETAnextInstance){
|
for(here=model->HFETAinstances;here!=NULL;here = here->HFETAnextInstance){
|
||||||
|
if (here->HFETAowner != ARCHme) continue;
|
||||||
|
|
||||||
CKTterr(here->HFETAqgs,ckt,timeStep);
|
CKTterr(here->HFETAqgs,ckt,timeStep);
|
||||||
CKTterr(here->HFETAqgd,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