1 /**********
2 Imported from MacSpice3f4 - Antony Wilson
3 Modified: Paolo Nenzi
4 **********/
5 
6 #include "ngspice/ngspice.h"
7 #include "ngspice/smpdefs.h"
8 #include "ngspice/cktdefs.h"
9 #include "hfetdefs.h"
10 #include "ngspice/const.h"
11 #include "ngspice/sperror.h"
12 #include "ngspice/suffix.h"
13 
14 
15 /* ARGSUSED */
16 int
HFETAtemp(GENmodel * inModel,CKTcircuit * ckt)17 HFETAtemp(GENmodel *inModel, CKTcircuit *ckt)
18 {
19     HFETAmodel *model = (HFETAmodel*)inModel;
20     HFETAinstance *here;
21     double vt;
22     double temp;
23 
24     /*  loop through all the diode models */
25     for( ; model != NULL; model = HFETAnextModel(model)) {
26         if(model->HFETArd != 0) {
27             model->HFETAdrainConduct = 1/model->HFETArd;
28         } else {
29             model->HFETAdrainConduct = 0;
30         }
31         if(model->HFETArs != 0) {
32             model->HFETAsourceConduct = 1/model->HFETArs;
33         } else {
34             model->HFETAsourceConduct = 0;
35         }
36         if(model->HFETArg != 0) {
37             model->HFETAgateConduct = 1/model->HFETArg;
38         } else {
39             model->HFETAgateConduct = 0;
40         }
41         if(model->HFETAri != 0) {
42             model->HFETAgi = 1/model->HFETAri;
43         } else {
44             model->HFETAgi = 0;
45         }
46         if(model->HFETArf != 0) {
47             model->HFETAgf = 1/model->HFETArf;
48         } else {
49             model->HFETAgf = 0;
50         }
51         model->HFETAdeltaSqr = model->HFETAdelta*model->HFETAdelta;
52         model->HFETAthreshold *= model->HFETAtype;
53 
54         if(!model->HFETAvt2Given)
55           VT2 = VTO;
56         if(!model->HFETAvt1Given)
57           IN_VT1 = VTO+CHARGE*NMAX*DI/EPSI;
58 
59         for (here = HFETAinstances(model); here != NULL ;
60                 here=HFETAnextInstance(here)) {
61 
62             if(!here->HFETAdtempGiven) {
63                 here->HFETAdtemp = 0.0;
64             }
65 
66             if(!here->HFETAtempGiven) {
67                 here->HFETAtemp = ckt->CKTtemp + here->HFETAdtemp;
68             }
69 
70             vt      = CONSTKoverQ*TEMP;
71             TLAMBDA = LAMBDA + KLAMBDA*(TEMP-ckt->CKTnomTemp);
72             TMU     = MU - KMU*(TEMP-ckt->CKTnomTemp);
73             TVTO    = VTO - KVTO*(TEMP-ckt->CKTnomTemp);
74             N0      = EPSI*ETA*vt/2/CHARGE/(DI+DELTAD);
75             N01     = EPSI*ETA1*vt/2/CHARGE/D1;
76             if(model->HFETAeta2Given)
77               N02   = EPSI*ETA2*vt/2/CHARGE/D2;
78             else
79               N02   = 0.0;
80             GCHI0   = CHARGE*W*TMU/L;
81             CF      = 0.5*EPSI*W;
82             IMAX    = CHARGE*NMAX*VS*W;
83             IS1D    = JS1D*W*L/2;
84             IS2D    = JS2D*W*L/2;
85             IS1S    = JS1S*W*L/2;
86             IS2S    = JS2S*W*L/2;
87             ISO     = ASTAR*W*L/2;
88             GGRWL   = GGR*L*W/2;
89             temp    = exp(TEMP/model->HFETAtf);
90             FGDS    = model->HFETAfgds*temp;
91             DELF    = model->HFETAdelf*temp;
92             if(model->HFETAgatemod == 0) {
93               if(IS1S != 0)
94                 here->HFETAvcrit  = vt*log(vt/(CONSTroot2*IS1S));
95               else
96                 here->HFETAvcrit = DBL_MAX;
97             } else {
98               if(ISO != 0.0)
99                 here->HFETAvcrit = vt*log(vt/(CONSTroot2*ISO));
100               else
101                 here->HFETAvcrit = DBL_MAX;
102             }
103         }
104     }
105     return(OK);
106 }
107