Jspice3
bjttemp.c
Go to the documentation of this file.
1 /***************************************************************************
2 JSPICE3 adaptation of Spice3f2 - Copyright (c) Stephen R. Whiteley 1992
3 Copyright 1990 Regents of the University of California. All rights reserved.
4 Authors: 1985 Thomas L. Quarles
5  1993 Stephen R. Whiteley
6 ****************************************************************************/
7 
8 #include "spice.h"
9 #include <stdio.h>
10 #include <math.h>
11 #include "bjtdefs.h"
12 #include "const.h"
13 #include "sperror.h"
14 #include "util.h"
15 
16 
17 /* ARGSUSED */
18 int
19 BJTtemp(inModel,ckt)
20 
21 /* Pre-compute many useful parameters */
22 GENmodel *inModel;
23 CKTcircuit *ckt;
24 {
25  BJTmodel *model = (BJTmodel *)inModel;
26  BJTinstance *here;
27  double xfc;
28  double vt;
29  double ratlog;
30  double ratio1;
31  double factlog;
32  double bfactor;
33  double factor;
34  double fact1,fact2;
35  double pbo,pbfact;
36  double gmaold,gmanew;
37  double egfet;
38  double arg;
39 
40  /* loop through all the bipolar models */
41  for ( ; model != NULL; model = model->BJTnextModel) {
42 
43  if (!model->BJTtnomGiven) model->BJTtnom = ckt->CKTnomTemp;
44  fact1 = model->BJTtnom/REFTEMP;
45 
46  if (!model->BJTleakBEcurrentGiven) {
47  model->BJTleakBEcurrent = 0;
48  }
49  if (!model->BJTleakBCcurrentGiven) {
50  model->BJTleakBCcurrent = 0;
51  }
52  if (!model->BJTminBaseResistGiven) {
53  model->BJTminBaseResist = model->BJTbaseResist;
54  }
55 
56 /*
57  * COMPATABILITY WARNING!
58  * special note: for backward compatability to much older models, spice 2G
59  * implemented a special case which checked if B-E leakage saturation
60  * current was >1, then it was instead a the B-E leakage saturation current
61  * divided by IS, and multiplied it by IS at this point. This was not
62  * handled correctly in the 2G code, and there is some question on its
63  * reasonability, since it is also undocumented, so it has been left out
64  * here. It could easily be added with 1 line. (The same applies to the B-C
65  * leakage saturation current). TQ 6/29/84
66  */
67 
68  if (model->BJTearlyVoltFGiven && model->BJTearlyVoltF != 0) {
69  model->BJTinvEarlyVoltF = 1/model->BJTearlyVoltF;
70  }
71  else {
72  model->BJTinvEarlyVoltF = 0;
73  }
74  if (model->BJTrollOffFGiven && model->BJTrollOffF != 0) {
75  model->BJTinvRollOffF = 1/model->BJTrollOffF;
76  }
77  else {
78  model->BJTinvRollOffF = 0;
79  }
80  if (model->BJTearlyVoltRGiven && model->BJTearlyVoltR != 0) {
81  model->BJTinvEarlyVoltR = 1/model->BJTearlyVoltR;
82  }
83  else {
84  model->BJTinvEarlyVoltR = 0;
85  }
86  if (model->BJTrollOffRGiven && model->BJTrollOffR != 0) {
87  model->BJTinvRollOffR = 1/model->BJTrollOffR;
88  }
89  else {
90  model->BJTinvRollOffR = 0;
91  }
92  if (model->BJTcollectorResistGiven && model->BJTcollectorResist != 0) {
93  model->BJTcollectorConduct = 1/model->BJTcollectorResist;
94  }
95  else {
96  model->BJTcollectorConduct = 0;
97  }
98  if (model->BJTemitterResistGiven && model->BJTemitterResist != 0) {
99  model->BJTemitterConduct = 1/model->BJTemitterResist;
100  }
101  else {
102  model->BJTemitterConduct = 0;
103  }
104  if (model->BJTtransitTimeFVBCGiven && model->BJTtransitTimeFVBC != 0) {
105  model->BJTtransitTimeVBCFactor =1/ (model->BJTtransitTimeFVBC*1.44);
106  }
107  else {
108  model->BJTtransitTimeVBCFactor = 0;
109  }
110  model->BJTexcessPhaseFactor = (model->BJTexcessPhase/
111  (180.0/M_PI)) * model->BJTtransitTimeF;
112  if (model->BJTdepletionCapCoeffGiven) {
113  if (model->BJTdepletionCapCoeff>.9999) {
114  model->BJTdepletionCapCoeff=.9999;
115  (*(SPfrontEnd->IFerror))(ERR_WARNING,
116  "BJT model %s, parameter fc limited to 0.9999",
117  &(model->BJTmodName));
118  }
119  }
120  else {
121  model->BJTdepletionCapCoeff=.5;
122  }
123  xfc = log(1-model->BJTdepletionCapCoeff);
124  model->BJTf2 = exp((1 + model->BJTjunctionExpBE) * xfc);
125  model->BJTf3 = 1 - model->BJTdepletionCapCoeff *
126  (1 + model->BJTjunctionExpBE);
127  model->BJTf6 = exp((1+model->BJTjunctionExpBC)*xfc);
128  model->BJTf7 = 1 - model->BJTdepletionCapCoeff *
129  (1 + model->BJTjunctionExpBC);
130 
131  /* loop through all the instances of the model */
132  for (here = model->BJTinstances; here != NULL ;
133  here=here->BJTnextInstance) {
134  if (!here->BJTtempGiven) here->BJTtemp = ckt->CKTtemp;
135  vt = here->BJTtemp * CONSTKoverQ;
136  fact2 = here->BJTtemp/REFTEMP;
137  egfet = 1.16-(7.02e-4*here->BJTtemp*here->BJTtemp)/
138  (here->BJTtemp+1108);
139  arg = -egfet/(2*CONSTboltz*here->BJTtemp)+
140  1.1150877/(CONSTboltz*(REFTEMP+REFTEMP));
141  pbfact = -2*vt*(1.5*log(fact2)+CHARGE*arg);
142 
143  ratlog = log(here->BJTtemp/model->BJTtnom);
144  ratio1 = here->BJTtemp/model->BJTtnom -1;
145  factlog = ratio1 * model->BJTenergyGap/vt +
146  model->BJTtempExpIS*ratlog;
147  factor = exp(factlog);
148  here->BJTtSatCur = model->BJTsatCur * factor;
149  bfactor = exp(ratlog*model->BJTbetaExp);
150  here->BJTtBetaF = model->BJTbetaF * bfactor;
151  here->BJTtBetaR = model->BJTbetaR * bfactor;
152  here->BJTtBEleakCur = model->BJTleakBEcurrent *
153  exp(factlog/model->BJTleakBEemissionCoeff)/bfactor;
154  here->BJTtBCleakCur = model->BJTleakBCcurrent *
155  exp(factlog/model->BJTleakBCemissionCoeff)/bfactor;
156 
157  pbo = (model->BJTpotentialBE-pbfact)/fact1;
158  gmaold = (model->BJTpotentialBE-pbo)/pbo;
159  here->BJTtBEcap = model->BJTdepletionCapBE/
160  (1+model->BJTjunctionExpBE*
161  (4e-4*(model->BJTtnom-REFTEMP)-gmaold));
162  here->BJTtBEpot = fact2 * pbo+pbfact;
163  gmanew = (here->BJTtBEpot-pbo)/pbo;
164  here->BJTtBEcap *= 1+model->BJTjunctionExpBE*
165  (4e-4*(here->BJTtemp-REFTEMP)-gmanew);
166 
167  pbo = (model->BJTpotentialBC-pbfact)/fact1;
168  gmaold = (model->BJTpotentialBC-pbo)/pbo;
169  here->BJTtBCcap = model->BJTdepletionCapBC/
170  (1+model->BJTjunctionExpBC*
171  (4e-4*(model->BJTtnom-REFTEMP)-gmaold));
172  here->BJTtBCpot = fact2 * pbo+pbfact;
173  gmanew = (here->BJTtBCpot-pbo)/pbo;
174  here->BJTtBCcap *= 1+model->BJTjunctionExpBC*
175  (4e-4*(here->BJTtemp-REFTEMP)-gmanew);
176 
177  here->BJTtDepCap = model->BJTdepletionCapCoeff * here->BJTtBEpot;
178  here->BJTtf1 = here->BJTtBEpot * (1 - exp((1 -
179  model->BJTjunctionExpBE) * xfc)) /
180  (1 - model->BJTjunctionExpBE);
181  here->BJTtf4 = model->BJTdepletionCapCoeff * here->BJTtBCpot;
182  here->BJTtf5 = here->BJTtBCpot * (1 - exp((1 -
183  model->BJTjunctionExpBC) * xfc)) /
184  (1 - model->BJTjunctionExpBC);
185  here->BJTtVcrit = vt * log(vt / (CONSTroot2*model->BJTsatCur));
186  }
187  }
188  return (OK);
189 }
unsigned BJTrollOffRGiven
Definition: bjtdefs.h:330
double BJTdepletionCapBC
Definition: bjtdefs.h:291
BJTinstance * BJTinstances
Definition: bjtdefs.h:259
double BJTjunctionExpBC
Definition: bjtdefs.h:293
double BJTtempExpIS
Definition: bjtdefs.h:301
double BJTtBCleakCur
Definition: bjtdefs.h:40
double BJTpotentialBE
Definition: bjtdefs.h:284
double BJTleakBCcurrent
Definition: bjtdefs.h:276
double CONSTroot2
Definition: main.c:913
double BJTexcessPhase
Definition: bjtdefs.h:290
struct sBJTmodel * BJTnextModel
Definition: bjtdefs.h:257
double BJTtBCcap
Definition: bjtdefs.h:43
unsigned BJTleakBEcurrentGiven
Definition: bjtdefs.h:325
unsigned BJTminBaseResistGiven
Definition: bjtdefs.h:335
double BJTf6
Definition: bjtdefs.h:316
double CKTtemp
Definition: cktdefs.h:80
double BJTbetaExp
Definition: bjtdefs.h:299
double CKTnomTemp
Definition: cktdefs.h:81
#define M_PI
Definition: spice.h:132
double BJTcollectorConduct
Definition: bjtdefs.h:310
double BJTpotentialBC
Definition: bjtdefs.h:292
double BJTtf4
Definition: bjtdefs.h:47
#define CHARGE
Definition: const.h:10
double BJTrollOffF
Definition: bjtdefs.h:269
static double e
Definition: vectors.c:17
double BJTjunctionExpBE
Definition: bjtdefs.h:285
unsigned BJTearlyVoltFGiven
Definition: bjtdefs.h:323
IFfrontEnd * SPfrontEnd
Definition: main.c:917
double BJTtemp
Definition: bjtdefs.h:35
unsigned BJTcollectorResistGiven
Definition: bjtdefs.h:337
unsigned BJTtnomGiven
Definition: bjtdefs.h:319
double BJTtSatCur
Definition: bjtdefs.h:36
double CONSTKoverQ
Definition: main.c:915
unsigned BJTtempGiven
Definition: bjtdefs.h:229
double BJTbetaF
Definition: bjtdefs.h:266
double BJTtBEleakCur
Definition: bjtdefs.h:39
double BJTrollOffR
Definition: bjtdefs.h:275
unsigned BJTemitterResistGiven
Definition: bjtdefs.h:336
IFuid BJTmodName
Definition: bjtdefs.h:261
struct sBJTinstance * BJTnextInstance
Definition: bjtdefs.h:20
unsigned BJTleakBCcurrentGiven
Definition: bjtdefs.h:331
#define OK
Definition: iferrmsg.h:17
double BJTearlyVoltR
Definition: bjtdefs.h:274
#define CONSTboltz
Definition: const.h:12
double BJTtBetaR
Definition: bjtdefs.h:38
double BJTtVcrit
Definition: bjtdefs.h:49
double BJTexcessPhaseFactor
Definition: bjtdefs.h:313
double BJTdepletionCapCoeff
Definition: bjtdefs.h:302
double BJTtf1
Definition: bjtdefs.h:46
unsigned BJTrollOffFGiven
Definition: bjtdefs.h:324
#define NULL
Definition: spdefs.h:121
double BJTtransitTimeVBCFactor
Definition: bjtdefs.h:312
double BJTleakBEcurrent
Definition: bjtdefs.h:270
double BJTleakBEemissionCoeff
Definition: bjtdefs.h:271
double BJTtransitTimeF
Definition: bjtdefs.h:286
double BJTcollectorResist
Definition: bjtdefs.h:282
double BJTinvEarlyVoltR
Definition: bjtdefs.h:307
double BJTtBEcap
Definition: bjtdefs.h:41
#define ERR_WARNING
Definition: ifsim.h:517
double BJTtnom
Definition: bjtdefs.h:264
double BJTinvEarlyVoltF
Definition: bjtdefs.h:306
double BJTtBCpot
Definition: bjtdefs.h:44
double BJTearlyVoltF
Definition: bjtdefs.h:268
double BJTtransitTimeFVBC
Definition: bjtdefs.h:288
double BJTtDepCap
Definition: bjtdefs.h:45
double BJTsatCur
Definition: bjtdefs.h:265
static char model[32]
Definition: subckt.c:76
double BJTbaseResist
Definition: bjtdefs.h:278
double BJTdepletionCapBE
Definition: bjtdefs.h:283
double BJTtBEpot
Definition: bjtdefs.h:42
double BJTf7
Definition: bjtdefs.h:317
double BJTtBetaF
Definition: bjtdefs.h:37
unsigned BJTdepletionCapCoeffGiven
Definition: bjtdefs.h:357
double BJTemitterResist
Definition: bjtdefs.h:281
double BJTemitterConduct
Definition: bjtdefs.h:311
unsigned BJTearlyVoltRGiven
Definition: bjtdefs.h:329
int BJTtemp(GENmodel *inModel, CKTcircuit *ckt)
Definition: bjttemp.c:19
double BJTf3
Definition: bjtdefs.h:315
unsigned BJTtransitTimeFVBCGiven
Definition: bjtdefs.h:343
double BJTleakBCemissionCoeff
Definition: bjtdefs.h:277
double BJTf2
Definition: bjtdefs.h:314
double BJTtf5
Definition: bjtdefs.h:48
double BJTinvRollOffF
Definition: bjtdefs.h:308
double BJTminBaseResist
Definition: bjtdefs.h:280
double BJTbetaR
Definition: bjtdefs.h:272
double BJTinvRollOffR
Definition: bjtdefs.h:309
#define REFTEMP
Definition: const.h:13
double BJTenergyGap
Definition: bjtdefs.h:300