1 /***********************************************************************
2
3 HiSIM (Hiroshima University STARC IGFET Model)
4 Copyright (C) 2014 Hiroshima University & STARC
5
6 MODEL NAME : HiSIM_HV
7 ( VERSION : 2 SUBVERSION : 2 REVISION : 0 )
8 Model Parameter 'VERSION' : 2.20
9 FILE : hsmhveval.c
10
11 DATE : 2014.6.11
12
13 released by
14 Hiroshima University &
15 Semiconductor Technology Academic Research Center (STARC)
16 ***********************************************************************/
17
18 /**********************************************************************
19
20 The following source code, and all copyrights, trade secrets or other
21 intellectual property rights in and to the source code in its entirety,
22 is owned by the Hiroshima University and the STARC organization.
23
24 All users need to follow the "HISIM_HV Distribution Statement and
25 Copyright Notice" attached to HiSIM_HV model.
26
27 -----HISIM_HV Distribution Statement and Copyright Notice--------------
28
29 Software is distributed as is, completely without warranty or service
30 support. Hiroshima University or STARC and its employees are not liable
31 for the condition or performance of the software.
32
33 Hiroshima University and STARC own the copyright and grant users a perpetual,
34 irrevocable, worldwide, non-exclusive, royalty-free license with respect
35 to the software as set forth below.
36
37 Hiroshima University and STARC hereby disclaims all implied warranties.
38
39 Hiroshima University and STARC grant the users the right to modify, copy,
40 and redistribute the software and documentation, both within the user's
41 organization and externally, subject to the following restrictions
42
43 1. The users agree not to charge for Hiroshima University and STARC code
44 itself but may charge for additions, extensions, or support.
45
46 2. In any product based on the software, the users agree to acknowledge
47 Hiroshima University and STARC that developed the software. This
48 acknowledgment shall appear in the product documentation.
49
50 3. The users agree to reproduce any copyright notice which appears on
51 the software on any copy or modification of such made available
52 to others."
53
54 Toshimasa Asahara, President, Hiroshima University
55 Mitiko Miura-Mattausch, Professor, Hiroshima University
56 Katsuhiro Shimohigashi, President&CEO, STARC
57 June 2008 (revised October 2011)
58 *************************************************************************/
59
60 /*********************************************************************
61 * Memorandum on programming
62 *
63 * (1) Bias (x: b|d|g)
64 * . vxs : Input arguments: Outer branch voltages.
65 * . vxsi: Input arguments: Inner branch voltages.
66 * . deltemp: Input argument: delta temperature.
67 * . Vxse: Internal name for outer branch voltages.
68 * . Vxs: Internal name for inner branch voltages.
69 * . Vbscl:Inner bulk source voltage is clamped within a specified region.
70 * . Y_dVxs denotes the partial derivative of Y w.r.t. Vxs.
71 * . Y_dVxse denotes the partial derivative of Y w.r.t. Vxse.
72 * . Y_dT denotes derivatives with respect to deltemp.
73 *
74 * (2) Device Mode
75 * . Normal mode (Vds>=0 for nMOS) is assumed.
76 * . The sign of Vdse is assumed to be changed simultaneously, if the sign of Vds is changed;
77 * hence Vdse may become negative even thogh Vds >=0.
78 * . In case of reverse mode, parent routines have to properly
79 * transform or interchange inputs and outputs except ones
80 * related to junction diodes, which are regarded as being
81 * fixed to the nodal S/D.
82 *
83 * (3) Modification for symmetry at Vds=0
84 * . Vxsz: Modified bias. (x: b|d|g)
85 * . Ps0z: Modified Ps0.
86 * . The following variables are calculated as a function of
87 * modified biases or potential.
88 * Tox, Cox, (-- with quantum effect)
89 * Vth*, dVth*, dPpg, Igate, Igidl, Igisl.
90 * . The following variables are calculated using a transform
91 * function.
92 * Lred
93 *
94 * (4) Zones and Cases (terminology)
95 *
96 * Chi:=beta*(Ps0-Vbs)= 0 3 5
97 *
98 * Zone: A | D1 | D2 | D3
99 * |
100 * (accumulation)|(depletion)
101 * |
102 * Vgs = Vgs_fb Vth
103 * / /
104 * Case: Nonconductive / Conductive
105 * /
106 * VgVt:=Qn0/Cox= VgVt_small
107 *
108 * . Ids is regarded as zero in zone-A.
109 * . Procedure to calculate Psl and dependent variables is
110 * omitted in the nonconductive case. Ids and Qi are regarded
111 * as zero in this case.
112 *
113 *********************************************************************/
114
115 /*===========================================================*
116 * Preamble.
117 *=================*/
118 /*---------------------------------------------------*
119 * Header files.
120 *-----------------*/
121 #include "ngspice/ngspice.h"
122 #ifdef __STDC__
123 /* #include <ieeefp.h> */
124 #endif
125
126
127 /*-----------------------------------*
128 * HiSIM macros
129 *-----------------*/
130 #include "hisimhv2.h"
131 #include "hsmhv2evalenv.h"
132 #define C_IDD_MIN 1.0e-15
133 #define C_sub_delta 0.1 /* CHECK! */
134 #define C_sub_delta2 1.0e-9 /* CHECK! */
135 #define C_gidl_delta 0.5
136
137 /* local variables used in macro functions */
138 static double TMF0 , TMF1 , TMF2 , TMF3 , TMF4 ;
139
140 /*===========================================================*
141 * Exp() for PGD.
142 * - ExpLim(-3)=0
143 *=================*/
144
145 #define Fn_ExpLim( y , x , dx ) { \
146 if ( (x) < -3.0 ) { \
147 dx = 0.0 ; \
148 y = 0.0 ; \
149 } else if ( (x) < 0.0 ) { \
150 dx = 1.0 + (x) * ( 2 * (1.0/3.0) + (x) * 3 * (1.0/27.0) ) ; \
151 y = 1.0 + (x) * ( 1.0 + (x) * ( (1.0/3.0) + (x) * (1.0/27.0) ) ) ; \
152 } else { \
153 dx = 1.0 + (x) * ( 2 * (1.0/3.0) + (x) * ( 3 * 0.0402052934513951 \
154 + (x) * 4 * 0.148148111111111 ) ) ; \
155 y = 1.0 + (x) * ( 1.0 + (x) * ( (1.0/3.0) + (x) * ( 0.0402052934513951 \
156 + (x) * 0.148148111111111 ) ) ) ; \
157 } \
158 }
159
160 /*===========================================================*
161 * Macro Functions for ceiling/flooring/symmetrization.
162 *=================*/
163
164 /*---------------------------------------------------*
165 * smoothUpper: ceiling.
166 * y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) )
167 * arg = xmax - x - delta
168 *-----------------*/
169
170 #define Fn_SU( y , x , xmax , delta , dx ) { \
171 TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
172 TMF2 = 4.0 * ( xmax ) * ( delta) ; \
173 TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
174 TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
175 dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
176 y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
177 }
178
179 #define Fn_SU2( y , x , xmax , delta , dy_dx , dy_dxmax ) { \
180 TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
181 TMF2 = 4.0 * ( xmax ) * ( delta) ; \
182 TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
183 TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
184 dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
185 dy_dxmax = 0.5 * ( 1.0 - ( TMF1 + 2.0 * delta ) / TMF2 ) ; \
186 y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
187 }
188
189
190 /*---------------------------------------------------*
191 * smoothLower: flooring.
192 * y = xmin + 0.5 ( arg + sqrt( arg^2 + 4 xmin delta ) )
193 * arg = x - xmin - delta
194 *-----------------*/
195
196 #define Fn_SL( y , x , xmin , delta , dx ) { \
197 TMF1 = ( x ) - ( xmin ) - ( delta ) ; \
198 TMF2 = 4.0 * ( xmin ) * ( delta ) ; \
199 TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
200 TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
201 dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
202 y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \
203 }
204
205 #define Fn_SL2( y , x , xmin , delta , dy_dx, dy_dxmin ) { \
206 TMF1 = ( x ) - ( xmin ) - ( delta ) ; \
207 TMF2 = 4.0 * ( xmin ) * ( delta ) ; \
208 TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
209 TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
210 dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
211 dy_dxmin = 0.5 * ( 1.0 - ( TMF1 - 2.0 * delta ) / TMF2 ) ; \
212 y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \
213 }
214
215 /*---------------------------------------------------*
216 * smoothZero: flooring to zero.
217 * y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) )
218 *-----------------*/
219
220 #define Fn_SZ( y , x , delta , dx ) { \
221 TMF2 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta) ) ; \
222 dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \
223 y = 0.5 * ( ( x ) + TMF2 ) ; \
224 if( y < 0.0 ) { y=0.0; dx=0.0; } \
225 }
226
227
228 /*---------------------------------------------------*
229 * CeilingPow: ceiling for positive x, flooring for negative x.
230 * y = x * xmax / ( x^{2m} + xmax^{2m} )^{1/(2m)}
231 * note:
232 * - xmax has to be positive.
233 * - -xmax < y < xmax.
234 * - dy/dx|_{x=0} = 1.
235 *-----------------*/
236
237 #define Fn_CP( y , x , xmax , pw , dx ) { \
238 double x2 = (x) * (x) ; \
239 double xmax2 = (xmax) * (xmax) ; \
240 double xp = 1.0 , xmp = 1.0 ; \
241 int m =0, mm =0; \
242 double arg =0.0, dnm =0.0; \
243 for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \
244 arg = xp + xmp ; \
245 dnm = arg ; \
246 if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \
247 if ( pw == 1 ) { mm = 1 ; \
248 } else if ( pw == 2 ) { mm = 2 ; \
249 } else if ( pw == 4 ) { mm = 3 ; \
250 } else if ( pw == 8 ) { mm = 4 ; } \
251 for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \
252 } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \
253 dnm = 1.0 / dnm ; \
254 y = (x) * (xmax) * dnm ; \
255 dx = (xmax) * xmp * dnm / arg ; \
256 }
257
258 #define Fn_SU_CP2( y , x , xmax , delta , pw , dx , dxmax ) { \
259 if(x > xmax - delta && delta >= 0.0) { \
260 TMF1 = x - xmax + delta ; \
261 Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \
262 y = xmax - delta + TMF0 ; \
263 dx = dx ; \
264 dxmax = 1.0-dx ; \
265 } else { \
266 y = x ; \
267 dx = 1.0 ; \
268 dxmax = 0.0 ; \
269 } \
270 }
271
272 #define Fn_CP2( y , x , xmax , pw , dx , dxmax ) { \
273 double x2 = (x) * (x) ; \
274 double xmax2 = (xmax) * (xmax) ; \
275 double xp = 1.0 , xmp = 1.0 ; \
276 int m =0, mm =0; \
277 double arg =0.0, dnm =0.0; \
278 for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \
279 arg = xp + xmp ; \
280 dnm = arg ; \
281 if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \
282 if ( pw == 1 ) { mm = 1 ; \
283 } else if ( pw == 2 ) { mm = 2 ; \
284 } else if ( pw == 4 ) { mm = 3 ; \
285 } else if ( pw == 8 ) { mm = 4 ; } \
286 for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \
287 } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \
288 dnm = 1.0 / dnm ; \
289 y = (x) * (xmax) * dnm ; \
290 dx = (xmax) * xmp * dnm / arg ; \
291 dxmax = (x) * xp * dnm / arg ; \
292 }
293
294 #define Fn_SU_CP3( y , x , xmax , delta , pw , dx , dxmax , ddelta ) { \
295 if(x > xmax - delta && delta >= 0.0) { \
296 TMF1 = x - xmax + delta ; \
297 Fn_CP2( TMF0 , TMF1 , delta , pw , dx , ddelta ) \
298 y = xmax - delta + TMF0 ; \
299 dx = dx ; \
300 dxmax = 1.0-dx ; \
301 ddelta = -1.0+dx+ddelta; \
302 } else { \
303 y = x ; \
304 dx = 1.0 ; \
305 dxmax = 0.0 ; \
306 ddelta = 0.0 ; \
307 } \
308 }
309
310 #define Fn_SL_CP3( y , x , xmin , delta , pw , dx , dxmin, ddelta) { \
311 if(x < xmin + delta && delta >= 0.0) { \
312 TMF1 = xmin + delta - x ; \
313 Fn_CP2( TMF0 , TMF1 , delta , pw , dx , ddelta ) \
314 y = xmin + delta - TMF0 ; \
315 dx = dx ; \
316 dxmin = 1.0-dx ; \
317 ddelta = 1.0-dx-ddelta; \
318 } else { \
319 y = x ; \
320 dx = 1.0 ; \
321 dxmin = 0.0 ; \
322 ddelta = 0.0 ; \
323 } \
324 }
325
326 #define Fn_SU_CP( y , x , xmax , delta , pw , dx ) { \
327 if(x > xmax - delta && delta >= 0.0) { \
328 TMF1 = x - xmax + delta ; \
329 Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \
330 y = xmax - delta + TMF0 ; \
331 dx = dx ; \
332 } else { \
333 y = x ; \
334 dx = 1.0 ; \
335 } \
336 }
337
338
339 #define Fn_SL_CP2( y , x , xmin , delta , pw , dx , dxmin) { \
340 if(x < xmin + delta && delta >= 0.0) { \
341 TMF1 = xmin + delta - x ; \
342 Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \
343 y = xmin + delta - TMF0 ; \
344 dx = dx ; \
345 dxmin = 1.0-dx ; \
346 } else { \
347 y = x ; \
348 dx = 1.0 ; \
349 dxmin = 0.0 ; \
350 } \
351 }
352
353 #define Fn_SL_CP( y , x , xmin , delta , pw , dx ) { \
354 if(x < xmin + delta && delta >= 0.0) { \
355 TMF1 = xmin + delta - x ; \
356 Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \
357 y = xmin + delta - TMF0 ; \
358 dx = dx ; \
359 } else { \
360 y = x ; \
361 dx = 1.0 ; \
362 } \
363 }
364
365
366
367 /*---------------------------------------------------*
368 * Declining function using a polynomial.
369 *-----------------*/
370
371 #define Fn_DclPoly4( y , x , dx ) { \
372 TMF2 = (x) * (x) ; \
373 TMF3 = TMF2 * (x) ; \
374 TMF4 = TMF2 * TMF2 ; \
375 y = 1.0 / ( 1.0 + (x) + TMF2 + TMF3 + TMF4 ) ; \
376 dx = - ( 1.0 + 2.0 * (x) + 3.0 * TMF2 + 4.0 * TMF3 ) * y * y ; \
377 }
378
379 #define Fn_DclPoly6( y , x , dx ) { \
380 TMF2 = (x) * (x) ; \
381 TMF3 = TMF2 * (x) ; \
382 TMF4 = TMF2 * TMF2 ; \
383 TMF5 = TMF2 * TMF3 ; \
384 TMF6 = TMF3 * TMF3 ; \
385 y = 1.0 / ( 1.0 + (x) + TMF2 + TMF3 + TMF4 + TMF5 + TMF6 ) ; \
386 dx = - ( 1.0 + 2.0 * (x) + 3.0 * TMF2 + 4.0 * TMF3 \
387 + 5.0 * TMF4 + 6.0 * TMF5 ) * y * y ; \
388 }
389
390 /*---------------------------------------------------*
391 * "smoothUpper" using a polynomial
392 *-----------------*/
393
394 #define Fn_SUPoly4( y , x , xmax , dx ) { \
395 TMF1 = (x) / xmax ; \
396 Fn_DclPoly4( y , TMF1 , dx ) ; \
397 y = xmax * ( 1.0 - y ) ; \
398 dx = - dx ; \
399 }
400
401
402 #define Fn_SUPoly4m( y , x , xmax , dx , dxmax ) { \
403 TMF1 = (x) / xmax ; \
404 Fn_DclPoly4( TMF0 , TMF1 , dx ) ; \
405 y = xmax * ( 1.0 - TMF0 ) ; \
406 dxmax = 1.0 - TMF0 + TMF1 * dx ; \
407 dx = - dx ; \
408 }
409
410
411 #define Fn_SUPoly6m( y , x , xmax , dx , dxmax ) { \
412 TMF1 = (x) / xmax ; \
413 Fn_DclPoly6( TMF0 , TMF1 , dx ) ; \
414 y = xmax * ( 1.0 - TMF0 ) ; \
415 dxmax = 1.0 - TMF0 + TMF1 * dx ; \
416 dx = - dx ; \
417 }
418
419 /*---------------------------------------------------*
420 * SymAdd: evaluate additional term for symmetry.
421 *-----------------*/
422
423 #define Fn_SymAdd( y , x , add0 , dx ) \
424 { \
425 TMF1 = 2.0 * ( x ) / ( add0 ) ; \
426 TMF2 = 1.0 + TMF1 * ( (1.0/2) + TMF1 * ( (1.0/6) \
427 + TMF1 * ( (1.0/24) + TMF1 * ( (1.0/120) \
428 + TMF1 * ( (1.0/720) + TMF1 * (1.0/5040) ) ) ) ) ) ; \
429 TMF3 = (1.0/2) + TMF1 * ( (1.0/3) \
430 + TMF1 * ( (1.0/8) + TMF1 * ( (1.0/30) \
431 + TMF1 * ( (1.0/144) + TMF1 * (1.0/840) ) ) ) ) ; \
432 y = add0 / TMF2 ; \
433 dx = - 2.0 * TMF3 / ( TMF2 * TMF2 ) ; \
434 }
435
436
437
438 /*===========================================================*
439 * Function hsmhvevaluate.
440 *=================*/
HSMHV2evaluate(double Vdse,double Vgse,double Vbse,double Vds,double Vgs,double Vbs,double vbs_jct,double vbd_jct,double Vsubs,double Vddp,double deltemp,HSMHV2instance * here,HSMHV2model * model,CKTcircuit * ckt)441 int HSMHV2evaluate
442 (
443 double Vdse, /* external branch voltage ( Vds >= 0 are assumed -> Vdse might be negative.) */
444 double Vgse, /* external branch voltage */
445 double Vbse, /* external branch voltage */
446 double Vds, /* inner branch voltage */
447 double Vgs, /* inner branch voltage */
448 double Vbs, /* inner branch voltage */
449 double vbs_jct,
450 double vbd_jct,
451 double Vsubs, /* substrate-source voltage */
452 double Vddp, /* drain-drainPrime voltage */
453 double deltemp,
454 HSMHV2instance *here,
455 HSMHV2model *model,
456 CKTcircuit *ckt
457 )
458 {
459 HSMHV2binningParam *pParam = &here->pParam ;
460 HSMHV2modelMKSParam *modelMKS = &model->modelMKS ;
461 /* HSMHV2hereMKSParam *hereMKS = &here->hereMKS ;*/
462 /*-----------------------------------*
463 * Constants for Smoothing functions
464 *---------------*/
465 const double vth_dlt = 1.0e-3 ;
466 /* const double cclmmdf = 1.0e-2 ;*/
467 const double cclmmdf = 1.0e-1 ;
468 const double C_cm2m = 1.0e-2 ;
469 const double qme_dlt = 1.0e-9 * C_cm2m ;
470 const double rdsl2_dlt = 10.0e-3 * C_cm2m ;
471 const double rdsu2_dlt = 50.0e-6 * C_cm2m ;
472 const double rdsz_dlt = 0.1e-3 * C_cm2m ;
473 /* const double qme2_dlt = 5.0e-2 ;*/
474 const double eef_dlt = 1.0e-2 / C_cm2m ;
475 const double sti2_dlt = 2.0e-3 ;
476 const double pol_dlt = 5.0e-2 ;
477 /* const double psia2_dlt = 5.0e-3 ;*/
478 const double psisti_dlt = 5.0e-3 ;
479
480 /*---------------------------------------------------*
481 * Local variables.
482 *-----------------*/
483 /* Constants ----------------------- */
484 const int lp_s0_max = 20 ;
485 const int lp_sl_max = 40 ;
486 const int lp_se_max = 150 ;
487
488 const double dP_max = 0.1e0 ;
489 const double ps_conv = 1.0e-12 ;
490 const double ps_conv2 = 1.0e-10 ;
491
492 /* double ps_conv = 1.0e-13 ;*/
493 const double gs_conv = 1.0e-8 ;
494 /** depletion **/
495 const double znbd3 = 3.0e0 ;
496 const double znbd5 = 5.0e0 ;
497 const double cn_nc3 = C_SQRT_2 / 108e0 ;
498 /* 5-degree, contact:Chi=5 */
499 const double cn_nc51 = 0.707106781186548 ; /* sqrt(2)/2 */
500 const double cn_nc52 = -0.117851130197758 ; /* -sqrt(2)/12 */
501 const double cn_nc53 = 0.0178800506338833 ; /* (187 - 112*sqrt(2))/1600 */
502 const double cn_nc54 = -0.00163730162779191 ; /* (-131 + 88*sqrt(2))/4000 */
503 const double cn_nc55 = 6.36964918866352e-5 ; /* (1509-1040*sqrt(2))/600000 */
504 /** inversion **/
505 /* 3-degree polynomial approx for ( exp[Chi]-1 )^{1/2} */
506 const double cn_im53 = 2.9693154855770998e-1 ;
507 const double cn_im54 = -7.0536542840097616e-2 ;
508 const double cn_im55 = 6.1152888951331797e-3 ;
509 /** initial guess **/
510 const double c_ps0ini_2 = 8.0e-4 ;
511 const double c_pslini_1 = 0.3e0 ;
512 const double c_pslini_2 = 3.0e-2 ;
513
514 const double VgVt_small = 1.0e-12 ;
515 /* const double Vbs_min = model->HSMHV2_vbsmin ; */
516 /* const double Vds_max = 10.5e0 ; */
517 /* const double Vgs_max = 10.5e0 ; */
518 const double epsm10 = 10.0e0 * C_EPS_M ;
519 const double small = 1.0e-25 ;
520 const double small2= 1e-12 ; /* for Ra(Vdse) dependence */
521 const double c_exp_2 = 7.38905609893065 ;
522 const double large_arg = 80 ; // log(1.0e100) ;
523
524 double Vbs_max = 0.8e0, Vbs_max_dT =0.0 ;
525 double Vbs_bnd = 0.4e0, Vbs_bnd_dT =0.0 ; /* start point of positive Vbs bending */
526 double Gdsmin = 0.0 ;
527
528 /* Internal flags --------------------*/
529 int flg_err = 0 ; /* error level */
530 int flg_rsrd = 0 ; /* Flag for handling Rs and Rd */
531 /* int flg_iprv = 0 ; */ /* Flag for initial guess of Ids -> not necessary any more */
532 int flg_pprv = 0 ; /* Flag for initial guesses of Ps0 and Pds */
533 int flg_noqi =0; /* Flag for the cases regarding Qi=Qd=0 */
534 /* int flg_vbsc = 0 ; */ /* Flag for Vbs confining -> not necessary any more */
535 int flg_info = 0 ;
536 int flg_conv = 0 ; /* Flag for Poisson loop convergence */
537 int flg_qme = 0 ; /* Flag for QME */
538 int flg_nqs=0 ; /* Flag for NQS calculation */
539
540 /* Important Variables in HiSIM -------*/
541 /* confined bias */
542 double Vbscl=0.0, Vbscl_dVbs=0.0, Vbscl_dT=0.0, Vbscl_dVbs_dVbs = 0.0, Vbscl_dVbs_dT = 0.0 ;
543 double Vgp =0.0, Vgp_dVbs =0.0, Vgp_dVds =0.0, Vgp_dVgs =0.0, Vgp_dT =0.0 ;
544 double Vgs_fb =0.0 ;
545 /* Ps0 : surface potential at the source side */
546 double Ps0 =0.0, Ps0_dVbs =0.0, Ps0_dVds =0.0, Ps0_dVgs =0.0, Ps0_dT =0.0 ;
547 double Ps0_ini =0.0 ;
548 double Ps0_iniA =0.0, Ps0_iniA_dVxb =0.0, Ps0_iniA_dVgb =0.0, Ps0_iniA_dT =0.0 ;
549 double Ps0_iniB =0.0, Ps0_iniB_dVxb =0.0, Ps0_iniB_dVgb =0.0, Ps0_iniB_dT =0.0 ;
550 /* Psl : surface potential at the drain side */
551 double Psl =0.0, Psl_dVbs =0.0, Psl_dVds =0.0, Psl_dVgs =0.0, Psl_dT =0.0 ;
552 double Psl_lim =0.0, dPlim =0.0 ;
553 /* Pds := Psl - Ps0 */
554 double Pds = 0.0, Pds_dVbs = 0.0, Pds_dVds = 0.0, Pds_dVgs =0.0, Pds_dT =0.0 ;
555 double Pds_ini =0.0 ;
556 double Pds_max =0.0 ;
557 /* iteration numbers of Ps0 and Psl equations. */
558 int lp_s0 = 0 , lp_sl = 0 ;
559 /* Xi0 := beta * ( Ps0 - Vbs ) - 1. */
560 double Xi0 =0.0, Xi0_dVbs =0.0, Xi0_dVds =0.0, Xi0_dVgs =0.0, Xi0_dT =0.0 ;
561 double Xi0p12 =0.0, Xi0p12_dVbs =0.0, Xi0p12_dVds =0.0, Xi0p12_dVgs =0.0, Xi0p12_dT =0.0 ;
562 double Xi0p32 =0.0, Xi0p32_dVbs =0.0, Xi0p32_dVds =0.0, Xi0p32_dVgs =0.0, Xi0p32_dT =0.0 ;
563 /* Xil := beta * ( Psl - Vbs ) - 1. */
564 double Xil =0.0, Xil_dVbs =0.0, Xil_dVds =0.0, Xil_dVgs =0.0, Xil_dT =0.0 ;
565 double Xilp12 =0.0, Xilp12_dVbs =0.0, Xilp12_dVds =0.0, Xilp12_dVgs =0.0, Xilp12_dT =0.0 ;
566 double Xilp32 =0.0, Xilp32_dVbs =0.0, Xilp32_dVds =0.0, Xilp32_dVgs =0.0, Xilp32_dT =0.0 ;
567 /* modified bias and potential for sym.*/
568 double Vbsz =0.0, Vbsz_dVbs =0.0, Vbsz_dVds =0.0, Vbsz_dT =0.0 ;
569 double Vdsz =0.0, Vdsz_dVbs =0.0, Vdsz_dVds =0.0, Vdsz_dT =0.0 ;
570 double Vgsz =0.0, Vgsz_dVbs =0.0, Vgsz_dVds =0.0, Vgsz_dVgs =0.0, Vgsz_dT =0.0 ;
571 double Vzadd =0.0, Vzadd_dVbs =0.0, Vzadd_dVds = 0.0, Vzadd_dT = 0.0 ;
572 double Ps0z =0.0, Ps0z_dVbs =0.0, Ps0z_dVds =0.0, Ps0z_dVgs =0.0, Ps0z_dT =0.0 ;
573 double Pzadd =0.0, Pzadd_dVbs =0.0, Pzadd_dVds =0.0, Pzadd_dVgs =0.0, Pzadd_dT =0.0 ;
574
575 /* IBPC */
576 double dVbsIBPC =0.0, dVbsIBPC_dVbs =0.0, dVbsIBPC_dVds =0.0, dVbsIBPC_dVgs =0.0, dVbsIBPC_dT =0.0 , dVbsIBPC_dVddp =0.0 ;
577 double dG3 =0.0, dG3_dVbs =0.0, dG3_dVds =0.0, dG3_dVgs =0.0, dG3_dT =0.0 , dG3_dVddp =0.0 ;
578 double dG4 =0.0, dG4_dVbs =0.0, dG4_dVds =0.0, dG4_dVgs =0.0, dG4_dT =0.0 , dG4_dVddp =0.0 ;
579 double dIdd =0.0, dIdd_dVbs =0.0, dIdd_dVds =0.0, dIdd_dVgs =0.0, dIdd_dT =0.0 , dIdd_dVddp =0.0 ;
580
581 double betaWL =0.0, betaWL_dVbs =0.0, betaWL_dVds =0.0, betaWL_dVgs =0.0, betaWL_dT =0.0 ;
582
583 /* Chi := beta * ( Ps{0/l} - Vbs ) */
584 double Chi =0.0, Chi_dVbs =0.0, Chi_dVds =0.0, Chi_dVgs =0.0, Chi_dT =0.0 ;
585 /* Rho := beta * ( Psl - Vds ) */
586 double Rho =0.0, Rho_dT =0.0 ;
587 /* threshold voltage */
588 double Vth =0.0 ;
589 double Vth0 =0.0, Vth0_dVb =0.0, Vth0_dVd =0.0, Vth0_dVg =0.0, Vth0_dT =0.0 ;
590 /* variation of threshold voltage */
591 double dVth =0.0, dVth_dVb =0.0, dVth_dVd =0.0, dVth_dVg =0.0, dVth_dT = 0.0 ;
592 double dVth0 =0.0 ;
593 double dVth0_dVb =0.0, dVth0_dVd =0.0, dVth0_dVg =0.0, dVth0_dT =0.0 ;
594 double dVthSC =0.0 ;
595 double dVthSC_dVb =0.0, dVthSC_dVd =0.0, dVthSC_dVg =0.0, dVthSC_dT =0.0 ;
596 double Pb20b =0.0, Pb20b_dVg =0.0, Pb20b_dVb =0.0, Pb20b_dVd =0.0, Pb20b_dT =0.0 ;
597 double dVthW =0.0, dVthW_dVb =0.0, dVthW_dVd =0.0, dVthW_dVg =0.0, dVthW_dT =0.0 ;
598 /* Alpha and related parameters */
599 double Alpha =0.0, Alpha_dVbs =0.0, Alpha_dVds =0.0, Alpha_dVgs =0.0, Alpha_dT =0.0 ;
600 double Achi =0.0, Achi_dVbs =0.0, Achi_dVds =0.0, Achi_dVgs =0.0, Achi_dT =0.0 ;
601 double VgVt =0.0, VgVt_dVbs =0.0, VgVt_dVds =0.0, VgVt_dVgs =0.0, VgVt_dT =0.0 ;
602 double Pslsat =0.0 ;
603 double Vdsat =0.0 ;
604 double VdsatS =0.0, VdsatS_dVbs =0.0, VdsatS_dVds =0.0, VdsatS_dVgs =0.0, VdsatS_dT =0.0 ;
605 double Delta =0.0 ;
606 /* Q_B and capacitances */
607 double Qb =0.0, Qb_dVbs =0.0, Qb_dVds =0.0, Qb_dVgs =0.0, Qb_dT=0.0 ;
608 double Qbu =0.0, Qbu_dVbs =0.0, Qbu_dVds =0.0, Qbu_dVgs =0.0, Qbu_dT =0.0 ;
609 /* Q_I and capacitances */
610 double Qi =0.0, Qi_dVbs =0.0, Qi_dVds =0.0, Qi_dVgs =0.0, Qi_dT=0.0 ;
611 double Qiu =0.0, Qiu_dVbs =0.0, Qiu_dVds =0.0, Qiu_dVgs =0.0, Qiu_dT =0.0 ;
612 /* Q_D and capacitances */
613 double Qd =0.0, Qd_dVbs =0.0, Qd_dVds =0.0, Qd_dVgs =0.0, Qd_dT =0.0 ;
614 /* channel current */
615 double Ids =0.0, Ids_dVbs =0.0, Ids_dVds =0.0, Ids_dVgs =0.0, Ids_dT =0.0, Ids_dRa =0.0 ;
616 double Ids0 =0.0, Ids0_dVbs =0.0, Ids0_dVds =0.0, Ids0_dVgs =0.0, Ids0_dT =0.0 ;
617 /* STI */
618 double dVthSCSTI =0.0, dVthSCSTI_dVg =0.0, dVthSCSTI_dVd =0.0, dVthSCSTI_dVb =0.0, dVthSCSTI_dT =0.0 ;
619 double Vgssti =0.0, Vgssti_dVbs =0.0, Vgssti_dVds =0.0, Vgssti_dVgs =0.0, Vgssti_dT =0.0 ;
620 double costi0 =0.0 ;
621 double costi1 =0.0, costi1_dT =0.0 ;
622 double costi3 =0.0, costi3_dVb =0.0, costi3_dVd =0.0, costi3_dVg =0.0, costi3_dT =0.0 ;
623 double costi3_dVb_c3 =0.0, costi3_dVd_c3 =0.0, costi3_dVg_c3 =0.0, costi3_dT_c3 =0.0 ;
624 double costi4 =0.0, costi4_dT =0.0 ;
625 double costi5 =0.0, costi5_dT =0.0 ;
626 double costi6 =0.0, costi6_dT =0.0 ;
627 double costi7 =0.0, costi7_dT =0.0 ;
628 double Psasti =0.0, Psasti_dVbs =0.0, Psasti_dVds =0.0, Psasti_dVgs =0.0, Psasti_dT =0.0 ;
629 double Psbsti =0.0, Psbsti_dVbs =0.0, Psbsti_dVds =0.0, Psbsti_dVgs =0.0, Psbsti_dT =0.0 ;
630 double Psab =0.0, Psab_dVbs =0.0, Psab_dVds =0.0, Psab_dVgs =0.0, Psab_dT =0.0 ;
631 double Psti =0.0, Psti_dVbs =0.0, Psti_dVds =0.0, Psti_dVgs =0.0, Psti_dT =0.0 ;
632 double sq1sti =0.0, sq1sti_dVbs =0.0, sq1sti_dVds =0.0, sq1sti_dVgs =0.0, sq1sti_dT =0.0 ;
633 double sq2sti =0.0, sq2sti_dVbs =0.0, sq2sti_dVds =0.0, sq2sti_dVgs =0.0, sq2sti_dT =0.0 ;
634 double Qn0sti =0.0, Qn0sti_dVbs =0.0, Qn0sti_dVds =0.0, Qn0sti_dVgs =0.0, Qn0sti_dT =0.0 ;
635 double Idssti =0.0, Idssti_dVbs =0.0, Idssti_dVds =0.0, Idssti_dVgs =0.0, Idssti_dT=0.0 ;
636 /* constants */
637 double beta =0.0, beta_dT =0.0 ;
638 double beta_inv =0.0, beta_inv_dT =0.0 ;
639 double beta2 =0.0 ;
640 double Pb2 =0.0, Pb2_dT =0.0 ;
641 double Pb20 =0.0 ;
642 double Pb2c =0.0 ;
643 double Vfb =0.0 ;
644 double c_eox =0.0 ;
645 double Leff =0.0, Weff =0.0, WeffLD_nf =0.0 ;
646 double Ldrift0 =0.0 ;
647 double q_Nsub =0.0 ;
648 /* PART-1 */
649 /* Accumulation zone */
650 double Psa =0.0 ;
651 double Psa_dVbs =0.0, Psa_dVds =0.0, Psa_dVgs =0.0, Psa_dT =0.0 ;
652 /* CLM*/
653 double Psdl =0.0, Psdl_dVbs =0.0, Psdl_dVds =0.0, Psdl_dVgs =0.0, Psdl_dT =0.0 ;
654 double Lred =0.0, Lred_dVbs =0.0, Lred_dVds =0.0, Lred_dVgs =0.0, Lred_dT =0.0 ;
655 double Lch =0.0, Lch_dVbs =0.0, Lch_dVds =0.0, Lch_dVgs =0.0, Lch_dT =0.0 ;
656 double Wd =0.0, Wd_dVbs =0.0, Wd_dVds =0.0, Wd_dVgs =0.0, Wd_dT =0.0 ;
657 double Aclm =0.0 ;
658 /* Pocket Implant */
659 double Vthp=0.0, Vthp_dVb=0.0, Vthp_dVd=0.0, Vthp_dVg =0.0, Vthp_dT =0.0 ;
660 double dVthLP=0.0, dVthLP_dVb=0.0, dVthLP_dVd=0.0, dVthLP_dVg =0.0, dVthLP_dT =0.0 ;
661 double bs12=0.0, bs12_dVb=0.0, bs12_dVd =0.0, bs12_dVg =0.0, bs12_dT =0.0 ;
662 double Qbmm=0.0, Qbmm_dVb=0.0, Qbmm_dVd =0.0, Qbmm_dVg =0.0, Qbmm_dT =0.0 ;
663 double dqb=0.0, dqb_dVb=0.0, dqb_dVg=0.0, dqb_dVd =0.0, dqb_dT =0.0 ;
664 double Vdx=0.0, Vdx_dVbs=0.0, Vdx_dT=0.0 ;
665 double Vdx2=0.0, Vdx2_dVbs=0.0, Vdx2_dT=0.0 ;
666 double Pbsum=0.0, Pbsum_dVb=0.0, Pbsum_dVd=0.0, Pbsum_dVg =0.0, Pbsum_dT =0.0 ;
667 double sqrt_Pbsum =0.0 ;
668 /* Poly-Depletion Effect */
669 const double pol_b = 1.0 ;
670 double dPpg =0.0, dPpg_dVb =0.0, dPpg_dVd =0.0, dPpg_dVg =0.0, dPpg_dT = 0.0 ;
671 /* Quantum Effect */
672 double Tox =0.0, Tox_dVb =0.0, Tox_dVd =0.0, Tox_dVg =0.0, Tox_dT =0.0 ;
673 double dTox =0.0, dTox_dVb =0.0, dTox_dVd =0.0, dTox_dVg =0.0, dTox_dT =0.0 ;
674 double Cox =0.0, Cox_dVb =0.0, Cox_dVd =0.0, Cox_dVg =0.0, Cox_dT =0.0 ;
675 double Cox_inv =0.0, Cox_inv_dVb =0.0, Cox_inv_dVd =0.0, Cox_inv_dVg =0.0, Cox_inv_dT =0.0 ;
676 double Tox0 =0.0, Cox0 =0.0, Cox0_inv =0.0 ;
677 double Vthq=0.0, Vthq_dVb =0.0, Vthq_dVd =0.0 ;
678 /* Igate , Igidl , Igisl */
679 const double igate_dlt = 1.0e-2 / C_cm2m ;
680 const double gidlvds_dlt = 1.0e-5 ;
681 const double gidla = 100.0 ;
682 double Psdlz =0.0, Psdlz_dVbs =0.0, Psdlz_dVds =0.0, Psdlz_dVgs =0.0, Psdlz_dT =0.0 ;
683 double Egp12 =0.0, Egp12_dT =0.0 ;
684 double Egp32 =0.0, Egp32_dT =0.0 ;
685 double E1 =0.0, E1_dVb =0.0, E1_dVd =0.0, E1_dVg =0.0, E1_dT =0.0 ;
686 double Etun =0.0, Etun_dVbs =0.0, Etun_dVds =0.0, Etun_dVgs =0.0, Etun_dT =0.0 ;
687 double Vdsp=0.0, Vdsp_dVd =0.0 ;
688 double Egidl =0.0, Egidl_dVb =0.0, Egidl_dVd =0.0, Egidl_dVg =0.0, Egidl_dT =0.0 ;
689 double Egisl =0.0, Egisl_dVb =0.0, Egisl_dVd =0.0, Egisl_dVg =0.0, Egisl_dT =0.0 ;
690 double Igate =0.0, Igate_dVbs =0.0, Igate_dVds =0.0, Igate_dVgs =0.0, Igate_dT =0.0 ;
691 double Igs =0.0, Igs_dVbs =0.0, Igs_dVds =0.0, Igs_dVgs =0.0, Igs_dT =0.0 ;
692 double Igd =0.0, Igd_dVbs =0.0, Igd_dVds =0.0, Igd_dVgs =0.0, Igd_dT =0.0 ;
693 double Igb =0.0, Igb_dVbs =0.0, Igb_dVds =0.0, Igb_dVgs =0.0, Igb_dT =0.0 ;
694 double Igidl =0.0, Igidl_dVbs =0.0, Igidl_dVds =0.0, Igidl_dVgs =0.0, Igidl_dT =0.0 ;
695 double Igisl =0.0, Igisl_dVbs =0.0, Igisl_dVds =0.0, Igisl_dVgs =0.0, Igisl_dT =0.0 ;
696 double Vdb =0.0, Vsb =0.0 ;
697 /* connecting function */
698 double FD2 =0.0, FD2_dVbs =0.0, FD2_dVds =0.0, FD2_dVgs =0.0, FD2_dT =0.0 ;
699 double FMDVDS =0.0, FMDVDS_dVbs =0.0, FMDVDS_dVds =0.0, FMDVDS_dVgs =0.0, FMDVDS_dT =0.0 ;
700
701 double cnst0 =0.0, cnst0_dT =0.0;
702 double cnst1 =0.0, cnst1_dT =0.0;
703 double cnstCoxi =0.0, cnstCoxi_dVb =0.0, cnstCoxi_dVd =0.0, cnstCoxi_dVg =0.0, cnstCoxi_dT =0.0 ;
704 double fac1 =0.0, fac1_dVbs =0.0, fac1_dVds =0.0, fac1_dVgs =0.0, fac1_dT =0.0 ;
705 double fac1p2 =0.0, fac1p2_dT =0.0 ;
706 double fs01 =0.0, fs01_dVbs =0.0, fs01_dVds =0.0, fs01_dVgs =0.0, fs01_dT =0.0, fs01_dPs0 =0.0 ;
707 double fs02 =0.0, fs02_dVbs =0.0, fs02_dVds =0.0, fs02_dVgs =0.0, fs02_dT =0.0, fs02_dPs0 =0.0 ;
708 double fsl1 =0.0, fsl1_dVbs =0.0, fsl1_dVds =0.0, fsl1_dVgs =0.0, fsl1_dT =0.0, fsl1_dPsl =0.0 ;
709 double fsl2 =0.0, fsl2_dVbs =0.0, fsl2_dVds =0.0, fsl2_dVgs =0.0, fsl2_dT =0.0, fsl2_dPsl =0.0 ;
710 double cfs1 =0.0, cfs1_dT =0.0 ;
711 double fb =0.0, fb_dChi =0.0 ;
712 double fi =0.0, fi_dChi =0.0 ;
713 double exp_Chi =0.0, exp_Chi_dT =0.0 ;
714 double exp_Rho =0.0, exp_Rho_dT =0.0 ;
715 double exp_bVbs =0.0, exp_bVbs_dT =0.0 ;
716 double exp_bVbsVds =0.0, exp_bVbsVds_dT =0.0 ;
717 double exp_bPs0 =0.0, exp_bPs0_dT =0.0 ;
718 double Fs0 =0.0, Fs0_dPs0 =0.0 ;
719 double Fsl =0.0, Fsl_dPsl =0.0 ;
720 double dPs0 =0.0, dPsl =0.0 ;
721 double Qn0 =0.0, Qn0_dVbs =0.0, Qn0_dVds =0.0, Qn0_dVgs =0.0, Qn0_dT =0.0 ;
722 double Qb0 =0.0, Qb0_dVb =0.0, Qb0_dVd =0.0, Qb0_dVg =0.0, Qb0_dT =0.0 ;
723 double Qbnm =0.0, Qbnm_dVbs =0.0, Qbnm_dVds =0.0, Qbnm_dVgs =0.0, Qbnm_dT =0.0 ;
724 double DtPds =0.0, DtPds_dVbs =0.0, DtPds_dVds =0.0, DtPds_dVgs =0.0, DtPds_dT =0.0 ;
725 double Qinm =0.0, Qinm_dVbs =0.0, Qinm_dVds =0.0, Qinm_dVgs =0.0, Qinm_dT =0.0 ;
726 double Qidn =0.0, Qidn_dVbs =0.0, Qidn_dVds =0.0, Qidn_dVgs =0.0, Qidn_dT =0.0 ;
727 double Qdnm =0.0, Qdnm_dVbs =0.0, Qdnm_dVds =0.0, Qdnm_dVgs =0.0, Qdnm_dT =0.0 ;
728 double Qddn =0.0, Qddn_dVbs =0.0, Qddn_dVds =0.0, Qddn_dVgs =0.0, Qddn_dT =0.0 ;
729 double Quot =0.0 ;
730 double Qdrat =0.5, Qdrat_dVbs =0.0, Qdrat_dVds =0.0, Qdrat_dVgs =0.0, Qdrat_dT =0.0 ;
731 double Idd =0.0, Idd_dVbs =0.0, Idd_dVds =0.0, Idd_dVgs =0.0, Idd_dT =0.0 ;
732 double Idd1 =0.0, Idd1_dVbs =0.0, Idd1_dVds =0.0, Idd1_dVgs =0.0, Idd1_dT =0.0 ;
733 double Fdd =0.0, Fdd_dVbs =0.0, Fdd_dVds =0.0, Fdd_dVgs =0.0, Fdd_dT =0.0 ;
734 double Eeff =0.0, Eeff_dVbs =0.0, Eeff_dVds =0.0, Eeff_dVgs =0.0, Eeff_dT =0.0 ;
735 double Rns =0.0, Rns_dT =0.0 ;
736 double Mu = 0.0, Mu_dVbs =0.0, Mu_dVds =0.0, Mu_dVgs =0.0, Mu_dT =0.0 ;
737 double Muun =0.0, Muun_dVbs =0.0, Muun_dVds =0.0, Muun_dVgs =0.0, Muun_dT =0.0 ;
738 double Ey =0.0, Ey_dVbs =0.0, Ey_dVds =0.0, Ey_dVgs =0.0, Ey_dT =0.0 ;
739 double Em =0.0, Em_dVbs =0.0, Em_dVds =0.0, Em_dVgs =0.0, Em_dT =0.0 ;
740 double Vmax =0.0, Vmax_dT =0.0 ;
741 double Eta =0.0, Eta_dVbs =0.0, Eta_dVds =0.0, Eta_dVgs =0.0, Eta_dT =0.0 ;
742 double Eta1 =0.0, Eta1_dT =0.0 ;
743 double Eta1p12 =0.0, Eta1p12_dT =0.0 ;
744 double Eta1p32 =0.0, Eta1p32_dT =0.0 ;
745 double Eta1p52 =0.0, Eta1p52_dT =0.0 ;
746 double Zeta12 =0.0, Zeta12_dT =0.0 ;
747 double Zeta32 =0.0, Zeta32_dT =0.0 ;
748 double Zeta52 =0.0, Zeta52_dT =0.0 ;
749 double F00 =0.0, F00_dVbs =0.0, F00_dVds =0.0, F00_dVgs =0.0, F00_dT =0.0 ;
750 double F10 =0.0, F10_dVbs =0.0, F10_dVds =0.0, F10_dVgs =0.0, F10_dT =0.0 ;
751 double F30 =0.0, F30_dVbs =0.0, F30_dVds =0.0, F30_dVgs =0.0, F30_dT =0.0 ;
752 double F11 =0.0, F11_dVbs =0.0, F11_dVds =0.0, F11_dVgs =0.0, F11_dT =0.0 ;
753 double Vgs_min =0.0 ;
754 double Ps0_min =0.0, Ps0_min_dVbs =0.0, Ps0_min_dVds =0.0, Ps0_min_dVgs =0.0, Ps0_min_dT =0.0 ;
755 double Acn =0.0, Acn_dVbs =0.0, Acn_dVds =0.0, Acn_dVgs =0.0, Acn_dT =0.0 ;
756 double Acd =0.0, Acd_dVbs =0.0, Acd_dVds =0.0, Acd_dVgs =0.0, Acd_dT =0.0 ;
757 double Ac1 =0.0, Ac1_dVbs =0.0, Ac1_dVds =0.0, Ac1_dVgs =0.0, Ac1_dT =0.0 ;
758 double Ac2 =0.0, Ac2_dVbs =0.0, Ac2_dVds =0.0, Ac2_dVgs =0.0, Ac2_dT =0.0 ;
759 double Ac3 =0.0, Ac3_dVbs =0.0, Ac3_dVds =0.0, Ac3_dVgs =0.0, Ac3_dT =0.0 ;
760 double Ac4 =0.0, Ac4_dVbs =0.0, Ac4_dVds =0.0, Ac4_dVgs =0.0, Ac4_dT =0.0 ;
761 double Ac31 =0.0, Ac31_dVbs =0.0, Ac31_dVds =0.0, Ac31_dVgs =0.0, Ac31_dT =0.0 ;
762 double Ac41 =0.0, Ac41_dT =0.0 ;
763 double ninvd_dT =0.0 ;
764 /* PART-2 (Isub) */
765 double Isub =0.0, Isub_dVbs =0.0, Isub_dVds =0.0, Isub_dVgs =0.0, Isub_dT=0.0 ;
766 double IsubLD =0.0, IsubLD_dVbs =0.0, IsubLD_dVds =0.0, IsubLD_dVgs =0.0, IsubLD_dT=0.0 ;
767 double IsubLD_dVddp = 0.0 ;
768 double Psislsat =0.0, Psislsat_dVb =0.0, Psislsat_dVd =0.0, Psislsat_dVg =0.0, Psislsat_dT =0.0 ;
769 double Psisubsat =0.0, Psisubsat_dVb =0.0, Psisubsat_dVd =0.0, Psisubsat_dVg =0.0, Psisubsat_dT =0.0 ;
770 double Ifn =0.0, Ifn_dVb =0.0, Ifn_dVd=0.0, Ifn_dVg=0.0, Ifn_dT = 0.0 ;
771 double Eg12=0.0, Eg32 =0.0 ;
772 /* PART-3 (overlap) */
773 /* const double cov_dlt = 1.0e-1 ; */
774 /* const double covvgmax = 5.0 ; */
775 double cov_slp =0.0, cov_mag =0.0 ;
776 double Qgos =0.0, Qgos_dVbs =0.0, Qgos_dVds =0.0, Qgos_dVgs =0.0, Qgos_dT =0.0 ;
777 double Qgod =0.0, Qgod_dVbs =0.0, Qgod_dVds =0.0, Qgod_dVgs =0.0, Qgod_dT =0.0 ;
778 double Qgbo =0.0, Qgbo_dVbs =0.0, Qgbo_dVds =0.0, Qgbo_dVgs =0.0, Qgbo_dT = 0.0 ;
779 double Cgdo =0.0, Cgso =0.0, Cgbo_loc =0.0 ;
780 double Qgso =0.0, Qgso_dVbse =0.0, Qgso_dVdse =0.0, Qgso_dVgse =0.0 ;
781 double Qgdo =0.0, Qgdo_dVbse =0.0, Qgdo_dVdse =0.0, Qgdo_dVgse =0.0 ;
782 /* fringe capacitance */
783 double Qfd =0.0, Cfd =0.0 ;
784 double Qfs =0.0, Cfs =0.0 ;
785 /* Cqy */
786 double Ec =0.0, Ec_dVbs =0.0, Ec_dVds =0.0, Ec_dVgs =0.0, Ec_dT =0.0 ;
787 double Pslk =0.0, Pslk_dVbs =0.0, Pslk_dVds =0.0, Pslk_dVgs =0.0, Pslk_dT =0.0 ;
788 double Qy =0.0, Qy_dVbs =0.0, Qy_dVds =0.0, Qy_dVgs =0.0, Qy_dT =0.0 ;
789
790 /* PART-5 (NQS) */
791 double tau =0.0, tau_dVbs=0.0, tau_dVds=0.0, tau_dVgs =0.0, tau_dT=0.0 ;
792 double taub =0.0, taub_dVbs=0.0, taub_dVds=0.0, taub_dVgs =0.0, taub_dT =0.0 ;
793 /* PART-6 (noise) */
794 /* 1/f */
795 double NFalp =0.0, NFtrp =0.0, Cit =0.0, Nflic =0.0 ;
796 /* thermal */
797 double Eyd =0.0, Mu_Ave= 0.0, Nthrml =0.0, Mud_hoso =0.0 ;
798 /* induced gate noise ( Part 0/3 ) */
799 double kusai00 =0.0, kusaidd =0.0, kusaiL =0.0, kusai00L =0.0 ;
800 int flg_ign = 0 ;
801 double sqrtkusaiL =0.0, kusai_ig =0.0, gds0_ign =0.0, gds0_h2 =0.0, GAMMA =0.0, crl_f =0.0 ;
802 const double c_sqrt_15 =3.872983346207417e0 ; /* sqrt(15) */
803 const double Cox_small =1.0e-6 ;
804 const double c_16o135 =1.185185185185185e-1 ; /* 16/135 */
805 double Nign0 =0.0, MuModA =0.0, MuModB =0.0, correct_w1 =0.0 ;
806
807 /* usage of previously calculated values */
808 double vtol_pprv =1.01e-1 ;
809 double Vbsc_dif =0.0, Vdsc_dif =0.0, Vgsc_dif =0.0, sum_vdif =0.0 ;
810 double Vbsc_dif2 =0.0, Vdsc_dif2 =0.0, Vgsc_dif2 =0.0, sum_vdif2 =0.0 ;
811 double dVbs =0.0, dVds =0.0, dVgs =0.0 ;
812
813 /* temporary vars. & derivatives*/
814 double TX =0.0, TX_dVbs =0.0, TX_dVds =0.0, TX_dVgs =0.0, TX_dT =0.0 ;
815 double TY =0.0, TY_dVbs =0.0, TY_dVds =0.0, TY_dVgs =0.0, TY_dT =0.0 ;
816 double T0 =0.0, T0_dVb =0.0, T0_dVd =0.0, T0_dVg =0.0, T0_dT =0.0 ;
817 double T1 =0.0, T1_dVb =0.0, T1_dVd =0.0, T1_dVg =0.0, T1_dT =0.0, T1_dVdse_eff =0.0 ;
818 double T2 =0.0, T2_dVb =0.0, T2_dVd =0.0, T2_dVg =0.0, T2_dT =0.0 ;
819 double T3 =0.0, T3_dVb =0.0, T3_dVd =0.0, T3_dVg =0.0, T3_dT =0.0 ;
820 double T4 =0.0, T4_dVb =0.0, T4_dVd =0.0, T4_dVg =0.0, T4_dT =0.0 ;
821 double T5 =0.0, T5_dVb =0.0, T5_dVd =0.0, T5_dVg =0.0, T5_dT =0.0 ;
822 double T6 =0.0, T6_dVb =0.0, T6_dVd =0.0, T6_dVg =0.0, T6_dT =0.0 ;
823 double T7 =0.0, T7_dVb =0.0, T7_dVd =0.0, T7_dVg =0.0, T7_dT =0.0 ;
824 double T8 =0.0, T8_dVb =0.0, T8_dVd =0.0, T8_dVg =0.0, T8_dT =0.0 ;
825 double T9 =0.0, T9_dVb =0.0, T9_dVd =0.0, T9_dVg =0.0, T9_dT =0.0, T9_dVdse_eff =0.0 ;
826 double T10 =0.0, T10_dVb =0.0, T10_dVd =0.0, T10_dVg =0.0, T10_dT =0.0 ;
827 double T11 =0.0, T11_dT =0.0 ;
828 double T12 =0.0;
829 double T15 =0.0, T16 =0.0, T17 =0.0 ;
830 double T4_dVb_dT, T5_dVb_dT, T6_dVb_dT, T7_dVb_dT ;
831 double T1_dVddp = 0.0 , T2_dVddp = 0.0 ;
832 double T0_dVddp = 0.0 , T3_dVddp = 0.0, T4_dVddp = 0.0 ;
833
834
835 int flg_zone =0 ;
836
837 /* Vdseff */
838 double Vdseff =0.0, Vdseff_dVbs =0.0, Vdseff_dVds =0.0, Vdseff_dVgs =0.0, Vdseff_dT =0.0 ;
839 double Vdsorg =0.0 ;
840
841 /* D/S Overlap Charges: Qovd/Qovs */
842 double CVDSOVER =0.0 ;
843 double Qovdext =0.0, Qovdext_dVbse =0.0, Qovdext_dVdse =0.0, Qovdext_dVgse =0.0, Qovdext_dT =0.0 ;
844 double Qovsext =0.0, Qovsext_dVbse =0.0, Qovsext_dVdse =0.0, Qovsext_dVgse =0.0, Qovsext_dT =0.0 ;
845 double Qovd =0.0, Qovd_dVbs =0.0, Qovd_dVds =0.0, Qovd_dVgs =0.0, Qovd_dT =0.0 ;
846 double Qovs =0.0, Qovs_dVbs =0.0, Qovs_dVds =0.0, Qovs_dVgs =0.0, Qovs_dT =0.0 ;
847 double QbuLD =0.0, QbuLD_dVbs =0.0, QbuLD_dVds =0.0, QbuLD_dVgs =0.0, QbuLD_dT =0.0 ;
848 double QbdLD =0.0, QbdLD_dVbs =0.0, QbdLD_dVds =0.0, QbdLD_dVgs =0.0, QbdLD_dT =0.0 ;
849 double QbsLD =0.0, QbsLD_dVbs =0.0, QbsLD_dVds =0.0, QbsLD_dVgs =0.0, QbsLD_dT =0.0 ;
850 double QodAD =0.0, QodAD_dVbs =0.0, QodAD_dVds =0.0, QodAD_dVgs =0.0, QodAD_dT =0.0 ;
851 double QosAD =0.0, QosAD_dVbs =0.0, QosAD_dVds =0.0, QosAD_dVgs =0.0, QosAD_dT =0.0 ;
852 double QbdLDext =0.0, QbdLDext_dVbse =0.0, QbdLDext_dVdse =0.0, QbdLDext_dVgse =0.0, QbdLDext_dT =0.0 ;
853 double QbsLDext =0.0, QbsLDext_dVbse =0.0, QbsLDext_dVdse =0.0, QbsLDext_dVgse =0.0, QbsLDext_dT =0.0 ;
854
855 /* Vgsz for SCE and PGD */
856 double Vbsz2 =0.0, Vbsz2_dVbs =0.0, Vbsz2_dVds =0.0, Vbsz2_dVgs =0.0 , Vbsz2_dT =0.0;
857
858 /* Multiplication factor * number of gate fingers */
859 double Mfactor = here->HSMHV2_m ;
860
861
862 /*-----------------------------------------------------------*
863 * HiSIM-HV
864 *-----------------*/
865 /* bias-dependent Rd, Rs */
866 double Rdrift =0.0, Rdrift_dVbse =0.0, Rdrift_dVdse =0.0, Rdrift_dVgse =0.0, Rdrift_dT =0.0 ;
867 double Rsdrift =0.0, Rsdrift_dVbse =0.0, Rsdrift_dVdse =0.0, Rsdrift_dVgse =0.0, Rsdrift_dT =0.0 ;
868 double Rd =0.0, Rd_dVbse =0.0, Rd_dVdse =0.0, Rd_dVgse =0.0, Rd_dT =0.0 ;
869 double Rs =0.0, Rs_dVbse =0.0, Rs_dVdse =0.0, Rs_dVgse =0.0, Rs_dT =0.0 ;
870 double Ra =0.0, Ra_dVbse =0.0, Ra_dVdse =0.0, Ra_dVgse =0.0 ;
871 double Ra_dVbs =0.0, Ra_dVds =0.0, Ra_dVgs =0.0 ;
872 double Ra_dVdse_eff =0.0 ;
873 const double delta_rd = 10e-3 * C_cm2m ;
874 const double Ra_N = 20.0; /* smoothing parameter for Ra */
875 const double Res_min = 1.0e-4 ;
876 double Rd0_dT =0.0, Rs0_dT =0.0, Rdvd_dT =0.0, Rsvd_dT =0.0 ;
877 double Vdse_eff =0.0, Vdse_eff_dVbse =0.0, Vdse_eff_dVdse =0.0, Vdse_eff_dVgse =0.0,
878 Vdse_eff_dVbs =0.0, Vdse_eff_dVds =0.0, Vdse_eff_dVgs =0.0 ;
879 double VdseModeNML =0.0, VdseModeRVS =0.0 ;
880 double Vbsegmt =0.0, Vdsegmt =0.0, Vgsegmt =0.0 ;
881 double Vbserev =0.0, Vdserev =0.0, Vgserev =0.0 ;
882 double Ra_alpha, Ra_beta ;
883
884 /* modified external biases for symmetry */
885 double Vzadd_ext_dVd = 0.0 ;
886 double Vdserevz = 0.0, Vdserevz_dVd = 0.0 ;
887 double Vgserevz = 0.0, Vgserevz_dVd = 0.0 ;
888 double Vbserevz = 0.0, Vbserevz_dVd = 0.0 ;
889
890 /* Substrate Effect */
891 const double RDVSUB = model->HSMHV2_rdvsub ;
892 const double RDVDSUB = model->HSMHV2_rdvdsub ;
893 const double DDRIFT = model->HSMHV2_ddrift ;
894 const double VBISUB = model->HSMHV2_vbisub ;
895 const double NSUBSUB = modelMKS->HSMHV2_nsubsub ;
896 double Vsubsrev = 0.0 ;
897 double Wdep = 0.0, Wdep_dVdserev = 0.0, Wdep_dVsubsrev = 0.0 ;
898 double T1_dVdserev = 0.0, T1_dVsubsrev = 0.0, T6_dVdserev = 0.0, T6_dVsubsrev = 0.0 ;
899 double Rs_dVsubs = 0.0, Rd_dVsubs = 0.0, Rdrift_dVsubs = 0.0, Rsdrift_dVsubs = 0.0 ;
900
901
902 /* temperature-dependent variables for SHE model */
903 double TTEMP =0.0, TTEMP0 =0.0 ;
904 double Tdiff0 = 0.0, Tdiff0_2 = 0.0, Tdiff = 0.0, Tdiff_2 = 0.0 ;
905 double Eg =0.0, Eg_dT =0.0 ;
906 double Nin =0.0, Nin_dT =0.0 ;
907
908 /* Qover 5/1 ckt-bias use */
909 double Vgbgmt =0.0, Vgbgmt_dVbs =0.0, Vgbgmt_dVds =0.0, Vgbgmt_dVgs =0.0 ;
910 double Vxbgmt =0.0, Vxbgmt_dVbs =0.0, Vxbgmt_dVds =0.0, Vxbgmt_dVgs =0.0 ;
911 double Vxbgmtcl =0.0, Vxbgmtcl_dVxbgmt =0.0, Vxbgmtcl_dT =0.0 ;
912
913 double ModeNML =0.0, ModeRVS =0.0 ;
914
915 double QsuLD =0.0, QsuLD_dVbs =0.0, QsuLD_dVds =0.0, QsuLD_dVgs =0.0, QsuLD_dT =0.0 ;
916 double QiuLD =0.0, QiuLD_dVbs =0.0, QiuLD_dVds =0.0, QiuLD_dVgs =0.0, QiuLD_dT =0.0 ;
917 double QidLD =0.0, QidLD_dVbs =0.0, QidLD_dVds =0.0, QidLD_dVgs =0.0, QidLD_dT =0.0 ;
918 double QisLD =0.0, QisLD_dVbs =0.0, QisLD_dVds =0.0, QisLD_dVgs =0.0, QisLD_dT =0.0 ;
919 double QidLDext =0.0, QidLDext_dVbse =0.0, QidLDext_dVdse =0.0, QidLDext_dVgse =0.0, QidLDext_dT =0.0 ;
920 double QisLDext =0.0, QisLDext_dVbse =0.0, QisLDext_dVdse =0.0, QisLDext_dVgse =0.0, QisLDext_dT =0.0 ;
921
922 /* Self heating */
923 double mphn0_dT =0.0 ;
924 double cnst0over_dT =0.0 ;
925 double cnst0overs_dT =0.0 ;
926 double Temp_dif =0.0 ;
927 /* for SCE */
928 double ptovr_dT =0.0 ;
929
930 /* IBPC */
931 double IdsIBPC =0.0, IdsIBPC_dVbs =0.0, IdsIBPC_dVds =0.0, IdsIBPC_dVgs =0.0, IdsIBPC_dT =0.0, IdsIBPC_dVddp =0.0 ;
932
933 /* Qover */
934 int flg_ovzone = 0 ;
935 double VgpLD =0.0, VgpLD_dVgb =0.0 ;
936 double Vgb_fb_LD =0.0 ;
937 double Ac31_dVgb =0.0, Ac31_dVxb =0.0 ;
938 double Ac1_dVgb =0.0, Ac1_dVxb =0.0 ;
939 double Ac2_dVgb =0.0, Ac2_dVxb =0.0 ;
940 double Ac3_dVgb =0.0, Ac3_dVxb =0.0 ;
941 double Acn_dVgb =0.0, Acn_dVxb =0.0 ;
942 double Acd_dVgb =0.0, Acd_dVxb =0.0 ;
943 double Chi_dVgb =0.0, Chi_dVxb =0.0 ;
944 double Psa_dVgb =0.0, Psa_dVxb =0.0 ;
945 double QsuLD_dVgb =0.0, QsuLD_dVxb =0.0 ;
946 double QbuLD_dVgb =0.0, QbuLD_dVxb =0.0 ;
947 double fs02_dVgb =0.0, fs02_dVxb =0.0 ;
948 double TX_dVgb =0.0, TX_dVxb =0.0 ;
949 double TY_dVgb =0.0, TY_dVxb =0.0 ;
950 double Ps0LD =0.0, Ps0LD_dVgb =0.0, Ps0LD_dVxb =0.0, Ps0LD_dT =0.0 ;
951 double Ps0LD_dVds =0.0, Ps0LD_dVgs =0.0, Ps0LD_dVbs =0.0 ;
952 double Pb2over =0.0, Pb2over_dT =0.0 ;
953 double cnst1over =0.0, cnst1over_dT =0.0 ;
954
955 int flg_overgiven =0 ;
956 int Coovlps =0, Coovlpd =0 ;
957 double Lovers =0.0, Loverd =0.0 ;
958 double Novers =0.0, Noverd =0.0 ;
959 double Nover_func =0.0 ;
960 double cnst0over_func =0.0, cnst0over_func_dT =0.0 ;
961 /* Qover Analytical Model */
962 int lp_ld;
963 double Ta = 9.3868e-3, Tb = -0.1047839 ;
964 double Tc, Tc_dT ;
965 double Td, Td_dVxb, Td_dVgb, Td_dT ;
966 double Tv, Tv_dVxb, Tv_dVgb, Tv_dT ;
967 double Tu, Tu_dVxb, Tu_dVgb, Tu_dT ;
968 double Tp, Tp_dT ;
969 double Tq, Tq_dVxb, Tq_dVgb, Tq_dT ;
970 double T1_dVxb, T1_dVgb ;
971 double T5_dVxb, T5_dVgb ;
972 double VgpLD_shift, VgpLD_shift_dT ;
973 double VgpLD_shift_dVgb, VgpLD_shift_dVxb, exp_bVbs_dVxb ;
974 double gamma, gamma_dVxb, gamma_dT ;
975 double psi , psi_dVgb , psi_dVxb , psi_dT ;
976 double Chi_A, Chi_A_dVgb, Chi_A_dVxb, Chi_A_dT ;
977 double Chi_B, Chi_B_dVgb, Chi_B_dVxb, Chi_B_dT ;
978
979 double psi_B =0.0, arg_B =0.0 ;
980 double Chi_1 =0.0, Chi_1_dVgb =0.0, Chi_1_dVxb =0.0, Chi_1_dT =0.0 ;
981
982 /* global variables for depletion mode MOSFET */
983 double Pb2n_dT, Vbipn_dT = 0.0, depmphn0_dT = 0.0, depVmax_dT = 0.0 ;
984 double Qiu_noi, Qi_noi ;
985
986
987 /*================ Start of executable code.=================*/
988
989
990 if (here->HSMHV2_mode == HiSIM_NORMAL_MODE) {
991 ModeNML = 1.0 ;
992 ModeRVS = 0.0 ;
993 } else {
994 ModeNML = 0.0 ;
995 ModeRVS = 1.0 ;
996 }
997
998 T1 = Vdse + Vgse + Vbse + Vds + Vgs + Vbs + vbd_jct + vbs_jct ;
999 if ( ! finite (T1) ) {
1000 fprintf (stderr ,
1001 "*** warning(HiSIM_HV(%s)): Unacceptable Bias(es).\n",model->HSMHV2modName ) ;
1002 fprintf (stderr , "----- bias information (HiSIM_HV)\n" ) ;
1003 fprintf (stderr , "name: %s\n" , here->HSMHV2name ) ;
1004 fprintf (stderr , "states: %d\n" , here->HSMHV2states ) ;
1005 fprintf (stderr , "Vdse= %.3e Vgse=%.3e Vbse=%.3e\n"
1006 , Vdse , Vgse , Vbse ) ;
1007 fprintf (stderr , "Vdsi= %.3e Vgsi=%.3e Vbsi=%.3e\n"
1008 , Vds , Vgs , Vbs ) ;
1009 fprintf (stderr , "vbs_jct= %12.5e vbd_jct= %12.5e\n"
1010 , vbs_jct , vbd_jct ) ;
1011 fprintf (stderr , "vd= %.3e vs= %.3e vdp= %.3e vgp= %.3e vbp= %.3e vsp= %.3e\n"
1012 , *( ckt->CKTrhsOld + here->HSMHV2dNode )
1013 , *( ckt->CKTrhsOld + here->HSMHV2sNode )
1014 , *( ckt->CKTrhsOld + here->HSMHV2dNodePrime )
1015 , *( ckt->CKTrhsOld + here->HSMHV2gNodePrime )
1016 , *( ckt->CKTrhsOld + here->HSMHV2bNodePrime )
1017 , *( ckt->CKTrhsOld + here->HSMHV2sNodePrime ) ) ;
1018 fprintf (stderr , "----- bias information (end)\n" ) ;
1019 return ( HiSIM_ERROR ) ;
1020 }
1021
1022 flg_info = model->HSMHV2_info ;
1023 flg_nqs = model->HSMHV2_conqs ;
1024
1025 /*-----------------------------------------------------------*
1026 * Start of the routine. (label)
1027 *-----------------*/
1028 /* start_of_routine: */
1029
1030 /*-----------------------------------------------------------*
1031 * Temperature dependent constants.
1032 *-----------------*/
1033 if ( here->HSMHV2tempNode > 0 && pParam->HSMHV2_rth0 != 0.0 ) {
1034
1035 #define HSMHV2EVAL
1036 #include "hsmhv2temp_eval.h"
1037
1038 } else {
1039 beta = here->HSMHV2_beta ;
1040 TTEMP = ckt->CKTtemp ;
1041 if ( here->HSMHV2_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV2_dtemp ; }
1042 Eg_dT = 0.0 ;
1043 beta_dT = 0.0 ;
1044 beta_inv_dT = 0.0 ;
1045 mphn0_dT = 0.0 ;
1046 ptovr_dT = 0.0 ;
1047 Vmax_dT = 0.0 ;
1048 Pb2_dT = 0.0 ;
1049 cnst0_dT = 0.0 ;
1050 cnst1_dT = 0.0 ;
1051 Nin_dT = 0.0 ;
1052
1053 /* depletion MOS */
1054 Pb2n_dT = 0.0 ;
1055 Vbipn_dT = 0.0 ;
1056 depmphn0_dT = 0.0 ;
1057 depVmax_dT = 0.0 ;
1058
1059 }
1060
1061 /* Inverse of the thermal voltage */
1062 beta_inv = here->HSMHV2_beta_inv ;
1063 beta2 = here->HSMHV2_beta2 ;
1064
1065 /* Bandgap */
1066 Egp12 = here->HSMHV2_egp12 ;
1067 Egp32 = here->HSMHV2_egp32 ;
1068
1069 /* Metallurgical channel geometry */
1070 Leff = here->HSMHV2_leff ;
1071 Weff = here->HSMHV2_weff ;
1072 WeffLD_nf = here->HSMHV2_weff_ld * here->HSMHV2_nf ;
1073
1074 Ldrift0 = here->HSMHV2_ldrift1 + here->HSMHV2_ldrift2 ;
1075
1076 /* Flat band voltage */
1077 Vfb = pParam->HSMHV2_vfbc ;
1078
1079 /* Surface impurity profile */
1080 q_Nsub = here->HSMHV2_qnsub ;
1081
1082 /* satulation Velocity */
1083 Vmax = here->HSMHV2_vmax ;
1084
1085
1086 /* 2 phi_B */
1087 Pb2 = here->HSMHV2_pb2 ;
1088 Pb20 = here->HSMHV2_pb20 ;
1089 Pb2c = here->HSMHV2_pb2c ;
1090
1091 /* Coefficient of the F function for bulk charge */
1092 cnst0 = here->HSMHV2_cnst0 ;
1093
1094 /* cnst1: n_{p0} / p_{p0} */
1095 cnst1 = here->HSMHV2_cnst1 ;
1096
1097 /* c_eox: Permitivity in ox */
1098 c_eox = here->HSMHV2_cecox ;
1099
1100 /* Tox and Cox without QME */
1101 Tox0 = model->HSMHV2_tox ;
1102 Cox0 = c_eox / Tox0 ;
1103 Cox0_inv = 1.0 / Cox0 ;
1104
1105 /* for calculation of Ps0_min */
1106 Vgs_min = model->HSMHV2_type * model->HSMHV2_vgsmin ;
1107
1108 /*---------------------------------------------------*
1109 * Determine clamping limits for too large Vbs (internal).
1110 *-----------------*/
1111
1112 Fn_SU( T1 , Pb2 - model->HSMHV2_vzadd0 , Vbs_max , 0.1 , T0 ) ;
1113 Vbs_max = T1 ;
1114 Vbs_max_dT = Pb2_dT * T0 ;
1115
1116 if ( Pb20 - model->HSMHV2_vzadd0 < Vbs_max ) {
1117 Vbs_max = Pb20 - model->HSMHV2_vzadd0 ;
1118 Vbs_max_dT = 0.0 ;
1119 }
1120 if ( Pb2c - model->HSMHV2_vzadd0 < Vbs_max ) {
1121 Vbs_max = Pb2c - model->HSMHV2_vzadd0 ;
1122 Vbs_max_dT = 0.0 ;
1123 }
1124
1125 if ( Vbs_bnd > Vbs_max * 0.5 ) {
1126 Vbs_bnd = 0.5 * Vbs_max ;
1127 Vbs_bnd_dT = 0.5 * Vbs_max_dT ;
1128 }
1129
1130
1131 if (here->HSMHV2_rs > 0.0 || here->HSMHV2_rd > 0.0) {
1132 if ( model->HSMHV2_corsrd == 1 ) flg_rsrd = 1 ;
1133 if ( model->HSMHV2_corsrd == 2 ) flg_rsrd = 2 ;
1134 if ( model->HSMHV2_corsrd == 3 ) flg_rsrd = 3 ;
1135 }
1136
1137 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1138 * PART-1: Basic device characteristics.
1139 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
1140 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
1141 * Prepare for potential initial guesses using previous values
1142 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
1143
1144 flg_pprv = 0 ;
1145
1146 if ( here->HSMHV2_called >= 1 ) {
1147
1148 Vbsc_dif = Vbs - here->HSMHV2_vbsc_prv ;
1149 Vdsc_dif = Vds - here->HSMHV2_vdsc_prv ;
1150 Vgsc_dif = Vgs- here->HSMHV2_vgsc_prv ;
1151
1152 sum_vdif = fabs( Vbsc_dif ) + fabs( Vdsc_dif )
1153 + fabs( Vgsc_dif ) ;
1154
1155 if ( model->HSMHV2_copprv >= 1 && sum_vdif <= vtol_pprv &&
1156 here->HSMHV2_mode * here->HSMHV2_mode_prv > 0 ) { flg_pprv = 1 ;}
1157
1158 if ( here->HSMHV2_called >= 2 && flg_pprv == 1 ) {
1159 Vbsc_dif2 = here->HSMHV2_vbsc_prv - here->HSMHV2_vbsc_prv2 ;
1160 Vdsc_dif2 = here->HSMHV2_vdsc_prv - here->HSMHV2_vdsc_prv2 ;
1161 Vgsc_dif2 = here->HSMHV2_vgsc_prv - here->HSMHV2_vgsc_prv2 ;
1162 sum_vdif2 = fabs( Vbsc_dif2 ) + fabs( Vdsc_dif2 )
1163 + fabs( Vgsc_dif2 ) ;
1164 if ( epsm10 < sum_vdif2 && sum_vdif2 <= vtol_pprv &&
1165 here->HSMHV2_mode_prv * here->HSMHV2_mode_prv2 > 0 ) { flg_pprv = 2 ; }
1166 }
1167 Temp_dif = TTEMP - here->HSMHV2_temp_prv ;
1168
1169 } else {
1170
1171 Vbsc_dif = 0.0 ;
1172 Vdsc_dif = 0.0 ;
1173 Vgsc_dif = 0.0 ;
1174 sum_vdif = 0.0 ;
1175 Vbsc_dif2 = 0.0 ;
1176 Vdsc_dif2 = 0.0 ;
1177 Vgsc_dif2 = 0.0 ;
1178 sum_vdif2 = 0.0 ;
1179 flg_pprv = 0 ;
1180 Temp_dif = 0.0 ;
1181 }
1182
1183 dVbs = Vbsc_dif ;
1184 dVds = Vdsc_dif ;
1185 dVgs = Vgsc_dif ;
1186
1187 if ( flg_pprv >= 1 ) {
1188 Ps0 = here->HSMHV2_ps0_prv ;
1189 Ps0_dVbs = here->HSMHV2_ps0_dvbs_prv ;
1190 Ps0_dVds = here->HSMHV2_ps0_dvds_prv ;
1191 Ps0_dVgs = here->HSMHV2_ps0_dvgs_prv ;
1192
1193 Pds = here->HSMHV2_pds_prv ;
1194 Pds_dVbs = here->HSMHV2_pds_dvbs_prv ;
1195 Pds_dVds = here->HSMHV2_pds_dvds_prv ;
1196 Pds_dVgs = here->HSMHV2_pds_dvgs_prv ;
1197 }
1198
1199 if( here->HSMHV2_cordrift == 1 && here->HSMHV2subNode >= 0 ) {
1200 /*----------------------------------------------------------*
1201 * Considering these special cases:
1202 * ( here->HSMHV2_mode == HiSIM_NORMAL_MODE && Vdse < 0.0 )
1203 * ( here->HSMHV2_mode == HiSIM_REVERSE_MODE && Vdse < 0.0 )
1204 *----------------------------------------------------------*/
1205
1206 Vdsegmt = here->HSMHV2_mode * Vdse ; /* geometrical outer bias */
1207 if ( Vdsegmt >= 0.0 ) { /* vdse normal mode */
1208 Vdserev = Vdsegmt ;
1209 Vsubsrev = Vsubs ;
1210 } else { /* vdse reverse mode */
1211 Vdserev = - Vdsegmt ;
1212 Vsubsrev = Vsubs - Vdsegmt ;
1213 }
1214 here->HSMHV2_Vsubsrev = Vsubsrev ;
1215
1216 /*-----------------------------------------------------------*
1217 * Vxserevz: Modified bias introduced to realize symmetry at Vds=0.
1218 *-----------------*/
1219 Fn_SymAdd( Vzadd , Vdserev / 2 , model->HSMHV2_vzadd0 , T2 ) ;
1220 Vzadd_ext_dVd = T2 / 2 ;
1221 if ( Vzadd < ps_conv ) {
1222 Vzadd = ps_conv ;
1223 Vzadd_ext_dVd = 0.0 ;
1224 }
1225 Vdserevz = Vdserev + 2.0 * Vzadd ;
1226 Vdserevz_dVd = 1.0 + 2.0 * Vzadd_ext_dVd ;
1227 here->HSMHV2_Vdserevz = Vdserevz ;
1228 here->HSMHV2_Vdserevz_dVd = Vdserevz_dVd ;
1229
1230 }
1231
1232 if ( flg_rsrd == 1 || flg_rsrd == 3 ) {
1233
1234 /*----------------------------------------------------------*
1235 * Considering these special cases:
1236 * ( here->HSMHV2_mode == HiSIM_NORMAL_MODE && Vdse < 0.0 )
1237 * ( here->HSMHV2_mode == HiSIM_REVERSE_MODE && Vdse < 0.0 )
1238 *----------------------------------------------------------*/
1239
1240 Vdsegmt = here->HSMHV2_mode * Vdse ; /* geometrical outer bias */
1241 Vgsegmt = Vgse - ModeRVS * Vdse ; /* geometrical outer bias */
1242 Vbsegmt = Vbse - ModeRVS * Vdse ; /* geometrical outer bias */
1243 if ( Vdsegmt >= 0.0 ) { /* vdse normal mode */
1244 VdseModeNML = 1 ;
1245 VdseModeRVS = 0 ;
1246 Vdserev = Vdsegmt ;
1247 Vgserev = Vgsegmt ;
1248 Vbserev = Vbsegmt ;
1249 Vsubsrev = Vsubs ;
1250 } else { /* vdse reverse mode */
1251 VdseModeNML = 0 ;
1252 VdseModeRVS = 1 ;
1253 Vdserev = - Vdsegmt ;
1254 Vgserev = Vgsegmt - Vdsegmt ;
1255 Vbserev = Vbsegmt - Vdsegmt ;
1256 Vsubsrev = Vsubs - Vdsegmt ;
1257 }
1258
1259 if ( here->HSMHV2_rdvd > 0.0 || here->HSMHV2_rsvd > 0.0 || pParam->HSMHV2_rdvg11 > 0.0 || pParam->HSMHV2_rdvb > 0.0 || here->HSMHV2subNode >= 0 ) {
1260 /*-----------------------------------------------------------*
1261 * Vxserevz: Modified bias introduced to realize symmetry at Vds=0.
1262 *-----------------*/
1263 Fn_SymAdd( Vzadd , Vdserev / 2 , model->HSMHV2_vzadd0 , T2 ) ;
1264 Vzadd_ext_dVd = T2 / 2 ;
1265 if ( Vzadd < ps_conv ) {
1266 Vzadd = ps_conv ;
1267 Vzadd_ext_dVd = 0.0 ;
1268 }
1269 Vdserevz = Vdserev + 2.0 * Vzadd ;
1270 Vdserevz_dVd = 1.0 + 2.0 * Vzadd_ext_dVd ;
1271 Vgserevz = Vgserev + Vzadd ;
1272 Vgserevz_dVd = Vzadd_ext_dVd ;
1273 Vbserevz = Vbserev + Vzadd ;
1274 Vbserevz_dVd = Vzadd_ext_dVd ;
1275
1276 /* bias-dependent Rdrift for HVMOS/LDMOS */
1277
1278 if ( model->HSMHV2_cosym == 1 || VdseModeNML == 1 ) { /* HVMOS or normal mode LDMOS: */
1279 /* ... Vdse dependence */
1280 T1 = VdseModeNML * here->HSMHV2_rd + VdseModeRVS * here->HSMHV2_rs ;
1281 T1_dT = VdseModeNML * Rd0_dT + VdseModeRVS * Rs0_dT ;
1282 T0 = VdseModeNML * here->HSMHV2_rdvd + VdseModeRVS * here->HSMHV2_rsvd ;
1283 T0_dT = VdseModeNML * Rdvd_dT + VdseModeRVS * Rsvd_dT ;
1284 T4 = T1 + T0 * Vdserevz ;
1285 T4_dVd = T0 * Vdserevz_dVd ;
1286 T4_dT = T1_dT + T0_dT * Vdserevz ;
1287
1288 /* ... Vgse dependence */
1289 T10 = model->HSMHV2_rdvg12 + small ;
1290 T1 = T4 * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) ;
1291 T1_dVd = T4_dVd * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz / T10 ) )
1292 + T4 * pParam->HSMHV2_rdvg11 * ( - Vgserevz_dVd / T10 ) ;
1293 T1_dVg = T4 * pParam->HSMHV2_rdvg11 * ( - 1.0 ) / T10 ;
1294 T1_dT = T4_dT * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) ;
1295 Fn_SL2( T2 , T1 , T4 , rdsl2_dlt , T0 , T5 ) ;
1296 T2_dVd = T0 * T1_dVd + T5 * T4_dVd ;
1297 T2_dVg = T0 * T1_dVg ;
1298 T2_dT = T0 * T1_dT + T5 * T4_dT ;
1299
1300 T3 = T4 * ( 1.0 + pParam->HSMHV2_rdvg11 ) ;
1301 T3_dVd = T4_dVd * ( 1.0 + pParam->HSMHV2_rdvg11 ) ;
1302 T3_dT = T4_dT * ( 1.0 + pParam->HSMHV2_rdvg11 ) ;
1303 Fn_SU2( Rdrift , T2 , T3 , rdsu2_dlt , T0, T5 ) ;
1304 Rdrift_dVdse = T0 * T2_dVd + T5 * T3_dVd ;
1305 Rdrift_dVgse = T0 * T2_dVg ;
1306 Rdrift_dT = T0 * T2_dT + T5 * T3_dT ;
1307
1308 /* ... Vbse dependence */
1309 T1 = 1.0 - pParam->HSMHV2_rdvb * Vbserevz ;
1310 T1_dVb = - pParam->HSMHV2_rdvb ;
1311 T1_dVd = - pParam->HSMHV2_rdvb * Vbserevz_dVd ;
1312 Fn_SZ( T3 , T1 , rdsz_dlt , T4 ) ;
1313 T3 += small ;
1314 T3_dVb = T4 * T1_dVb ;
1315 T3_dVd = T4 * T1_dVd ;
1316 T0 = Rdrift ;
1317 Rdrift = Rdrift * T3 ;
1318 Rdrift_dVdse = Rdrift_dVdse * T3 + T0 * T3_dVd ;
1319 Rdrift_dVgse = Rdrift_dVgse * T3 ;
1320 Rdrift_dVbse = + T0 * T3_dVb ;
1321 Rdrift_dT = Rdrift_dT * T3 ;
1322
1323 } else { /* reverse mode LDMOS: */
1324 Rdrift = here->HSMHV2_rs ;
1325 Rdrift_dVdse = 0.0 ;
1326 Rdrift_dVgse = 0.0 ;
1327 Rdrift_dVbse = 0.0 ;
1328 Rdrift_dT = Rs0_dT ;
1329 }
1330
1331
1332 /* Rsdrift */
1333 T4 = ( VdseModeNML * here->HSMHV2_rs + VdseModeRVS * here->HSMHV2_rd ) ;
1334 T4_dT = VdseModeNML * Rs0_dT + VdseModeRVS * Rd0_dT ;
1335 T4_dVd = 0.0 ;
1336
1337 if ( model->HSMHV2_cosym == 1 || VdseModeRVS == 1 ) { /* HVMOS or reverse mode LDMOS: */
1338 /* ... Vdse dependence */
1339 T0 = VdseModeNML * here->HSMHV2_rsvd + VdseModeRVS * here->HSMHV2_rdvd ;
1340 T0_dT = VdseModeNML * Rsvd_dT + VdseModeRVS * Rdvd_dT ;
1341 T4 = T4 + T0 * ( 2.0 * model->HSMHV2_vzadd0 ) ;
1342 T4_dT = T4_dT + T0_dT * ( 2.0 * model->HSMHV2_vzadd0 ) ;
1343
1344 /* ... Vgse dependence */
1345 T10 = model->HSMHV2_rdvg12 + small ;
1346 T1 = T4 * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) ;
1347 T1_dVd = T4_dVd * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz / T10 ) )
1348 + T4 * pParam->HSMHV2_rdvg11 * ( - Vgserevz_dVd / T10 ) ;
1349 T1_dVg = T4 * pParam->HSMHV2_rdvg11 * ( - 1.0 ) / T10 ;
1350 T1_dT = T4_dT * ( 1.0 + pParam->HSMHV2_rdvg11 * ( 1.0 - Vgserevz / T10 ) ) ;
1351 Fn_SL2( T2 , T1 , T4 , rdsl2_dlt , T0 , T5 ) ;
1352 T2_dVd = T0 * T1_dVd + T5 * T4_dVd ;
1353 T2_dVg = T0 * T1_dVg ;
1354 T2_dT = T0 * T1_dT + T5 * T4_dT ;
1355
1356 T3 = T4 * ( 1.0 + pParam->HSMHV2_rdvg11 ) ;
1357 T3_dVd = T4_dVd * ( 1.0 + pParam->HSMHV2_rdvg11 ) ;
1358 T3_dT = T4_dT * ( 1.0 + pParam->HSMHV2_rdvg11 ) ;
1359 Fn_SU2( Rsdrift , T2 , T3 , rdsu2_dlt , T0, T5 ) ;
1360 Rsdrift_dVdse = T0 * T2_dVd + T5 * T3_dVd ;
1361 Rsdrift_dVgse = T0 * T2_dVg ;
1362 Rsdrift_dT = T0 * T2_dT + T5 * T3_dT ;
1363
1364 /* ... Vbse dependence */
1365 T1 = 1.0 - pParam->HSMHV2_rdvb * Vbserevz ;
1366 T1_dVb = - pParam->HSMHV2_rdvb ;
1367 T1_dVd = - pParam->HSMHV2_rdvb * Vbserevz_dVd ;
1368 Fn_SZ( T3 , T1 , rdsz_dlt , T4 ) ;
1369 T3 += small ;
1370 T3_dVb = T4 * T1_dVb ;
1371 T3_dVd = T4 * T1_dVd ;
1372 T0 = Rsdrift ;
1373 Rsdrift = Rsdrift * T3 ;
1374 Rsdrift_dVdse = Rsdrift_dVdse * T3 + T0 * T3_dVd ;
1375 Rsdrift_dVgse = Rsdrift_dVgse * T3 ;
1376 Rsdrift_dVbse = + T0 * T3_dVb ;
1377 Rsdrift_dT = Rsdrift_dT * T3 ;
1378 } else { /* LDMOS normal mode: */
1379 Rsdrift = here->HSMHV2_rs ;
1380 Rsdrift_dVdse = 0.0 ;
1381 Rsdrift_dVgse = 0.0 ;
1382 Rsdrift_dVbse = 0.0 ;
1383 Rsdrift_dT = Rs0_dT ;
1384 }
1385
1386
1387 if ( here->HSMHV2subNode >= 0 && model->HSMHV2_cosym == 0 &&
1388 ( pParam->HSMHV2_nover * ( NSUBSUB + pParam->HSMHV2_nover ) ) > 0 ) {
1389 /* external substrate node exists && LDMOS case: */
1390 /* Substrate Effect */
1391 T0 = VBISUB - RDVDSUB * Vdserevz - RDVSUB * Vsubsrev ;
1392 Fn_SZ( T1, T0, 10.0, T2 ) ;
1393 T1 += epsm10 ;
1394
1395 T1_dVdserev = - RDVDSUB * Vdserevz_dVd * T2 ;
1396 T1_dVsubsrev = - RDVSUB * T2 ;
1397
1398 T0 = NSUBSUB / ( pParam->HSMHV2_nover * ( NSUBSUB + pParam->HSMHV2_nover ) ) ;
1399 T4 = 2 * C_ESI / C_QE * T0 ;
1400 Wdep = sqrt ( T4 * T1 ) + small ;
1401 Wdep_dVdserev = 0.5 * T4 * T1_dVdserev / Wdep ;
1402 Wdep_dVsubsrev = 0.5 * T4 * T1_dVsubsrev / Wdep ;
1403
1404 Fn_SU( Wdep, Wdep, DDRIFT, C_sub_delta * DDRIFT, T0 ) ;
1405 Wdep_dVdserev *= T0 ;
1406 Wdep_dVsubsrev *= T0 ;
1407
1408 T0 = DDRIFT - Wdep ;
1409 Fn_SZ( T0, T0, C_sub_delta2, T2 ) ;
1410 T0 += epsm10;
1411 T6 = Ldrift0 / T0 ;
1412 T6_dVdserev = T2 * Wdep_dVdserev * T6 / T0 ;
1413 T6_dVsubsrev = T2 * Wdep_dVsubsrev * T6 / T0 ;
1414
1415 if ( VdseModeNML == 1 ) { /* Vdse normal mode: */
1416 T0 = Rdrift ;
1417 Rdrift = T0 * T6 ;
1418 Rdrift_dVdse = Rdrift_dVdse * T6 + T0 * T6_dVdserev ;
1419 Rdrift_dVgse = Rdrift_dVgse * T6 ;
1420 Rdrift_dVbse = Rdrift_dVbse * T6 ;
1421 Rdrift_dVsubs= T0 * T6_dVsubsrev ;
1422 Rdrift_dT = Rdrift_dT * T6 ;
1423 } else { /* Vdse reverse mode: */
1424 T0 = Rsdrift ;
1425 Rsdrift = T0 * T6 ;
1426 Rsdrift_dVdse = Rsdrift_dVdse * T6 + T0 * T6_dVdserev ;
1427 Rsdrift_dVgse = Rsdrift_dVgse * T6 ;
1428 Rsdrift_dVbse = Rsdrift_dVbse * T6 ;
1429 Rsdrift_dVsubs = T0 * T6_dVsubsrev ;
1430 Rsdrift_dT = Rsdrift_dT * T6 ;
1431 }
1432 }
1433
1434 Rd = Rdrift ;
1435 Rd_dVgse = Rdrift_dVgse ;
1436 Rd_dVdse = Rdrift_dVdse ;
1437 Rd_dVbse = Rdrift_dVbse ;
1438 Rd_dVsubs = Rdrift_dVsubs ;
1439 Rd_dT = Rdrift_dT ;
1440 Rs = Rsdrift ;
1441 Rs_dVgse = Rsdrift_dVgse ;
1442 Rs_dVdse = Rsdrift_dVdse ;
1443 Rs_dVbse = Rsdrift_dVbse ;
1444 Rs_dVsubs = Rsdrift_dVsubs ;
1445 Rs_dT = Rsdrift_dT ;
1446
1447 } else { /* bias-independent Rs/Rd */
1448 Rd = VdseModeNML * here->HSMHV2_rd + VdseModeRVS * here->HSMHV2_rs ;
1449 Rd_dT = VdseModeNML * Rd0_dT + VdseModeRVS * Rs0_dT ;
1450 Rs = VdseModeNML * here->HSMHV2_rs + VdseModeRVS * here->HSMHV2_rd ;
1451 Rs_dT = VdseModeNML * Rs0_dT + VdseModeRVS * Rd0_dT ;
1452 }
1453
1454 /* Weff dependence of the resistances */
1455 Rd = Rd / WeffLD_nf ;
1456 Rd_dVgse /= WeffLD_nf ;
1457 Rd_dVdse /= WeffLD_nf ;
1458 Rd_dVbse /= WeffLD_nf ;
1459 Rd_dVsubs /= WeffLD_nf ;
1460 Rd_dT /= WeffLD_nf ;
1461 Rs = Rs / WeffLD_nf ;
1462 Rs_dVgse /= WeffLD_nf ;
1463 Rs_dVdse /= WeffLD_nf ;
1464 Rs_dVbse /= WeffLD_nf ;
1465 Rs_dVsubs /= WeffLD_nf ;
1466 Rs_dT /= WeffLD_nf ;
1467
1468 /* Sheet resistances are added. */
1469 Rd += VdseModeNML * here->HSMHV2_rd0 + VdseModeRVS * here->HSMHV2_rs0 ;
1470 Rs += VdseModeNML * here->HSMHV2_rs0 + VdseModeRVS * here->HSMHV2_rd0 ;
1471
1472 /* Re-stamps for hsmhvnoi.c */
1473 /* Please see hsmhvnoi.c */
1474 T0 = VdseModeNML * Rd + VdseModeRVS * Rs ; /* mode-dependent --> geometrical */
1475 if ( T0 > Res_min && model->HSMHV2_cothrml != 0 ) here->HSMHV2drainConductance = Mfactor / T0 ;
1476 else here->HSMHV2drainConductance = 0.0 ;
1477 T0 = VdseModeNML * Rs + VdseModeRVS * Rd ; /* mode-dependent --> geometrical */
1478 if ( T0 > Res_min && model->HSMHV2_cothrml != 0 ) here->HSMHV2sourceConductance = Mfactor / T0 ;
1479 else here->HSMHV2sourceConductance = 0.0 ;
1480
1481 } /* end of case flg_rsrd=1 or flg_rsrd=3 */
1482
1483
1484 /* Clamping for Vbs > Vbs_bnd */
1485 if ( Vbs > Vbs_bnd ) {
1486 T1 = Vbs - Vbs_bnd ;
1487 T2 = Vbs_max - Vbs_bnd ;
1488 T1_dT = - Vbs_bnd_dT ;
1489 T2_dT = Vbs_max_dT - Vbs_bnd_dT ;
1490
1491 Fn_SUPoly4m( TY , T1 , T2 , Vbscl_dVbs , T0 ) ;
1492 TY_dT = T1_dT * Vbscl_dVbs + T2_dT * T0 ;
1493
1494 Vbscl = Vbs_bnd + TY ;
1495 Vbscl_dT = Vbs_bnd_dT + TY_dT ;
1496
1497 T3 = 1 / T2 ;
1498
1499 /* x/xmax */
1500 T4 = T1 * T3 ;
1501 T4_dVb = T3 ;
1502 T4_dT = T1_dT * T3 - T1*T3*T3*T2_dT;
1503 T4_dVb_dT = -T3*T3*T2_dT ;
1504
1505 T5 = T4 * T4;
1506 T5_dVb = 2 * T4_dVb * T4 ;
1507 T5_dT = 2.0*T4*T4_dT;
1508 T5_dVb_dT = 2 * T4_dVb_dT * T4 + 2 * T4_dVb * T4_dT ;
1509 T15 = 2 * T4_dVb * T4_dVb ; /* T15 = T5_dVb_dVb */
1510
1511 T6 = T4 * T5 ;
1512 T6_dVb = T4_dVb * T5 + T4 * T5_dVb ;
1513 T6_dT = T4_dT * T5 + T4 * T5_dT ;
1514 T6_dVb_dT = T4_dVb_dT * T5 + T4_dVb * T5_dT + T4_dT * T5_dVb + T4*T5_dVb_dT ;
1515 T16 = T4_dVb * T5_dVb + T4_dVb * T5_dVb + T4 * T15 ; /* T16 = T6_dVb_dVb */
1516
1517 /* T7 = Z T7_dVb = dZ_dVb T17 = dZ_dVb_dVb */
1518 T7 = 1 + T4 + T5 + T6 + T5 * T5 ;
1519 T7_dVb = T4_dVb + T5_dVb + T6_dVb + 2 * T5_dVb * T5 ;
1520 T7_dT = T4_dT + T5_dT + T6_dT + 2 * T5_dT * T5 ;
1521 T7_dVb_dT = T4_dVb_dT + T5_dVb_dT + T6_dVb_dT + 2 * T5_dVb_dT * T5 + 2 * T5_dVb * T5_dT ;
1522 T17 = T15 + T16 + 2 * T15 * T5 + 2 * T5_dVb * T5_dVb ;
1523
1524 T8 = T7 * T7 ;
1525 T8_dVb = 2 * T7_dVb * T7 ;
1526 T8_dT = 2 * T7_dT * T7 ;
1527
1528 T9 = 1 / T8 ;
1529 T9_dVb = - T8_dVb * T9 * T9 ;
1530 T9_dT = - T8_dT * T9 * T9 ;
1531
1532 Vbscl_dVbs = T2 * T7_dVb * T9 ;
1533 Vbscl_dVbs_dT = T2_dT * T7_dVb * T9 + T2*(T7_dVb_dT * T9+ T7_dVb * T9_dT);
1534 Vbscl_dVbs_dVbs = T2 * ( T17 * T9 + T7_dVb * T9_dVb ) ;
1535 } else {
1536 Vbscl = Vbs ;
1537 Vbscl_dVbs = 1.0 ;
1538 Vbscl_dT = 0.0 ;
1539 Vbscl_dVbs_dVbs = 0.0 ;
1540 }
1541
1542 /*-----------------------------------------------------------*
1543 * Vxsz: Modified bias introduced to realize symmetry at Vds=0.
1544 *-----------------*/
1545
1546
1547 T1 = Vbscl_dVbs * Vds / 2 ;
1548 Fn_SymAdd( Vzadd , T1 , model->HSMHV2_vzadd0 , T2 ) ;
1549 Vzadd_dVbs = T2 * Vbscl_dVbs_dVbs * Vds / 2 ;
1550 Vzadd_dT = T2 * Vbscl_dVbs_dT * Vds / 2 ;
1551 T2 *= Vbscl_dVbs / 2 ;
1552 Vzadd_dVds = T2 ;
1553
1554 if ( Vzadd < ps_conv ) {
1555 Vzadd = ps_conv ;
1556 Vzadd_dVds = 0.0 ;
1557 Vzadd_dVbs = 0.0 ;
1558 Vzadd_dT = 0.0 ;
1559 }
1560
1561 Vbsz = Vbscl + Vzadd ;
1562 Vbsz_dVbs = Vbscl_dVbs + Vzadd_dVbs ;
1563 Vbsz_dVds = Vzadd_dVds ;
1564 Vbsz_dT = Vbscl_dT + Vzadd_dT;
1565
1566 Vdsz = Vds + 2.0 * Vzadd ;
1567 Vdsz_dVbs = 2.0 * Vzadd_dVbs ;
1568 Vdsz_dVds = 1.0 + 2.0 * Vzadd_dVds ;
1569 Vdsz_dT = 2.0 * Vzadd_dT ;
1570
1571 Vgsz = Vgs + Vzadd ;
1572 Vgsz_dVbs = Vzadd_dVbs ;
1573 Vgsz_dVgs = 1.0 ;
1574 Vgsz_dVds = Vzadd_dVds ;
1575 Vgsz_dT = Vzadd_dT ;
1576
1577 /*---------------------------------------------------*
1578 * Factor of modification for symmetry.
1579 *-----------------*/
1580
1581 T1 = here->HSMHV2_qnsub_esi * Cox0_inv * Cox0_inv ;
1582 T2 = Vgs - Vfb ;
1583 T3 = 1 + 2.0 / T1 * ( T2 - 1.0 / here->HSMHV2_betatnom - Vbscl ) ;
1584
1585 Fn_SZ( T4 , T3 , 1e-3 , T5 ) ;
1586 T4 += small ;
1587 TX = sqrt( T4 ) ;
1588 Pslsat = T2 + T1 * ( 1.0 - TX ) ;
1589 VdsatS = Pslsat - Pb2c ;
1590 Fn_SL( VdsatS , VdsatS , 0.1 , 5e-2 , T6 ) ;
1591
1592 VdsatS_dVbs = ( TX ? (T6 * T5 / TX * Vbscl_dVbs) : 0.0 ) ;
1593 VdsatS_dVds = 0.0 ;
1594 VdsatS_dVgs = ( TX ? (T6 * ( 1.0 - T5 / TX )) : 0.0 ) ;
1595 VdsatS_dT = (TX ? (T6* T5/TX * Vbscl_dT) : 0) ;
1596
1597 T1 = Vds / VdsatS ;
1598 Fn_SUPoly4( TX , T1 , 1.0 , T0 ) ;
1599 FMDVDS = TX * TX ;
1600 T2 = 2 * TX * T0 ;
1601 T3 = T2 / ( VdsatS * VdsatS ) ;
1602 FMDVDS_dVbs = T3 * ( - Vds * VdsatS_dVbs ) ;
1603 FMDVDS_dVds = T3 * ( 1.0 * VdsatS - Vds * VdsatS_dVds ) ;
1604 FMDVDS_dVgs = T3 * ( - Vds * VdsatS_dVgs ) ;
1605 FMDVDS_dT = T3 * ( - Vds * VdsatS_dT ) ;
1606
1607 /*-----------------------------------------------------------*
1608 * Quantum effect
1609 *-----------------*/
1610 if ( model->HSMHV2_flg_qme == 0 ) {
1611 flg_qme = 0 ;
1612 } else {
1613 flg_qme = 1 ;
1614 }
1615
1616 T1 = here->HSMHV2_2qnsub_esi ;
1617 T2 = sqrt( T1 * Pb20 ) ;
1618 Vthq = Pb20 + Vfb + T2 * Cox0_inv ;
1619 Vthq_dVb = 0.0 ;
1620 Vthq_dVd = 0.0 ;
1621
1622 if ( flg_qme == 0 ) {
1623 Tox = Tox0 ;
1624 Tox_dVb = 0.0 ;
1625 Tox_dVd = 0.0 ;
1626 Tox_dVg = 0.0 ;
1627 Tox_dT = 0.0 ;
1628
1629 Cox = Cox0 ;
1630 Cox_dVb = 0.0 ;
1631 Cox_dVd = 0.0 ;
1632 Cox_dVg = 0.0 ;
1633 Cox_dT = 0.0 ;
1634
1635 Cox_inv = Cox0_inv ;
1636 Cox_inv_dVb = 0.0 ;
1637 Cox_inv_dVd = 0.0 ;
1638 Cox_inv_dVg = 0.0 ;
1639 Cox_inv_dT = 0.0 ;
1640
1641 T0 = cnst0 * cnst0 * Cox_inv ;
1642 cnstCoxi = T0 * Cox_inv ;
1643 cnstCoxi_dVb = 0.0 ;
1644 cnstCoxi_dVd = 0.0 ;
1645 cnstCoxi_dVg = 0.0 ;
1646 cnstCoxi_dT = 2.0 * cnst0 * cnst0_dT * Cox_inv * Cox_inv ;
1647
1648 } else {
1649
1650 T5 = Vgs - Vbs - Vthq + model->HSMHV2_qme2 ;
1651 T5_dVb = -1.0 - Vthq_dVb ;
1652 T5_dVd = - Vthq_dVd ;
1653 T5_dVg = 1.0 ;
1654 T5_dT = 0.0 ;
1655
1656 Fn_SZ( T2 , T5 , qme_dlt, T3) ;
1657 T2 = T2 + small ;
1658 T2_dVb = T3 * T5_dVb ;
1659 T2_dVd = T3 * T5_dVd ;
1660 T2_dVg = T3 * T5_dVg ;
1661 T2_dT = T3 * T5_dT ;
1662
1663 T3 = 1.0 / T2 ;
1664 T7 = -1.0 / ( T2 * T2 ) ;
1665 T3_dVb = T7 * T2_dVb ;
1666 T3_dVd = T7 * T2_dVd ;
1667 T3_dVg = T7 * T2_dVg ;
1668 T3_dT = T7 * T2_dT ;
1669
1670 T4 = 2.0 * fabs(Vthq) ;
1671 T6 = T5 - Vgs + Vfb ;
1672 if(T6 > T4) { T4 = T6; }
1673
1674 Fn_SU( T2 , T3 , 1.0 / T4 , qme_dlt, T6 ) ;
1675 T2_dVb = T6 * T3_dVb ;
1676 T2_dVd = T6 * T3_dVd ;
1677 T2_dVg = T6 * T3_dVg ;
1678 T2_dT = T6 * T3_dT ;
1679
1680 dTox = model->HSMHV2_qme1 * T2 + model->HSMHV2_qme3 ;
1681 T7 = model->HSMHV2_qme1 ;
1682 dTox_dVb = T7 * T2_dVb ;
1683 dTox_dVd = T7 * T2_dVd ;
1684 dTox_dVg = T7 * T2_dVg ;
1685 dTox_dT = T7 * T2_dT ;
1686
1687 if ( dTox * 1.0e12 < Tox0 ) {
1688 dTox = 0.0 ;
1689 dTox_dVb = 0.0 ;
1690 dTox_dVd = 0.0 ;
1691 dTox_dVg = 0.0 ;
1692 dTox_dT = 0.0 ;
1693 flg_qme = 0 ;
1694 }
1695
1696 Tox = Tox0 + dTox ;
1697 Tox_dVb = dTox_dVb ;
1698 Tox_dVd = dTox_dVd ;
1699 Tox_dVg = dTox_dVg ;
1700 Tox_dT = dTox_dT ;
1701
1702 Cox = c_eox / Tox ;
1703 T1 = - c_eox / ( Tox * Tox ) ;
1704 Cox_dVb = T1 * Tox_dVb ;
1705 Cox_dVd = T1 * Tox_dVd ;
1706 Cox_dVg = T1 * Tox_dVg ;
1707 Cox_dT = T1 * Tox_dT ;
1708
1709 Cox_inv = Tox / c_eox ;
1710 T1 = 1.0 / c_eox ;
1711 Cox_inv_dVb = T1 * Tox_dVb ;
1712 Cox_inv_dVd = T1 * Tox_dVd ;
1713 Cox_inv_dVg = T1 * Tox_dVg ;
1714 Cox_inv_dT = T1 * Tox_dT ;
1715
1716 T0 = cnst0 * cnst0 * Cox_inv ;
1717 cnstCoxi = T0 * Cox_inv ;
1718 T1 = 2.0 * T0 ;
1719 cnstCoxi_dVb = T1 * Cox_inv_dVb ;
1720 cnstCoxi_dVd = T1 * Cox_inv_dVd ;
1721 cnstCoxi_dVg = T1 * Cox_inv_dVg ;
1722 cnstCoxi_dT = 2.0 * cnst0 * cnst0_dT * Cox_inv * Cox_inv + T1 * Cox_inv_dT;
1723 }
1724
1725 /*---------------------------------------------------*
1726 * Vbsz2 : Vbs for dVth
1727 *-----------------*/
1728 Vbsz2 = Vbsz ;
1729 Vbsz2_dVbs = Vbsz_dVbs ;
1730 Vbsz2_dVds = Vbsz_dVds ;
1731 Vbsz2_dVgs = 0.0 ;
1732 Vbsz2_dT = Vbsz_dT ;
1733
1734 /*---------------------------------------------------*
1735 * Vthp : Vth with pocket.
1736 *-----------------*/
1737 T1 = here->HSMHV2_2qnsub_esi ;
1738 Qb0 = sqrt (T1 * (Pb20 - Vbsz2)) ;
1739 T2 = 0.5 * T1 / Qb0 ;
1740 Qb0_dVb = T2 * (- Vbsz2_dVbs) ;
1741 Qb0_dVd = T2 * (- Vbsz2_dVds) ;
1742 Qb0_dVg = T2 * (- Vbsz2_dVgs) ;
1743 Qb0_dT = T2 * (- Vbsz2_dT) ;
1744
1745 Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSMHV2_ptovr;
1746 Vthp_dVb = Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ;
1747 Vthp_dVd = Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ;
1748 Vthp_dVg = Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ;
1749 Vthp_dT = Qb0_dT * Cox_inv + Qb0 * Cox_inv_dT + ptovr_dT ;
1750
1751 Pb20b = Pb20 ;
1752 Pb20b_dVb = 0.0 ;
1753 Pb20b_dVd = 0.0 ;
1754 Pb20b_dVg = 0.0 ;
1755 Pb20b_dT = 0.0 ;
1756
1757 T0 = 0.95 ;
1758 T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ;
1759 T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ;
1760 T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ;
1761 T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ;
1762 T1_dT = T0 * Pb20b_dT - Vbsz2_dT ;
1763 T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ;
1764 T3 = T0 * Pb20b - 0.5 * (T1 + T2) ;
1765 T4 = 2.0 * T0 * 1.0e-3 ;
1766 T5 = T1 / T2 ;
1767 T6 = T4 / T2 ;
1768 T3_dVb = T0 * Pb20b_dVb
1769 - 0.5 * (T1_dVb + (T1_dVb * T5 + T6 * Pb20b_dVb ) ) ;
1770 T3_dVd = T0 * Pb20b_dVd
1771 - 0.5 * (T1_dVd + (T1_dVd * T5 + T6 * Pb20b_dVd ) ) ;
1772 T3_dVg = T0 * Pb20b_dVg
1773 - 0.5 * (T1_dVg + (T1_dVg * T5 + T6 * Pb20b_dVg ) ) ;
1774 T3_dT = T0 * Pb20b_dT
1775 - 0.5 * (T1_dT + (T1_dT * T5 + T6 * Pb20b_dT ) ) ;
1776 Pbsum = Pb20b - T3 ;
1777 Pbsum_dVb = Pb20b_dVb - T3_dVb ;
1778 Pbsum_dVd = Pb20b_dVd - T3_dVd ;
1779 Pbsum_dVg = Pb20b_dVg - T3_dVg ;
1780 Pbsum_dT = Pb20b_dT - T3_dT ;
1781
1782 if( model->HSMHV2_codep ) {
1783 Pbsum = Pbsum + model->HSMHV2_depeta * Vdsz ;
1784 Pbsum_dVb = Pbsum_dVb + model->HSMHV2_depeta * Vdsz_dVbs ;
1785 Pbsum_dVd = Pbsum_dVd + model->HSMHV2_depeta * Vdsz_dVds ;
1786 }
1787
1788 sqrt_Pbsum = sqrt( Pbsum ) ;
1789
1790 /*-------------------------------------------*
1791 * dVthLP : Short-channel effect induced by pocket.
1792 * - Vth0 : Vth without pocket.
1793 *-----------------*/
1794 if ( model->HSMHV2_lp != 0.0 ) {
1795 T1 = here->HSMHV2_2qnsub_esi ;
1796 T2 = model->HSMHV2_bs2 - Vbsz2 ;
1797 T3 = T2 + small ;
1798 T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ;
1799 T5 = 0.5 * (T3 + T4) ;
1800 T6 = 0.5 * (1.0 + T3 / T4) ;
1801 T5_dVb = - Vbsz2_dVbs * T6 ;
1802 T5_dVd = - Vbsz2_dVds * T6 ;
1803 T5_dVg = - Vbsz2_dVgs * T6 ;
1804 T5_dT = - Vbsz2_dT * T6 ;
1805 T7 = 1.0 / T5 ;
1806 bs12 = model->HSMHV2_bs1 * T7 ;
1807 T8 = - bs12 * T7 ;
1808 bs12_dVb = T8 * T5_dVb ;
1809 bs12_dVd = T8 * T5_dVd ;
1810 bs12_dVg = T8 * T5_dVg ;
1811 bs12_dT = T8 * T5_dT ;
1812 Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ;
1813 Qbmm = sqrt (T1 * (Pb20 - T10 )) ;
1814 T9 = T0 / Qbmm ;
1815 Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ;
1816 Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ;
1817 Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ;
1818 Qbmm_dT = 0.5 * T1 * - (Vbsz2_dT + bs12_dT) * T9 ;
1819
1820 dqb = (Qb0 - Qbmm) * Cox_inv ;
1821 dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv - Qbmm * Cox_inv_dVb ;
1822 dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv - Qbmm * Cox_inv_dVd ;
1823 dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv - Qbmm * Cox_inv_dVg ;
1824 dqb_dT = Qb0_dT * Cox_inv + Qb0 * Cox_inv_dT - Qbmm_dT * Cox_inv - Qbmm * Cox_inv_dT ;
1825
1826 T1 = 2.0 * C_QE * here->HSMHV2_nsubc * C_ESI ;
1827 T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ;
1828 Vth0 = Pb2c + Vfb + T2 * Cox_inv ;
1829 T3 = 0.5 * T1 / T2 * Cox_inv ;
1830 Vth0_dVb = T3 * ( - Vbsz2_dVbs ) + T2 * Cox_inv_dVb ;
1831 Vth0_dVd = T3 * ( - Vbsz2_dVds ) + T2 * Cox_inv_dVd ;
1832 Vth0_dVg = T3 * ( - Vbsz2_dVgs ) + T2 * Cox_inv_dVg ;
1833 Vth0_dT = T3 * ( - Vbsz2_dT ) + T2 * Cox_inv_dT ;
1834
1835 T1 = C_ESI * Cox_inv ;
1836 T2 = here->HSMHV2_wdplp ;
1837 T4 = 1.0e0 / ( model->HSMHV2_lp * model->HSMHV2_lp ) ;
1838 T5 = 2.0e0 * ( model->HSMHV2_vbi - Pb20b ) * T1 * T2 * T4 ;
1839 dVth0 = T5 * sqrt_Pbsum ;
1840 T6 = 0.5 * T5 / sqrt_Pbsum ;
1841 T7 = 2.0e0 * ( model->HSMHV2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
1842 T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
1843 dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
1844 dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
1845 dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
1846 dVth0_dT = T6 * Pbsum_dT + T7 * Cox_inv_dT + T8 * Pb20b_dT ;
1847
1848 T1 = Vthp - Vth0 ;
1849 T1_dVb = Vthp_dVb - Vth0_dVb ;
1850 T2 = pParam->HSMHV2_scp1 + pParam->HSMHV2_scp3 * Pbsum / model->HSMHV2_lp ;
1851 T2_dVb = pParam->HSMHV2_scp3 * Pbsum_dVb / model->HSMHV2_lp ;
1852 T3 = T2 + pParam->HSMHV2_scp2 * Vdsz ;
1853 T3_dVb = T2_dVb + pParam->HSMHV2_scp2 * Vdsz_dVbs ;
1854
1855
1856 Vdx = model->HSMHV2_scp21 + Vdsz ;
1857 Vdx_dVbs = Vdsz_dVbs ;
1858 Vdx_dT = Vdsz_dT ;
1859 Vdx2 = Vdx * Vdx ;
1860 Vdx2_dVbs = 2 * Vdx_dVbs * Vdx ;
1861 Vdx2_dT = 2 * Vdx_dT * Vdx ;
1862
1863 dVthLP = T1 * dVth0 * T3 + dqb - here->HSMHV2_msc / Vdx2 ;
1864 dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb
1865 + dqb_dVb + here->HSMHV2_msc / Vdx2 /Vdx2 *Vdx2_dVbs;
1866 T4 = T1 * dVth0 * pParam->HSMHV2_scp3 / model->HSMHV2_lp ;
1867 dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3
1868 + T4 * Pbsum_dVd
1869 + T1 * dVth0 * pParam->HSMHV2_scp2 * Vdsz_dVds
1870 + dqb_dVd
1871 + 2.0e0 * here->HSMHV2_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ;
1872 dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3
1873 + T4 * Pbsum_dVg + dqb_dVg ;
1874 dVthLP_dT = (Vthp_dT - Vth0_dT) * dVth0 * T3 + T1 * dVth0_dT * T3
1875 + T4 * Pbsum_dT
1876 + T1 * dVth0 * pParam->HSMHV2_scp2 * Vdsz_dT
1877 + dqb_dT
1878 + 2.0e0 * here->HSMHV2_msc * Vdx * Vdsz_dT / ( Vdx2 * Vdx2 );
1879 } else {
1880 dVthLP = 0.0e0 ;
1881 dVthLP_dVb = 0.0e0 ;
1882 dVthLP_dVd = 0.0e0 ;
1883 dVthLP_dVg = 0.0e0 ;
1884 dVthLP_dT = 0.0e0 ;
1885 }
1886
1887 /*---------------------------------------------------*
1888 * dVthSC : Short-channel effect induced by Vds.
1889 *-----------------*/
1890 T1 = C_ESI * Cox_inv ;
1891 T2 = here->HSMHV2_wdpl ;
1892 T3 = here->HSMHV2_lgate - model->HSMHV2_parl2 ;
1893 T4 = 1.0e0 / ( T3 * T3 ) ;
1894 T5 = 2.0e0 * ( model->HSMHV2_vbi - Pb20b ) * T1 * T2 * T4 ;
1895
1896 dVth0 = T5 * sqrt_Pbsum ;
1897
1898 T6 = T5 / 2.0 / sqrt_Pbsum ;
1899 T7 = 2.0e0 * ( model->HSMHV2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
1900 T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
1901 dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
1902 dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
1903 dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
1904 dVth0_dT = T6 * Pbsum_dT + T7 * Cox_inv_dT + T8 * Pb20b_dT ;
1905
1906 T1 = pParam->HSMHV2_sc3 / here->HSMHV2_lgate ;
1907 T4 = pParam->HSMHV2_sc1 + T1 * Pbsum ;
1908 T4_dVb = T1 * Pbsum_dVb ;
1909 T4_dVd = T1 * Pbsum_dVd ;
1910 T4_dVg = T1 * Pbsum_dVg ;
1911 T4_dT = T1 * Pbsum_dT ;
1912
1913 T5 = T4 + pParam->HSMHV2_sc2 * Vdsz * ( 1.0 + model->HSMHV2_sc4 * Pbsum );
1914 T5_dVb = T4_dVb + pParam->HSMHV2_sc2 * Vdsz * model->HSMHV2_sc4 * Pbsum_dVb
1915 + pParam->HSMHV2_sc2 * Vdsz_dVbs * model->HSMHV2_sc4 * Pbsum;
1916 T5_dVd = T4_dVd + pParam->HSMHV2_sc2 * Vdsz_dVds * ( 1.0 + model->HSMHV2_sc4 * Pbsum )
1917 + pParam->HSMHV2_sc2 * Vdsz * model->HSMHV2_sc4 * Pbsum_dVd;
1918 T5_dVg = T4_dVg + pParam->HSMHV2_sc2 * Vdsz * model->HSMHV2_sc4 * Pbsum_dVg;
1919 T5_dT = T4_dT + pParam->HSMHV2_sc2 * Vdsz * model->HSMHV2_sc4 * Pbsum_dT
1920 + pParam->HSMHV2_sc2 * Vdsz_dT * model->HSMHV2_sc4 * Pbsum;
1921
1922
1923 dVthSC = dVth0 * T5 ;
1924 dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ;
1925 dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ;
1926 dVthSC_dVg = dVth0_dVg * T5 + dVth0 * T5_dVg ;
1927 dVthSC_dT = dVth0_dT * T5 + dVth0 * T5_dT ;
1928
1929 /*---------------------------------------------------*
1930 * dVthW : narrow-channel effect.
1931 *-----------------*/
1932 T1 = 1.0 / Cox ;
1933 T2 = T1 * T1 ;
1934 T3 = 1.0 / ( Cox + pParam->HSMHV2_wfc / Weff ) ;
1935 T4 = T3 * T3 ;
1936 T5 = T1 - T3 ;
1937 T6 = Qb0 * ( T2 - T4 ) ;
1938
1939 dVthW = Qb0 * T5 + pParam->HSMHV2_wvth0 / here->HSMHV2_wg ;
1940 dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ;
1941 dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ;
1942 dVthW_dVg = - Cox_dVg * T6 ;
1943 dVthW_dT = Qb0_dT * T5 - Cox_dT * T6 ;
1944
1945 /*---------------------------------------------------*
1946 * dVth : Total variation.
1947 * - Positive dVth means the decrease in Vth.
1948 *-----------------*/
1949 dVth = dVthSC + dVthLP + dVthW + here->HSMHV2_dVthsm ;
1950 dVth_dVb = dVthSC_dVb + dVthLP_dVb + dVthW_dVb ;
1951 dVth_dVd = dVthSC_dVd + dVthLP_dVd + dVthW_dVd ;
1952 dVth_dVg = dVthSC_dVg + dVthLP_dVg + dVthW_dVg ;
1953 dVth_dT = dVthSC_dT + dVthLP_dT + dVthW_dT ;
1954
1955 /*---------------------------------------------------*
1956 * Vth : Threshold voltagei for OP.
1957 *-----------------*/
1958 T2 = sqrt( here->HSMHV2_2qnsub_esi * (Pb2-Vbsz) ) ;
1959 Vth = Pb2 + Vfb + T2 * Cox0_inv - dVth ;
1960
1961 /*-----------------------------------------------------------*
1962 * Constants in the equation of Ps0 .
1963 *-----------------*/
1964
1965 fac1 = cnst0 * Cox_inv ;
1966 fac1_dVbs = cnst0 * Cox_inv_dVb ;
1967 fac1_dVds = cnst0 * Cox_inv_dVd ;
1968 fac1_dVgs = cnst0 * Cox_inv_dVg ;
1969 fac1_dT = Cox_inv * cnst0_dT ;
1970
1971 fac1p2 = fac1 * fac1 ;
1972 fac1p2_dT = 2.0 * fac1 * fac1_dT ;
1973
1974 /*---------------------------------------------------*
1975 * Poly-Depletion Effect
1976 *-----------------*/
1977
1978 dPpg = 0.0 ;
1979 dPpg_dVb = 0.0 ;
1980 dPpg_dVd = 0.0 ;
1981 dPpg_dVg = 0.0 ;
1982 dPpg_dT = 0.0 ;
1983
1984 if ( here->HSMHV2_flg_pgd == 1 ) {
1985
1986 T7 = Vgsz ;
1987 T7_dVb = Vgsz_dVbs ;
1988 T7_dVd = Vgsz_dVds ;
1989 T7_dVg = Vgsz_dVgs ;
1990 T7_dT = Vgsz_dT ;
1991
1992 T0 = here->HSMHV2_cnstpgd ;
1993
1994 T3 = T7 - model->HSMHV2_pgd2 ;
1995 T3_dVb = T7_dVb ;
1996 T3_dVd = T7_dVd ;
1997 T3_dVg = T7_dVg ;
1998 T3_dT = T7_dT ;
1999
2000 Fn_ExpLim( dPpg , T3 , T6 ) ;
2001 dPpg_dVb = T6 * T3_dVb ;
2002 dPpg_dVd = T6 * T3_dVd ;
2003 dPpg_dVg = T6 * T3_dVg ;
2004 dPpg_dT = T6 * T3_dT ;
2005
2006 Fn_SZ( dPpg , dPpg - 1.0 , pol_dlt , T6 ) ;
2007 dPpg_dVb *= T6 ;
2008 dPpg_dVd *= T6 ;
2009 dPpg_dVg *= T6 ;
2010 dPpg_dT *= T6 ;
2011
2012 dPpg *= T0 ;
2013 dPpg_dVb *= T0 ;
2014 dPpg_dVd *= T0 ;
2015 dPpg_dVg *= T0 ;
2016 dPpg_dT *= T0 ;
2017
2018 Fn_SU( dPpg , dPpg , pol_b , pol_dlt , T9 ) ;
2019 dPpg_dVb *= T9 ;
2020 dPpg_dVd *= T9 ;
2021 dPpg_dVg *= T9 ;
2022 dPpg_dT *= T9 ;
2023
2024 }
2025
2026 /*---------------------------------------------------*
2027 * Vgp : Effective gate bias with SCE & RSCE & flatband.
2028 *-----------------*/
2029 Vgp = Vgs - Vfb + dVth - dPpg ;
2030 Vgp_dVbs = dVth_dVb - dPpg_dVb ;
2031 Vgp_dVds = dVth_dVd - dPpg_dVd ;
2032 Vgp_dVgs = 1.0e0 + dVth_dVg - dPpg_dVg ;
2033 Vgp_dT = dVth_dT - dPpg_dT ;
2034
2035
2036 /*---------------------------------------------------*
2037 * Vgs_fb : Actual flatband voltage taking account Vbscl.
2038 * - note: if Vgs == Vgs_fb then Vgp == Ps0 == Vbscl .
2039 *------------------*/
2040 Vgs_fb = Vfb - dVth + dPpg + Vbscl ;
2041
2042 if( model->HSMHV2_codep == 1 ) {
2043
2044 /*---------------------------------------------------*
2045 * depletion mode MOSFET
2046 *------------------*/
2047
2048 #include "hsmhv2eval_dep.h"
2049
2050 } else {
2051
2052 /*---------------------------------------------------*
2053 * normal mode MOSFET
2054 *------------------*/
2055
2056 /*-----------------------------------------------------------*
2057 * Accumulation zone. (zone-A)
2058 * - evaluate basic characteristics and exit from this part.
2059 *-----------------*/
2060
2061 if ( Vgs < Vgs_fb ) {
2062
2063 flg_zone = -1 ;
2064
2065 /*---------------------------------------------------*
2066 * Evaluation of Ps0.
2067 * - Psa : Analytical solution of
2068 * Cox( Vgp - Psa ) = cnst0 * Qacc
2069 * where Qacc is the 3-degree series of (fdep)^{1/2}.
2070 * The unkown is transformed to Chi=beta(Ps0-Vbs).
2071 * - Ps0_min : |Ps0_min| when Vbs=0.
2072 *-----------------*/
2073 /* Ps0_min: approx. solution of Poisson equation at Vgs_min */
2074 /* ( easy to improve, if necessary ) */
2075 // Ps0_min = here->HSMHV2_eg - Pb2 ;
2076 // Ps0_min_dT = Eg_dT - Pb2_dT ;
2077 Ps0_min = 2.0 * beta_inv * log(-Vgs_min/fac1) ;
2078 Ps0_min_dVds = -2.0 * beta_inv * fac1_dVds / fac1 ;
2079 Ps0_min_dVgs = -2.0 * beta_inv * fac1_dVgs / fac1 ;
2080 Ps0_min_dVbs = -2.0 * beta_inv * fac1_dVbs / fac1 ;
2081 Ps0_min_dT = -2.0 * beta_inv * fac1_dT / fac1 + beta * Ps0_min * beta_inv_dT;
2082
2083
2084 TX = beta * ( Vgp - Vbscl ) ;
2085 TX_dVbs = beta * ( Vgp_dVbs - Vbscl_dVbs ) ;
2086 TX_dVds = beta * Vgp_dVds ;
2087 TX_dVgs = beta * Vgp_dVgs ;
2088 TX_dT = beta_dT * ( Vgp - Vbscl ) + beta * ( Vgp_dT - Vbscl_dT );
2089
2090 T1 = 1.0 / ( beta * cnst0 ) ;
2091 TY = T1 * Cox ;
2092 TY_dVbs = T1 * Cox_dVb ;
2093 TY_dVds = T1 * Cox_dVd ;
2094 TY_dVgs = T1 * Cox_dVg ;
2095 T1_dT = - T1 / ( beta * cnst0 ) * ( beta_dT * cnst0 + beta * cnst0_dT ) ;
2096 TY_dT = T1_dT * Cox ;
2097
2098 Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ;
2099
2100 Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ;
2101 T1 = 72.0 * Ac41 * Ac41 * C_SQRT_2 ;
2102 Ac4_dVbs = T1 * TY_dVbs ;
2103 Ac4_dVds = T1 * TY_dVds ;
2104 Ac4_dVgs = T1 * TY_dVgs ;
2105 Ac4_dT = T1 * TY_dT ;
2106
2107 T4 = ( TX - 2.0 ) ;
2108 T5 = 9.0 * TY * T4 ;
2109 T5_dVb = 9.0 * ( TY_dVbs * T4 + TY * TX_dVbs ) ;
2110 T5_dVd = 9.0 * ( TY_dVds * T4 + TY * TX_dVds ) ;
2111 T5_dVg = 9.0 * ( TY_dVgs * T4 + TY * TX_dVgs ) ;
2112 T5_dT = 9.0 * ( TY_dT * T4 + TY * TX_dT ) ;
2113
2114
2115 Ac31 = 7.0 * C_SQRT_2 - T5 ;
2116 Ac31_dVbs = -T5_dVb ;
2117 Ac31_dVds = -T5_dVd ;
2118 Ac31_dVgs = -T5_dVg ;
2119 Ac31_dT = -T5_dT ;
2120
2121 Ac3 = Ac31 * Ac31 ;
2122 T1 = 2.0 * Ac31 ;
2123 Ac3_dVbs = T1 * Ac31_dVbs ;
2124 Ac3_dVds = T1 * Ac31_dVds ;
2125 Ac3_dVgs = T1 * Ac31_dVgs ;
2126 Ac3_dT = T1 * Ac31_dT ;
2127
2128 Ac2 = sqrt( Ac4 + Ac3 ) ;
2129 T1 = 0.5 / Ac2 ;
2130 Ac2_dVbs = T1 * ( Ac4_dVbs + Ac3_dVbs ) ;
2131 Ac2_dVds = T1 * ( Ac4_dVds + Ac3_dVds ) ;
2132 Ac2_dVgs = T1 * ( Ac4_dVgs + Ac3_dVgs ) ;
2133 Ac2_dT = T1 * ( Ac4_dT + Ac3_dT ) ;
2134
2135
2136 Ac1 = -7.0 * C_SQRT_2 + Ac2 + T5 ;
2137 Ac1_dVbs = Ac2_dVbs + T5_dVb ;
2138 Ac1_dVds = Ac2_dVds + T5_dVd ;
2139 Ac1_dVgs = Ac2_dVgs + T5_dVg ;
2140 Ac1_dT = Ac2_dT + T5_dT ;
2141
2142 Acd = Fn_Pow( Ac1 , C_1o3 ) ;
2143 T1 = C_1o3 / ( Acd * Acd ) ;
2144 Acd_dVbs = Ac1_dVbs * T1 ;
2145 Acd_dVds = Ac1_dVds * T1 ;
2146 Acd_dVgs = Ac1_dVgs * T1 ;
2147 Acd_dT = Ac1_dT * T1 ;
2148
2149 Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ;
2150 T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ;
2151 Acn_dVbs = - 12.0 * TY_dVbs + T1 * Acd_dVbs ;
2152 Acn_dVds = - 12.0 * TY_dVds + T1 * Acd_dVds ;
2153 Acn_dVgs = - 12.0 * TY_dVgs + T1 * Acd_dVgs ;
2154 Acn_dT = - 12.0 * TY_dT + T1 * Acd_dT ;
2155
2156
2157 T1 = 1.0 / Acd ;
2158 Chi = Acn * T1 ;
2159 Chi_dVbs = ( Acn_dVbs - Chi * Acd_dVbs ) * T1 ;
2160 Chi_dVds = ( Acn_dVds - Chi * Acd_dVds ) * T1 ;
2161 Chi_dVgs = ( Acn_dVgs - Chi * Acd_dVgs ) * T1 ;
2162 Chi_dT = ( Acn_dT - Chi * Acd_dT ) * T1 ;
2163
2164
2165 Psa = Chi * beta_inv + Vbscl ;
2166 Psa_dVbs = Chi_dVbs * beta_inv + Vbscl_dVbs ;
2167 Psa_dVds = Chi_dVds * beta_inv ;
2168 Psa_dVgs = Chi_dVgs * beta_inv ;
2169 Psa_dT = Chi_dT * beta_inv + Chi * beta_inv_dT + Vbscl_dT;
2170
2171 T1 = Psa - Vbscl ;
2172 T1_dVb = Psa_dVbs - Vbscl_dVbs ;
2173 T1_dVd = Psa_dVds ;
2174 T1_dVg = Psa_dVgs ;
2175 T1_dT = Psa_dT - Vbscl_dT ;
2176
2177 T2 = T1 / Ps0_min ;
2178 T2_dVb = ( T1_dVb * Ps0_min - T1 * Ps0_min_dVbs ) / ( Ps0_min * Ps0_min ) ;
2179 T2_dVd = ( T1_dVd * Ps0_min - T1 * Ps0_min_dVds ) / ( Ps0_min * Ps0_min ) ;
2180 T2_dVg = ( T1_dVg * Ps0_min - T1 * Ps0_min_dVgs ) / ( Ps0_min * Ps0_min ) ;
2181 T2_dT = ( T1_dT * Ps0_min - T1 * Ps0_min_dT ) / ( Ps0_min * Ps0_min ) ;
2182
2183 T3 = sqrt( 1.0 + ( T2 * T2 ) ) ;
2184 T3_dVb = 1.0 / T3 * T2 * T2_dVb ;
2185 T3_dVd = 1.0 / T3 * T2 * T2_dVd ;
2186 T3_dVg = 1.0 / T3 * T2 * T2_dVg ;
2187 T3_dT = 1.0 / T3 * T2 * T2_dT ;
2188
2189 Ps0 = T1 / T3 + Vbscl ;
2190 T9 = 1.0 / ( T3 * T3 ) ;
2191 Ps0_dVbs = T9 * ( ( Psa_dVbs - Vbscl_dVbs ) * T3 - T1 * T3_dVb ) + Vbscl_dVbs ;
2192 Ps0_dVds = T9 * ( Psa_dVds * T3 - T1 * T3_dVd ) ;
2193 Ps0_dVgs = T9 * ( Psa_dVgs * T3 - T1 * T3_dVg ) ;
2194 Ps0_dT = T9 * ( ( Psa_dT - Vbscl_dT )* T3 - T1 * T3_dT ) + Vbscl_dT;
2195
2196 /*---------------------------------------------------*
2197 * Characteristics.
2198 *-----------------*/
2199 Psl = Ps0 ;
2200 Psl_dVbs = Ps0_dVbs ;
2201 Psl_dVds = Ps0_dVds ;
2202 Psl_dVgs = Ps0_dVgs ;
2203 Psl_dT = Ps0_dT ;
2204 /** (reminder)
2205 Psdl = Psl ;
2206 Psdl_dVbs = Psl_dVbs ;
2207 Psdl_dVds = Psl_dVds ;
2208 Psdl_dVgs = Psl_dVgs ;
2209 **/
2210 Pds = 0.0 ;
2211 Pds_dVbs = 0.0 ;
2212 Pds_dVds = 0.0 ;
2213 Pds_dVgs = 0.0 ;
2214 Pds_dT = 0.0 ;
2215
2216 T2 = ( Vgp - Ps0 ) ;
2217 T2_dT = Vgp_dT - Ps0_dT ;
2218
2219 Qbu = Cox * T2 ;
2220 Qbu_dVbs = Cox * ( Vgp_dVbs - Ps0_dVbs ) + Cox_dVb * T2 ;
2221 Qbu_dVds = Cox * ( Vgp_dVds - Ps0_dVds ) + Cox_dVd * T2 ;
2222 Qbu_dVgs = Cox * ( Vgp_dVgs - Ps0_dVgs ) + Cox_dVg * T2 ;
2223 Qbu_dT = Cox * T2_dT ;
2224
2225 Qiu = 0.0e0 ;
2226 Qiu_dVbs = 0.0e0 ;
2227 Qiu_dVds = 0.0e0 ;
2228 Qiu_dVgs = 0.0e0 ;
2229 Qiu_dT = 0.0e0 ;
2230
2231 Qdrat = 0.0e0 ;
2232 Qdrat_dVbs = 0.0e0 ;
2233 Qdrat_dVds = 0.0e0 ;
2234 Qdrat_dVgs = 0.0e0 ;
2235 Qdrat_dT = 0.0 ;
2236
2237 Lred = 0.0e0 ;
2238 Lred_dVbs = 0.0e0 ;
2239 Lred_dVds = 0.0e0 ;
2240 Lred_dVgs = 0.0e0 ;
2241 Lred_dT = 0.0e0 ;
2242
2243 Ids = 0.0e0 ;
2244 Ids_dVbs = 0.0e0 ;
2245 Ids_dVds = 0.0e0 ;
2246 Ids_dVgs = 0.0e0 ;
2247 Ids_dT = 0.0e0 ;
2248
2249 VgVt = 0.0 ;
2250
2251 flg_noqi = 1 ;
2252
2253 goto end_of_part_1 ;
2254 }
2255
2256 /*-----------------------------------------------------------*
2257 * Initial guess for Ps0.
2258 *-----------------*/
2259
2260 /*---------------------------------------------------*
2261 * Ps0_iniA: solution of subthreshold equation assuming zone-D1/D2.
2262 *-----------------*/
2263 TX = 1.0e0 + 4.0e0
2264 * ( beta * ( Vgp - Vbscl ) - 1.0e0 ) / ( fac1p2 * beta2 ) ;
2265 TX = Fn_Max( TX , epsm10 ) ;
2266 Ps0_iniA = Vgp + fac1p2 * beta * 0.5 * ( 1.0e0 - sqrt( TX ) ) ;
2267
2268 /* use analytical value in subthreshold region. */
2269 if ( Vgs < ( Vfb + Vth ) * 0.5 ) {
2270 flg_pprv = 0 ;
2271 }
2272
2273
2274 if ( flg_pprv >= 1 ) {
2275 /*---------------------------------------------------*
2276 * Use previous value.
2277 *-----------------*/
2278
2279 T1 = Ps0_dVbs * dVbs + Ps0_dVds * dVds + Ps0_dVgs * dVgs ;
2280 Ps0_ini = Ps0 + T1 ;
2281
2282 T2 = here->HSMHV2_ps0_dtemp_prv * Temp_dif ;
2283 if ( fabs( T1 + T2 ) < dP_max ) { Ps0_ini += T2 ; }
2284
2285 if ( flg_pprv == 2 ) {
2286 /* TX_dVxs = d^2 Ps0 / d Vxs^2 here */
2287 if ( Vbsc_dif2 > epsm10 ) {
2288 TX_dVbs = ( here->HSMHV2_ps0_dvbs_prv - here->HSMHV2_ps0_dvbs_prv2 )
2289 / Vbsc_dif2 ;
2290 } else {
2291 TX_dVbs = 0.0 ;
2292 }
2293 if ( Vdsc_dif2 > epsm10 ) {
2294 TX_dVds = ( here->HSMHV2_ps0_dvds_prv - here->HSMHV2_ps0_dvds_prv2 )
2295 / Vdsc_dif2 ;
2296 } else {
2297 TX_dVds = 0.0 ;
2298 }
2299 if ( Vgsc_dif2 > epsm10 ) {
2300 TX_dVgs = ( here->HSMHV2_ps0_dvgs_prv - here->HSMHV2_ps0_dvgs_prv2 )
2301 / Vgsc_dif2 ;
2302 } else {
2303 TX_dVgs = 0.0 ;
2304 }
2305 T2 = ( dVbs * dVbs ) / 2 * TX_dVbs
2306 + ( dVds * dVds ) / 2 * TX_dVds
2307 + ( dVgs * dVgs ) / 2 * TX_dVgs ;
2308
2309 if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) {
2310 Ps0_ini += T2 ;
2311 } else {
2312 flg_pprv = 1 ;
2313 }
2314 }
2315
2316 T1 = Ps0_ini - Ps0 ;
2317 if ( T1 < - dP_max || T1 > dP_max ) {
2318 flg_pprv = 0 ; /* flag changes to analytical */
2319 } else {
2320 Ps0_iniA = Fn_Max( Ps0_ini , Ps0_iniA ) ;
2321 }
2322 } /* end of (flg_pprv >=1) if-block */
2323
2324 if ( flg_pprv == 0 ) {
2325
2326 /*---------------------------------------------------*
2327 * Analytical initial guess.
2328 *-----------------*/
2329 /*-------------------------------------------*
2330 * Common part.
2331 *-----------------*/
2332 Chi = beta * ( Ps0_iniA - Vbscl ) ;
2333
2334 if ( Chi < znbd3 ) {
2335 /*-----------------------------------*
2336 * zone-D1/D2
2337 * - Ps0_ini is the analytical solution of Qs=Qb0 with
2338 * Qb0 being approximated to 3-degree polynomial.
2339 *-----------------*/
2340 TY = beta * ( Vgp - Vbscl ) ;
2341 T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ;
2342 T2 = 81.0 + 3.0 * T1 ;
2343 T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ;
2344 T4 = 1458.0 - 81.0 * ( 54.0 + T1 ) + 27.0 * T1 * TY ;
2345 T4 = T4 * T4 ;
2346 T5 = Fn_Pow( T3 + sqrt( 4 * T2 * T2 * T2 + T4 ) , C_1o3 ) ;
2347 TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 )
2348 + 1 / ( 3.0 * C_2p_1o3 ) * T5 ;
2349
2350 Ps0_iniA = TX * beta_inv + Vbscl ;
2351 Ps0_ini = Ps0_iniA ;
2352
2353 } else if ( Vgs <= Vth ) {
2354 /*-----------------------------------*
2355 * Weak inversion zone.
2356 *-----------------*/
2357 Ps0_ini = Ps0_iniA ;
2358
2359 } else {
2360 /*-----------------------------------*
2361 * Strong inversion zone.
2362 * - Ps0_iniB : upper bound.
2363 *-----------------*/
2364 T1 = 1.0 / cnst1 / cnstCoxi ;
2365 T2 = T1 * Vgp * Vgp ;
2366 T3 = beta + 2.0 / Vgp ;
2367
2368 Ps0_iniB = log( T2 ) / T3 ;
2369
2370 Fn_SU( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1) ;
2371 }
2372 }
2373
2374 TX = Vbscl + ps_conv / 2 ;
2375 if ( Ps0_ini < TX ) Ps0_ini = TX ;
2376
2377
2378 /*---------------------------------------------------*
2379 * Assign initial guess.
2380 *-----------------*/
2381 Ps0 = Ps0_ini ;
2382 Psl_lim = Ps0_iniA ;
2383
2384
2385 /*---------------------------------------------------*
2386 * Calculation of Ps0. (beginning of Newton loop)
2387 * - Fs0 : Fs0 = 0 is the equation to be solved.
2388 * - dPs0 : correction value.
2389 *-----------------*/
2390 exp_bVbs = exp( beta * Vbscl ) ;
2391 cfs1 = cnst1 * exp_bVbs ;
2392
2393 flg_conv = 0 ;
2394 for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) {
2395
2396 Chi = beta * ( Ps0 - Vbscl ) ;
2397
2398 if ( Chi < znbd5 ) {
2399 /*-------------------------------------------*
2400 * zone-D1/D2. (Ps0)
2401 * - Qb0 is approximated to 5-degree polynomial.
2402 *-----------------*/
2403 fi = Chi * Chi * Chi
2404 * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ;
2405 fi_dChi = Chi * Chi
2406 * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ;
2407
2408 fs01 = cfs1 * fi * fi ;
2409 fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ;
2410
2411 fb = Chi * ( cn_nc51
2412 + Chi * ( cn_nc52
2413 + Chi * ( cn_nc53
2414 + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ;
2415 fb_dChi = cn_nc51
2416 + Chi * ( 2 * cn_nc52
2417 + Chi * ( 3 * cn_nc53
2418 + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ;
2419
2420 fs02 = sqrt( fb * fb + fs01 ) ;
2421 fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ;
2422
2423 } else {
2424 /*-------------------------------------------*
2425 * zone-D3. (Ps0)
2426 *-----------------*/
2427 if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */
2428 exp_Chi = exp( Chi ) ;
2429 fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ;
2430 fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ;
2431 } else {
2432 exp_bPs0 = exp( beta*Ps0 ) ;
2433 fs01 = cnst1 * ( exp_bPs0 - exp_bVbs ) ;
2434 fs01_dPs0 = cnst1 * beta * exp_bPs0 ;
2435 }
2436 fs02 = sqrt( Chi - 1.0 + fs01 ) ;
2437 fs02_dPs0 = ( beta + fs01_dPs0 ) / ( fs02 + fs02 ) ;
2438 } /* end of if ( Chi ... ) else block */
2439
2440 Fs0 = Vgp - Ps0 - fac1 * fs02 ;
2441 Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ;
2442
2443 if ( flg_conv == 1 ) break ;
2444
2445 dPs0 = - Fs0 / Fs0_dPs0 ;
2446
2447 /*-------------------------------------------*
2448 * Update Ps0 .
2449 * - clamped to Vbscl if Ps0 < Vbscl .
2450 *-----------------*/
2451 dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0))) ;
2452 if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ;
2453
2454 Ps0 = Ps0 + dPs0 ;
2455
2456 // TX = Vbscl + ps_conv / 2 ;
2457 // if ( Ps0 < TX ) Ps0 = TX ;
2458
2459 /*-------------------------------------------*
2460 * Check convergence.
2461 * NOTE: This condition may be too rigid.
2462 *-----------------*/
2463 if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) {
2464 flg_conv = 1 ;
2465 }
2466
2467 } /* end of Ps0 Newton loop */
2468
2469 /* Reduce loop count to exclude the sweep for derivative calculation */
2470 lp_s0 -- ;
2471
2472 /*-------------------------------------------*
2473 * Procedure for diverged case.
2474 *-----------------*/
2475 if ( flg_conv == 0 ) {
2476 fprintf( stderr ,
2477 "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Ps0)\n", model->HSMHV2modName ) ;
2478 fprintf( stderr ,
2479 " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" ,
2480 Vbse , Vdse , Vgse ) ;
2481 if ( flg_info >= 2 ) {
2482 printf( "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Ps0)\n", model->HSMHV2modName ) ;
2483 }
2484 }
2485
2486 /*---------------------------------------------------*
2487 * Evaluate derivatives of Ps0.
2488 * - note: Here, fs01_dVbs and fs02_dVbs are derivatives
2489 * w.r.t. explicit Vbs. So, Ps0 in the fs01 and fs02
2490 * expressions is regarded as a constant.
2491 *-----------------*/
2492 /* self heating */
2493 Chi_dT = beta_dT *( Ps0 - Vbscl ) - beta * Vbscl_dT ;
2494 exp_bVbs_dT = ( beta_dT * Vbscl + beta * Vbscl_dT ) * exp_bVbs ;
2495 cfs1_dT = exp_bVbs * cnst1_dT + exp_bVbs_dT * cnst1 ;
2496
2497 /* derivatives of fs0* w.r.t. explicit Vbs */
2498 if ( Chi < znbd5 ) {
2499 fs01_dVbs = cfs1 * beta * fi * ( fi - 2 * fi_dChi ) * Vbscl_dVbs ;
2500 fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ;
2501 T2 = 1.0e0 / ( fs02 + fs02 ) ;
2502 fs02_dVbs = ( - beta * Vbscl_dVbs * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ;
2503 fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ;
2504 } else {
2505 if ( Chi < large_arg ) {
2506 fs01_dVbs = - cfs1 * beta * Vbscl_dVbs ;
2507 exp_Chi_dT = exp_Chi * Chi_dT ;
2508 fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ;
2509 } else {
2510 fs01_dVbs = - cfs1 * beta * Vbscl_dVbs ;
2511 exp_bPs0_dT = exp_bPs0 * Ps0 * beta_dT ;
2512 fs01_dT = cnst1_dT*(exp_bPs0-exp_bVbs) + cnst1*(exp_bPs0_dT-exp_bVbs_dT) ;
2513 }
2514 T2 = 0.5e0 / fs02 ;
2515 fs02_dVbs = ( - beta * Vbscl_dVbs + fs01_dVbs ) * T2 ;
2516 fs02_dT = T2 * ( Chi_dT + fs01_dT ) ;
2517 }
2518
2519 T1 = 1.0 / Fs0_dPs0 ;
2520 Ps0_dVbs = - ( Vgp_dVbs - ( fac1 * fs02_dVbs + fac1_dVbs * fs02 ) ) * T1 ;
2521 Ps0_dVds = - ( Vgp_dVds - fac1_dVds * fs02 ) * T1 ;
2522 Ps0_dVgs = - ( Vgp_dVgs - fac1_dVgs * fs02 ) * T1 ;
2523 Ps0_dT = - ( Vgp_dT - ( fac1 * fs02_dT + fac1_dT * fs02 ) ) * T1 ;
2524
2525 Chi_dT = beta_dT *( Ps0 - Vbscl ) + beta * ( Ps0_dT - Vbscl_dT ) ;
2526
2527 if ( Chi < znbd5 ) {
2528
2529 /*-------------------------------------------*
2530 * zone-D1/D2. (Ps0)
2531 * Xi0 := fdep0^2 = fb * fb [D1,D2]
2532 *-----------------*/
2533 Xi0 = fb * fb + epsm10 ;
2534 T1 = 2 * fb * fb_dChi * beta ;
2535 Xi0_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ;
2536 Xi0_dVds = T1 * Ps0_dVds ;
2537 Xi0_dVgs = T1 * Ps0_dVgs ;
2538 Xi0_dT = 2 * fb * fb_dChi * Chi_dT ;
2539
2540 Xi0p12 = fb + epsm10 ;
2541 T1 = fb_dChi * beta ;
2542 Xi0p12_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ;
2543 Xi0p12_dVds = T1 * Ps0_dVds ;
2544 Xi0p12_dVgs = T1 * Ps0_dVgs ;
2545 Xi0p12_dT = fb_dChi * Chi_dT ;
2546
2547 Xi0p32 = fb * fb * fb + epsm10 ;
2548 T1 = 3 * fb * fb * fb_dChi * beta ;
2549 Xi0p32_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ;
2550 Xi0p32_dVds = T1 * Ps0_dVds ;
2551 Xi0p32_dVgs = T1 * Ps0_dVgs ;
2552 Xi0p32_dT = 3 * fb * fb * fb_dChi * Chi_dT ;
2553
2554 fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ;
2555 fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ;
2556
2557 } else {
2558
2559 /*-------------------------------------------*
2560 * zone-D3. (Ps0)
2561 *-----------------*/
2562 flg_zone = 3 ;
2563 flg_noqi = 0 ;
2564
2565 /*-----------------------------------*
2566 * Xi0 := fdep0^2 = Chi - 1 = beta * ( Ps0 - Vbscl ) - 1 [D3]
2567 *-----------------*/
2568 Xi0 = Chi - 1.0e0 ;
2569 Xi0_dVbs = beta * ( Ps0_dVbs - Vbscl_dVbs ) ;
2570 Xi0_dVds = beta * Ps0_dVds ;
2571 Xi0_dVgs = beta * Ps0_dVgs ;
2572 Xi0_dT = Chi_dT ;
2573
2574 Xi0p12 = sqrt( Xi0 ) ;
2575 T1 = 0.5e0 / Xi0p12 ;
2576 Xi0p12_dVbs = T1 * Xi0_dVbs ;
2577 Xi0p12_dVds = T1 * Xi0_dVds ;
2578 Xi0p12_dVgs = T1 * Xi0_dVgs ;
2579 Xi0p12_dT = T1 * Xi0_dT ;
2580
2581 Xi0p32 = Xi0 * Xi0p12 ;
2582 T1 = 1.5e0 * Xi0p12 ;
2583 Xi0p32_dVbs = T1 * Xi0_dVbs ;
2584 Xi0p32_dVds = T1 * Xi0_dVds ;
2585 Xi0p32_dVgs = T1 * Xi0_dVgs ;
2586 Xi0p32_dT = T1 * Xi0_dT ;
2587
2588 if ( Chi < large_arg ) {
2589 exp_Chi_dT = exp_Chi * Chi_dT ;
2590 fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ;
2591 } else {
2592 exp_bPs0_dT = exp_bPs0 * (beta_dT * Ps0 + beta * Ps0_dT) ;
2593 fs01_dT = cnst1_dT*(exp_bPs0-exp_bVbs) + cnst1*(exp_bPs0_dT-exp_bVbs_dT) ;
2594 }
2595 fs02_dT = T2 * ( Chi_dT + fs01_dT ) ;
2596
2597 } /* end of if ( Chi ... ) block */
2598
2599 /*-----------------------------------------------------------*
2600 * - Recalculate the derivatives of fs01 and fs02.
2601 * note: fs01 = cnst1 * exp( Vbs ) * ( exp( Chi ) - Chi - 1.0e0 ) ;
2602 * fs02 = sqrt( Xi0 + fs01 ) ;
2603 *-----------------*/
2604 fs01_dVbs = Ps0_dVbs * fs01_dPs0 + fs01_dVbs ;
2605 fs01_dVds = Ps0_dVds * fs01_dPs0 ;
2606 fs01_dVgs = Ps0_dVgs * fs01_dPs0 ;
2607 fs02_dVbs = Ps0_dVbs * fs02_dPs0 + fs02_dVbs ;
2608 fs02_dVds = Ps0_dVds * fs02_dPs0 ;
2609 fs02_dVgs = Ps0_dVgs * fs02_dPs0 ;
2610
2611 /*-----------------------------------------------------------*
2612 * Qb0 : Qb at source side.
2613 * Qn0 : Qi at source side.
2614 *-----------------*/
2615
2616 Qb0 = cnst0 * Xi0p12 ;
2617 Qb0_dVb = cnst0 * Xi0p12_dVbs ;
2618 Qb0_dVd = cnst0 * Xi0p12_dVds ;
2619 Qb0_dVg = cnst0 * Xi0p12_dVgs ;
2620 Qb0_dT = cnst0 * Xi0p12_dT + cnst0_dT * Xi0p12 ;
2621
2622 T1 = 1.0 / ( fs02 + Xi0p12 ) ;
2623 Qn0 = cnst0 * fs01 * T1 ;
2624 T1_dT = - T1 * T1 * ( fs02_dT + Xi0p12_dT ) ;
2625 Qn0_dT = cnst0 * ( fs01 * T1_dT + T1 * fs01_dT ) + fs01 * T1 * cnst0_dT ;
2626
2627 T2 = 1.0 / ( fs01 + small ) ;
2628
2629 Qn0_dVbs = Qn0 * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ;
2630 Qn0_dVds = Qn0 * ( fs01_dVds * T2 - ( fs02_dVds + Xi0p12_dVds ) * T1 ) ;
2631 Qn0_dVgs = Qn0 * ( fs01_dVgs * T2 - ( fs02_dVgs + Xi0p12_dVgs ) * T1 ) ;
2632
2633
2634 /*-----------------------------------------------------------*
2635 * zone-D1 and D2
2636 *-----------------*/
2637 if ( Chi < znbd5 ) {
2638 if ( Chi < znbd3 ) {
2639 /*-------------------------------------------*
2640 * zone-D1. (Ps0)
2641 *-----------------*/
2642 flg_zone = 1 ;
2643 flg_noqi = 1 ; /** !! to be revisited !! **/
2644
2645 Qiu = Qn0 ;
2646 Qiu_dVbs = Qn0_dVbs ;
2647 Qiu_dVds = Qn0_dVds ;
2648 Qiu_dVgs = Qn0_dVgs ;
2649 Qiu_dT = Qn0_dT;
2650
2651 Qbu = Qb0 ;
2652 Qbu_dVbs = Qb0_dVb ;
2653 Qbu_dVds = Qb0_dVd ;
2654 Qbu_dVgs = Qb0_dVg ;
2655 Qbu_dT = Qb0_dT ;
2656
2657 Qdrat = 0.5 ;
2658 Qdrat_dVbs = 0.0 ;
2659 Qdrat_dVds = 0.0 ;
2660 Qdrat_dVgs = 0.0 ;
2661 Qdrat_dT = 0.0;
2662
2663 Lred = 0.0e0 ;
2664 Lred_dVbs = 0.0e0 ;
2665 Lred_dVds = 0.0e0 ;
2666 Lred_dVgs = 0.0e0 ;
2667 Lred_dT = 0.0e0 ;
2668
2669 /** (reminder)
2670 *Psdl = Psl ;
2671 *Psdl_dVbs = Psl_dVbs ;
2672 *Psdl_dVds = Psl_dVds ;
2673 *Psdl_dVgs = Psl_dVgs ;
2674 **/
2675
2676 } else {
2677 /*-------------------------------------------*
2678 * zone-D2 (Ps0)
2679 *-----------------*/
2680
2681 flg_zone = 2 ;
2682 flg_noqi = 0 ;
2683 /*-----------------------------------------------------------*
2684 * FD2 : connecting function for zone-D2.
2685 * - Qiu, Qbu, Qdrat and Lred should be interpolated later.
2686 *-----------------*/
2687 T1 = 1.0 / ( znbd5 - znbd3 ) ;
2688 TX = T1 * ( Chi - znbd3 ) ;
2689 TX_dVbs = beta * T1 * ( Ps0_dVbs - Vbscl_dVbs ) ;
2690 TX_dVds = beta * T1 * Ps0_dVds ;
2691 TX_dVgs = beta * T1 * Ps0_dVgs ;
2692 TX_dT = T1 * Chi_dT ;
2693
2694 FD2 = TX * TX * TX * ( 10.0 + TX * ( -15.0 + TX * 6.0 ) ) ;
2695 T4 = TX * TX * ( 30.0 + TX * ( -60.0 + TX * 30.0 ) ) ;
2696
2697 FD2_dVbs = T4 * TX_dVbs ;
2698 FD2_dVds = T4 * TX_dVds ;
2699 FD2_dVgs = T4 * TX_dVgs ;
2700 FD2_dT = T4 * TX_dT ;
2701
2702
2703 } /* end of zone-D2 */
2704 }
2705
2706
2707 /*---------------------------------------------------*
2708 * VgVt : Vgp - Vth_qi. ( Vth_qi is Vth for Qi evaluation. )
2709 *-----------------*/
2710 VgVt = Qn0 * Cox_inv ;
2711 VgVt_dVbs = Qn0_dVbs * Cox_inv + Qn0 * Cox_inv_dVb ;
2712 VgVt_dVds = Qn0_dVds * Cox_inv + Qn0 * Cox_inv_dVd ;
2713 VgVt_dVgs = Qn0_dVgs * Cox_inv + Qn0 * Cox_inv_dVg ;
2714 VgVt_dT = Qn0_dT * Cox_inv ;
2715
2716 /*-----------------------------------------------------------*
2717 * make Qi=Qd=Ids=0 if VgVt <= VgVt_small
2718 *-----------------*/
2719 if ( VgVt <= VgVt_small ) {
2720 flg_zone = 4 ;
2721 flg_noqi = 1 ;
2722
2723 Psl = Ps0 ;
2724 Psl_dVbs = Ps0_dVbs ;
2725 Psl_dVds = Ps0_dVds ;
2726 Psl_dVgs = Ps0_dVgs ;
2727 Psl_dT = Ps0_dT ;
2728
2729 /** (reminder)
2730 *Psdl = Psl ;
2731 *Psdl_dVbs = Psl_dVbs ;
2732 *Psdl_dVds = Psl_dVds ;
2733 *Psdl_dVgs = Psl_dVgs ;
2734 **/
2735
2736 Pds = 0.0 ;
2737 Pds_dVbs = 0.0 ;
2738 Pds_dVds = 0.0 ;
2739 Pds_dVgs = 0.0 ;
2740 Pds_dT = 0.0 ;
2741
2742 Qbu = Qb0 ;
2743 Qbu_dVbs = Qb0_dVb ;
2744 Qbu_dVds = Qb0_dVd ;
2745 Qbu_dVgs = Qb0_dVg ;
2746 Qbu_dT = Qb0_dT ;
2747
2748 Qiu = 0.0 ;
2749 Qiu_dVbs = 0.0 ;
2750 Qiu_dVds = 0.0 ;
2751 Qiu_dVgs = 0.0 ;
2752 Qiu_dT = 0.0 ;
2753
2754 Qdrat = 0.5 ;
2755 Qdrat_dVbs = 0.0 ;
2756 Qdrat_dVds = 0.0 ;
2757 Qdrat_dVgs = 0.0 ;
2758 Qdrat_dT = 0.0 ;
2759
2760 Lred = 0.0 ;
2761 Lred_dVbs = 0.0 ;
2762 Lred_dVds = 0.0 ;
2763 Lred_dVgs = 0.0 ;
2764 Lred_dT = 0.0 ;
2765
2766 Ids = 0.0e0 ;
2767 Ids_dVbs = 0.0e0 ;
2768 Ids_dVds = 0.0e0 ;
2769 Ids_dVgs = 0.0e0 ;
2770 Ids_dT = 0.0e0 ;
2771
2772 goto end_of_part_1 ;
2773 }
2774
2775 /*-----------------------------------------------------------*
2776 * Start point of Psl (= Ps0 + Pds) calculation. (label)
2777 *-----------------*/
2778 /* start_of_Psl: */
2779
2780
2781 /* Vdseff (begin) */
2782 Vdsorg = Vds ;
2783
2784 T2 = here->HSMHV2_qnsub_esi / ( Cox * Cox ) ;
2785 T4 = - 2.0e0 * T2 / Cox ;
2786 T2_dVb = T4 * Cox_dVb ;
2787 T2_dVd = T4 * Cox_dVd ;
2788 T2_dVg = T4 * Cox_dVg ;
2789 T2_dT = T4 * Cox_dT ;
2790
2791 T0 = Vgp - beta_inv - Vbsz ;
2792 T0_dT = Vgp_dT - beta_inv_dT - Vbsz_dT ;
2793 Fn_SZ( T9, 1.0e0 + 2.0e0 / T2 * T0, 1e-3, TX ) ;
2794 T9 += small ;
2795 T3 = sqrt( T9 ) ;
2796 T4 = 0.5e0 / T3 ;
2797 T5 = 1.0e0 / ( T2 * T2 ) ;
2798 T6 = T4 * 2.0e0 * T5 * TX ;
2799 T7 = T6 * T0 ;
2800 T8 = T6 * T2 ;
2801 T3_dVb = - T2_dVb * T7 + T8 * ( Vgp_dVbs - Vbsz_dVbs ) ;
2802 T3_dVd = - T2_dVd * T7 + T8 * ( Vgp_dVds - Vbsz_dVds ) ;
2803 T3_dVg = - T2_dVg * T7 + T8 * Vgp_dVgs ;
2804 T3_dT = - T2_dT * T7 + T8 * T0_dT ;
2805
2806 T10 = Vgp + T2 * ( 1.0e0 - T3 ) ;
2807 T10_dVb = Vgp_dVbs + T2_dVb * ( 1.0e0 - T3 ) - T2 * T3_dVb ;
2808 T10_dVd = Vgp_dVds + T2_dVd * ( 1.0e0 - T3 ) - T2 * T3_dVd ;
2809 T10_dVg = Vgp_dVgs + T2_dVg * ( 1.0e0 - T3 ) - T2 * T3_dVg ;
2810 T10_dT = Vgp_dT + T2_dT * ( 1.0e0 - T3 ) - T2 * T3_dT ;
2811 Fn_SZ( T10 , T10 , 0.01 , T0 ) ;
2812 T10 += epsm10 ;
2813 T10_dVb *= T0 ;
2814 T10_dVd *= T0 ;
2815 T10_dVg *= T0 ;
2816 T10_dT *= T0 ;
2817
2818 T1 = Vds / T10 ;
2819 T2 = Fn_Pow( T1 , here->HSMHV2_ddlt - 1.0e0 ) ;
2820 T7 = T2 * T1 ;
2821 T0 = here->HSMHV2_ddlt * T2 / ( T10 * T10 ) ;
2822 T7_dVb = T0 * ( - Vds * T10_dVb ) ;
2823 T7_dVd = T0 * ( T10 - Vds * T10_dVd ) ;
2824 T7_dVg = T0 * ( - Vds * T10_dVg ) ;
2825 T7_dT = T0 * ( - Vds * T10_dT ) ;
2826
2827 T3 = 1.0 + T7 ;
2828 T4 = Fn_Pow( T3 , 1.0 / here->HSMHV2_ddlt - 1.0 ) ;
2829 T6 = T4 * T3 ;
2830 T0 = T4 / here->HSMHV2_ddlt ;
2831 T6_dVb = T0 * T7_dVb ;
2832 T6_dVd = T0 * T7_dVd ;
2833 T6_dVg = T0 * T7_dVg ;
2834 T6_dT = T0 * T7_dT ;
2835
2836 Vdseff = Vds / T6 ;
2837 T0 = 1.0 / ( T6 * T6 ) ;
2838 Vdseff_dVbs = - Vds * T6_dVb * T0 ;
2839 Vdseff_dVds = ( T6 - Vds * T6_dVd ) * T0 ;
2840 Vdseff_dVgs = - Vds * T6_dVg * T0 ;
2841 Vdseff_dT = - Vds * T6_dT * T0 ;
2842
2843 Vds = Vdseff ;
2844 /* Vdseff (end) */
2845
2846
2847 exp_bVbsVds = exp( beta * ( Vbscl - Vds ) ) ;
2848 exp_bVbsVds_dT = ( beta_dT * ( Vbscl - Vds ) + beta * (Vbscl_dT - Vdseff_dT) ) * exp_bVbsVds ;
2849
2850
2851 /*---------------------------------------------------*
2852 * Skip Psl calculation when Vds is very small.
2853 *-----------------*/
2854 if ( Vds < 0.0 ) {
2855 Pds = 0.0 ;
2856 Psl = Ps0 ;
2857 // flg_conv = 1 ;
2858 goto start_of_loopl ;
2859 }
2860
2861 /*-----------------------------------------------------------*
2862 * Initial guess for Pds ( = Psl - Ps0 ).
2863 *-----------------*/
2864 if ( flg_pprv >= 1 ) {
2865 /*---------------------------------------------------*
2866 * Use previous value.
2867 *-----------------*/
2868
2869 T1 = Pds_dVbs * dVbs + Pds_dVds * dVds + Pds_dVgs * dVgs ;
2870 Pds_ini = Pds + T1 ;
2871
2872 /* self heating */
2873 T2 = here->HSMHV2_pds_dtemp_prv * Temp_dif ;
2874 if ( fabs( T1 + T2 ) < dP_max ) { Pds_ini += T2 ; }
2875
2876 if ( flg_pprv == 2 ) {
2877 /* TX_dVxs = d^2 Pds / d Vxs^2 here */
2878 if ( Vbsc_dif2 > epsm10 ) {
2879 TX_dVbs = ( here->HSMHV2_pds_dvbs_prv - here->HSMHV2_pds_dvbs_prv2 )
2880 / Vbsc_dif2 ;
2881 } else {
2882 TX_dVbs = 0.0 ;
2883 }
2884 if ( Vdsc_dif2 > epsm10 ) {
2885 TX_dVds = ( here->HSMHV2_pds_dvds_prv - here->HSMHV2_pds_dvds_prv2 )
2886 / Vdsc_dif2 ;
2887 } else {
2888 TX_dVds = 0.0 ;
2889 }
2890 if ( Vgsc_dif2 > epsm10 ) {
2891 TX_dVgs = ( here->HSMHV2_pds_dvgs_prv - here->HSMHV2_pds_dvgs_prv2 )
2892 / Vgsc_dif2 ;
2893 } else {
2894 TX_dVgs = 0.0 ;
2895 }
2896 T2 = ( dVbs * dVbs ) / 2 * TX_dVbs
2897 + ( dVds * dVds ) / 2 * TX_dVds
2898 + ( dVgs * dVgs ) / 2 * TX_dVgs ;
2899
2900 if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) {
2901 Pds_ini += T2 ;
2902 } else {
2903 flg_pprv = 1 ;
2904 }
2905 }
2906
2907 T1 = Pds_ini - Pds ;
2908 if ( T1 < - dP_max || T1 > dP_max ) flg_pprv = 0 ; /* flag changes */
2909
2910 } /* end of (flg_pprv>=1) if-block */
2911
2912 if ( flg_pprv == 0 ) {
2913 /*---------------------------------------------------*
2914 * Analytical initial guess.
2915 *-----------------*/
2916 Pds_max = Fn_Max( Psl_lim - Ps0 , 0.0e0 ) ;
2917
2918 Fn_SU( Pds_ini , Vds, (1.0e0 + c_pslini_1) * Pds_max, c_pslini_2, T1 ) ;
2919 Pds_ini = Fn_Min( Pds_ini , Pds_max ) ;
2920 }
2921
2922 if ( Pds_ini < 0.0 ) Pds_ini = 0.0 ;
2923 else if ( Pds_ini > Vds ) Pds_ini = Vds ;
2924
2925
2926 /*---------------------------------------------------*
2927 * Assign initial guess.
2928 *-----------------*/
2929 Pds = Pds_ini ;
2930 Psl = Ps0 + Pds ;
2931
2932 /*---------------------------------------------------*
2933 * Calculation of Psl by solving Poisson eqn.
2934 * (beginning of Newton loop)
2935 * - Fsl : Fsl = 0 is the equation to be solved.
2936 * - dPsl : correction value.
2937 *-----------------*/
2938 flg_conv = 0 ;
2939
2940 /*---------------------------------------------------*
2941 * start of Psl calculation. (label)
2942 *-----------------*/
2943 start_of_loopl:
2944
2945 for ( lp_sl = 1 ; lp_sl <= lp_sl_max + 1 ; lp_sl ++ ) {
2946
2947 Chi = beta * ( Psl - Vbscl ) ;
2948
2949 if ( Chi < znbd5 ) {
2950 /*-------------------------------------------*
2951 * zone-D2. (Psl)
2952 * - Qb0 is approximated to 5-degree polynomial.
2953 *-----------------*/
2954
2955 fi = Chi * Chi * Chi
2956 * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ;
2957 fi_dChi = Chi * Chi
2958 * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ;
2959
2960 cfs1 = cnst1 * exp_bVbsVds ;
2961
2962 fsl1 = cfs1 * fi * fi ;
2963 fsl1_dPsl = cfs1 * beta * 2 * fi * fi_dChi ;
2964
2965 fb = Chi * ( cn_nc51
2966 + Chi * ( cn_nc52
2967 + Chi * ( cn_nc53
2968 + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ;
2969 fb_dChi = cn_nc51
2970 + Chi * ( 2 * cn_nc52
2971 + Chi * ( 3 * cn_nc53
2972 + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ;
2973
2974 fsl2 = sqrt( fb * fb + fsl1 ) ;
2975 fsl2_dPsl = ( beta * fb_dChi * 2 * fb + fsl1_dPsl ) / ( fsl2 + fsl2 ) ;
2976
2977 } else {
2978 /*-------------------------------------------*
2979 * zone-D3. (Psl)
2980 *-----------------*/
2981 Rho = beta * ( Psl - Vds ) ;
2982 exp_Rho = exp( Rho ) ;
2983
2984 fsl1 = cnst1 * ( exp_Rho - exp_bVbsVds ) ;
2985 fsl1_dPsl = cnst1 * beta * ( exp_Rho ) ;
2986 Xil = Chi - 1.0e0 ;
2987 fsl2 = sqrt( Xil + fsl1 ) ;
2988 fsl2_dPsl = ( beta + fsl1_dPsl ) / ( fsl2 + fsl2 ) ;
2989 }
2990
2991 Fsl = Vgp - Psl - fac1 * fsl2 ;
2992 Fsl_dPsl = - 1.0e0 - fac1 * fsl2_dPsl ;
2993
2994 if ( flg_conv == 1 ) break ;
2995
2996 dPsl = - Fsl / Fsl_dPsl ;
2997
2998 /*-------------------------------------------*
2999 * Update Psl .
3000 * - clamped to Vbscl if Psl < Vbscl .
3001 *-----------------*/
3002 dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Psl))) ;
3003 if ( fabs( dPsl ) > dPlim ) dPsl = dPlim * Fn_Sgn( dPsl ) ;
3004 Psl = Psl + dPsl ;
3005
3006
3007 /*-------------------------------------------*
3008 * Check convergence.
3009 * NOTE: This condition may be too rigid.
3010 *-----------------*/
3011 if ( fabs( dPsl ) <= ps_conv && fabs( Fsl ) <= gs_conv ) {
3012 flg_conv = 1 ;
3013 }
3014 } /* end of Psl Newton loop */
3015
3016 /* Reduce loop count to exclude derivative calculation sweep */
3017 lp_sl -- ;
3018
3019 /*-------------------------------------------*
3020 * Procedure for diverged case.
3021 *-----------------*/
3022 if ( flg_conv == 0 ) {
3023 fprintf( stderr ,
3024 "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Psl)\n", model->HSMHV2modName ) ;
3025 fprintf( stderr ,
3026 " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" ,
3027 Vbse , Vdse , Vgse ) ;
3028 if ( flg_info >= 2 ) {
3029 printf("*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Psl)\n", model->HSMHV2modName ) ;
3030 }
3031 }
3032
3033
3034 /*---------------------------------------------------*
3035 * Evaluate derivatives of Psl.
3036 * - note: Here, fsl1_dVbs and fsl2_dVbs are derivatives
3037 * w.r.t. explicit Vbscl. So, Psl in the fsl1 and fsl2
3038 * expressions is regarded as a constant.
3039 *-----------------*/
3040 Chi_dT = ( Psl - Vbscl ) * beta_dT - Vbscl_dT * beta ;
3041
3042 if ( Chi < znbd5 ) {
3043 T1 = cfs1 * beta * fi ;
3044 fsl1_dVbs = T1 * ( ( Vbscl_dVbs - Vdseff_dVbs ) * fi - 2.0 * fi_dChi * Vbscl_dVbs ) ;
3045 fsl1_dVds = - T1 * fi * Vdseff_dVds ;
3046 fsl1_dVgs = - T1 * fi * Vdseff_dVgs ;
3047 cfs1_dT = exp_bVbsVds * cnst1_dT + cnst1 * exp_bVbsVds_dT ;
3048 fsl1_dT = fi * fi * cfs1_dT + 2 * cfs1 * fi * fi_dChi * Chi_dT ;
3049 T2 = 0.5 / fsl2 ;
3050 fsl2_dVbs = ( - beta * fb_dChi * 2 * fb * Vbscl_dVbs + fsl1_dVbs ) * T2 ;
3051 fsl2_dVds = fsl1_dVds * T2 ;
3052 fsl2_dVgs = fsl1_dVgs * T2 ;
3053 fsl2_dT = ( 2 * fb * fb_dChi * Chi_dT + fsl1_dT ) * T2 ;
3054 } else {
3055 Rho_dT = beta_dT * ( Psl - Vds ) - beta * Vdseff_dT ;
3056 exp_Rho_dT = Rho_dT * exp_Rho ;
3057
3058 T1 = cnst1 * beta ;
3059 fsl1_dVbs = - T1 * ( exp_Rho * Vdseff_dVbs
3060 + ( Vbscl_dVbs - Vdseff_dVbs ) * exp_bVbsVds );
3061 fsl1_dVds = - T1 * Vdseff_dVds * ( exp_Rho - exp_bVbsVds );
3062 fsl1_dVgs = T1 * Vdseff_dVgs * ( - exp_Rho + exp_bVbsVds );
3063 fsl1_dT = cnst1 * ( exp_Rho_dT - exp_bVbsVds_dT ) + cnst1_dT * ( exp_Rho - exp_bVbsVds ) ;
3064 T2 = 0.5e0 / fsl2 ;
3065 fsl2_dVbs = ( - beta * Vbscl_dVbs + fsl1_dVbs ) * T2 ;
3066 fsl2_dVds = ( fsl1_dVds ) * T2 ;
3067 fsl2_dVgs = ( fsl1_dVgs ) * T2 ;
3068 fsl2_dT = ( Chi_dT + fsl1_dT ) * T2 ;
3069 }
3070
3071 T1 = 1.0 / Fsl_dPsl ;
3072 Psl_dVbs = - ( Vgp_dVbs - ( fac1 * fsl2_dVbs + fac1_dVbs * fsl2 ) ) * T1 ;
3073 Psl_dVds = - ( Vgp_dVds - ( fac1 * fsl2_dVds + fac1_dVds * fsl2 ) ) * T1 ;
3074 Psl_dVgs = - ( Vgp_dVgs - ( fac1 * fsl2_dVgs + fac1_dVgs * fsl2 ) ) * T1 ;
3075 Psl_dT = - ( Vgp_dT - ( fac1 * fsl2_dT + fac1_dT * fsl2 ) ) * T1 ;
3076
3077 Chi_dT = ( Psl - Vbscl ) * beta_dT + beta * ( Psl_dT - Vbscl_dT );
3078 exp_Chi_dT = exp_Chi * Chi_dT ;
3079
3080
3081 if ( Chi < znbd5 ) {
3082 /*-------------------------------------------*
3083 * zone-D1/D2. (Psl)
3084 *-----------------*/
3085 Xil = fb * fb + epsm10 ;
3086 T1 = 2 * fb * fb_dChi * beta ;
3087 Xil_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ;
3088 Xil_dVds = T1 * Psl_dVds ;
3089 Xil_dVgs = T1 * Psl_dVgs ;
3090 Xil_dT = 2 * fb * fb_dChi * Chi_dT ;
3091
3092 Xilp12 = fb + epsm10 ;
3093 T1 = fb_dChi * beta ;
3094 Xilp12_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ;
3095 Xilp12_dVds = T1 * Psl_dVds ;
3096 Xilp12_dVgs = T1 * Psl_dVgs ;
3097 Xilp12_dT = fb_dChi * Chi_dT ;
3098
3099 Xilp32 = fb * fb * fb + epsm10 ;
3100 T1 = 3 * fb * fb * fb_dChi * beta ;
3101 Xilp32_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ;
3102 Xilp32_dVds = T1 * Psl_dVds ;
3103 Xilp32_dVgs = T1 * Psl_dVgs ;
3104 Xilp32_dT = 3 * fb * fb * fb_dChi * Chi_dT ;
3105
3106 } else {
3107 /*-------------------------------------------*
3108 * zone-D3. (Psl)
3109 *-----------------*/
3110
3111 Xil = Chi - 1.0e0 ;
3112 Xil_dVbs = beta * ( Psl_dVbs - Vbscl_dVbs ) ;
3113 Xil_dVds = beta * Psl_dVds ;
3114 Xil_dVgs = beta * Psl_dVgs ;
3115 Xil_dT = Chi_dT ;
3116
3117 Xilp12 = sqrt( Xil ) ;
3118 T1 = 0.5e0 / Xilp12 ;
3119 Xilp12_dVbs = T1 * Xil_dVbs ;
3120 Xilp12_dVds = T1 * Xil_dVds ;
3121 Xilp12_dVgs = T1 * Xil_dVgs ;
3122 Xilp12_dT = T1 * Xil_dT ;
3123
3124 Xilp32 = Xil * Xilp12 ;
3125 T1 = 1.5e0 * Xilp12 ;
3126 Xilp32_dVbs = T1 * Xil_dVbs ;
3127 Xilp32_dVds = T1 * Xil_dVds ;
3128 Xilp32_dVgs = T1 * Xil_dVgs ;
3129 Xilp32_dT = T1 * Xil_dT ;
3130
3131 }
3132
3133
3134 /*---------------------------------------------------*
3135 * Assign Pds.
3136 *-----------------*/
3137 Pds = Psl - Ps0 ;
3138
3139 /* if ( Pds < ps_conv ) { */
3140 if ( Pds < 0.0 ) { /* take care of numerical noise */
3141 Pds = 0.0 ;
3142 Psl = Ps0 ;
3143 }
3144
3145 Pds_dVbs = Psl_dVbs - Ps0_dVbs ;
3146 Pds_dVds = Psl_dVds - Ps0_dVds ;
3147 Pds_dVgs = Psl_dVgs - Ps0_dVgs ;
3148 Pds_dT = Psl_dT - Ps0_dT ;
3149
3150 /* if ( Pds < ps_conv ) { */
3151 if ( Pds < 0.0 ) {
3152 Pds_dVbs = 0.0 ;
3153 Pds_dVgs = 0.0 ;
3154 Psl_dVbs = Ps0_dVbs ;
3155 Psl_dVgs = Ps0_dVgs ;
3156 Pds_dT = 0.0 ;
3157 Psl_dT = Ps0_dT ;
3158 }
3159
3160 /* Vdseff */
3161 Vds = Vdsorg;
3162
3163 /*-----------------------------------------------------------*
3164 * Evaluate Idd.
3165 * - Eta : substantial variable of QB'/Pds and Idd/Pds.
3166 * - note: Eta = 4 * GAMMA_{hisim_0}
3167 *-----------------*/
3168 T1 = beta / Xi0 ;
3169 Eta = T1 * Pds ;
3170 T2 = Eta * beta_inv ;
3171 Eta_dVbs = T1 * ( Pds_dVbs - Xi0_dVbs * T2 ) ;
3172 Eta_dVds = T1 * ( Pds_dVds - Xi0_dVds * T2 ) ;
3173 Eta_dVgs = T1 * ( Pds_dVgs - Xi0_dVgs * T2 ) ;
3174 T1_dT = ( beta_dT * Xi0 - beta * Xi0_dT ) / Xi0 / Xi0 ;
3175 Eta_dT = T1_dT * Pds + T1 * Pds_dT ;
3176
3177 /* ( Eta + 1 )^n */
3178 Eta1 = Eta + 1.0e0 ;
3179 Eta1p12 = sqrt( Eta1 ) ;
3180 Eta1p32 = Eta1p12 * Eta1 ;
3181 Eta1p52 = Eta1p32 * Eta1 ;
3182 Eta1_dT = Eta_dT ;
3183 Eta1p12_dT = 0.5e0 / Eta1p12 * Eta1_dT ;
3184 Eta1p32_dT = Eta1p12_dT * Eta1 + Eta1p12 * Eta1_dT ;
3185 Eta1p52_dT = Eta1p32_dT * Eta1 + Eta1p32 * Eta1_dT ;
3186
3187 /* 1 / ( ( Eta + 1 )^n + 1 ) */
3188 Zeta12 = 1.0e0 / ( Eta1p12 + 1.0e0 ) ;
3189 Zeta32 = 1.0e0 / ( Eta1p32 + 1.0e0 ) ;
3190 Zeta52 = 1.0e0 / ( Eta1p52 + 1.0e0 ) ;
3191 Zeta12_dT = - 1.0e0 / ( Eta1p12 + 1.0e0 ) / ( Eta1p12 + 1.0e0 ) * Eta1p12_dT ;
3192 Zeta32_dT = - 1.0e0 / ( Eta1p32 + 1.0e0 ) / ( Eta1p32 + 1.0e0 ) * Eta1p32_dT ;
3193 Zeta52_dT = - 1.0e0 / ( Eta1p52 + 1.0e0 ) / ( Eta1p52 + 1.0e0 ) * Eta1p52_dT ;
3194
3195 /*---------------------------------------------------*
3196 * F00 := PS00/Pds (n=1/2)
3197 *-----------------*/
3198 F00 = Zeta12 / Xi0p12 ;
3199 T3 = - 1 / Xi0 ;
3200 T4 = - 0.5e0 / Eta1p12 * F00 ;
3201 T5 = Zeta12 * T3 ;
3202 T6 = Zeta12 * T4 ;
3203 F00_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ;
3204 F00_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ;
3205 F00_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ;
3206 F00_dT = ( Zeta12_dT * Xi0p12 - Zeta12 * Xi0p12_dT ) / Xi0p12 / Xi0p12 ;
3207
3208 /*---------------------------------------------------*
3209 * F10 := PS10/Pds (n=3/2)
3210 *-----------------*/
3211 T1 = 3.0e0 + Eta * ( 3.0e0 + Eta ) ;
3212 F10 = C_2o3 * Xi0p12 * Zeta32 * T1 ;
3213 T2 = 3.0e0 + Eta * 2.0e0 ;
3214 T3 = C_2o3 * T1 ;
3215 T4 = - 1.5e0 * Eta1p12 * F10 + C_2o3 * Xi0p12 * T2 ;
3216 T5 = Zeta32 * T3 ;
3217 T6 = Zeta32 * T4 ;
3218 F10_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ;
3219 F10_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ;
3220 F10_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ;
3221 T1_dT = Eta_dT * ( 3.0e0 + Eta ) + Eta * Eta_dT ;
3222 F10_dT = C_2o3 * Xi0p12 * Zeta32 * T1_dT
3223 + C_2o3 * T1 * ( Xi0p12 * Zeta32_dT + Zeta32 * Xi0p12_dT ) ;
3224
3225 /*---------------------------------------------------*
3226 * F30 := PS30/Pds (n=5/2)
3227 *-----------------*/
3228 T1 = 5e0 + Eta * ( 10e0 + Eta * ( 10e0 + Eta * ( 5e0 + Eta ) ) ) ;
3229 F30 = 4e0 / ( 15e0 * beta ) * Xi0p32 * Zeta52 * T1 ;
3230 T2 = 10e0 + Eta * ( 20e0 + Eta * ( 15e0 + Eta * 4e0 ) ) ;
3231 T3 = 4e0 / ( 15e0 * beta ) * T1 ;
3232 T4 = - ( 5e0 / 2e0 ) * Eta1p32 * F30 + 4e0 / ( 15e0 * beta ) * Xi0p32 * T2 ;
3233 T5 = Zeta52 * T3 ;
3234 T6 = Zeta52 * T4 ;
3235 F30_dVbs = ( Xi0p32_dVbs * T5 + Eta_dVbs * T6 ) ;
3236 F30_dVds = ( Xi0p32_dVds * T5 + Eta_dVds * T6 ) ;
3237 F30_dVgs = ( Xi0p32_dVgs * T5 + Eta_dVgs * T6 ) ;
3238 T1_dT = ( 10e0 + 20e0 * Eta + 15e0 * Eta * Eta + 4e0 * Eta * Eta * Eta ) * Eta_dT ;
3239 F30_dT = 4e0 / 15e0 * beta_inv_dT * ( Xi0p32 * Zeta52 * T1 )
3240 + 4e0 / 15e0 * beta_inv * ( Xi0p32_dT * Zeta52 * T1 + Xi0p32 * Zeta52_dT * T1 + Xi0p32 * Zeta52 * T1_dT ) ;
3241
3242 /*---------------------------------------------------*
3243 * F11 := PS11/Pds.
3244 *-----------------*/
3245 F11 = Ps0 * F10 + C_2o3 * beta_inv * Xilp32 - F30 ;
3246 T1 = C_2o3 * beta_inv ;
3247 F11_dVbs = Ps0_dVbs * F10 + Ps0 * F10_dVbs
3248 + T1 * Xilp32_dVbs - F30_dVbs ;
3249 F11_dVds = Ps0_dVds * F10 + Ps0 * F10_dVds
3250 + T1 * Xilp32_dVds - F30_dVds ;
3251 F11_dVgs = Ps0_dVgs * F10 + Ps0 * F10_dVgs
3252 + T1 * Xilp32_dVgs - F30_dVgs ;
3253 F11_dT = Ps0_dT * F10 + Ps0 * F10_dT
3254 + C_2o3 *( beta_inv_dT * Xilp32 + beta_inv * Xilp32_dT ) - F30_dT ;
3255
3256 /*---------------------------------------------------*
3257 * Fdd := Idd/Pds.
3258 *-----------------*/
3259 T1 = Vgp + beta_inv - 0.5e0 * ( 2.0e0 * Ps0 + Pds ) ;
3260 T2 = - F10 + F00 ;
3261 T3 = beta * Cox ;
3262 T4 = beta * cnst0 ;
3263 Fdd = T3 * T1 + T4 * T2 ;
3264 Fdd_dVbs = T3 * ( Vgp_dVbs - Ps0_dVbs - 0.5e0 * Pds_dVbs )
3265 + beta * Cox_dVb * T1 + T4 * ( - F10_dVbs + F00_dVbs ) ;
3266 Fdd_dVds = T3 * ( Vgp_dVds - Ps0_dVds - 0.5e0 * Pds_dVds )
3267 + beta * Cox_dVd * T1 + T4 * ( - F10_dVds + F00_dVds ) ;
3268 Fdd_dVgs = T3 * ( Vgp_dVgs - Ps0_dVgs - 0.5e0 * Pds_dVgs )
3269 + beta * Cox_dVg * T1 + T4 * ( - F10_dVgs + F00_dVgs ) ;
3270 T1_dT = Vgp_dT + beta_inv_dT - 0.5e0 * ( 2.0e0 * Ps0_dT + Pds_dT ) ;
3271 T2_dT = -F10_dT + F00_dT ;
3272 T3_dT = Cox * beta_dT ;
3273 T4_dT = beta * cnst0_dT + cnst0 * beta_dT ;
3274 Fdd_dT = T1 * T3_dT + T3 * T1_dT + T2 * T4_dT + T4 * T2_dT ;
3275
3276
3277 /*---------------------------------------------------*
3278 * Idd:
3279 *-----------------*/
3280 Idd = Pds * Fdd ;
3281 Idd_dVbs = Pds_dVbs * Fdd + Pds * Fdd_dVbs ;
3282 Idd_dVds = Pds_dVds * Fdd + Pds * Fdd_dVds ;
3283 Idd_dVgs = Pds_dVgs * Fdd + Pds * Fdd_dVgs ;
3284 Idd_dT = Fdd * Pds_dT + Pds * Fdd_dT ;
3285
3286 /*-----------------------------------------------------------*
3287 * Skip CLM and integrated charges if zone==D1
3288 *-----------------*/
3289 if( flg_zone == 1 ) {
3290 goto start_of_mobility ;
3291 }
3292
3293 /*-----------------------------------------------------------*
3294 * Channel Length Modulation. Lred: \Delta L
3295 *-----------------*/
3296 if( pParam->HSMHV2_clm2 < epsm10 && pParam->HSMHV2_clm3 < epsm10 ) {
3297 Lred = 0.0e0 ;
3298 Lred_dVbs = 0.0e0 ;
3299 Lred_dVds = 0.0e0 ;
3300 Lred_dVgs = 0.0e0 ;
3301 Lred_dT = 0.0e0 ;
3302
3303 Psdl = Psl ;
3304 Psdl_dVbs = Psl_dVbs ;
3305 Psdl_dVds = Psl_dVds ;
3306 Psdl_dVgs = Psl_dVgs ;
3307 Psdl_dT = Psl_dT ;
3308
3309 if ( Psdl > Ps0 + Vds - epsm10 ) {
3310 Psdl = Ps0 + Vds - epsm10 ;
3311 Psdl_dVbs = Ps0_dVbs ;
3312 Psdl_dVds = Ps0_dVds + 1.0 ;
3313 Psdl_dVgs = Ps0_dVgs ;
3314 Psdl_dT = Ps0_dT ;
3315 }
3316
3317 } else {
3318 T1 = here->HSMHV2_wdpl ;
3319 T8 = sqrt (Psl - Vbscl) ;
3320 Wd = T1 * T8 ;
3321 T9 = 0.5 * T1 / T8 ;
3322 Wd_dVbs = T9 * (Psl_dVbs - Vbscl_dVbs) ;
3323 Wd_dVds = T9 * Psl_dVds ;
3324 Wd_dVgs = T9 * Psl_dVgs ;
3325 Wd_dT = T9 * (Psl_dT - Vbscl_dT) ;
3326
3327 T0 = 1.0 / Wd ;
3328 T1 = Qn0 * T0 ;
3329 T2 = pParam->HSMHV2_clm3 * T1 ;
3330 T3 = pParam->HSMHV2_clm3 * T0 ;
3331 T2_dVb = T3 * (Qn0_dVbs - T1 * Wd_dVbs) ;
3332 T2_dVd = T3 * (Qn0_dVds - T1 * Wd_dVds) ;
3333 T2_dVg = T3 * (Qn0_dVgs - T1 * Wd_dVgs) ;
3334 T2_dT = T3 * (Qn0_dT - T1 * Wd_dT) ;
3335
3336 T5 = pParam->HSMHV2_clm2 * q_Nsub + T2 ;
3337 T1 = 1.0 / T5 ;
3338 T4 = C_ESI * T1 ;
3339 T4_dVb = - T4 * T2_dVb * T1 ;
3340 T4_dVd = - T4 * T2_dVd * T1 ;
3341 T4_dVg = - T4 * T2_dVg * T1 ;
3342 T4_dT = -T4 * T2_dT * T1 ;
3343
3344 T1 = (1.0e0 - pParam->HSMHV2_clm1) ;
3345 Psdl = pParam->HSMHV2_clm1 * (Vds + Ps0) + T1 * Psl ;
3346 Psdl_dVbs = pParam->HSMHV2_clm1 * Ps0_dVbs + T1 * Psl_dVbs ;
3347 Psdl_dVds = pParam->HSMHV2_clm1 * (1.0 + Ps0_dVds) + T1 * Psl_dVds ;
3348 Psdl_dVgs = pParam->HSMHV2_clm1 * Ps0_dVgs + T1 * Psl_dVgs ;
3349 Psdl_dT = pParam->HSMHV2_clm1 * Ps0_dT + T1 * Psl_dT ;
3350
3351 if ( Psdl > Ps0 + Vds - epsm10 ) {
3352 Psdl = Ps0 + Vds - epsm10 ;
3353 Psdl_dVbs = Ps0_dVbs ;
3354 Psdl_dVds = Ps0_dVds + 1.0 ;
3355 Psdl_dVgs = Ps0_dVgs ;
3356 Psdl_dT = Ps0_dT ;
3357 }
3358 T6 = Psdl - Psl ;
3359 T6_dVb = Psdl_dVbs - Psl_dVbs ;
3360 T6_dVd = Psdl_dVds - Psl_dVds ;
3361 T6_dVg = Psdl_dVgs - Psl_dVgs ;
3362 T6_dT = Psdl_dT - Psl_dT ;
3363
3364 T3 = beta * Qn0 ;
3365 T1 = 1.0 / T3 ;
3366 T5 = Idd * T1 ;
3367 T3_dT = beta * Qn0_dT + beta_dT * Qn0 ;
3368 T1_dT = - T1 * T1 * T3_dT ;
3369 T5_dT = Idd_dT * T1 + Idd * T1_dT ;
3370 T2 = T5 * beta ;
3371 T5_dVb = (Idd_dVbs - T2 * Qn0_dVbs) * T1 ;
3372 T5_dVd = (Idd_dVds - T2 * Qn0_dVds) * T1 ;
3373 T5_dVg = (Idd_dVgs - T2 * Qn0_dVgs) * T1 ;
3374
3375 T10 = q_Nsub / C_ESI ;
3376 T1 = 1.0e5 ;
3377 T2 = 1.0 / Leff ;
3378 T11 = (2.0 * T5 + 2.0 * T10 * T6 * T4 + T1 * T4) * T2 ;
3379 T3 = T2 * T4 ;
3380 T7 = T11 * T4 ;
3381 T7_dVb = (2.0 * T5_dVb + 2.0 * T10 * (T6_dVb * T4 + T6 * T4_dVb) + T1 * T4_dVb) * T3 + T11 * T4_dVb ;
3382 T7_dVd = (2.0 * T5_dVd + 2.0 * T10 * (T6_dVd * T4 + T6 * T4_dVd) + T1 * T4_dVd) * T3 + T11 * T4_dVd ;
3383 T7_dVg = (2.0 * T5_dVg + 2.0 * T10 * (T6_dVg * T4 + T6 * T4_dVg) + T1 * T4_dVg) * T3 + T11 * T4_dVg ;
3384 T7_dT = (2.0 * T5_dT + 2.0 * T10 * ( T6_dT * T4 + T6 * T4_dT ) + T1 * T4_dT ) * T3 + T11 * T4_dT ;
3385
3386 T11 = 4.0 * (2.0 * T10 * T6 + T1) ;
3387 T1 = 8.0 * T10 * T4 * T4 ;
3388 T2 = 2.0 * T11 * T4 ;
3389 T8 = T11 * T4 * T4 ;
3390 T8_dVb = ( T1 * T6_dVb + T2 * T4_dVb) ;
3391 T8_dVd = ( T1 * T6_dVd + T2 * T4_dVd) ;
3392 T8_dVg = ( T1 * T6_dVg + T2 * T4_dVg) ;
3393 T8_dT = ( T1 * T6_dT + T2 * T4_dT) ;
3394
3395 T9 = sqrt (T7 * T7 + T8);
3396 T1 = 1.0 / T9 ;
3397 T2 = T7 * T1 ;
3398 T3 = 0.5 * T1 ;
3399 T9_dVb = (T2 * T7_dVb + T3 * T8_dVb) ;
3400 T9_dVd = (T2 * T7_dVd + T3 * T8_dVd) ;
3401 T9_dVg = (T2 * T7_dVg + T3 * T8_dVg) ;
3402 T9_dT = (T2 * T7_dT + T3 * T8_dT) ;
3403
3404 Lred = 0.5 * (- T7 + T9) ;
3405 Lred_dVbs = 0.5 * (- T7_dVb + T9_dVb) ;
3406 Lred_dVds = 0.5 * (- T7_dVd + T9_dVd) ;
3407 Lred_dVgs = 0.5 * (- T7_dVg + T9_dVg) ;
3408 Lred_dT = 0.5 * (- T7_dT + T9_dT ) ;
3409 /*---------------------------------------------------*
3410 * Modify Lred for symmetry.
3411 *-----------------*/
3412 T1 = Lred ;
3413 Lred = FMDVDS * T1 ;
3414 Lred_dVbs = FMDVDS_dVbs * T1 + FMDVDS * Lred_dVbs ;
3415 Lred_dVds = FMDVDS_dVds * T1 + FMDVDS * Lred_dVds ;
3416 Lred_dVgs = FMDVDS_dVgs * T1 + FMDVDS * Lred_dVgs ;
3417 Lred_dT = FMDVDS_dT * T1 + FMDVDS * Lred_dT ;
3418 }
3419
3420 /* CLM5 & CLM6 */
3421 Lred *= here->HSMHV2_clmmod ;
3422 Lred_dVbs *= here->HSMHV2_clmmod ;
3423 Lred_dVds *= here->HSMHV2_clmmod ;
3424 Lred_dVgs *= here->HSMHV2_clmmod ;
3425 Lred_dT *= here->HSMHV2_clmmod ;
3426
3427 /*---------------------------------------------------*
3428 * Qbu : -Qb in unit area.
3429 *-----------------*/
3430 T1 = Vgp + beta_inv ;
3431 T2 = T1 * F10 - F11 ;
3432 T1_dT = Vgp_dT + beta_inv_dT ;
3433 T2_dT = T1_dT * F10 + T1 * F10_dT - F11_dT ;
3434
3435 Qbnm = cnst0 * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds )
3436 + Cox * T2 ) ;
3437 Qbnm_dVbs = cnst0 * ( cnst0 * ( - Xi0_dVbs - 0.5e0 * beta * Pds_dVbs )
3438 + Cox * ( Vgp_dVbs * F10 + T1 * F10_dVbs - F11_dVbs )
3439 + Cox_dVb * T2 ) ;
3440 Qbnm_dVds = cnst0 * ( cnst0 * ( - Xi0_dVds - 0.5e0 * beta * Pds_dVds )
3441 + Cox * ( Vgp_dVds * F10 + T1 * F10_dVds - F11_dVds )
3442 + Cox_dVd * T2 ) ;
3443 Qbnm_dVgs = cnst0 * ( cnst0 * ( - Xi0_dVgs - 0.5e0 * beta * Pds_dVgs )
3444 + Cox * ( Vgp_dVgs * F10 + T1 * F10_dVgs - F11_dVgs )
3445 + Cox_dVg * T2 ) ;
3446 Qbnm_dT = cnst0_dT * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds )
3447 + Cox * T2 )
3448 + cnst0 * ( cnst0_dT * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds )
3449 + cnst0 * ( - Xi0_dT - 0.5 * beta_dT * Pds - 0.5 * beta * Pds_dT )
3450 + Cox * T2_dT );
3451
3452 T1 = beta ;
3453 Qbu = T1 * Qbnm / Fdd ;
3454 T2 = T1 / ( Fdd * Fdd ) ;
3455 Qbu_dVbs = T2 * ( Fdd * Qbnm_dVbs - Qbnm * Fdd_dVbs ) ;
3456 Qbu_dVds = T2 * ( Fdd * Qbnm_dVds - Qbnm * Fdd_dVds ) ;
3457 Qbu_dVgs = T2 * ( Fdd * Qbnm_dVgs - Qbnm * Fdd_dVgs ) ;
3458 T1_dT = beta_dT ;
3459 Qbu_dT = ( Fdd * ( T1_dT * Qbnm + T1 * Qbnm_dT ) - T1 * Qbnm * Fdd_dT ) / ( Fdd * Fdd ) ;
3460
3461
3462 /*---------------------------------------------------*
3463 * preparation for Qi and Qd.
3464 * - DtPds: Delta * Pds ;
3465 * - Achi: (1+Delta) * Pds ;
3466 *-----------------*/
3467 T1 = 2.0e0 * fac1 ;
3468 DtPds = T1 * ( F10 - Xi0p12 ) ;
3469 T2 = 2.0 * ( F10 - Xi0p12 ) ;
3470 DtPds_dVbs = T1 * ( F10_dVbs - Xi0p12_dVbs )
3471 + T2 * fac1_dVbs ;
3472 DtPds_dVds = T1 * ( F10_dVds - Xi0p12_dVds )
3473 + T2 * fac1_dVds ;
3474 DtPds_dVgs = T1 * ( F10_dVgs - Xi0p12_dVgs )
3475 + T2 * fac1_dVgs ;
3476 T1_dT = 2.0e0 * fac1_dT ;
3477 DtPds_dT = T1_dT * ( F10 - Xi0p12 ) + T1 * ( F10_dT -Xi0p12_dT ) ;
3478
3479 Achi = Pds + DtPds ;
3480 Achi_dVbs = Pds_dVbs + DtPds_dVbs ;
3481 Achi_dVds = Pds_dVds + DtPds_dVds ;
3482 Achi_dVgs = Pds_dVgs + DtPds_dVgs ;
3483 Achi_dT = Pds_dT + DtPds_dT ;
3484
3485 /*-----------------------------------------------------------*
3486 * Alpha : parameter to evaluate charges.
3487 * - Achi: (1+Delta) * Pds ;
3488 * - clamped to 0 if Alpha < 0.
3489 *-----------------*/
3490 T1 = 1.0 / VgVt ;
3491 T2 = Achi * T1 ;
3492 T3 = 1.0e0 - T2 ;
3493 TX = 1.0 - T3 ;
3494 Fn_CP( TY , TX , 1.0 , 4 , T4 ) ;
3495 Alpha = 1.0 - TY ;
3496 T5 = T1 * T4 ;
3497 Alpha_dVbs = - ( Achi_dVbs - T2 * VgVt_dVbs ) * T5 ;
3498 Alpha_dVds = - ( Achi_dVds - T2 * VgVt_dVds ) * T5 ;
3499 Alpha_dVgs = - ( Achi_dVgs - T2 * VgVt_dVgs ) * T5 ;
3500 Alpha_dT = - ( Achi_dT - T2 * VgVt_dT ) * T5 ;
3501
3502
3503 /*-----------------------------------------------------------*
3504 * Qiu : -Qi in unit area.
3505 *-----------------*/
3506
3507 Qinm = 1.0e0 + Alpha * ( 1.0e0 + Alpha ) ;
3508 T1 = 1.0e0 + Alpha + Alpha ;
3509 Qinm_dVbs = Alpha_dVbs * T1 ;
3510 Qinm_dVds = Alpha_dVds * T1 ;
3511 Qinm_dVgs = Alpha_dVgs * T1 ;
3512 Qinm_dT = Alpha_dT * T1 ;
3513
3514 Qidn = Fn_Max( 1.0e0 + Alpha , epsm10 ) ;
3515 Qidn_dVbs = Alpha_dVbs ;
3516 Qidn_dVds = Alpha_dVds ;
3517 Qidn_dVgs = Alpha_dVgs ;
3518 Qidn_dT = Alpha_dT ;
3519
3520 T1 = C_2o3 * VgVt * Qinm / Qidn ;
3521 Qiu = T1 * Cox ;
3522 T2 = 1.0 / VgVt ;
3523 T3 = 1.0 / Qinm ;
3524 T4 = 1.0 / Qidn ;
3525 Qiu_dVbs = Qiu * ( VgVt_dVbs * T2 + Qinm_dVbs * T3 - Qidn_dVbs * T4 )
3526 + T1 * Cox_dVb ;
3527 Qiu_dVds = Qiu * ( VgVt_dVds * T2 + Qinm_dVds * T3 - Qidn_dVds * T4)
3528 + T1 * Cox_dVd ;
3529 Qiu_dVgs = Qiu * ( VgVt_dVgs * T2 + Qinm_dVgs * T3 - Qidn_dVgs * T4)
3530 + T1 * Cox_dVg ;
3531 T1_dT = C_2o3 * ( Qidn * ( VgVt_dT * Qinm + VgVt * Qinm_dT ) - Qidn_dT * VgVt * Qinm )
3532 / ( Qidn * Qidn ) ;
3533 Qiu_dT = Cox * T1_dT ;
3534
3535
3536 /*-----------------------------------------------------------*
3537 * Qdrat : Qd/Qi
3538 *-----------------*/
3539 Qdnm = 0.5e0 + Alpha ;
3540 Qdnm_dVbs = Alpha_dVbs ;
3541 Qdnm_dVds = Alpha_dVds ;
3542 Qdnm_dVgs = Alpha_dVgs ;
3543 Qdnm_dT = Alpha_dT ;
3544
3545 Qddn = Qidn * Qinm ;
3546 Qddn_dVbs = Qidn_dVbs * Qinm + Qidn * Qinm_dVbs ;
3547 Qddn_dVds = Qidn_dVds * Qinm + Qidn * Qinm_dVds ;
3548 Qddn_dVgs = Qidn_dVgs * Qinm + Qidn * Qinm_dVgs ;
3549 Qddn_dT = Qidn_dT * Qinm + Qidn * Qinm_dT ;
3550
3551 Quot = 0.4e0 * Qdnm / Qddn ;
3552 Qdrat = 0.6e0 - Quot ;
3553
3554 if ( Qdrat <= 0.5e0 ) {
3555 T1 = 1.0 / Qddn ;
3556 T2 = 1.0 / Qdnm ;
3557 Qdrat_dVbs = Quot * ( Qddn_dVbs * T1 - Qdnm_dVbs * T2 ) ;
3558 Qdrat_dVds = Quot * ( Qddn_dVds * T1 - Qdnm_dVds * T2 ) ;
3559 Qdrat_dVgs = Quot * ( Qddn_dVgs * T1 - Qdnm_dVgs * T2 ) ;
3560 Qdrat_dT = Quot * ( Qddn_dT * T1 - Qdnm_dT * T2 ) ;
3561 } else {
3562 Qdrat = 0.5e0 ;
3563 Qdrat_dVbs = 0.0e0 ;
3564 Qdrat_dVds = 0.0e0 ;
3565 Qdrat_dVgs = 0.0e0 ;
3566 Qdrat_dT = 0.0e0 ;
3567
3568 }
3569
3570
3571 /*-----------------------------------------------------------*
3572 * Interpolate charges and CLM for zone-D2.
3573 *-----------------*/
3574
3575 if ( flg_zone == 2 ) {
3576 T1 = Qbu ;
3577 Qbu = FD2 * Qbu + ( 1.0 - FD2 ) * Qb0 ;
3578 Qbu_dVbs = FD2 * Qbu_dVbs + FD2_dVbs * T1
3579 + ( 1.0 - FD2 ) * Qb0_dVb - FD2_dVbs * Qb0 ;
3580 Qbu_dVds = FD2 * Qbu_dVds + FD2_dVds * T1
3581 + ( 1.0 - FD2 ) * Qb0_dVd - FD2_dVds * Qb0 ;
3582 Qbu_dVgs = FD2 * Qbu_dVgs + FD2_dVgs * T1
3583 + ( 1.0 - FD2 ) * Qb0_dVg - FD2_dVgs * Qb0 ;
3584 Qbu_dT = FD2 * Qbu_dT + FD2_dT * T1
3585 + ( 1.0 - FD2 ) * Qb0_dT - FD2_dT * Qb0 ;
3586
3587 if ( Qbu < 0.0 ) {
3588 Qbu = 0.0 ;
3589 Qbu_dVbs = 0.0 ;
3590 Qbu_dVds = 0.0 ;
3591 Qbu_dVgs = 0.0 ;
3592 Qbu_dT = 0.0 ;
3593 }
3594 T1 = Qiu ;
3595 Qiu = FD2 * Qiu + ( 1.0 - FD2 ) * Qn0 ;
3596 Qiu_dVbs = FD2 * Qiu_dVbs + FD2_dVbs * T1
3597 + ( 1.0 - FD2 ) * Qn0_dVbs - FD2_dVbs * Qn0 ;
3598 Qiu_dVds = FD2 * Qiu_dVds + FD2_dVds * T1
3599 + ( 1.0 - FD2 ) * Qn0_dVds - FD2_dVds * Qn0 ;
3600 Qiu_dVgs = FD2 * Qiu_dVgs + FD2_dVgs * T1
3601 + ( 1.0 - FD2 ) * Qn0_dVgs - FD2_dVgs * Qn0 ;
3602 Qiu_dT = FD2 * Qiu_dT + FD2_dT * T1
3603 + ( 1.0 - FD2 ) * Qn0_dT - FD2_dT * Qn0 ;
3604
3605 if ( Qiu < 0.0 ) {
3606 Qiu = 0.0 ;
3607 Qiu_dVbs = 0.0 ;
3608 Qiu_dVds = 0.0 ;
3609 Qiu_dVgs = 0.0 ;
3610 Qiu_dT = 0.0 ;
3611 }
3612
3613 T1 = Qdrat ;
3614 Qdrat = FD2 * Qdrat + ( 1.0 - FD2 ) * 0.5e0 ;
3615 Qdrat_dVbs = FD2 * Qdrat_dVbs + FD2_dVbs * T1 - FD2_dVbs * 0.5e0 ;
3616 Qdrat_dVds = FD2 * Qdrat_dVds + FD2_dVds * T1 - FD2_dVds * 0.5e0 ;
3617 Qdrat_dVgs = FD2 * Qdrat_dVgs + FD2_dVgs * T1 - FD2_dVgs * 0.5e0 ;
3618 Qdrat_dT = FD2 * Qdrat_dT + FD2_dT * T1 - FD2_dT * 0.5e0 ;
3619
3620 /* note: Lred=0 in zone-D1 */
3621 T1 = Lred ;
3622 Lred = FD2 * Lred ;
3623 Lred_dVbs = FD2 * Lred_dVbs + FD2_dVbs * T1 ;
3624 Lred_dVds = FD2 * Lred_dVds + FD2_dVds * T1 ;
3625 Lred_dVgs = FD2 * Lred_dVgs + FD2_dVgs * T1 ;
3626 Lred_dT = FD2 * Lred_dT + FD2_dT * T1 ;
3627
3628 } /* end of flg_zone==2 if-block */
3629
3630
3631 start_of_mobility:
3632
3633 Lch = Leff - Lred ;
3634 if ( Lch < 1.0e-9 ) {
3635 fprintf ( stderr , "*** warning(HiSIM_HV(%s)): actual channel length is too small. (Lch=%e[m])\n" , model->HSMHV2modName, Lch ) ;
3636 fprintf ( stderr , " CLM5 and/or CLM6 might be too large.\n" ) ;
3637 Lch = 1.0e-9 ; Lch_dVbs = Lch_dVds = Lch_dVgs = 0.0 ;
3638 Lch_dT = 0.0 ;
3639 } else { Lch_dVbs = - Lred_dVbs ; Lch_dVds = - Lred_dVds ; Lch_dVgs = - Lred_dVgs ;
3640 Lch_dT = - Lred_dT ;
3641 }
3642
3643 /*-----------------------------------------------------------*
3644 * Muun : universal mobility. (CGS unit)
3645 *-----------------*/
3646
3647 T1 = here->HSMHV2_ndep_o_esi ;
3648 T2 = here->HSMHV2_ninv_o_esi ;
3649
3650 T0 = here->HSMHV2_ninvd ;
3651 T4 = 1.0 + ( Psl - Ps0 ) * T0 ;
3652 T4_dVb = ( Psl_dVbs - Ps0_dVbs ) * T0 ;
3653 T4_dVd = ( Psl_dVds - Ps0_dVds ) * T0 ;
3654 T4_dVg = ( Psl_dVgs - Ps0_dVgs ) * T0 ;
3655 T4_dT = ( Psl_dT - Ps0_dT ) * T0 + ( Psl - Ps0 ) * ninvd_dT ;
3656
3657 T5 = T1 * Qbu + T2 * Qiu ;
3658 T5_dVb = T1 * Qbu_dVbs + T2 * Qiu_dVbs ;
3659 T5_dVd = T1 * Qbu_dVds + T2 * Qiu_dVds ;
3660 T5_dVg = T1 * Qbu_dVgs + T2 * Qiu_dVgs ;
3661 T5_dT = T1 * Qbu_dT + T2 * Qiu_dT ;
3662
3663 T3 = T5 / T4 ;
3664 T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ;
3665 T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ;
3666 T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ;
3667 T3_dT = ( - T4_dT * T5 + T4 * T5_dT ) / T4 / T4 ;
3668
3669 Eeff = T3 ;
3670 Eeff_dVbs = T3_dVb ;
3671 Eeff_dVds = T3_dVd ;
3672 Eeff_dVgs = T3_dVg ;
3673 Eeff_dT = T3_dT ;
3674
3675 T5 = Fn_Pow( Eeff , model->HSMHV2_mueph0 - 1.0e0 ) ;
3676 T8 = T5 * Eeff ;
3677 T7 = Fn_Pow( Eeff , here->HSMHV2_muesr - 1.0e0 ) ;
3678 T6 = T7 * Eeff ;
3679 T8_dT = model->HSMHV2_mueph0 * T5 * Eeff_dT ;
3680 T6_dT = here->HSMHV2_muesr * T7 * Eeff_dT ;
3681
3682 T9 = C_QE * C_m2cm_p2 ;
3683 Rns = Qiu / T9 ;
3684 Rns_dT = Qiu_dT / T9 ;
3685
3686 T1 = 1.0e0 / ( pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 )
3687 + here->HSMHV2_mphn0 * T8 + T6 / pParam->HSMHV2_muesr1 ;
3688
3689
3690 T1_dT = - 1.0e0 / ( pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 )
3691 / ( pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 )
3692 * pParam->HSMHV2_muecb1 * Rns_dT / 1.0e11
3693 + here->HSMHV2_mphn0 * T8_dT + mphn0_dT * T8 + T6_dT / pParam->HSMHV2_muesr1 ;
3694
3695 Muun = 1.0e0 / T1 ;
3696 Muun_dT = - Muun / T1 * T1_dT ;
3697
3698 T1 = 1.0e0 / ( T1 * T1 ) ;
3699 T2 = pParam->HSMHV2_muecb0 + pParam->HSMHV2_muecb1 * Rns / 1.0e11 ;
3700 T2 = 1.0e0 / ( T2 * T2 ) ;
3701 T3 = here->HSMHV2_mphn1 * T5 ;
3702 T4 = here->HSMHV2_muesr * T7 / pParam->HSMHV2_muesr1 ;
3703 T5 = - 1.0e-11 * pParam->HSMHV2_muecb1 / C_QE * T2 / C_m2cm_p2 ;
3704 Muun_dVbs = - ( T5 * Qiu_dVbs
3705 + Eeff_dVbs * T3 + Eeff_dVbs * T4 ) * T1 ;
3706 Muun_dVds = - ( T5 * Qiu_dVds
3707 + Eeff_dVds * T3 + Eeff_dVds * T4 ) * T1 ;
3708 Muun_dVgs = - ( T5 * Qiu_dVgs
3709 + Eeff_dVgs * T3 + Eeff_dVgs * T4 ) * T1 ;
3710
3711 /* Change to MKS unit */
3712 Muun /= C_m2cm_p2 ;
3713 Muun_dT /= C_m2cm_p2 ;
3714 Muun_dVbs /= C_m2cm_p2 ;
3715 Muun_dVds /= C_m2cm_p2 ;
3716 Muun_dVgs /= C_m2cm_p2 ;
3717
3718 /*-----------------------------------------------------------*
3719 * Mu : mobility
3720 *-----------------*/
3721 T2 = beta * (Qn0 + small) * Lch ;
3722
3723
3724 T1 = 1.0e0 / T2 ;
3725 T3 = T1 * T1 ;
3726 T4 = - beta * T3 ;
3727 T5 = T4 * Lch ;
3728 T6 = T4 * (Qn0 + small) ;
3729 T1_dVb = ( T5 * Qn0_dVbs + T6 * Lch_dVbs) ;
3730 T1_dVd = ( T5 * Qn0_dVds + T6 * Lch_dVds) ;
3731 T1_dVg = ( T5 * Qn0_dVgs + T6 * Lch_dVgs) ;
3732 T2_dT = beta_dT * (Qn0 + small) * Lch + beta * Qn0_dT * Lch + beta * (Qn0 + small) * Lch_dT ;
3733 T1_dT = - T1 / T2 * T2_dT ;
3734
3735 TY = Idd * T1 ;
3736 TY_dVbs = Idd_dVbs * T1 + Idd * T1_dVb ;
3737 TY_dVds = Idd_dVds * T1 + Idd * T1_dVd ;
3738 TY_dVgs = Idd_dVgs * T1 + Idd * T1_dVg ;
3739 TY_dT = Idd_dT * T1 + Idd * T1_dT ;
3740
3741 T2 = 0.2 * Vmax / Muun ;
3742 T3 = - T2 / Muun ;
3743 T2_dVb = T3 * Muun_dVbs ;
3744 T2_dVd = T3 * Muun_dVds ;
3745 T2_dVg = T3 * Muun_dVgs ;
3746 T2_dT = 0.2 * ( Vmax_dT * Muun - Muun_dT * Vmax )/ ( Muun * Muun ) ;
3747
3748 Ey = sqrt( TY * TY + T2 * T2 ) ;
3749 T4 = 1.0 / Ey ;
3750 Ey_dVbs = T4 * ( TY * TY_dVbs + T2 * T2_dVb ) ;
3751 Ey_dVds = T4 * ( TY * TY_dVds + T2 * T2_dVd ) ;
3752 Ey_dVgs = T4 * ( TY * TY_dVgs + T2 * T2_dVg ) ;
3753 Ey_dT = T4 * ( TY * TY_dT + T2 * T2_dT ) ;
3754
3755 Em = Muun * Ey ;
3756 Em_dVbs = Muun_dVbs * Ey + Muun * Ey_dVbs ;
3757 Em_dVds = Muun_dVds * Ey + Muun * Ey_dVds ;
3758 Em_dVgs = Muun_dVgs * Ey + Muun * Ey_dVgs ;
3759 Em_dT = Ey * Muun_dT + Ey_dT * Muun ;
3760
3761 T1 = Em / Vmax ;
3762 T1_dT = ( Em_dT * Vmax - Vmax_dT * Em ) / ( Vmax * Vmax );
3763
3764 /* note: model->HSMHV2_bb = 2 (electron) ;1 (hole) */
3765 if ( 1.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 1.0e0 + epsm10 ) {
3766 T3 = 1.0e0 ;
3767 T3_dT = 0.0e0 ;
3768 } else if ( 2.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 2.0e0 + epsm10 ) {
3769 T3 = T1 ;
3770 T3_dT = T1_dT ;
3771 } else {
3772 T3 = Fn_Pow( T1 , model->HSMHV2_bb - 1.0e0 ) ;
3773 T3_dT = ( model->HSMHV2_bb - 1.0e0 )* Fn_Pow( T1 , model->HSMHV2_bb - 2.0e0 ) * T1_dT ;
3774 }
3775 T2 = T1 * T3 ;
3776 T4 = 1.0e0 + T2 ;
3777 T2_dT = T1 * T3_dT + T3 * T1_dT ;
3778 T4_dT = T2_dT ;
3779
3780 if ( 1.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 1.0e0 + epsm10 ) {
3781 T5 = 1.0 / T4 ;
3782 T6 = T5 / T4 ;
3783 T5_dT = - T5 * T5 * T4_dT ;
3784 T6_dT = T5 * T5 * ( T5_dT * T4 - T5 * T4_dT ) ;
3785 } else if ( 2.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 2.0e0 + epsm10 ) {
3786 T5 = 1.0 / sqrt( T4 ) ;
3787 T6 = T5 / T4 ;
3788 T5_dT = - 0.5e0 / ( T4 * sqrt(T4)) * T4_dT ;
3789 T6_dT = ( T5_dT * T4 - T5 * T4_dT ) / T4 / T4 ;
3790 } else {
3791 T6 = Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV2_bb - 1.0e0 ) ) ;
3792 T5 = T4 * T6 ;
3793 T6_dT =( - 1.0e0 / model->HSMHV2_bb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV2_bb - 2.0e0 ) ) * T4_dT ;
3794 T5_dT = T4_dT * T6 + T4 * T6_dT ;
3795 }
3796
3797 T7 = Muun / Vmax * T6 * T3 ;
3798
3799 Mu = Muun * T5 ;
3800 Mu_dVbs = Muun_dVbs * T5 - T7 * Em_dVbs ;
3801 Mu_dVds = Muun_dVds * T5 - T7 * Em_dVds ;
3802 Mu_dVgs = Muun_dVgs * T5 - T7 * Em_dVgs ;
3803 Mu_dT = Muun_dT * T5 + Muun * T5_dT ;
3804
3805 /* end_of_mobility : */
3806
3807 /*-----------------------------------------------------------*
3808 * Ids: channel current.
3809 *-----------------*/
3810 betaWL = here->HSMHV2_weff_nf * beta_inv / Lch ;
3811 T1 = - betaWL / Lch ;
3812 betaWL_dVbs = T1 * Lch_dVbs ;
3813 betaWL_dVds = T1 * Lch_dVds ;
3814 betaWL_dVgs = T1 * Lch_dVgs ;
3815 betaWL_dT = here->HSMHV2_weff_nf * ( beta_inv_dT * Lch - beta_inv * Lch_dT ) / ( Lch * Lch ) ;
3816
3817 Ids0 = betaWL * Idd * Mu ;
3818 T1 = betaWL * Idd ;
3819 T2 = Idd * Mu ;
3820 T3 = Mu * betaWL ;
3821 Ids0_dVbs = T3 * Idd_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ;
3822 Ids0_dVds = T3 * Idd_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ;
3823 Ids0_dVgs = T3 * Idd_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ;
3824 Ids0_dT = T3 * Idd_dT + T1 * Mu_dT + T2 * betaWL_dT ;
3825
3826 /*-----------------------------------------------------------*
3827 * Adding parasitic components to the channel current.
3828 *-----------------*/
3829 if( model->HSMHV2_ptl != 0 ){
3830 T1 = 0.5 * ( Vds - Pds ) ;
3831 Fn_SymAdd( T6 , T1 , 0.01 , T2 ) ;
3832 T2 *= 0.5 ;
3833 T6_dVb = T2 * ( - Pds_dVbs ) ;
3834 T6_dVd = T2 * ( 1.0 - Pds_dVds ) ;
3835 T6_dVg = T2 * ( - Pds_dVgs ) ;
3836 T6_dT = T2 * ( - Pds_dT ) ;
3837
3838 T1 = 1.1 - ( Ps0 + T6 );
3839 T1_dVb = - ( Ps0_dVbs + T6_dVb );
3840 T1_dVd = - ( Ps0_dVds + T6_dVd );
3841 T1_dVg = - ( Ps0_dVgs + T6_dVg );
3842 T1_dT = - ( Ps0_dT + T6_dT );
3843
3844 Fn_SZ( T2 , T1 , 0.05 , T0 ) ;
3845 T2 += small ;
3846 T2_dVb = T1_dVb * T0 ;
3847 T2_dVd = T1_dVd * T0 ;
3848 T2_dVg = T1_dVg * T0 ;
3849 T2_dT = T1_dT * T0 ;
3850
3851 T0 = beta * here->HSMHV2_ptl0 ;
3852 T0_dT = beta_dT * here->HSMHV2_ptl0 ;
3853 T3 = Cox * T0 ;
3854 T3_dVb = Cox_dVb * T0 ;
3855 T3_dVd = Cox_dVd * T0 ;
3856 T3_dVg = Cox_dVg * T0 ;
3857 T3_dT = Cox_dT * T0 + Cox * T0_dT ;
3858 T0 = pow( T2 , model->HSMHV2_ptp ) ;
3859 T9 = T3 * T0 ;
3860 T9_dVb = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dVb + T3_dVb * T0 ;
3861 T9_dVd = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dVd + T3_dVd * T0 ;
3862 T9_dVg = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dVg + T3_dVg * T0 ;
3863 T9_dT = T3 * model->HSMHV2_ptp * T0 / T2 * T2_dT + T3_dT * T0 ;
3864
3865
3866 T4 = 1.0 + Vdsz * model->HSMHV2_pt2 ;
3867 T4_dVb = Vdsz_dVbs * model->HSMHV2_pt2 ;
3868 T4_dVd = Vdsz_dVds * model->HSMHV2_pt2 ;
3869 T4_dVg = 0.0 ;
3870 T4_dT = Vdsz_dT * model->HSMHV2_pt2 ;
3871
3872 T0 = here->HSMHV2_pt40 ;
3873 T5 = Ps0 + T6 - Vbsz ;
3874 T5_dVb = Ps0_dVbs + T6_dVb - Vbsz_dVbs ;
3875 T5_dVd = Ps0_dVds + T6_dVd - Vbsz_dVds ;
3876 T5_dVg = Ps0_dVgs + T6_dVg ;
3877 T5_dT = Ps0_dT + T6_dT - Vbsz_dT ;
3878 T4 += Vdsz * T0 * T5 ;
3879 T4_dVb += Vdsz * T0 * T5_dVb + Vdsz_dVbs * T0 * T5 ;
3880 T4_dVd += Vdsz * T0 * T5_dVd + Vdsz_dVds * T0 * T5 ;
3881 T4_dVg += Vdsz * T0 * T5_dVg ;
3882 T4_dT += Vdsz * T0 * T5_dT + Vdsz_dT * T0 * T5 ;
3883
3884 T6 = T9 * T4 ;
3885 T9_dVb = T9_dVb * T4 + T9 * T4_dVb ;
3886 T9_dVd = T9_dVd * T4 + T9 * T4_dVd ;
3887 T9_dVg = T9_dVg * T4 + T9 * T4_dVg ;
3888 T9_dT = T9_dT * T4 + T9 * T4_dT ;
3889 T9 = T6 ;
3890
3891 }else{
3892 T9 = 0.0 ;
3893 T9_dVb = 0.0 ;
3894 T9_dVd = 0.0 ;
3895 T9_dVg = 0.0 ;
3896 T9_dT = 0.0 ;
3897 }
3898
3899
3900 if( model->HSMHV2_gdl != 0 ){
3901 T1 = beta * here->HSMHV2_gdl0 ;
3902 T1_dT = beta_dT * here->HSMHV2_gdl0 ;
3903 T2 = Cox * T1 ;
3904 T2_dVb = Cox_dVb * T1 ;
3905 T2_dVd = Cox_dVd * T1 ;
3906 T2_dVg = Cox_dVg * T1 ;
3907 T2_dT = Cox_dT * T1 + Cox * T1_dT ;
3908 T8 = T2 * Vdsz ;
3909 T8_dVb = T2_dVb * Vdsz + T2 * Vdsz_dVbs ;
3910 T8_dVd = T2_dVd * Vdsz + T2 * Vdsz_dVds ;
3911 T8_dVg = T2_dVg * Vdsz ;
3912 T8_dT = T2_dT * Vdsz + T2 * Vdsz_dT ;
3913 }else{
3914 T8 = 0.0 ;
3915 T8_dVb = 0.0 ;
3916 T8_dVd = 0.0 ;
3917 T8_dVg = 0.0 ;
3918 T8_dT = 0.0 ;
3919 }
3920
3921 if ( ( T9 + T8 ) > 0.0 ) {
3922 Idd1 = Pds * ( T9 + T8 ) ;
3923 Idd1_dVbs = Pds_dVbs * ( T9 + T8 ) + Pds * ( T9_dVb + T8_dVb ) ;
3924 Idd1_dVds = Pds_dVds * ( T9 + T8 ) + Pds * ( T9_dVd + T8_dVd ) ;
3925 Idd1_dVgs = Pds_dVgs * ( T9 + T8 ) + Pds * ( T9_dVg + T8_dVg ) ;
3926 Idd1_dT = Pds_dT * ( T9 + T8 ) + Pds * ( T9_dT + T8_dT ) ;
3927
3928 Ids0 += betaWL * Idd1 * Mu ;
3929 T1 = betaWL * Idd1 ;
3930 T2 = Idd1 * Mu ;
3931 T3 = Mu * betaWL ;
3932 Ids0_dVbs += T3 * Idd1_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ;
3933 Ids0_dVds += T3 * Idd1_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ;
3934 Ids0_dVgs += T3 * Idd1_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ;
3935 Ids0_dT += T3 * Idd1_dT + T1 * Mu_dT + T2 * betaWL_dT ;
3936 }
3937 /* note: rpock procedure was removed. */
3938 if( flg_rsrd == 2 || flg_rsrd == 3 ){
3939 if( model->HSMHV2_rd20 > 0.0 ){
3940 T4 = here->HSMHV2_rd23 ;
3941 T1 = pParam->HSMHV2_rd24 * ( Vgse - model->HSMHV2_rd25 ) ;
3942 T1_dVg = pParam->HSMHV2_rd24 ;
3943
3944 Fn_SL( T2 , T1 , T4 , delta_rd , T0 ) ;
3945 T2_dVg = T1_dVg * T0 ;
3946 T3 = T4 * ( model->HSMHV2_rd20 + 1.0 ) ;
3947 Fn_SU( T7 , T2 , T3 , delta_rd , T0 ) ;
3948 T7_dVg = T2_dVg * T0 ;
3949
3950 }else{
3951 T7 = here->HSMHV2_rd23;
3952 T7_dVg = 0.0e0 ;
3953 }
3954
3955 /* after testing we can remove Vdse_eff_dVbs, Vdse_eff_dVds, Vdse_eff_dVgs
3956 and Vdse_eff_dVbse, Vdse_eff_dVgse */
3957 if (Vdse >= 0.0) {
3958 Vdse_eff = Vdse ;
3959 /* Vdse_eff_dVbs = 0.0 ; */
3960 /* Vdse_eff_dVds = 0.0 ; */
3961 /* Vdse_eff_dVgs = 0.0 ; */
3962 /* Vdse_eff_dVbse = 0.0 ; */
3963 Vdse_eff_dVdse = 1.0 ;
3964 /* Vdse_eff_dVgse = 0.0 ; */
3965 } else {
3966 Vdse_eff = 0.0 ;
3967 /* Vdse_eff_dVbs = 0.0 ; */
3968 /* Vdse_eff_dVds = 0.0 ; */
3969 /* Vdse_eff_dVgs = 0.0 ; */
3970 /* Vdse_eff_dVbse = 0.0 ; */
3971 Vdse_eff_dVdse = 0.0 ;
3972 /* Vdse_eff_dVgse = 0.0 ; */
3973 }
3974
3975 /* smoothing of Ra for Vdse_eff close to zero */
3976 /* ... smoothing parameter is Ra_N */
3977 if (Vdse_eff < Ra_N * small2) {
3978 Ra_alpha = pow( Ra_N+1.0 , model->HSMHV2_rd21-1.0 )
3979 * (Ra_N+1.0-0.5*model->HSMHV2_rd21*Ra_N)
3980 * pow( small2,model->HSMHV2_rd21 );
3981 Ra_beta = 0.5*model->HSMHV2_rd21
3982 * pow( Ra_N+1.0 , model->HSMHV2_rd21-1.0 ) / Ra_N
3983 * pow( small2, model->HSMHV2_rd21-2.0 );
3984 T1 = Ra_alpha + Ra_beta*Vdse_eff*Vdse_eff;
3985 T1_dVdse_eff = 2.0 * Ra_beta * Vdse_eff;
3986 } else {
3987 T1 = pow( Vdse_eff + small2 , model->HSMHV2_rd21 ) ;
3988 T1_dVdse_eff = model->HSMHV2_rd21 * pow( Vdse_eff + small2 , model->HSMHV2_rd21 - 1.0 ) ;
3989 }
3990
3991 T9 = pow( Vdse_eff + small2 , model->HSMHV2_rd22d ) ;
3992 T9_dVdse_eff = model->HSMHV2_rd22d * pow( Vdse_eff + small2 , model->HSMHV2_rd22d - 1.0 ) ;
3993
3994 Ra = ( T7 * T1 + Vbse * pParam->HSMHV2_rd22 * T9 ) / here->HSMHV2_weff_nf ;
3995 Ra_dVdse_eff = ( T7 * T1_dVdse_eff + Vbse * pParam->HSMHV2_rd22 * T9_dVdse_eff ) / here->HSMHV2_weff_nf ;
3996 Ra_dVbs = Ra_dVdse_eff * Vdse_eff_dVbs ;
3997 Ra_dVds = Ra_dVdse_eff * Vdse_eff_dVds ;
3998 Ra_dVgs = Ra_dVdse_eff * Vdse_eff_dVgs + T7_dVg * T1 / here->HSMHV2_weff_nf ;
3999 Ra_dVbse = Ra_dVdse_eff * Vdse_eff_dVbse + pParam->HSMHV2_rd22 * T9 / here->HSMHV2_weff_nf ;
4000 Ra_dVdse = Ra_dVdse_eff * Vdse_eff_dVdse ;
4001 Ra_dVgse = Ra_dVdse_eff * Vdse_eff_dVgse ;
4002
4003 T0 = Ra * Ids0 ;
4004 T0_dVb = Ra_dVbs * Ids0 + Ra * Ids0_dVbs ;
4005 T0_dVd = Ra_dVds * Ids0 + Ra * Ids0_dVds ;
4006 T0_dVg = Ra_dVgs * Ids0 + Ra * Ids0_dVgs ;
4007 T0_dT = Ra * Ids0_dT ;
4008
4009 T1 = Vds + small2 ;
4010 T2 = 1.0 / T1 ;
4011 T3 = 1.0 + T0 * T2 ;
4012 T3_dVb = T0_dVb * T2 ;
4013 T3_dVd = ( T0_dVd * T1 - T0 ) * T2 * T2 ;
4014 T3_dVg = T0_dVg * T2 ;
4015 T3_dT = T0_dT * T2 ;
4016
4017 T4 = 1.0 / T3 ;
4018 Ids = Ids0 * T4 ;
4019 T5 = T4 * T4 ;
4020 Ids_dVbs = ( Ids0_dVbs * T3 - Ids0 * T3_dVb ) * T5 ;
4021 Ids_dVds = ( Ids0_dVds * T3 - Ids0 * T3_dVd ) * T5 ;
4022 Ids_dVgs = ( Ids0_dVgs * T3 - Ids0 * T3_dVg ) * T5 ;
4023 Ids_dT = ( Ids0_dT * T3 - Ids0 * T3_dT ) * T5 ;
4024 Ids_dRa = - Ids * Ids / ( Vds + small ) ;
4025
4026 } else {
4027 Ids = Ids0 ;
4028 Ids_dVbs = Ids0_dVbs ;
4029 Ids_dVds = Ids0_dVds ;
4030 Ids_dVgs = Ids0_dVgs ;
4031 Ids_dT = Ids0_dT ;
4032 Ra = 0.0 ;
4033 Ra_dVbs = Ra_dVds = Ra_dVgs = 0.0 ;
4034 Ra_dVbse = Ra_dVdse = Ra_dVgse = 0.0 ;
4035 Ids_dRa = 0.0 ;
4036 }
4037 /* just for testing -- can be removed */
4038 /* if (!(ckt->CKTmode & MODEINITPRED))
4039 printf("rrb %e %e %e %e %e %e\n",ckt->CKTtime,here->HSMHV2_mode*Vdse,Ra,Ra_dVdse,
4040 Vdse_eff,Vdse_eff_dVdse) ; */
4041
4042 /* if ( Pds < ps_conv ) { */
4043 if ( Pds < 0.0 ) {
4044 Ids_dVbs = 0.0 ;
4045 Ids_dVgs = 0.0 ;
4046 Ids_dT = 0.0 ;
4047 }
4048
4049 Ids += Gdsmin * Vds ;
4050 Ids_dVds += Gdsmin ;
4051
4052
4053 /*-----------------------------------------------------------*
4054 * STI
4055 *-----------------*/
4056 if ( model->HSMHV2_coisti != 0 ) {
4057 /*---------------------------------------------------*
4058 * dVthSCSTI : Short-channel effect induced by Vds (STI).
4059 *-----------------*/
4060 T1 = C_ESI * Cox_inv ;
4061 T2 = here->HSMHV2_wdpl ;
4062 T3 = here->HSMHV2_lgatesm - model->HSMHV2_parl2 ;
4063 T4 = 1.0 / (T3 * T3) ;
4064 T5 = 2.0 * (model->HSMHV2_vbi - Pb20b) * T1 * T2 * T4 ;
4065
4066 dVth0 = T5 * sqrt_Pbsum ;
4067 T6 = T5 * 0.5 / sqrt_Pbsum ;
4068 T7 = 2.0 * (model->HSMHV2_vbi - Pb20b) * C_ESI * T2 * T4 * sqrt_Pbsum ;
4069 T8 = - 2.0 * T1 * T2 * T4 * sqrt_Pbsum ;
4070 dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
4071 dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
4072 dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
4073 dVth0_dT = T6 * Pbsum_dT + T8 * Pb20b_dT ;
4074
4075 T4 = pParam->HSMHV2_scsti1 ;
4076 T6 = pParam->HSMHV2_scsti2 ;
4077 T1 = T4 + T6 * Vdsz ;
4078 dVthSCSTI = dVth0 * T1 ;
4079 dVthSCSTI_dVb = dVth0_dVb * T1 + dVth0 * T6 * Vdsz_dVbs ;
4080 dVthSCSTI_dVd = dVth0_dVd * T1 + dVth0 * T6 * Vdsz_dVds ;
4081 dVthSCSTI_dVg = dVth0_dVg * T1 ;
4082 dVthSCSTI_dT = dVth0_dT * T1 + dVth0 * T6 * Vdsz_dT ;
4083
4084 T1 = pParam->HSMHV2_vthsti - model->HSMHV2_vdsti * Vds ;
4085 T1_dVd = - model->HSMHV2_vdsti ;
4086
4087 Vgssti = Vgsz - Vfb + T1 + dVthSCSTI ;
4088 Vgssti_dVbs = Vgsz_dVbs + dVthSCSTI_dVb ;
4089 Vgssti_dVds = Vgsz_dVds + T1_dVd + dVthSCSTI_dVd ;
4090 Vgssti_dVgs = Vgsz_dVgs + dVthSCSTI_dVg ;
4091 Vgssti_dT = Vgsz_dT + dVthSCSTI_dT ;
4092
4093 costi0 = here->HSMHV2_costi0 ;
4094 costi1 = here->HSMHV2_costi1 ;
4095
4096 costi3 = here->HSMHV2_costi0_p2 * Cox_inv * Cox_inv ;
4097 T1 = 2.0 * here->HSMHV2_costi0_p2 * Cox_inv ;
4098 costi3_dVb = T1 * Cox_inv_dVb ;
4099 costi3_dVd = T1 * Cox_inv_dVd ;
4100 costi3_dVg = T1 * Cox_inv_dVg ;
4101 costi3_dT = 2 * here->HSMHV2_costi0 * here->HSMHV2_costi00 * 0.5 / sqrt(here->HSMHV2_beta_inv) * beta_inv_dT * Cox_inv * Cox_inv ;
4102 T2 = 1.0 / costi3 ;
4103 costi3_dVb_c3 = costi3_dVb * T2 ;
4104 costi3_dVd_c3 = costi3_dVd * T2 ;
4105 costi3_dVg_c3 = costi3_dVg * T2 ;
4106 costi3_dT_c3 = costi3_dT * T2 ;
4107
4108 costi4 = costi3 * beta * 0.5 ;
4109 costi4_dT = ( costi3_dT * beta + costi3 * beta_dT ) * 0.5 ;
4110 costi5 = costi4 * beta * 2.0 ;
4111 costi5_dT = ( costi4_dT * beta + costi4 * beta_dT ) * 2.0 ;
4112
4113 T11 = beta * 0.25 ;
4114 T11_dT = beta_dT * 0.25 ;
4115 T10 = beta_inv - costi3 * T11 + Vfb - pParam->HSMHV2_vthsti - dVthSCSTI + small ;
4116 T10_dVb = - T11 * costi3_dVb - dVthSCSTI_dVb ;
4117 T10_dVd = - T11 * costi3_dVd - dVthSCSTI_dVd ;
4118 T10_dVg = - T11 * costi3_dVg - dVthSCSTI_dVg ;
4119 T10_dT = beta_inv_dT - ( costi3_dT * T11 + costi3 * T11_dT ) - dVthSCSTI_dT ;
4120
4121 T1 = Vgsz - T10 - psisti_dlt ;
4122 T1_dVb = Vgsz_dVbs - T10_dVb ;
4123 T1_dVd = Vgsz_dVds - T10_dVd ;
4124 T1_dVg = Vgsz_dVgs - T10_dVg ;
4125 T1_dT = Vgsz_dT - T10_dT ;
4126 T0 = Fn_Sgn(T10) ;
4127 T2 = sqrt (T1 * T1 + T0 * 4.0 * T10 * psisti_dlt) ;
4128 T3 = T10 + 0.5 * (T1 + T2) - Vfb + pParam->HSMHV2_vthsti + dVthSCSTI - Vbsz ;
4129 T3_dVb = T10_dVb + 0.5 * (T1_dVb + (T1 * T1_dVb + T0 * 2.0 * T10_dVb * psisti_dlt) / T2)
4130 + dVthSCSTI_dVb - Vbsz_dVbs ;
4131 T3_dVd = T10_dVd + 0.5 * (T1_dVd + (T1 * T1_dVd + T0 * 2.0 * T10_dVd * psisti_dlt) / T2)
4132 + dVthSCSTI_dVd - Vbsz_dVds ;
4133 T3_dVg = T10_dVg + 0.5 * (T1_dVg + (T1 * T1_dVg + T0 * 2.0 * T10_dVg * psisti_dlt) / T2)
4134 + dVthSCSTI_dVg ;
4135 T3_dT = T10_dT + 0.5 * (T1_dT + (T1 * T1_dT + T0 * 2.0 * T10_dT * psisti_dlt) / T2)
4136 + dVthSCSTI_dT - Vbsz_dT ;
4137
4138 T4 = beta * T3 - 1.0 ;
4139 T4_dT = beta_dT * T3 + beta * T3_dT ;
4140 T5 = 4.0 / costi5 ;
4141 T5_dT = - 4.0 / ( costi5 * costi5 ) * costi5_dT ;
4142 T1 = 1.0 + T4 * T5 ;
4143 T6 = beta * T5 ;
4144 T7 = T4 * T5 ;
4145 T1_dVb = (T6 * T3_dVb - T7 * costi3_dVb_c3) ;
4146 T1_dVd = (T6 * T3_dVd - T7 * costi3_dVd_c3) ;
4147 T1_dVg = (T6 * T3_dVg - T7 * costi3_dVg_c3) ;
4148 T1_dT = T4_dT * T5 + T4 * T5_dT ;
4149 Fn_SZ( T1 , T1, 1.0e-2, T2) ;
4150 T1 += small ;
4151 T1_dVb *= T2 ;
4152 T1_dVd *= T2 ;
4153 T1_dVg *= T2 ;
4154 T1_dT *= T2 ;
4155 costi6 = sqrt(T1) ;
4156 costi6_dT = 0.5 / sqrt(T1) * T1_dT ;
4157 T0 = costi4 * (1.0 - costi6) ;
4158 T0_dT = costi4_dT * (1.0 - costi6) + costi4 * ( - costi6_dT ) ;
4159 Psasti = Vgssti + T0 ;
4160 T2 = 0.5 * costi4 / costi6 ;
4161 Psasti_dVbs = Vgssti_dVbs + costi3_dVb_c3 * T0 - T2 * T1_dVb ;
4162 Psasti_dVds = Vgssti_dVds + costi3_dVd_c3 * T0 - T2 * T1_dVd ;
4163 Psasti_dVgs = Vgssti_dVgs + costi3_dVg_c3 * T0 - T2 * T1_dVg ;
4164 Psasti_dT = Vgssti_dT + T0_dT ;
4165
4166 T0 = 1.0 / (beta + 2.0 / (Vgssti + small)) ;
4167 T0_dT = - 1.0 / ((beta + 2.0 / (Vgssti + small)) * (beta + 2.0 / (Vgssti + small))) * ( beta_dT - 2 / ((Vgssti + small) * (Vgssti + small)) * Vgssti_dT );
4168 Psbsti = log (1.0 / costi1 / costi3 * (Vgssti * Vgssti)) * T0 ;
4169 T1 = 1 / costi1 / costi3 * (Vgssti * Vgssti) ;
4170
4171 costi1_dT = 2 * here->HSMHV2_nin * Nin_dT * here->HSMHV2_nsti_p2 ;
4172
4173 T1_dT = ( - 1 / costi1 / costi1 * costi1_dT / costi3 - 1 / costi3 / costi3 * costi3_dT / costi1 ) * Vgssti * Vgssti + 1 / costi1 / costi3 * 2 * Vgssti * Vgssti_dT ;
4174 T2 = 2.0 * T0 / (Vgssti + small) ;
4175 T3 = Psbsti / (Vgssti + small) ;
4176 Psbsti_dVbs = T2 * (Vgssti_dVbs - 0.5 * costi3_dVb_c3 * Vgssti
4177 + T3 * Vgssti_dVbs ) ;
4178 Psbsti_dVds = T2 * (Vgssti_dVds - 0.5 * costi3_dVd_c3 * Vgssti
4179 + T3 * Vgssti_dVds ) ;
4180 Psbsti_dVgs = T2 * (Vgssti_dVgs - 0.5 * costi3_dVg_c3 * Vgssti
4181 + T3 * Vgssti_dVgs ) ;
4182 Psbsti_dT = 1 / T1 * T1_dT * T0 + log( T1 ) * T0_dT ;
4183
4184 Psab = Psbsti - Psasti - sti2_dlt ;
4185 Psab_dVbs = Psbsti_dVbs - Psasti_dVbs ;
4186 Psab_dVds = Psbsti_dVds - Psasti_dVds ;
4187 Psab_dVgs = Psbsti_dVgs - Psasti_dVgs ;
4188 Psab_dT = Psbsti_dT - Psasti_dT ;
4189 T0 = sqrt (Psab * Psab + 4.0 * sti2_dlt * Psbsti) ;
4190 Psti = Psbsti - 0.5 * (Psab + T0) ;
4191 T1 = 1.0 / T0 ;
4192 Psti_dVbs = Psbsti_dVbs
4193 - 0.5 * ( Psab_dVbs
4194 + ( Psab * Psab_dVbs + 2.0 * sti2_dlt * Psbsti_dVbs ) * T1 ) ;
4195 Psti_dVds = Psbsti_dVds
4196 - 0.5 * ( Psab_dVds
4197 + ( Psab * Psab_dVds + 2.0 * sti2_dlt * Psbsti_dVds ) * T1 ) ;
4198 Psti_dVgs = Psbsti_dVgs
4199 - 0.5 * ( Psab_dVgs
4200 + ( Psab * Psab_dVgs + 2.0 * sti2_dlt * Psbsti_dVgs ) * T1 ) ;
4201 Psti_dT = Psbsti_dT
4202 - 0.5 * ( Psab_dT
4203 + ( Psab * Psab_dT + 2.0 * sti2_dlt * Psbsti_dT ) * T1 ) ;
4204
4205 T0 = costi1 * exp (beta * Psti) ;
4206 T0_dT = costi1_dT * exp(beta * Psti) + costi1 * exp(beta * Psti) * ( beta_dT * Psti + beta * Psti_dT ) ;
4207 T1 = beta * (Psti - Vbsz) - 1.0 + T0 ;
4208 T1_dVb = beta * ((Psti_dVbs - Vbsz_dVbs) + T0 * Psti_dVbs) ;
4209 T1_dVd = beta * ((Psti_dVds - Vbsz_dVds) + T0 * Psti_dVds) ;
4210 T1_dVg = beta * (Psti_dVgs + T0 * Psti_dVgs) ;
4211 T1_dT = beta_dT * (Psti - Vbsz) + beta * (Psti_dT - Vbsz_dT) + T0_dT ;
4212 Fn_SZ ( T1 , T1, 1.0e-2, T0) ;
4213 T1 += small ;
4214 T1_dVb *= T0 ;
4215 T1_dVd *= T0 ;
4216 T1_dVg *= T0 ;
4217 T1_dT *= T0 ;
4218 sq1sti = sqrt (T1);
4219 T2 = 0.5 / sq1sti ;
4220 sq1sti_dVbs = T2 * T1_dVb ;
4221 sq1sti_dVds = T2 * T1_dVd ;
4222 sq1sti_dVgs = T2 * T1_dVg ;
4223 sq1sti_dT = T2 * T1_dT ;
4224
4225 T1 = beta * (Psti - Vbsz) - 1.0;
4226 T1_dVb = beta * (Psti_dVbs - Vbsz_dVbs) ;
4227 T1_dVd = beta * (Psti_dVds - Vbsz_dVds) ;
4228 T1_dVg = beta * Psti_dVgs ;
4229 T1_dT = beta_dT * ( Psti - Vbsz ) + beta * (Psti_dT - Vbsz_dT) ;
4230 Fn_SZ( T1 , T1, 1.0e-2, T0) ;
4231 T1 += small ;
4232 T1_dVb *= T0 ;
4233 T1_dVd *= T0 ;
4234 T1_dVg *= T0 ;
4235 T1_dT *= T0 ;
4236 sq2sti = sqrt (T1);
4237 T2 = 0.5 / sq2sti ;
4238 sq2sti_dVbs = T2 * T1_dVb ;
4239 sq2sti_dVds = T2 * T1_dVd ;
4240 sq2sti_dVgs = T2 * T1_dVg ;
4241 sq2sti_dT = T2 * T1_dT ;
4242
4243 Qn0sti = costi0 * (sq1sti - sq2sti) ;
4244 Qn0sti_dVbs = costi0 * (sq1sti_dVbs - sq2sti_dVbs) ;
4245 Qn0sti_dVds = costi0 * (sq1sti_dVds - sq2sti_dVds) ;
4246 Qn0sti_dVgs = costi0 * (sq1sti_dVgs - sq2sti_dVgs) ;
4247 Qn0sti_dT = costi0 * (sq1sti_dT - sq2sti_dT) + here->HSMHV2_costi00 * 0.5 / sqrt( here->HSMHV2_beta_inv ) * beta_inv_dT * (sq1sti - sq2sti) ;
4248
4249 /* T1: Vdsatsti */
4250 T1 = Psasti - Psti ;
4251 T1_dVb = Psasti_dVbs - Psti_dVbs ;
4252 T1_dVd = Psasti_dVds - Psti_dVds ;
4253 T1_dVg = Psasti_dVgs - Psti_dVgs ;
4254 T1_dT = Psasti_dT - Psti_dT ;
4255
4256 Fn_SZ( T1 , T1 , 1.0e-1 , T2 ) ;
4257 T1 += small ;
4258 T1_dVb *= T2 ;
4259 T1_dVd *= T2 ;
4260 T1_dVg *= T2 ;
4261 T1_dT *= T2 ;
4262
4263 TX = Vds / T1 ;
4264 T2 = 1.0 / ( T1 * T1 ) ;
4265 TX_dVbs = T2 * ( - Vds * T1_dVb ) ;
4266 TX_dVds = T2 * ( T1 - Vds * T1_dVd ) ;
4267 TX_dVgs = T2 * ( - Vds * T1_dVg ) ;
4268 TX_dT = T2 * ( - Vds * T1_dT ) ;
4269
4270 Fn_CP( TY , TX , 1.0 , 4 , T2 ) ;
4271 TY_dVbs = T2 * TX_dVbs ;
4272 TY_dVds = T2 * TX_dVds ;
4273 TY_dVgs = T2 * TX_dVgs ;
4274 TY_dT = T2 * TX_dT ;
4275
4276 costi7 = 2.0 * here->HSMHV2_wsti * here->HSMHV2_nf * beta_inv ;
4277 costi7_dT = 2.0 * here->HSMHV2_wsti * here->HSMHV2_nf * beta_inv_dT ;
4278 T1 = Lch ;
4279 Idssti = costi7 * Mu * Qn0sti * TY / T1 ;
4280 T3 = 1.0 / T1 ;
4281 T4 = Mu * Qn0sti * TY / T1 / T1 ;
4282 T5 = Mu * Qn0sti ;
4283 Idssti_dVbs = costi7 * (((Mu_dVbs * Qn0sti + Mu * Qn0sti_dVbs) * TY
4284 + T5 * TY_dVbs ) * T3
4285 - Lch_dVbs * T4 ) ;
4286 Idssti_dVds = costi7 * (((Mu_dVds * Qn0sti + Mu * Qn0sti_dVds) * TY
4287 + T5 * TY_dVds ) * T3
4288 - Lch_dVds * T4 ) ;
4289 Idssti_dVgs = costi7 * (((Mu_dVgs * Qn0sti + Mu * Qn0sti_dVgs) * TY
4290 + T5 * TY_dVgs ) * T3
4291 - Lch_dVgs * T4 ) ;
4292 Idssti_dT = costi7 * (((Mu_dT * Qn0sti + Mu * Qn0sti_dT) * TY
4293 + T5 * TY_dT ) * T3
4294 - Lch_dT * T4 ) + costi7_dT * Mu * Qn0sti * TY / T1 ;
4295
4296 Ids = Ids + Idssti ;
4297 Ids_dVbs = Ids_dVbs + Idssti_dVbs ;
4298 Ids_dVds = Ids_dVds + Idssti_dVds ;
4299 Ids_dVgs = Ids_dVgs + Idssti_dVgs ;
4300 Ids_dT = Ids_dT + Idssti_dT ;
4301
4302 }
4303
4304 /*----------------------------------------------------------*
4305 * induced gate noise. ( Part 1/3 )
4306 *----------------------*/
4307 if ( model->HSMHV2_coign != 0 && model->HSMHV2_cothrml != 0 && model->HSMHV2_codep==0 ) {
4308 kusai00 = VgVt * VgVt ;
4309 kusaidd = 2.0e0 * beta_inv * Cox_inv * Idd ;
4310 kusaiL = kusai00 - kusaidd ;
4311 Fn_SZ( kusai00 , kusai00 , 1.0e-3 , T0 ) ;
4312 kusai00 += small ;
4313 Fn_SZ( kusaiL , kusaiL , 1.0e-3 , T0 ) ;
4314 kusaiL += small ;
4315 kusai00L = kusai00 - kusaiL ;
4316 if ( Qn0 < epsm10 || kusai00L < epsm10 ) flg_ign = 0 ;
4317 else flg_ign = 1 ;
4318 }
4319
4320 /*-----------------------------------------------------------*
4321 * End of PART-1. (label)
4322 *-----------------*/
4323 end_of_part_1:
4324
4325
4326 /*-----------------------------------------------------------*
4327 * Implicit quantities related to Alpha.
4328 *-----------------*/
4329 if ( flg_noqi == 0 && VgVt > VgVt_small ) {
4330 Delta = fac1 * beta / ( 2 * Xi0p12 ) ;
4331 Pslsat = VgVt / ( 1.0 + Delta ) + Ps0 ;
4332 } else {
4333 Pslsat = 0.0 ;
4334 }
4335 Vdsat = Pslsat - Pb2 ;
4336 if ( Vdsat < 0.0 ) {
4337 Vdsat = 0.0 ;
4338 }
4339
4340 // Qiu for noise calc.
4341 Qiu_noi = Qiu ;
4342
4343 } // end of normal mode MOSFET
4344
4345 /*----------------------------------------------------------*
4346 * Evaluate integrated charges in unit [C].
4347 *----------------------*/
4348
4349 T1 = - here->HSMHV2_weffcv_nf * Leff ;
4350
4351 Qb = T1 * Qbu ;
4352 Qb_dVbs = T1 * Qbu_dVbs ;
4353 Qb_dVds = T1 * Qbu_dVds ;
4354 Qb_dVgs = T1 * Qbu_dVgs ;
4355 Qb_dT = T1 * Qbu_dT ;
4356
4357 Qi = T1 * Qiu ;
4358 Qi_dVbs = T1 * Qiu_dVbs ;
4359 Qi_dVds = T1 * Qiu_dVds ;
4360 Qi_dVgs = T1 * Qiu_dVgs ;
4361 Qi_dT = T1 * Qiu_dT ;
4362
4363 Qd = Qi * Qdrat ;
4364 Qd_dVbs = Qi_dVbs * Qdrat + Qi * Qdrat_dVbs ;
4365 Qd_dVds = Qi_dVds * Qdrat + Qi * Qdrat_dVds ;
4366 Qd_dVgs = Qi_dVgs * Qdrat + Qi * Qdrat_dVgs ;
4367 Qd_dT = Qi_dT * Qdrat + Qi * Qdrat_dT ;
4368
4369 // Qiu for noise calc.
4370 Qi_noi = T1*Qiu_noi ;
4371
4372
4373 /*-----------------------------------------------------------*
4374 * Modified potential for symmetry.
4375 *-----------------*/
4376 T1 = ( Vds - Pds ) / 2 ;
4377 Fn_SymAdd( Pzadd , T1 , model->HSMHV2_pzadd0 , T2 ) ;
4378 T2 /= 2 ;
4379 Pzadd_dVbs = T2 * ( - Pds_dVbs ) ;
4380 Pzadd_dVds = T2 * ( 1.0 - Pds_dVds ) ;
4381 Pzadd_dVgs = T2 * ( - Pds_dVgs ) ;
4382 Pzadd_dT = T2 * ( -Pds_dT );
4383
4384
4385 if ( Pzadd < epsm10 ) {
4386 Pzadd = epsm10 ;
4387 Pzadd_dVbs = 0.0 ;
4388 Pzadd_dVds = 0.0 ;
4389 Pzadd_dVgs = 0.0 ;
4390 Pzadd_dT = 0.0 ;
4391 }
4392
4393 Ps0z = Ps0 + Pzadd ;
4394 Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ;
4395 Ps0z_dVds = Ps0_dVds + Pzadd_dVds ;
4396 Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ;
4397 Ps0z_dT = Ps0_dT + Pzadd_dT ;
4398
4399
4400 /*-----------------------------------------------------------*
4401 * Channel leakage current.
4402 *-----------------*/
4403
4404 Ids += Weff/Leff * model->HSMHV2_gdsleak * Vds ;
4405 Ids_dVds += Weff/Leff * model->HSMHV2_gdsleak ;
4406
4407
4408 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4409 * PART-2: Substrate / gate / leak currents
4410 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
4411
4412 /*-----------------------------------------------------------*
4413 * Isub : substrate current induced by impact ionization.
4414 *-----------------*/
4415
4416 if ( model->HSMHV2_coisub == 0 ) {
4417 /* Accumulation zone or nonconductive case, in which Ids==0. */
4418 Isub = 0.0e0 ;
4419 Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ;
4420 Isub_dT = 0.0;
4421 } else {
4422 /*-------------------------------------------*
4423 * Conductive case.
4424 *-----------------*/
4425 if ( pParam->HSMHV2_sub1 > 0.0e0 && pParam->HSMHV2_vmax > 0.0e0 ) {
4426 T0 = here->HSMHV2_vg2const ;
4427 T1 = T0 * Vgp ;
4428 T1_dVd = T0 * Vgp_dVds ;
4429 T1_dVg = T0 * Vgp_dVgs ;
4430 T1_dVb = T0 * Vgp_dVbs ;
4431 T1_dT = T0 * Vgp_dT ;
4432
4433 T7 = Cox0 * Cox0 ;
4434 T8 = here->HSMHV2_qnsub_esi ;
4435 T3 = T8 / T7 ;
4436
4437 T9 = 2.0 / T8 ;
4438 T4 = T9 * T7 ;
4439
4440 T2 = here->HSMHV2_xvbs ;
4441 T5 = T1 - beta_inv - T2 * Vbsz ;
4442 T5_dVd = T1_dVd - T2 * Vbsz_dVds;
4443 T5_dVg = T1_dVg ;
4444 T5_dVb = T1_dVb - T2 * Vbsz_dVbs;
4445 T5_dT = - beta_inv_dT + T1_dT - T2 * Vbsz_dT ;
4446
4447 T6 = 1.0 + T4 * T5 ;
4448 T6_dVd = T4 * T5_dVd ;
4449 T6_dVg = T4 * T5_dVg ;
4450 T6_dVb = T4 * T5_dVb ;
4451 T6_dT = T4 * T5_dT ;
4452 Fn_SZ( T6 , T6, 1.0e-3, T9) ;
4453 T6 += small ;
4454 T6_dVd *= T9 ;
4455 T6_dVg *= T9 ;
4456 T6_dVb *= T9 ;
4457 T6_dT *= T9 ;
4458 T6 = sqrt( T6 ) ;
4459 T9 = 0.5 / T6 ;
4460 T6_dVd = T9 * T6_dVd ;
4461 T6_dVg = T9 * T6_dVg ;
4462 T6_dVb = T9 * T6_dVb ;
4463 T6_dT = T9 * T6_dT ;
4464
4465 Psislsat = T1 + T3 * ( 1.0 - T6 ) ;
4466 Psislsat_dVd = T1_dVd - T3 * T6_dVd ;
4467 Psislsat_dVg = T1_dVg - T3 * T6_dVg ;
4468 Psislsat_dVb = T1_dVb - T3 * T6_dVb ;
4469 Psislsat_dT = T1_dT - T3 * T6_dT ;
4470
4471 T2 = here->HSMHV2_lgate / (here->HSMHV2_xgate + here->HSMHV2_lgate) ;
4472
4473 Psisubsat = pParam->HSMHV2_svds * Vdsz + Ps0z - T2 * Psislsat ;
4474 Psisubsat_dVd = pParam->HSMHV2_svds * Vdsz_dVds + Ps0z_dVds - T2 * Psislsat_dVd ;
4475 Psisubsat_dVg = Ps0z_dVgs - T2 * Psislsat_dVg ;
4476 Psisubsat_dVb = pParam->HSMHV2_svds * Vdsz_dVbs + Ps0z_dVbs - T2 * Psislsat_dVb ;
4477 Psisubsat_dT = pParam->HSMHV2_svds * Vdsz_dT + Ps0z_dT - T2 * Psislsat_dT ;
4478 Fn_SZ( Psisubsat , Psisubsat, 1.0e-3, T9 ) ;
4479 Psisubsat += small ;
4480 Psisubsat_dVd *= T9 ;
4481 Psisubsat_dVg *= T9 ;
4482 Psisubsat_dVb *= T9 ;
4483 Psisubsat_dT *= T9 ;
4484
4485 T5 = here->HSMHV2_xsub1 ;
4486 T6 = here->HSMHV2_xsub2 ;
4487 T2 = exp( - T6 / Psisubsat ) ;
4488 T3 = T2 * T6 / ( Psisubsat * Psisubsat ) ;
4489 T2_dVd = T3 * Psisubsat_dVd ;
4490 T2_dVg = T3 * Psisubsat_dVg ;
4491 T2_dVb = T3 * Psisubsat_dVb ;
4492 T2_dT = T3 * Psisubsat_dT ;
4493
4494 Isub = T5 * Psisubsat * Ids * T2 ;
4495 Isub_dVds = T5 * ( Psisubsat_dVd * Ids * T2
4496 + Psisubsat * Ids_dVds * T2
4497 + Psisubsat * Ids * T2_dVd ) ;
4498 Isub_dVgs = T5 * ( Psisubsat_dVg * Ids * T2
4499 + Psisubsat * Ids_dVgs * T2
4500 + Psisubsat * Ids * T2_dVg ) ;
4501 Isub_dVbs = T5 * ( Psisubsat_dVb * Ids * T2
4502 + Psisubsat * Ids_dVbs * T2
4503 + Psisubsat * Ids * T2_dVb ) ;
4504 Isub_dT = T5 * ( Psisubsat_dT * Ids * T2
4505 + Psisubsat * Ids_dT * T2
4506 + Psisubsat * Ids * T2_dT ) ;
4507
4508 } else {
4509 Isub = 0.0e0 ;
4510 Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ;
4511 Isub_dT = 0.0e0 ;
4512 } /* end of if ( pParam->HSMHV2_sub1 ... ) else block. */
4513
4514 /*---------------------------------------------------*
4515 * Impact-Ionization Current in the Drift Region
4516 *-----------------*/
4517 T8 = here->HSMHV2_subld1 ;
4518 if ( T8 != 0.0 ) {
4519 T0 = Vddp ;
4520 T0_dVb = 0.0e0 ;
4521 T0_dVd = 0.0e0 ;
4522 T0_dVg = 0.0e0 ;
4523 T0_dT = 0.0e0 ;
4524 T0_dVddp = 1.0e0 ;
4525
4526 Fn_SZ( T0, T0, 1e-6, T1 ) ;
4527 T0_dVb *= T1 ;
4528 T0_dVd *= T1 ;
4529 T0_dVg *= T1 ;
4530 T0_dT *= T1 ;
4531 T0_dVddp *= T1 ;
4532
4533 T1 = sqrt( VgVt + small ) ;
4534 T3 = 1.0 / ( 2.0 * T1 ) ;
4535 T1_dVb = VgVt_dVbs * T3 ;
4536 T1_dVd = VgVt_dVds * T3 ;
4537 T1_dVg = VgVt_dVgs * T3 ;
4538 T1_dT = VgVt_dT * T3 ;
4539
4540 T4 = T0 - model->HSMHV2_xpvdth * ( 1.0 + model->HSMHV2_xpvdthg * Vgs ) ;
4541 T4_dVb = T0_dVb ;
4542 T4_dVd = T0_dVd ;
4543 T4_dVg = T0_dVg - model->HSMHV2_xpvdth * model->HSMHV2_xpvdthg ;
4544 T4_dT = T0_dT ;
4545 T4_dVddp = T0_dVddp ;
4546
4547 Fn_SZ( T4, T4, 1.0e-2, T9 ) ;
4548 T4 += small ;
4549 T4_dVb *= T9 ;
4550 T4_dVd *= T9 ;
4551 T4_dVg *= T9 ;
4552 T4_dT *= T9 ;
4553 T4_dVddp *= T9 ;
4554
4555 T10 = here->HSMHV2_xpdv * model->HSMHV2_xldld * exp( - 1.0e0 / T4 ) ;
4556 T11 = T10 * ( 1.0 + 1.0 / T4 ) ;
4557 T3 = T4 * T10 ;
4558 T3_dVb = T4_dVb * T11 ;
4559 T3_dVd = T4_dVd * T11 ;
4560 T3_dVg = T4_dVg * T11 ;
4561 T3_dT = T4_dT * T11 ;
4562 T3_dVddp = T4_dVddp * T11 ;
4563
4564 T0 = T0 - T3 ;
4565 T0_dVb = T0_dVb - T3_dVb ;
4566 T0_dVd = T0_dVd - T3_dVd ;
4567 T0_dVg = T0_dVg - T3_dVg ;
4568 T0_dT = T0_dT - T3_dT ;
4569 T0_dVddp = T0_dVddp - T3_dVddp ;
4570
4571 Fn_SZ( T0, T0, 1.0e-2 , T9 ) ;
4572 T0 += small;
4573 T0_dVb *= T9 ;
4574 T0_dVd *= T9 ;
4575 T0_dVg *= T9 ;
4576 T0_dT *= T9 ;
4577 T0_dVddp *= T9 ;
4578
4579 T4 = 1.0 / ( T0 * T1 ) ;
4580 T7 = Ldrift0 * modelMKS->HSMHV2_subld2 ;
4581 T2= exp( - T7 * T4 );
4582 T6 = T7 * T2 * T4 * T4 ;
4583 T2_dVb = ( T0_dVb * T1 + T0 * T1_dVb ) * T6 ;
4584 T2_dVd = ( T0_dVd * T1 + T0 * T1_dVd ) * T6 ;
4585 T2_dVg = ( T0_dVg * T1 + T0 * T1_dVg ) * T6 ;
4586 T2_dT = ( T0_dT * T1 + T0 * T1_dT ) * T6 ;
4587 T2_dVddp = T0_dVddp * T1 * T6 ;
4588
4589 IsubLD = T8 * Ids * T0 * T2 ;
4590 IsubLD_dVbs = T8 * ( Ids_dVbs * T0 * T2 + Ids * T0_dVb * T2 + Ids * T0 * T2_dVb ) ;
4591 IsubLD_dVds = T8 * ( Ids_dVds * T0 * T2 + Ids * T0_dVd * T2 + Ids * T0 * T2_dVd ) ;
4592 IsubLD_dVgs = T8 * ( Ids_dVgs * T0 * T2 + Ids * T0_dVg * T2 + Ids * T0 * T2_dVg ) ;
4593 IsubLD_dT = T8 * ( Ids_dT * T0 * T2 + Ids * T0_dT * T2 + Ids * T0 * T2_dT ) ;
4594 IsubLD_dVddp = T8 * Ids * (T0_dVddp * T2 + T0 * T2_dVddp ) ;
4595 }
4596
4597 }
4598
4599
4600 /*---------------------------------------------------*
4601 * Impact-Ionization Induced Bulk Potential Change (IBPC)
4602 *-----------------*/
4603 if ( (Isub + IsubLD) > 0e0 && here->HSMHV2_ibpc1 != 0e0 && model->HSMHV2_codep==0 ) {
4604
4605 /* delta Vbs */
4606 T0 = 1e0 + pParam->HSMHV2_ibpc2 * dVth ;
4607 T1 = Isub + IsubLD ;
4608 dVbsIBPC = here->HSMHV2_ibpc1 * T0 * T1 ;
4609 dVbsIBPC_dVbs = here->HSMHV2_ibpc1 * ( pParam->HSMHV2_ibpc2 * dVth_dVb * T1 + T0 * ( Isub_dVbs + IsubLD_dVbs ) ) ;
4610 dVbsIBPC_dVds = here->HSMHV2_ibpc1 * ( pParam->HSMHV2_ibpc2 * dVth_dVd * T1 + T0 * ( Isub_dVds + IsubLD_dVds ) ) ;
4611 dVbsIBPC_dVgs = here->HSMHV2_ibpc1 * ( pParam->HSMHV2_ibpc2 * dVth_dVg * T1 + T0 * ( Isub_dVgs + IsubLD_dVgs ) ) ;
4612 dVbsIBPC_dT = here->HSMHV2_ibpc1 * ( pParam->HSMHV2_ibpc2 * dVth_dT * T1 + T0 * ( Isub_dT + IsubLD_dT ) ) ;
4613 dVbsIBPC_dVddp = here->HSMHV2_ibpc1 * T0 * IsubLD_dVddp ;
4614
4615 /* dG3 & dG4 */
4616 T10 = 1e0 / Xi0 ;
4617 T10_dT = - T10 / Xi0 * Xi0_dT ;
4618 T1 = beta * dVbsIBPC * T10 ;
4619 T11 = T10 * T10;
4620 T1_dVb = beta * ( dVbsIBPC_dVbs * Xi0 - dVbsIBPC * Xi0_dVbs ) * T11 ;
4621 T1_dVd = beta * ( dVbsIBPC_dVds * Xi0 - dVbsIBPC * Xi0_dVds ) * T11 ;
4622 T1_dVg = beta * ( dVbsIBPC_dVgs * Xi0 - dVbsIBPC * Xi0_dVgs ) * T11 ;
4623 T1_dT = beta_dT * dVbsIBPC * T10 + beta * dVbsIBPC_dT * T10 + beta * dVbsIBPC * T10_dT ;
4624 T1_dVddp = beta * dVbsIBPC_dVddp * T10 ;
4625
4626
4627 T10 = 1e0 / Xil ;
4628 T10_dT = - T10 / Xil * Xil_dT ;
4629 T2 = beta * dVbsIBPC * T10 ;
4630 T11 = T10 * T10;
4631 T2_dVb = beta * ( dVbsIBPC_dVbs * Xil - dVbsIBPC * Xil_dVbs ) * T11 ;
4632 T2_dVd = beta * ( dVbsIBPC_dVds * Xil - dVbsIBPC * Xil_dVds ) * T11 ;
4633 T2_dVg = beta * ( dVbsIBPC_dVgs * Xil - dVbsIBPC * Xil_dVgs ) * T11 ;
4634 T2_dT = beta_dT * dVbsIBPC * T10 + beta * dVbsIBPC_dT * T10 + beta * dVbsIBPC * T10_dT ;
4635 T2_dVddp = beta * dVbsIBPC_dVddp * T10 ;
4636
4637
4638 dG3 = cnst0 * ( Xilp32 * T2 - Xi0p32 * T1 ) ;
4639 dG3_dVbs = cnst0 * ( Xilp32_dVbs * T2 + Xilp32 * T2_dVb - Xi0p32_dVbs * T1 - Xi0p32 * T1_dVb ) ;
4640 dG3_dVds = cnst0 * ( Xilp32_dVds * T2 + Xilp32 * T2_dVd - Xi0p32_dVds * T1 - Xi0p32 * T1_dVd ) ;
4641 dG3_dVgs = cnst0 * ( Xilp32_dVgs * T2 + Xilp32 * T2_dVg - Xi0p32_dVgs * T1 - Xi0p32 * T1_dVg ) ;
4642 dG3_dT = cnst0 * ( Xilp32_dT * T2 + Xilp32 * T2_dT - Xi0p32_dT * T1 - Xi0p32 * T1_dT )
4643 + cnst0_dT * ( Xilp32 * T2 - Xi0p32 * T1 ) ;
4644 dG3_dVddp = cnst0 * ( Xilp32 * T2_dVddp - Xi0p32 * T1_dVddp ) ;
4645
4646 dG4 = cnst0 * 0.5 * ( - Xilp12 * T2 + Xi0p12 * T1 ) ;
4647 dG4_dVbs = cnst0 * 0.5 * ( - Xilp12_dVbs * T2 - Xilp12 * T2_dVb + Xi0p12_dVbs * T1 + Xi0p12 * T1_dVb ) ;
4648 dG4_dVds = cnst0 * 0.5 * ( - Xilp12_dVds * T2 - Xilp12 * T2_dVd + Xi0p12_dVds * T1 + Xi0p12 * T1_dVd ) ;
4649 dG4_dVgs = cnst0 * 0.5 * ( - Xilp12_dVgs * T2 - Xilp12 * T2_dVg + Xi0p12_dVgs * T1 + Xi0p12 * T1_dVg ) ;
4650 dG4_dT = cnst0 * 0.5 * ( - Xilp12_dT * T2 - Xilp12 * T2_dT + Xi0p12_dT * T1 + Xi0p12 * T1_dT )
4651 + cnst0_dT *0.5 * ( - Xilp12 * T2 + Xi0p12 * T1 ) ;
4652 dG4_dVddp = cnst0 * 0.5 * ( - Xilp12 * T2_dVddp + Xi0p12 * T1_dVddp ) ;
4653
4654 /* Add IBPC current into Ids */
4655 dIdd = dG3 + dG4 ;
4656 dIdd_dVbs = dG3_dVbs + dG4_dVbs ;
4657 dIdd_dVds = dG3_dVds + dG4_dVds ;
4658 dIdd_dVgs = dG3_dVgs + dG4_dVgs ;
4659 dIdd_dT = dG3_dT + dG4_dT ;
4660 dIdd_dVddp = dG3_dVddp + dG4_dVddp ;
4661
4662 IdsIBPC = betaWL * dIdd * Mu ;
4663 IdsIBPC_dVbs = betaWL * ( Mu * dIdd_dVbs + dIdd * Mu_dVbs ) + betaWL_dVbs * Mu * dIdd ;
4664 IdsIBPC_dVds = betaWL * ( Mu * dIdd_dVds + dIdd * Mu_dVds ) + betaWL_dVds * Mu * dIdd ;
4665 IdsIBPC_dVgs = betaWL * ( Mu * dIdd_dVgs + dIdd * Mu_dVgs ) + betaWL_dVgs * Mu * dIdd ;
4666 IdsIBPC_dT = betaWL * ( Mu * dIdd_dT + dIdd * Mu_dT ) + betaWL_dT * Mu * dIdd ;
4667 IdsIBPC_dVddp = betaWL * dIdd_dVddp * Mu ;
4668
4669 } /* End if (IBPC) */
4670
4671 T3 = 1 / TTEMP ;
4672 T0 =- model->HSMHV2_igtemp2 * T3 * T3
4673 - 2 * model->HSMHV2_igtemp3 * T3 * T3 * T3 ;
4674 Egp12_dT = 0.5 * T0 / Egp12;
4675 Egp32_dT = 1.5 * T0 * Egp12;
4676
4677 /*-----------------------------------------------------------*
4678 * Igate : Gate current induced by tunneling.
4679 *-----------------*/
4680 if ( model->HSMHV2_coiigs != 0 ) {
4681 /* Igate */
4682 if ( flg_noqi == 0 ) {
4683 Psdlz = Ps0z + Vdsz - epsm10 ;
4684 Psdlz_dVbs = Ps0z_dVbs + Vdsz_dVbs ;
4685 Psdlz_dVds = Ps0z_dVds + Vdsz_dVds ;
4686 Psdlz_dVgs = Ps0z_dVgs ;
4687 Psdlz_dT = Ps0z_dT ;
4688
4689 T1 = Vgsz - Vfb + modelMKS->HSMHV2_gleak4 * (dVth - dPpg) * Leff - Psdlz * pParam->HSMHV2_gleak3 ;
4690 T3 = modelMKS->HSMHV2_gleak4 * Leff ;
4691 T1_dVg = Vgsz_dVgs + T3 * (dVth_dVg - dPpg_dVg) - Psdlz_dVgs * pParam->HSMHV2_gleak3 ;
4692 T1_dVd = Vgsz_dVds + T3 * (dVth_dVd - dPpg_dVd) - Psdlz_dVds * pParam->HSMHV2_gleak3 ;
4693 T1_dVb = Vgsz_dVbs + T3 * ( dVth_dVb - dPpg_dVb ) - Psdlz_dVbs * pParam->HSMHV2_gleak3 ;
4694 T1_dT = Vgsz_dT + T3 * ( dVth_dT - dPpg_dT ) - Psdlz_dT * pParam->HSMHV2_gleak3 ;
4695
4696 T3 = 2.0 * T1 ;
4697 T1_dVg = T3 * T1_dVg ;
4698 T1_dVd = T3 * T1_dVd ;
4699 T1_dVb = T3 * T1_dVb ;
4700 T1_dT = T3 * T1_dT ;
4701 T1 *= T1 ;
4702
4703 T3 = 1.0 / Tox0 ;
4704 T2 = T1 * T3 ;
4705 T2_dVg = (T1_dVg ) * T3 ;
4706 T2_dVd = (T1_dVd ) * T3 ;
4707 T2_dVb = (T1_dVb ) * T3 ;
4708 T2_dT = T1_dT * T3 ;
4709
4710 T3 = 1.0 / modelMKS->HSMHV2_gleak5 ;
4711 T7 = 1.0 + Ey * T3 ;
4712 T7_dVg = Ey_dVgs * T3 ;
4713 T7_dVd = Ey_dVds * T3 ;
4714 T7_dVb = Ey_dVbs * T3 ;
4715 T7_dT = Ey_dT * T3 ;
4716
4717 Etun = T2 * T7 ;
4718 Etun_dVgs = T2_dVg * T7 + T7_dVg * T2 ;
4719 Etun_dVds = T2_dVd * T7 + T7_dVd * T2 ;
4720 Etun_dVbs = T2_dVb * T7 + T7_dVb * T2 ;
4721 Etun_dT = T2_dT * T7 + T7_dT * T2 ;
4722
4723 Fn_SZ( Etun , Etun , igate_dlt , T5 ) ;
4724 Etun_dVgs *= T5 ;
4725 Etun_dVds *= T5 ;
4726 Etun_dVbs *= T5 ;
4727 Etun_dT *= T5 ;
4728
4729 Fn_SZ( T3 , Vgsz , 1.0e-3 , T4 ) ;
4730 T3 -= model->HSMHV2_vzadd0 ;
4731 T3_dVb = 0.5 * (Vgsz_dVbs + Vgsz * Vgsz_dVbs/TMF2);
4732 TX = T3 / cclmmdf ;
4733 TX_dVbs = T3_dVb / cclmmdf ;
4734 T2 = 1.0 + TX * TX ;
4735 T2_dVb = 2 * TX_dVbs * TX ;
4736 T1 = 1.0 - 1.0 / T2 ;
4737 T1_dVb = T2_dVb / T2 / T2 ;
4738 T1_dVg = 2.0 * TX * T4 / ( T2 * T2 * cclmmdf ) ;
4739 T1_dVd = T1_dVg * Vgsz_dVds ;
4740 Etun_dVgs = T1 * Etun_dVgs + Etun * T1_dVg ;
4741 Etun_dVds = T1 * Etun_dVds + Etun * T1_dVd ;
4742 Etun_dVbs = Etun_dVbs * T1 + Etun * T1_dVb ;
4743 Etun_dT *= T1 ;
4744 Etun *= T1 ;
4745
4746 T0 = Leff * here->HSMHV2_weff_nf ;
4747 T7 = modelMKS->HSMHV2_gleak7 / (modelMKS->HSMHV2_gleak7 + T0) ;
4748
4749 T6 = pParam->HSMHV2_gleak6 ;
4750 T9 = T6 / (T6 + Vdsz) ;
4751 T9_dVb = - T9 / (T6 + Vdsz) * Vdsz_dVbs ;
4752 T9_dVd = - T9 / (T6 + Vdsz) * Vdsz_dVds ;
4753
4754 T4 = 1 / (Etun + small ) ;
4755 T1 = - pParam->HSMHV2_gleak2 * Egp32 * T4 ;
4756 T3 = pParam->HSMHV2_gleak2 * T4 * T4;
4757 T1_dT = T3 * (Egp32 * Etun_dT - Egp32_dT * (Etun + small )) ;
4758
4759 if ( T1 < - EXP_THR ) {
4760 Igate = 0.0 ;
4761 Igate_dVbs = Igate_dVds = Igate_dVgs = Igate_dT = 0.0 ;
4762 } else {
4763 T2 = exp ( T1 ) ;
4764 T2_dT = T1_dT * T2 ;
4765
4766 T3 = pParam->HSMHV2_gleak1 / Egp12 * C_QE * T0 ;
4767 T3_dT = - Egp12_dT * pParam->HSMHV2_gleak1 / Egp12 / Egp12 * C_QE * T0 ;
4768
4769 T5 = 1 / cnst0 ;
4770 T6 = sqrt ((Qiu + Cox0 * VgVt_small )* T5 ) ;
4771 T6_dT = ( ( ( cnst0 * Qiu_dT - cnst0_dT * ( Qiu + Cox0 * VgVt_small ) ) * T5 * T5 ) ) / T6 * 0.5 ;
4772 T4 = T2 * T3 * T6 ;
4773 T4_dT = T2_dT * T3 * T6 + T2 * T3_dT * T6 + T2 * T3 * T6_dT;
4774 T5 = T4 * Etun ;
4775 T6 = 0.5 * Etun / (Qiu + Cox0 * VgVt_small ) ;
4776 T10 = T5 * Etun ;
4777 T10_dVb = T5 * (2.0 * Etun_dVbs - T1 * Etun_dVbs + T6 * Qiu_dVbs) ;
4778 T10_dVd = T5 * (2.0 * Etun_dVds - T1 * Etun_dVds + T6 * Qiu_dVds) ;
4779 T10_dVg = T5 * (2.0 * Etun_dVgs - T1 * Etun_dVgs + T6 * Qiu_dVgs) ;
4780 T10_dT = 2 * T5 * Etun_dT + T4_dT * Etun * Etun ;
4781
4782 Igate = T7 * T9 * T10 ;
4783 Igate_dVbs = T7 * (T9 * T10_dVb + T9_dVb * T10) ;
4784 Igate_dVds = T7 * (T9_dVd * T10 + T9 * T10_dVd) ;
4785 Igate_dVgs = T7 * T9 * T10_dVg ;
4786 Igate_dT = T7 * T9 * T10_dT ;
4787 }
4788 }
4789
4790 /* Igs */
4791 T0 = - pParam->HSMHV2_glksd2 * Vgs + modelMKS->HSMHV2_glksd3 ;
4792 T2 = exp (Tox0 * T0);
4793 T2_dVg = (- Tox0 * pParam->HSMHV2_glksd2) * T2;
4794
4795 T0 = Vgs / Tox0 / Tox0 ;
4796 T3 = Vgs * T0 ;
4797 T3_dVg = 2.0 * T0 * (1.0 ) ;
4798 T4 = pParam->HSMHV2_glksd1 / 1.0e6 * here->HSMHV2_weff_nf ;
4799 Igs = T4 * T2 * T3 ;
4800 Igs_dVgs = T4 * (T2_dVg * T3 + T2 * T3_dVg) ;
4801 Igs_dVds = 0.0 ;
4802 Igs_dVbs = 0.0 ;
4803 Igs_dT = 0.0 ;
4804
4805 if ( Vgs >= 0.0e0 ){
4806 Igs *= -1.0 ;
4807 Igs_dVgs *= -1.0 ;
4808 Igs_dVds *= -1.0 ;
4809 Igs_dVbs *= -1.0 ;
4810 }
4811
4812
4813 /* Igd */
4814 T1 = Vgs - Vds ;
4815 T0 = - pParam->HSMHV2_glksd2 * T1 + modelMKS->HSMHV2_glksd3 ;
4816 T2 = exp (Tox0 * T0);
4817 T2_dVg = (- Tox0 * pParam->HSMHV2_glksd2) * T2;
4818 T2_dVd = (+ Tox0 * pParam->HSMHV2_glksd2) * T2;
4819 T2_dVb = 0.0 ;
4820
4821 T0 = T1 / Tox0 / Tox0 ;
4822 T3 = T1 * T0 ;
4823 T3_dVg = 2.0 * T0 ;
4824 T3_dVd = - 2.0 * T0 ;
4825 T3_dVb = 0.0 ;
4826 T4 = pParam->HSMHV2_glksd1 / 1.0e6 * here->HSMHV2_weff_nf ;
4827 Igd = T4 * T2 * T3 ;
4828 Igd_dVgs = T4 * (T2_dVg * T3 + T2 * T3_dVg) ;
4829 Igd_dVds = T4 * (T2_dVd * T3 + T2 * T3_dVd) ;
4830 Igd_dVbs = 0.0 ;
4831 Igd_dT = 0.0 ;
4832
4833 if( T1 >= 0.0e0 ){
4834 Igd *= -1.0 ;
4835 Igd_dVgs *= -1.0 ;
4836 Igd_dVds *= -1.0 ;
4837 Igd_dVbs *= -1.0 ;
4838 }
4839
4840
4841 /* Igb */
4842 Etun = ( - ( Vgs - Vbs ) + Vfb + model->HSMHV2_glkb3 ) / Tox0 ;
4843 Etun_dVgs = - 1.0 / Tox0 ;
4844 Etun_dVds = 0.0 ;
4845 Etun_dVbs = 1.0 / Tox0 ;
4846
4847 Fn_SZ( Etun , Etun, igate_dlt, T5) ;
4848 Etun += small ;
4849 Etun_dVgs *= T5 ;
4850 Etun_dVbs *= T5 ;
4851
4852 T1 = - pParam->HSMHV2_glkb2 / Etun ;
4853 if ( T1 < - EXP_THR ) {
4854 Igb = 0.0 ;
4855 Igb_dVgs = Igb_dVds = Igb_dVbs = Igb_dT = 0.0 ;
4856 } else {
4857 T2 = exp ( T1 );
4858 T3 = pParam->HSMHV2_glkb2 / ( Etun * Etun ) * T2 ;
4859 T2_dVg = T3 * Etun_dVgs ;
4860 T2_dVb = T3 * Etun_dVbs ;
4861
4862 T3 = pParam->HSMHV2_glkb1 * here->HSMHV2_weff_nf * Leff ;
4863 Igb = T3 * Etun * Etun * T2 ;
4864 Igb_dVgs = T3 * (2.0 * Etun * Etun_dVgs * T2 + Etun * Etun * T2_dVg);
4865 Igb_dVds = 0.0 ;
4866 Igb_dVbs = T3 * (2.0 * Etun * Etun_dVbs * T2 + Etun * Etun * T2_dVb);
4867 Igb_dT = 0.0;
4868 }
4869
4870 /* Ifn: Fowler-Nordheim tunneling current */
4871 Eg12 = here->HSMHV2_sqrt_eg ;
4872 Eg32 = here->HSMHV2_eg * Eg12 ;
4873 T2 = - ( pParam->HSMHV2_fvbs * Vbsz - Vgsz + dVthSC + dVthLP - pParam->HSMHV2_fn3 ) / Tox0 ;
4874 T2_dVd = - ( pParam->HSMHV2_fvbs * Vbsz_dVds - Vgsz_dVds + dVthSC_dVd + dVthLP_dVd
4875 ) / Tox0 ;
4876 T2_dVg = - ( - Vgsz_dVgs + dVthSC_dVg + dVthLP_dVg
4877 ) / Tox0 ;
4878 T2_dVb = - ( pParam->HSMHV2_fvbs * Vbsz_dVbs -Vgsz_dVbs + dVthSC_dVb + dVthLP_dVb
4879 ) / Tox0 ;
4880 T2_dT = - ( pParam->HSMHV2_fvbs * Vbsz_dT -Vgsz_dT + dVthSC_dT + dVthLP_dT
4881 ) / Tox0 ;
4882
4883 T0 = T2 * T2 ;
4884 T1 = pParam->HSMHV2_fn2 * Eg32 ;
4885 T1_dT = 1.5 * Eg_dT * pParam->HSMHV2_fn2 * Eg12 ;
4886 T3 = - T1 / T2 ;
4887 if ( T3 < - EXP_THR ) {
4888 T5 = 0.0 ;
4889 T5_dVd = T5_dVg = T5_dVb = T5_dT = 0.0 ;
4890
4891 } else {
4892 T5 = exp( T3 ) ;
4893 T5_dVd = T5 * T1 * T2_dVd / T0 ;
4894 T5_dVg = T5 * T1 * T2_dVg / T0 ;
4895 T5_dVb = T5 * T1 * T2_dVb / T0 ;
4896 T5_dT = T5 * T1 * T2_dT / T0 ;
4897 }
4898
4899 T4 = C_QE * pParam->HSMHV2_fn1 * here->HSMHV2_weff_nf * here->HSMHV2_lgate / Eg12 ;
4900 T4_dT = (- 0.5) * Eg_dT * T4 / here->HSMHV2_eg ;
4901 if ( 2e0 * T2 + T1 < 0e0 ){
4902 Ifn = 0.25e0 * T4 * T1 * T1 * c_exp_2 ; /* minimum value */
4903 Ifn_dVd = 0e0 ;
4904 Ifn_dVg = 0e0 ;
4905 Ifn_dVb = 0e0 ;
4906 Ifn_dT = 0.25e0 * T4_dT * T1 * T1 * c_exp_2 ;
4907 } else {
4908 Ifn = T4 * T0 * T5 ;
4909 Ifn_dVd = T4 * ( 2.0 * T2 * T2_dVd * T5 + T0 * T5_dVd ) ;
4910 Ifn_dVg = T4 * ( 2.0 * T2 * T2_dVg * T5 + T0 * T5_dVg ) ;
4911 Ifn_dVb = T4 * ( 2.0 * T2 * T2_dVb * T5 + T0 * T5_dVb ) ;
4912 Ifn_dT = T4 * ( 2.0 * T2 * T2_dT * T5 + T0 * T5_dT ) +T4_dT * T0 * T5;
4913 }
4914 Igb -= Ifn ;
4915 Igb_dVbs -= Ifn_dVb ;
4916 Igb_dVds -= Ifn_dVd ;
4917 Igb_dVgs -= Ifn_dVg ;
4918 Igb_dT -= Ifn_dT ;
4919 } /* if ( model->HSMHV2_coiigs == 0 ) */
4920
4921
4922 /*-----------------------------------------------------------*
4923 * Vdsp : Vds modification for GIDL/GISL
4924 *-----------------*/
4925 if ( model->HSMHV2_cogidl != 0 ) {
4926 T1 = Vds * (1.0 - gidla * Vds) - gidlvds_dlt ;
4927 T2 = sqrt (T1 * T1 + 4.0 * gidlvds_dlt * Vds) ;
4928 Vdsp = Vds - 0.5 * (T1 + T2) ;
4929 T3 = 1.0 - 2.0 * gidla * Vds ;
4930 Vdsp_dVd = 1.0 - 0.5 * (T3 + (T1 * T3 + 2.0 * gidlvds_dlt) / T2) ;
4931 }
4932
4933 /*-----------------------------------------------------------*
4934 * Igidl : GIDL
4935 *-----------------*/
4936 if( model->HSMHV2_cogidl == 0 ){
4937 Igidl = 0.0e0 ;
4938 Igidl_dVbs = 0.0e0 ;
4939 Igidl_dVds = 0.0e0 ;
4940 Igidl_dVgs = 0.0e0 ;
4941 Igidl_dT = 0.0e0 ;
4942 } else {
4943 T1 = model->HSMHV2_gidl3 * (Vdsp + model->HSMHV2_gidl4) - Vgs + (dVthSC + dVthLP) * model->HSMHV2_gidl5 ;
4944 T1_dT = (dVthSC_dT + dVthLP_dT) * model->HSMHV2_gidl5 ;
4945 T2 = 1.0 / Tox0 ;
4946 E1 = T1 * T2 ;
4947 E1_dVb = ((model->HSMHV2_gidl5 * (dVthSC_dVb + dVthLP_dVb)) ) * T2 ;
4948 E1_dVd = ((model->HSMHV2_gidl3 * Vdsp_dVd) + model->HSMHV2_gidl5 * (dVthSC_dVd + dVthLP_dVd)) * T2 ;
4949 E1_dVg = (-1.0 + model->HSMHV2_gidl5 * (dVthSC_dVg + dVthLP_dVg) ) * T2 ;
4950 E1_dT = T1_dT * T2 ;
4951
4952 Fn_SZ( Egidl , E1, eef_dlt, T5) ;
4953 Egidl_dVb = T5 * E1_dVb ;
4954 Egidl_dVd = T5 * E1_dVd ;
4955 Egidl_dVg = T5 * E1_dVg ;
4956 Egidl_dT = T5 * E1_dT ;
4957
4958 T3 = 1 / (Egidl + small) ;
4959 T0 = - pParam->HSMHV2_gidl2 * Egp32 * T3 ;
4960 T0_dT = - pParam->HSMHV2_gidl2 * T3 *( Egp32_dT - Egidl_dT * T3 * Egp32 ) ;
4961 if ( T0 < - EXP_THR ) {
4962 Igidl = 0.0 ;
4963 Igidl_dVbs = Igidl_dVds = Igidl_dVgs = Igidl_dT = 0.0 ;
4964 } else {
4965 T1 = exp ( T0 ) ;
4966 T1_dT = T0_dT * T1 ;
4967 T2 = pParam->HSMHV2_gidl1 / Egp12 * C_QE * here->HSMHV2_weff_nf ;
4968 T2_dT = - Egp12_dT * pParam->HSMHV2_gidl1 / Egp12 / Egp12 * C_QE * here->HSMHV2_weff_nf ;
4969 Igidl = T2 * Egidl * Egidl * T1 ;
4970 T3 = T2 * T1 * Egidl * (2.0 + pParam->HSMHV2_gidl2 * Egp32 * Egidl / (Egidl + small) / (Egidl + small)) ;
4971 Igidl_dVbs = T3 * Egidl_dVb ;
4972 Igidl_dVds = T3 * Egidl_dVd ;
4973 Igidl_dVgs = T3 * Egidl_dVg ;
4974 Igidl_dT = T2 * T1 * Egidl * 2.0 * Egidl_dT + T2 * Egidl * Egidl * T1_dT + T2_dT * Egidl * Egidl * T1;
4975 }
4976
4977 /* bug-fix */
4978 Vdb = Vds - Vbs ;
4979 if ( Vdb > 0.0 ) {
4980 T2 = Vdb * Vdb ;
4981 T4 = T2 * Vdb ;
4982 T0 = T4 + C_gidl_delta ;
4983 T5 = T4 / T0 ;
4984 T7 = ( 3.0 * T2 * T0 - T4 * 3.0 * T2 ) / ( T0 * T0 ) ; /* == T5_dVdb */
4985 Igidl_dVbs = Igidl_dVbs * T5 + Igidl * T7 * ( - 1.0 ) ; /* Vdb_dVbs = -1 */
4986 Igidl_dVds = Igidl_dVds * T5 + Igidl * T7 * ( + 1.0 ) ; /* Vdb_dVds = +1 */
4987 Igidl_dVgs = Igidl_dVgs * T5 ; /* Vdb_dVgs = 0 */
4988 Igidl_dT = Igidl_dT * T5 ; /* Vdb_dT = 0 */
4989 Igidl *= T5 ;
4990 } else {
4991 Igidl = 0.0 ;
4992 Igidl_dVbs = Igidl_dVds = Igidl_dVgs = Igidl_dT = 0.0 ;
4993 }
4994 }
4995
4996
4997 /*-----------------------------------------------------------*
4998 * Igisl : GISL
4999 *-----------------*/
5000 if( model->HSMHV2_cogidl == 0){
5001 Igisl = 0.0e0 ;
5002 Igisl_dVbs = 0.0e0 ;
5003 Igisl_dVds = 0.0e0 ;
5004 Igisl_dVgs = 0.0e0 ;
5005 Igisl_dT = 0.0e0 ;
5006 } else {
5007 T1 = model->HSMHV2_gidl3 * ( - Vdsp + model->HSMHV2_gidl4 )
5008 - ( Vgs - Vdsp ) + ( dVthSC + dVthLP ) * model->HSMHV2_gidl5 ;
5009
5010 T1_dT = ( dVthSC_dT + dVthLP_dT ) * model->HSMHV2_gidl5 ;
5011 T2 = 1.0 / Tox0 ;
5012 E1 = T1 * T2 ;
5013 E1_dVb = ((model->HSMHV2_gidl5 * (dVthSC_dVb + dVthLP_dVb)) ) * T2 ;
5014 E1_dVd = (((1.0-model->HSMHV2_gidl3 ) * Vdsp_dVd) + model->HSMHV2_gidl5 * (dVthSC_dVd + dVthLP_dVd)) * T2 ;
5015 E1_dVg = (-1.0 + model->HSMHV2_gidl5 * (dVthSC_dVg + dVthLP_dVg) ) * T2 ;
5016 E1_dT = T1_dT * T2 ;
5017
5018 Fn_SZ( Egisl , E1, eef_dlt, T5) ;
5019 Egisl_dVb = T5 * E1_dVb ;
5020 Egisl_dVd = T5 * E1_dVd ;
5021 Egisl_dVg = T5 * E1_dVg ;
5022 Egisl_dT = T5 * E1_dT ;
5023
5024 T3 = 1 / (Egisl + small) ;
5025 T0 = - pParam->HSMHV2_gidl2 * Egp32 * T3 ;
5026 T0_dT = - pParam->HSMHV2_gidl2 * T3 * ( Egp32_dT - Egisl_dT * T3 * Egp32 ) ;
5027 if ( T0 < - EXP_THR ) {
5028 Igisl = 0.0 ;
5029 Igisl_dVbs = Igisl_dVds = Igisl_dVgs = Igisl_dT = 0.0 ;
5030 } else {
5031 T1 = exp ( T0 ) ;
5032 T1_dT = T0_dT * T1 ;
5033 T3 = 1 / Egp12 ;
5034 T2 = pParam->HSMHV2_gidl1 * T3 * C_QE * here->HSMHV2_weff_nf ;
5035 T2_dT = - pParam->HSMHV2_gidl1 * Egp12_dT * T3 * T3 * C_QE * here->HSMHV2_weff_nf ;
5036 Igisl = T2 * Egisl * Egisl * T1 ;
5037 T3 = T2 * T1 * Egisl * (2.0 + pParam->HSMHV2_gidl2 * Egp32 * Egisl / (Egisl + small) / (Egisl + small)) ;
5038 Igisl_dVbs = T3 * Egisl_dVb ;
5039 Igisl_dVds = T3 * Egisl_dVd ;
5040 Igisl_dVgs = T3 * Egisl_dVg ;
5041 Igisl_dT = T2 * T1 * Egisl * 2.0 * Egisl_dT + T2_dT * Egisl * Egisl * T1 + T2 * Egisl * Egisl * T1_dT ;
5042 }
5043
5044 /* bug-fix */
5045 Vsb = - Vbs ;
5046 if ( Vsb > 0.0 ) {
5047 T2 = Vsb * Vsb ;
5048 T4 = T2 * Vsb ;
5049 T0 = T4 + C_gidl_delta ;
5050 T5 = T4 / T0 ;
5051 T7 = ( 3.0 * T2 * T0 - T4 * 3.0 * T2 ) / ( T0 * T0 ) ; /* == T5_dVsb */
5052 Igisl_dVbs = Igisl_dVbs * T5 + Igisl * T7 * ( - 1.0 ) ; /* Vsb_dVbs = -1 */
5053 Igisl_dVds = Igisl_dVds * T5 ; /* Vsb_dVds = 0 */
5054 Igisl_dVgs = Igisl_dVgs * T5 ; /* Vsb_dVgs = 0 */
5055 Igisl_dT = Igisl_dT * T5 ; /* Vsb_dT = 0 */
5056 Igisl *= T5 ;
5057 } else {
5058 Igisl = 0.0 ;
5059 Igisl_dVbs = Igisl_dVds = Igisl_dVgs = Igisl_dT = 0.0 ;
5060 }
5061 }
5062
5063
5064 /*-----------------------------------------------------------*
5065 * End of PART-2. (label)
5066 *-----------------*/
5067 /* end_of_part_2: */
5068
5069
5070 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5071 * PART-3: Overlap charge
5072 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
5073 Aclm = pParam->HSMHV2_clm1 ;
5074 if ( flg_noqi != 0 ) {
5075 /*-------------------------------------------*
5076 * Calculation of Psdl for cases of flg_noqi==1.
5077 *-----------------*/
5078 Psdl = Aclm * (Vds + Ps0) + (1.0e0 - Aclm) * Psl ;
5079 Psdl_dVbs = Aclm * Ps0_dVbs + (1.0e0 - Aclm) * Psl_dVbs ;
5080 Psdl_dVds = Aclm * (1.0e0 + Ps0_dVds) + (1.0e0 - Aclm) * Psl_dVds ;
5081 Psdl_dVgs = Aclm * Ps0_dVgs + (1.0e0 - Aclm) * Psl_dVgs ;
5082 if ( Psdl > Ps0 + Vds - epsm10 ) {
5083 Psdl = Ps0 + Vds - epsm10 ;
5084 Psdl_dVbs = Ps0_dVbs ;
5085 Psdl_dVds = Ps0_dVds + 1.0 ;
5086 Psdl_dVgs = Ps0_dVgs ;
5087 }
5088
5089 if (model->HSMHV2_xqy !=0) {
5090 Ec = 0.0e0 ;
5091 Ec_dVbs =0.0e0 ;
5092 Ec_dVds =0.0e0 ;
5093 Ec_dVgs =0.0e0 ;
5094 Ec_dT =0.0e0 ;
5095 }
5096 } else {
5097 /* Ec is removed from Lred calc. part */
5098 if (model->HSMHV2_xqy !=0) {
5099 if ( Idd < C_IDD_MIN ) {
5100 Ec = 0.0e0 ;
5101 Ec_dVbs =0.0e0 ;
5102 Ec_dVds =0.0e0 ;
5103 Ec_dVgs =0.0e0 ;
5104 } else {
5105 T1 = beta_inv / Leff ;
5106 T1_dT = beta_inv_dT / Leff ;
5107 T2 = 1.0 / Qn0 ;
5108 T3 = T2 * T2 ;
5109 Ec = Idd * T1 * T2 ;
5110 Ec_dVbs = T1 * (Idd_dVbs * T2 - Idd * Qn0_dVbs * T3 ) ;
5111 Ec_dVds = T1 * (Idd_dVds * T2 - Idd * Qn0_dVds * T3 ) ;
5112 Ec_dVgs = T1 * (Idd_dVgs * T2 - Idd * Qn0_dVgs * T3 ) ;
5113 Ec_dT = T1 * (Idd_dT * T2 - Idd * Qn0_dT * T3 )
5114 + T1_dT * Idd * T2 ;
5115 }
5116 }
5117 }
5118
5119 /*-----------------------------------------------------------*
5120 * Overlap charges
5121 *-----------------*/
5122 Coovlps = (int)ModeNML * model->HSMHV2_coovlps + (int)ModeRVS * model->HSMHV2_coovlp ;
5123 Coovlpd = (int)ModeRVS * model->HSMHV2_coovlps + (int)ModeNML * model->HSMHV2_coovlp ;
5124 Lovers = ModeNML * here->HSMHV2_lovers + ModeRVS * here->HSMHV2_loverld ;
5125 Loverd = ModeRVS * here->HSMHV2_lovers + ModeNML * here->HSMHV2_loverld ;
5126 Novers = ModeNML * pParam->HSMHV2_novers + ModeRVS * pParam->HSMHV2_nover ;
5127 Noverd = ModeRVS * pParam->HSMHV2_novers + ModeNML * pParam->HSMHV2_nover ;
5128 CVDSOVER = pParam->HSMHV2_cvdsover ;
5129
5130 /*---------------------------------------------------*
5131 * Source side (mode-dependent)
5132 *-----------------*/
5133 /*-----------------------------------*
5134 * Constant capacitance model
5135 *-----------------*/
5136 if ( Coovlps == 0 ) {
5137 flg_overgiven = ( (int)ModeNML * model->HSMHV2_cgso_Given
5138 + (int)ModeRVS * model->HSMHV2_cgdo_Given ) ;
5139 if ( flg_overgiven ) {
5140 Cgso = ModeNML * pParam->HSMHV2_cgso + ModeRVS * pParam->HSMHV2_cgdo ;
5141 Cgso *= - here->HSMHV2_weffcv_nf ;
5142 } else {
5143 Cgso = - Cox0 * Lovers * here->HSMHV2_weffcv_nf ;
5144 }
5145
5146 Qgso = - Cgso * Vgse ;
5147 Qgso_dVbse = 0.0 ;
5148 Qgso_dVdse = 0.0 ;
5149 Qgso_dVgse = - Cgso ;
5150
5151 /*-----------------------------------*
5152 * Simplified model
5153 *-----------------*/
5154 } else { /* Coovlps != 0 begin */
5155 if ( Lovers > 0.0 && Novers == 0.0 ){
5156 cov_slp = modelMKS->HSMHV2_ovslp ;
5157 cov_mag = model->HSMHV2_ovmag ;
5158 T1 = Cox0 * here->HSMHV2_weffcv_nf ;
5159 T4 = cov_slp * T1 * ( cov_mag + Vgs ) ;
5160 T4_dVg = cov_slp * T1 ;
5161 T4_dVd = 0.0 ;
5162 T5 = Lovers * T1 ;
5163 T9 = 1.2e0 - Ps0 ;
5164 Qgos = Vgs * T5 - T4 * T9 ;
5165 Qgos_dVbs = T4 * Ps0_dVbs ;
5166 Qgos_dVds = T4 * Ps0_dVds - T9 * T4_dVd ;
5167 Qgos_dVgs = T5 + T4 * Ps0_dVgs - T9 * T4_dVg ;
5168 Qgos_dT = T4 * Ps0_dT;
5169
5170 /*-----------------------------------*
5171 * Surface potential model
5172 *------------------------*/
5173 } else if ( Lovers > 0.0 && Novers >= 0.0 ) {
5174
5175 Vgbgmt = Vgs - Vbs ;
5176 Vgbgmt_dVbs = -1.0 ;
5177 Vgbgmt_dVds = 0.0 ;
5178 Vgbgmt_dVgs = 1.0 ;
5179 Vxbgmt = - Vbs + epsm10 ;
5180 Vxbgmt_dVbs = -1.0 ;
5181 Vxbgmt_dVds = 0.0 ;
5182 Vxbgmt_dVgs = 0.0 ;
5183
5184 Nover_func = Novers ;
5185 cnst0over_func = ModeNML * here->HSMHV2_cnst0overs + ModeRVS * here->HSMHV2_cnst0over ;
5186 cnst0over_func_dT = ModeNML * cnst0overs_dT + ModeRVS * cnst0over_dT ;
5187
5188 #include "hsmhv2eval_qover.h"
5189
5190
5191 if (here->HSMHV2_mode != HiSIM_NORMAL_MODE) {
5192 here->HSMHV2_Ps0LD = Ps0LD ;
5193 here->HSMHV2_Ps0LD_dVds = - Ps0LD_dVds - Ps0LD_dVgs - Ps0LD_dVbs;
5194 here->HSMHV2_Ps0LD_dVgs = Ps0LD_dVgs ;
5195 here->HSMHV2_Ps0LD_dVbs = Ps0LD_dVbs ;
5196 here->HSMHV2_Ps0LD_dTi = Ps0LD_dT ;
5197 here->HSMHV2_QbuLD = QbuLD ;
5198 here->HSMHV2_QbuLD_dVds = - QbuLD_dVds - QbuLD_dVgs - QbuLD_dVbs;
5199 here->HSMHV2_QbuLD_dVgs = QbuLD_dVgs ;
5200 here->HSMHV2_QbuLD_dVbs = QbuLD_dVbs ;
5201 here->HSMHV2_QbuLD_dTi = QbuLD_dT ;
5202 QosAD = - model->HSMHV2_qovadd * ( Vds - Pds ) ;
5203 T3 = model->HSMHV2_qovadd ;
5204 QosAD_dVgs = T3 * Pds_dVgs ;
5205 QosAD_dVds = T3 * (Pds_dVds - 1.0) ;
5206 QosAD_dVbs = T3 * Pds_dVbs ;
5207 QosAD_dT = T3 * Pds_dT ;
5208 }else{
5209 QosAD = QosAD_dVgs = QosAD_dVds = QosAD_dVbs = QosAD_dT = 0.0 ;
5210 }
5211
5212 T4 = here->HSMHV2_weffcv_nf * Lovers * ( 1 - CVDSOVER ) ;
5213
5214 Qovs = T4 * ( QsuLD + QosAD ) ;
5215 Qovs_dVbs = T4 * ( QsuLD_dVbs + QosAD_dVbs ) ;
5216 Qovs_dVds = T4 * ( QsuLD_dVds + QosAD_dVds ) ;
5217 Qovs_dVgs = T4 * ( QsuLD_dVgs + QosAD_dVgs ) ;
5218 Qovs_dT = T4 * ( QsuLD_dT + QosAD_dT ) ;
5219
5220 QisLD = T4 * QiuLD ;
5221 QisLD_dVbs = T4 * QiuLD_dVbs ;
5222 QisLD_dVds = T4 * QiuLD_dVds ;
5223 QisLD_dVgs = T4 * QiuLD_dVgs ;
5224 QisLD_dT = T4 * QiuLD_dT ;
5225
5226 QbsLD = T4 * ( QbuLD + QosAD ) ;
5227 QbsLD_dVbs = T4 * ( QbuLD_dVbs + QosAD_dVbs ) ;
5228 QbsLD_dVds = T4 * ( QbuLD_dVds + QosAD_dVds ) ;
5229 QbsLD_dVgs = T4 * ( QbuLD_dVgs + QosAD_dVgs ) ;
5230 QbsLD_dT = T4 * ( QbuLD_dT + QosAD_dT ) ;
5231
5232
5233
5234 if ( CVDSOVER != 0.0 ) { /* Qovsext begin */
5235 Vgbgmt = Vgse - Vbse ;
5236 Vgbgmt_dVbs = -1.0 ;
5237 Vgbgmt_dVds = 0.0 ;
5238 Vgbgmt_dVgs = 1.0 ;
5239 Vxbgmt = - Vbse + epsm10 ;
5240 Vxbgmt_dVbs = -1.0 ;
5241 Vxbgmt_dVds = 0.0 ;
5242 Vxbgmt_dVgs = 0.0 ;
5243
5244 #include "hsmhv2eval_qover.h"
5245
5246 T4 = here->HSMHV2_weffcv_nf * Lovers * CVDSOVER ;
5247 Qovsext = T4 * QsuLD ;
5248 Qovsext_dVdse = T4 * QsuLD_dVds ;
5249 Qovsext_dVgse = T4 * QsuLD_dVgs ;
5250 Qovsext_dVbse = T4 * QsuLD_dVbs ;
5251 Qovsext_dT = T4 * QsuLD_dT ;
5252
5253 QisLDext = T4 * QiuLD ;
5254 QisLDext_dVbse = T4 * QiuLD_dVbs ;
5255 QisLDext_dVdse = T4 * QiuLD_dVds ;
5256 QisLDext_dVgse = T4 * QiuLD_dVgs ;
5257 QisLDext_dT = T4 * QiuLD_dT ;
5258
5259 QbsLDext = T4 * QbuLD ;
5260 QbsLDext_dVbse = T4 * QbuLD_dVbs ;
5261 QbsLDext_dVdse = T4 * QbuLD_dVds ;
5262 QbsLDext_dVgse = T4 * QbuLD_dVgs ;
5263 QbsLDext_dT = T4 * QbuLD_dT ;
5264
5265 } /* Qovsext end */
5266
5267 }
5268
5269 /*-----------------------------------*
5270 * Additional constant capacitance model
5271 *-----------------*/
5272 flg_overgiven = ( (int)ModeNML * model->HSMHV2_cgso_Given
5273 + (int)ModeRVS * model->HSMHV2_cgdo_Given ) ;
5274 if ( flg_overgiven ) {
5275 Cgso = ModeNML * pParam->HSMHV2_cgso + ModeRVS * pParam->HSMHV2_cgdo ;
5276 Cgso *= - here->HSMHV2_weffcv_nf ;
5277 }
5278 Qgso = - Cgso * Vgse ;
5279 Qgso_dVbse = 0.0 ;
5280 Qgso_dVdse = 0.0 ;
5281 Qgso_dVgse = - Cgso ;
5282 } /* Coovlps != 0 end */
5283
5284 /*---------------------------------------------------*
5285 * Drain side (mode-dependent)
5286 *-----------------*/
5287 /*-----------------------------------*
5288 * Constant capacitance model
5289 *-----------------*/
5290 if ( Coovlpd == 0 ) {
5291 flg_overgiven = ( (int)ModeRVS * model->HSMHV2_cgso_Given
5292 + (int)ModeNML * model->HSMHV2_cgdo_Given ) ;
5293 if ( flg_overgiven ) {
5294 Cgdo = ModeRVS * pParam->HSMHV2_cgso + ModeNML * pParam->HSMHV2_cgdo ;
5295 Cgdo *= - here->HSMHV2_weffcv_nf ;
5296 } else {
5297 Cgdo = - Cox0 * Loverd * here->HSMHV2_weffcv_nf ;
5298 }
5299
5300 Qgdo = - Cgdo * (Vgse - Vdse) ;
5301 Qgdo_dVbse = 0.0 ;
5302 Qgdo_dVdse = Cgdo ;
5303 Qgdo_dVgse = - Cgdo ;
5304
5305 /*-----------------------------------*
5306 * Simplified model
5307 *-----------------*/
5308 } else { /* Coovlpd != 0 begin */
5309 if ( Loverd > 0.0 && Noverd == 0.0 ){
5310 cov_slp = modelMKS->HSMHV2_ovslp ;
5311 cov_mag = model->HSMHV2_ovmag ;
5312 T1 = Cox0 * here->HSMHV2_weffcv_nf ;
5313 T4 = cov_slp * T1 * ( cov_mag + Vgs - Vds ) ;
5314 T4_dVg = cov_slp * T1 ;
5315 T4_dVd = - cov_slp * T1 ;
5316 T5 = Loverd * T1 ;
5317 T9 = 1.2e0 + Vds - Psl ;
5318 Qgod = ( Vgs - Vds ) * T5 - T4 * T9 ;
5319 Qgod_dVbs = + T4 * Psl_dVbs ;
5320 Qgod_dVds = - T5 + T4 * ( -1.0 + Psl_dVds ) - T9 * T4_dVd ;
5321 Qgod_dVgs = + T5 + T4 * Psl_dVgs - T9 * T4_dVg ;
5322 Qgod_dT = T4 * Psl_dT;
5323
5324
5325 /*-----------------------------------*
5326 * Surface potential model
5327 *------------------------*/
5328 } else if ( Loverd > 0.0 && Noverd >= 0.0 ) {
5329
5330 Vgbgmt = Vgs - Vbs ;
5331 Vgbgmt_dVbs = -1.0 ;
5332 Vgbgmt_dVds = 0.0 ;
5333 Vgbgmt_dVgs = 1.0 ;
5334 Vxbgmt = Vds - Vbs + epsm10 ;
5335 Vxbgmt_dVbs = -1.0 ;
5336 Vxbgmt_dVds = 1.0 ;
5337 Vxbgmt_dVgs = 0.0 ;
5338
5339 Nover_func = Noverd ;
5340 cnst0over_func = ModeNML * here->HSMHV2_cnst0over + ModeRVS * here->HSMHV2_cnst0overs ;
5341 cnst0over_func_dT = ModeNML * cnst0over_dT + ModeRVS * cnst0overs_dT ;
5342
5343 #include "hsmhv2eval_qover.h"
5344
5345
5346 if (here->HSMHV2_mode == HiSIM_NORMAL_MODE) {
5347 here->HSMHV2_Ps0LD = Ps0LD ;
5348 here->HSMHV2_Ps0LD_dVds = Ps0LD_dVds ;
5349 here->HSMHV2_Ps0LD_dVgs = Ps0LD_dVgs ;
5350 here->HSMHV2_Ps0LD_dVbs = Ps0LD_dVbs ;
5351 here->HSMHV2_Ps0LD_dTi = Ps0LD_dT ;
5352 here->HSMHV2_QbuLD = QbuLD ;
5353 here->HSMHV2_QbuLD_dVds = QbuLD_dVds ;
5354 here->HSMHV2_QbuLD_dVgs = QbuLD_dVgs ;
5355 here->HSMHV2_QbuLD_dVbs = QbuLD_dVbs ;
5356 here->HSMHV2_QbuLD_dTi = QbuLD_dT ;
5357 QodAD = model->HSMHV2_qovadd * ( Vds - Pds ) ;
5358 T3 = - model->HSMHV2_qovadd ;
5359 QodAD_dVgs = T3 * Pds_dVgs ;
5360 QodAD_dVds = T3 * (Pds_dVds - 1.0) ;
5361 QodAD_dVbs = T3 * Pds_dVbs ;
5362 QodAD_dT = T3 * Pds_dT ;
5363 }else{
5364 QodAD = QodAD_dVgs = QodAD_dVds = QodAD_dVbs = QodAD_dT = 0.0 ;
5365 }
5366
5367 T4 = here->HSMHV2_weffcv_nf * Loverd * ( 1 - CVDSOVER ) ;
5368
5369 Qovd = T4 * ( QsuLD + QodAD ) ;
5370 Qovd_dVbs = T4 * ( QsuLD_dVbs + QodAD_dVbs ) ;
5371 Qovd_dVds = T4 * ( QsuLD_dVds + QodAD_dVds ) ;
5372 Qovd_dVgs = T4 * ( QsuLD_dVgs + QodAD_dVgs ) ;
5373 Qovd_dT = T4 * ( QsuLD_dT + QodAD_dT ) ;
5374
5375 QidLD = T4 * QiuLD ;
5376 QidLD_dVbs = T4 * QiuLD_dVbs ;
5377 QidLD_dVds = T4 * QiuLD_dVds ;
5378 QidLD_dVgs = T4 * QiuLD_dVgs ;
5379 QidLD_dT = T4 * QiuLD_dT ;
5380
5381 QbdLD = T4 * ( QbuLD + QodAD ) ;
5382 QbdLD_dVbs = T4 * ( QbuLD_dVbs + QodAD_dVbs ) ;
5383 QbdLD_dVds = T4 * ( QbuLD_dVds + QodAD_dVds ) ;
5384 QbdLD_dVgs = T4 * ( QbuLD_dVgs + QodAD_dVgs ) ;
5385 QbdLD_dT = T4 * ( QbuLD_dT + QodAD_dT ) ;
5386
5387
5388 if ( CVDSOVER != 0.0 ) { /* Qovdext begin */
5389 Vgbgmt = Vgse - Vbse ;
5390 Vgbgmt_dVbs = -1.0 ;
5391 Vgbgmt_dVds = 0.0 ;
5392 Vgbgmt_dVgs = 1.0 ;
5393 Vxbgmt = Vdse - Vbse + epsm10 ;
5394 Vxbgmt_dVbs = -1.0 ;
5395 Vxbgmt_dVds = 1.0 ;
5396 Vxbgmt_dVgs = 0.0 ;
5397
5398 #include "hsmhv2eval_qover.h"
5399
5400 T4 = here->HSMHV2_weffcv_nf * Loverd * CVDSOVER ;
5401 Qovdext = T4 * QsuLD ;
5402 Qovdext_dVdse = T4 * QsuLD_dVds ;
5403 Qovdext_dVgse = T4 * QsuLD_dVgs ;
5404 Qovdext_dVbse = T4 * QsuLD_dVbs ;
5405 Qovdext_dT = T4 * QsuLD_dT ;
5406
5407 QidLDext = T4 * QiuLD ;
5408 QidLDext_dVbse = T4 * QiuLD_dVbs ;
5409 QidLDext_dVdse = T4 * QiuLD_dVds ;
5410 QidLDext_dVgse = T4 * QiuLD_dVgs ;
5411 QidLDext_dT = T4 * QiuLD_dT ;
5412
5413 QbdLDext = T4 * QbuLD ;
5414 QbdLDext_dVbse = T4 * QbuLD_dVbs ;
5415 QbdLDext_dVdse= T4 * QbuLD_dVds ;
5416 QbdLDext_dVgse= T4 * QbuLD_dVgs ;
5417 QbdLDext_dT = T4 * QbuLD_dT ;
5418
5419 } /* Qovdext end */
5420
5421 }
5422 /*-----------------------------------*
5423 * Additional constant capacitance model
5424 *-----------------*/
5425 flg_overgiven = ( (int)ModeRVS * model->HSMHV2_cgso_Given
5426 + (int)ModeNML * model->HSMHV2_cgdo_Given ) ;
5427 if ( flg_overgiven ) {
5428 Cgdo = ModeRVS * pParam->HSMHV2_cgso + ModeNML * pParam->HSMHV2_cgdo ;
5429 Cgdo *= - here->HSMHV2_weffcv_nf ;
5430 }
5431 Qgdo = - Cgdo * (Vgse - Vdse) ;
5432 Qgdo_dVbse = 0.0 ;
5433 Qgdo_dVdse = Cgdo ;
5434 Qgdo_dVgse = - Cgdo ;
5435 } /* Coovlpd != 0 end */
5436
5437 /*-------------------------------------------*
5438 * Gate/Bulk overlap charge: Qgbo
5439 *-----------------*/
5440 Cgbo_loc = - pParam->HSMHV2_cgbo * here->HSMHV2_lgate ;
5441 Qgbo = - Cgbo_loc * (Vgs -Vbs) ;
5442 Qgbo_dVgs = - Cgbo_loc ;
5443 Qgbo_dVbs = Cgbo_loc ;
5444 Qgbo_dVds = 0.0 ;
5445
5446 /*---------------------------------------------------*
5447 * Lateral-field-induced capacitance.
5448 *-----------------*/
5449 if ( model->HSMHV2_xqy == 0 ){
5450 Qy = 0.0e0 ;
5451 Qy_dVds = 0.0e0 ;
5452 Qy_dVgs = 0.0e0 ;
5453 Qy_dVbs = 0.0e0 ;
5454 Qy_dT = 0.0e0 ;
5455 } else {
5456 Pslk = Ec * Leff + Ps0 ;
5457 Pslk_dVbs = Ec_dVbs * Leff + Ps0_dVbs;
5458 Pslk_dVds = Ec_dVds * Leff + Ps0_dVds;
5459 Pslk_dVgs = Ec_dVgs * Leff + Ps0_dVgs;
5460 Pslk_dT = Ec_dT * Leff + Ps0_dT;
5461
5462 T1 = Aclm * ( Vds + Ps0 ) + ( 1.0e0 - Aclm ) * Pslk ;
5463 T1_dVb = Aclm * ( Ps0_dVbs ) + ( 1.0e0 - Aclm ) * Pslk_dVbs ;
5464 T1_dVd = Aclm * ( 1.0 + Ps0_dVds ) + ( 1.0e0 - Aclm ) * Pslk_dVds ;
5465 T1_dVg = Aclm * ( Ps0_dVgs ) + ( 1.0e0 - Aclm ) * Pslk_dVgs ;
5466 T1_dT = Aclm * ( Ps0_dT ) + ( 1.0e0 - Aclm ) * Pslk_dT ;
5467 T10 = here->HSMHV2_wdpl ;
5468 T3 = T10 * 1.3 ;
5469 T2 = C_ESI * here->HSMHV2_weffcv_nf * T3 ;
5470 Qy = - ( ( Ps0 + Vds - T1 ) / model->HSMHV2_xqy ) * T2 ;
5471 Qy_dVds = - ( ( Ps0_dVds + 1.0e0 - T1_dVd ) / model->HSMHV2_xqy ) * T2 ;
5472 Qy_dVgs = - ( ( Ps0_dVgs - T1_dVg ) / model->HSMHV2_xqy ) * T2 ;
5473 Qy_dVbs = - ( ( Ps0_dVbs - T1_dVb ) / model->HSMHV2_xqy ) * T2 ;
5474 Qy_dT = - ( ( Ps0_dT - T1_dT ) / model->HSMHV2_xqy ) * T2 ;
5475 }
5476
5477 if ( model->HSMHV2_xqy1 != 0.0 ){
5478 Qy += here->HSMHV2_cqyb0 * Vbs ;
5479 Qy_dVbs += here->HSMHV2_cqyb0 ;
5480 }
5481
5482 /*---------------------------------------------------*
5483 * Fringing capacitance.
5484 *-----------------*/
5485 Cfd = here->HSMHV2_cfrng ;
5486 Cfs = here->HSMHV2_cfrng ;
5487 Qfd = Cfd * ( Vgse - Vdse ) ;
5488 Qfs = Cfs * Vgse ;
5489
5490 /*-----------------------------------------------------------*
5491 * End of PART-3. (label)
5492 *-----------------*/
5493
5494 /* end_of_part_3: */
5495
5496 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5497 * PART-4: Substrate-source/drain junction diode.
5498 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
5499
5500 /* move to hsmhveval_dio.c */
5501
5502
5503 /*-----------------------------------------------------------*
5504 * End of PART-4. (label)
5505 *-----------------*/
5506
5507 /* end_of_part_4: */
5508
5509
5510
5511 /*-----------------------------------------------------------*
5512 * PART-5: NQS. (label)
5513 *-----------------*/
5514 if (flg_nqs) {
5515 if(ckt->CKTmode & MODETRAN){
5516 if( ckt->CKTmode & MODEINITTRAN ){
5517
5518 tau = tau_dVds = tau_dVgs = tau_dVbs = tau_dT = 0.0 ;
5519 taub = taub_dVds = taub_dVgs = taub_dVbs = taub_dT = 0.0 ;
5520
5521 } else {
5522 /* tau for inversion charge */
5523 if (flg_noqi == 0) {
5524 T12 = model->HSMHV2_dly1;
5525 T10 = model->HSMHV2_dly2;
5526
5527 T3 = Lch ;
5528 T1 = T10 * T12 * T3 * T3 ;
5529 T2 = Mu * VgVt * T12 + T10 * T3 * T3 + small ;
5530 tau = T1 / T2 ;
5531
5532 T1_dVg = T10 * T12 * 2.0 * T3 * Lch_dVgs ;
5533 T1_dVd = T10 * T12 * 2.0 * T3 * Lch_dVds ;
5534 T1_dVb = T10 * T12 * 2.0 * T3 * Lch_dVbs ;
5535 T1_dT = T10 * T12 * 2.0 * T3 * Lch_dT ;
5536
5537 T2_dVg = T12 * Mu_dVgs * VgVt
5538 + T12 * Mu * VgVt_dVgs + T10 * 2.0 * T3 * Lch_dVgs ;
5539 T2_dVd = T12 * Mu_dVds * VgVt
5540 + T12 * Mu * VgVt_dVds + T10 * 2.0 * T3 * Lch_dVds ;
5541 T2_dVb = T12 * Mu_dVbs * VgVt
5542 + T12 * Mu * VgVt_dVbs + T10 * 2.0 * T3 * Lch_dVbs ;
5543 T2_dT = T12 * Mu_dT * VgVt
5544 + T12 * Mu * VgVt_dT + T10 * 2.0 * T3 * Lch_dT ;
5545
5546 T4 = 1.0 / T2 ;
5547 tau_dVgs = ( T1_dVg - tau * T2_dVg ) * T4 ;
5548 tau_dVds = ( T1_dVd - tau * T2_dVd ) * T4 ;
5549 tau_dVbs = ( T1_dVb - tau * T2_dVb ) * T4 ;
5550 tau_dT = ( T1_dT - tau * T2_dT ) * T4 ;
5551 } else {
5552 tau = model->HSMHV2_dly1 ;
5553 tau_dVgs = tau_dVds = tau_dVbs = tau_dT = 0.0 ;
5554 }
5555
5556 T1 = ckt->CKTdelta ;
5557
5558 /* tau for bulk charge */
5559 T2 = modelMKS->HSMHV2_dly3 ;
5560 taub = T2 * Cox ;
5561 taub_dVgs = T2 * Cox_dVg ;
5562 taub_dVds = T2 * Cox_dVd ;
5563 taub_dVbs = T2 * Cox_dVb ;
5564 taub_dT = 0.0 ;
5565
5566 }
5567 } else { /* !(CKT_mode & MODETRAN) */
5568
5569 tau = tau_dVds = tau_dVgs = tau_dVbs = tau_dT = 0.0 ;
5570 taub = taub_dVds = taub_dVgs = taub_dVbs = taub_dT = 0.0 ;
5571 }
5572 }
5573
5574 if ( flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG)) ) { /* ACNQS */
5575
5576 if (flg_noqi == 0) {
5577 T12 = model->HSMHV2_dly1 ;
5578 T10 = model->HSMHV2_dly2 ;
5579
5580 T3 = Lch ;
5581 T1 = T12 * T10 * T3 * T3 ;
5582 T2 = Mu * VgVt * T12 + T10 * T3 * T3 + small ;
5583 tau = T1 / T2 ;
5584
5585 T1_dVg = T10 * T12 * 2.0 * T3 * Lch_dVgs ;
5586 T1_dVd = T10 * T12 * 2.0 * T3 * Lch_dVds ;
5587 T1_dVb = T10 * T12 * 2.0 * T3 * Lch_dVbs ;
5588 T1_dT = T10 * T12 * 2.0 * T3 * Lch_dT ;
5589
5590 T2_dVg = T12 * Mu_dVgs * VgVt + T12 * Mu * VgVt_dVgs
5591 + T10 * 2.0 * T3 * Lch_dVgs ;
5592 T2_dVd = T12 * Mu_dVds * VgVt + T12 * Mu * VgVt_dVds
5593 + T10 * 2.0 * T3 * Lch_dVds ;
5594 T2_dVb = T12 * Mu_dVbs * VgVt + T12 * Mu * VgVt_dVbs
5595 + T10 * 2.0 * T3 * Lch_dVbs ;
5596 T2_dT = T12 * Mu_dT * VgVt + T12 * Mu * VgVt_dT
5597 + T10 * 2.0 * T3 * Lch_dT ;
5598
5599 T4 = 1.0 / T2 ;
5600 tau_dVgs = (T1_dVg - tau * T2_dVg) * T4 ;
5601 tau_dVds = (T1_dVd - tau * T2_dVd) * T4 ;
5602 tau_dVbs = (T1_dVb - tau * T2_dVb) * T4 ;
5603 tau_dT = (T1_dT - tau * T2_dT) * T4 ;
5604 } else {
5605 tau = model->HSMHV2_dly1 ;
5606 tau_dVgs = tau_dVds = tau_dVbs = tau_dT = 0.0 ;
5607 }
5608
5609 T2 = modelMKS->HSMHV2_dly3 ;
5610 taub = T2 * Cox;
5611 taub_dVgs = T2 * Cox_dVg ;
5612 taub_dVds = T2 * Cox_dVd ;
5613 taub_dVbs = T2 * Cox_dVb ;
5614 taub_dT = 0.0 ;
5615 }
5616
5617 /*-----------------------------------------------------------*
5618 * End of PART-5. (label)
5619 *-----------------*/
5620 /* end_of_part_5: */
5621
5622 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5623 * PART-6: Noise Calculation.
5624 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
5625
5626 /*-----------------------------------------------------------*
5627 * 1/f noise.
5628 *-----------------*/
5629 if ( model->HSMHV2_coflick != 0 && !flg_noqi ) {
5630
5631 NFalp = pParam->HSMHV2_nfalp ;
5632 NFtrp = pParam->HSMHV2_nftrp ;
5633 Cit = modelMKS->HSMHV2_cit ;
5634
5635 T1 = Qn0 / C_QE ;
5636 T2 = ( Cox + Qn0 / ( Ps0 - Vbscl ) + Cit ) * beta_inv / C_QE ;
5637 T3 = -2.0E0 * Qi_noi / C_QE / Lch / here->HSMHV2_weff_nf - T1 ;
5638 if ( T3 != T1 ) {
5639 T4 = 1.0E0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0E0 * NFalp * Ey * Mu / ( T3 - T1 )
5640 * log( ( T3 + T2 ) / ( T1 + T2 ) ) + NFalp * Ey * Mu * NFalp * Ey * Mu ;
5641 } else {
5642 T4 = 1.0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0 * NFalp * Ey * Mu / ( T1 + T2 )
5643 + NFalp * Ey * Mu * NFalp * Ey * Mu;
5644 }
5645 Nflic = Ids * Ids * NFtrp / ( Lch * beta * here->HSMHV2_weff_nf ) * T4 ;
5646 } else {
5647 Nflic = 0.0 ;
5648 }
5649
5650 /*-----------------------------------------------------------*
5651 * thermal noise.
5652 *-----------------*/
5653 if ( model->HSMHV2_cothrml != 0 && !flg_noqi && model->HSMHV2_codep==0 ) {
5654
5655 Eyd = ( Psdl - Ps0 ) / Lch + small ;
5656 T12 = Muun * Eyd / 1.0e7 ;
5657 /* note: model->HSMHV2_bb = 2 (electron) ;1 (hole) */
5658 if ( 1.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 1.0e0 + epsm10 ) {
5659 T7 = 1.0e0 ;
5660 } else if ( 2.0e0 - epsm10 <= model->HSMHV2_bb && model->HSMHV2_bb <= 2.0e0 + epsm10 ) {
5661 T7 = T12 ;
5662 } else {
5663 T7 = Fn_Pow( Eyd, model->HSMHV2_bb - 1.0e0 ) ;
5664 }
5665 T8 = T12 * T7 ;
5666 T9 = 1.0e0 + T8 ;
5667 T10 = Fn_Pow( T9, ( - 1.0e0 / model->HSMHV2_bb - 1.0e0 ) ) ;
5668 T11 = T9 * T10 ;
5669 Mud_hoso = Muun * T11 ;
5670 Mu_Ave = ( Mu + Mud_hoso ) / 2.0 ;
5671
5672 /* Sid_h = GAMMA * 4.0 * C_KB * model->HSMHV2_temp * gds0_h2; */
5673 T0 = Alpha * Alpha ;
5674 Nthrml = here->HSMHV2_weff_nf * Cox * VgVt * Mu
5675 * ( ( 1e0 + 3e0 * Alpha + 6e0 * T0 ) * Mud_hoso * Mud_hoso
5676 + ( 3e0 + 4e0 * Alpha + 3e0 * T0 ) * Mud_hoso * Mu
5677 + ( 6e0 + 3e0 * Alpha + T0 ) * Mu * Mu )
5678 / ( 15e0 * Lch * ( 1e0 + Alpha ) * Mu_Ave * Mu_Ave ) ;
5679 } else {
5680 Nthrml = 0e0 ;
5681 }
5682
5683
5684 /*----------------------------------------------------------*
5685 * induced gate noise. ( Part 2/3 )
5686 *----------------------*/
5687 if ( model->HSMHV2_coign != 0 && model->HSMHV2_cothrml != 0 && flg_ign == 1 && !flg_noqi && model->HSMHV2_codep==0) {
5688 sqrtkusaiL = sqrt( kusaiL ) ;
5689 T2 = VgVt + sqrtkusaiL ;
5690 T3 = kusai00 * kusai00 ;
5691 T4 = kusaiL * kusaiL ;
5692 T5 = 42.0e0 * kusai00 * kusaiL ;
5693 T5 += 4.0e0 * ( T3 + T4 ) ;
5694 T5 += 20.0e0 * sqrtkusaiL * VgVt * ( kusai00 + kusaiL ) ;
5695 T10 = T2 * T2 ;
5696 T10 *= T10 ;
5697 kusai_ig = T5 / ( T10 * T2 ) ; /* Induced Gate Noise parameter */
5698 gds0_ign = here->HSMHV2_weff_nf / Lch * Mu * Cox ;
5699 gds0_h2 = gds0_ign * VgVt ;
5700 GAMMA = Nthrml / gds0_h2 ;
5701 T7 = kusai00 + 4.0e0 * VgVt * sqrtkusaiL + kusaiL ;
5702 /* cross-correlation coefficient (= Sigid/sqrt(Sig*Sid) ) */
5703 crl_f = c_sqrt_15 * kusai00L * T7
5704 / ( 6.0e0 * T2 * sqrt( GAMMA * T2 * VgVt * T5 ) ) ;
5705 }
5706
5707
5708 /*-----------------------------------------------------------*
5709 * End of PART-6. (label)
5710 *-----------------*/
5711 /* end_of_part_6: */
5712
5713
5714 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5715 * PART-7: Evaluation of outputs.
5716 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
5717
5718 /*---------------------------------------------------*
5719 * Extrapolate quantities if external biases are out of bounds.
5720 * -> not necessary here
5721 *-----------------*/
5722
5723 /*-----------------------------------------------------------*
5724 * Warn negative conductance.
5725 * - T1 ( = d Ids / d Vds ) is the derivative w.r.t. circuit bias.
5726 *-----------------*/
5727 T1 = ModeNML * Ids_dVds + ModeRVS * ( Ids_dVbs + Ids_dVds + Ids_dVgs ) ;
5728
5729 if ( flg_info >= 1 &&
5730 (Ids_dVbs < 0.0 || T1 < 0.0 || Ids_dVgs < 0.0) ) {
5731 printf( "*** warning(HiSIM_HV(%s)): Negative Conductance\n", model->HSMHV2modName ) ;
5732 printf( " type = %d mode = %d\n" , model->HSMHV2_type , here->HSMHV2_mode ) ;
5733 printf( " Vbs = %12.5e Vds = %12.5e Vgse= %12.5e\n" ,
5734 Vbs , Vds , Vgs ) ;
5735 printf( " Ids_dVbs = %12.5e\n" , Ids_dVbs ) ;
5736 printf( " Ids_dVds = %12.5e\n" , T1 ) ;
5737 printf( " Ids_dVgs = %12.5e\n" , Ids_dVgs ) ;
5738 }
5739
5740
5741 /*-----------------------------------------------------------*
5742 * Assign outputs.
5743 *-----------------*/
5744
5745
5746 /*---------------------------------------------------*
5747 * Channel current and conductances.
5748 *-----------------*/
5749 here->HSMHV2_ids = Mfactor * Ids ;
5750 here->HSMHV2_dIds_dVdsi = Mfactor * Ids_dVds ;
5751 here->HSMHV2_dIds_dVgsi = Mfactor * Ids_dVgs ;
5752 here->HSMHV2_dIds_dVbsi = Mfactor * Ids_dVbs ;
5753 here->HSMHV2_dIds_dTi = Mfactor * Ids_dT ;
5754
5755 here->HSMHV2_idsibpc = Mfactor * IdsIBPC ;
5756 here->HSMHV2_dIdsIBPC_dVdsi = Mfactor * IdsIBPC_dVds ;
5757 here->HSMHV2_dIdsIBPC_dVgsi = Mfactor * IdsIBPC_dVgs ;
5758 here->HSMHV2_dIdsIBPC_dVbsi = Mfactor * IdsIBPC_dVbs ;
5759 here->HSMHV2_dIdsIBPC_dTi = Mfactor * IdsIBPC_dT ;
5760 here->HSMHV2_dIdsIBPC_dVddp = Mfactor * IdsIBPC_dVddp ;
5761
5762
5763 /* -------------------------------------*
5764 * Intrinsic charges / capacitances.
5765 *-----------------*/
5766 if (flg_nqs) { /* for flat handling of NQS: the NQS charges are added in hsmhvld */
5767
5768 here->HSMHV2_qg = 0.0 ;
5769 here->HSMHV2_qd = 0.0 ;
5770 here->HSMHV2_qs = 0.0 ;
5771
5772 here->HSMHV2_qdp = 0.0 ;
5773 here->HSMHV2_qsp = 0.0 ;
5774
5775 here->HSMHV2_dqdp_dVdse = 0.0 ;
5776 here->HSMHV2_dqdp_dVgse = 0.0 ;
5777 here->HSMHV2_dqdp_dVbse = 0.0 ;
5778 here->HSMHV2_dqdp_dTi = 0.0 ;
5779 here->HSMHV2_dqsp_dVdse = 0.0 ;
5780 here->HSMHV2_dqsp_dVgse = 0.0 ;
5781 here->HSMHV2_dqsp_dVbse = 0.0 ;
5782 here->HSMHV2_dqsp_dTi = 0.0 ;
5783
5784 here->HSMHV2_dQdi_dVdsi = 0.0 ;
5785 here->HSMHV2_dQdi_dVgsi = 0.0 ;
5786 here->HSMHV2_dQdi_dVbsi = 0.0 ;
5787 here->HSMHV2_dQdi_dTi = 0.0 ;
5788 here->HSMHV2_dQg_dVdsi = 0.0 ;
5789 here->HSMHV2_dQg_dVgsi = 0.0 ;
5790 here->HSMHV2_dQg_dVbsi = 0.0 ;
5791 here->HSMHV2_dQg_dTi = 0.0 ;
5792 here->HSMHV2_dQb_dVdsi = 0.0 ;
5793 here->HSMHV2_dQb_dVgsi = 0.0 ;
5794 here->HSMHV2_dQb_dVbsi = 0.0 ;
5795 here->HSMHV2_dQb_dTi = 0.0 ;
5796
5797 here->HSMHV2_qgext = 0.0 ;
5798 here->HSMHV2_qdext = 0.0 ;
5799 here->HSMHV2_qsext = 0.0 ;
5800
5801 here->HSMHV2_dQdext_dVdse = 0.0 ;
5802 here->HSMHV2_dQdext_dVgse = 0.0 ;
5803 here->HSMHV2_dQdext_dVbse = 0.0 ;
5804 here->HSMHV2_dQdext_dTi = 0.0 ;
5805 here->HSMHV2_dQgext_dVdse = 0.0 ;
5806 here->HSMHV2_dQgext_dVgse = 0.0 ;
5807 here->HSMHV2_dQgext_dVbse = 0.0 ;
5808 here->HSMHV2_dQgext_dTi = 0.0 ;
5809 here->HSMHV2_dQbext_dVdse = 0.0 ;
5810 here->HSMHV2_dQbext_dVgse = 0.0 ;
5811 here->HSMHV2_dQbext_dVbse = 0.0 ;
5812 here->HSMHV2_dQbext_dTi = 0.0 ;
5813 here->HSMHV2_tau = tau ;
5814 here->HSMHV2_tau_dVgsi = tau_dVgs ;
5815 here->HSMHV2_tau_dVdsi = tau_dVds ;
5816 here->HSMHV2_tau_dVbsi = tau_dVbs ;
5817 here->HSMHV2_tau_dTi = tau_dT ;
5818
5819 here->HSMHV2_taub = taub ;
5820 here->HSMHV2_taub_dVgsi = taub_dVgs ;
5821 here->HSMHV2_taub_dVdsi = taub_dVds ;
5822 here->HSMHV2_taub_dVbsi = taub_dVbs ;
5823 here->HSMHV2_taub_dTi = taub_dT ;
5824
5825 here->HSMHV2_Xd = Qdrat;
5826 here->HSMHV2_Xd_dVgsi = Qdrat_dVgs ;
5827 here->HSMHV2_Xd_dVdsi = Qdrat_dVds ;
5828 here->HSMHV2_Xd_dVbsi = Qdrat_dVbs ;
5829 here->HSMHV2_Xd_dTi = Qdrat_dT ;
5830
5831 here->HSMHV2_Qbulk = Mfactor * Qb ;
5832 here->HSMHV2_Qbulk_dVgsi = Mfactor * Qb_dVgs ;
5833 here->HSMHV2_Qbulk_dVdsi = Mfactor * Qb_dVds ;
5834 here->HSMHV2_Qbulk_dVbsi = Mfactor * Qb_dVbs ;
5835 here->HSMHV2_Qbulk_dTi = Mfactor * Qb_dT ;
5836
5837 here->HSMHV2_Qi = Mfactor * Qi ;
5838 here->HSMHV2_Qi_dVgsi = Mfactor * Qi_dVgs ;
5839 here->HSMHV2_Qi_dVdsi = Mfactor * Qi_dVds ;
5840 here->HSMHV2_Qi_dVbsi = Mfactor * Qi_dVbs ;
5841 here->HSMHV2_Qi_dTi = Mfactor * Qi_dT ;
5842
5843 } else { /* QS */
5844
5845 here->HSMHV2_qg = Mfactor * - (Qb + Qi) ;
5846 here->HSMHV2_qd = Mfactor * Qd ;
5847 here->HSMHV2_qs = Mfactor * ( Qi - Qd ) ;
5848 here->HSMHV2_qdp = 0.0 ;
5849 here->HSMHV2_qsp = 0.0 ;
5850
5851 here->HSMHV2_dqdp_dVdse = 0.0 ;
5852 here->HSMHV2_dqdp_dVgse = 0.0 ;
5853 here->HSMHV2_dqdp_dVbse = 0.0 ;
5854 here->HSMHV2_dqdp_dTi = 0.0 ;
5855 here->HSMHV2_dqsp_dVdse = 0.0 ;
5856 here->HSMHV2_dqsp_dVgse = 0.0 ;
5857 here->HSMHV2_dqsp_dVbse = 0.0 ;
5858 here->HSMHV2_dqsp_dTi = 0.0 ;
5859
5860 here->HSMHV2_qgext = 0.0 ;
5861 here->HSMHV2_qdext = 0.0 ;
5862 here->HSMHV2_qsext = 0.0 ;
5863
5864 here->HSMHV2_dQdext_dVdse = 0.0 ;
5865 here->HSMHV2_dQdext_dVgse = 0.0 ;
5866 here->HSMHV2_dQdext_dVbse = 0.0 ;
5867 here->HSMHV2_dQdext_dTi = 0.0 ;
5868 here->HSMHV2_dQgext_dVdse = 0.0 ;
5869 here->HSMHV2_dQgext_dVgse = 0.0 ;
5870 here->HSMHV2_dQgext_dVbse = 0.0 ;
5871 here->HSMHV2_dQgext_dTi = 0.0 ;
5872 here->HSMHV2_dQbext_dVdse = 0.0 ;
5873 here->HSMHV2_dQbext_dVgse = 0.0 ;
5874 here->HSMHV2_dQbext_dVbse = 0.0 ;
5875 here->HSMHV2_dQbext_dTi = 0.0 ;
5876 here->HSMHV2_dQdi_dVdsi = Mfactor * Qd_dVds ;
5877 here->HSMHV2_dQdi_dVgsi = Mfactor * Qd_dVgs ;
5878 here->HSMHV2_dQdi_dVbsi = Mfactor * Qd_dVbs ;
5879 here->HSMHV2_dQdi_dTi = Mfactor * Qd_dT ;
5880 here->HSMHV2_dQg_dVdsi = Mfactor * ( - Qb_dVds - Qi_dVds ) ;
5881 here->HSMHV2_dQg_dVgsi = Mfactor * ( - Qb_dVgs - Qi_dVgs ) ;
5882 here->HSMHV2_dQg_dVbsi = Mfactor * ( - Qb_dVbs - Qi_dVbs ) ;
5883 here->HSMHV2_dQg_dTi = Mfactor * ( - Qb_dT - Qi_dT ) ;
5884 here->HSMHV2_dQb_dVdsi = Mfactor * Qb_dVds ;
5885 here->HSMHV2_dQb_dVgsi = Mfactor * Qb_dVgs ;
5886 here->HSMHV2_dQb_dVbsi = Mfactor * Qb_dVbs ;
5887 here->HSMHV2_dQb_dTi = Mfactor * Qb_dT ;
5888 }
5889
5890 /*---------------------------------------------------*
5891 * Add S/D overlap charges/capacitances to intrinsic ones.
5892 * - NOTE: This function depends on coadov, a control option.
5893 *-----------------*/
5894 if ( model->HSMHV2_coadov == 1 ) {
5895 here->HSMHV2_qg += Mfactor * ( Qgod + Qgos + Qgbo + Qy - Qovd - Qovs ) ;
5896 here->HSMHV2_qd += Mfactor * ( - Qgod - Qy + QbdLD ) ;
5897 here->HSMHV2_qs += Mfactor * ( - Qgos + QbsLD ) ;
5898
5899 here->HSMHV2_qdp += Mfactor * ( - Qfd - Qgdo ) ;
5900 here->HSMHV2_qsp += Mfactor * ( - Qfs - Qgso ) ;
5901
5902 here->HSMHV2_cddo = Mfactor * ( - Qgod_dVds - Qy_dVds + QbdLD_dVds ) ;
5903 here->HSMHV2_dQdi_dVdsi += here->HSMHV2_cddo ;
5904 here->HSMHV2_cdgo = Mfactor * ( - Qgod_dVgs - Qy_dVgs + QbdLD_dVgs ) ;
5905 here->HSMHV2_dQdi_dVgsi += here->HSMHV2_cdgo ;
5906 here->HSMHV2_cdbo = Mfactor * ( - Qgod_dVbs - Qy_dVbs + QbdLD_dVbs ) ;
5907 here->HSMHV2_dQdi_dVbsi += here->HSMHV2_cdbo ;
5908 here->HSMHV2_dQdi_dTi += Mfactor * ( - Qgod_dT - Qy_dT + QbdLD_dT ) ;
5909 here->HSMHV2_cgdo = Mfactor * ( Qgod_dVds + Qgos_dVds + Qgbo_dVds + Qy_dVds - Qovd_dVds - Qovs_dVds ) ;
5910 here->HSMHV2_dQg_dVdsi += here->HSMHV2_cgdo ;
5911 here->HSMHV2_cggo = Mfactor * ( Qgod_dVgs + Qgos_dVgs + Qgbo_dVgs + Qy_dVgs - Qovd_dVgs - Qovs_dVgs ) ;
5912 here->HSMHV2_dQg_dVgsi += here->HSMHV2_cggo ;
5913 here->HSMHV2_cgbo = Mfactor * ( Qgod_dVbs + Qgos_dVbs + Qgbo_dVbs + Qy_dVbs - Qovd_dVbs - Qovs_dVbs ) ;
5914 here->HSMHV2_dQg_dVbsi += here->HSMHV2_cgbo ;
5915 here->HSMHV2_dQg_dTi += Mfactor * ( Qgod_dT + Qgos_dT + Qgbo_dT + Qy_dT - Qovd_dT - Qovs_dT ) ;
5916 here->HSMHV2_cbdo = Mfactor * ( - Qgbo_dVds + QidLD_dVds + QisLD_dVds ) ;
5917 here->HSMHV2_dQb_dVdsi += here->HSMHV2_cbdo ;
5918 here->HSMHV2_cbgo = Mfactor * ( - Qgbo_dVgs + QidLD_dVgs + QisLD_dVgs ) ;
5919 here->HSMHV2_dQb_dVgsi += here->HSMHV2_cbgo ;
5920 here->HSMHV2_cbbo = Mfactor * ( - Qgbo_dVbs + QidLD_dVbs + QisLD_dVbs ) ;
5921 here->HSMHV2_dQb_dVbsi += here->HSMHV2_cbbo ;
5922 here->HSMHV2_dQb_dTi += Mfactor * ( - Qgbo_dT + QidLD_dT + QisLD_dT ) ;
5923
5924 /* for fringing capacitances */
5925 here->HSMHV2_dqdp_dVdse += Mfactor * ( Cfd - Qgdo_dVdse ) ;
5926 here->HSMHV2_dqdp_dVgse += Mfactor * ( - Cfd - Qgdo_dVgse ) ;
5927 here->HSMHV2_dqdp_dVbse += Mfactor * ( - Qgdo_dVbse ) ;
5928 here->HSMHV2_dqdp_dTi += 0.0 ;
5929 here->HSMHV2_dqsp_dVdse += Mfactor * ( - Qgso_dVdse ) ;
5930 here->HSMHV2_dqsp_dVgse += Mfactor * ( - Cfs - Qgso_dVgse ) ;
5931 here->HSMHV2_dqsp_dVbse += Mfactor * ( - Qgso_dVbse ) ;
5932 here->HSMHV2_dqsp_dTi += 0.0 ;
5933
5934 here->HSMHV2_qgext += Mfactor * ( - Qovdext - Qovsext ) ;
5935 here->HSMHV2_qdext += Mfactor * QbdLDext ;
5936 here->HSMHV2_qsext += Mfactor * QbsLDext ;
5937
5938 here->HSMHV2_dQdext_dVdse += Mfactor * ( QbdLDext_dVdse ) ;
5939 here->HSMHV2_dQdext_dVgse += Mfactor * ( QbdLDext_dVgse ) ;
5940 here->HSMHV2_dQdext_dVbse += Mfactor * ( QbdLDext_dVbse ) ;
5941 here->HSMHV2_dQdext_dTi += Mfactor * ( QbdLDext_dT ) ;
5942 here->HSMHV2_dQgext_dVdse += Mfactor * ( - Qovdext_dVdse - Qovsext_dVdse ) ;
5943 here->HSMHV2_dQgext_dVgse += Mfactor * ( - Qovdext_dVgse - Qovsext_dVgse ) ;
5944 here->HSMHV2_dQgext_dVbse += Mfactor * ( - Qovdext_dVbse - Qovsext_dVbse ) ;
5945 here->HSMHV2_dQgext_dTi += Mfactor * ( - Qovdext_dT - Qovsext_dT ) ;
5946 here->HSMHV2_dQbext_dVdse += Mfactor * ( QidLDext_dVdse + QisLDext_dVdse ) ;
5947 here->HSMHV2_dQbext_dVgse += Mfactor * ( QidLDext_dVgse + QisLDext_dVgse ) ;
5948 here->HSMHV2_dQbext_dVbse += Mfactor * ( QidLDext_dVbse + QisLDext_dVbse ) ;
5949 here->HSMHV2_dQbext_dTi += Mfactor * ( QidLDext_dT + QisLDext_dT ) ;
5950
5951 }
5952 here->HSMHV2_dQsi_dVdsi = - (here->HSMHV2_dQdi_dVdsi + here->HSMHV2_dQg_dVdsi + here->HSMHV2_dQb_dVdsi) ;
5953 here->HSMHV2_dQsi_dVgsi = - (here->HSMHV2_dQdi_dVgsi + here->HSMHV2_dQg_dVgsi + here->HSMHV2_dQb_dVgsi) ;
5954 here->HSMHV2_dQsi_dVbsi = - (here->HSMHV2_dQdi_dVbsi + here->HSMHV2_dQg_dVbsi + here->HSMHV2_dQb_dVbsi) ;
5955 here->HSMHV2_dQsi_dTi = - (here->HSMHV2_dQdi_dTi + here->HSMHV2_dQg_dTi + here->HSMHV2_dQb_dTi ) ;
5956
5957 here->HSMHV2_dQsext_dVdse = - (here->HSMHV2_dQdext_dVdse + here->HSMHV2_dQgext_dVdse + here->HSMHV2_dQbext_dVdse) ;
5958 here->HSMHV2_dQsext_dVgse = - (here->HSMHV2_dQdext_dVgse + here->HSMHV2_dQgext_dVgse + here->HSMHV2_dQbext_dVgse) ;
5959 here->HSMHV2_dQsext_dVbse = - (here->HSMHV2_dQdext_dVbse + here->HSMHV2_dQgext_dVbse + here->HSMHV2_dQbext_dVbse) ;
5960 here->HSMHV2_dQsext_dTi = - (here->HSMHV2_dQdext_dTi + here->HSMHV2_dQgext_dTi + here->HSMHV2_dQbext_dTi ) ;
5961
5962 /*---------------------------------------------------*
5963 * Substrate/gate/leak currents.
5964 *-----------------*/
5965
5966 here->HSMHV2_isub = Mfactor * Isub ;
5967 here->HSMHV2_dIsub_dVdsi = Mfactor * Isub_dVds ;
5968 here->HSMHV2_dIsub_dVgsi = Mfactor * Isub_dVgs ;
5969 here->HSMHV2_dIsub_dVbsi = Mfactor * Isub_dVbs ;
5970 here->HSMHV2_dIsub_dTi = Mfactor * Isub_dT ;
5971
5972 here->HSMHV2_isubld = Mfactor * IsubLD ;
5973 here->HSMHV2_dIsubLD_dVdsi = Mfactor * IsubLD_dVds ;
5974 here->HSMHV2_dIsubLD_dVgsi = Mfactor * IsubLD_dVgs ;
5975 here->HSMHV2_dIsubLD_dVbsi = Mfactor * IsubLD_dVbs ;
5976 here->HSMHV2_dIsubLD_dTi = Mfactor * IsubLD_dT ;
5977 here->HSMHV2_dIsubLD_dVddp = Mfactor * IsubLD_dVddp ;
5978
5979 here->HSMHV2_igb = Mfactor * -Igb ;
5980 here->HSMHV2_dIgb_dVdsi = - Mfactor * Igb_dVds ;
5981 here->HSMHV2_dIgb_dVgsi = - Mfactor * Igb_dVgs ;
5982 here->HSMHV2_dIgb_dVbsi = - Mfactor * Igb_dVbs ;
5983 here->HSMHV2_dIgb_dTi = - Mfactor * Igb_dT ;
5984
5985 if (here->HSMHV2_mode == HiSIM_NORMAL_MODE) {
5986 here->HSMHV2_igd = Mfactor * ( model->HSMHV2_glpart1 * Igate - Igd ) ;
5987 } else {
5988 here->HSMHV2_igd = Mfactor * ( (1.0e0 - model->HSMHV2_glpart1 ) * Igate - Igs ) ;
5989 }
5990
5991 if (here->HSMHV2_mode == HiSIM_NORMAL_MODE) {
5992 here->HSMHV2_igs = Mfactor * ( (1.0e0 - model->HSMHV2_glpart1) * Igate - Igs ) ;
5993 } else {
5994 here->HSMHV2_igs = Mfactor * ( model->HSMHV2_glpart1 * Igate - Igd ) ;
5995 }
5996
5997 /* note: here->HSMHV2_igd and here->HSMHV2_igs are already subjected to mode handling,
5998 while the following derivatives here->HSMHV2_dIgd_dVdsi, ... are not! */
5999 here->HSMHV2_dIgd_dVdsi = Mfactor * ( model->HSMHV2_glpart1 * Igate_dVds - Igd_dVds ) ;
6000 here->HSMHV2_dIgd_dVgsi = Mfactor * ( model->HSMHV2_glpart1 * Igate_dVgs - Igd_dVgs ) ;
6001 here->HSMHV2_dIgd_dVbsi = Mfactor * ( model->HSMHV2_glpart1 * Igate_dVbs - Igd_dVbs ) ;
6002 here->HSMHV2_dIgd_dTi = Mfactor * ( model->HSMHV2_glpart1 * Igate_dT - Igd_dT ) ;
6003 here->HSMHV2_dIgs_dVdsi = Mfactor * ( (1.0 - model->HSMHV2_glpart1) * Igate_dVds - Igs_dVds ) ;
6004 here->HSMHV2_dIgs_dVgsi = Mfactor * ( (1.0 - model->HSMHV2_glpart1) * Igate_dVgs - Igs_dVgs ) ;
6005 here->HSMHV2_dIgs_dVbsi = Mfactor * ( (1.0 - model->HSMHV2_glpart1) * Igate_dVbs - Igs_dVbs ) ;
6006 here->HSMHV2_dIgs_dTi = Mfactor * ( (1.0 - model->HSMHV2_glpart1) * Igate_dT - Igs_dT ) ;
6007
6008 here->HSMHV2_igidl = Mfactor * Igidl ;
6009 here->HSMHV2_dIgidl_dVdsi = Mfactor * Igidl_dVds ;
6010 here->HSMHV2_dIgidl_dVgsi = Mfactor * Igidl_dVgs ;
6011 here->HSMHV2_dIgidl_dVbsi = Mfactor * Igidl_dVbs ;
6012 here->HSMHV2_dIgidl_dTi = Mfactor * Igidl_dT ;
6013
6014 here->HSMHV2_igisl = Mfactor * Igisl ;
6015 here->HSMHV2_dIgisl_dVdsi = Mfactor * Igisl_dVds ;
6016 here->HSMHV2_dIgisl_dVgsi = Mfactor * Igisl_dVgs ;
6017 here->HSMHV2_dIgisl_dVbsi = Mfactor * Igisl_dVbs ;
6018 here->HSMHV2_dIgisl_dTi = Mfactor * Igisl_dT ;
6019
6020 /*---------------------------------------------------*
6021 * Von, Vdsat.
6022 *-----------------*/
6023 here->HSMHV2_von = Vth ;
6024 here->HSMHV2_vdsat = Vdsat ;
6025
6026
6027
6028
6029 /*-----------------------------------------------------------*
6030 * Warn floating-point exceptions.
6031 * - Function finite() in libm is called.
6032 * - Go to start with info==5.
6033 *-----------------*/
6034 T1 = here->HSMHV2_ids + here->HSMHV2_dIds_dVdsi + here->HSMHV2_dIds_dVgsi + here->HSMHV2_dIds_dVbsi ;
6035 T1 = T1 + here->HSMHV2_qd - (here->HSMHV2_dQdi_dVdsi + here->HSMHV2_dQdi_dVgsi + here->HSMHV2_dQdi_dVbsi) ;
6036 if ( ! finite (T1) ) {
6037 flg_err = 1 ;
6038 fprintf (stderr ,
6039 "*** warning(HiSIM_HV(%s)): FP-exception (PART-1)\n", model->HSMHV2modName ) ;
6040 if ( flg_info >= 1 ) {
6041 printf ( "*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHV2modName) ;
6042 printf ( "Ids = %e\n" , here->HSMHV2_ids ) ;
6043 printf ( "Gmbs = %e\n" , here->HSMHV2_dIds_dVbsi ) ;
6044 printf ( "Gds = %e\n" , here->HSMHV2_dIds_dVdsi ) ;
6045 printf ( "Gm = %e\n" , here->HSMHV2_dIds_dVgsi ) ;
6046 printf ( "Qd = %e\n" , here->HSMHV2_qd ) ;
6047 printf ( "Cds = %e\n" , -(here->HSMHV2_dQdi_dVdsi
6048 + here->HSMHV2_dQdi_dVgsi
6049 + here->HSMHV2_dQdi_dVbsi) ) ;
6050 }
6051 }
6052
6053 T1 = here->HSMHV2_isub + here->HSMHV2_dIsub_dVbsi + here->HSMHV2_dIsub_dVdsi + here->HSMHV2_dIsub_dVgsi ;
6054 if ( ! finite (T1) ) {
6055 flg_err = 1 ;
6056 fprintf (stderr ,
6057 "*** warning(HiSIM_HV(%s)): FP-exception (PART-2)\n", model->HSMHV2modName) ;
6058 if ( flg_info >= 1 ) {
6059 printf ("*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHV2modName) ;
6060 }
6061 }
6062
6063 T1 = here->HSMHV2_dQg_dVdsi + here->HSMHV2_dQg_dVgsi + here->HSMHV2_dQg_dVbsi ;
6064 if ( ! finite (T1) ) {
6065 flg_err = 1 ;
6066 fprintf(stderr ,
6067 "*** warning(HiSIM_HV(%s)): FP-exception (PART-3)\n", model->HSMHV2modName) ;
6068 if ( flg_info >= 1 ) {
6069 printf ("*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHV2modName) ;
6070 }
6071 }
6072
6073
6074 /*-----------------------------------------------------------*
6075 * Exit for error case.
6076 *-----------------*/
6077 if ( flg_err != 0 ) {
6078 fprintf (stderr , "----- bias information (HiSIM_HV)\n") ;
6079 fprintf (stderr , "name: %s\n" , here->HSMHV2name ) ;
6080 fprintf (stderr , "states: %d\n" , here->HSMHV2states ) ;
6081 fprintf (stderr , "Vdse= %.3e Vgse=%.3e Vbse=%.3e\n"
6082 , Vdse , Vgse , Vbse ) ;
6083 fprintf (stderr , "Vdsi= %.3e Vgsi=%.3e Vbsi=%.3e\n"
6084 , Vds , Vgs , Vbs ) ;
6085 fprintf (stderr , "vbs_jct= %12.5e vbd_jct= %12.5e\n"
6086 , vbs_jct , vbd_jct ) ;
6087 fprintf (stderr , "vd= %.3e vs= %.3e vdp= %.3e vgp= %.3e vbp= %.3e vsp= %.3e\n"
6088 , *( ckt->CKTrhsOld + here->HSMHV2dNode )
6089 , *( ckt->CKTrhsOld + here->HSMHV2sNode )
6090 , *( ckt->CKTrhsOld + here->HSMHV2dNodePrime )
6091 , *( ckt->CKTrhsOld + here->HSMHV2gNodePrime )
6092 , *( ckt->CKTrhsOld + here->HSMHV2bNodePrime )
6093 , *( ckt->CKTrhsOld + here->HSMHV2sNodePrime ) ) ;
6094 fprintf (stderr , "----- bias information (end)\n" ) ;
6095 return ( HiSIM_ERROR ) ;
6096 }
6097
6098
6099 /*-----------------------------------------------------------*
6100 * Noise.
6101 *-----------------*/
6102 here->HSMHV2_noiflick = Mfactor * Nflic ;
6103 here->HSMHV2_noithrml = Mfactor * Nthrml ;
6104
6105 /*----------------------------------------------------------*
6106 * induced gate noise. ( Part 3/3 )
6107 *----------------------*/
6108 if ( model->HSMHV2_coign != 0 && model->HSMHV2_cothrml != 0 && flg_ign == 1 && !flg_noqi && model->HSMHV2_codep==0 ) {
6109 T0 = Cox_small * Cox * here->HSMHV2_weff_nf * Leff ;
6110 T1 = -( here->HSMHV2_dQg_dVdsi + here->HSMHV2_dQg_dVgsi + here->HSMHV2_dQg_dVbsi ) / Mfactor ; /* NQS case is not supported. */
6111 if( - T1 > T0 ){
6112 Nign0 = c_16o135 * C_QE * beta_inv * T1 * T1 / gds0_ign ;
6113 if ( kusai00L > epsm10 && Vds > epsm10 ) {
6114 MuModA = Muun / Mu ;
6115 MuModB = ( Muun / Mud_hoso - MuModA ) / Vds ;
6116 correct_w1 = MuModA + C_2o3 * MuModB
6117 * ( kusai00 + VgVt * sqrtkusaiL + kusaiL )
6118 / ( VgVt + sqrtkusaiL ) ;
6119 } else {
6120 correct_w1 = Muun / Mud_hoso ;
6121 }
6122 here->HSMHV2_noiigate = Mfactor * Nign0 * kusai_ig * correct_w1 ;
6123 here->HSMHV2_noicross = crl_f ;
6124 if ( here->HSMHV2_noiigate < 0.0 ) here->HSMHV2_noiigate = 0.0e0 ;
6125 }else{
6126 here->HSMHV2_noiigate = 0.0e0 ;
6127 here->HSMHV2_noicross = 0.0e0 ;
6128 }
6129 }else{
6130 here->HSMHV2_noiigate = 0.0e0 ;
6131 here->HSMHV2_noicross = 0.0e0 ;
6132 }
6133
6134 /*-----------------------------------------------------------*
6135 * Store values for next calculation.
6136 *-----------------*/
6137
6138 /* Internal biases */
6139 if ( here->HSMHV2_called >= 1 ) {
6140 here->HSMHV2_vbsc_prv2 = here->HSMHV2_vbsc_prv ;
6141 here->HSMHV2_vdsc_prv2 = here->HSMHV2_vdsc_prv ;
6142 here->HSMHV2_vgsc_prv2 = here->HSMHV2_vgsc_prv ;
6143 here->HSMHV2_mode_prv2 = here->HSMHV2_mode_prv ;
6144 }
6145 here->HSMHV2_vbsc_prv = Vbs ;
6146 here->HSMHV2_vdsc_prv = Vds ;
6147 here->HSMHV2_vgsc_prv = Vgs ;
6148 here->HSMHV2_mode_prv = here->HSMHV2_mode ;
6149 here->HSMHV2_temp_prv = TTEMP ;
6150
6151 /* Surface potentials and derivatives w.r.t. internal biases */
6152 if ( here->HSMHV2_called >= 1 ) {
6153 here->HSMHV2_ps0_prv2 = here->HSMHV2_ps0_prv ;
6154 here->HSMHV2_ps0_dvbs_prv2 = here->HSMHV2_ps0_dvbs_prv ;
6155 here->HSMHV2_ps0_dvds_prv2 = here->HSMHV2_ps0_dvds_prv ;
6156 here->HSMHV2_ps0_dvgs_prv2 = here->HSMHV2_ps0_dvgs_prv ;
6157 here->HSMHV2_pds_prv2 = here->HSMHV2_pds_prv ;
6158 here->HSMHV2_pds_dvbs_prv2 = here->HSMHV2_pds_dvbs_prv ;
6159 here->HSMHV2_pds_dvds_prv2 = here->HSMHV2_pds_dvds_prv ;
6160 here->HSMHV2_pds_dvgs_prv2 = here->HSMHV2_pds_dvgs_prv ;
6161 }
6162
6163 here->HSMHV2_ps0_prv = Ps0 ;
6164 here->HSMHV2_ps0_dvbs_prv = Ps0_dVbs ;
6165 here->HSMHV2_ps0_dvds_prv = Ps0_dVds ;
6166 here->HSMHV2_ps0_dvgs_prv = Ps0_dVgs ;
6167 here->HSMHV2_ps0_dtemp_prv = Ps0_dT ;
6168 here->HSMHV2_pds_prv = Pds ;
6169 here->HSMHV2_pds_dvbs_prv = Pds_dVbs ;
6170 here->HSMHV2_pds_dvds_prv = Pds_dVds ;
6171 here->HSMHV2_pds_dvgs_prv = Pds_dVgs ;
6172 here->HSMHV2_pds_dtemp_prv = Pds_dT ;
6173
6174
6175 /* derivatives of channel current w.r.t. external bias (only due to Ra-dependencies!) */
6176 here->HSMHV2_dIds_dVdse = Ids_dRa * Ra_dVdse * Mfactor ;
6177 here->HSMHV2_dIds_dVgse = Ids_dRa * Ra_dVgse * Mfactor ;
6178 here->HSMHV2_dIds_dVbse = Ids_dRa * Ra_dVbse * Mfactor ;
6179
6180 if ( VdseModeNML > 0.0 ) {
6181 here->HSMHV2_Rd = Rd / Mfactor ;
6182 here->HSMHV2_dRd_dVdse = Rd_dVdse / Mfactor ;
6183 here->HSMHV2_dRd_dVgse = Rd_dVgse / Mfactor ;
6184 here->HSMHV2_dRd_dVbse = Rd_dVbse / Mfactor ;
6185 here->HSMHV2_dRd_dVsubs = Rd_dVsubs / Mfactor ;
6186 here->HSMHV2_dRd_dTi = Rd_dT / Mfactor ;
6187 here->HSMHV2_Rs = Rs / Mfactor ;
6188 here->HSMHV2_dRs_dVdse = Rs_dVdse / Mfactor ;
6189 here->HSMHV2_dRs_dVgse = Rs_dVgse / Mfactor ;
6190 here->HSMHV2_dRs_dVbse = Rs_dVbse / Mfactor ;
6191 here->HSMHV2_dRs_dVsubs = Rs_dVsubs / Mfactor ;
6192 here->HSMHV2_dRs_dTi = Rs_dT / Mfactor ;
6193 } else {
6194 here->HSMHV2_Rd = Rs / Mfactor ;
6195 here->HSMHV2_dRd_dVdse = - ( Rs_dVdse + Rs_dVgse + Rs_dVbse + Rs_dVsubs ) / Mfactor ;
6196 here->HSMHV2_dRd_dVgse = Rs_dVgse / Mfactor ;
6197 here->HSMHV2_dRd_dVbse = Rs_dVbse / Mfactor ;
6198 here->HSMHV2_dRd_dVsubs = Rs_dVsubs / Mfactor ;
6199 here->HSMHV2_dRd_dTi = Rs_dT / Mfactor ;
6200 here->HSMHV2_Rs = Rd / Mfactor ;
6201 here->HSMHV2_dRs_dVdse = - ( Rd_dVdse + Rd_dVgse + Rd_dVbse + Rd_dVsubs ) / Mfactor ;
6202 here->HSMHV2_dRs_dVgse = Rd_dVgse / Mfactor ;
6203 here->HSMHV2_dRs_dVbse = Rd_dVbse / Mfactor ;
6204 here->HSMHV2_dRs_dVsubs = Rd_dVsubs / Mfactor ;
6205 here->HSMHV2_dRs_dTi = Rd_dT / Mfactor ;
6206 }
6207 /* Clamping to Res_min */
6208 if(here->HSMHV2_Rd < Res_min) {
6209 here->HSMHV2_Rd = Res_min ;
6210 here->HSMHV2_dRd_dVdse = 0.0 ;
6211 here->HSMHV2_dRd_dVgse = 0.0 ;
6212 here->HSMHV2_dRd_dVbse = 0.0 ;
6213 here->HSMHV2_dRd_dVsubs = 0.0 ;
6214 here->HSMHV2_dRd_dTi = 0.0 ;
6215 }
6216 if(here->HSMHV2_Rs < Res_min) {
6217 here->HSMHV2_Rs = Res_min ;
6218 here->HSMHV2_dRs_dVdse = 0.0 ;
6219 here->HSMHV2_dRs_dVgse = 0.0 ;
6220 here->HSMHV2_dRs_dVbse = 0.0 ;
6221 here->HSMHV2_dRs_dVsubs = 0.0 ;
6222 here->HSMHV2_dRs_dTi = 0.0 ;
6223 }
6224
6225 /*-----------------------------------------------------------*
6226 * End of PART-7. (label)
6227 *-----------------*/
6228 /* end_of_part_7: */
6229
6230 /*-----------------------------------------------------------*
6231 * Bottom of hsmhveval.
6232 *-----------------*/
6233
6234 return ( HiSIM_OK ) ;
6235
6236 } /* end of hsmhveval */
6237