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)17HFETAtemp(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