Jspice3
diotemp.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  1992 Stephen R. Whiteley
6 ****************************************************************************/
7 
8  /* perform the temperature update to the diode */
9 
10 #include "spice.h"
11 #include <stdio.h>
12 #include "diodefs.h"
13 #include "const.h"
14 #include "util.h"
15 #include "sperror.h"
16 
17 
18 int
19 DIOtemp(inModel,ckt)
20 
21 GENmodel *inModel;
22 CKTcircuit *ckt;
23 {
24  DIOmodel *model = (DIOmodel*)inModel;
25  double xfc;
26  double vte;
27  double cbv;
28  double xbv;
29  double xcbv;
30  double tol;
31  double vt;
32  double vtnom;
33  DIOinstance *here;
34  int iter;
35  char *emsg;
36 
37  /* loop through all the diode models */
38  for ( ; model != NULL; model = model->DIOnextModel) {
39 
40  if (!model->DIOnomTempGiven) {
41  model->DIOnomTemp = ckt->CKTnomTemp;
42  }
43  vtnom = CONSTKoverQ * model->DIOnomTemp;
44 
45  /* limit grading coeff to max of .9 */
46  if (model->DIOgradingCoeff > .9) {
47  (*(SPfrontEnd->IFerror))(ERR_WARNING,
48  "%s: grading coefficient too large, limited to 0.9",
49  &(model->DIOmodName));
50  model->DIOgradingCoeff = .9;
51  }
52 
53  /* limit activation energy to min of .1 */
54  if (model->DIOactivationEnergy < .1) {
55  (*(SPfrontEnd->IFerror))(ERR_WARNING,
56  "%s: activation energy too small, limited to 0.1",
57  &(model->DIOmodName));
58  model->DIOactivationEnergy = .1;
59  }
60 
61  /* limit depletion cap coeff to max of .95 */
62  if (model->DIOdepletionCapCoeff > .95) {
63  (*(SPfrontEnd->IFerror))(ERR_WARNING,
64  "%s: coefficient Fc too large, limited to 0.95",
65  &(model->DIOmodName));
66  model->DIOdepletionCapCoeff = .95;
67  }
68 
69  if (!model->DIOresistGiven || model->DIOresist == 0) {
70  model->DIOconductance = 0;
71  }
72  else {
73  model->DIOconductance = 1/model->DIOresist;
74  }
75 
76  xfc = log(1 - model->DIOdepletionCapCoeff);
77 
78  /* loop through all the instances */
79  for (here = model->DIOinstances; here;
80  here = here->DIOnextInstance) {
81 
82  double egfet1,arg1,fact1,pbfact1,pbo,gmaold;
83  double fact2,pbfact,arg,egfet,gmanew;
84 
85  if (!here->DIOtempGiven) here->DIOtemp = ckt->CKTtemp;
86  vt = CONSTKoverQ * here->DIOtemp;
87 
88  /* this part gets really ugly - I won't even try to
89  * explain these equations
90  */
91  fact2 = here->DIOtemp/REFTEMP;
92  egfet = 1.16 - (7.02e-4*here->DIOtemp*here->DIOtemp)/
93  (here->DIOtemp + 1108);
94  arg = -egfet/(2*CONSTboltz*here->DIOtemp) +
95  1.1150877/(CONSTboltz*(REFTEMP+REFTEMP));
96  pbfact= -2*vt*(1.5*log(fact2) + CHARGE*arg);
97  egfet1= 1.16 - (7.02e-4*model->DIOnomTemp*model->DIOnomTemp)/
98  (model->DIOnomTemp + 1108);
99  arg1 = -egfet1/(CONSTboltz*2*model->DIOnomTemp) +
100  1.1150877/(2*CONSTboltz*REFTEMP);
101  fact1 = model->DIOnomTemp/REFTEMP;
102  pbfact1 = -2 * vtnom*(1.5*log(fact1) + CHARGE*arg1);
103  pbo = (model->DIOjunctionPot - pbfact1)/fact1;
104  gmaold= (model->DIOjunctionPot - pbo)/pbo;
105 
106  here->DIOtJctCap = model->DIOjunctionCap/
107  (1 + model->DIOgradingCoeff*
108  (400e-6*(model->DIOnomTemp - REFTEMP) - gmaold) );
109  here->DIOtJctPot = pbfact + fact2*pbo;
110  gmanew = (here->DIOtJctPot - pbo)/pbo;
111  here->DIOtJctCap *= 1 + model->DIOgradingCoeff*
112  (400e-6*(here->DIOtemp - REFTEMP) - gmanew);
113 
114  here->DIOtSatCur = model->DIOsatCur * exp(
115  ((here->DIOtemp/model->DIOnomTemp) - 1) *
116  model->DIOactivationEnergy/(model->DIOemissionCoeff*vt) +
118  log(here->DIOtemp/model->DIOnomTemp) );
119 
120  /* the defintion of f1, just recompute after temperature
121  * adjusting all the variables used in it
122  */
123  here->DIOtF1 = here->DIOtJctPot*
124  (1 - exp((1 - model->DIOgradingCoeff)*xfc))/
125  (1 - model->DIOgradingCoeff);
126 
127  /* same for Depletion Capacitance */
128  here->DIOtDepCap = model->DIOdepletionCapCoeff*here->DIOtJctPot;
129 
130  /* and Vcrit */
131  vte = model->DIOemissionCoeff*vt;
132  here->DIOtVcrit = vte*log(vte/(CONSTroot2*here->DIOtSatCur));
133  /* and now to compute the breakdown voltage, again, using
134  * temperature adjusted basic parameters
135  */
136  if (model->DIObreakdownVoltageGiven) {
137  cbv = model->DIObreakdownCurrent;
138  if (cbv < here->DIOtSatCur*model->DIObreakdownVoltage/vt) {
139  cbv = here->DIOtSatCur*model->DIObreakdownVoltage/vt;
140  emsg = MALLOC(200);
141  if (emsg == (char *)NULL) return(E_NOMEM);
142  (void)sprintf(emsg,
143 "%%s: breakdown current increased to %g to resolve\n\
144 incompatability with specified saturation current",cbv);
145  (*(SPfrontEnd->IFerror))
146  (ERR_WARNING,emsg,&(here->DIOname));
147  FREE(emsg);
148  xbv = model->DIObreakdownVoltage;
149  }
150  else {
151  tol = ckt->CKTreltol*cbv;
152  xbv = model->DIObreakdownVoltage -
153  vt*log(1 + cbv/here->DIOtSatCur);
154  iter = 0;
155  for (iter = 0; iter < 25; iter++) {
156  xbv = model->DIObreakdownVoltage -
157  vt*log(cbv/here->DIOtSatCur + 1 - xbv/vt);
158  xcbv = here->DIOtSatCur*(exp(
159  (model->DIObreakdownVoltage - xbv)/vt) - 1 +
160  xbv/vt);
161  if (FABS(xcbv-cbv) <= tol) break;
162  }
163  if (iter == 25) {
164  emsg = MALLOC(100);
165  if (emsg == (char *)NULL) return(E_NOMEM);
166  (void)sprintf(emsg,
167 "%%s: unable to match forward and reverse diode regions: bv = %g, ibv = %g",
168  xbv,xcbv);
169  (*(SPfrontEnd->IFerror))(ERR_WARNING,emsg,
170  &here->DIOname);
171  FREE(emsg);
172  }
173  }
174  here->DIOtBrkdwnV = xbv;
175  }
176  /* include area dependence in here->tSatCur */
177  here->DIOtSatCur *= here->DIOarea;
178  here->DIOvte = vte;
179  }
180  model->DIOf2 = exp((1 + model->DIOgradingCoeff)*xfc);
181  model->DIOf3 = 1 - model->DIOdepletionCapCoeff*
182  (1 + model->DIOgradingCoeff);
183  }
184  return(OK);
185 }
IFuid DIOmodName
Definition: diodefs.h:123
double DIOtDepCap
Definition: diodefs.h:53
double DIOactivationEnergy
Definition: diodefs.h:149
double CONSTroot2
Definition: main.c:913
double DIOtBrkdwnV
Definition: diodefs.h:58
unsigned DIObreakdownVoltageGiven
Definition: diodefs.h:135
double CKTtemp
Definition: cktdefs.h:80
double CKTnomTemp
Definition: cktdefs.h:81
struct sDIOinstance * DIOnextInstance
Definition: diodefs.h:20
#define CHARGE
Definition: const.h:10
static double e
Definition: vectors.c:17
IFfrontEnd * SPfrontEnd
Definition: main.c:917
unsigned DIOresistGiven
Definition: diodefs.h:126
double CONSTKoverQ
Definition: main.c:915
double CKTreltol
Definition: cktdefs.h:183
#define FREE(ptr)
Definition: spdefs.h:436
double DIOjunctionCap
Definition: diodefs.h:146
double DIOtSatCur
Definition: diodefs.h:55
double DIOdepletionCapCoeff
Definition: diodefs.h:151
double DIObreakdownVoltage
Definition: diodefs.h:152
double DIOtemp
Definition: diodefs.h:50
#define OK
Definition: iferrmsg.h:17
double DIOconductance
Definition: diodefs.h:143
#define CONSTboltz
Definition: const.h:12
DIOinstance * DIOinstances
Definition: diodefs.h:121
double DIOsaturationCurrentExp
Definition: diodefs.h:150
#define MALLOC(x)
Definition: util.h:9
#define NULL
Definition: spdefs.h:121
#define E_NOMEM
Definition: iferrmsg.h:27
double DIOemissionCoeff
Definition: diodefs.h:144
double DIOtF1
Definition: diodefs.h:57
struct sDIOmodel * DIOnextModel
Definition: diodefs.h:119
#define ERR_WARNING
Definition: ifsim.h:517
double DIOtVcrit
Definition: diodefs.h:56
int DIOtemp(GENmodel *inModel, CKTcircuit *ckt)
Definition: diotemp.c:19
unsigned DIOnomTempGiven
Definition: diodefs.h:137
unsigned DIOtempGiven
Definition: diodefs.h:45
static char model[32]
Definition: subckt.c:76
double DIOvte
Definition: diodefs.h:59
#define FABS(a)
Definition: util.h:41
double DIOf2
Definition: diodefs.h:154
double DIObreakdownCurrent
Definition: diodefs.h:153
IFuid DIOname
Definition: diodefs.h:22
double DIOnomTemp
Definition: diodefs.h:156
double DIOjunctionPot
Definition: diodefs.h:147
double DIOarea
Definition: diodefs.h:48
double DIOtJctCap
Definition: diodefs.h:52
double DIOsatCur
Definition: diodefs.h:141
double DIOtJctPot
Definition: diodefs.h:51
double DIOresist
Definition: diodefs.h:142
double DIOgradingCoeff
Definition: diodefs.h:148
#define REFTEMP
Definition: const.h:13
double DIOf3
Definition: diodefs.h:155