Branch data Line data Source code
1 : : /*
2 : : * HBT_X.core.cpp - device implementations for HBT_X module
3 : : *
4 : : * This is free software; you can redistribute it and/or modify
5 : : * it under the terms of the GNU General Public License as published by
6 : : * the Free Software Foundation; either version 2, or (at your option)
7 : : * any later version.
8 : : *
9 : : */
10 : :
11 : : #if HAVE_CONFIG_H
12 : : #include <config.h>
13 : : #endif
14 : :
15 : : #include "HBT_X.analogfunction.h"
16 : : #include "component.h"
17 : : #include "device.h"
18 : : #include "HBT_X.core.h"
19 : :
20 : : #ifndef CIR_HBT_X
21 : : #define CIR_HBT_X -1
22 : : #endif
23 : :
24 : : // external nodes
25 : : #define c 0
26 : : #define b 1
27 : : #define e 2
28 : : #define t 3
29 : : // internal nodes
30 : : #define ei 4
31 : : #define bi 5
32 : : #define bii 6
33 : : #define ci 7
34 : : #define ex 8
35 : : #define exx 9
36 : : #define cx 10
37 : : #define ni 11
38 : : #define nii 12
39 : : #define niix 13
40 : : #define niii 14
41 : : #define niiix 15
42 : : #define niv 16
43 : : #define nivx 17
44 : : #define ti 18
45 : :
46 : : // useful macro definitions
47 : : #define NP(node) real (getV (node))
48 : : #define BP(pnode,nnode) (NP(pnode) - NP(nnode))
49 : : #define _load_static_residual2(pnode,nnode,current)\
50 : : _rhs[pnode] -= current;\
51 : : _rhs[nnode] += current;
52 : : #define _load_static_augmented_residual2(pnode,nnode,current)\
53 : : _rhs[pnode] -= current;\
54 : : _rhs[nnode] += current;
55 : : #define _load_static_residual1(node,current)\
56 : : _rhs[node] -= current;
57 : : #define _load_static_augmented_residual1(node,current)\
58 : : _rhs[node] -= current;
59 : : #define _load_static_jacobian4(pnode,nnode,vpnode,vnnode,conductance)\
60 : : _jstat[pnode][vpnode] += conductance;\
61 : : _jstat[nnode][vnnode] += conductance;\
62 : : _jstat[pnode][vnnode] -= conductance;\
63 : : _jstat[nnode][vpnode] -= conductance;\
64 : : if (doHB) {\
65 : : _ghs[pnode] += conductance * BP(vpnode,vnnode);\
66 : : _ghs[nnode] -= conductance * BP(vpnode,vnnode);\
67 : : } else {\
68 : : _rhs[pnode] += conductance * BP(vpnode,vnnode);\
69 : : _rhs[nnode] -= conductance * BP(vpnode,vnnode);\
70 : : }
71 : : #define _load_static_jacobian2p(node,vpnode,vnnode,conductance)\
72 : : _jstat[node][vpnode] += conductance;\
73 : : _jstat[node][vnnode] -= conductance;\
74 : : if (doHB) {\
75 : : _ghs[node] += conductance * BP(vpnode,vnnode);\
76 : : } else {\
77 : : _rhs[node] += conductance * BP(vpnode,vnnode);\
78 : : }
79 : : #define _load_static_jacobian2s(pnode,nnode,node,conductance)\
80 : : _jstat[pnode][node] += conductance;\
81 : : _jstat[nnode][node] -= conductance;\
82 : : if (doHB) {\
83 : : _ghs[pnode] += conductance * NP(node);\
84 : : _ghs[nnode] -= conductance * NP(node);\
85 : : } else {\
86 : : _rhs[pnode] += conductance * NP(node);\
87 : : _rhs[nnode] -= conductance * NP(node);\
88 : : }
89 : : #define _load_static_jacobian1(node,vnode,conductance)\
90 : : _jstat[node][vnode] += conductance;\
91 : : if (doHB) {\
92 : : _ghs[node] += conductance * NP(vnode);\
93 : : } else {\
94 : : _rhs[node] += conductance * NP(vnode);\
95 : : }
96 : : #define _load_dynamic_residual2(pnode,nnode,charge)\
97 : : if (doTR) _charges[pnode][nnode] += charge;\
98 : : if (doHB) {\
99 : : _qhs[pnode] -= charge;\
100 : : _qhs[nnode] += charge;\
101 : : }
102 : : #define _load_dynamic_residual1(node,charge)\
103 : : if (doTR) _charges[node][node] += charge;\
104 : : if (doHB) {\
105 : : _qhs[node] -= charge;\
106 : : }
107 : : #define _load_dynamic_jacobian4(pnode,nnode,vpnode,vnnode,capacitance)\
108 : : if (doAC) {\
109 : : _jdyna[pnode][vpnode] += capacitance;\
110 : : _jdyna[nnode][vnnode] += capacitance;\
111 : : _jdyna[pnode][vnnode] -= capacitance;\
112 : : _jdyna[nnode][vpnode] -= capacitance;\
113 : : }\
114 : : if (doTR) {\
115 : : _caps[pnode][nnode][vpnode][vnnode] += capacitance;\
116 : : }\
117 : : if (doHB) {\
118 : : _chs[pnode] += capacitance * BP(vpnode,vnnode);\
119 : : _chs[nnode] -= capacitance * BP(vpnode,vnnode);\
120 : : }
121 : : #define _load_dynamic_jacobian2s(pnode,nnode,vnode,capacitance)\
122 : : if (doAC) {\
123 : : _jdyna[pnode][vnode] += capacitance;\
124 : : _jdyna[nnode][vnode] -= capacitance;\
125 : : }\
126 : : if (doTR) {\
127 : : _caps[pnode][nnode][vnode][vnode] += capacitance;\
128 : : }\
129 : : if (doHB) {\
130 : : _chs[pnode] += capacitance * NP(vnode);\
131 : : _chs[nnode] -= capacitance * NP(vnode);\
132 : : }
133 : : #define _load_dynamic_jacobian2p(node,vpnode,vnnode,capacitance)\
134 : : if (doAC) {\
135 : : _jdyna[node][vpnode] += capacitance;\
136 : : _jdyna[node][vnnode] -= capacitance;\
137 : : }\
138 : : if (doTR) {\
139 : : _caps[node][node][vpnode][vnnode] += capacitance;\
140 : : }\
141 : : if (doHB) {\
142 : : _chs[node] += capacitance * BP(vpnode,vnnode);\
143 : : }
144 : : #define _load_dynamic_jacobian1(node,vnode,capacitance)\
145 : : if (doAC) {\
146 : : _jdyna[node][vnode] += capacitance;\
147 : : }\
148 : : if (doTR) {\
149 : : _caps[node][node][vnode][vnode] += capacitance;\
150 : : }\
151 : : if (doHB) {\
152 : : _chs[node] += capacitance * NP(vnode);\
153 : : }
154 : :
155 : : #define _save_whitenoise1(n1,pwr,type)\
156 : : _white_pwr[n1][n1] += pwr;
157 : : #define _save_whitenoise2(n1,n2,pwr,type)\
158 : : _white_pwr[n1][n2] += pwr;
159 : : #define _save_flickernoise1(n1,pwr,exp,type)\
160 : : _flicker_pwr[n1][n1] += pwr;\
161 : : _flicker_exp[n1][n1] += exp;
162 : : #define _save_flickernoise2(n1,n2,pwr,exp,type)\
163 : : _flicker_pwr[n1][n2] += pwr;\
164 : : _flicker_exp[n1][n2] += exp;
165 : : #define _load_whitenoise2(n1,n2,pwr)\
166 : : cy (n1,n2) -= pwr/kB/T0; cy (n2,n1) -= pwr/kB/T0;\
167 : : cy (n1,n1) += pwr/kB/T0; cy (n2,n2) += pwr/kB/T0;
168 : : #define _load_whitenoise1(n1,pwr)\
169 : : cy (n1,n1) += pwr/kB/T0;
170 : : #define _load_flickernoise2(n1,n2,pwr,exp)\
171 : : cy (n1,n2) -= pwr*pow(_freq,-exp)/kB/T0;\
172 : : cy (n2,n1) -= pwr*pow(_freq,-exp)/kB/T0;\
173 : : cy (n1,n1) += pwr*pow(_freq,-exp)/kB/T0;\
174 : : cy (n2,n2) += pwr*pow(_freq,-exp)/kB/T0;
175 : : #define _load_flickernoise1(n1,pwr,exp)\
176 : : cy (n1,n1) += pwr*pow(_freq,-exp)/kB/T0;
177 : :
178 : : // derivative helper macros
179 : : // transcendental LRM p. 59
180 : : #define m00_cos(v00,x) v00 = cos(x);
181 : : #define m10_cos(v10,v00,x) v10 = (-sin(x));
182 : : #define m00_sin(v00,x) v00 = sin(x);
183 : : #define m10_sin(v10,v00,x) v10 = (cos(x));
184 : : #define m00_tan(v00,x) v00 = tan(x);
185 : : #define m10_tan(v10,v00,x) v10 = (1.0/cos(x)/cos(x));
186 : : #define m00_cosh(v00,x) v00 = cosh(x);
187 : : #define m10_cosh(v10,v00,x) v10 = (sinh(x));
188 : : #define m00_sinh(v00,x) v00 = sinh(x);
189 : : #define m10_sinh(v10,v00,x) v10 = (cosh(x));
190 : : #define m00_tanh(v00,x) v00 = tanh(x);
191 : : #define m10_tanh(v10,v00,x) v10 = (1.0/cosh(x)/cosh(x));
192 : : #define m00_acos(v00,x) v00 = acos(x);
193 : : #define m10_acos(v10,v00,x) v10 = (-1.0/sqrt(1-x*x));
194 : : #define m00_asin(v00,x) v00 = asin(x);
195 : : #define m10_asin(v10,v00,x) v10 = (+1.0/sqrt(1-x*x));
196 : : #define m00_atan(v00,x) v00 = atan(x);
197 : : #define m10_atan(v10,v00,x) v10 = (+1.0/(1+x*x));
198 : : #define m00_hypot(v00,x,y) v00 = sqrt((x)*(x)+(y)*(y));
199 : : #define m10_hypot(v10,v00,x,y) v10 = (x)/(v00);
200 : : #define m11_hypot(v11,v00,x,y) v11 = (y)/(v00);
201 : : #define m00_atan2(v00,x,y) v00 = atan2(x,y);
202 : : // TODO atan2 derivatives ?
203 : : #define m00_acosh(v00,x) v00 = acosh(x);
204 : : #define m10_acosh(v10,v00,x) v10 = (1.0/(sqrt(x-1)*sqrt(x+1)));
205 : : #define m00_asinh(v00,x) v00 = asinh(x);
206 : : #define m10_asinh(v10,v00,x) v10 = (1.0/(sqrt(x*x+1)));
207 : : #define m00_atanh(v00,x) v00 = atanh(x);
208 : : #define m10_atanh(v10,v00,x) v10 = (1.0/(1-x*x));
209 : :
210 : :
211 : : // standard functions LRM p.58
212 : : #define m00_logE(v00,x) v00 = log(x);
213 : : #define m10_logE(v10,v00,x) v10 = (1.0/x);
214 : : #define m00_log10(v00,x) v00 = log10(x);
215 : : #define m10_log10(v10,v00,x) v10 = (1.0/x/M_LN10);
216 : : #define m00_exp(v00,x) v00 = exp(x);
217 : : #define m10_exp(v10,v00,x) v10 = v00;
218 : : #define m00_sqrt(v00,x) v00 = sqrt(x);
219 : : #define m10_sqrt(v10,v00,x) v10 = (0.5/v00);
220 : : #define m00_min(v00,x,y) v00 = ((x)<(y))?(x):(y);
221 : : #define m10_min(v10,v00,x,y) v10 = ((x)<(y))?1.0:0.0;
222 : : #define m11_min(v11,v00,x,y) v11 = ((x)<(y))?0.0:1.0;
223 : : #define m00_max(v00,x,y) v00 = ((x)>(y))?(x):(y);
224 : : #define m10_max(v10,v00,x,y) v10 = ((x)>(y))?1.0:0.0;
225 : : #define m11_max(v11,v00,x,y) v11 = ((x)>(y))?0.0:1.0;
226 : : #define m00_pow(v00,x,y) v00 = pow(x,y);
227 : : #define m10_pow(v10,v00,x,y) v10 = (x==0.0)?0.0:(v00)*(y)/(x);
228 : : #define m11_pow(v11,v00,x,y) v11 = (x==0.0)?0.0:(log(x)*(v00));
229 : : #define m00_abs(v00,x) v00 = ((x)<(0)?(-(x)):(x));
230 : : #define m10_abs(v10,v00,x) v10 = (((x)>=0)?(+1.0):(-1.0));
231 : : #define m00_floor(v00,x) v00 = floor(x);
232 : : #define m10_floor(v10,v00,x) v10 = 1.0;
233 : :
234 : : #define m00_ceil(v00,x) v00 = ceil(x);
235 : : // TODO ceil derivative, needed?
236 : :
237 : : // analog operator, LRM p.61
238 : : #define m00_limexp(v00,x) v00 = ((x)<80.0?exp(x):exp(80.0)*(x-79.0));
239 : : #define m10_limexp(v10,v00,x) v10 = ((x)<80.0?(v00):exp(80.0));
240 : :
241 : : // analog kernel parameter system functions, LRM p.215
242 : : #define m00_vt(x) (kBoverQ*(x))
243 : : #define m10_vt(x) (kBoverQ)
244 : :
245 : : // extra functions (?)
246 : : #define m00_div(v00,v10,x,y) double v10=1/(y); double v00=(x)*v10;
247 : : #define m10_div(v10,v00,vv,x,y)
248 : : #define m11_div(v11,v00,vv,x,y) double v11 = -v00*vv;
249 : : #define m00_mult(v00,v10,v11,x,y) double v10=(x); double v11=(y); double v00=v10*v11;
250 : : #define m00_add(v00,x,y) double v00=(x)+(y);
251 : :
252 : : // second derivatives
253 : : #define m20_logE(v00) (-1.0/v00/v00)
254 : : #define m20_exp(v00) exp(v00)
255 : : #define m20_limexp(v00) ((v00)<80.0?exp(v00):0.0)
256 : : #define m20_sqrt(v00) (-0.25/(v00)/sqrt(v00))
257 : : #define m20_abs(v00) 0.0
258 : : #define m20_pow(x,y) ((y)*((y)-1.0)*pow(x,y)/(x)/(x))
259 : :
260 : :
261 : : // simulator specific definitions
262 : : #define _modelname "HBT_X"
263 : : #define _instancename getName()
264 : : #define _circuit_temp (getPropertyDouble("Temp")+273.15)
265 : : #define _param_given(p) (isPropertyGiven(p)?1:0)
266 : :
267 : :
268 : : // $vt and $vt() functions
269 : : #define _vt_nom (kBoverQ*_circuit_temp)
270 : :
271 : : using namespace qucs::device;
272 : : using qucs::matrix;
273 : :
274 : : /* Device constructor. */
275 : 0 : HBT_X::HBT_X() : circuit (19)
276 : : {
277 : 0 : type = CIR_HBT_X;
278 : 0 : }
279 : :
280 : : /* Initialization of model. */
281 : 0 : void HBT_X::initModel (void)
282 : : {
283 : : // create internal nodes
284 : 0 : setInternalNode (ei, "ei");
285 : 0 : setInternalNode (bi, "bi");
286 : 0 : setInternalNode (bii, "bii");
287 : 0 : setInternalNode (ci, "ci");
288 : 0 : setInternalNode (ex, "ex");
289 : 0 : setInternalNode (exx, "exx");
290 : 0 : setInternalNode (cx, "cx");
291 : 0 : setInternalNode (ni, "ni");
292 : 0 : setInternalNode (nii, "nii");
293 : 0 : setInternalNode (niix, "niix");
294 : 0 : setInternalNode (niii, "niii");
295 : 0 : setInternalNode (niiix, "niiix");
296 : 0 : setInternalNode (niv, "niv");
297 : 0 : setInternalNode (nivx, "nivx");
298 : 0 : setInternalNode (ti, "ti");
299 : :
300 : : // get device model parameters
301 : 0 : loadVariables ();
302 : : // evaluate global model equations
303 : 0 : initializeModel ();
304 : : // evaluate initial step equations
305 : 0 : initialStep ();
306 : : // evaluate global instance equations
307 : 0 : initializeInstance ();
308 : 0 : }
309 : :
310 : : /* Initialization of DC analysis. */
311 : 0 : void HBT_X::initDC (void)
312 : : {
313 : 0 : allocMatrixMNA ();
314 : 0 : initModel ();
315 : 0 : pol = 1;
316 : 0 : restartDC ();
317 : 0 : doAC = 1;
318 : 0 : doTR = 0;
319 : 0 : doHB = 0;
320 : 0 : }
321 : :
322 : : /* Run when DC is restarted (fallback algorithms). */
323 : 0 : void HBT_X::restartDC (void)
324 : : {
325 : 0 : }
326 : :
327 : : /* Initialize Verilog-AMS code. */
328 : 0 : void HBT_X::initVerilog (void)
329 : : {
330 : : // initialization of noise variables
331 : 0 : _white_pwr[nii][nii] = 0.0;
332 : 0 : _white_pwr[cx][bii] = 0.0;
333 : 0 : _white_pwr[exx][bii] = 0.0;
334 : 0 : _white_pwr[ex][bii] = 0.0;
335 : 0 : _white_pwr[c][ci] = 0.0;
336 : 0 : _white_pwr[e][ei] = 0.0;
337 : 0 : _white_pwr[b][bi] = 0.0;
338 : 0 : _white_pwr[bii][bi] = 0.0;
339 : 0 : _white_pwr[ni][ni] = 0.0;
340 : 0 : _white_pwr[bii][ei] = 0.0;
341 : 0 : _flicker_pwr[niv][niv] = 0.0;
342 : 0 : _flicker_exp[niv][niv] = 0.0;
343 : 0 : _flicker_pwr[niii][niii] = 0.0;
344 : 0 : _flicker_exp[niii][niii] = 0.0;
345 : :
346 : : int i1, i2, i3, i4;
347 : :
348 : : // zero charges
349 [ # # ]: 0 : for (i1 = 0; i1 < 19; i1++) {
350 [ # # ]: 0 : for (i2 = 0; i2 < 19; i2++) {
351 : 0 : _charges[i1][i2] = 0.0;
352 : : } }
353 : :
354 : : // zero capacitances
355 [ # # ]: 0 : for (i1 = 0; i1 < 19; i1++) {
356 [ # # ]: 0 : for (i2 = 0; i2 < 19; i2++) {
357 [ # # ]: 0 : for (i3 = 0; i3 < 19; i3++) {
358 [ # # ]: 0 : for (i4 = 0; i4 < 19; i4++) {
359 : 0 : _caps[i1][i2][i3][i4] = 0.0;
360 : : } } } }
361 : :
362 : : // zero right hand side, static and dynamic jacobian
363 [ # # ]: 0 : for (i1 = 0; i1 < 19; i1++) {
364 : 0 : _rhs[i1] = 0.0;
365 : 0 : _qhs[i1] = 0.0;
366 : 0 : _chs[i1] = 0.0;
367 : 0 : _ghs[i1] = 0.0;
368 [ # # ]: 0 : for (i2 = 0; i2 < 19; i2++) {
369 : 0 : _jstat[i1][i2] = 0.0;
370 : 0 : _jdyna[i1][i2] = 0.0;
371 : : }
372 : : }
373 : 0 : }
374 : :
375 : : /* Load device model input parameters. */
376 : 0 : void HBT_X::loadVariables (void)
377 : : {
378 : 0 : Mode = getPropertyInteger ("Mode");
379 : 0 : Noise = getPropertyInteger ("Noise");
380 : 0 : Debug = getPropertyInteger ("Debug");
381 : 0 : DebugPlus = getPropertyInteger ("DebugPlus");
382 : 0 : Temp = getPropertyDouble ("Temp");
383 : 0 : Rth = getPropertyDouble ("Rth");
384 : 0 : Cth = getPropertyDouble ("Cth");
385 : 0 : N = getPropertyInteger ("N");
386 : 0 : L = getPropertyDouble ("L");
387 : 0 : W = getPropertyDouble ("W");
388 : 0 : Jsf = getPropertyDouble ("Jsf");
389 : 0 : nf = getPropertyDouble ("nf");
390 : 0 : Vg = getPropertyDouble ("Vg");
391 : 0 : Jse = getPropertyDouble ("Jse");
392 : 0 : ne = getPropertyDouble ("ne");
393 : 0 : Rbxx = getPropertyDouble ("Rbxx");
394 : 0 : Vgb = getPropertyDouble ("Vgb");
395 : 0 : Jsee = getPropertyDouble ("Jsee");
396 : 0 : nee = getPropertyDouble ("nee");
397 : 0 : Rbbxx = getPropertyDouble ("Rbbxx");
398 : 0 : Vgbb = getPropertyDouble ("Vgbb");
399 : 0 : Jsr = getPropertyDouble ("Jsr");
400 : 0 : nr = getPropertyDouble ("nr");
401 : 0 : Vgr = getPropertyDouble ("Vgr");
402 : 0 : XCjc = getPropertyDouble ("XCjc");
403 : 0 : Jsc = getPropertyDouble ("Jsc");
404 : 0 : nc = getPropertyDouble ("nc");
405 : 0 : Rcxx = getPropertyDouble ("Rcxx");
406 : 0 : Vgc = getPropertyDouble ("Vgc");
407 : 0 : Bf = getPropertyDouble ("Bf");
408 : 0 : kBeta = getPropertyDouble ("kBeta");
409 : 0 : Br = getPropertyDouble ("Br");
410 : 0 : VAF = getPropertyDouble ("VAF");
411 : 0 : VAR = getPropertyDouble ("VAR");
412 : 0 : IKF = getPropertyDouble ("IKF");
413 : 0 : IKR = getPropertyDouble ("IKR");
414 : 0 : Mc = getPropertyDouble ("Mc");
415 : 0 : BVceo = getPropertyDouble ("BVceo");
416 : 0 : kc = getPropertyDouble ("kc");
417 : 0 : BVebo = getPropertyDouble ("BVebo");
418 : 0 : Tr = getPropertyDouble ("Tr");
419 : 0 : Trx = getPropertyDouble ("Trx");
420 : 0 : Tf = getPropertyDouble ("Tf");
421 : 0 : Tft = getPropertyDouble ("Tft");
422 : 0 : Thcs = getPropertyDouble ("Thcs");
423 : 0 : Ahc = getPropertyDouble ("Ahc");
424 : 0 : Cje = getPropertyDouble ("Cje");
425 : 0 : mje = getPropertyDouble ("mje");
426 : 0 : Vje = getPropertyDouble ("Vje");
427 : 0 : Cjc = getPropertyDouble ("Cjc");
428 : 0 : mjc = getPropertyDouble ("mjc");
429 : 0 : Vjc = getPropertyDouble ("Vjc");
430 : 0 : kjc = getPropertyDouble ("kjc");
431 : 0 : Cmin = getPropertyDouble ("Cmin");
432 : 0 : J0 = getPropertyDouble ("J0");
433 : 0 : XJ0 = getPropertyDouble ("XJ0");
434 : 0 : Rci0 = getPropertyDouble ("Rci0");
435 : 0 : Jk = getPropertyDouble ("Jk");
436 : 0 : RJk = getPropertyDouble ("RJk");
437 : 0 : Vces = getPropertyDouble ("Vces");
438 : 0 : Rc = getPropertyDouble ("Rc");
439 : 0 : Re = getPropertyDouble ("Re");
440 : 0 : Rb = getPropertyDouble ("Rb");
441 : 0 : Rb2 = getPropertyDouble ("Rb2");
442 : 0 : Lc = getPropertyDouble ("Lc");
443 : 0 : Le = getPropertyDouble ("Le");
444 : 0 : Lb = getPropertyDouble ("Lb");
445 : 0 : Cq = getPropertyDouble ("Cq");
446 : 0 : Cpb = getPropertyDouble ("Cpb");
447 : 0 : Cpc = getPropertyDouble ("Cpc");
448 : 0 : Kfb = getPropertyDouble ("Kfb");
449 : 0 : Afb = getPropertyDouble ("Afb");
450 : 0 : Ffeb = getPropertyDouble ("Ffeb");
451 : 0 : Kb = getPropertyDouble ("Kb");
452 : 0 : Ab = getPropertyDouble ("Ab");
453 : 0 : Fb = getPropertyDouble ("Fb");
454 : 0 : Kfe = getPropertyDouble ("Kfe");
455 : 0 : Afe = getPropertyDouble ("Afe");
456 : 0 : Ffee = getPropertyDouble ("Ffee");
457 : 0 : Tnom = getPropertyDouble ("Tnom");
458 : 0 : }
459 : :
460 : : /* #define's for translated code */
461 : : #undef _DDT
462 : : #define _DDT(q) q
463 : : #define _DYNAMIC
464 : : #define _DERIVATE
465 : : #define _DDX
466 : : #define _DERIVATEFORDDX
467 : :
468 : : /* Evaluate Verilog-AMS equations in model initialization. */
469 : 0 : void HBT_X::initializeModel (void)
470 : : {
471 : 0 : }
472 : :
473 : : /* Evaluate Verilog-AMS equations in instance initialization. */
474 : 0 : void HBT_X::initializeInstance (void)
475 : : {
476 : 0 : }
477 : :
478 : : /* Evaluate Verilog-AMS equations in initial step. */
479 : 0 : void HBT_X::initialStep (void)
480 : : {
481 : 0 : }
482 : :
483 : : /* Evaluate Verilog-AMS equations in final step. */
484 : 0 : void HBT_X::finalStep (void)
485 : : {
486 : 0 : }
487 : :
488 : : /* Evaluate Verilog-AMS equations in analog block. */
489 : 0 : void HBT_X::calcVerilog (void)
490 : : {
491 : :
492 : : /* ----------------- evaluate verilog analog equations -------------------- */
493 : : double Inivx;
494 : : #if defined(_DERIVATE)
495 : : double Inivx_Vbii_ei;
496 : : double Inivx_Tempti_GND;
497 : : double Inivx_Vbii_ci;
498 : : #endif
499 : : double Iniiix;
500 : : #if defined(_DERIVATE)
501 : : double Iniiix_Vbii_ei;
502 : : double Iniiix_Tempti_GND;
503 : : double Iniiix_Vbii_ci;
504 : : #endif
505 : : double Iniix;
506 : : #if defined(_DERIVATE)
507 : : double Iniix_Vbii_ei;
508 : : double Iniix_Tempti_GND;
509 : : double Iniix_Vbii_ci;
510 : : #endif
511 : : #if defined(_DYNAMIC)
512 : : double qbe;
513 : : #if defined(_DERIVATE)
514 : : double qbe_Vbii_ei;
515 : : double qbe_Tempti_GND;
516 : : double qbe_Vbii_ci;
517 : : double qbe_Vci_ei;
518 : : #endif
519 : : #endif
520 : : #if defined(_DYNAMIC)
521 : : double qbtf;
522 : : #if defined(_DERIVATE)
523 : : double qbtf_Tempti_GND;
524 : : double qbtf_Vbii_ei;
525 : : double qbtf_Vbii_ci;
526 : : #endif
527 : : #endif
528 : : #if defined(_DYNAMIC)
529 : : double xtff;
530 : : #if defined(_DERIVATE)
531 : : double xtff_Vbii_ei;
532 : : double xtff_Tempti_GND;
533 : : double xtff_Vbii_ci;
534 : : double xtff_Vci_ei;
535 : : #endif
536 : : #endif
537 : : #if defined(_DYNAMIC)
538 : : double Wh;
539 : : #if defined(_DERIVATE)
540 : : double Wh_Vci_ei;
541 : : double Wh_Vbii_ei;
542 : : double Wh_Tempti_GND;
543 : : double Wh_Vbii_ci;
544 : : #endif
545 : : #endif
546 : : #if defined(_DYNAMIC)
547 : : double Ih;
548 : : #if defined(_DERIVATE)
549 : : double Ih_Vci_ei;
550 : : double Ih_Vbii_ei;
551 : : double Ih_Tempti_GND;
552 : : double Ih_Vbii_ci;
553 : : #endif
554 : : #endif
555 : : #if defined(_DYNAMIC)
556 : : double AHC;
557 : : #endif
558 : : #if defined(_DYNAMIC)
559 : : double RCIO;
560 : : #endif
561 : : #if defined(_DYNAMIC)
562 : : double InvVpt;
563 : : #endif
564 : : #if defined(_DYNAMIC)
565 : : double Vlim;
566 : : #endif
567 : : #if defined(_DYNAMIC)
568 : : double qb2;
569 : : #if defined(_DERIVATE)
570 : : double qb2_Vbii_ei;
571 : : double qb2_Tempti_GND;
572 : : double qb2_Vbii_ci;
573 : : #endif
574 : : #endif
575 : : #if defined(_DYNAMIC)
576 : : double qbtra;
577 : : #if defined(_DERIVATE)
578 : : double qbtra_Vbi_ci;
579 : : double qbtra_Tempti_GND;
580 : : #endif
581 : : #endif
582 : : #if defined(_DYNAMIC)
583 : : double qbtr;
584 : : #if defined(_DERIVATE)
585 : : double qbtr_Vbii_ci;
586 : : double qbtr_Tempti_GND;
587 : : double qbtr_Vbii_ei;
588 : : #endif
589 : : #endif
590 : : #if defined(_DYNAMIC)
591 : : double qb1;
592 : : #if defined(_DERIVATE)
593 : : double qb1_Vbi_ci;
594 : : #endif
595 : : #endif
596 : : #if defined(_DYNAMIC)
597 : : double xix;
598 : : #if defined(_DERIVATE)
599 : : double xix_Vbii_ei;
600 : : double xix_Tempti_GND;
601 : : double xix_Vbii_ci;
602 : : #endif
603 : : #endif
604 : : #if defined(_DYNAMIC)
605 : : double qb2med;
606 : : #if defined(_DERIVATE)
607 : : double qb2med_Vbii_ei;
608 : : double qb2med_Tempti_GND;
609 : : double qb2med_Vbii_ci;
610 : : #endif
611 : : #endif
612 : : #if defined(_DYNAMIC)
613 : : double I00;
614 : : #endif
615 : : double Ipdiss;
616 : : #if defined(_DERIVATE)
617 : : double Ipdiss_Vbii_ei;
618 : : double Ipdiss_Tempti_GND;
619 : : double Ipdiss_Vbii_ci;
620 : : double Ipdiss_Vci_ei;
621 : : double Ipdiss_Vbi_ci;
622 : : #endif
623 : : double Icdx;
624 : : #if defined(_DERIVATE)
625 : : double Icdx_Vcx_ci;
626 : : double Icdx_Tempti_GND;
627 : : #endif
628 : : double Ibdxx;
629 : : #if defined(_DERIVATE)
630 : : double Ibdxx_Vexx_ei;
631 : : double Ibdxx_Tempti_GND;
632 : : #endif
633 : : double Ibdx;
634 : : #if defined(_DERIVATE)
635 : : double Ibdx_Vex_ei;
636 : : double Ibdx_Tempti_GND;
637 : : #endif
638 : : double Ib1;
639 : : #if defined(_DERIVATE)
640 : : double Ib1_Vbii_ei;
641 : : double Ib1_Tempti_GND;
642 : : double Ib1_Vbii_ci;
643 : : #endif
644 : : double Ib0;
645 : : #if defined(_DERIVATE)
646 : : double Ib0_Vbii_ei;
647 : : double Ib0_Tempti_GND;
648 : : double Ib0_Vbii_ci;
649 : : #endif
650 : : double EdBeta;
651 : : #if defined(_DERIVATE)
652 : : double EdBeta_Tempti_GND;
653 : : double EdBeta_Vbii_ci;
654 : : #endif
655 : : double mm;
656 : : #if defined(_DERIVATE)
657 : : double mm_Vbii_ci;
658 : : #endif
659 : : double Vbclin;
660 : : double epsi;
661 : : double Ibx;
662 : : #if defined(_DERIVATE)
663 : : double Ibx_Vbi_ci;
664 : : double Ibx_Tempti_GND;
665 : : #endif
666 : : double Ib2;
667 : : #if defined(_DERIVATE)
668 : : double Ib2_Vbii_ci;
669 : : double Ib2_Tempti_GND;
670 : : #endif
671 : : double Ic1;
672 : : #if defined(_DERIVATE)
673 : : double Ic1_Vbii_ei;
674 : : double Ic1_Tempti_GND;
675 : : double Ic1_Vbii_ci;
676 : : #endif
677 : : double Ic1r;
678 : : #if defined(_DERIVATE)
679 : : double Ic1r_Vbii_ci;
680 : : double Ic1r_Tempti_GND;
681 : : double Ic1r_Vbii_ei;
682 : : #endif
683 : : double Ic0;
684 : : #if defined(_DERIVATE)
685 : : double Ic0_Vbii_ei;
686 : : double Ic0_Tempti_GND;
687 : : double Ic0_Vbii_ci;
688 : : #endif
689 : : double qb;
690 : : #if defined(_DERIVATE)
691 : : double qb_Vbii_ei;
692 : : double qb_Vbii_ci;
693 : : double qb_Tempti_GND;
694 : : #endif
695 : : double q2;
696 : : #if defined(_DERIVATE)
697 : : double q2_Vbii_ei;
698 : : double q2_Tempti_GND;
699 : : double q2_Vbii_ci;
700 : : #endif
701 : : double q1;
702 : : #if defined(_DERIVATE)
703 : : double q1_Vbii_ei;
704 : : double q1_Vbii_ci;
705 : : #endif
706 : : double Ic1ra;
707 : : #if defined(_DERIVATE)
708 : : double Ic1ra_Vbii_ci;
709 : : double Ic1ra_Tempti_GND;
710 : : #endif
711 : : double Ic0a;
712 : : #if defined(_DERIVATE)
713 : : double Ic0a_Vbii_ei;
714 : : double Ic0a_Tempti_GND;
715 : : #endif
716 : : double TWO_Q;
717 : : double FOUR_K;
718 : : double Area;
719 : : double Tex;
720 : : #if defined(_DERIVATE)
721 : : double Tex_Tempti_GND;
722 : : #endif
723 : : double TjK;
724 : : #if defined(_DERIVATE)
725 : : double TjK_Tempti_GND;
726 : : #endif
727 : : double Tj;
728 : : #if defined(_DERIVATE)
729 : : double Tj_Tempti_GND;
730 : : #endif
731 : : double Texi;
732 : : #if defined(_DERIVATE)
733 : : double Texi_Tempti_GND;
734 : : #endif
735 : : double vcei;
736 : : #if defined(_DERIVATE)
737 : : double vcei_Vci_ei;
738 : : #endif
739 : : double vxxe;
740 : : #if defined(_DERIVATE)
741 : : double vxxe_Vexx_ei;
742 : : #endif
743 : : double vxc;
744 : : #if defined(_DERIVATE)
745 : : double vxc_Vcx_ci;
746 : : #endif
747 : : double vxe;
748 : : #if defined(_DERIVATE)
749 : : double vxe_Vex_ei;
750 : : #endif
751 : : double vbei;
752 : : #if defined(_DERIVATE)
753 : : double vbei_Vbii_ei;
754 : : #endif
755 : : double vbci;
756 : : #if defined(_DERIVATE)
757 : : double vbci_Vbii_ci;
758 : : #endif
759 : : double vbcx;
760 : : #if defined(_DERIVATE)
761 : : double vbcx_Vbi_ci;
762 : : #endif
763 : : #if defined(_DERIVATE)
764 : 0 : vbcx_Vbi_ci=1.0;
765 : : #endif
766 [ # # ]: 0 : vbcx=BP(bi,ci);
767 : : #if defined(_DERIVATE)
768 : 0 : vbci_Vbii_ci=1.0;
769 : : #endif
770 [ # # ]: 0 : vbci=BP(bii,ci);
771 : : #if defined(_DERIVATE)
772 : 0 : vbei_Vbii_ei=1.0;
773 : : #endif
774 [ # # ]: 0 : vbei=BP(bii,ei);
775 : : #if defined(_DERIVATE)
776 : 0 : vxe_Vex_ei=1.0;
777 : : #endif
778 [ # # ]: 0 : vxe=BP(ex,ei);
779 : : #if defined(_DERIVATE)
780 : 0 : vxc_Vcx_ci=1.0;
781 : : #endif
782 [ # # ]: 0 : vxc=BP(cx,ci);
783 : : #if defined(_DERIVATE)
784 : 0 : vxxe_Vexx_ei=1.0;
785 : : #endif
786 [ # # ]: 0 : vxxe=BP(exx,ei);
787 : : #if defined(_DERIVATE)
788 : 0 : vcei_Vci_ei=1.0;
789 : : #endif
790 [ # # ]: 0 : vcei=BP(ci,ei);
791 : : #if defined(_DERIVATE)
792 : 0 : Texi_Tempti_GND=1.0;
793 : : #endif
794 : 0 : Texi=NP(ti);
795 : : #if defined(_DERIVATE)
796 : 0 : Tj_Tempti_GND=Texi_Tempti_GND;
797 : : #endif
798 : 0 : Tj=(Texi+Temp);
799 : : #if defined(_DERIVATE)
800 : 0 : TjK_Tempti_GND=Tj_Tempti_GND;
801 : : #endif
802 : 0 : TjK=(Tj+273.15);
803 : : #if defined(_DERIVATE)
804 : 0 : Tex_Tempti_GND=Tj_Tempti_GND;
805 : : #endif
806 : 0 : Tex=(Tj-Tnom);
807 : 0 : Area=(((L*W)*1.0e12)*N);
808 : 0 : FOUR_K=(4*1.3806226e-23);
809 : 0 : TWO_Q=(2*1.6021918e-19);
810 : : #if defined(_DERIVATE)
811 : 0 : Ic0a_Vbii_ei=HBT_X_d_diode(vbei,Jsf,Vg,nf,Area,Tj,Tnom,vbei_Vbii_ei,0.0,0.0,0.0,0.0,0.0,0.0);
812 : 0 : Ic0a_Tempti_GND=HBT_X_d_diode(vbei,Jsf,Vg,nf,Area,Tj,Tnom,0.0,0.0,0.0,0.0,0.0,Tj_Tempti_GND,0.0);
813 : : #endif
814 : 0 : Ic0a=HBT_X_diode(vbei,Jsf,Vg,nf,Area,Tj,Tnom);
815 : : #if defined(_DERIVATE)
816 : 0 : Ic1ra_Vbii_ci=HBT_X_d_diode(vbci,(XCjc*Jsr),Vgr,nr,Area,Tj,Tnom,vbci_Vbii_ci,0.0,0.0,0.0,0.0,0.0,0.0);
817 : 0 : Ic1ra_Tempti_GND=HBT_X_d_diode(vbci,(XCjc*Jsr),Vgr,nr,Area,Tj,Tnom,0.0,0.0,0.0,0.0,0.0,Tj_Tempti_GND,0.0);
818 : : #endif
819 : 0 : Ic1ra=HBT_X_diode(vbci,(XCjc*Jsr),Vgr,nr,Area,Tj,Tnom);
820 [ # # ][ # # ]: 0 : if
821 : : ((VAF>0.0)&&(VAR>0.0))
822 : : {
823 : : #if defined(_DERIVATE)
824 : 0 : q1_Vbii_ei=(((HBT_X_d_charge(vbei,1.0,Vje,mje,1.0,vbei_Vbii_ei,0.0,0.0,0.0,0.0)-HBT_X_d_charge(0.0,1.0,Vje,mje,1.0,0.0,0.0,0.0,0.0,0.0))/VAR)+((HBT_X_d_charge(vbci,1.0,Vjc,mjc,1.0,0.0,0.0,0.0,0.0,0.0)-HBT_X_d_charge(0.0,1.0,Vjc,mjc,1.0,0.0,0.0,0.0,0.0,0.0))/VAF));
825 : 0 : q1_Vbii_ci=(((HBT_X_d_charge(vbei,1.0,Vje,mje,1.0,0.0,0.0,0.0,0.0,0.0)-HBT_X_d_charge(0.0,1.0,Vje,mje,1.0,0.0,0.0,0.0,0.0,0.0))/VAR)+((HBT_X_d_charge(vbci,1.0,Vjc,mjc,1.0,vbci_Vbii_ci,0.0,0.0,0.0,0.0)-HBT_X_d_charge(0.0,1.0,Vjc,mjc,1.0,0.0,0.0,0.0,0.0,0.0))/VAF));
826 : : #endif
827 : 0 : q1=((1.0+((HBT_X_charge(vbei,1.0,Vje,mje,1.0)-HBT_X_charge(0.0,1.0,Vje,mje,1.0))/VAR))+((HBT_X_charge(vbci,1.0,Vjc,mjc,1.0)-HBT_X_charge(0.0,1.0,Vjc,mjc,1.0))/VAF));
828 : : }
829 : : else
830 : : {
831 [ # # ][ # # ]: 0 : if
832 : : ((VAF>0.0)&&(VAR==0.0))
833 : : {
834 : : #if defined(_DERIVATE)
835 : 0 : q1_Vbii_ei=0.0;
836 : 0 : q1_Vbii_ci=((HBT_X_d_charge(vbci,1.0,Vjc,mjc,1.0,vbci_Vbii_ci,0.0,0.0,0.0,0.0)-HBT_X_d_charge(0.0,1.0,Vjc,mjc,1.0,0.0,0.0,0.0,0.0,0.0))/VAF);
837 : : #endif
838 : 0 : q1=(1.0+((HBT_X_charge(vbci,1.0,Vjc,mjc,1.0)-HBT_X_charge(0.0,1.0,Vjc,mjc,1.0))/VAF));
839 : : }
840 : : else
841 : : {
842 [ # # ][ # # ]: 0 : if
843 : : ((VAF==0.0)&&(VAR>0.0))
844 : : {
845 : : #if defined(_DERIVATE)
846 : 0 : q1_Vbii_ei=((HBT_X_d_charge(vbei,1.0,Vje,mje,1.0,vbei_Vbii_ei,0.0,0.0,0.0,0.0)-HBT_X_d_charge(0.0,1.0,Vje,mje,1.0,0.0,0.0,0.0,0.0,0.0))/VAR);
847 : 0 : q1_Vbii_ci=0.0;
848 : : #endif
849 : 0 : q1=(1.0+((HBT_X_charge(vbei,1.0,Vje,mje,1.0)-HBT_X_charge(0.0,1.0,Vje,mje,1.0))/VAR));
850 : : }
851 : : else
852 : : {
853 : : #if defined(_DERIVATE)
854 : 0 : q1_Vbii_ei=0.0;
855 : 0 : q1_Vbii_ci=0.0;
856 : : #endif
857 : 0 : q1=1.0;
858 : : }
859 : : }
860 : : }
861 [ # # ][ # # ]: 0 : if
862 : : ((IKF>0.0)&&(IKR>0.0))
863 : : {
864 : : #if defined(_DERIVATE)
865 : 0 : q2_Vbii_ei=(Ic0a_Vbii_ei/(Area*IKF));
866 : 0 : q2_Tempti_GND=((Ic0a_Tempti_GND/(Area*IKF))+(Ic1ra_Tempti_GND/(Area*IKR)));
867 : 0 : q2_Vbii_ci=(Ic1ra_Vbii_ci/(Area*IKR));
868 : : #endif
869 : 0 : q2=((Ic0a/(Area*IKF))+(Ic1ra/(Area*IKR)));
870 : : }
871 : : else
872 : : {
873 [ # # ][ # # ]: 0 : if
874 : : ((IKF>0.0)&&(IKR==0.0))
875 : : {
876 : : #if defined(_DERIVATE)
877 : 0 : q2_Vbii_ei=(Ic0a_Vbii_ei/(Area*IKF));
878 : 0 : q2_Tempti_GND=(Ic0a_Tempti_GND/(Area*IKF));
879 : 0 : q2_Vbii_ci=0.0;
880 : : #endif
881 : 0 : q2=(Ic0a/(Area*IKF));
882 : : }
883 : : else
884 : : {
885 [ # # ][ # # ]: 0 : if
886 : : ((IKF==0.0)&&(IKR>0.0))
887 : : {
888 : : #if defined(_DERIVATE)
889 : 0 : q2_Vbii_ei=0.0;
890 : 0 : q2_Tempti_GND=(Ic1ra_Tempti_GND/(Area*IKR));
891 : 0 : q2_Vbii_ci=(Ic1ra_Vbii_ci/(Area*IKR));
892 : : #endif
893 : 0 : q2=(Ic1ra/(Area*IKR));
894 : : }
895 : : else
896 : : {
897 : : #if defined(_DERIVATE)
898 : 0 : q2_Vbii_ei=0.0;
899 : 0 : q2_Tempti_GND=0.0;
900 : 0 : q2_Vbii_ci=0.0;
901 : : #endif
902 : 0 : q2=0.0;
903 : : }
904 : : }
905 : : }
906 : : {
907 : 0 : double m00_sqrt(d00_sqrt0,((q1*q1)+(4.0*q2)))
908 : : #if defined(_DERIVATE)
909 : 0 : double m10_sqrt(d10_sqrt0,d00_sqrt0,((q1*q1)+(4.0*q2)))
910 : : #endif
911 : : #if defined(_DERIVATE)
912 : 0 : qb_Vbii_ei=((q1_Vbii_ei+(((q1_Vbii_ei*q1)+(q1*q1_Vbii_ei))+(4.0*q2_Vbii_ei))*d10_sqrt0)/2.0);
913 : 0 : qb_Vbii_ci=((q1_Vbii_ci+(((q1_Vbii_ci*q1)+(q1*q1_Vbii_ci))+(4.0*q2_Vbii_ci))*d10_sqrt0)/2.0);
914 : 0 : qb_Tempti_GND=((4.0*q2_Tempti_GND)*d10_sqrt0/2.0);
915 : : #endif
916 : 0 : qb=((q1+d00_sqrt0)/2.0);
917 : : }
918 : : #if defined(_DERIVATE)
919 : 0 : Ic0_Vbii_ei=((Ic0a_Vbii_ei*qb-Ic0a*qb_Vbii_ei)/qb/qb);
920 : 0 : Ic0_Tempti_GND=((Ic0a_Tempti_GND*qb-Ic0a*qb_Tempti_GND)/qb/qb);
921 : 0 : Ic0_Vbii_ci=(-Ic0a*qb_Vbii_ci/qb/qb);
922 : : #endif
923 : 0 : Ic0=(Ic0a/qb);
924 : : #if defined(_DERIVATE)
925 : 0 : Ic1r_Vbii_ci=((Ic1ra_Vbii_ci*qb-Ic1ra*qb_Vbii_ci)/qb/qb);
926 : 0 : Ic1r_Tempti_GND=((Ic1ra_Tempti_GND*qb-Ic1ra*qb_Tempti_GND)/qb/qb);
927 : 0 : Ic1r_Vbii_ei=(-Ic1ra*qb_Vbii_ei/qb/qb);
928 : : #endif
929 : 0 : Ic1r=(Ic1ra/qb);
930 : : #if defined(_DERIVATE)
931 : 0 : Ic1_Vbii_ei=(Ic0_Vbii_ei-Ic1r_Vbii_ei);
932 : 0 : Ic1_Tempti_GND=(Ic0_Tempti_GND-Ic1r_Tempti_GND);
933 : 0 : Ic1_Vbii_ci=(Ic0_Vbii_ci-Ic1r_Vbii_ci);
934 : : #endif
935 : 0 : Ic1=(Ic0-Ic1r);
936 : : #if defined(_DERIVATE)
937 : 0 : Ib2_Vbii_ci=(HBT_X_d_diode(vbci,(XCjc*Jsr),Vgr,nr,Area,Tj,Tnom,vbci_Vbii_ci,0.0,0.0,0.0,0.0,0.0,0.0)/Br);
938 : 0 : Ib2_Tempti_GND=(HBT_X_d_diode(vbci,(XCjc*Jsr),Vgr,nr,Area,Tj,Tnom,0.0,0.0,0.0,0.0,0.0,Tj_Tempti_GND,0.0)/Br);
939 : : #endif
940 : 0 : Ib2=(HBT_X_diode(vbci,(XCjc*Jsr),Vgr,nr,Area,Tj,Tnom)/Br);
941 : : #if defined(_DERIVATE)
942 : 0 : Ibx_Vbi_ci=(HBT_X_d_diode(vbcx,((1.0-XCjc)*Jsr),Vgr,nr,Area,Tj,Tnom,vbcx_Vbi_ci,0.0,0.0,0.0,0.0,0.0,0.0)/Br);
943 : 0 : Ibx_Tempti_GND=(HBT_X_d_diode(vbcx,((1.0-XCjc)*Jsr),Vgr,nr,Area,Tj,Tnom,0.0,0.0,0.0,0.0,0.0,Tj_Tempti_GND,0.0)/Br);
944 : : #endif
945 : 0 : Ibx=(HBT_X_diode(vbcx,((1.0-XCjc)*Jsr),Vgr,nr,Area,Tj,Tnom)/Br);
946 : 0 : epsi=1.0e-6;
947 : : {
948 : 0 : double m00_pow(d00_pow0,(1.0-epsi),(1/Mc))
949 : 0 : Vbclin=(BVceo*d00_pow0);
950 : : }
951 : : #if defined(_DERIVATE)
952 : 0 : mm_Vbii_ci=HBT_X_d_MM(vbci,BVceo,Mc,Vbclin,Bf,kc,vbci_Vbii_ci,0.0,0.0,0.0,0.0,0.0);
953 : : #endif
954 : 0 : mm=HBT_X_MM(vbci,BVceo,Mc,Vbclin,Bf,kc);
955 [ # # ]: 0 : if
956 : : (mm>1.0)
957 : : {
958 [ # # ]: 0 : if
959 : : (kBeta>0.0)
960 : : {
961 [ # # ]: 0 : if
962 : : ((Bf-(kBeta*Tex))>1e-6)
963 : : {
964 : : #if defined(_DERIVATE)
965 : 0 : EdBeta_Tempti_GND=((-1*(-(kBeta*Tex_Tempti_GND))/(Bf-(kBeta*Tex))/(Bf-(kBeta*Tex)))/((kc*(mm-1))+1));
966 : 0 : EdBeta_Vbii_ci=(((-(kc*mm_Vbii_ci))*((kc*(mm-1))+1)-((1/(Bf-(kBeta*Tex)))-(kc*(mm-1)))*(kc*mm_Vbii_ci))/((kc*(mm-1))+1)/((kc*(mm-1))+1));
967 : : #endif
968 : 0 : EdBeta=(((1/(Bf-(kBeta*Tex)))-(kc*(mm-1)))/((kc*(mm-1))+1));
969 : : }
970 : : else
971 : : {
972 : : #if defined(_DERIVATE)
973 : 0 : EdBeta_Tempti_GND=0.0;
974 : 0 : EdBeta_Vbii_ci=(((-(kc*mm_Vbii_ci))*((kc*(mm-1))+1)-(1e6-(kc*(mm-1)))*(kc*mm_Vbii_ci))/((kc*(mm-1))+1)/((kc*(mm-1))+1));
975 : : #endif
976 : 0 : EdBeta=((1e6-(kc*(mm-1)))/((kc*(mm-1))+1));
977 : : }
978 : : }
979 : : else
980 : : {
981 : : #if defined(_DERIVATE)
982 : 0 : EdBeta_Tempti_GND=0.0;
983 : 0 : EdBeta_Vbii_ci=(((-(kc*mm_Vbii_ci))*((kc*(mm-1))+1)-((1/Bf)-(kc*(mm-1)))*(kc*mm_Vbii_ci))/((kc*(mm-1))+1)/((kc*(mm-1))+1));
984 : : #endif
985 : 0 : EdBeta=(((1/Bf)-(kc*(mm-1)))/((kc*(mm-1))+1));
986 : : }
987 : : }
988 : : else
989 : : {
990 [ # # ]: 0 : if
991 : : (kBeta>0.0)
992 : : {
993 [ # # ]: 0 : if
994 : : ((Bf-(kBeta*Tex))>1e-6)
995 : : {
996 : : #if defined(_DERIVATE)
997 : 0 : EdBeta_Tempti_GND=(-1*(-(kBeta*Tex_Tempti_GND))/(Bf-(kBeta*Tex))/(Bf-(kBeta*Tex)));
998 : 0 : EdBeta_Vbii_ci=0.0;
999 : : #endif
1000 : 0 : EdBeta=(1/(Bf-(kBeta*Tex)));
1001 : : }
1002 : : else
1003 : : {
1004 : : #if defined(_DERIVATE)
1005 : 0 : EdBeta_Tempti_GND=0.0;
1006 : 0 : EdBeta_Vbii_ci=0.0;
1007 : : #endif
1008 : 0 : EdBeta=1e6;
1009 : : }
1010 : : }
1011 : : else
1012 : : {
1013 : : #if defined(_DERIVATE)
1014 : 0 : EdBeta_Tempti_GND=0.0;
1015 : 0 : EdBeta_Vbii_ci=0.0;
1016 : : #endif
1017 : 0 : EdBeta=(1/Bf);
1018 : : }
1019 : : }
1020 : : #if defined(_DERIVATE)
1021 : 0 : Ib0_Vbii_ei=Ic0a_Vbii_ei*EdBeta;
1022 : 0 : Ib0_Tempti_GND=((Ic0a_Tempti_GND*EdBeta)+(Ic0a*EdBeta_Tempti_GND));
1023 : 0 : Ib0_Vbii_ci=(Ic0a*EdBeta_Vbii_ci);
1024 : : #endif
1025 : 0 : Ib0=(Ic0a*EdBeta);
1026 [ # # ]: 0 : if
1027 : : (BVebo>0)
1028 : : {
1029 : : #if defined(_DERIVATE)
1030 : 0 : Ib1_Vbii_ei=(Ib0_Vbii_ei-HBT_X_d_diode(((-BVebo)-vbei),Jsf,0.0,1.0,Area,0.0,0.0,(-vbei_Vbii_ei),0.0,0.0,0.0,0.0,0.0,0.0));
1031 : 0 : Ib1_Tempti_GND=(Ib0_Tempti_GND-HBT_X_d_diode(((-BVebo)-vbei),Jsf,0.0,1.0,Area,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0));
1032 : 0 : Ib1_Vbii_ci=(Ib0_Vbii_ci-HBT_X_d_diode(((-BVebo)-vbei),Jsf,0.0,1.0,Area,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0));
1033 : : #endif
1034 : 0 : Ib1=(Ib0-HBT_X_diode(((-BVebo)-vbei),Jsf,0.0,1.0,Area,0.0,0.0));
1035 : : }
1036 : : else
1037 : : {
1038 : : #if defined(_DERIVATE)
1039 : 0 : Ib1_Vbii_ei=Ib0_Vbii_ei;
1040 : 0 : Ib1_Tempti_GND=Ib0_Tempti_GND;
1041 : 0 : Ib1_Vbii_ci=Ib0_Vbii_ci;
1042 : : #endif
1043 : 0 : Ib1=Ib0;
1044 : : }
1045 [ # # ][ # # ]: 0 : if
1046 : : ((Jse>0.0)&&(ne>0))
1047 : : {
1048 : : #if defined(_DERIVATE)
1049 : 0 : Ibdx_Vex_ei=HBT_X_d_diode(vxe,Jse,Vgb,ne,Area,Tj,Tnom,vxe_Vex_ei,0.0,0.0,0.0,0.0,0.0,0.0);
1050 : 0 : Ibdx_Tempti_GND=HBT_X_d_diode(vxe,Jse,Vgb,ne,Area,Tj,Tnom,0.0,0.0,0.0,0.0,0.0,Tj_Tempti_GND,0.0);
1051 : : #endif
1052 : 0 : Ibdx=HBT_X_diode(vxe,Jse,Vgb,ne,Area,Tj,Tnom);
1053 : : }
1054 : : else
1055 : : {
1056 : : #if defined(_DERIVATE)
1057 : 0 : Ibdx_Vex_ei=vxe_Vex_ei*1e-12;
1058 : 0 : Ibdx_Tempti_GND=0.0;
1059 : : #endif
1060 : 0 : Ibdx=(vxe*1e-12);
1061 : : }
1062 [ # # ][ # # ]: 0 : if
1063 : : ((Jsee>0.0)&&(nee>0))
1064 : : {
1065 : : #if defined(_DERIVATE)
1066 : 0 : Ibdxx_Vexx_ei=HBT_X_d_diode(vxxe,Jsee,Vgbb,nee,Area,Tj,Tnom,vxxe_Vexx_ei,0.0,0.0,0.0,0.0,0.0,0.0);
1067 : 0 : Ibdxx_Tempti_GND=HBT_X_d_diode(vxxe,Jsee,Vgbb,nee,Area,Tj,Tnom,0.0,0.0,0.0,0.0,0.0,Tj_Tempti_GND,0.0);
1068 : : #endif
1069 : 0 : Ibdxx=HBT_X_diode(vxxe,Jsee,Vgbb,nee,Area,Tj,Tnom);
1070 : : }
1071 : : else
1072 : : {
1073 : : #if defined(_DERIVATE)
1074 : 0 : Ibdxx_Vexx_ei=vxxe_Vexx_ei*1e-12;
1075 : 0 : Ibdxx_Tempti_GND=0.0;
1076 : : #endif
1077 : 0 : Ibdxx=(vxxe*1e-12);
1078 : : }
1079 [ # # ][ # # ]: 0 : if
1080 : : ((Jsc>0.0)&&(nc>0))
1081 : : {
1082 : : #if defined(_DERIVATE)
1083 : 0 : Icdx_Vcx_ci=HBT_X_d_diode(vxc,Jsc,Vgc,nc,Area,Tj,Tnom,vxc_Vcx_ci,0.0,0.0,0.0,0.0,0.0,0.0);
1084 : 0 : Icdx_Tempti_GND=HBT_X_d_diode(vxc,Jsc,Vgc,nc,Area,Tj,Tnom,0.0,0.0,0.0,0.0,0.0,Tj_Tempti_GND,0.0);
1085 : : #endif
1086 : 0 : Icdx=HBT_X_diode(vxc,Jsc,Vgc,nc,Area,Tj,Tnom);
1087 : : }
1088 : : else
1089 : : {
1090 : : #if defined(_DERIVATE)
1091 : 0 : Icdx_Vcx_ci=vxc_Vcx_ci*1e-12;
1092 : 0 : Icdx_Tempti_GND=0.0;
1093 : : #endif
1094 : 0 : Icdx=(vxc*1e-12);
1095 : : }
1096 : : #if defined(_DERIVATE)
1097 : 0 : Ipdiss_Vbii_ei=(Ic1_Vbii_ei*vcei+((Ib1_Vbii_ei*vbei)+(Ib1*vbei_Vbii_ei)));
1098 : 0 : Ipdiss_Tempti_GND=(((Ic1_Tempti_GND*vcei+Ib1_Tempti_GND*vbei)+Ib2_Tempti_GND*vbci)+Ibx_Tempti_GND*vbcx);
1099 : 0 : Ipdiss_Vbii_ci=((Ic1_Vbii_ci*vcei+Ib1_Vbii_ci*vbei)+((Ib2_Vbii_ci*vbci)+(Ib2*vbci_Vbii_ci)));
1100 : 0 : Ipdiss_Vci_ei=(Ic1*vcei_Vci_ei);
1101 : 0 : Ipdiss_Vbi_ci=((Ibx_Vbi_ci*vbcx)+(Ibx*vbcx_Vbi_ci));
1102 : : #endif
1103 : 0 : Ipdiss=((((Ic1*vcei)+(Ib1*vbei))+(Ib2*vbci))+(Ibx*vbcx));
1104 [ # # ]: 0 : if
1105 : : (Ipdiss<0.0)
1106 : : {
1107 : : #if defined(_DERIVATE)
1108 : 0 : Ipdiss_Vbii_ei=0.0;
1109 : 0 : Ipdiss_Tempti_GND=0.0;
1110 : 0 : Ipdiss_Vbii_ci=0.0;
1111 : 0 : Ipdiss_Vci_ei=0.0;
1112 : 0 : Ipdiss_Vbi_ci=0.0;
1113 : : #endif
1114 : 0 : Ipdiss=0;
1115 : : }
1116 : : #if defined(_DYNAMIC)
1117 : 0 : I00=(J0*Area);
1118 : : #endif
1119 : : #ifdef _DYNAMIC
1120 [ # # ][ # # ]: 0 : if
1121 : : ((XCjc<1.0)&&(XCjc>0.0))
1122 : : {
1123 : : #ifdef _DYNAMIC
1124 [ # # ][ # # ]: 0 : if
1125 : : ((J0<=0.0)||(Ic0<0.0))
1126 : : {
1127 : : #if defined(_DYNAMIC)
1128 : : #if defined(_DERIVATE)
1129 : 0 : qb2med_Vbii_ei=0.0;
1130 : 0 : qb2med_Tempti_GND=0.0;
1131 : 0 : qb2med_Vbii_ci=((XCjc*HBT_X_d_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area,vbci_Vbii_ci,0.0,0.0,0.0,0.0))+(((XCjc*Area)*Cmin)*vbci_Vbii_ci));
1132 : : #endif
1133 : 0 : qb2med=((XCjc*HBT_X_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area))+(((XCjc*Area)*Cmin)*vbci));
1134 : : #endif
1135 : : }
1136 : : else
1137 : : {
1138 : : #if defined(_DYNAMIC)
1139 : : #if defined(_DERIVATE)
1140 : 0 : xix_Vbii_ei=(Ic0_Vbii_ei/I00);
1141 : 0 : xix_Tempti_GND=(Ic0_Tempti_GND/I00);
1142 : 0 : xix_Vbii_ci=(Ic0_Vbii_ci/I00);
1143 : : #endif
1144 : 0 : xix=(Ic0/I00);
1145 : : #endif
1146 : : #if defined(_DYNAMIC)
1147 : : {
1148 : 0 : double m00_tanh(d00_tanh0,xix)
1149 : : #if defined(_DERIVATE)
1150 : 0 : double m10_tanh(d10_tanh0,d00_tanh0,xix)
1151 : : #endif
1152 : : #if defined(_DERIVATE)
1153 : 0 : qb2med_Vbii_ei=(((XCjc*(-xix_Vbii_ei*d10_tanh0))*(HBT_X_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area)+((((1.0-XJ0)*Area)*Cmin)*vbci)))+((XCjc*(1.0-d00_tanh0))*HBT_X_d_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area,0.0,0.0,0.0,0.0,0.0)));
1154 : 0 : qb2med_Tempti_GND=(((XCjc*(-xix_Tempti_GND*d10_tanh0))*(HBT_X_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area)+((((1.0-XJ0)*Area)*Cmin)*vbci)))+((XCjc*(1.0-d00_tanh0))*HBT_X_d_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area,0.0,0.0,0.0,0.0,0.0)));
1155 : 0 : qb2med_Vbii_ci=((((XCjc*(-xix_Vbii_ci*d10_tanh0))*(HBT_X_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area)+((((1.0-XJ0)*Area)*Cmin)*vbci)))+((XCjc*(1.0-d00_tanh0))*(HBT_X_d_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area,vbci_Vbii_ci,0.0,0.0,0.0,0.0)+((((1.0-XJ0)*Area)*Cmin)*vbci_Vbii_ci))))+((((XJ0*XCjc)*Area)*Cmin)*vbci_Vbii_ci));
1156 : : #endif
1157 : 0 : qb2med=(((XCjc*(1.0-d00_tanh0))*(HBT_X_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area)+((((1.0-XJ0)*Area)*Cmin)*vbci)))+((((XJ0*XCjc)*Area)*Cmin)*vbci));
1158 : : }
1159 : : #endif
1160 : 0 : }
1161 : : #endif /* if (...) */
1162 : : }
1163 : : else
1164 : : {
1165 : : #ifdef _DYNAMIC
1166 [ # # ][ # # ]: 0 : if
1167 : : ((J0<0.0)||(Ic0<0.0))
1168 : : {
1169 : : #if defined(_DYNAMIC)
1170 : : #if defined(_DERIVATE)
1171 : 0 : qb2med_Vbii_ei=0.0;
1172 : 0 : qb2med_Tempti_GND=0.0;
1173 : 0 : qb2med_Vbii_ci=(HBT_X_d_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area,vbci_Vbii_ci,0.0,0.0,0.0,0.0)+((Area*Cmin)*vbci_Vbii_ci));
1174 : : #endif
1175 : 0 : qb2med=(HBT_X_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area)+((Area*Cmin)*vbci));
1176 : : #endif
1177 : : }
1178 : : else
1179 : : {
1180 : : #if defined(_DYNAMIC)
1181 : : #if defined(_DERIVATE)
1182 : 0 : xix_Vbii_ei=(Ic0_Vbii_ei/I00);
1183 : 0 : xix_Tempti_GND=(Ic0_Tempti_GND/I00);
1184 : 0 : xix_Vbii_ci=(Ic0_Vbii_ci/I00);
1185 : : #endif
1186 : 0 : xix=(Ic0/I00);
1187 : : #endif
1188 : : #if defined(_DYNAMIC)
1189 : : {
1190 : 0 : double m00_tanh(d00_tanh0,xix)
1191 : : #if defined(_DERIVATE)
1192 : 0 : double m10_tanh(d10_tanh0,d00_tanh0,xix)
1193 : : #endif
1194 : : #if defined(_DERIVATE)
1195 : 0 : qb2med_Vbii_ei=(((-xix_Vbii_ei*d10_tanh0)*(HBT_X_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area)+((((1.0-XJ0)*Area)*Cmin)*vbci)))+((1.0-d00_tanh0)*HBT_X_d_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area,0.0,0.0,0.0,0.0,0.0)));
1196 : 0 : qb2med_Tempti_GND=(((-xix_Tempti_GND*d10_tanh0)*(HBT_X_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area)+((((1.0-XJ0)*Area)*Cmin)*vbci)))+((1.0-d00_tanh0)*HBT_X_d_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area,0.0,0.0,0.0,0.0,0.0)));
1197 : 0 : qb2med_Vbii_ci=((((-xix_Vbii_ci*d10_tanh0)*(HBT_X_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area)+((((1.0-XJ0)*Area)*Cmin)*vbci)))+((1.0-d00_tanh0)*(HBT_X_d_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area,vbci_Vbii_ci,0.0,0.0,0.0,0.0)+((((1.0-XJ0)*Area)*Cmin)*vbci_Vbii_ci))))+(((XJ0*Area)*Cmin)*vbci_Vbii_ci));
1198 : : #endif
1199 : 0 : qb2med=(((1.0-d00_tanh0)*(HBT_X_charge(vbci,(Cjc-Cmin),Vjc,mjc,Area)+((((1.0-XJ0)*Area)*Cmin)*vbci)))+(((XJ0*Area)*Cmin)*vbci));
1200 : : }
1201 : : #endif
1202 : : }
1203 : : #endif /* if (...) */
1204 : : }
1205 : : #endif /* if (...) */
1206 : : #ifdef _DYNAMIC
1207 [ # # ][ # # ]: 0 : if
1208 : : ((XCjc<1.0)&&(XCjc>0.0))
1209 : : {
1210 : : #if defined(_DYNAMIC)
1211 : : #if defined(_DERIVATE)
1212 : 0 : qb1_Vbi_ci=(((1.0-XCjc)*HBT_X_d_charge(vbcx,(Cjc-Cmin),Vjc,mjc,Area,vbcx_Vbi_ci,0.0,0.0,0.0,0.0))+((((1.0-XCjc)*Area)*Cmin)*vbcx_Vbi_ci));
1213 : : #endif
1214 : 0 : qb1=(((1.0-XCjc)*HBT_X_charge(vbcx,(Cjc-Cmin),Vjc,mjc,Area))+((((1.0-XCjc)*Area)*Cmin)*vbcx));
1215 : : #endif
1216 : : }
1217 : : else
1218 : : {
1219 : : #if defined(_DYNAMIC)
1220 : : #if defined(_DERIVATE)
1221 : 0 : qb1_Vbi_ci=0.0;
1222 : : #endif
1223 : 0 : qb1=0.0;
1224 : : #endif
1225 : : }
1226 : : #endif /* if (...) */
1227 : : #if defined(_DYNAMIC)
1228 : : #if defined(_DERIVATE)
1229 : 0 : qbtr_Vbii_ci=(Tr*Ic1r_Vbii_ci);
1230 : 0 : qbtr_Tempti_GND=(Tr*Ic1r_Tempti_GND);
1231 : 0 : qbtr_Vbii_ei=(Tr*Ic1r_Vbii_ei);
1232 : : #endif
1233 : 0 : qbtr=(Tr*Ic1r);
1234 : : #endif
1235 : : #if defined(_DYNAMIC)
1236 : : #if defined(_DERIVATE)
1237 : 0 : qbtra_Vbi_ci=(Trx*Ibx_Vbi_ci);
1238 : 0 : qbtra_Tempti_GND=(Trx*Ibx_Tempti_GND);
1239 : : #endif
1240 : 0 : qbtra=(Trx*Ibx);
1241 : : #endif
1242 : : #if defined(_DYNAMIC)
1243 : : #if defined(_DERIVATE)
1244 : 0 : qb2_Vbii_ei=(qb2med_Vbii_ei+qbtr_Vbii_ei);
1245 : 0 : qb2_Tempti_GND=(qb2med_Tempti_GND+qbtr_Tempti_GND);
1246 : 0 : qb2_Vbii_ci=(qb2med_Vbii_ci+qbtr_Vbii_ci);
1247 : : #endif
1248 : 0 : qb2=(qb2med+qbtr);
1249 : : #endif
1250 : : #ifdef _DYNAMIC
1251 [ # # ][ # # ]: 0 : if
1252 : : ((Jk>0.0)&&(Rci0>0.0))
1253 : : {
1254 : : #ifdef _DYNAMIC
1255 [ # # ]: 0 : if
1256 : : (RJk>0.0)
1257 : : {
1258 : : #if defined(_DYNAMIC)
1259 : 0 : Vlim=((Jk*Rci0)/(1.0-(Rci0/RJk)));
1260 : : #endif
1261 : : #if defined(_DYNAMIC)
1262 : 0 : InvVpt=((1.0-(Rci0/RJk))/(Jk*RJk));
1263 : : #endif
1264 : : }
1265 : : else
1266 : : {
1267 : : #if defined(_DYNAMIC)
1268 : 0 : Vlim=((Jk*Rci0)/1.016);
1269 : : #endif
1270 : : #if defined(_DYNAMIC)
1271 : 0 : InvVpt=0.0;
1272 : : #endif
1273 : : }
1274 : : #endif /* if (...) */
1275 : : }
1276 : : #endif /* if (...) */
1277 : : #ifdef _DYNAMIC
1278 [ # # ][ # # ]: 0 : if
[ # # ][ # # ]
1279 : : ((((Thcs>0.0)&&(Ahc>0.0))&&(Jk>0.0))&&(Ic0>0.0))
1280 : : {
1281 : : #if defined(_DYNAMIC)
1282 : 0 : RCIO=(Rci0/Area);
1283 : : #endif
1284 : : #if defined(_DYNAMIC)
1285 : 0 : AHC=(Area*Ahc);
1286 : : #endif
1287 : : #ifdef _DYNAMIC
1288 [ # # ][ # # ]: 0 : if
1289 : : ((Rci0<RJk)||(RJk<=0.0))
1290 : : {
1291 : : #if defined(_DYNAMIC)
1292 : : #if defined(_DERIVATE)
1293 : 0 : Ih_Vci_ei=(-(HBT_X_d_ICK(vcei,RCIO,Vlim,InvVpt,Vces,vcei_Vci_ei,0.0,0.0,0.0,0.0)/Ic0));
1294 : 0 : Ih_Vbii_ei=(-((HBT_X_d_ICK(vcei,RCIO,Vlim,InvVpt,Vces,0.0,0.0,0.0,0.0,0.0)*Ic0-HBT_X_ICK(vcei,RCIO,Vlim,InvVpt,Vces)*Ic0_Vbii_ei)/Ic0/Ic0));
1295 : 0 : Ih_Tempti_GND=(-((HBT_X_d_ICK(vcei,RCIO,Vlim,InvVpt,Vces,0.0,0.0,0.0,0.0,0.0)*Ic0-HBT_X_ICK(vcei,RCIO,Vlim,InvVpt,Vces)*Ic0_Tempti_GND)/Ic0/Ic0));
1296 : 0 : Ih_Vbii_ci=(-((HBT_X_d_ICK(vcei,RCIO,Vlim,InvVpt,Vces,0.0,0.0,0.0,0.0,0.0)*Ic0-HBT_X_ICK(vcei,RCIO,Vlim,InvVpt,Vces)*Ic0_Vbii_ci)/Ic0/Ic0));
1297 : : #endif
1298 : 0 : Ih=(1.0-(HBT_X_ICK(vcei,RCIO,Vlim,InvVpt,Vces)/Ic0));
1299 : : #endif
1300 : : }
1301 : : else
1302 : : {
1303 : : #if defined(_DYNAMIC)
1304 : : #if defined(_DERIVATE)
1305 : 0 : Ih_Vci_ei=(-(HBT_X_d_Vceff(vcei,Vces,vcei_Vci_ei,0.0)/(RCIO*Ic0)));
1306 : 0 : Ih_Vbii_ei=(-((HBT_X_d_Vceff(vcei,Vces,0.0,0.0)*(RCIO*Ic0)-HBT_X_Vceff(vcei,Vces)*(RCIO*Ic0_Vbii_ei))/(RCIO*Ic0)/(RCIO*Ic0)));
1307 : 0 : Ih_Tempti_GND=(-((HBT_X_d_Vceff(vcei,Vces,0.0,0.0)*(RCIO*Ic0)-HBT_X_Vceff(vcei,Vces)*(RCIO*Ic0_Tempti_GND))/(RCIO*Ic0)/(RCIO*Ic0)));
1308 : 0 : Ih_Vbii_ci=(-((HBT_X_d_Vceff(vcei,Vces,0.0,0.0)*(RCIO*Ic0)-HBT_X_Vceff(vcei,Vces)*(RCIO*Ic0_Vbii_ci))/(RCIO*Ic0)/(RCIO*Ic0)));
1309 : : #endif
1310 : 0 : Ih=(1.0-(HBT_X_Vceff(vcei,Vces)/(RCIO*Ic0)));
1311 : : #endif
1312 : : }
1313 : : #endif /* if (...) */
1314 : : #if defined(_DYNAMIC)
1315 : : {
1316 : 0 : double m00_sqrt(d00_sqrt0,((Ih*Ih)+AHC))
1317 : 0 : double m00_sqrt(d00_sqrt1,(1.0+AHC))
1318 : : #if defined(_DERIVATE)
1319 : 0 : double m10_sqrt(d10_sqrt0,d00_sqrt0,((Ih*Ih)+AHC))
1320 : : #endif
1321 : : #if defined(_DERIVATE)
1322 : 0 : Wh_Vci_ei=((Ih_Vci_ei+((Ih_Vci_ei*Ih)+(Ih*Ih_Vci_ei))*d10_sqrt0)/(1.0+d00_sqrt1));
1323 : 0 : Wh_Vbii_ei=((Ih_Vbii_ei+((Ih_Vbii_ei*Ih)+(Ih*Ih_Vbii_ei))*d10_sqrt0)/(1.0+d00_sqrt1));
1324 : 0 : Wh_Tempti_GND=((Ih_Tempti_GND+((Ih_Tempti_GND*Ih)+(Ih*Ih_Tempti_GND))*d10_sqrt0)/(1.0+d00_sqrt1));
1325 : 0 : Wh_Vbii_ci=((Ih_Vbii_ci+((Ih_Vbii_ci*Ih)+(Ih*Ih_Vbii_ci))*d10_sqrt0)/(1.0+d00_sqrt1));
1326 : : #endif
1327 : 0 : Wh=((Ih+d00_sqrt0)/(1.0+d00_sqrt1));
1328 : : }
1329 : : #endif
1330 : : #if defined(_DYNAMIC)
1331 : : #if defined(_DERIVATE)
1332 : 0 : xtff_Vbii_ei=(((Thcs*Ic0_Vbii_ei)*(Wh*Wh))+((Thcs*Ic0)*((Wh_Vbii_ei*Wh)+(Wh*Wh_Vbii_ei))));
1333 : 0 : xtff_Tempti_GND=(((Thcs*Ic0_Tempti_GND)*(Wh*Wh))+((Thcs*Ic0)*((Wh_Tempti_GND*Wh)+(Wh*Wh_Tempti_GND))));
1334 : 0 : xtff_Vbii_ci=(((Thcs*Ic0_Vbii_ci)*(Wh*Wh))+((Thcs*Ic0)*((Wh_Vbii_ci*Wh)+(Wh*Wh_Vbii_ci))));
1335 : 0 : xtff_Vci_ei=((Thcs*Ic0)*((Wh_Vci_ei*Wh)+(Wh*Wh_Vci_ei)));
1336 : : #endif
1337 : 0 : xtff=((Thcs*Ic0)*(Wh*Wh));
1338 : : #endif
1339 : : }
1340 : : else
1341 : : {
1342 : : #if defined(_DYNAMIC)
1343 : : #if defined(_DERIVATE)
1344 : 0 : xtff_Vbii_ei=0.0;
1345 : 0 : xtff_Tempti_GND=0.0;
1346 : 0 : xtff_Vbii_ci=0.0;
1347 : 0 : xtff_Vci_ei=0.0;
1348 : : #endif
1349 : 0 : xtff=0;
1350 : : #endif
1351 : : }
1352 : : #endif /* if (...) */
1353 : : #if defined(_DYNAMIC)
1354 : : #if defined(_DERIVATE)
1355 : 0 : qbtf_Tempti_GND=(((Tft*Tex_Tempti_GND)*Ic0)+((Tf+(Tft*Tex))*Ic0_Tempti_GND));
1356 : 0 : qbtf_Vbii_ei=((Tf+(Tft*Tex))*Ic0_Vbii_ei);
1357 : 0 : qbtf_Vbii_ci=((Tf+(Tft*Tex))*Ic0_Vbii_ci);
1358 : : #endif
1359 : 0 : qbtf=((Tf+(Tft*Tex))*Ic0);
1360 : : #endif
1361 : : #if defined(_DYNAMIC)
1362 : : #if defined(_DERIVATE)
1363 : 0 : qbe_Vbii_ei=((xtff_Vbii_ei+qbtf_Vbii_ei)+HBT_X_d_charge(vbei,Cje,Vje,mje,Area,vbei_Vbii_ei,0.0,0.0,0.0,0.0));
1364 : 0 : qbe_Tempti_GND=((xtff_Tempti_GND+qbtf_Tempti_GND)+HBT_X_d_charge(vbei,Cje,Vje,mje,Area,0.0,0.0,0.0,0.0,0.0));
1365 : 0 : qbe_Vbii_ci=((xtff_Vbii_ci+qbtf_Vbii_ci)+HBT_X_d_charge(vbei,Cje,Vje,mje,Area,0.0,0.0,0.0,0.0,0.0));
1366 : 0 : qbe_Vci_ei=(xtff_Vci_ei+HBT_X_d_charge(vbei,Cje,Vje,mje,Area,0.0,0.0,0.0,0.0,0.0));
1367 : : #endif
1368 : 0 : qbe=((xtff+qbtf)+HBT_X_charge(vbei,Cje,Vje,mje,Area));
1369 : : #endif
1370 : 0 : _load_static_residual2(bi,ci,Ibx);
1371 : : #if defined(_DERIVATE)
1372 [ # # ]: 0 : _load_static_jacobian2s(bi,ci,ti,Ibx_Tempti_GND);
1373 [ # # ][ # # ]: 0 : _load_static_jacobian4(bi,ci,bi,ci,Ibx_Vbi_ci);
[ # # ][ # # ]
[ # # ]
1374 : : #endif
1375 : : #if defined(_DYNAMIC)
1376 [ # # ][ # # ]: 0 : _load_dynamic_residual2(bi,ci,_DDT((qb1+qbtra)));
1377 : : #if defined(_DERIVATE)
1378 [ # # ][ # # ]: 0 : _load_dynamic_jacobian2s(bi,ci,ti,qbtra_Tempti_GND);
[ # # ]
1379 [ # # ][ # # ]: 0 : _load_dynamic_jacobian4(bi,ci,bi,ci,(qb1_Vbi_ci+qbtra_Vbi_ci));
[ # # ][ # # ]
[ # # ]
1380 : : #endif
1381 : : #endif
1382 : 0 : _load_static_residual2(bii,ci,Ib2);
1383 : : #if defined(_DERIVATE)
1384 [ # # ]: 0 : _load_static_jacobian2s(bii,ci,ti,Ib2_Tempti_GND);
1385 [ # # ][ # # ]: 0 : _load_static_jacobian4(bii,ci,bii,ci,Ib2_Vbii_ci);
[ # # ][ # # ]
[ # # ]
1386 : : #endif
1387 : : #if defined(_DYNAMIC)
1388 [ # # ][ # # ]: 0 : _load_dynamic_residual2(bii,ci,_DDT(qb2));
1389 : : #if defined(_DERIVATE)
1390 [ # # ][ # # ]: 0 : _load_dynamic_jacobian4(bii,ci,bii,ci,qb2_Vbii_ci);
[ # # ][ # # ]
[ # # ]
1391 [ # # ][ # # ]: 0 : _load_dynamic_jacobian2s(bii,ci,ti,qb2_Tempti_GND);
[ # # ]
1392 [ # # ][ # # ]: 0 : _load_dynamic_jacobian4(bii,ci,bii,ei,qb2_Vbii_ei);
[ # # ][ # # ]
[ # # ]
1393 : : #endif
1394 : : #endif
1395 : 0 : _load_static_residual2(bii,ei,Ib1);
1396 : : #if defined(_DERIVATE)
1397 [ # # ][ # # ]: 0 : _load_static_jacobian4(bii,ei,bii,ci,Ib1_Vbii_ci);
[ # # ][ # # ]
[ # # ]
1398 [ # # ]: 0 : _load_static_jacobian2s(bii,ei,ti,Ib1_Tempti_GND);
1399 [ # # ][ # # ]: 0 : _load_static_jacobian4(bii,ei,bii,ei,Ib1_Vbii_ei);
[ # # ][ # # ]
[ # # ]
1400 : : #endif
1401 : : #if defined(_DYNAMIC)
1402 [ # # ][ # # ]: 0 : _load_dynamic_residual2(bii,ei,_DDT(qbe));
1403 : : #if defined(_DERIVATE)
1404 [ # # ][ # # ]: 0 : _load_dynamic_jacobian4(bii,ei,ci,ei,qbe_Vci_ei);
[ # # ][ # # ]
[ # # ]
1405 [ # # ][ # # ]: 0 : _load_dynamic_jacobian4(bii,ei,bii,ci,qbe_Vbii_ci);
[ # # ][ # # ]
[ # # ]
1406 [ # # ][ # # ]: 0 : _load_dynamic_jacobian2s(bii,ei,ti,qbe_Tempti_GND);
[ # # ]
1407 [ # # ][ # # ]: 0 : _load_dynamic_jacobian4(bii,ei,bii,ei,qbe_Vbii_ei);
[ # # ][ # # ]
[ # # ]
1408 : : #endif
1409 : : #endif
1410 : 0 : _load_static_residual2(ci,ei,Ic1);
1411 : : #if defined(_DERIVATE)
1412 [ # # ][ # # ]: 0 : _load_static_jacobian4(ci,ei,bii,ci,Ic1_Vbii_ci);
[ # # ][ # # ]
[ # # ]
1413 [ # # ]: 0 : _load_static_jacobian2s(ci,ei,ti,Ic1_Tempti_GND);
1414 [ # # ][ # # ]: 0 : _load_static_jacobian4(ci,ei,bii,ei,Ic1_Vbii_ei);
[ # # ][ # # ]
[ # # ]
1415 : : #endif
1416 : 0 : _load_static_residual2(ex,ei,Ibdx);
1417 : : #if defined(_DERIVATE)
1418 [ # # ]: 0 : _load_static_jacobian2s(ex,ei,ti,Ibdx_Tempti_GND);
1419 [ # # ][ # # ]: 0 : _load_static_jacobian4(ex,ei,ex,ei,Ibdx_Vex_ei);
[ # # ][ # # ]
[ # # ]
1420 : : #endif
1421 : 0 : _load_static_residual2(exx,ei,Ibdxx);
1422 : : #if defined(_DERIVATE)
1423 [ # # ]: 0 : _load_static_jacobian2s(exx,ei,ti,Ibdxx_Tempti_GND);
1424 [ # # ][ # # ]: 0 : _load_static_jacobian4(exx,ei,exx,ei,Ibdxx_Vexx_ei);
[ # # ][ # # ]
[ # # ]
1425 : : #endif
1426 : 0 : _load_static_residual2(cx,ci,Icdx);
1427 : : #if defined(_DERIVATE)
1428 [ # # ]: 0 : _load_static_jacobian2s(cx,ci,ti,Icdx_Tempti_GND);
1429 [ # # ][ # # ]: 0 : _load_static_jacobian4(cx,ci,cx,ci,Icdx_Vcx_ci);
[ # # ][ # # ]
[ # # ]
1430 : : #endif
1431 : 0 : _save_whitenoise2(bii,ei,(TWO_Q*Ib1),"Ib");
1432 : 0 : _load_static_residual1(ni,NP(ni));
1433 : : #if defined(_DERIVATE)
1434 [ # # ]: 0 : _load_static_jacobian1(ni,ni,1.0);
1435 : : #endif
1436 : 0 : _save_whitenoise1(ni,(TWO_Q*Ic0),"Ic");
1437 : 0 : _load_static_residual2(bii,ei,NP(ni));
1438 : : #if defined(_DERIVATE)
1439 [ # # ]: 0 : _load_static_jacobian2s(bii,ei,ni,1.0);
1440 : : #endif
1441 : 0 : _load_static_residual2(bii,ci,NP(ni));
1442 : : #if defined(_DERIVATE)
1443 [ # # ]: 0 : _load_static_jacobian2s(bii,ci,ni,1.0);
1444 : : #endif
1445 [ # # ][ # # ]: 0 : _load_static_residual2(bii,bi,(BP(bii,bi)/(Rb2/N)));
1446 : : #if defined(_DERIVATE)
1447 [ # # ][ # # ]: 0 : _load_static_jacobian4(bii,bi,bii,bi,(1/(Rb2/N)));
[ # # ][ # # ]
[ # # ]
1448 : : #endif
1449 : 0 : _save_whitenoise2(bii,bi,((FOUR_K*TjK)/(Rb2/N)),"thermal");
1450 [ # # ][ # # ]: 0 : _load_static_residual2(b,bi,(BP(b,bi)/(Rb/N)));
1451 : : #if defined(_DERIVATE)
1452 [ # # ][ # # ]: 0 : _load_static_jacobian4(b,bi,b,bi,(1/(Rb/N)));
[ # # ][ # # ]
[ # # ]
1453 : : #endif
1454 : 0 : _save_whitenoise2(b,bi,((FOUR_K*TjK)/(Rb/N)),"thermal");
1455 [ # # ][ # # ]: 0 : _load_static_residual2(e,ei,(BP(e,ei)/(Re/N)));
1456 : : #if defined(_DERIVATE)
1457 [ # # ][ # # ]: 0 : _load_static_jacobian4(e,ei,e,ei,(1/(Re/N)));
[ # # ][ # # ]
[ # # ]
1458 : : #endif
1459 : 0 : _save_whitenoise2(e,ei,((FOUR_K*TjK)/(Re/N)),"thermal");
1460 [ # # ][ # # ]: 0 : _load_static_residual2(c,ci,(BP(c,ci)/(Rc/N)));
1461 : : #if defined(_DERIVATE)
1462 [ # # ][ # # ]: 0 : _load_static_jacobian4(c,ci,c,ci,(1/(Rc/N)));
[ # # ][ # # ]
[ # # ]
1463 : : #endif
1464 : 0 : _save_whitenoise2(c,ci,((FOUR_K*TjK)/(Rc/N)),"thermal");
1465 [ # # ][ # # ]: 0 : if
1466 : : ((Jse>0.0)&&(ne>0))
1467 : : {
1468 [ # # ][ # # ]: 0 : _load_static_residual2(ex,bii,(BP(ex,bii)/(Rbxx/N)));
1469 : : #if defined(_DERIVATE)
1470 [ # # ][ # # ]: 0 : _load_static_jacobian4(ex,bii,ex,bii,(1/(Rbxx/N)));
[ # # ][ # # ]
[ # # ]
1471 : : #endif
1472 : 0 : _save_whitenoise2(ex,bii,((FOUR_K*TjK)/(Rbxx/N)),"thermal");
1473 : : }
1474 : : else
1475 : : {
1476 [ # # ][ # # ]: 0 : _load_static_residual2(ex,bii,(BP(ex,bii)*1e-12));
1477 : : #if defined(_DERIVATE)
1478 [ # # ][ # # ]: 0 : _load_static_jacobian4(ex,bii,ex,bii,(1e-12));
[ # # ][ # # ]
[ # # ]
1479 : : #endif
1480 : : }
1481 [ # # ][ # # ]: 0 : if
1482 : : ((Jsee>0.0)&&(nee>0))
1483 : : {
1484 [ # # ][ # # ]: 0 : _load_static_residual2(exx,bii,(BP(exx,bii)/(Rbbxx/N)));
1485 : : #if defined(_DERIVATE)
1486 [ # # ][ # # ]: 0 : _load_static_jacobian4(exx,bii,exx,bii,(1/(Rbbxx/N)));
[ # # ][ # # ]
[ # # ]
1487 : : #endif
1488 : 0 : _save_whitenoise2(exx,bii,((FOUR_K*TjK)/(Rbbxx/N)),"thermal");
1489 : : }
1490 : : else
1491 : : {
1492 [ # # ][ # # ]: 0 : _load_static_residual2(exx,bii,(BP(exx,bii)*1e-12));
1493 : : #if defined(_DERIVATE)
1494 [ # # ][ # # ]: 0 : _load_static_jacobian4(exx,bii,exx,bii,(1e-12));
[ # # ][ # # ]
[ # # ]
1495 : : #endif
1496 : : }
1497 [ # # ][ # # ]: 0 : if
1498 : : ((Jsc>0.0)&&(nc>0))
1499 : : {
1500 [ # # ][ # # ]: 0 : _load_static_residual2(cx,bii,(BP(cx,bii)/(Rcxx/N)));
1501 : : #if defined(_DERIVATE)
1502 [ # # ][ # # ]: 0 : _load_static_jacobian4(cx,bii,cx,bii,(1/(Rcxx/N)));
[ # # ][ # # ]
[ # # ]
1503 : : #endif
1504 : 0 : _save_whitenoise2(cx,bii,((FOUR_K*TjK)/(Rcxx/N)),"thermal");
1505 : : }
1506 : : else
1507 : : {
1508 [ # # ][ # # ]: 0 : _load_static_residual2(cx,bii,(BP(cx,bii)*1e-12));
1509 : : #if defined(_DERIVATE)
1510 [ # # ][ # # ]: 0 : _load_static_jacobian4(cx,bii,cx,bii,(1e-12));
[ # # ][ # # ]
[ # # ]
1511 : : #endif
1512 : : }
1513 : : #if defined(_DYNAMIC)
1514 [ # # ][ # # ]: 0 : _load_dynamic_residual1(b,_DDT((Cpb*NP(b))));
1515 : : #if defined(_DERIVATE)
1516 [ # # ][ # # ]: 0 : _load_dynamic_jacobian1(b,b,(Cpb));
[ # # ]
1517 : : #endif
1518 : : #endif
1519 : : #if defined(_DYNAMIC)
1520 [ # # ][ # # ]: 0 : _load_dynamic_residual1(c,_DDT((Cpc*NP(c))));
1521 : : #if defined(_DERIVATE)
1522 [ # # ][ # # ]: 0 : _load_dynamic_jacobian1(c,c,(Cpc));
[ # # ]
1523 : : #endif
1524 : : #endif
1525 : : #if defined(_DYNAMIC)
1526 [ # # ][ # # ]: 0 : _load_dynamic_residual2(b,c,_DDT((Cq*BP(b,c))));
[ # # ][ # # ]
[ # # ]
1527 : : #if defined(_DERIVATE)
1528 [ # # ][ # # ]: 0 : _load_dynamic_jacobian4(b,c,b,c,(Cq));
[ # # ][ # # ]
[ # # ]
1529 : : #endif
1530 : : #endif
1531 : 0 : _load_static_residual1(ti,(-Ipdiss));
1532 : : #if defined(_DERIVATE)
1533 [ # # ][ # # ]: 0 : _load_static_jacobian2p(ti,bi,ci,(-Ipdiss_Vbi_ci));
[ # # ]
1534 [ # # ][ # # ]: 0 : _load_static_jacobian2p(ti,ci,ei,(-Ipdiss_Vci_ei));
[ # # ]
1535 [ # # ][ # # ]: 0 : _load_static_jacobian2p(ti,bii,ci,(-Ipdiss_Vbii_ci));
[ # # ]
1536 [ # # ]: 0 : _load_static_jacobian1(ti,ti,(-Ipdiss_Tempti_GND));
1537 [ # # ][ # # ]: 0 : _load_static_jacobian2p(ti,bii,ei,(-Ipdiss_Vbii_ei));
[ # # ]
1538 : : #endif
1539 [ # # ]: 0 : if
1540 : : (Rth)
1541 : : {
1542 [ # # ][ # # ]: 0 : _load_static_residual2(t,ti,(BP(t,ti)/Rth));
1543 : : #if defined(_DERIVATE)
1544 [ # # ][ # # ]: 0 : _load_static_jacobian4(t,ti,t,ti,(1/Rth));
[ # # ][ # # ]
[ # # ]
1545 : : #endif
1546 : : #if defined(_DYNAMIC)
1547 [ # # ][ # # ]: 0 : _load_dynamic_residual2(t,ti,(Cth*_DDT(BP(t,ti))));
[ # # ][ # # ]
[ # # ]
1548 : : #if defined(_DERIVATE)
1549 [ # # ][ # # ]: 0 : _load_dynamic_jacobian4(t,ti,t,ti,(Cth));
[ # # ][ # # ]
[ # # ]
1550 : : #endif
1551 : : #endif
1552 : : }
1553 : : else
1554 : : {
1555 [ # # ][ # # ]: 0 : _load_static_residual2(t,ti,(BP(t,ti)*1e3));
1556 : : #if defined(_DERIVATE)
1557 [ # # ][ # # ]: 0 : _load_static_jacobian4(t,ti,t,ti,(1e3));
[ # # ][ # # ]
[ # # ]
1558 : : #endif
1559 : : }
1560 [ # # ]: 0 : if
1561 : : (Ib0<=0)
1562 : : {
1563 : : #if defined(_DERIVATE)
1564 : 0 : Iniix_Vbii_ei=0.0;
1565 : 0 : Iniix_Tempti_GND=0.0;
1566 : 0 : Iniix_Vbii_ci=0.0;
1567 : : #endif
1568 : 0 : Iniix=0;
1569 : : #if defined(_DERIVATE)
1570 : 0 : Iniiix_Vbii_ei=0.0;
1571 : 0 : Iniiix_Tempti_GND=0.0;
1572 : 0 : Iniiix_Vbii_ci=0.0;
1573 : : #endif
1574 : 0 : Iniiix=0;
1575 : : }
1576 [ # # ]: 0 : if
1577 : : ((Ib0+Ic1)<=0)
1578 : : {
1579 : : #if defined(_DERIVATE)
1580 : 0 : Inivx_Vbii_ei=0.0;
1581 : 0 : Inivx_Tempti_GND=0.0;
1582 : 0 : Inivx_Vbii_ci=0.0;
1583 : : #endif
1584 : 0 : Inivx=0;
1585 : : }
1586 : : else
1587 : : {
1588 [ # # ]: 0 : if
1589 : : (Ab==2)
1590 : : {
1591 : : #if defined(_DERIVATE)
1592 : 0 : Iniix_Vbii_ei=Ib0_Vbii_ei;
1593 : 0 : Iniix_Tempti_GND=Ib0_Tempti_GND;
1594 : 0 : Iniix_Vbii_ci=Ib0_Vbii_ci;
1595 : : #endif
1596 : 0 : Iniix=Ib0;
1597 : : }
1598 : : else
1599 : : {
1600 : : {
1601 : 0 : double m00_pow(d00_pow0,Ib0,(Ab*0.5))
1602 : : #if defined(_DERIVATE)
1603 [ # # ]: 0 : double m10_pow(d10_pow0,d00_pow0,Ib0,(Ab*0.5))
1604 : : #endif
1605 : : #if defined(_DERIVATE)
1606 : 0 : Iniix_Vbii_ei=(d10_pow0*Ib0_Vbii_ei);
1607 : 0 : Iniix_Tempti_GND=(d10_pow0*Ib0_Tempti_GND);
1608 : 0 : Iniix_Vbii_ci=(d10_pow0*Ib0_Vbii_ci);
1609 : : #endif
1610 : 0 : Iniix=d00_pow0;
1611 : : }
1612 : : }
1613 [ # # ]: 0 : if
1614 : : (Afb==2)
1615 : : {
1616 : : #if defined(_DERIVATE)
1617 : 0 : Iniiix_Vbii_ei=Ib0_Vbii_ei;
1618 : 0 : Iniiix_Tempti_GND=Ib0_Tempti_GND;
1619 : 0 : Iniiix_Vbii_ci=Ib0_Vbii_ci;
1620 : : #endif
1621 : 0 : Iniiix=Ib0;
1622 : : }
1623 : : else
1624 : : {
1625 : : {
1626 : 0 : double m00_pow(d00_pow0,Ib0,(Afb*0.5))
1627 : : #if defined(_DERIVATE)
1628 [ # # ]: 0 : double m10_pow(d10_pow0,d00_pow0,Ib0,(Afb*0.5))
1629 : : #endif
1630 : : #if defined(_DERIVATE)
1631 : 0 : Iniiix_Vbii_ei=(d10_pow0*Ib0_Vbii_ei);
1632 : 0 : Iniiix_Tempti_GND=(d10_pow0*Ib0_Tempti_GND);
1633 : 0 : Iniiix_Vbii_ci=(d10_pow0*Ib0_Vbii_ci);
1634 : : #endif
1635 : 0 : Iniiix=d00_pow0;
1636 : : }
1637 : : }
1638 [ # # ]: 0 : if
1639 : : (Afe==2)
1640 : : {
1641 : : #if defined(_DERIVATE)
1642 : 0 : Inivx_Vbii_ei=(Ib0_Vbii_ei+Ic1_Vbii_ei);
1643 : 0 : Inivx_Tempti_GND=(Ib0_Tempti_GND+Ic1_Tempti_GND);
1644 : 0 : Inivx_Vbii_ci=(Ib0_Vbii_ci+Ic1_Vbii_ci);
1645 : : #endif
1646 : 0 : Inivx=(Ib0+Ic1);
1647 : : }
1648 : : else
1649 : : {
1650 : : {
1651 : 0 : double m00_pow(d00_pow0,(Ib0+Ic1),(Afe*0.5))
1652 : : #if defined(_DERIVATE)
1653 [ # # ]: 0 : double m10_pow(d10_pow0,d00_pow0,(Ib0+Ic1),(Afe*0.5))
1654 : : #endif
1655 : : #if defined(_DERIVATE)
1656 : 0 : Inivx_Vbii_ei=(d10_pow0*(Ib0_Vbii_ei+Ic1_Vbii_ei));
1657 : 0 : Inivx_Tempti_GND=(d10_pow0*(Ib0_Tempti_GND+Ic1_Tempti_GND));
1658 : 0 : Inivx_Vbii_ci=(d10_pow0*(Ib0_Vbii_ci+Ic1_Vbii_ci));
1659 : : #endif
1660 : 0 : Inivx=d00_pow0;
1661 : : }
1662 : : }
1663 : : }
1664 : 0 : _load_static_residual1(nii,NP(nii));
1665 : : #if defined(_DERIVATE)
1666 [ # # ]: 0 : _load_static_jacobian1(nii,nii,1.0);
1667 : : #endif
1668 : : #if defined(_DYNAMIC)
1669 [ # # ][ # # ]: 0 : _load_dynamic_residual1(nii,_DDT((NP(nii)/((2.0*3.1415)*Fb))));
1670 : : #if defined(_DERIVATE)
1671 [ # # ][ # # ]: 0 : _load_dynamic_jacobian1(nii,nii,(1/((2.0*3.1415)*Fb)));
[ # # ]
1672 : : #endif
1673 : : #endif
1674 : 0 : _save_whitenoise1(nii,(Area*Kb),NULL);
1675 : 0 : _load_static_residual1(niix,NP(niix));
1676 : : #if defined(_DERIVATE)
1677 [ # # ]: 0 : _load_static_jacobian1(niix,niix,1.0);
1678 : : #endif
1679 : 0 : _load_static_residual1(niix,Iniix);
1680 : : #if defined(_DERIVATE)
1681 [ # # ][ # # ]: 0 : _load_static_jacobian2p(niix,bii,ci,Iniix_Vbii_ci);
[ # # ]
1682 [ # # ]: 0 : _load_static_jacobian1(niix,ti,Iniix_Tempti_GND);
1683 [ # # ][ # # ]: 0 : _load_static_jacobian2p(niix,bii,ei,Iniix_Vbii_ei);
[ # # ]
1684 : : #endif
1685 : 0 : _load_static_residual1(niii,NP(niii));
1686 : : #if defined(_DERIVATE)
1687 [ # # ]: 0 : _load_static_jacobian1(niii,niii,1.0);
1688 : : #endif
1689 : 0 : _save_flickernoise1(niii,(Area*Kfb),Ffeb,"Flicker noise base-emitter junction (a)");
1690 : 0 : _load_static_residual1(niiix,NP(niiix));
1691 : : #if defined(_DERIVATE)
1692 [ # # ]: 0 : _load_static_jacobian1(niiix,niiix,1.0);
1693 : : #endif
1694 : 0 : _load_static_residual1(niiix,Iniiix);
1695 : : #if defined(_DERIVATE)
1696 [ # # ][ # # ]: 0 : _load_static_jacobian2p(niiix,bii,ci,Iniiix_Vbii_ci);
[ # # ]
1697 [ # # ]: 0 : _load_static_jacobian1(niiix,ti,Iniiix_Tempti_GND);
1698 [ # # ][ # # ]: 0 : _load_static_jacobian2p(niiix,bii,ei,Iniiix_Vbii_ei);
[ # # ]
1699 : : #endif
1700 [ # # ][ # # ]: 0 : _load_static_residual2(bii,ei,(NP(nii)*NP(niix)));
1701 : : #if defined(_DERIVATE)
1702 [ # # ][ # # ]: 0 : _load_static_jacobian2s(bii,ei,niix,(NP(nii)));
[ # # ][ # # ]
[ # # ]
1703 [ # # ][ # # ]: 0 : _load_static_jacobian2s(bii,ei,nii,(NP(niix)));
[ # # ][ # # ]
[ # # ]
1704 : : #endif
1705 [ # # ][ # # ]: 0 : _load_static_residual2(bii,ei,(NP(niii)*NP(niiix)));
1706 : : #if defined(_DERIVATE)
1707 [ # # ][ # # ]: 0 : _load_static_jacobian2s(bii,ei,niiix,(NP(niii)));
[ # # ][ # # ]
[ # # ]
1708 [ # # ][ # # ]: 0 : _load_static_jacobian2s(bii,ei,niii,(NP(niiix)));
[ # # ][ # # ]
[ # # ]
1709 : : #endif
1710 : 0 : _load_static_residual1(niv,NP(niv));
1711 : : #if defined(_DERIVATE)
1712 [ # # ]: 0 : _load_static_jacobian1(niv,niv,1.0);
1713 : : #endif
1714 : 0 : _save_flickernoise1(niv,(Area*Kfe),Ffee,"Hooge noise of emitter resistance");
1715 : 0 : _load_static_residual1(nivx,NP(nivx));
1716 : : #if defined(_DERIVATE)
1717 [ # # ]: 0 : _load_static_jacobian1(nivx,nivx,1.0);
1718 : : #endif
1719 : 0 : _load_static_residual1(nivx,Inivx);
1720 : : #if defined(_DERIVATE)
1721 [ # # ][ # # ]: 0 : _load_static_jacobian2p(nivx,bii,ci,Inivx_Vbii_ci);
[ # # ]
1722 [ # # ]: 0 : _load_static_jacobian1(nivx,ti,Inivx_Tempti_GND);
1723 [ # # ][ # # ]: 0 : _load_static_jacobian2p(nivx,bii,ei,Inivx_Vbii_ei);
[ # # ]
1724 : : #endif
1725 [ # # ][ # # ]: 0 : _load_static_residual2(e,ei,((NP(niv)*NP(nivx))/(Re/N)));
1726 : : #if defined(_DERIVATE)
1727 [ # # ][ # # ]: 0 : _load_static_jacobian2s(e,ei,nivx,((NP(niv))/(Re/N)));
[ # # ][ # # ]
[ # # ]
1728 [ # # ][ # # ]: 0 : _load_static_jacobian2s(e,ei,niv,((NP(nivx))/(Re/N)));
[ # # ][ # # ]
[ # # ]
1729 : : #endif
1730 : :
1731 : : /* ------------------ end of verilog analog equations --------------------- */
1732 : :
1733 : : /* ------------------ evaluate verilog noise equations -------------------- */
1734 : :
1735 : : /* ------------------- end of verilog noise equations --------------------- */
1736 : 0 : }
1737 : :
1738 : : /* Perform DC iteration. */
1739 : 0 : void HBT_X::calcDC (void)
1740 : : {
1741 : : // evaluate Verilog code
1742 : 0 : initVerilog ();
1743 : 0 : calcVerilog ();
1744 : :
1745 : : // fill right hand side and static jacobian
1746 [ # # ]: 0 : for (int i1 = 0; i1 < 19; i1++) {
1747 [ # # ]: 0 : setI (i1, _rhs[i1]);
1748 [ # # ]: 0 : for (int i2 = 0; i2 < 19; i2++) {
1749 [ # # ]: 0 : setY (i1, i2, _jstat[i1][i2]);
1750 : : }
1751 : : }
1752 : 0 : }
1753 : :
1754 : : /* Save operating points. */
1755 : 0 : void HBT_X::saveOperatingPoints (void)
1756 : : {
1757 : : // save global instance operating points
1758 : 0 : }
1759 : :
1760 : : /* Load operating points. */
1761 : 0 : void HBT_X::loadOperatingPoints (void)
1762 : : {
1763 : 0 : }
1764 : :
1765 : : /* Calculate operating points. */
1766 : 0 : void HBT_X::calcOperatingPoints (void)
1767 : : {
1768 : 0 : }
1769 : :
1770 : : /* Initialization of AC analysis. */
1771 : 0 : void HBT_X::initAC (void)
1772 : : {
1773 : 0 : allocMatrixMNA ();
1774 : 0 : }
1775 : :
1776 : : /* Perform AC calculations. */
1777 : 0 : void HBT_X::calcAC (nr_double_t frequency)
1778 : : {
1779 [ # # ]: 0 : setMatrixY (calcMatrixY (frequency));
1780 : 0 : }
1781 : :
1782 : : /* Compute Y-matrix for AC analysis. */
1783 : 0 : matrix HBT_X::calcMatrixY (nr_double_t frequency)
1784 : : {
1785 : 0 : _freq = frequency;
1786 : 0 : saveOperatingPoints ();
1787 : 0 : matrix y (19);
1788 : :
1789 [ # # ]: 0 : for (int i1 = 0; i1 < 19; i1++) {
1790 [ # # ]: 0 : for (int i2 = 0; i2 < 19; i2++) {
1791 : 0 : y (i1,i2) = nr_complex_t (_jstat[i1][i2], _jdyna[i1][i2] * 2 * M_PI * _freq);
1792 : : }
1793 : : }
1794 : :
1795 : 0 : return y;
1796 : : }
1797 : :
1798 : : /* Initialization of S-parameter analysis. */
1799 : 0 : void HBT_X::initSP (void)
1800 : : {
1801 : 0 : allocMatrixS ();
1802 : 0 : }
1803 : :
1804 : : /* Perform S-parameter calculations. */
1805 : 0 : void HBT_X::calcSP (nr_double_t frequency)
1806 : : {
1807 [ # # ][ # # ]: 0 : setMatrixS (ytos (calcMatrixY (frequency)));
[ # # ][ # # ]
[ # # ]
1808 : 0 : }
1809 : :
1810 : : /* Initialization of transient analysis. */
1811 : 0 : void HBT_X::initTR (void)
1812 : : {
1813 : 0 : setStates (2 * 19 * 19);
1814 : 0 : initDC ();
1815 : 0 : }
1816 : :
1817 : : /* Perform transient analysis iteration step. */
1818 : 0 : void HBT_X::calcTR (nr_double_t)
1819 : : {
1820 : 0 : doHB = 0;
1821 : 0 : doAC = 1;
1822 : 0 : doTR = 1;
1823 : 0 : calcDC ();
1824 : :
1825 : : int i1, i2, i3, i4, state;
1826 : :
1827 : : // 2-node charge integrations
1828 [ # # ]: 0 : for (i1 = 0; i1 < 19; i1++) {
1829 [ # # ]: 0 : for (i2 = 0; i2 < 19; i2++) {
1830 : 0 : state = 2 * (i2 + 19 * i1);
1831 [ # # ]: 0 : if (i1 != i2)
1832 [ # # ]: 0 : if (_charges[i1][i2] != 0.0)
1833 : 0 : transientCapacitanceQ (state, i1, i2, _charges[i1][i2]);
1834 : : } }
1835 : :
1836 : : // 1-node charge integrations
1837 [ # # ]: 0 : for (i1 = 0; i1 < 19; i1++) {
1838 : 0 : state = 2 * (i1 + 19 * i1);
1839 [ # # ]: 0 : if (_charges[i1][i1] != 0.0)
1840 : 0 : transientCapacitanceQ (state, i1, _charges[i1][i1]);
1841 : : }
1842 : :
1843 : : // charge: 2-node, voltage: 2-node
1844 [ # # ]: 0 : for (i1 = 0; i1 < 19; i1++) {
1845 [ # # ]: 0 : for (i2 = 0; i2 < 19; i2++) {
1846 [ # # ]: 0 : if (i1 != i2)
1847 [ # # ]: 0 : for (i3 = 0; i3 < 19; i3++) {
1848 [ # # ]: 0 : for (i4 = 0; i4 < 19; i4++) {
1849 [ # # ]: 0 : if (i3 != i4)
1850 [ # # ]: 0 : if (_caps[i1][i2][i3][i4] != 0.0)
1851 [ # # ][ # # ]: 0 : transientCapacitanceC (i1, i2, i3, i4, _caps[i1][i2][i3][i4], BP(i3,i4));
1852 : : } } } }
1853 : :
1854 : : // charge: 2-node, voltage: 1-node
1855 [ # # ]: 0 : for (i1 = 0; i1 < 19; i1++) {
1856 [ # # ]: 0 : for (i2 = 0; i2 < 19; i2++) {
1857 [ # # ]: 0 : if (i1 != i2)
1858 [ # # ]: 0 : for (i3 = 0; i3 < 19; i3++) {
1859 [ # # ]: 0 : if (_caps[i1][i2][i3][i3] != 0.0)
1860 [ # # ]: 0 : transientCapacitanceC2Q (i1, i2, i3, _caps[i1][i2][i3][i3], NP(i3));
1861 : : } } }
1862 : :
1863 : : // charge: 1-node, voltage: 2-node
1864 [ # # ]: 0 : for (i1 = 0; i1 < 19; i1++) {
1865 [ # # ]: 0 : for (i3 = 0; i3 < 19; i3++) {
1866 [ # # ]: 0 : for (i4 = 0; i4 < 19; i4++) {
1867 [ # # ]: 0 : if (i3 != i4)
1868 [ # # ]: 0 : if (_caps[i1][i1][i3][i4] != 0.0)
1869 [ # # ][ # # ]: 0 : transientCapacitanceC2V (i1, i3, i4, _caps[i1][i1][i3][i4], BP(i3,i4));
1870 : : } } }
1871 : :
1872 : : // charge: 1-node, voltage: 1-node
1873 [ # # ]: 0 : for (i1 = 0; i1 < 19; i1++) {
1874 [ # # ]: 0 : for (i3 = 0; i3 < 19; i3++) {
1875 [ # # ]: 0 : if (_caps[i1][i1][i3][i3] != 0.0)
1876 [ # # ]: 0 : transientCapacitanceC (i1, i3, _caps[i1][i1][i3][i3], NP(i3));
1877 : : } }
1878 : 0 : }
1879 : :
1880 : : /* Compute Cy-matrix for AC noise analysis. */
1881 : 0 : matrix HBT_X::calcMatrixCy (nr_double_t frequency)
1882 : : {
1883 : 0 : _freq = frequency;
1884 : 0 : matrix cy (19);
1885 : :
1886 : 0 : _load_flickernoise1 (niv,_flicker_pwr[niv][niv],_flicker_exp[niv][niv]);
1887 : 0 : _load_flickernoise1 (niii,_flicker_pwr[niii][niii],_flicker_exp[niii][niii]);
1888 : 0 : _load_whitenoise1 (nii,_white_pwr[nii][nii]);
1889 : 0 : _load_whitenoise2 (cx,bii,_white_pwr[cx][bii]);
1890 : 0 : _load_whitenoise2 (exx,bii,_white_pwr[exx][bii]);
1891 : 0 : _load_whitenoise2 (ex,bii,_white_pwr[ex][bii]);
1892 : 0 : _load_whitenoise2 (c,ci,_white_pwr[c][ci]);
1893 : 0 : _load_whitenoise2 (e,ei,_white_pwr[e][ei]);
1894 : 0 : _load_whitenoise2 (b,bi,_white_pwr[b][bi]);
1895 : 0 : _load_whitenoise2 (bii,bi,_white_pwr[bii][bi]);
1896 : 0 : _load_whitenoise1 (ni,_white_pwr[ni][ni]);
1897 : 0 : _load_whitenoise2 (bii,ei,_white_pwr[bii][ei]);
1898 : :
1899 : 0 : return cy;
1900 : : }
1901 : :
1902 : : /* Perform AC noise computations. */
1903 : 0 : void HBT_X::calcNoiseAC (nr_double_t frequency)
1904 : : {
1905 [ # # ]: 0 : setMatrixN (calcMatrixCy (frequency));
1906 : 0 : }
1907 : :
1908 : : /* Perform S-parameter noise computations. */
1909 : 0 : void HBT_X::calcNoiseSP (nr_double_t frequency)
1910 : : {
1911 [ # # ][ # # ]: 0 : setMatrixN (cytocs (calcMatrixCy (frequency) * z0, getMatrixS ()));
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
1912 : 0 : }
1913 : :
1914 : : /* Initialization of HB analysis. */
1915 : 0 : void HBT_X::initHB (int)
1916 : : {
1917 : 0 : initDC ();
1918 : 0 : allocMatrixHB ();
1919 : 0 : }
1920 : :
1921 : : /* Perform HB analysis. */
1922 : 0 : void HBT_X::calcHB (int)
1923 : : {
1924 : 0 : doHB = 1;
1925 : 0 : doAC = 1;
1926 : 0 : doTR = 0;
1927 : :
1928 : : // jacobian dI/dV and currents get filled
1929 : 0 : calcDC ();
1930 : 0 : saveOperatingPoints ();
1931 : :
1932 : : // fill in HB matrices
1933 [ # # ]: 0 : for (int i1 = 0; i1 < 19; i1++) {
1934 [ # # ]: 0 : setQ (i1, _qhs[i1]); // charges
1935 [ # # ]: 0 : setCV (i1, _chs[i1]); // jacobian dQ/dV * V
1936 [ # # ]: 0 : setGV (i1, _ghs[i1]); // jacobian dI/dV * V
1937 [ # # ]: 0 : for (int i2 = 0; i2 < 19; i2++) {
1938 [ # # ]: 0 : setQV (i1, i2, _jdyna[i1][i2]); // jacobian dQ/dV
1939 : : }
1940 : : }
1941 : 0 : }
1942 : :
1943 : : #include "HBT_X.defs.h"
1944 : :
|