My Project  0.0.16
QUCS Mapping
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
MESFET.core.cpp
Go to the documentation of this file.
1 /*
2  * MESFET.core.cpp - device implementations for MESFET 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 "MESFET.analogfunction.h"
16 #include "component.h"
17 #include "device.h"
18 #include "MESFET.core.h"
19 
20 #ifndef CIR_MESFET
21 #define CIR_MESFET -1
22 #endif
23 
24 // external nodes
25 #define Drain 0
26 #define Gate 1
27 #define Source 2
28 // internal nodes
29 #define n1 3
30 #define n2 4
31 #define n3 5
32 #define n4 6
33 
34 // useful macro definitions
35 #define NP(node) real (getV (node))
36 #define BP(pnode,nnode) (NP(pnode) - NP(nnode))
37 #define _load_static_residual2(pnode,nnode,current)\
38  _rhs[pnode] -= current;\
39  _rhs[nnode] += current;
40 #define _load_static_augmented_residual2(pnode,nnode,current)\
41  _rhs[pnode] -= current;\
42  _rhs[nnode] += current;
43 #define _load_static_residual1(node,current)\
44  _rhs[node] -= current;
45 #define _load_static_augmented_residual1(node,current)\
46  _rhs[node] -= current;
47 #define _load_static_jacobian4(pnode,nnode,vpnode,vnnode,conductance)\
48  _jstat[pnode][vpnode] += conductance;\
49  _jstat[nnode][vnnode] += conductance;\
50  _jstat[pnode][vnnode] -= conductance;\
51  _jstat[nnode][vpnode] -= conductance;\
52  if (doHB) {\
53  _ghs[pnode] += conductance * BP(vpnode,vnnode);\
54  _ghs[nnode] -= conductance * BP(vpnode,vnnode);\
55  } else {\
56  _rhs[pnode] += conductance * BP(vpnode,vnnode);\
57  _rhs[nnode] -= conductance * BP(vpnode,vnnode);\
58  }
59 #define _load_static_jacobian2p(node,vpnode,vnnode,conductance)\
60  _jstat[node][vpnode] += conductance;\
61  _jstat[node][vnnode] -= conductance;\
62  if (doHB) {\
63  _ghs[node] += conductance * BP(vpnode,vnnode);\
64  } else {\
65  _rhs[node] += conductance * BP(vpnode,vnnode);\
66  }
67 #define _load_static_jacobian2s(pnode,nnode,node,conductance)\
68  _jstat[pnode][node] += conductance;\
69  _jstat[nnode][node] -= conductance;\
70  if (doHB) {\
71  _ghs[pnode] += conductance * NP(node);\
72  _ghs[nnode] -= conductance * NP(node);\
73  } else {\
74  _rhs[pnode] += conductance * NP(node);\
75  _rhs[nnode] -= conductance * NP(node);\
76  }
77 #define _load_static_jacobian1(node,vnode,conductance)\
78  _jstat[node][vnode] += conductance;\
79  if (doHB) {\
80  _ghs[node] += conductance * NP(vnode);\
81  } else {\
82  _rhs[node] += conductance * NP(vnode);\
83  }
84 #define _load_dynamic_residual2(pnode,nnode,charge)\
85  if (doTR) _charges[pnode][nnode] += charge;\
86  if (doHB) {\
87  _qhs[pnode] -= charge;\
88  _qhs[nnode] += charge;\
89  }
90 #define _load_dynamic_residual1(node,charge)\
91  if (doTR) _charges[node][node] += charge;\
92  if (doHB) {\
93  _qhs[node] -= charge;\
94  }
95 #define _load_dynamic_jacobian4(pnode,nnode,vpnode,vnnode,capacitance)\
96  if (doAC) {\
97  _jdyna[pnode][vpnode] += capacitance;\
98  _jdyna[nnode][vnnode] += capacitance;\
99  _jdyna[pnode][vnnode] -= capacitance;\
100  _jdyna[nnode][vpnode] -= capacitance;\
101  }\
102  if (doTR) {\
103  _caps[pnode][nnode][vpnode][vnnode] += capacitance;\
104  }\
105  if (doHB) {\
106  _chs[pnode] += capacitance * BP(vpnode,vnnode);\
107  _chs[nnode] -= capacitance * BP(vpnode,vnnode);\
108  }
109 #define _load_dynamic_jacobian2s(pnode,nnode,vnode,capacitance)\
110  if (doAC) {\
111  _jdyna[pnode][vnode] += capacitance;\
112  _jdyna[nnode][vnode] -= capacitance;\
113  }\
114  if (doTR) {\
115  _caps[pnode][nnode][vnode][vnode] += capacitance;\
116  }\
117  if (doHB) {\
118  _chs[pnode] += capacitance * NP(vnode);\
119  _chs[nnode] -= capacitance * NP(vnode);\
120  }
121 #define _load_dynamic_jacobian2p(node,vpnode,vnnode,capacitance)\
122  if (doAC) {\
123  _jdyna[node][vpnode] += capacitance;\
124  _jdyna[node][vnnode] -= capacitance;\
125  }\
126  if (doTR) {\
127  _caps[node][node][vpnode][vnnode] += capacitance;\
128  }\
129  if (doHB) {\
130  _chs[node] += capacitance * BP(vpnode,vnnode);\
131  }
132 #define _load_dynamic_jacobian1(node,vnode,capacitance)\
133  if (doAC) {\
134  _jdyna[node][vnode] += capacitance;\
135  }\
136  if (doTR) {\
137  _caps[node][node][vnode][vnode] += capacitance;\
138  }\
139  if (doHB) {\
140  _chs[node] += capacitance * NP(vnode);\
141  }
142 
143 #define _save_whitenoise1(n1,pwr,type)\
144  _white_pwr[n1][n1] += pwr;
145 #define _save_whitenoise2(n1,n2,pwr,type)\
146  _white_pwr[n1][n2] += pwr;
147 #define _save_flickernoise1(n1,pwr,exp,type)\
148  _flicker_pwr[n1][n1] += pwr;\
149  _flicker_exp[n1][n1] += exp;
150 #define _save_flickernoise2(n1,n2,pwr,exp,type)\
151  _flicker_pwr[n1][n2] += pwr;\
152  _flicker_exp[n1][n2] += exp;
153 #define _load_whitenoise2(n1,n2,pwr)\
154  cy (n1,n2) -= pwr/kB/T0; cy (n2,n1) -= pwr/kB/T0;\
155  cy (n1,n1) += pwr/kB/T0; cy (n2,n2) += pwr/kB/T0;
156 #define _load_whitenoise1(n1,pwr)\
157  cy (n1,n1) += pwr/kB/T0;
158 #define _load_flickernoise2(n1,n2,pwr,exp)\
159  cy (n1,n2) -= pwr*pow(_freq,-exp)/kB/T0;\
160  cy (n2,n1) -= pwr*pow(_freq,-exp)/kB/T0;\
161  cy (n1,n1) += pwr*pow(_freq,-exp)/kB/T0;\
162  cy (n2,n2) += pwr*pow(_freq,-exp)/kB/T0;
163 #define _load_flickernoise1(n1,pwr,exp)\
164  cy (n1,n1) += pwr*pow(_freq,-exp)/kB/T0;
165 
166 // derivative helper macros
167 #define m00_hypot(v00,x,y) v00 = xhypot(x,y);
168 #define m10_hypot(v10,v00,x,y) v10 = (x)/(v00);
169 #define m11_hypot(v11,v00,x,y) v11 = (y)/(v00);
170 #define m00_max(v00,x,y) v00 = ((x)>(y))?(x):(y);
171 #define m10_max(v10,v00,x,y) v10 = ((x)>(y))?1.0:0.0;
172 #define m11_max(v11,v00,x,y) v11 = ((x)>(y))?0.0:1.0;
173 #define m00_min(v00,x,y) v00 = ((x)<(y))?(x):(y);
174 #define m10_min(v10,v00,x,y) v10 = ((x)<(y))?1.0:0.0;
175 #define m11_min(v11,v00,x,y) v11 = ((x)<(y))?0.0:1.0;
176 #define m00_pow(v00,x,y) v00 = pow(x,y);
177 #define m10_pow(v10,v00,x,y) v10 = (x==0.0)?0.0:(v00)*(y)/(x);
178 #define m11_pow(v11,v00,x,y) v11 = (x==0.0)?0.0:(log(x)*(v00));
179 
180 #define m00_div(v00,v10,x,y) double v10=1/(y); double v00=(x)*v10;
181 #define m10_div(v10,v00,vv,x,y)
182 #define m11_div(v11,v00,vv,x,y) double v11 = -v00*vv;
183 
184 #define m00_mult(v00,v10,v11,x,y) double v10=(x); double v11=(y); double v00=v10*v11;
185 #define m00_add(v00,x,y) double v00=(x)+(y);
186 
187 #define m00_cos(v00,x) v00 = cos(x);
188 #define m10_cos(v10,v00,x) v10 = (-sin(x));
189 #define m00_sin(v00,x) v00 = sin(x);
190 #define m10_sin(v10,v00,x) v10 = (cos(x));
191 #define m00_tan(v00,x) v00 = tan(x);
192 #define m10_tan(v10,v00,x) v10 = (1.0/cos(x)/cos(x));
193 #define m00_cosh(v00,x) v00 = cosh(x);
194 #define m10_cosh(v10,v00,x) v10 = (sinh(x));
195 #define m00_sinh(v00,x) v00 = sinh(x);
196 #define m10_sinh(v10,v00,x) v10 = (cosh(x));
197 #define m00_tanh(v00,x) v00 = tanh(x);
198 #define m10_tanh(v10,v00,x) v10 = (1.0/cosh(x)/cosh(x));
199 #define m00_acos(v00,x) v00 = acos(x);
200 #define m10_acos(v10,v00,x) v10 = (-1.0/sqrt(1-x*x));
201 #define m00_asin(v00,x) v00 = asin(x);
202 #define m10_asin(v10,v00,x) v10 = (+1.0/sqrt(1-x*x));
203 #define m00_atan(v00,x) v00 = atan(x);
204 #define m10_atan(v10,v00,x) v10 = (+1.0/(1+x*x));
205 #define m00_atanh(v00,x) v00 = atanh(x);
206 #define m10_atanh(v10,v00,x) v10 = (+1.0/(1-x*x));
207 #define m00_logE(v00,x) v00 = log(x);
208 #define m10_logE(v10,v00,x) v10 = (1.0/x);
209 #define m00_log10(v00,x) v00 = log10(x);
210 #define m10_log10(v10,v00,x) v10 = (1.0/x/M_LN10);
211 #define m00_sqrt(v00,x) v00 = sqrt(x);
212 #define m10_sqrt(v10,v00,x) v10 = (0.5/v00);
213 #define m00_fabs(v00,x) v00 = fabs(x);
214 #define m10_fabs(v10,v00,x) v10 = (((x)>=0)?(+1.0):(-1.0));
215 
216 #define m00_exp(v00,x) v00 = exp(x);
217 #define m10_exp(v10,v00,x) v10 = v00;
218 
219 #define m00_abs(v00) ((v00)<(0)?(-(v00)):(v00))
220 #define m00_floor(v00,x) v00 = floor(x);
221 #define m00_limexp(v00,x) v00 = ((x)<80.0?exp(x):exp(80.0)*(x-79.0));
222 #define m10_limexp(v10,v00,x) v10 = ((x)<80.0?(v00):exp(80.0));
223 
224 #define m20_logE(v00) (-1.0/v00/v00)
225 #define m20_exp(v00) exp(v00)
226 #define m20_limexp(v00) ((v00)<80.0?exp(v00):0.0)
227 #define m20_sqrt(v00) (-0.25/(v00)/sqrt(v00))
228 #define m20_fabs(v00) 0.0
229 #define m20_pow(x,y) ((y)*((y)-1.0)*pow(x,y)/(x)/(x))
230 #define m00_vt(x) (kBoverQ*(x))
231 #define m10_vt(x) (kBoverQ)
232 
233 // simulator specific definitions
234 #define _modelname "MESFET"
235 #define _instancename getName()
236 #define _circuit_temp (getPropertyDouble("Temp")+273.15)
237 #define _param_given(p) (isPropertyGiven(p)?1:0)
238 
239 
240 // $vt and $vt() functions
241 #define _vt_nom (kBoverQ*_circuit_temp)
242 
243 using namespace device;
244 
245 /* Device constructor. */
246 MESFET::MESFET() : circuit (7)
247 {
248  type = CIR_MESFET;
249 }
250 
251 /* Initialization of model. */
252 void MESFET::initModel (void)
253 {
254  // create internal nodes
255  setInternalNode (n1, "n1");
256  setInternalNode (n2, "n2");
257  setInternalNode (n3, "n3");
258  setInternalNode (n4, "n4");
259 
260  // get device model parameters
261  loadVariables ();
262  // evaluate global model equations
263  initializeModel ();
264  // evaluate initial step equations
265  initialStep ();
266  // evaluate global instance equations
267  initializeInstance ();
268 }
269 
270 /* Initialization of DC analysis. */
271 void MESFET::initDC (void)
272 {
273  allocMatrixMNA ();
274  initModel ();
275  pol = 1;
276  restartDC ();
277  doAC = 1;
278  doTR = 0;
279  doHB = 0;
280 }
281 
282 /* Run when DC is restarted (fallback algorithms). */
283 void MESFET::restartDC (void)
284 {
285 }
286 
287 /* Initialize Verilog-AMS code. */
288 void MESFET::initVerilog (void)
289 {
290  // initialization of noise variables
291  _white_pwr[n4][Source] = 0.0;
292  _white_pwr[Drain][n3] = 0.0;
293  _white_pwr[Gate][n2] = 0.0;
294  _white_pwr[n3][n4] = 0.0;
295  _flicker_pwr[n3][n4] = 0.0;
296  _flicker_exp[n3][n4] = 0.0;
297 
298  int i1, i2, i3, i4;
299 
300  // zero charges
301  for (i1 = 0; i1 < 7; i1++) {
302  for (i2 = 0; i2 < 7; i2++) {
303  _charges[i1][i2] = 0.0;
304  } }
305 
306  // zero capacitances
307  for (i1 = 0; i1 < 7; i1++) {
308  for (i2 = 0; i2 < 7; i2++) {
309  for (i3 = 0; i3 < 7; i3++) {
310  for (i4 = 0; i4 < 7; i4++) {
311  _caps[i1][i2][i3][i4] = 0.0;
312  } } } }
313 
314  // zero right hand side, static and dynamic jacobian
315  for (i1 = 0; i1 < 7; i1++) {
316  _rhs[i1] = 0.0;
317  _qhs[i1] = 0.0;
318  _chs[i1] = 0.0;
319  _ghs[i1] = 0.0;
320  for (i2 = 0; i2 < 7; i2++) {
321  _jstat[i1][i2] = 0.0;
322  _jdyna[i1][i2] = 0.0;
323  }
324  }
325 }
326 
327 /* Load device model input parameters. */
328 void MESFET::loadVariables (void)
329 {
330  LEVEL = getPropertyInteger ("LEVEL");
331  Vto = getPropertyDouble ("Vto");
332  Beta = getPropertyDouble ("Beta");
333  Alpha = getPropertyDouble ("Alpha");
334  Lambda = getPropertyDouble ("Lambda");
335  B = getPropertyDouble ("B");
336  Qp = getPropertyDouble ("Qp");
337  Delta = getPropertyDouble ("Delta");
338  Vmax = getPropertyDouble ("Vmax");
339  Vdelta1 = getPropertyDouble ("Vdelta1");
340  Vdelta2 = getPropertyDouble ("Vdelta2");
341  Gamma = getPropertyDouble ("Gamma");
342  Nsc = getPropertyDouble ("Nsc");
343  Is = getPropertyDouble ("Is");
344  N = getPropertyDouble ("N");
345  Vbi = getPropertyDouble ("Vbi");
346  Bv = getPropertyDouble ("Bv");
347  Xti = getPropertyDouble ("Xti");
348  Fc = getPropertyDouble ("Fc");
349  Tau = getPropertyDouble ("Tau");
350  Rin = getPropertyDouble ("Rin");
351  Area = getPropertyDouble ("Area");
352  Eg = getPropertyDouble ("Eg");
353  M = getPropertyDouble ("M");
354  Cgd = getPropertyDouble ("Cgd");
355  Cgs = getPropertyDouble ("Cgs");
356  Cds = getPropertyDouble ("Cds");
357  Betatc = getPropertyDouble ("Betatc");
358  Alphatc = getPropertyDouble ("Alphatc");
359  Gammatc = getPropertyDouble ("Gammatc");
360  Ng = getPropertyDouble ("Ng");
361  Nd = getPropertyDouble ("Nd");
362  ILEVELS = getPropertyInteger ("ILEVELS");
363  ILEVELD = getPropertyInteger ("ILEVELD");
364  QLEVELS = getPropertyInteger ("QLEVELS");
365  QLEVELD = getPropertyInteger ("QLEVELD");
366  QLEVELDS = getPropertyInteger ("QLEVELDS");
367  Vtotc = getPropertyDouble ("Vtotc");
368  Rg = getPropertyDouble ("Rg");
369  Rd = getPropertyDouble ("Rd");
370  Rs = getPropertyDouble ("Rs");
371  Rgtc = getPropertyDouble ("Rgtc");
372  Rdtc = getPropertyDouble ("Rdtc");
373  Rstc = getPropertyDouble ("Rstc");
374  Ibv = getPropertyDouble ("Ibv");
375  Rf = getPropertyDouble ("Rf");
376  R1 = getPropertyDouble ("R1");
377  Af = getPropertyDouble ("Af");
378  Kf = getPropertyDouble ("Kf");
379  Gdsnoi = getPropertyDouble ("Gdsnoi");
380  Tnom = getPropertyDouble ("Tnom");
381 }
382 
383 /* #define's for translated code */
384 #undef _DDT
385 #define _DDT(q) q
386 #define _DYNAMIC
387 #define _DERIVATE
388 #define _DDX
389 #define _DERIVATEFORDDX
390 
391 /* Evaluate Verilog-AMS equations in model initialization. */
392 void MESFET::initializeModel (void)
393 {
394 }
395 
396 /* Evaluate Verilog-AMS equations in instance initialization. */
397 void MESFET::initializeInstance (void)
398 {
399 }
400 
401 /* Evaluate Verilog-AMS equations in initial step. */
402 void MESFET::initialStep (void)
403 {
404 }
405 
406 /* Evaluate Verilog-AMS equations in final step. */
407 void MESFET::finalStep (void)
408 {
409 }
410 
411 /* Evaluate Verilog-AMS equations in analog block. */
412 void MESFET::calcVerilog (void)
413 {
414 
415 /* ----------------- evaluate verilog analog equations -------------------- */
416 double gm1;
417 #if defined(_DERIVATE)
418 double gm1_Vn2_n4;
419 double gm1_Vn3_n4;
420 #endif
421 double H1;
422 #if defined(_DERIVATE)
423 double H1_Vn3_n4;
424 double H1_Vn2_n4;
425 #endif
426 double flicker_pwr;
427 #if defined(_DERIVATE)
428 double flicker_pwr_Vn2_n4;
429 double flicker_pwr_Vn3_n4;
430 #endif
431 double thermal_pwr;
432 #if defined(_DERIVATE)
433 double thermal_pwr_Vn2_n4;
434 double thermal_pwr_Vn3_n4;
435 #endif
436 double An;
437 #if defined(_DERIVATE)
438 double An_Vn3_n4;
439 double An_Vn2_n4;
440 #endif
441 double gm;
442 #if defined(_DERIVATE)
443 double gm_Vn2_n4;
444 double gm_Vn3_n4;
445 #endif
446 double fourkt;
447 #if defined(_DYNAMIC)
448 double Qds;
449 #if defined(_DERIVATE)
450 double Qds_Vn2_n4;
451 double Qds_Vn3_n4;
452 #endif
453 #endif
454 #if defined(_DYNAMIC)
455 double Veff2;
456 #if defined(_DERIVATE)
457 double Veff2_Vn2_n1;
458 double Veff2_Vn2_n3;
459 #endif
460 #endif
461 #if defined(_DYNAMIC)
462 double Qgd2;
463 #if defined(_DERIVATE)
464 double Qgd2_Vn2_n3;
465 #endif
466 #endif
467 #if defined(_DYNAMIC)
468 double Qgd1;
469 #if defined(_DERIVATE)
470 double Qgd1_Vn2_n3;
471 #endif
472 #endif
473 #if defined(_DYNAMIC)
474 double Qgd;
475 #if defined(_DERIVATE)
476 double Qgd_Vn2_n1;
477 double Qgd_Vn2_n3;
478 #endif
479 #endif
480 #if defined(_DYNAMIC)
481 double Vnew;
482 #if defined(_DERIVATE)
483 double Vnew_Vn2_n1;
484 double Vnew_Vn2_n3;
485 #endif
486 #endif
487 #if defined(_DYNAMIC)
488 double Veff1;
489 #if defined(_DERIVATE)
490 double Veff1_Vn2_n1;
491 double Veff1_Vn2_n3;
492 #endif
493 #endif
494 #if defined(_DYNAMIC)
495 double Qgs2;
496 #if defined(_DERIVATE)
497 double Qgs2_Vn2_n1;
498 #endif
499 #endif
500 #if defined(_DYNAMIC)
501 double Qgs1;
502 #if defined(_DERIVATE)
503 double Qgs1_Vn2_n1;
504 #endif
505 #endif
506 #if defined(_DYNAMIC)
507 double Qgs;
508 #if defined(_DERIVATE)
509 double Qgs_Vn2_n3;
510 double Qgs_Vn2_n1;
511 #endif
512 #endif
513 double Igd4;
514 #if defined(_DERIVATE)
515 double Igd4_Vn2_n3;
516 #endif
517 double Igd3;
518 double Igd2;
519 #if defined(_DERIVATE)
520 double Igd2_Vn2_n3;
521 #endif
522 double Igd1;
523 #if defined(_DERIVATE)
524 double Igd1_Vn2_n3;
525 #endif
526 double Igd;
527 #if defined(_DERIVATE)
528 double Igd_Vn2_n3;
529 #endif
530 double Igs4;
531 #if defined(_DERIVATE)
532 double Igs4_Vn2_n4;
533 #endif
534 double Igs3;
535 double Igs2;
536 #if defined(_DERIVATE)
537 double Igs2_Vn2_n4;
538 #endif
539 double Igs1;
540 #if defined(_DERIVATE)
541 double Igs1_Vn2_n4;
542 #endif
543 double Igs;
544 #if defined(_DERIVATE)
545 double Igs_Vn2_n4;
546 #endif
547 double Fd;
548 #if defined(_DERIVATE)
549 double Fd_Vn3_n4;
550 #endif
551 double Al;
552 #if defined(_DERIVATE)
553 double Al_Vn3_n4;
554 #endif
555 double Vg;
556 #if defined(_DERIVATE)
557 double Vg_Vn3_n4;
558 double Vg_Vn2_n4;
559 #endif
560 double Vst;
561 #if defined(_DERIVATE)
562 double Vst_Vn3_n4;
563 #endif
564 double Nst;
565 #if defined(_DERIVATE)
566 double Nst_Vn3_n4;
567 #endif
568 double Ids1;
569 #if defined(_DERIVATE)
570 double Ids1_Vn2_n4;
571 double Ids1_Vn3_n4;
572 #endif
573 double Vf;
574 #if defined(_DERIVATE)
575 double Vf_Vn2_n4;
576 #endif
577 double Ah;
578 double Ids;
579 #if defined(_DERIVATE)
580 double Ids_Vn2_n4;
581 double Ids_Vn3_n4;
582 #endif
583 double Alpha_T2;
584 double Gamma_T2;
585 double Vto_T2;
586 #if defined(_DYNAMIC)
587 double Cgd_T2;
588 #endif
589 #if defined(_DYNAMIC)
590 double Cgs_T2;
591 #endif
592 double Is_T2;
593 #if defined(_DYNAMIC)
594 double Vbi_T2;
595 #endif
596 #if defined(_DYNAMIC)
597 double F3;
598 #endif
599 #if defined(_DYNAMIC)
600 double F2;
601 #endif
602 #if defined(_DYNAMIC)
603 double F1;
604 #endif
605 #if defined(_DYNAMIC)
606 double Eg_T2;
607 #endif
608 double Eg_T1;
609 double Vt_T2;
610 double Beta_T2;
611 double Rs_T2;
612 double Rd_T2;
613 double Rg_T2;
614 #if defined(_DYNAMIC)
615 double con1;
616 #endif
617 double Tr;
618 double T2;
619 double T1;
620 #if defined(_DYNAMIC)
621 #endif
622 #if defined(_DYNAMIC)
623 {
624 double m00_min(d00_min0,(Fc*Vbi),Vmax)
625 Vmax=d00_min0;
626 }
627 #endif
628 T1=(Tnom+273.15);
629 T2=_circuit_temp;
630 Tr=(T2/T1);
631 #if defined(_DYNAMIC)
632 {
633 double m00_pow(d00_pow0,Tr,1.5)
634 con1=d00_pow0;
635 }
636 #endif
637 Rg_T2=(Rg*(1+(Rgtc*(T2-T1))));
638 Rd_T2=(Rd*(1+(Rdtc*(T2-T1))));
639 Rs_T2=(Rs*(1+(Rstc*(T2-T1))));
640 {
641 double m00_pow(d00_pow0,1.01,(Betatc*(T2-T1)))
642 Beta_T2=((Area*Beta)*d00_pow0);
643 }
644 Vt_T2=_vt_nom;
645 Eg_T1=(Eg-(((7.02e-4*T1)*T1)/(1108.0+T1)));
646 #if defined(_DYNAMIC)
647 Eg_T2=(Eg-(((7.02e-4*T2)*T2)/(1108.0+T2)));
648 #endif
649 #if defined(_DYNAMIC)
650 {
651 double m00_pow(d00_pow0,(1-Fc),(1-M))
652 F1=((Vbi/(1-M))*(1-d00_pow0));
653 }
654 #endif
655 #if defined(_DYNAMIC)
656 {
657 double m00_pow(d00_pow0,(1-Fc),(1+M))
658 F2=d00_pow0;
659 }
660 #endif
661 #if defined(_DYNAMIC)
662 F3=(1-(Fc*(1+M)));
663 #endif
664 #if defined(_DYNAMIC)
665 {
666 double m00_logE(d00_logE0,con1)
667 Vbi_T2=(((Tr*Vbi)-((2*Vt_T2)*d00_logE0))-((Tr*Eg_T1)-Eg_T2));
668 }
669 #endif
670 {
671 double m00_pow(d00_pow0,Tr,(Xti/N))
672 double m00_limexp(d00_limexp1,(((-(1.602176462e-19*Eg_T1))*(1-Tr))/(1.3806503e-23*T2)))
673 Is_T2=(((Area*Is)*d00_pow0)*d00_limexp1);
674 }
675 #if defined(_DYNAMIC)
676 Cgs_T2=((Area*Cgs)*(1+(M*((400e-6*(T2-T1))-((Vbi_T2-Vbi)/Vbi)))));
677 #endif
678 #if defined(_DYNAMIC)
679 Cgd_T2=((Area*Cgd)*(1+(M*((400e-6*(T2-T1))-((Vbi_T2-Vbi)/Vbi)))));
680 #endif
681 Vto_T2=(Vto+(Vtotc*(T2-T1)));
682 Gamma_T2=(Gamma*(1+(Gammatc*(T2-T1))));
683 {
684 double m00_pow(d00_pow0,1.01,(Alphatc*(T2-T1)))
685 Alpha_T2=(Alpha*d00_pow0);
686 }
687 if
688 ((LEVEL)==(1))
689 {
690 if
691 (((BP(n2,n4)-Vto_T2)>0))
692 {
693 {
694 double m00_pow(d00_pow0,(BP(n2,n4)-Vto_T2),2)
695 double m00_tanh(d00_tanh1,(Alpha*BP(n3,n4)))
696 #if defined(_DERIVATE)
697 double m10_pow(d10_pow0,d00_pow0,(BP(n2,n4)-Vto_T2),2)
698 double m10_tanh(d10_tanh1,d00_tanh1,(Alpha*BP(n3,n4)))
699 #endif
700 #if defined(_DERIVATE)
701 Ids_Vn2_n4=(Beta_T2*(d10_pow0*1.0))*(1+(Lambda*BP(n3,n4)))*d00_tanh1;
702 Ids_Vn3_n4=((((Beta_T2*d00_pow0)*(Lambda))*d00_tanh1)+(((Beta_T2*d00_pow0)*(1+(Lambda*BP(n3,n4))))*(Alpha)*d10_tanh1));
703 #endif
704 Ids=(((Beta_T2*d00_pow0)*(1+(Lambda*BP(n3,n4))))*d00_tanh1);
705 }
706 }
707 else
708 {
709 #if defined(_DERIVATE)
710 Ids_Vn2_n4=0.0;
711 Ids_Vn3_n4=0.0;
712 #endif
713 Ids=0;
714 }
715 }
716 else
717 if
718 ((LEVEL)==(2))
719 {
720 Ah=(1/((2*Vt_T2)*Nsc));
721 {
722 double m00_exp(d00_exp0,(Ah*(BP(n2,n4)-Vto_T2)))
723 double m00_logE(d00_logE1,(1+d00_exp0))
724 #if defined(_DERIVATE)
725 #define d10_exp0 d00_exp0
726 double m10_logE(d10_logE1,d00_logE1,(1+d00_exp0))
727 #endif
728 #if defined(_DERIVATE)
729 Vf_Vn2_n4=((Ah)*d10_exp0*d10_logE1/Ah);
730 #endif
731 Vf=(d00_logE1/Ah);
732 }
733 {
734 double m00_pow(d00_pow0,Vf,2)
735 double m00_tanh(d00_tanh1,(Alpha*BP(n3,n4)))
736 #if defined(_DERIVATE)
737 double m10_pow(d10_pow0,d00_pow0,Vf,2)
738 double m10_tanh(d10_tanh1,d00_tanh1,(Alpha*BP(n3,n4)))
739 #endif
740 #if defined(_DERIVATE)
741 Ids_Vn2_n4=(Beta_T2*(d10_pow0*Vf_Vn2_n4))*(1+(Lambda*BP(n3,n4)))*d00_tanh1;
742 Ids_Vn3_n4=((((Beta_T2*d00_pow0)*(Lambda))*d00_tanh1)+(((Beta_T2*d00_pow0)*(1+(Lambda*BP(n3,n4))))*(Alpha)*d10_tanh1));
743 #endif
744 Ids=(((Beta_T2*d00_pow0)*(1+(Lambda*BP(n3,n4))))*d00_tanh1);
745 }
746 }
747 else
748 if
749 ((LEVEL)==(3))
750 {
751 if
752 (((BP(n2,n4)-Vto_T2)>0))
753 {
754 if
755 (((0<BP(n3,n4))&&(BP(n3,n4)<(3/Alpha))))
756 {
757 {
758 double m00_pow(d00_pow0,(BP(n2,n4)-Vto_T2),2)
759 double m00_pow(d00_pow1,(1-((Alpha*BP(n3,n4))/3)),3)
760 #if defined(_DERIVATE)
761 double m10_pow(d10_pow0,d00_pow0,(BP(n2,n4)-Vto_T2),2)
762 double m10_pow(d10_pow1,d00_pow1,(1-((Alpha*BP(n3,n4))/3)),3)
763 #endif
764 #if defined(_DERIVATE)
765 Ids_Vn2_n4=((((Beta_T2*(1+(Lambda*BP(n3,n4))))*(d10_pow0*1.0))*(1-d00_pow1)*(1+(B*(BP(n2,n4)-Vto_T2)))-(((Beta_T2*(1+(Lambda*BP(n3,n4))))*d00_pow0)*(1-d00_pow1))*(B))/(1+(B*(BP(n2,n4)-Vto_T2)))/(1+(B*(BP(n2,n4)-Vto_T2))));
766 Ids_Vn3_n4=((((Beta_T2*(Lambda))*d00_pow0*(1-d00_pow1))+(((Beta_T2*(1+(Lambda*BP(n3,n4))))*d00_pow0)*(-(d10_pow1*(-((Alpha)/3))))))/(1+(B*(BP(n2,n4)-Vto_T2))));
767 #endif
768 Ids=((((Beta_T2*(1+(Lambda*BP(n3,n4))))*d00_pow0)*(1-d00_pow1))/(1+(B*(BP(n2,n4)-Vto_T2))));
769 }
770 }
771 if
772 ((BP(n3,n4)>=(3/Alpha)))
773 {
774 {
775 double m00_pow(d00_pow0,(BP(n2,n4)-Vto_T2),2)
776 #if defined(_DERIVATE)
777 double m10_pow(d10_pow0,d00_pow0,(BP(n2,n4)-Vto_T2),2)
778 #endif
779 #if defined(_DERIVATE)
780 Ids_Vn2_n4=((((Beta_T2*(1+(Lambda*BP(n3,n4))))*(d10_pow0*1.0))*(1+(B*(BP(n2,n4)-Vto_T2)))-((Beta_T2*(1+(Lambda*BP(n3,n4))))*d00_pow0)*(B))/(1+(B*(BP(n2,n4)-Vto_T2)))/(1+(B*(BP(n2,n4)-Vto_T2))));
781 Ids_Vn3_n4=((Beta_T2*(Lambda))*d00_pow0/(1+(B*(BP(n2,n4)-Vto_T2))));
782 #endif
783 Ids=(((Beta_T2*(1+(Lambda*BP(n3,n4))))*d00_pow0)/(1+(B*(BP(n2,n4)-Vto_T2))));
784 }
785 }
786 if
787 ((BP(n3,n4)<0))
788 {
789 #if defined(_DERIVATE)
790 Ids_Vn2_n4=0.0;
791 Ids_Vn3_n4=0.0;
792 #endif
793 Ids=0;
794 }
795 }
796 else
797 {
798 #if defined(_DERIVATE)
799 Ids_Vn2_n4=0.0;
800 Ids_Vn3_n4=0.0;
801 #endif
802 Ids=0;
803 }
804 }
805 else
806 if
807 ((LEVEL)==(4))
808 {
809 if
810 (((BP(n2,n4)-Vto_T2)>0))
811 {
812 if
813 (((0<BP(n3,n4))&&(BP(n3,n4)<(3/Alpha))))
814 {
815 {
816 double m00_pow(d00_pow0,(BP(n2,n4)-Vto_T2),Qp)
817 double m00_pow(d00_pow1,(1-((Alpha*BP(n3,n4))/3)),3)
818 #if defined(_DERIVATE)
819 double m10_pow(d10_pow0,d00_pow0,(BP(n2,n4)-Vto_T2),Qp)
820 double m10_pow(d10_pow1,d00_pow1,(1-((Alpha*BP(n3,n4))/3)),3)
821 #endif
822 #if defined(_DERIVATE)
823 Ids1_Vn2_n4=(Beta_T2*(d10_pow0*1.0))*(1-d00_pow1);
824 Ids1_Vn3_n4=((Beta_T2*d00_pow0)*(-(d10_pow1*(-((Alpha)/3)))));
825 #endif
826 Ids1=((Beta_T2*d00_pow0)*(1-d00_pow1));
827 }
828 #if defined(_DERIVATE)
829 Ids_Vn2_n4=((Ids1_Vn2_n4*(1+(Lambda*BP(n3,n4)))*(1+((Delta*BP(n3,n4))*Ids1))-(Ids1*(1+(Lambda*BP(n3,n4))))*((Delta*BP(n3,n4))*Ids1_Vn2_n4))/(1+((Delta*BP(n3,n4))*Ids1))/(1+((Delta*BP(n3,n4))*Ids1)));
830 Ids_Vn3_n4=((((Ids1_Vn3_n4*(1+(Lambda*BP(n3,n4))))+(Ids1*(Lambda)))*(1+((Delta*BP(n3,n4))*Ids1))-(Ids1*(1+(Lambda*BP(n3,n4))))*(((Delta)*Ids1)+((Delta*BP(n3,n4))*Ids1_Vn3_n4)))/(1+((Delta*BP(n3,n4))*Ids1))/(1+((Delta*BP(n3,n4))*Ids1)));
831 #endif
832 Ids=((Ids1*(1+(Lambda*BP(n3,n4))))/(1+((Delta*BP(n3,n4))*Ids1)));
833 }
834 if
835 ((BP(n3,n4)>=(3/Alpha)))
836 {
837 {
838 double m00_pow(d00_pow0,(BP(n2,n4)-Vto_T2),Qp)
839 #if defined(_DERIVATE)
840 double m10_pow(d10_pow0,d00_pow0,(BP(n2,n4)-Vto_T2),Qp)
841 #endif
842 #if defined(_DERIVATE)
843 Ids1_Vn2_n4=(Beta_T2*(d10_pow0*1.0));
844 Ids1_Vn3_n4=0.0;
845 #endif
846 Ids1=(Beta_T2*d00_pow0);
847 }
848 #if defined(_DERIVATE)
849 Ids_Vn2_n4=((Ids1_Vn2_n4*(1+(Lambda*BP(n3,n4)))*(1+((Delta*BP(n3,n4))*Ids1))-(Ids1*(1+(Lambda*BP(n3,n4))))*((Delta*BP(n3,n4))*Ids1_Vn2_n4))/(1+((Delta*BP(n3,n4))*Ids1))/(1+((Delta*BP(n3,n4))*Ids1)));
850 Ids_Vn3_n4=((((Ids1_Vn3_n4*(1+(Lambda*BP(n3,n4))))+(Ids1*(Lambda)))*(1+((Delta*BP(n3,n4))*Ids1))-(Ids1*(1+(Lambda*BP(n3,n4))))*(((Delta)*Ids1)+((Delta*BP(n3,n4))*Ids1_Vn3_n4)))/(1+((Delta*BP(n3,n4))*Ids1))/(1+((Delta*BP(n3,n4))*Ids1)));
851 #endif
852 Ids=((Ids1*(1+(Lambda*BP(n3,n4))))/(1+((Delta*BP(n3,n4))*Ids1)));
853 }
854 if
855 ((BP(n3,n4)<0))
856 {
857 #if defined(_DERIVATE)
858 Ids_Vn2_n4=0.0;
859 Ids_Vn3_n4=0.0;
860 #endif
861 Ids=0;
862 }
863 }
864 else
865 {
866 #if defined(_DERIVATE)
867 Ids_Vn2_n4=0.0;
868 Ids_Vn3_n4=0.0;
869 #endif
870 Ids=0;
871 }
872 }
873 else
874 if
875 ((LEVEL)==(5))
876 {
877 if
878 (((BP(n2,n4)-Vto_T2)>0))
879 {
880 #if defined(_DERIVATE)
881 Nst_Vn3_n4=(Nd);
882 #endif
883 Nst=(Ng+(Nd*BP(n3,n4)));
884 if
885 ((Nst<1.0))
886 {
887 #if defined(_DERIVATE)
888 Nst_Vn3_n4=0.0;
889 #endif
890 Nst=1.0;
891 }
892 #if defined(_DERIVATE)
893 Vst_Vn3_n4=Nst_Vn3_n4*Vt_T2;
894 #endif
895 Vst=(Nst*Vt_T2);
896 {
897 double m00_exp(d00_exp0,(((BP(n2,n4)-Vto_T2)+(Gamma_T2*BP(n3,n4)))/(Qp*Vst)))
898 double m00_logE(d00_logE1,(d00_exp0+1))
899 #if defined(_DERIVATE)
900 #define d10_exp0 d00_exp0
901 double m10_logE(d10_logE1,d00_logE1,(d00_exp0+1))
902 #endif
903 #if defined(_DERIVATE)
904 Vg_Vn3_n4=(((Qp*Vst_Vn3_n4)*d00_logE1)+((Qp*Vst)*(((Gamma_T2)*(Qp*Vst)-((BP(n2,n4)-Vto_T2)+(Gamma_T2*BP(n3,n4)))*(Qp*Vst_Vn3_n4))/(Qp*Vst)/(Qp*Vst))*d10_exp0*d10_logE1));
905 Vg_Vn2_n4=((Qp*Vst)*(1/(Qp*Vst))*d10_exp0*d10_logE1);
906 #endif
907 Vg=((Qp*Vst)*d00_logE1);
908 }
909 #if defined(_DERIVATE)
910 Al_Vn3_n4=(Alpha_T2);
911 #endif
912 Al=(Alpha_T2*BP(n3,n4));
913 {
914 double m00_sqrt(d00_sqrt0,(1.0+(Al*Al)))
915 #if defined(_DERIVATE)
916 double m10_sqrt(d10_sqrt0,d00_sqrt0,(1.0+(Al*Al)))
917 #endif
918 #if defined(_DERIVATE)
919 Fd_Vn3_n4=((Al_Vn3_n4*d00_sqrt0-Al*((Al_Vn3_n4*Al)+(Al*Al_Vn3_n4))*d10_sqrt0)/d00_sqrt0/d00_sqrt0);
920 #endif
921 Fd=(Al/d00_sqrt0);
922 }
923 {
924 double m00_pow(d00_pow0,Vg,Qp)
925 #if defined(_DERIVATE)
926 double m10_pow(d10_pow0,d00_pow0,Vg,Qp)
927 #endif
928 #if defined(_DERIVATE)
929 Ids1_Vn2_n4=(Beta_T2*(d10_pow0*Vg_Vn2_n4))*Fd;
930 Ids1_Vn3_n4=(((Beta_T2*(d10_pow0*Vg_Vn3_n4))*Fd)+((Beta_T2*d00_pow0)*Fd_Vn3_n4));
931 #endif
932 Ids1=((Beta_T2*d00_pow0)*Fd);
933 }
934 #if defined(_DERIVATE)
935 Ids_Vn2_n4=((Ids1_Vn2_n4*(1+(Lambda*BP(n3,n4)))*(1+((Delta*BP(n3,n4))*Ids1))-(Ids1*(1+(Lambda*BP(n3,n4))))*((Delta*BP(n3,n4))*Ids1_Vn2_n4))/(1+((Delta*BP(n3,n4))*Ids1))/(1+((Delta*BP(n3,n4))*Ids1)));
936 Ids_Vn3_n4=((((Ids1_Vn3_n4*(1+(Lambda*BP(n3,n4))))+(Ids1*(Lambda)))*(1+((Delta*BP(n3,n4))*Ids1))-(Ids1*(1+(Lambda*BP(n3,n4))))*(((Delta)*Ids1)+((Delta*BP(n3,n4))*Ids1_Vn3_n4)))/(1+((Delta*BP(n3,n4))*Ids1))/(1+((Delta*BP(n3,n4))*Ids1)));
937 #endif
938 Ids=((Ids1*(1+(Lambda*BP(n3,n4))))/(1+((Delta*BP(n3,n4))*Ids1)));
939 }
940 else
941 {
942 #if defined(_DERIVATE)
943 Ids_Vn2_n4=0.0;
944 Ids_Vn3_n4=0.0;
945 #endif
946 Ids=0;
947 }
948 }
949 else
950 { /* no default */ }
951 if
952 ((ILEVELS)==(0))
953 {
954 #if defined(_DERIVATE)
955 Igs_Vn2_n4=0.0;
956 #endif
957 Igs=0;
958 }
959 else
960 if
961 ((ILEVELS)==(1))
962 {
963 if
964 ((BP(n2,n4)>Vbi))
965 {
966 #if defined(_DERIVATE)
967 Igs_Vn2_n4=(1/Rf);
968 #endif
969 Igs=((BP(n2,n4)-Vbi)/Rf);
970 }
971 else
972 {
973 #if defined(_DERIVATE)
974 Igs_Vn2_n4=(1e-12);
975 #endif
976 Igs=(((-Area)*Is)+(BP(n2,n4)*1e-12));
977 }
978 }
979 else
980 if
981 ((ILEVELS)==(2))
982 {
983 if
984 ((BP(n2,n4)>Vbi))
985 {
986 #if defined(_DERIVATE)
987 Igs1_Vn2_n4=(1/Rf);
988 #endif
989 Igs1=((BP(n2,n4)-Vbi)/Rf);
990 }
991 else
992 {
993 #if defined(_DERIVATE)
994 Igs1_Vn2_n4=(1e-12);
995 #endif
996 Igs1=(((-Area)*Is)+(BP(n2,n4)*1e-12));
997 }
998 if
999 ((BP(n2,n4)<(-Bv)))
1000 {
1001 #if defined(_DERIVATE)
1002 Igs2_Vn2_n4=(1/R1);
1003 #endif
1004 Igs2=((BP(n2,n4)+Bv)/R1);
1005 }
1006 #if defined(_DERIVATE)
1007 Igs_Vn2_n4=(Igs1_Vn2_n4+Igs2_Vn2_n4);
1008 #endif
1009 Igs=(Igs1+Igs2);
1010 }
1011 else
1012 if
1013 ((ILEVELS)==(3))
1014 {
1015 if
1016 ((BP(n2,n4)>(((-5.0)*N)*Vt_T2)))
1017 {
1018 {
1019 double m00_limexp(d00_limexp0,(BP(n2,n4)/(N*Vt_T2)))
1020 #if defined(_DERIVATE)
1021 double m10_limexp(d10_limexp0,d00_limexp0,(BP(n2,n4)/(N*Vt_T2)))
1022 #endif
1023 #if defined(_DERIVATE)
1024 Igs_Vn2_n4=((Is_T2*(1/(N*Vt_T2))*d10_limexp0)+(1e-12));
1025 #endif
1026 Igs=((Is_T2*(d00_limexp0-1.0))+(BP(n2,n4)*1e-12));
1027 }
1028 }
1029 else
1030 {
1031 #if defined(_DERIVATE)
1032 Igs_Vn2_n4=(1e-12);
1033 #endif
1034 Igs=((-Is_T2)+(BP(n2,n4)*1e-12));
1035 }
1036 }
1037 else
1038 if
1039 ((ILEVELS)==(4))
1040 {
1041 if
1042 ((BP(n2,n4)>(((-5.0)*N)*Vt_T2)))
1043 {
1044 {
1045 double m00_limexp(d00_limexp0,(BP(n2,n4)/(N*Vt_T2)))
1046 #if defined(_DERIVATE)
1047 double m10_limexp(d10_limexp0,d00_limexp0,(BP(n2,n4)/(N*Vt_T2)))
1048 #endif
1049 #if defined(_DERIVATE)
1050 Igs1_Vn2_n4=(((Area*Is_T2)*(1/(N*Vt_T2))*d10_limexp0)+(1e-12));
1051 #endif
1052 Igs1=(((Area*Is_T2)*(d00_limexp0-1.0))+(BP(n2,n4)*1e-12));
1053 }
1054 }
1055 else
1056 {
1057 #if defined(_DERIVATE)
1058 Igs1_Vn2_n4=0.0;
1059 #endif
1060 Igs1=0;
1061 }
1062 if
1063 ((((-Bv)<BP(n2,n4))&&(BP(n2,n4)<(((-5.0)*N)*Vt_T2))))
1064 {
1065 #if defined(_DERIVATE)
1066 Igs2_Vn2_n4=(1e-12);
1067 #endif
1068 Igs2=(((-Area)*Is_T2)+(BP(n2,n4)*1e-12));
1069 }
1070 else
1071 {
1072 #if defined(_DERIVATE)
1073 Igs2_Vn2_n4=0.0;
1074 #endif
1075 Igs2=0;
1076 }
1077 if
1078 ((BP(n2,n4)==(-Bv)))
1079 {
1080 Igs3=(-Ibv);
1081 }
1082 else
1083 {
1084 Igs3=0;
1085 }
1086 if
1087 ((BP(n2,n4)<(-Bv)))
1088 {
1089 {
1090 double m00_limexp(d00_limexp0,((-(Bv+BP(n2,n4)))/Vt_T2))
1091 #if defined(_DERIVATE)
1092 double m10_limexp(d10_limexp0,d00_limexp0,((-(Bv+BP(n2,n4)))/Vt_T2))
1093 #endif
1094 #if defined(_DERIVATE)
1095 Igs4_Vn2_n4=(((-Area)*Is_T2)*((-1.0)/Vt_T2)*d10_limexp0);
1096 #endif
1097 Igs4=(((-Area)*Is_T2)*((d00_limexp0-1.0)+(Bv/Vt_T2)));
1098 }
1099 }
1100 else
1101 {
1102 #if defined(_DERIVATE)
1103 Igs4_Vn2_n4=0.0;
1104 #endif
1105 Igs4=0;
1106 }
1107 #if defined(_DERIVATE)
1108 Igs_Vn2_n4=((Igs1_Vn2_n4+Igs2_Vn2_n4)+Igs4_Vn2_n4);
1109 #endif
1110 Igs=(((Igs1+Igs2)+Igs3)+Igs4);
1111 }
1112 else
1113 { /* no default */ }
1114 if
1115 ((ILEVELD)==(0))
1116 {
1117 #if defined(_DERIVATE)
1118 Igd_Vn2_n3=0.0;
1119 #endif
1120 Igd=0;
1121 }
1122 else
1123 if
1124 ((ILEVELD)==(1))
1125 {
1126 if
1127 ((BP(n2,n3)>Vbi))
1128 {
1129 #if defined(_DERIVATE)
1130 Igd_Vn2_n3=(1/Rf);
1131 #endif
1132 Igd=((BP(n2,n3)-Vbi)/Rf);
1133 }
1134 else
1135 {
1136 #if defined(_DERIVATE)
1137 Igd_Vn2_n3=(1e-12);
1138 #endif
1139 Igd=(((-Area)*Is)+(BP(n2,n3)*1e-12));
1140 }
1141 }
1142 else
1143 if
1144 ((ILEVELD)==(2))
1145 {
1146 if
1147 ((BP(n2,n3)>Vbi))
1148 {
1149 #if defined(_DERIVATE)
1150 Igd1_Vn2_n3=(1/Rf);
1151 #endif
1152 Igd1=((BP(n2,n3)-Vbi)/Rf);
1153 }
1154 else
1155 {
1156 #if defined(_DERIVATE)
1157 Igd1_Vn2_n3=(1e-12);
1158 #endif
1159 Igd1=(((-Area)*Is)+(BP(n2,n3)*1e-12));
1160 }
1161 if
1162 ((BP(n2,n3)<(-Bv)))
1163 {
1164 #if defined(_DERIVATE)
1165 Igd2_Vn2_n3=(1/R1);
1166 #endif
1167 Igd2=((BP(n2,n3)+Bv)/R1);
1168 }
1169 #if defined(_DERIVATE)
1170 Igd_Vn2_n3=(Igd1_Vn2_n3+Igd2_Vn2_n3);
1171 #endif
1172 Igd=(Igd1+Igd2);
1173 }
1174 else
1175 if
1176 ((ILEVELD)==(3))
1177 {
1178 if
1179 ((BP(n2,n3)>(((-5.0)*N)*Vt_T2)))
1180 {
1181 {
1182 double m00_limexp(d00_limexp0,(BP(n2,n3)/(N*Vt_T2)))
1183 #if defined(_DERIVATE)
1184 double m10_limexp(d10_limexp0,d00_limexp0,(BP(n2,n3)/(N*Vt_T2)))
1185 #endif
1186 #if defined(_DERIVATE)
1187 Igd_Vn2_n3=(((Area*Is_T2)*(1/(N*Vt_T2))*d10_limexp0)+(1e-12));
1188 #endif
1189 Igd=(((Area*Is_T2)*(d00_limexp0-1.0))+(BP(n2,n3)*1e-12));
1190 }
1191 }
1192 else
1193 {
1194 #if defined(_DERIVATE)
1195 Igd_Vn2_n3=(1e-12);
1196 #endif
1197 Igd=((-Is_T2)+(BP(n2,n3)*1e-12));
1198 }
1199 }
1200 else
1201 if
1202 ((ILEVELD)==(4))
1203 {
1204 if
1205 ((BP(n2,n3)>(((-5.0)*N)*Vt_T2)))
1206 {
1207 {
1208 double m00_limexp(d00_limexp0,(BP(n2,n3)/(N*Vt_T2)))
1209 #if defined(_DERIVATE)
1210 double m10_limexp(d10_limexp0,d00_limexp0,(BP(n2,n3)/(N*Vt_T2)))
1211 #endif
1212 #if defined(_DERIVATE)
1213 Igd1_Vn2_n3=(((Area*Is_T2)*(1/(N*Vt_T2))*d10_limexp0)+(1e-12));
1214 #endif
1215 Igd1=(((Area*Is_T2)*(d00_limexp0-1.0))+(BP(n2,n3)*1e-12));
1216 }
1217 }
1218 else
1219 {
1220 #if defined(_DERIVATE)
1221 Igd1_Vn2_n3=0.0;
1222 #endif
1223 Igd1=0;
1224 }
1225 if
1226 ((((-Bv)<BP(n2,n3))&&(BP(n2,n3)<(((-5.0)*N)*Vt_T2))))
1227 {
1228 #if defined(_DERIVATE)
1229 Igd2_Vn2_n3=(1e-12);
1230 #endif
1231 Igd2=(((-Area)*Is_T2)+(BP(n2,n3)*1e-12));
1232 }
1233 else
1234 {
1235 #if defined(_DERIVATE)
1236 Igd2_Vn2_n3=0.0;
1237 #endif
1238 Igd2=0;
1239 }
1240 if
1241 ((BP(n2,n3)==(-Bv)))
1242 {
1243 Igd3=(-Ibv);
1244 }
1245 else
1246 {
1247 Igd3=0;
1248 }
1249 if
1250 ((BP(n2,n3)<(-Bv)))
1251 {
1252 {
1253 double m00_limexp(d00_limexp0,((-(Bv+BP(n2,n3)))/Vt_T2))
1254 #if defined(_DERIVATE)
1255 double m10_limexp(d10_limexp0,d00_limexp0,((-(Bv+BP(n2,n3)))/Vt_T2))
1256 #endif
1257 #if defined(_DERIVATE)
1258 Igd4_Vn2_n3=(((-Area)*Is_T2)*((-1.0)/Vt_T2)*d10_limexp0);
1259 #endif
1260 Igd4=(((-Area)*Is_T2)*((d00_limexp0-1.0)+(Bv/Vt_T2)));
1261 }
1262 }
1263 else
1264 {
1265 #if defined(_DERIVATE)
1266 Igd4_Vn2_n3=0.0;
1267 #endif
1268 Igd4=0;
1269 }
1270 #if defined(_DERIVATE)
1271 Igd_Vn2_n3=((Igd1_Vn2_n3+Igd2_Vn2_n3)+Igd4_Vn2_n3);
1272 #endif
1273 Igd=(((Igd1+Igd2)+Igd3)+Igd4);
1274 }
1275 else
1276 { /* no default */ }
1277 #ifdef _DYNAMIC
1278 if
1279 ((QLEVELS==0))
1280 {
1281 #if defined(_DYNAMIC)
1282 #if defined(_DERIVATE)
1283 Qgs_Vn2_n3=0.0;
1284 Qgs_Vn2_n1=0.0;
1285 #endif
1286 Qgs=0;
1287 #endif
1288 }
1289 #endif /* if (...) */
1290 #ifdef _DYNAMIC
1291 if
1292 ((QLEVELS==1))
1293 {
1294 #if defined(_DYNAMIC)
1295 #if defined(_DERIVATE)
1296 Qgs_Vn2_n3=0.0;
1297 Qgs_Vn2_n1=((Area*Cgs));
1298 #endif
1299 Qgs=((Area*Cgs)*BP(n2,n1));
1300 #endif
1301 }
1302 #endif /* if (...) */
1303 #ifdef _DYNAMIC
1304 if
1305 ((QLEVELS==2))
1306 {
1307 #ifdef _DYNAMIC
1308 if
1309 ((BP(n2,n1)<(Fc*Vbi)))
1310 {
1311 #if defined(_DYNAMIC)
1312 {
1313 double m00_pow(d00_pow0,(1-(BP(n2,n1)/Vbi_T2)),(1-M))
1314 #if defined(_DERIVATE)
1315 double m10_pow(d10_pow0,d00_pow0,(1-(BP(n2,n1)/Vbi_T2)),(1-M))
1316 #endif
1317 #if defined(_DERIVATE)
1318 Qgs1_Vn2_n1=(((Cgs_T2*Vbi_T2)/(1-M))*(-(d10_pow0*(-(1/Vbi_T2)))));
1319 #endif
1320 Qgs1=(((Cgs_T2*Vbi_T2)/(1-M))*(1-d00_pow0));
1321 }
1322 #endif
1323 }
1324 else
1325 {
1326 #if defined(_DYNAMIC)
1327 #if defined(_DERIVATE)
1328 Qgs1_Vn2_n1=0.0;
1329 #endif
1330 Qgs1=0;
1331 #endif
1332 }
1333 #endif /* if (...) */
1334 #ifdef _DYNAMIC
1335 if
1336 ((BP(n2,n1)>=(Fc*Vbi)))
1337 {
1338 #if defined(_DYNAMIC)
1339 #if defined(_DERIVATE)
1340 Qgs2_Vn2_n1=(Cgs_T2*((1/F2)*((F3)+((M/(2*Vbi_T2))*(BP(n2,n1)+BP(n2,n1))))));
1341 #endif
1342 Qgs2=(Cgs_T2*(F1+((1/F2)*((F3*(BP(n2,n1)-(Fc*Vbi_T2)))+((M/(2*Vbi_T2))*((BP(n2,n1)*BP(n2,n1))-(((Fc*Vbi_T2)*Fc)*Vbi_T2)))))));
1343 #endif
1344 }
1345 else
1346 {
1347 #if defined(_DYNAMIC)
1348 #if defined(_DERIVATE)
1349 Qgs2_Vn2_n1=0.0;
1350 #endif
1351 Qgs2=0;
1352 #endif
1353 }
1354 #endif /* if (...) */
1355 #if defined(_DYNAMIC)
1356 #if defined(_DERIVATE)
1357 Qgs_Vn2_n3=0.0;
1358 Qgs_Vn2_n1=(Qgs1_Vn2_n1+Qgs2_Vn2_n1);
1359 #endif
1360 Qgs=(Qgs1+Qgs2);
1361 #endif
1362 }
1363 #endif /* if (...) */
1364 #ifdef _DYNAMIC
1365 if
1366 ((QLEVELS==3))
1367 {
1368 #if defined(_DYNAMIC)
1369 {
1370 double m00_pow(d00_pow0,(BP(n2,n1)-BP(n2,n3)),2)
1371 double m00_sqrt(d00_sqrt1,(d00_pow0+(Vdelta1*Vdelta1)))
1372 #if defined(_DERIVATE)
1373 double m10_pow(d10_pow0,d00_pow0,(BP(n2,n1)-BP(n2,n3)),2)
1374 double m10_sqrt(d10_sqrt1,d00_sqrt1,(d00_pow0+(Vdelta1*Vdelta1)))
1375 #endif
1376 #if defined(_DERIVATE)
1377 Veff1_Vn2_n1=(0.5*(1.0+(d10_pow0*1.0)*d10_sqrt1));
1378 Veff1_Vn2_n3=(0.5*(1.0+(d10_pow0*(-1.0))*d10_sqrt1));
1379 #endif
1380 Veff1=(0.5*((BP(n2,n1)+BP(n2,n3))+d00_sqrt1));
1381 }
1382 #endif
1383 #if defined(_DYNAMIC)
1384 {
1385 double m00_pow(d00_pow0,(Veff1-Vto),2)
1386 double m00_sqrt(d00_sqrt1,(d00_pow0+(Vdelta2*Vdelta2)))
1387 #if defined(_DERIVATE)
1388 double m10_pow(d10_pow0,d00_pow0,(Veff1-Vto),2)
1389 double m10_sqrt(d10_sqrt1,d00_sqrt1,(d00_pow0+(Vdelta2*Vdelta2)))
1390 #endif
1391 #if defined(_DERIVATE)
1392 Vnew_Vn2_n1=(0.5*(Veff1_Vn2_n1+(d10_pow0*Veff1_Vn2_n1)*d10_sqrt1));
1393 Vnew_Vn2_n3=(0.5*(Veff1_Vn2_n3+(d10_pow0*Veff1_Vn2_n3)*d10_sqrt1));
1394 #endif
1395 Vnew=(0.5*((Veff1+Vto_T2)+d00_sqrt1));
1396 }
1397 #endif
1398 #ifdef _DYNAMIC
1399 if
1400 ((Vnew>Vmax))
1401 {
1402 #if defined(_DYNAMIC)
1403 {
1404 double m00_sqrt(d00_sqrt0,(1-(Vmax/Vbi_T2)))
1405 double m00_sqrt(d00_sqrt1,(1-(Vmax/Vbi)))
1406 #if defined(_DERIVATE)
1407 Qgs_Vn2_n3=(Cgs_T2*(Vnew_Vn2_n3/d00_sqrt1));
1408 Qgs_Vn2_n1=(Cgs_T2*(Vnew_Vn2_n1/d00_sqrt1));
1409 #endif
1410 Qgs=(Cgs_T2*(((2*Vbi_T2)*(1-d00_sqrt0))+((Vnew-Vmax)/d00_sqrt1)));
1411 }
1412 #endif
1413 }
1414 else
1415 {
1416 #if defined(_DYNAMIC)
1417 {
1418 double m00_sqrt(d00_sqrt0,(1-(Vnew/Vbi)))
1419 #if defined(_DERIVATE)
1420 double m10_sqrt(d10_sqrt0,d00_sqrt0,(1-(Vnew/Vbi)))
1421 #endif
1422 #if defined(_DERIVATE)
1423 Qgs_Vn2_n3=(((Cgs_T2*2)*Vbi)*(-(-(Vnew_Vn2_n3/Vbi))*d10_sqrt0));
1424 Qgs_Vn2_n1=(((Cgs_T2*2)*Vbi)*(-(-(Vnew_Vn2_n1/Vbi))*d10_sqrt0));
1425 #endif
1426 Qgs=(((Cgs_T2*2)*Vbi)*(1-d00_sqrt0));
1427 }
1428 #endif
1429 }
1430 #endif /* if (...) */
1431 }
1432 #endif /* if (...) */
1433 #ifdef _DYNAMIC
1434 if
1435 ((QLEVELD==0))
1436 {
1437 #if defined(_DYNAMIC)
1438 #if defined(_DERIVATE)
1439 Qgd_Vn2_n1=0.0;
1440 Qgd_Vn2_n3=0.0;
1441 #endif
1442 Qgd=0;
1443 #endif
1444 }
1445 #endif /* if (...) */
1446 #ifdef _DYNAMIC
1447 if
1448 ((QLEVELD==1))
1449 {
1450 #if defined(_DYNAMIC)
1451 #if defined(_DERIVATE)
1452 Qgd_Vn2_n1=0.0;
1453 Qgd_Vn2_n3=((Area*Cgd));
1454 #endif
1455 Qgd=((Area*Cgd)*BP(n2,n3));
1456 #endif
1457 }
1458 #endif /* if (...) */
1459 #ifdef _DYNAMIC
1460 if
1461 ((QLEVELD==2))
1462 {
1463 #ifdef _DYNAMIC
1464 if
1465 ((BP(n2,n3)<(Fc*Vbi)))
1466 {
1467 #if defined(_DYNAMIC)
1468 {
1469 double m00_pow(d00_pow0,(1-(BP(n2,n3)/Vbi_T2)),(1-M))
1470 #if defined(_DERIVATE)
1471 double m10_pow(d10_pow0,d00_pow0,(1-(BP(n2,n3)/Vbi_T2)),(1-M))
1472 #endif
1473 #if defined(_DERIVATE)
1474 Qgd1_Vn2_n3=(((Cgd_T2*Vbi_T2)/(1-M))*(-(d10_pow0*(-(1/Vbi_T2)))));
1475 #endif
1476 Qgd1=(((Cgd_T2*Vbi_T2)/(1-M))*(1-d00_pow0));
1477 }
1478 #endif
1479 }
1480 else
1481 {
1482 #if defined(_DYNAMIC)
1483 #if defined(_DERIVATE)
1484 Qgd1_Vn2_n3=0.0;
1485 #endif
1486 Qgd1=0;
1487 #endif
1488 }
1489 #endif /* if (...) */
1490 #ifdef _DYNAMIC
1491 if
1492 ((BP(n2,n3)>=(Fc*Vbi)))
1493 {
1494 #if defined(_DYNAMIC)
1495 #if defined(_DERIVATE)
1496 Qgd2_Vn2_n3=(Cgd_T2*((1/F2)*((F3)+((M/(2*Vbi_T2))*(BP(n2,n3)+BP(n2,n3))))));
1497 #endif
1498 Qgd2=(Cgd_T2*(F1+((1/F2)*((F3*(BP(n2,n3)-(Fc*Vbi_T2)))+((M/(2*Vbi_T2))*((BP(n2,n3)*BP(n2,n3))-(((Fc*Vbi_T2)*Fc)*Vbi_T2)))))));
1499 #endif
1500 }
1501 else
1502 {
1503 #if defined(_DYNAMIC)
1504 #if defined(_DERIVATE)
1505 Qgd2_Vn2_n3=0.0;
1506 #endif
1507 Qgd2=0;
1508 #endif
1509 }
1510 #endif /* if (...) */
1511 #if defined(_DYNAMIC)
1512 #if defined(_DERIVATE)
1513 Qgd_Vn2_n1=0.0;
1514 Qgd_Vn2_n3=(Qgd1_Vn2_n3+Qgd2_Vn2_n3);
1515 #endif
1516 Qgd=(Qgd1+Qgd2);
1517 #endif
1518 }
1519 #endif /* if (...) */
1520 #ifdef _DYNAMIC
1521 if
1522 ((QLEVELD==3))
1523 {
1524 #if defined(_DYNAMIC)
1525 {
1526 double m00_pow(d00_pow0,(BP(n2,n1)-BP(n2,n3)),2)
1527 double m00_sqrt(d00_sqrt1,(d00_pow0+(Vdelta1*Vdelta1)))
1528 #if defined(_DERIVATE)
1529 double m10_pow(d10_pow0,d00_pow0,(BP(n2,n1)-BP(n2,n3)),2)
1530 double m10_sqrt(d10_sqrt1,d00_sqrt1,(d00_pow0+(Vdelta1*Vdelta1)))
1531 #endif
1532 #if defined(_DERIVATE)
1533 Veff2_Vn2_n1=(0.5*(1.0-(d10_pow0*1.0)*d10_sqrt1));
1534 Veff2_Vn2_n3=(0.5*(1.0-(d10_pow0*(-1.0))*d10_sqrt1));
1535 #endif
1536 Veff2=(0.5*((BP(n2,n1)+BP(n2,n3))-d00_sqrt1));
1537 }
1538 #endif
1539 #if defined(_DYNAMIC)
1540 #if defined(_DERIVATE)
1541 Qgd_Vn2_n1=(Cgd_T2*Veff2_Vn2_n1);
1542 Qgd_Vn2_n3=(Cgd_T2*Veff2_Vn2_n3);
1543 #endif
1544 Qgd=(Cgd_T2*Veff2);
1545 #endif
1546 }
1547 #endif /* if (...) */
1548 if
1549 ((QLEVELDS)==(0))
1550 {
1551 #if defined(_DYNAMIC)
1552 #if defined(_DERIVATE)
1553 Qds_Vn2_n4=0.0;
1554 Qds_Vn3_n4=0.0;
1555 #endif
1556 Qds=0;
1557 #endif
1558 }
1559 else
1560 if
1561 ((QLEVELDS)==(1))
1562 {
1563 #if defined(_DYNAMIC)
1564 #if defined(_DERIVATE)
1565 Qds_Vn2_n4=0.0;
1566 Qds_Vn3_n4=((Area*Cds));
1567 #endif
1568 Qds=((Area*Cds)*BP(n3,n4));
1569 #endif
1570 }
1571 else
1572 if
1573 ((QLEVELDS)==(2))
1574 {
1575 #if defined(_DYNAMIC)
1576 #if defined(_DERIVATE)
1577 Qds_Vn2_n4=(Tau*Ids_Vn2_n4);
1578 Qds_Vn3_n4=(((Area*Cds))+(Tau*Ids_Vn3_n4));
1579 #endif
1580 Qds=(((Area*Cds)*BP(n3,n4))+(Tau*Ids));
1581 #endif
1582 }
1583 else
1584 { /* no default */ }
1585 _load_static_residual2(n2,n4,Igs);
1586 #if defined(_DERIVATE)
1587 _load_static_jacobian4(n2,n4,n2,n4,Igs_Vn2_n4);
1588 #endif
1589 _load_static_residual2(n2,n3,Igd);
1590 #if defined(_DERIVATE)
1591 _load_static_jacobian4(n2,n3,n2,n3,Igd_Vn2_n3);
1592 #endif
1593 _load_static_residual2(n3,n4,Ids);
1594 #if defined(_DERIVATE)
1595 _load_static_jacobian4(n3,n4,n3,n4,Ids_Vn3_n4);
1596 _load_static_jacobian4(n3,n4,n2,n4,Ids_Vn2_n4);
1597 #endif
1598 #if defined(_DYNAMIC)
1599 _load_dynamic_residual2(n3,n4,_DDT(Qds));
1600 #if defined(_DERIVATE)
1601 _load_dynamic_jacobian4(n3,n4,n3,n4,Qds_Vn3_n4);
1602 _load_dynamic_jacobian4(n3,n4,n2,n4,Qds_Vn2_n4);
1603 #endif
1604 #endif
1605 #if defined(_DYNAMIC)
1607 #if defined(_DERIVATE)
1608 _load_dynamic_jacobian4(n2,n1,n2,n1,Qgs_Vn2_n1);
1609 _load_dynamic_jacobian4(n2,n1,n2,n3,Qgs_Vn2_n3);
1610 #endif
1611 #endif
1612 _load_static_residual2(n1,n4,((Area*BP(n1,n4))/Rin));
1613 #if defined(_DERIVATE)
1614 _load_static_jacobian4(n1,n4,n1,n4,((Area)/Rin));
1615 #endif
1616 #if defined(_DYNAMIC)
1618 #if defined(_DERIVATE)
1619 _load_dynamic_jacobian4(n2,n3,n2,n3,Qgd_Vn2_n3);
1620 _load_dynamic_jacobian4(n2,n3,n2,n1,Qgd_Vn2_n1);
1621 #endif
1622 #endif
1624 #if defined(_DERIVATE)
1625 _load_static_jacobian4(Gate,n2,Gate,n2,(1/Rg_T2));
1626 #endif
1627 _load_static_residual2(Drain,n3,((Area*BP(Drain,n3))/Rd_T2));
1628 #if defined(_DERIVATE)
1629 _load_static_jacobian4(Drain,n3,Drain,n3,((Area)/Rd_T2));
1630 #endif
1631 _load_static_residual2(n4,Source,((Area*BP(n4,Source))/Rs_T2));
1632 #if defined(_DERIVATE)
1633 _load_static_jacobian4(n4,Source,n4,Source,((Area)/Rs_T2));
1634 #endif
1635 fourkt=((4.0*1.3806503e-23)*T2);
1636 if
1637 (((LEVEL==1)||(LEVEL==2)))
1638 {
1639 {
1640 double m00_tanh(d00_tanh0,(Alpha_T2*BP(n3,n4)))
1641 #if defined(_DERIVATE)
1642 double m10_tanh(d10_tanh0,d00_tanh0,(Alpha_T2*BP(n3,n4)))
1643 #endif
1644 #if defined(_DERIVATE)
1645 gm_Vn2_n4=((2*Beta_T2))*(1+(Lambda*BP(n3,n4)))*d00_tanh0;
1646 gm_Vn3_n4=(((((2*Beta_T2)*(BP(n2,n4)-Vto_T2))*(Lambda))*d00_tanh0)+((((2*Beta_T2)*(BP(n2,n4)-Vto_T2))*(1+(Lambda*BP(n3,n4))))*(Alpha_T2)*d10_tanh0));
1647 #endif
1648 gm=((((2*Beta_T2)*(BP(n2,n4)-Vto_T2))*(1+(Lambda*BP(n3,n4))))*d00_tanh0);
1649 }
1650 if
1651 ((BP(n3,n4)<(3/Alpha)))
1652 {
1653 #if defined(_DERIVATE)
1654 An_Vn3_n4=(-(1/(BP(n2,n4)-Vto_T2)));
1655 An_Vn2_n4=(-(-BP(n3,n4)/(BP(n2,n4)-Vto_T2)/(BP(n2,n4)-Vto_T2)));
1656 #endif
1657 An=(1-(BP(n3,n4)/(BP(n2,n4)-Vto_T2)));
1658 #if defined(_DERIVATE)
1659 thermal_pwr_Vn2_n4=((((((8*1.3806503e-23)*T2)*gm_Vn2_n4)/3)*(((1+An)+(An*An))/(1+An)))+(((((8*1.3806503e-23)*T2)*gm)/3)*(((An_Vn2_n4+((An_Vn2_n4*An)+(An*An_Vn2_n4)))*(1+An)-((1+An)+(An*An))*An_Vn2_n4)/(1+An)/(1+An))))*Gdsnoi;
1660 thermal_pwr_Vn3_n4=((((((8*1.3806503e-23)*T2)*gm_Vn3_n4)/3)*(((1+An)+(An*An))/(1+An)))+(((((8*1.3806503e-23)*T2)*gm)/3)*(((An_Vn3_n4+((An_Vn3_n4*An)+(An*An_Vn3_n4)))*(1+An)-((1+An)+(An*An))*An_Vn3_n4)/(1+An)/(1+An))))*Gdsnoi;
1661 #endif
1662 thermal_pwr=((((((8*1.3806503e-23)*T2)*gm)/3)*(((1+An)+(An*An))/(1+An)))*Gdsnoi);
1663 }
1664 else
1665 {
1666 #if defined(_DERIVATE)
1667 thermal_pwr_Vn2_n4=((((8*1.3806503e-23)*T2)*gm_Vn2_n4)/3)*Gdsnoi;
1668 thermal_pwr_Vn3_n4=((((8*1.3806503e-23)*T2)*gm_Vn3_n4)/3)*Gdsnoi;
1669 #endif
1670 thermal_pwr=(((((8*1.3806503e-23)*T2)*gm)/3)*Gdsnoi);
1671 }
1672 _save_whitenoise2(n3,n4,thermal_pwr,"thermal");
1673 {
1674 double m00_pow(d00_pow0,Ids,Af)
1675 #if defined(_DERIVATE)
1676 double m10_pow(d10_pow0,d00_pow0,Ids,Af)
1677 #endif
1678 #if defined(_DERIVATE)
1679 flicker_pwr_Vn2_n4=(Kf*(d10_pow0*Ids_Vn2_n4));
1680 flicker_pwr_Vn3_n4=(Kf*(d10_pow0*Ids_Vn3_n4));
1681 #endif
1682 flicker_pwr=(Kf*d00_pow0);
1683 }
1684 _save_flickernoise2(n3,n4,flicker_pwr,1.0,"flicker");
1685 }
1686 if
1687 ((LEVEL==3))
1688 {
1689 if
1690 ((BP(n3,n4)<(3/Alpha)))
1691 {
1692 #if defined(_DERIVATE)
1693 H1_Vn3_n4=((-(-((Alpha)/3)))/(1+(B*(BP(n2,n4)-Vto_T2))));
1694 H1_Vn2_n4=(-(1-(1-((Alpha*BP(n3,n4))/3)))*(B)/(1+(B*(BP(n2,n4)-Vto_T2)))/(1+(B*(BP(n2,n4)-Vto_T2))));
1695 #endif
1696 H1=((1-(1-((Alpha*BP(n3,n4))/3)))/(1+(B*(BP(n2,n4)-Vto_T2))));
1697 {
1698 double m00_pow(d00_pow0,(BP(n2,n4)-Vto_T2),2)
1699 #if defined(_DERIVATE)
1700 double m10_pow(d10_pow0,d00_pow0,(BP(n2,n4)-Vto_T2),2)
1701 #endif
1702 #if defined(_DERIVATE)
1703 gm_Vn2_n4=(((((2*Beta_T2))*(1+(Lambda*BP(n3,n4)))*H1)+((((2*Beta_T2)*(BP(n2,n4)-Vto_T2))*(1+(Lambda*BP(n3,n4))))*H1_Vn2_n4))+((((((Beta_T2*(1+(Lambda*BP(n3,n4))))*(d10_pow0*1.0))*B*H1)+((((Beta_T2*(1+(Lambda*BP(n3,n4))))*d00_pow0)*B)*H1_Vn2_n4))*(1+(B*(BP(n2,n4)-Vto_T2)))-((((Beta_T2*(1+(Lambda*BP(n3,n4))))*d00_pow0)*B)*H1)*(B))/(1+(B*(BP(n2,n4)-Vto_T2)))/(1+(B*(BP(n2,n4)-Vto_T2)))));
1704 gm_Vn3_n4=((((((2*Beta_T2)*(BP(n2,n4)-Vto_T2))*(Lambda))*H1)+((((2*Beta_T2)*(BP(n2,n4)-Vto_T2))*(1+(Lambda*BP(n3,n4))))*H1_Vn3_n4))+((((Beta_T2*(Lambda))*d00_pow0*B*H1)+((((Beta_T2*(1+(Lambda*BP(n3,n4))))*d00_pow0)*B)*H1_Vn3_n4))/(1+(B*(BP(n2,n4)-Vto_T2)))));
1705 #endif
1706 gm=(((((2*Beta_T2)*(BP(n2,n4)-Vto_T2))*(1+(Lambda*BP(n3,n4))))*H1)+(((((Beta_T2*(1+(Lambda*BP(n3,n4))))*d00_pow0)*B)*H1)/(1+(B*(BP(n2,n4)-Vto_T2)))));
1707 }
1708 #if defined(_DERIVATE)
1709 An_Vn3_n4=(-(1/(BP(n2,n4)-Vto_T2)));
1710 An_Vn2_n4=(-(-BP(n3,n4)/(BP(n2,n4)-Vto_T2)/(BP(n2,n4)-Vto_T2)));
1711 #endif
1712 An=(1-(BP(n3,n4)/(BP(n2,n4)-Vto_T2)));
1713 #if defined(_DERIVATE)
1714 thermal_pwr_Vn2_n4=((((((8*1.3806503e-23)*T2)*gm_Vn2_n4)/3)*(((1+An)+(An*An))/(1+An)))+(((((8*1.3806503e-23)*T2)*gm)/3)*(((An_Vn2_n4+((An_Vn2_n4*An)+(An*An_Vn2_n4)))*(1+An)-((1+An)+(An*An))*An_Vn2_n4)/(1+An)/(1+An))))*Gdsnoi;
1715 thermal_pwr_Vn3_n4=((((((8*1.3806503e-23)*T2)*gm_Vn3_n4)/3)*(((1+An)+(An*An))/(1+An)))+(((((8*1.3806503e-23)*T2)*gm)/3)*(((An_Vn3_n4+((An_Vn3_n4*An)+(An*An_Vn3_n4)))*(1+An)-((1+An)+(An*An))*An_Vn3_n4)/(1+An)/(1+An))))*Gdsnoi;
1716 #endif
1717 thermal_pwr=((((((8*1.3806503e-23)*T2)*gm)/3)*(((1+An)+(An*An))/(1+An)))*Gdsnoi);
1718 }
1719 else
1720 {
1721 {
1722 double m00_pow(d00_pow0,(BP(n2,n4)-Vto_T2),2)
1723 double m00_pow(d00_pow1,(1+(B*(BP(n2,n4)-Vto_T2))),2)
1724 #if defined(_DERIVATE)
1725 double m10_pow(d10_pow0,d00_pow0,(BP(n2,n4)-Vto_T2),2)
1726 double m10_pow(d10_pow1,d00_pow1,(1+(B*(BP(n2,n4)-Vto_T2))),2)
1727 #endif
1728 #if defined(_DERIVATE)
1729 gm_Vn2_n4=(((((2*Beta_T2))*(1+(Lambda*BP(n3,n4)))*(1+(B*(BP(n2,n4)-Vto_T2)))-(((2*Beta_T2)*(BP(n2,n4)-Vto_T2))*(1+(Lambda*BP(n3,n4))))*(B))/(1+(B*(BP(n2,n4)-Vto_T2)))/(1+(B*(BP(n2,n4)-Vto_T2))))+((((Beta_T2*(1+(Lambda*BP(n3,n4))))*(d10_pow0*1.0))*B*d00_pow1-(((Beta_T2*(1+(Lambda*BP(n3,n4))))*d00_pow0)*B)*(d10_pow1*(B)))/d00_pow1/d00_pow1));
1730 gm_Vn3_n4=(((((2*Beta_T2)*(BP(n2,n4)-Vto_T2))*(Lambda))/(1+(B*(BP(n2,n4)-Vto_T2))))+((Beta_T2*(Lambda))*d00_pow0*B/d00_pow1));
1731 #endif
1732 gm=(((((2*Beta_T2)*(BP(n2,n4)-Vto_T2))*(1+(Lambda*BP(n3,n4))))/(1+(B*(BP(n2,n4)-Vto_T2))))+((((Beta_T2*(1+(Lambda*BP(n3,n4))))*d00_pow0)*B)/d00_pow1));
1733 }
1734 #if defined(_DERIVATE)
1735 thermal_pwr_Vn2_n4=((((8*1.3806503e-23)*T2)*gm_Vn2_n4)/3)*Gdsnoi;
1736 thermal_pwr_Vn3_n4=((((8*1.3806503e-23)*T2)*gm_Vn3_n4)/3)*Gdsnoi;
1737 #endif
1738 thermal_pwr=(((((8*1.3806503e-23)*T2)*gm)/3)*Gdsnoi);
1739 }
1740 _save_whitenoise2(n3,n4,thermal_pwr,"thermal");
1741 {
1742 double m00_pow(d00_pow0,Ids,Af)
1743 #if defined(_DERIVATE)
1744 double m10_pow(d10_pow0,d00_pow0,Ids,Af)
1745 #endif
1746 #if defined(_DERIVATE)
1747 flicker_pwr_Vn2_n4=(Kf*(d10_pow0*Ids_Vn2_n4));
1748 flicker_pwr_Vn3_n4=(Kf*(d10_pow0*Ids_Vn3_n4));
1749 #endif
1750 flicker_pwr=(Kf*d00_pow0);
1751 }
1752 _save_flickernoise2(n3,n4,flicker_pwr,1.0,"flicker");
1753 }
1754 if
1755 ((LEVEL==4))
1756 {
1757 if
1758 ((BP(n3,n4)<(3/Alpha)))
1759 {
1760 {
1761 double m00_pow(d00_pow0,(BP(n2,n4)-Vto_T2),Qp)
1762 double m00_pow(d00_pow1,(1-((Alpha*BP(n3,n4))/3)),3)
1763 #if defined(_DERIVATE)
1764 double m10_pow(d10_pow0,d00_pow0,(BP(n2,n4)-Vto_T2),Qp)
1765 double m10_pow(d10_pow1,d00_pow1,(1-((Alpha*BP(n3,n4))/3)),3)
1766 #endif
1767 #if defined(_DERIVATE)
1768 Ids1_Vn2_n4=(Beta_T2*(d10_pow0*1.0))*(1-d00_pow1);
1769 Ids1_Vn3_n4=((Beta_T2*d00_pow0)*(-(d10_pow1*(-((Alpha)/3)))));
1770 #endif
1771 Ids1=((Beta_T2*d00_pow0)*(1-d00_pow1));
1772 }
1773 {
1774 double m00_pow(d00_pow0,(BP(n2,n4)-Vto_T2),(Qp-1))
1775 double m00_pow(d00_pow1,((Alpha*BP(n3,n4))/3),3)
1776 #if defined(_DERIVATE)
1777 double m10_pow(d10_pow0,d00_pow0,(BP(n2,n4)-Vto_T2),(Qp-1))
1778 double m10_pow(d10_pow1,d00_pow1,((Alpha*BP(n3,n4))/3),3)
1779 #endif
1780 #if defined(_DERIVATE)
1781 gm1_Vn2_n4=((Qp*Beta_T2)*(d10_pow0*1.0))*(1-(1-d00_pow1));
1782 gm1_Vn3_n4=(((Qp*Beta_T2)*d00_pow0)*(-(-(d10_pow1*((Alpha)/3)))));
1783 #endif
1784 gm1=(((Qp*Beta_T2)*d00_pow0)*(1-(1-d00_pow1)));
1785 }
1786 #if defined(_DERIVATE)
1787 gm_Vn2_n4=((((gm1_Vn2_n4*(1+(Lambda*BP(n3,n4)))*(1+((Delta*BP(n2,n4))*Ids1))-(gm1*(1+(Lambda*BP(n3,n4))))*(((Delta)*Ids1)+((Delta*BP(n2,n4))*Ids1_Vn2_n4)))/(1+((Delta*BP(n2,n4))*Ids1))/(1+((Delta*BP(n2,n4))*Ids1)))*(1+(((Delta*BP(n3,n4))*Ids1)/(1+((Delta*BP(n3,n4))*Ids1)))))+(((gm1*(1+(Lambda*BP(n3,n4))))/(1+((Delta*BP(n2,n4))*Ids1)))*((((Delta*BP(n3,n4))*Ids1_Vn2_n4)*(1+((Delta*BP(n3,n4))*Ids1))-((Delta*BP(n3,n4))*Ids1)*((Delta*BP(n3,n4))*Ids1_Vn2_n4))/(1+((Delta*BP(n3,n4))*Ids1))/(1+((Delta*BP(n3,n4))*Ids1)))));
1788 gm_Vn3_n4=((((((gm1_Vn3_n4*(1+(Lambda*BP(n3,n4))))+(gm1*(Lambda)))*(1+((Delta*BP(n2,n4))*Ids1))-(gm1*(1+(Lambda*BP(n3,n4))))*((Delta*BP(n2,n4))*Ids1_Vn3_n4))/(1+((Delta*BP(n2,n4))*Ids1))/(1+((Delta*BP(n2,n4))*Ids1)))*(1+(((Delta*BP(n3,n4))*Ids1)/(1+((Delta*BP(n3,n4))*Ids1)))))+(((gm1*(1+(Lambda*BP(n3,n4))))/(1+((Delta*BP(n2,n4))*Ids1)))*(((((Delta)*Ids1)+((Delta*BP(n3,n4))*Ids1_Vn3_n4))*(1+((Delta*BP(n3,n4))*Ids1))-((Delta*BP(n3,n4))*Ids1)*(((Delta)*Ids1)+((Delta*BP(n3,n4))*Ids1_Vn3_n4)))/(1+((Delta*BP(n3,n4))*Ids1))/(1+((Delta*BP(n3,n4))*Ids1)))));
1789 #endif
1790 gm=(((gm1*(1+(Lambda*BP(n3,n4))))/(1+((Delta*BP(n2,n4))*Ids1)))*(1+(((Delta*BP(n3,n4))*Ids1)/(1+((Delta*BP(n3,n4))*Ids1)))));
1791 #if defined(_DERIVATE)
1792 An_Vn3_n4=(-(1/(BP(n2,n4)-Vto_T2)));
1793 An_Vn2_n4=(-(-BP(n3,n4)/(BP(n2,n4)-Vto_T2)/(BP(n2,n4)-Vto_T2)));
1794 #endif
1795 An=(1-(BP(n3,n4)/(BP(n2,n4)-Vto_T2)));
1796 #if defined(_DERIVATE)
1797 thermal_pwr_Vn2_n4=((((((8*1.3806503e-23)*T2)*gm_Vn2_n4)/3)*(((1+An)+(An*An))/(1+An)))+(((((8*1.3806503e-23)*T2)*gm)/3)*(((An_Vn2_n4+((An_Vn2_n4*An)+(An*An_Vn2_n4)))*(1+An)-((1+An)+(An*An))*An_Vn2_n4)/(1+An)/(1+An))))*Gdsnoi;
1798 thermal_pwr_Vn3_n4=((((((8*1.3806503e-23)*T2)*gm_Vn3_n4)/3)*(((1+An)+(An*An))/(1+An)))+(((((8*1.3806503e-23)*T2)*gm)/3)*(((An_Vn3_n4+((An_Vn3_n4*An)+(An*An_Vn3_n4)))*(1+An)-((1+An)+(An*An))*An_Vn3_n4)/(1+An)/(1+An))))*Gdsnoi;
1799 #endif
1800 thermal_pwr=((((((8*1.3806503e-23)*T2)*gm)/3)*(((1+An)+(An*An))/(1+An)))*Gdsnoi);
1801 }
1802 else
1803 {
1804 {
1805 double m00_pow(d00_pow0,(BP(n2,n4)-Vto_T2),Qp)
1806 #if defined(_DERIVATE)
1807 double m10_pow(d10_pow0,d00_pow0,(BP(n2,n4)-Vto_T2),Qp)
1808 #endif
1809 #if defined(_DERIVATE)
1810 Ids1_Vn2_n4=(Beta_T2*(d10_pow0*1.0));
1811 Ids1_Vn3_n4=0.0;
1812 #endif
1813 Ids1=(Beta_T2*d00_pow0);
1814 }
1815 {
1816 double m00_pow(d00_pow0,(BP(n2,n4)-Vto_T2),(Qp-1))
1817 #if defined(_DERIVATE)
1818 double m10_pow(d10_pow0,d00_pow0,(BP(n2,n4)-Vto_T2),(Qp-1))
1819 #endif
1820 #if defined(_DERIVATE)
1821 gm1_Vn2_n4=((Qp*Beta_T2)*(d10_pow0*1.0));
1822 gm1_Vn3_n4=0.0;
1823 #endif
1824 gm1=((Qp*Beta_T2)*d00_pow0);
1825 }
1826 #if defined(_DERIVATE)
1827 gm_Vn2_n4=((((gm1_Vn2_n4*(1+(Lambda*BP(n3,n4)))*(1+((Delta*BP(n2,n4))*Ids1))-(gm1*(1+(Lambda*BP(n3,n4))))*(((Delta)*Ids1)+((Delta*BP(n2,n4))*Ids1_Vn2_n4)))/(1+((Delta*BP(n2,n4))*Ids1))/(1+((Delta*BP(n2,n4))*Ids1)))*(1+(((Delta*BP(n3,n4))*Ids1)/(1+((Delta*BP(n3,n4))*Ids1)))))+(((gm1*(1+(Lambda*BP(n3,n4))))/(1+((Delta*BP(n2,n4))*Ids1)))*((((Delta*BP(n3,n4))*Ids1_Vn2_n4)*(1+((Delta*BP(n3,n4))*Ids1))-((Delta*BP(n3,n4))*Ids1)*((Delta*BP(n3,n4))*Ids1_Vn2_n4))/(1+((Delta*BP(n3,n4))*Ids1))/(1+((Delta*BP(n3,n4))*Ids1)))));
1828 gm_Vn3_n4=((((((gm1_Vn3_n4*(1+(Lambda*BP(n3,n4))))+(gm1*(Lambda)))*(1+((Delta*BP(n2,n4))*Ids1))-(gm1*(1+(Lambda*BP(n3,n4))))*((Delta*BP(n2,n4))*Ids1_Vn3_n4))/(1+((Delta*BP(n2,n4))*Ids1))/(1+((Delta*BP(n2,n4))*Ids1)))*(1+(((Delta*BP(n3,n4))*Ids1)/(1+((Delta*BP(n3,n4))*Ids1)))))+(((gm1*(1+(Lambda*BP(n3,n4))))/(1+((Delta*BP(n2,n4))*Ids1)))*(((((Delta)*Ids1)+((Delta*BP(n3,n4))*Ids1_Vn3_n4))*(1+((Delta*BP(n3,n4))*Ids1))-((Delta*BP(n3,n4))*Ids1)*(((Delta)*Ids1)+((Delta*BP(n3,n4))*Ids1_Vn3_n4)))/(1+((Delta*BP(n3,n4))*Ids1))/(1+((Delta*BP(n3,n4))*Ids1)))));
1829 #endif
1830 gm=(((gm1*(1+(Lambda*BP(n3,n4))))/(1+((Delta*BP(n2,n4))*Ids1)))*(1+(((Delta*BP(n3,n4))*Ids1)/(1+((Delta*BP(n3,n4))*Ids1)))));
1831 #if defined(_DERIVATE)
1832 thermal_pwr_Vn2_n4=((((8*1.3806503e-23)*T2)*gm_Vn2_n4)/3)*Gdsnoi;
1833 thermal_pwr_Vn3_n4=((((8*1.3806503e-23)*T2)*gm_Vn3_n4)/3)*Gdsnoi;
1834 #endif
1835 thermal_pwr=(((((8*1.3806503e-23)*T2)*gm)/3)*Gdsnoi);
1836 }
1837 _save_whitenoise2(n3,n4,thermal_pwr,"thermal");
1838 {
1839 double m00_pow(d00_pow0,Ids,Af)
1840 #if defined(_DERIVATE)
1841 double m10_pow(d10_pow0,d00_pow0,Ids,Af)
1842 #endif
1843 #if defined(_DERIVATE)
1844 flicker_pwr_Vn2_n4=(Kf*(d10_pow0*Ids_Vn2_n4));
1845 flicker_pwr_Vn3_n4=(Kf*(d10_pow0*Ids_Vn3_n4));
1846 #endif
1847 flicker_pwr=(Kf*d00_pow0);
1848 }
1849 _save_flickernoise2(n3,n4,flicker_pwr,1.0,"flicker");
1850 }
1851 if
1852 ((LEVEL==5))
1853 {
1854 if
1855 ((BP(n3,n4)<(3/Alpha)))
1856 {
1857 #if defined(_DERIVATE)
1858 Nst_Vn3_n4=(Nd);
1859 #endif
1860 Nst=(Ng+(Nd*BP(n3,n4)));
1861 if
1862 ((Nst<1.0))
1863 {
1864 #if defined(_DERIVATE)
1865 Nst_Vn3_n4=0.0;
1866 #endif
1867 Nst=1.0;
1868 }
1869 #if defined(_DERIVATE)
1870 Vst_Vn3_n4=Nst_Vn3_n4*Vt_T2;
1871 #endif
1872 Vst=(Nst*Vt_T2);
1873 {
1874 double m00_exp(d00_exp0,(((BP(n2,n4)-Vto_T2)+(Gamma_T2*BP(n3,n4)))/(Qp*Vst)))
1875 double m00_logE(d00_logE1,(d00_exp0+1))
1876 #if defined(_DERIVATE)
1877 #define d10_exp0 d00_exp0
1878 double m10_logE(d10_logE1,d00_logE1,(d00_exp0+1))
1879 #endif
1880 #if defined(_DERIVATE)
1881 Vg_Vn3_n4=(((Qp*Vst_Vn3_n4)*d00_logE1)+((Qp*Vst)*(((Gamma_T2)*(Qp*Vst)-((BP(n2,n4)-Vto_T2)+(Gamma_T2*BP(n3,n4)))*(Qp*Vst_Vn3_n4))/(Qp*Vst)/(Qp*Vst))*d10_exp0*d10_logE1));
1882 Vg_Vn2_n4=((Qp*Vst)*(1/(Qp*Vst))*d10_exp0*d10_logE1);
1883 #endif
1884 Vg=((Qp*Vst)*d00_logE1);
1885 }
1886 #if defined(_DERIVATE)
1887 Al_Vn3_n4=(Alpha_T2);
1888 #endif
1889 Al=(Alpha_T2*BP(n3,n4));
1890 {
1891 double m00_sqrt(d00_sqrt0,(1.0+(Al*Al)))
1892 #if defined(_DERIVATE)
1893 double m10_sqrt(d10_sqrt0,d00_sqrt0,(1.0+(Al*Al)))
1894 #endif
1895 #if defined(_DERIVATE)
1896 Fd_Vn3_n4=((Al_Vn3_n4*d00_sqrt0-Al*((Al_Vn3_n4*Al)+(Al*Al_Vn3_n4))*d10_sqrt0)/d00_sqrt0/d00_sqrt0);
1897 #endif
1898 Fd=(Al/d00_sqrt0);
1899 }
1900 {
1901 double m00_pow(d00_pow0,Vg,Qp)
1902 #if defined(_DERIVATE)
1903 double m10_pow(d10_pow0,d00_pow0,Vg,Qp)
1904 #endif
1905 #if defined(_DERIVATE)
1906 Ids1_Vn2_n4=(Beta_T2*(d10_pow0*Vg_Vn2_n4))*Fd;
1907 Ids1_Vn3_n4=(((Beta_T2*(d10_pow0*Vg_Vn3_n4))*Fd)+((Beta_T2*d00_pow0)*Fd_Vn3_n4));
1908 #endif
1909 Ids1=((Beta_T2*d00_pow0)*Fd);
1910 }
1911 {
1912 double m00_exp(d00_exp0,(-(((BP(n2,n4)-Vto_T2)+(Delta*BP(n3,n4)))/(Qp*Vst))))
1913 #if defined(_DERIVATE)
1914 #define d10_exp0 d00_exp0
1915 #endif
1916 #if defined(_DERIVATE)
1917 gm1_Vn2_n4=((((Ids1_Vn2_n4*Vg-Ids1*Vg_Vn2_n4)/Vg/Vg)*Qp*(d00_exp0+1)-((Ids1/Vg)*Qp)*(-(1/(Qp*Vst)))*d10_exp0)/(d00_exp0+1)/(d00_exp0+1));
1918 gm1_Vn3_n4=((((Ids1_Vn3_n4*Vg-Ids1*Vg_Vn3_n4)/Vg/Vg)*Qp*(d00_exp0+1)-((Ids1/Vg)*Qp)*(-(((Delta)*(Qp*Vst)-((BP(n2,n4)-Vto_T2)+(Delta*BP(n3,n4)))*(Qp*Vst_Vn3_n4))/(Qp*Vst)/(Qp*Vst)))*d10_exp0)/(d00_exp0+1)/(d00_exp0+1));
1919 #endif
1920 gm1=(((Ids1/Vg)*Qp)/(d00_exp0+1));
1921 }
1922 {
1923 double m00_pow(d00_pow0,(1+((Delta*BP(n3,n4))*Ids1)),2)
1924 #if defined(_DERIVATE)
1925 double m10_pow(d10_pow0,d00_pow0,(1+((Delta*BP(n3,n4))*Ids1)),2)
1926 #endif
1927 #if defined(_DERIVATE)
1928 gm_Vn2_n4=((gm1_Vn2_n4*d00_pow0-gm1*(d10_pow0*((Delta*BP(n3,n4))*Ids1_Vn2_n4)))/d00_pow0/d00_pow0);
1929 gm_Vn3_n4=((gm1_Vn3_n4*d00_pow0-gm1*(d10_pow0*(((Delta)*Ids1)+((Delta*BP(n3,n4))*Ids1_Vn3_n4))))/d00_pow0/d00_pow0);
1930 #endif
1931 gm=(gm1/d00_pow0);
1932 }
1933 #if defined(_DERIVATE)
1934 An_Vn3_n4=(-(1/(BP(n2,n4)-Vto_T2)));
1935 An_Vn2_n4=(-(-BP(n3,n4)/(BP(n2,n4)-Vto_T2)/(BP(n2,n4)-Vto_T2)));
1936 #endif
1937 An=(1-(BP(n3,n4)/(BP(n2,n4)-Vto_T2)));
1938 #if defined(_DERIVATE)
1939 thermal_pwr_Vn2_n4=((((((8*1.3806503e-23)*T2)*gm_Vn2_n4)/3)*(((1+An)+(An*An))/(1+An)))+(((((8*1.3806503e-23)*T2)*gm)/3)*(((An_Vn2_n4+((An_Vn2_n4*An)+(An*An_Vn2_n4)))*(1+An)-((1+An)+(An*An))*An_Vn2_n4)/(1+An)/(1+An))))*Gdsnoi;
1940 thermal_pwr_Vn3_n4=((((((8*1.3806503e-23)*T2)*gm_Vn3_n4)/3)*(((1+An)+(An*An))/(1+An)))+(((((8*1.3806503e-23)*T2)*gm)/3)*(((An_Vn3_n4+((An_Vn3_n4*An)+(An*An_Vn3_n4)))*(1+An)-((1+An)+(An*An))*An_Vn3_n4)/(1+An)/(1+An))))*Gdsnoi;
1941 #endif
1942 thermal_pwr=((((((8*1.3806503e-23)*T2)*gm)/3)*(((1+An)+(An*An))/(1+An)))*Gdsnoi);
1943 }
1944 else
1945 {
1946 #if defined(_DERIVATE)
1947 Nst_Vn3_n4=(Nd);
1948 #endif
1949 Nst=(Ng+(Nd*BP(n3,n4)));
1950 if
1951 ((Nst<1.0))
1952 {
1953 #if defined(_DERIVATE)
1954 Nst_Vn3_n4=0.0;
1955 #endif
1956 Nst=1.0;
1957 }
1958 #if defined(_DERIVATE)
1959 Vst_Vn3_n4=Nst_Vn3_n4*Vt_T2;
1960 #endif
1961 Vst=(Nst*Vt_T2);
1962 {
1963 double m00_exp(d00_exp0,(((BP(n2,n4)-Vto_T2)+(Gamma_T2*BP(n3,n4)))/(Qp*Vst)))
1964 double m00_logE(d00_logE1,(d00_exp0+1))
1965 #if defined(_DERIVATE)
1966 #define d10_exp0 d00_exp0
1967 double m10_logE(d10_logE1,d00_logE1,(d00_exp0+1))
1968 #endif
1969 #if defined(_DERIVATE)
1970 Vg_Vn3_n4=(((Qp*Vst_Vn3_n4)*d00_logE1)+((Qp*Vst)*(((Gamma_T2)*(Qp*Vst)-((BP(n2,n4)-Vto_T2)+(Gamma_T2*BP(n3,n4)))*(Qp*Vst_Vn3_n4))/(Qp*Vst)/(Qp*Vst))*d10_exp0*d10_logE1));
1971 Vg_Vn2_n4=((Qp*Vst)*(1/(Qp*Vst))*d10_exp0*d10_logE1);
1972 #endif
1973 Vg=((Qp*Vst)*d00_logE1);
1974 }
1975 #if defined(_DERIVATE)
1976 Al_Vn3_n4=(Alpha_T2);
1977 #endif
1978 Al=(Alpha_T2*BP(n3,n4));
1979 {
1980 double m00_sqrt(d00_sqrt0,(1.0+(Al*Al)))
1981 #if defined(_DERIVATE)
1982 double m10_sqrt(d10_sqrt0,d00_sqrt0,(1.0+(Al*Al)))
1983 #endif
1984 #if defined(_DERIVATE)
1985 Fd_Vn3_n4=((Al_Vn3_n4*d00_sqrt0-Al*((Al_Vn3_n4*Al)+(Al*Al_Vn3_n4))*d10_sqrt0)/d00_sqrt0/d00_sqrt0);
1986 #endif
1987 Fd=(Al/d00_sqrt0);
1988 }
1989 {
1990 double m00_pow(d00_pow0,Vg,Qp)
1991 #if defined(_DERIVATE)
1992 double m10_pow(d10_pow0,d00_pow0,Vg,Qp)
1993 #endif
1994 #if defined(_DERIVATE)
1995 Ids1_Vn2_n4=(Beta_T2*(d10_pow0*Vg_Vn2_n4))*Fd;
1996 Ids1_Vn3_n4=(((Beta_T2*(d10_pow0*Vg_Vn3_n4))*Fd)+((Beta_T2*d00_pow0)*Fd_Vn3_n4));
1997 #endif
1998 Ids1=((Beta_T2*d00_pow0)*Fd);
1999 }
2000 {
2001 double m00_exp(d00_exp0,(-(((BP(n2,n4)-Vto_T2)+(Delta*BP(n3,n4)))/(Qp*Vst))))
2002 #if defined(_DERIVATE)
2003 #define d10_exp0 d00_exp0
2004 #endif
2005 #if defined(_DERIVATE)
2006 gm1_Vn2_n4=((((Ids1_Vn2_n4*Vg-Ids1*Vg_Vn2_n4)/Vg/Vg)*Qp*(d00_exp0+1)-((Ids1/Vg)*Qp)*(-(1/(Qp*Vst)))*d10_exp0)/(d00_exp0+1)/(d00_exp0+1));
2007 gm1_Vn3_n4=((((Ids1_Vn3_n4*Vg-Ids1*Vg_Vn3_n4)/Vg/Vg)*Qp*(d00_exp0+1)-((Ids1/Vg)*Qp)*(-(((Delta)*(Qp*Vst)-((BP(n2,n4)-Vto_T2)+(Delta*BP(n3,n4)))*(Qp*Vst_Vn3_n4))/(Qp*Vst)/(Qp*Vst)))*d10_exp0)/(d00_exp0+1)/(d00_exp0+1));
2008 #endif
2009 gm1=(((Ids1/Vg)*Qp)/(d00_exp0+1));
2010 }
2011 {
2012 double m00_pow(d00_pow0,(1+((Delta*BP(n3,n4))*Ids1)),2)
2013 #if defined(_DERIVATE)
2014 double m10_pow(d10_pow0,d00_pow0,(1+((Delta*BP(n3,n4))*Ids1)),2)
2015 #endif
2016 #if defined(_DERIVATE)
2017 gm_Vn2_n4=((gm1_Vn2_n4*d00_pow0-gm1*(d10_pow0*((Delta*BP(n3,n4))*Ids1_Vn2_n4)))/d00_pow0/d00_pow0);
2018 gm_Vn3_n4=((gm1_Vn3_n4*d00_pow0-gm1*(d10_pow0*(((Delta)*Ids1)+((Delta*BP(n3,n4))*Ids1_Vn3_n4))))/d00_pow0/d00_pow0);
2019 #endif
2020 gm=(gm1/d00_pow0);
2021 }
2022 #if defined(_DERIVATE)
2023 thermal_pwr_Vn2_n4=((((8*1.3806503e-23)*T2)*gm_Vn2_n4)/3)*Gdsnoi;
2024 thermal_pwr_Vn3_n4=((((8*1.3806503e-23)*T2)*gm_Vn3_n4)/3)*Gdsnoi;
2025 #endif
2026 thermal_pwr=(((((8*1.3806503e-23)*T2)*gm)/3)*Gdsnoi);
2027 }
2028 _save_whitenoise2(n3,n4,thermal_pwr,"thermal");
2029 {
2030 double m00_pow(d00_pow0,Ids,Af)
2031 #if defined(_DERIVATE)
2032 double m10_pow(d10_pow0,d00_pow0,Ids,Af)
2033 #endif
2034 #if defined(_DERIVATE)
2035 flicker_pwr_Vn2_n4=(Kf*(d10_pow0*Ids_Vn2_n4));
2036 flicker_pwr_Vn3_n4=(Kf*(d10_pow0*Ids_Vn3_n4));
2037 #endif
2038 flicker_pwr=(Kf*d00_pow0);
2039 }
2040 _save_flickernoise2(n3,n4,flicker_pwr,1.0,"flicker");
2041 }
2042 _save_whitenoise2(Drain,n3,((Area*fourkt)/Rd_T2),"thermal");
2043 _save_whitenoise2(Gate,n2,((Area*fourkt)/Rg_T2),"thermal");
2044 _save_whitenoise2(n4,Source,((Area*fourkt)/Rs_T2),"thermal");
2045 
2046 /* ------------------ end of verilog analog equations --------------------- */
2047 
2048 /* ------------------ evaluate verilog noise equations -------------------- */
2049 
2050 /* ------------------- end of verilog noise equations --------------------- */
2051 }
2052 
2053 /* Perform DC iteration. */
2054 void MESFET::calcDC (void)
2055 {
2056  // evaluate Verilog code
2057  initVerilog ();
2058  calcVerilog ();
2059 
2060  // fill right hand side and static jacobian
2061  for (int i1 = 0; i1 < 7; i1++) {
2062  setI (i1, _rhs[i1]);
2063  for (int i2 = 0; i2 < 7; i2++) {
2064  setY (i1, i2, _jstat[i1][i2]);
2065  }
2066  }
2067 }
2068 
2069 /* Save operating points. */
2071 {
2072  // save global instance operating points
2073 }
2074 
2075 /* Load operating points. */
2077 {
2078 }
2079 
2080 /* Calculate operating points. */
2082 {
2083 }
2084 
2085 /* Initialization of AC analysis. */
2086 void MESFET::initAC (void)
2087 {
2088  allocMatrixMNA ();
2089 }
2090 
2091 /* Perform AC calculations. */
2092 void MESFET::calcAC (nr_double_t frequency)
2093 {
2094  setMatrixY (calcMatrixY (frequency));
2095 }
2096 
2097 /* Compute Y-matrix for AC analysis. */
2098 matrix MESFET::calcMatrixY (nr_double_t frequency)
2099 {
2100  _freq = frequency;
2102  matrix y (7);
2103 
2104  for (int i1 = 0; i1 < 7; i1++) {
2105  for (int i2 = 0; i2 < 7; i2++) {
2106  y (i1,i2) = rect (_jstat[i1][i2], _jdyna[i1][i2] * 2 * M_PI * _freq);
2107  }
2108  }
2109 
2110  return y;
2111 }
2112 
2113 /* Initialization of S-parameter analysis. */
2114 void MESFET::initSP (void)
2115 {
2116  allocMatrixS ();
2117 }
2118 
2119 /* Perform S-parameter calculations. */
2120 void MESFET::calcSP (nr_double_t frequency)
2121 {
2122  setMatrixS (ytos (calcMatrixY (frequency)));
2123 }
2124 
2125 /* Initialization of transient analysis. */
2126 void MESFET::initTR (void)
2127 {
2128  setStates (2 * 7 * 7);
2129  initDC ();
2130 }
2131 
2132 /* Perform transient analysis iteration step. */
2133 void MESFET::calcTR (nr_double_t)
2134 {
2135  doHB = 0;
2136  doAC = 1;
2137  doTR = 1;
2138  calcDC ();
2139 
2140  int i1, i2, i3, i4, state;
2141 
2142  // 2-node charge integrations
2143  for (i1 = 0; i1 < 7; i1++) {
2144  for (i2 = 0; i2 < 7; i2++) {
2145  state = 2 * (i2 + 7 * i1);
2146  if (i1 != i2)
2147  if (_charges[i1][i2] != 0.0)
2148  transientCapacitanceQ (state, i1, i2, _charges[i1][i2]);
2149  } }
2150 
2151  // 1-node charge integrations
2152  for (i1 = 0; i1 < 7; i1++) {
2153  state = 2 * (i1 + 7 * i1);
2154  if (_charges[i1][i1] != 0.0)
2155  transientCapacitanceQ (state, i1, _charges[i1][i1]);
2156  }
2157 
2158  // charge: 2-node, voltage: 2-node
2159  for (i1 = 0; i1 < 7; i1++) {
2160  for (i2 = 0; i2 < 7; i2++) {
2161  if (i1 != i2)
2162  for (i3 = 0; i3 < 7; i3++) {
2163  for (i4 = 0; i4 < 7; i4++) {
2164  if (i3 != i4)
2165  if (_caps[i1][i2][i3][i4] != 0.0)
2166  transientCapacitanceC (i1, i2, i3, i4, _caps[i1][i2][i3][i4], BP(i3,i4));
2167  } } } }
2168 
2169  // charge: 2-node, voltage: 1-node
2170  for (i1 = 0; i1 < 7; i1++) {
2171  for (i2 = 0; i2 < 7; i2++) {
2172  if (i1 != i2)
2173  for (i3 = 0; i3 < 7; i3++) {
2174  if (_caps[i1][i2][i3][i3] != 0.0)
2175  transientCapacitanceC2Q (i1, i2, i3, _caps[i1][i2][i3][i3], NP(i3));
2176  } } }
2177 
2178  // charge: 1-node, voltage: 2-node
2179  for (i1 = 0; i1 < 7; i1++) {
2180  for (i3 = 0; i3 < 7; i3++) {
2181  for (i4 = 0; i4 < 7; i4++) {
2182  if (i3 != i4)
2183  if (_caps[i1][i1][i3][i4] != 0.0)
2184  transientCapacitanceC2V (i1, i3, i4, _caps[i1][i1][i3][i4], BP(i3,i4));
2185  } } }
2186 
2187  // charge: 1-node, voltage: 1-node
2188  for (i1 = 0; i1 < 7; i1++) {
2189  for (i3 = 0; i3 < 7; i3++) {
2190  if (_caps[i1][i1][i3][i3] != 0.0)
2191  transientCapacitanceC (i1, i3, _caps[i1][i1][i3][i3], NP(i3));
2192  } }
2193 }
2194 
2195 /* Compute Cy-matrix for AC noise analysis. */
2196 matrix MESFET::calcMatrixCy (nr_double_t frequency)
2197 {
2198  _freq = frequency;
2199  matrix cy (7);
2200 
2201  _load_flickernoise2 (n3,n4,_flicker_pwr[n3][n4],_flicker_exp[n3][n4]);
2202  _load_whitenoise2 (n4,Source,_white_pwr[n4][Source]);
2203  _load_whitenoise2 (Drain,n3,_white_pwr[Drain][n3]);
2204  _load_whitenoise2 (Gate,n2,_white_pwr[Gate][n2]);
2205  _load_whitenoise2 (n3,n4,_white_pwr[n3][n4]);
2206 
2207  return cy;
2208 }
2209 
2210 /* Perform AC noise computations. */
2211 void MESFET::calcNoiseAC (nr_double_t frequency)
2212 {
2213  setMatrixN (calcMatrixCy (frequency));
2214 }
2215 
2216 /* Perform S-parameter noise computations. */
2217 void MESFET::calcNoiseSP (nr_double_t frequency)
2218 {
2219  setMatrixN (cytocs (calcMatrixCy (frequency) * z0, getMatrixS ()));
2220 }
2221 
2222 /* Initialization of HB analysis. */
2223 void MESFET::initHB (int)
2224 {
2225  initDC ();
2226  allocMatrixHB ();
2227 }
2228 
2229 /* Perform HB analysis. */
2230 void MESFET::calcHB (int)
2231 {
2232  doHB = 1;
2233  doAC = 1;
2234  doTR = 0;
2235 
2236  // jacobian dI/dV and currents get filled
2237  calcDC ();
2239 
2240  // fill in HB matrices
2241  for (int i1 = 0; i1 < 7; i1++) {
2242  setQ (i1, _qhs[i1]); // charges
2243  setCV (i1, _chs[i1]); // jacobian dQ/dV * V
2244  setGV (i1, _ghs[i1]); // jacobian dI/dV * V
2245  for (int i2 = 0; i2 < 7; i2++) {
2246  setQV (i1, i2, _jdyna[i1][i2]); // jacobian dQ/dV
2247  }
2248  }
2249 }
2250 
2251 #include "MESFET.defs.h"