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