1 /***********************************************************************
2
3 HiSIM (Hiroshima University STARC IGFET Model)
4 Copyright (C) 2014 Hiroshima University & STARC
5
6 MODEL NAME : HiSIM
7 ( VERSION : 2 SUBVERSION : 8 REVISION : 0 )
8
9 FILE : hsm2eval.c
10
11 Date : 2014.6.5
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 "HiSIM2 Distribution Statement and
25 Copyright Notice" attached to HiSIM2 model.
26
27 -----HiSIM2 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 disclaim 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
55 *************************************************************************/
56
57 /*********************************************************************
58 * Memorandum on programming
59 *
60 * (1) Bias (x: b|d|g)
61 * . vxs : Input argument.
62 * . Vxse: External bias taking account device type (pMOS->nMOS).
63 * . Vxsc: Confined bias within a specified region.
64 * . Vxs : Internal bias.
65 * . Y_dVxs denotes the partial derivative of Y w.r.t. Vxs.
66 *
67 * (2) Device Mode
68 * . Normal mode (Vds>0 for nMOS) is assumed.
69 * . In case of reverse mode, parent routines have to properly
70 * transform or interchange inputs and outputs except ones
71 * related to junction diodes, which are regarded as being
72 * fixed to the nodal S/D.
73 *
74 * (3) Modification for symmetry at Vds=0
75 * . Vxsz: Modified bias. (x: b|d|g)
76 * . Ps0z: Modified Ps0.
77 * . The following variables are calculated as a function of
78 * modified biases or potential.
79 * Tox, Cox, (-- with quantum effect)
80 * Vth*, dVth*, dPpg, Igate, Igidl, Igisl.
81 * . The following variables are calculated using a transform
82 * function.
83 * Lred
84 *
85 * (4) Zones and Cases (terminology)
86 *
87 * Chi:=beta*(Ps0-Vbs)= 0 3 5
88 *
89 * Zone: A | D1 | D2 | D3
90 * |
91 * (accumulation)|(depletion)
92 * |
93 * Vgs = Vgs_fb Vth
94 * / /
95 * Case: Nonconductive / Conductive
96 * /
97 * VgVt:=Qn0/Cox= VgVt_small
98 *
99 * . Ids is regarded as zero in zone-A.
100 * . Procedure to calculate Psl and dependent variables is
101 * omitted in the nonconductive case. Ids and Qi are regarded
102 * as zero in this case.
103 *
104 *********************************************************************/
105
106 /*===========================================================*
107 * Preamble.
108 *=================*/
109 /*---------------------------------------------------*
110 * Header files.
111 *-----------------*/
112 #include "ngspice/ngspice.h"
113 #ifdef __STDC__
114 /* #include <ieeefp.h> */
115 #endif
116 #include "ngspice/cktdefs.h"
117
118 /*-----------------------------------*
119 * HiSIM macros
120 *-----------------*/
121 #include "hisim2.h"
122 #include "hsm2evalenv.h"
123
124 /*-----------------------------------*
125 * HiSIM constants
126 *-----------------*/
127 #define C_sce_dlt (1.0e-2)
128 #define C_gidl_delta 0.5
129 #define C_PSLK_DELTA 1e-3 /* delta for Pslk smoothing */
130 #define C_PSLK_SHIFT 1.0 /* constant value for temporary shift */
131 #define C_IDD_MIN 1.0e-15
132
133 /*===========================================================*
134 * pow
135 *=================*/
136 #ifdef POW_TO_EXP_AND_LOG
137 #define Fn_Pow( x , y ) ( (x==0.0) ? 0.0 : exp( (y) * log( x ) ) )
138 #else
139 #define Fn_Pow( x , y ) ( (x==0.0) ? 0.0 : pow( x , y ) )
140 #endif
141
142 /*===========================================================*
143 * Exp() for PGD.
144 * - ExpLim(-3)=0
145 *=================*/
146
147 #define Fn_ExpLim( y , x , dx ) { \
148 if ( (x) < -3.0 ) { \
149 dx = 0.0 ; \
150 y = 0.0 ; \
151 } else if ( (x) < 0.0 ) { \
152 dx = 1.0 + (x) * ( 2 * (1.0/3.0) + (x) * 3 * (1.0/27.0) ) ; \
153 y = 1.0 + (x) * ( 1.0 + (x) * ( (1.0/3.0) + (x) * (1.0/27.0) ) ) ; \
154 } else { \
155 dx = 1.0 + (x) * ( 2 * (1.0/3.0) + (x) * ( 3 * 0.0402052934513951 \
156 + (x) * 4 * 0.148148111111111 ) ) ; \
157 y = 1.0 + (x) * ( 1.0 + (x) * ( (1.0/3.0) + (x) * ( 0.0402052934513951 \
158 + (x) * 0.148148111111111 ) ) ) ; \
159 } \
160 }
161
162 /*===========================================================*
163 * Ceiling, smoothing functions.
164 *=================*/
165 /*---------------------------------------------------*
166 * smoothUpper: ceiling.
167 * y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) )
168 * arg = xmax - x - delta
169 *-----------------*/
170
171 #define Fn_SU( y , x , xmax , delta , dx ) { \
172 double TMF1, TMF2; \
173 TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
174 TMF2 = 4.0 * ( xmax ) * ( delta) ; \
175 TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
176 TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
177 dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
178 y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
179 }
180
181 #define Fn_SU2( y , x , xmax , delta , dy_dx , dy_dxmax ) { \
182 double TMF1, TMF2; \
183 TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
184 TMF2 = 4.0 * ( xmax ) * ( delta) ; \
185 TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
186 TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
187 dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
188 dy_dxmax = 0.5 * ( 1.0 - ( TMF1 + 2.0 * delta ) / TMF2 ) ; \
189 y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
190 }
191
192 /*---------------------------------------------------*
193 * smoothLower: flooring.
194 * y = xmin + 0.5 ( arg + sqrt( arg^2 + 4 xmin delta ) )
195 * arg = x - xmin - delta
196 *-----------------*/
197
198 #define Fn_SL( y , x , xmin , delta , dx ) { \
199 double TMF1, TMF2; \
200 TMF1 = ( x ) - ( xmin ) - ( delta ) ; \
201 TMF2 = 4.0 * ( xmin ) * ( delta ) ; \
202 TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
203 TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
204 dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
205 y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \
206 }
207
208 /*---------------------------------------------------*
209 * smoothZero: flooring to zero.
210 * y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) )
211 *-----------------*/
212
213 #define Fn_SZ( y , x , delta , dx ) { \
214 double TMF2; \
215 TMF2 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta) ) ; \
216 dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \
217 y = 0.5 * ( ( x ) + TMF2 ) ; \
218 if( y < 0.0 ) { y=0.0; dx=0.0; } \
219 }
220 #if 0
221 /*---------------------------------------------------*
222 * smoothZero: flooring to zero.
223 * y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) )
224 *-----------------*/
225 static double smoothZero
226 (
227 double x,
228 double delta,
229 double *dx
230 )
231 {
232 double sqr = sqrt ( x * x + 4.0 * delta * delta) ;
233 if (dx) *dx = 0.5 * ( 1.0 + x / sqr ) ;
234 return 0.5 * ( x + sqr ) ;
235 }
236 /*---------------------------------------------------*
237 * CeilingPow: ceiling for positive x, flooring for negative x.
238 * y = x * xmax / ( x^{2m} + xmax^{2m} )^{1/(2m)}
239 * note:
240 * - xmax has to be positive.
241 * - -xmax < y < xmax.
242 * - dy/dx|_{x=0} = 1.
243 *-----------------*/
244 static double CeilingPow
245 (
246 double x,
247 double xmax,
248 int pw,
249 double *dx
250 )
251 {
252 double x2 = x * x ;
253 double xmax2 = xmax * xmax ;
254 double xp = 1.0 , xmp = 1.0 ;
255 int m , mm ;
256 double arg , dnm ;
257 double result ;
258
259 for ( m = 0 ; m < pw ; m ++ ) {
260 xp *= x2 ;
261 xmp *= xmax2 ;
262 }
263 arg = xp + xmp ;
264 dnm = arg ;
265 if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) {
266 if ( pw == 1 ) {
267 mm = 1 ;
268 } else if ( pw == 2 ) {
269 mm = 2 ;
270 } else if ( pw == 4 ) {
271 mm = 3 ;
272 } else if ( pw == 8 ) {
273 mm = 4 ;
274 }
275 for ( m = 0 ; m < mm ; m ++ ) {
276 dnm = sqrt( dnm ) ;
277 }
278 } else {
279 dnm = pow( dnm , 1.0 / ( 2.0 * pw ) ) ;
280 }
281 dnm = 1.0 / dnm ;
282 result = x * xmax * dnm ;
283 (*dx) = xmax * xmp * dnm / arg ;
284 return result ;
285 }
286 #endif
287 /*---------------------------------------------------*
288 * CeilingPow: ceiling for positive x, flooring for negative x.
289 * y = x * xmax / ( x^{2m} + xmax^{2m} )^{1/(2m)}
290 * note:
291 * - xmax has to be positive.
292 * - -xmax < y < xmax.
293 * - dy/dx|_{x=0} = 1.
294 *-----------------*/
295
296 #define Fn_CP( y , x , xmax , pw , dx ) { \
297 double x2 = (x) * (x) ; \
298 double xmax2 = (xmax) * (xmax) ; \
299 double xp = 1.0 , xmp = 1.0 ; \
300 int m , mm ; \
301 double arg_cp , dnm ; \
302 for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \
303 arg_cp = xp + xmp ; \
304 dnm = arg_cp ; \
305 if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \
306 if ( pw == 1 ) { mm = 1 ; \
307 } else if ( pw == 2 ) { mm = 2 ; \
308 } else if ( pw == 4 ) { mm = 3 ; \
309 } else if ( pw == 8 ) { mm = 4 ; } \
310 for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \
311 } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \
312 dnm = 1.0 / dnm ; \
313 y = (x) * (xmax) * dnm ; \
314 dx = (xmax) * xmp * dnm / arg_cp ; \
315 }
316
317 #define Fn_SU_CP2( y , x , xmax , delta , pw , dx , dxmax ) { \
318 if(x > xmax - delta && delta >= 0.0) { \
319 double TMF0, TMF1; \
320 TMF1 = x - xmax + delta ; \
321 Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \
322 y = xmax - delta + TMF0 ; \
323 dx = dx ; \
324 dxmax = 1.0-dx ; \
325 } else { \
326 y = x ; \
327 dx = 1.0 ; \
328 dxmax = 0.0 ; \
329 } \
330 }
331
332 #define Fn_CP2( y , x , xmax , pw , dx , dxmax ) { \
333 double x2 = (x) * (x) ; \
334 double xmax2 = (xmax) * (xmax) ; \
335 double xp = 1.0 , xmp = 1.0 ; \
336 int m =0, mm =0; \
337 double arg_cp2 =0.0, dnm =0.0; \
338 for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \
339 arg_cp2 = xp + xmp ; \
340 dnm = arg_cp2 ; \
341 if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \
342 if ( pw == 1 ) { mm = 1 ; \
343 } else if ( pw == 2 ) { mm = 2 ; \
344 } else if ( pw == 4 ) { mm = 3 ; \
345 } else if ( pw == 8 ) { mm = 4 ; } \
346 for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \
347 } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \
348 dnm = 1.0 / dnm ; \
349 y = (x) * (xmax) * dnm ; \
350 dx = (xmax) * xmp * dnm / arg_cp2 ; \
351 dxmax = (x) * xp * dnm / arg_cp2 ; \
352 }
353
354 #define Fn_SU_CP3( y , x , xmax , delta , pw , dx , dxmax , ddelta ) { \
355 if(x > xmax - delta && delta >= 0.0) { \
356 double TMF0, TMF1; \
357 TMF1 = x - xmax + delta ; \
358 Fn_CP2( TMF0 , TMF1 , delta , pw , dx , ddelta ) \
359 y = xmax - delta + TMF0 ; \
360 dx = dx ; \
361 dxmax = 1.0-dx ; \
362 ddelta = -1.0+dx+ddelta; \
363 } else { \
364 y = x ; \
365 dx = 1.0 ; \
366 dxmax = 0.0 ; \
367 ddelta = 0.0 ; \
368 } \
369 }
370
371 #define Fn_SU_CP( y , x , xmax , delta , pw , dx ) { \
372 if(x > xmax - delta && delta >= 0.0) { \
373 double TMF0, TMF1; \
374 TMF1 = x - xmax + delta ; \
375 Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \
376 y = xmax - delta + TMF0 ; \
377 dx = dx ; \
378 } else { \
379 y = x ; \
380 dx = 1.0 ; \
381 } \
382 }
383
384 #define Fn_SL_CP2( y , x , xmin , delta , pw , dx , dxmin) { \
385 if(x < xmin + delta && delta >= 0.0) { \
386 double TMF0, TMF1; \
387 TMF1 = xmin + delta - x ; \
388 Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \
389 y = xmin + delta - TMF0 ; \
390 dx = dx ; \
391 dxmin = 1.0-dx ; \
392 } else { \
393 y = x ; \
394 dx = 1.0 ; \
395 dxmin = 0.0 ; \
396 } \
397 }
398 #define Fn_SL_CP( y , x , xmin , delta , pw , dx ) { \
399 if(x < xmin + delta && delta >= 0.0) { \
400 double TMF0, TMF1; \
401 TMF1 = xmin + delta - x ; \
402 Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \
403 y = xmin + delta - TMF0 ; \
404 dx = dx ; \
405 } else { \
406 y = x ; \
407 dx = 1.0 ; \
408 } \
409 }
410
411
412
413 /*===========================================================*
414 * Functions for symmetry.
415 *=================*/
416
417 /*---------------------------------------------------*
418 * Declining function using a polynomial.
419 *-----------------*/
420
421 #define Fn_DclPoly4( y , x , dx ) { \
422 double TMF2, TMF3, TMF4; \
423 TMF2 = (x) * (x) ; \
424 TMF3 = TMF2 * (x) ; \
425 TMF4 = TMF2 * TMF2 ; \
426 y = 1.0 / ( 1.0 + (x) + TMF2 + TMF3 + TMF4 ) ; \
427 dx = - ( 1.0 + 2.0 * (x) + 3.0 * TMF2 + 4.0 * TMF3 ) * y * y ; \
428 }
429
430 /*---------------------------------------------------*
431 * "smoothUpper" uasing a polynomial
432 *-----------------*/
433
434 #define Fn_SUPoly4( y , x , xmax , dx ) { \
435 double TMF1; \
436 TMF1 = (x) / xmax ; \
437 Fn_DclPoly4( y , TMF1 , dx ) ; \
438 y = xmax * ( 1.0 - y ) ; \
439 dx = - dx ; \
440 }
441
442 #define Fn_SUPoly4m( y , x , xmax , dx , dxmax ) { \
443 double TMF0, TMF1; \
444 TMF1 = (x) / xmax ; \
445 Fn_DclPoly4( TMF0 , TMF1 , dx ) ; \
446 y = xmax * ( 1.0 - TMF0 ) ; \
447 dxmax = 1.0 - TMF0 + TMF1 * dx ; \
448 dx = - dx ; \
449 }
450
451
452 /*---------------------------------------------------*
453 * SymAdd: evaluate additional term for symmetry.
454 *-----------------*/
455
456 #define Fn_SymAdd( y , x , add0 , dx ) \
457 { \
458 double TMF1, TMF2, TMF3; \
459 TMF1 = 2.0 * ( x ) / ( add0 ) ; \
460 TMF2 = 1.0 + TMF1 * ( (1.0/2) + TMF1 * ( (1.0/6) \
461 + TMF1 * ( (1.0/24) + TMF1 * ( (1.0/120) \
462 + TMF1 * ( (1.0/720) + TMF1 * (1.0/5040) ) ) ) ) ) ; \
463 TMF3 = (1.0/2) + TMF1 * ( (1.0/3) \
464 + TMF1 * ( (1.0/8) + TMF1 * ( (1.0/30) \
465 + TMF1 * ( (1.0/144) + TMF1 * (1.0/840) ) ) ) ) ; \
466 y = add0 / TMF2 ; \
467 dx = - 2.0 * TMF3 / ( TMF2 * TMF2 ) ; \
468 }
469
470 /*===========================================================*
471 * Function hsm2evaluate.
472 *=================*/
HSM2evaluate(double vds,double vgs,double vbs,double vbs_jct,double vbd_jct,HSM2instance * here,HSM2model * model,CKTcircuit * ckt)473 int HSM2evaluate
474 (
475 double vds,
476 double vgs,
477 double vbs,
478 double vbs_jct,
479 double vbd_jct,
480 HSM2instance *here,
481 HSM2model *model,
482 CKTcircuit *ckt
483 )
484 {
485 HSM2binningParam *pParam = &here->pParam ;
486 HSM2modelMKSParam *modelMKS = &model->modelMKS ;
487 /*-----------------------------------*
488 * Constants for Smoothing functions
489 *---------------*/
490 const double vth_dlt = 1.0e-3 ;
491 /* const double cclmmdf = 1.0e-2 ;*/
492 const double cclmmdf = 1.0e-1 ;
493 const double qme_dlt = 1.0e-4 ;
494 const double eef_dlt = 1.0e-2 * C_m2cm ;
495 const double sti2_dlt = 2.0e-3 ;
496 const double pol_dlt = 5.0e-2 ;
497 //const double psia_dlt = 1.0e-3 ;
498 //const double psia2_dlt = 5.0e-3 ;
499 const double psisti_dlt = 5.0e-3 ;
500 //const double jct_dlt = 1.0e-2 ;
501
502 /*---------------------------------------------------*
503 * Local variables.
504 *-----------------*/
505 /* Constants ----------------------- */
506 const int lp_s0_max = 20 ;
507 const int lp_sl_max = 20 ;
508 const int lp_se_max = 150 ;
509
510 int lp_bs_max = 10 ;
511 const double Ids_tol = 1.0e-10 ;
512 const double Ids_maxvar = 1.0e-1 ;
513 const double dP_max = 0.1e0 ;
514 const double ps_conv = 5.0e-13 ;
515 const double ps_conv2 = 1.0e-10 ;
516
517 /* double ps_conv = 1.0e-13 ;*/
518 const double gs_conv = 1.0e-8 ;
519 const double mini_current = 1.0e-15 ;
520 /** depletion **/
521 const double znbd3 = 3.0e0 ;
522 const double znbd5 = 5.0e0 ;
523 const double cn_nc3 = C_SQRT_2 / 108e0 ;
524 /* 5-degree, contact:Chi=5 */
525 const double cn_nc51 = 0.707106781186548 ; /* sqrt(2)/2 */
526 const double cn_nc52 = -0.117851130197758 ; /* -sqrt(2)/12 */
527 const double cn_nc53 = 0.0178800506338833 ; /* (187 - 112*sqrt(2))/1600 */
528 const double cn_nc54 = -0.00163730162779191 ; /* (-131 + 88*sqrt(2))/4000 */
529 const double cn_nc55 = 6.36964918866352e-5 ; /* (1509-1040*sqrt(2))/600000 */
530 /** inversion **/
531 /* 3-degree polynomial approx for ( exp[Chi]-1 )^{1/2} */
532 const double cn_im53 = 2.9693154855770998e-1 ;
533 const double cn_im54 = -7.0536542840097616e-2 ;
534 const double cn_im55 = 6.1152888951331797e-3 ;
535 /** initial guess **/
536 const double c_ps0ini_2 = 8.0e-4 ;
537 const double c_pslini_1 = 0.3e0 ;
538 const double c_pslini_2 = 3.0e-2 ;
539
540 const double VgVt_small = 1.0e-12 ;
541 const double Vbs_min = -10.5e0 ;
542 const double epsm10 = 10.0e0 * C_EPS_M ;
543 const double small = 1.0e-50 ;
544 const double small2 = 1.0e-12 ; /* for Qover */
545
546 double Vbs_max = 0.8e0 ;
547 double Vbs_bnd = 0.4e0 ; /* start point of positive Vbs bending */
548 double Gdsmin = 0.0 ;
549 double Gjmin = ckt->CKTgmin ;
550
551 /* Internal flags --------------------*/
552 int flg_err = 0 ; /* error level */
553 int flg_rsrd = 0 ; /* Flag for bias loop accounting Rs and Rd */
554 int flg_iprv = 0 ; /* Flag for initial guess of Ids */
555 int flg_pprv = 0 ; /* Flag for initial guesses of Ps0 and Pds */
556 int flg_noqi =0; /* Flag for the cases regarding Qi=Qd=0 */
557 int flg_vbsc = 0 ; /* Flag for Vbs confining */
558 int flg_info = 0 ;
559 int flg_conv = 0 ; /* Flag for Poisson loop convergence */
560 int flg_qme = 0 ; /* Flag for QME */
561
562 /* flag for NQS calculation */
563 int flg_nqs=0 ;
564
565 /* Important Variables in HiSIM -------*/
566 /* external bias */
567 double Vbse =0.0, Vdse =0.0, Vgse =0.0 ;
568 /* confine bias */
569 double Vbsc =0.0, Vdsc =0.0, Vgsc =0.0 ;
570 double Vbsc_dVbse =1.0, Vbsc_dVbse_dVbs =0.0 ;
571 /* internal bias */
572 double Vbs =0.0, Vds =0.0, Vgs =0.0, Vdb =0.0, Vsb =0.0 ;
573 double Vbs_dVbse = 1.0 , Vbs_dVdse = 0.0 , Vbs_dVgse = 0.0 ;
574 double Vds_dVbse = 0.0 , Vds_dVdse = 1.0 , Vds_dVgse = 0.0 ;
575 double Vgs_dVbse = 0.0 , Vgs_dVdse = 0.0 , Vgs_dVgse = 1.0 ;
576 double Vgp =0.0 ;
577 double Vgp_dVbs =0.0, Vgp_dVds =0.0, Vgp_dVgs =0.0 ;
578 double Vgs_fb =0.0 ;
579 /* Ps0 : surface potential at the source side */
580 double Ps0 =0.0 ;
581 double Ps0_dVbs =0.0, Ps0_dVds =0.0, Ps0_dVgs =0.0 ;
582 double Ps0_ini =0.0, Ps0_iniA =0.0, Ps0_iniB =0.0 ;
583 /* Psl : surface potential at the drain side */
584 double Psl =0.0 ;
585 double Psl_dVbs =0.0, Psl_dVds =0.0, Psl_dVgs =0.0 ;
586 double Psl_lim =0.0, dPlim =0.0 ;
587 /* Pds := Psl - Ps0 */
588 double Pds = 0.0 , Pdsz = 0.0 ;
589 double Pds_dVbs = 0.0, Pds_dVds = 0.0 , Pds_dVgs = 0.0 ;
590 double Pdsz_dVbs = 0.0, Pdsz_dVds = 0.0 , Pdsz_dVgs = 0.0 ;
591 double Pds_ini =0.0 ;
592 double Pds_max =0.0 ;
593 /* iteration numbers of Ps0 and Psl equations. */
594 int lp_s0 = 0 , lp_sl = 0 ;
595 /* Xi0 := beta * ( Ps0 - Vbs ) - 1. */
596 double Xi0 =0.0 ;
597 double Xi0_dVbs =0.0, Xi0_dVds =0.0, Xi0_dVgs =0.0 ;
598 double Xi0p12 =0.0 ;
599 double Xi0p12_dVbs =0.0, Xi0p12_dVds =0.0, Xi0p12_dVgs =0.0 ;
600 double Xi0p32 =0.0 ;
601 /* Xil := beta * ( Psl - Vbs ) - 1. */
602 double Xilp12 =0.0 ;
603 double Xilp32 =0.0 ;
604 double Xil =0.0 ;
605 /* modified bias and potential for sym.*/
606 double Vbsz =0.0, Vdsz =0.0, Vgsz =0.0 ;
607 double Vbsz_dVbs =0.0, Vbsz_dVds =0.0 ;
608 double Vdsz_dVds =0.0, Vdsz_dVbs =0.0 ;
609 double Vgsz_dVgs =0.0, Vgsz_dVbs =0.0, Vgsz_dVds =0.0 ;
610 double Vzadd =0.0, Vzadd_dVds =0.0, Vzadd_dVbs =0.0 ;
611 double Ps0z =0.0, Ps0z_dVbs =0.0, Ps0z_dVds =0.0, Ps0z_dVgs =0.0 ;
612 double Pzadd =0.0, Pzadd_dVbs =0.0, Pzadd_dVds =0.0, Pzadd_dVgs =0.0 ;
613 double Vgpz = 0.0 , Vgpz_dVbs = 0.0 , Vgpz_dVds = 0.0 , Vgpz_dVgs = 0.0 ; /* (tmp) */
614
615 /* IBPC */
616 double dVbsIBPC =0.0, dVbsIBPC_dVbs =0.0, dVbsIBPC_dVds =0.0, dVbsIBPC_dVgs =0.0 ;
617 double betaWL =0.0, betaWL_dVbs =0.0, betaWL_dVds =0.0, betaWL_dVgs =0.0 ;
618 double Xi0p32_dVbs =0.0, Xi0p32_dVds =0.0, Xi0p32_dVgs =0.0 ;
619 double Xil_dVbs =0.0, Xil_dVds =0.0, Xil_dVgs =0.0 ;
620 double Xilp12_dVbs =0.0, Xilp12_dVds =0.0, Xilp12_dVgs =0.0 ;
621 double Xilp32_dVbs =0.0, Xilp32_dVds =0.0, Xilp32_dVgs =0.0 ;
622 double dG3 =0.0, dG3_dVbs =0.0, dG3_dVds =0.0, dG3_dVgs =0.0 ;
623 double dG4 =0.0, dG4_dVbs =0.0, dG4_dVds =0.0, dG4_dVgs =0.0 ;
624 double dIdd =0.0, dIdd_dVbs =0.0, dIdd_dVds =0.0, dIdd_dVgs =0.0 ;
625
626 /* Chi := beta * ( Ps{0/l} - Vbs ) */
627 double Chi =0.0 ;
628 double Chi_dVbs =0.0, Chi_dVds =0.0, Chi_dVgs =0.0 ;
629 /* Rho := beta * ( Psl - Vds ) */
630 double Rho =0.0 ;
631 /* threshold voltage */
632 double Vth =0.0 ;
633 double Vth0 =0.0 ;
634 double Vth0_dVb =0.0, Vth0_dVd =0.0, Vth0_dVg =0.0 ;
635 /* variation of threshold voltage */
636 double dVth =0.0 ;
637 double dVth_dVb =0.0, dVth_dVd =0.0, dVth_dVg =0.0 ;
638 double dVth0 =0.0 ;
639 double dVth0_dVb =0.0, dVth0_dVd =0.0, dVth0_dVg =0.0 ;
640 double dVthSC =0.0 ;
641 double dVthSC_dVb =0.0, dVthSC_dVd =0.0, dVthSC_dVg =0.0 ;
642 double Pb20b =0.0 ;
643 double Pb20b_dVg =0.0, Pb20b_dVb =0.0, Pb20b_dVd =0.0 ;
644 double dVthW =0.0 ;
645 double dVthW_dVb =0.0, dVthW_dVd =0.0, dVthW_dVg =0.0 ;
646 /* Alpha and related parameters */
647 double Alpha =0.0 ;
648 double Alpha_dVbs =0.0, Alpha_dVds =0.0, Alpha_dVgs =0.0 ;
649 double Achi =0.0 ;
650 double Achi_dVbs =0.0, Achi_dVds =0.0, Achi_dVgs =0.0 ;
651 double VgVt = 0.0 ;
652 double VgVt_dVbs = 0.0, VgVt_dVds = 0.0, VgVt_dVgs = 0.0 ;
653 double Pslsat = 0.0 ;
654 double Vdsat = 0.0 ;
655 double VdsatS = 0.0 ;
656 double VdsatS_dVbs = 0.0, VdsatS_dVds = 0.0, VdsatS_dVgs = 0.0 ;
657 double Delta =0.0 ;
658 /* Q_B and capacitances */
659 double Qb =0.0, Qb_dVbs =0.0, Qb_dVds =0.0, Qb_dVgs =0.0 ;
660 double Qb_dVbse =0.0, Qb_dVdse =0.0, Qb_dVgse =0.0 ;
661 double Qbu = 0.0 , Qbu_dVbs = 0.0 , Qbu_dVds = 0.0 , Qbu_dVgs = 0.0 ;
662 /* Q_I and capacitances */
663 double Qi =0.0, Qi_dVbs =0.0, Qi_dVds =0.0, Qi_dVgs =0.0 ;
664 double Qi_dVbse =0.0, Qi_dVdse =0.0, Qi_dVgse =0.0 ;
665 double Qiu = 0.0 , Qiu_dVbs = 0.0 , Qiu_dVds = 0.0 , Qiu_dVgs = 0.0 ;
666 /* Q_D and capacitances */
667 double Qd =0.0, Qd_dVbs =0.0, Qd_dVds =0.0, Qd_dVgs =0.0 ;
668 double Qd_dVbse =0.0, Qd_dVdse =0.0, Qd_dVgse =0.0 ;
669 double qd_dVgse=0.0, qd_dVdse=0.0, qd_dVbse=0.0, qd_dVsse =0.0 ;
670 /* channel current */
671 double Ids =0.0 ;
672 double Ids_dVbs =0.0, Ids_dVds =0.0, Ids_dVgs =0.0 ;
673 double Ids_dVbse =0.0, Ids_dVdse =0.0, Ids_dVgse =0.0 ;
674 double Ids0 =0.0 ;
675 double Ids0_dVbs =0.0, Ids0_dVds =0.0, Ids0_dVgs =0.0 ;
676 /* STI */
677 double dVthSCSTI =0.0 ;
678 double dVthSCSTI_dVg =0.0, dVthSCSTI_dVd =0.0, dVthSCSTI_dVb =0.0 ;
679 double Vgssti =0.0 ;
680 double Vgssti_dVbs =0.0, Vgssti_dVds =0.0, Vgssti_dVgs =0.0 ;
681 double costi0 =0.0, costi1 =0.0, costi3 =0.0 ;
682 double costi4 =0.0, costi5 =0.0, costi6 =0.0, costi7 =0.0 ;
683 double costi3_dVb =0.0, costi3_dVd=0.0, costi3_dVg =0.0 ;
684 double costi3_dVb_c3 =0.0, costi3_dVd_c3=0.0, costi3_dVg_c3 =0.0 ;
685 double Psasti =0.0 ;
686 double Psasti_dVbs =0.0, Psasti_dVds =0.0, Psasti_dVgs =0.0 ;
687 double Psbsti =0.0 ;
688 double Psbsti_dVbs =0.0, Psbsti_dVds =0.0, Psbsti_dVgs =0.0 ;
689 double Psab =0.0 ;
690 double Psab_dVbs =0.0, Psab_dVds =0.0, Psab_dVgs =0.0 ;
691 double Psti =0.0 ;
692 double Psti_dVbs =0.0, Psti_dVds =0.0, Psti_dVgs =0.0 ;
693 double sq1sti =0.0 ;
694 double sq1sti_dVbs =0.0, sq1sti_dVds =0.0, sq1sti_dVgs =0.0 ;
695 double sq2sti =0.0 ;
696 double sq2sti_dVbs =0.0, sq2sti_dVds =0.0, sq2sti_dVgs =0.0 ;
697 double Qn0sti =0.0 ;
698 double Qn0sti_dVbs =0.0, Qn0sti_dVds =0.0, Qn0sti_dVgs =0.0 ;
699 double Idssti =0.0 ;
700 double Idssti_dVbs =0.0, Idssti_dVds =0.0, Idssti_dVgs =0.0 ;
701 /* constants */
702 double beta =0.0, beta_inv =0.0 ;
703 double beta2 =0.0 ;
704 double Pb2 =0.0 ;
705 double Pb20 =0.0 ;
706 double Pb2c =0.0 ;
707 double Vfb =0.0 ;
708 double c_eox =0.0 ;
709 double Leff=0.0, Weff =0.0 ;
710 double q_Nsub =0.0 ;
711 /* PART-1 */
712 /* Accumulation zone */
713 double Psa =0.0 ;
714 double Psa_dVbs =0.0, Psa_dVds =0.0, Psa_dVgs =0.0 ;
715 /* CLM*/
716 double Psdl =0.0, Psdl_dVbs =0.0, Psdl_dVds =0.0, Psdl_dVgs =0.0 ;
717 double Lred =0.0, Lred_dVbs =0.0, Lred_dVds =0.0, Lred_dVgs =0.0 ;
718 double Lch =0.0, Lch_dVbs =0.0, Lch_dVds =0.0, Lch_dVgs =0.0 ;
719 double Wd =0.0, Wd_dVbs =0.0, Wd_dVds =0.0, Wd_dVgs =0.0 ;
720 double Aclm =0.0 ;
721 /* Pocket Implant */
722 double Vthp=0.0, Vthp_dVb=0.0, Vthp_dVd=0.0, Vthp_dVg =0.0 ;
723 double dVthLP=0.0, dVthLP_dVb=0.0, dVthLP_dVd=0.0, dVthLP_dVg =0.0 ;
724 double bs12=0.0, bs12_dVb=0.0, bs12_dVd =0.0, bs12_dVg =0.0 ;
725 double Qbmm=0.0, Qbmm_dVb=0.0, Qbmm_dVd =0.0, Qbmm_dVg =0.0 ;
726 double dqb=0.0, dqb_dVb=0.0, dqb_dVg=0.0, dqb_dVd =0.0 ;
727 double Vdx=0.0, Vdx2 =0.0 ;
728 double Vdx_dVbs =0.0, Vdx2_dVbs =0.0 ;
729 double Pbsum=0.0, sqrt_Pbsum =0.0 ;
730 double Pbsum_dVb=0.0, Pbsum_dVd=0.0, Pbsum_dVg =0.0 ;
731 /* Poly-Depletion Effect */
732 const double pol_b = 1.0 ;
733 double dPpg =0.0, dPpg_dVb =0.0, dPpg_dVd =0.0, dPpg_dVg =0.0;
734 /* Quantum Effect */
735 double Tox =0.0, Tox_dVb =0.0, Tox_dVd =0.0, Tox_dVg =0.0 ;
736 double dTox =0.0, dTox_dVb =0.0, dTox_dVd =0.0, dTox_dVg =0.0 ;
737 double Cox =0.0, Cox_dVb =0.0, Cox_dVd =0.0, Cox_dVg =0.0 ;
738 double Cox_inv =0.0, Cox_inv_dVb =0.0, Cox_inv_dVd =0.0, Cox_inv_dVg =0.0 ;
739 double Tox0 =0.0, Cox0 =0.0, Cox0_inv =0.0 ;
740 double Vthq=0.0, Vthq_dVb =0.0, Vthq_dVd =0.0 ;
741 /* Igate , Igidl , Igisl */
742 const double igate_dlt = 1.0e-2 ;
743 double Psdlz =0.0, Psdlz_dVbs =0.0, Psdlz_dVds =0.0, Psdlz_dVgs =0.0 ;
744 double Egp12 =0.0, Egp32 =0.0 ;
745 double E1 =0.0, E1_dVb =0.0, E1_dVd =0.0, E1_dVg =0.0 ;
746 double Qb0Cox =0.0, Qb0Cox_dVb =0.0, Qb0Cox_dVd =0.0, Qb0Cox_dVg =0.0 ;
747 double Etun =0.0, Etun_dVbs =0.0, Etun_dVds =0.0, Etun_dVgs =0.0 ;
748 double Egidl =0.0, Egidl_dVb =0.0, Egidl_dVd =0.0, Egidl_dVg =0.0 ;
749 double Egisl =0.0, Egisl_dVb =0.0, Egisl_dVd =0.0, Egisl_dVg =0.0 ;
750 double Igate =0.0, Igate_dVbs =0.0, Igate_dVds =0.0, Igate_dVgs =0.0 ;
751 double Igate_dVbse =0.0, Igate_dVdse =0.0, Igate_dVgse =0.0 ;
752 double Igs =0.0, Igd =0.0, Igb =0.0 ;
753 double Igs_dVbs =0.0, Igs_dVds =0.0, Igs_dVgs =0.0 ;
754 double Igs_dVbse =0.0, Igs_dVdse =0.0, Igs_dVgse =0.0 ;
755 double Igd_dVbs =0.0, Igd_dVds =0.0, Igd_dVgs =0.0 ;
756 double Igd_dVbse =0.0, Igd_dVdse =0.0, Igd_dVgse =0.0 ;
757 double Igb_dVbs =0.0, Igb_dVds =0.0, Igb_dVgs =0.0 ;
758 double Igb_dVbse =0.0, Igb_dVdse =0.0, Igb_dVgse =0.0 ;
759 double Igidl =0.0, Igidl_dVbs =0.0, Igidl_dVds =0.0, Igidl_dVgs =0.0 ;
760 double Igidl_dVbse =0.0, Igidl_dVdse =0.0, Igidl_dVgse =0.0 ;
761 double Igisl =0.0, Igisl_dVbs =0.0, Igisl_dVds =0.0, Igisl_dVgs =0.0 ;
762 double Igisl_dVbse =0.0, Igisl_dVdse =0.0, Igisl_dVgse =0.0 ;
763 /* connecting function */
764 double FD2 =0.0, FD2_dVbs =0.0, FD2_dVds =0.0, FD2_dVgs =0.0 ;
765 double FMDVDS =0.0, FMDVDS_dVbs =0.0, FMDVDS_dVds =0.0, FMDVDS_dVgs =0.0 ;
766
767 double cnst0 =0.0, cnst1 =0.0 ;
768 double cnstCoxi =0.0 , cnstCoxi_dVg =0.0 , cnstCoxi_dVd =0.0 , cnstCoxi_dVb =0.0 ;
769 double fac1 =0.0 ;
770 double fac1_dVbs =0.0, fac1_dVds =0.0, fac1_dVgs =0.0 ;
771 double fac1p2 =0.0 ;
772 double fs01 =0.0 ;
773 double fs01_dPs0 =0.0 ;
774 double fs01_dVbs =0.0, fs01_dVds =0.0, fs01_dVgs =0.0 ;
775 double fs02 =0.0 ;
776 double fs02_dPs0 =0.0 ;
777 double fs02_dVbs =0.0, fs02_dVds =0.0, fs02_dVgs =0.0 ;
778 double fsl1 =0.0 ;
779 double fsl1_dPsl =0.0 ;
780 double fsl1_dVbs =0.0, fsl1_dVds =0.0, fsl1_dVgs =0.0; /* Vdseff */
781 double fsl2 =0.0 ;
782 double fsl2_dPsl =0.0 ;
783 double fsl2_dVbs =0.0, fsl2_dVds =0.0, fsl2_dVgs =0.0; /* Vdseff */
784 double cfs1 =0.0 ;
785 double fb =0.0, fb_dChi =0.0 ;
786 double fi =0.0, fi_dChi =0.0 ;
787 double exp_Chi =0.0, exp_Rho =0.0, exp_bVbs =0.0, exp_bVbsVds =0.0 ;
788 double Fs0=0.0, Fsl =0.0 ;
789 double Fs0_dPs0 =0.0, Fsl_dPsl =0.0 ;
790 double dPs0 =0.0, dPsl =0.0 ;
791 double Qn0 = 0.0e0 ;
792 double Qn0_dVbs =0.0, Qn0_dVds =0.0, Qn0_dVgs =0.0 ;
793 double Qb0 =0.0 ;
794 double Qb0_dVb =0.0, Qb0_dVd =0.0, Qb0_dVg =0.0 ;
795 double Qbnm =0.0 ;
796 double Qbnm_dVbs =0.0, Qbnm_dVds =0.0, Qbnm_dVgs =0.0 ;
797 double DtPds =0.0 ;
798 double DtPds_dVbs =0.0, DtPds_dVds =0.0, DtPds_dVgs =0.0 ;
799 double Qinm =0.0 ;
800 double Qinm_dVbs =0.0, Qinm_dVds =0.0, Qinm_dVgs =0.0 ;
801 double Qidn =0.0 ;
802 double Qidn_dVbs =0.0, Qidn_dVds =0.0, Qidn_dVgs =0.0 ;
803 double Qdnm =0.0 ;
804 double Qdnm_dVbs =0.0, Qdnm_dVds =0.0, Qdnm_dVgs =0.0 ;
805 double Qddn =0.0 ;
806 double Qddn_dVbs =0.0, Qddn_dVds =0.0, Qddn_dVgs =0.0 ;
807 double Quot =0.0 ;
808 double Qdrat = 0.5 ;
809 double Qdrat_dVbs = 0.0 , Qdrat_dVds = 0.0, Qdrat_dVgs = 0.0 ;
810 double Qdrat_dVbse =0.0, Qdrat_dVdse =0.0, Qdrat_dVgse =0.0 ;
811 double Idd =0.0 ;
812 double Idd_dVbs =0.0, Idd_dVds =0.0, Idd_dVgs =0.0 ;
813 double Fdd =0.0 ;
814 double Fdd_dVbs =0.0, Fdd_dVds =0.0, Fdd_dVgs =0.0 ;
815 double Eeff =0.0 ;
816 double Eeff_dVbs =0.0, Eeff_dVds =0.0, Eeff_dVgs =0.0 ;
817 double Rns =0.0 ;
818 double Mu = 0.0 ;
819 double Mu_dVbs =0.0, Mu_dVds =0.0, Mu_dVgs =0.0 ;
820 double Muun =0.0, Muun_dVbs =0.0, Muun_dVds =0.0, Muun_dVgs =0.0 ;
821 double Ey = 0e0 ;
822 double Ey_dVbs =0.0, Ey_dVds =0.0, Ey_dVgs =0.0 ;
823 double Em =0.0 ;
824 double Em_dVbs =0.0, Em_dVds =0.0, Em_dVgs =0.0 ;
825 double Vmax =0.0 ;
826 double Eta =0.0 ;
827 double Eta_dVbs =0.0, Eta_dVds =0.0, Eta_dVgs =0.0 ;
828 double Eta1 =0.0, Eta1p12 =0.0, Eta1p32 =0.0, Eta1p52 =0.0 ;
829 double Zeta12 =0.0, Zeta32 =0.0, Zeta52 =0.0 ;
830 double F00 =0.0 ;
831 double F00_dVbs =0.0, F00_dVds =0.0, F00_dVgs =0.0 ;
832 double F10 =0.0 ;
833 double F10_dVbs =0.0, F10_dVds =0.0, F10_dVgs =0.0 ;
834 double F30 =0.0 ;
835 double F30_dVbs =0.0, F30_dVds =0.0, F30_dVgs =0.0 ;
836 double F11 =0.0 ;
837 double F11_dVbs =0.0, F11_dVds =0.0, F11_dVgs =0.0 ;
838 double Ps0_min =0.0 ;
839 double Ps0_min_dVbs =0.0, Ps0_min_dVds =0.0, Ps0_min_dVgs =0.0 ;
840 double Acn =0.0, Acd =0.0, Ac1 =0.0, Ac2 =0.0, Ac3 =0.0, Ac4 =0.0, Ac31 =0.0, Ac41 =0.0 ;
841 double Acn_dVbs =0.0, Acn_dVds =0.0, Acn_dVgs =0.0 ;
842 double Acd_dVbs =0.0, Acd_dVds =0.0, Acd_dVgs =0.0 ;
843 double Ac1_dVbs =0.0, Ac1_dVds =0.0, Ac1_dVgs =0.0 ;
844 double Ac2_dVbs =0.0, Ac2_dVds =0.0, Ac2_dVgs =0.0 ;
845 double Ac3_dVbs =0.0, Ac3_dVds =0.0, Ac3_dVgs =0.0 ;
846 double Ac4_dVbs =0.0, Ac4_dVds =0.0, Ac4_dVgs =0.0 ;
847 double Ac31_dVbs =0.0, Ac31_dVds =0.0, Ac31_dVgs =0.0 ;
848 /* PART-2 (Isub) */
849 double Isub =0.0 ;
850 double Isub_dVbs =0.0, Isub_dVds =0.0, Isub_dVgs =0.0 ;
851 double Isub_dVbse =0.0, Isub_dVdse =0.0, Isub_dVgse =0.0 ;
852 double Psislsat=0.0, Psisubsat =0.0 ;
853 double Psislsat_dVd=0.0, Psislsat_dVg=0.0, Psislsat_dVb =0.0 ;
854 double Psisubsat_dVd=0.0, Psisubsat_dVg=0.0, Psisubsat_dVb =0.0 ;
855 /* PART-3 (overlap) */
856 double cov_slp =0.0, cov_mag =0.0, covvg =0.0, covvg_dVgs =0.0 ;
857 double Lov =0.0 ;
858 double Qgos = 0.0, Qgos_dVbs = 0.0, Qgos_dVds = 0.0, Qgos_dVgs = 0.0 ;
859 double Qgos_dVbse =0.0, Qgos_dVdse =0.0, Qgos_dVgse =0.0 ;
860 double Qgod = 0.0, Qgod_dVbs = 0.0, Qgod_dVds = 0.0, Qgod_dVgs = 0.0 ;
861 double Qgod_dVbse =0.0, Qgod_dVdse =0.0, Qgod_dVgse =0.0 ;
862
863 int flg_overgiven =0 ;
864
865 double Qgbo =0.0, Qgbo_dVbs =0.0, Qgbo_dVds =0.0, Qgbo_dVgs =0.0 ;
866 double Qgbo_dVbse =0.0, Qgbo_dVdse =0.0, Qgbo_dVgse =0.0 ;
867 double Cggo = 0.0 , Cgdo = 0.0 , Cgso = 0.0 , Cgbo = 0.0 , Cgbo_loc=0.0 ;
868 /* fringing capacitance */
869 double Cf =0.0 ;
870 double Qfd =0.0, Qfs =0.0 ;
871 /* Cqy */
872 double Ec =0.0, Ec_dVbs =0.0, Ec_dVds =0.0, Ec_dVgs =0.0 ;
873 double Pslk =0.0, Pslk_dVbs =0.0, Pslk_dVds =0.0, Pslk_dVgs =0.0 ;
874 double Qy =0.0 ;
875 double Cqyd=0.0, Cqyg=0.0, Cqys=0.0, Cqyb =0.0 ;
876 double Qy_dVbs =0.0, Qy_dVds =0.0, Qy_dVgs=0.0 ;
877 double Qy_dVbse =0.0, Qy_dVdse=0.0, Qy_dVgse=0.0 ;
878 double Qys=0.0, Qys_dVbse =0.0, Qys_dVdse=0.0, Qys_dVgse=0.0 ;
879 /* PART-4 (junction diode) */
880 double Ibs =0.0, Ibd =0.0, Gbs =0.0, Gbd =0.0, Gbse =0.0, Gbde =0.0 ;
881 /* junction capacitance */
882 double Qbs =0.0, Qbd =0.0, Capbs =0.0, Capbd =0.0, Capbse =0.0, Capbde =0.0 ;
883 double czbd =0.0, czbdsw =0.0, czbdswg =0.0, czbs =0.0, czbssw =0.0, czbsswg =0.0 ;
884 double arg =0.0, sarg =0.0 ;
885 /* PART-5 (NQS) */
886 double tau=0.0, Qi_prev =0.0;
887 double tau_dVgs=0.0, tau_dVds=0.0, tau_dVbs =0.0 ;
888 double tau_dVgse=0.0, tau_dVdse=0.0, tau_dVbse =0.0 ;
889 double Qi_nqs =0.0 ;
890 double Qi_dVbs_nqs=0.0, Qi_dVds_nqs=0.0, Qi_dVgs_nqs =0.0 ;
891 double Qi_dVbse_nqs=0.0, Qi_dVdse_nqs=0.0, Qi_dVgse_nqs =0.0 ;
892 double taub=0.0, Qb_prev =0.0;
893 double taub_dVgs=0.0, taub_dVds=0.0, taub_dVbs =0.0 ;
894 double taub_dVgse=0.0, taub_dVdse=0.0, taub_dVbse =0.0 ;
895 double Qb_nqs =0.0 ;
896 double Qb_dVbs_nqs=0.0, Qb_dVds_nqs=0.0, Qb_dVgs_nqs =0.0 ;
897 double Qb_dVbse_nqs=0.0, Qb_dVdse_nqs=0.0, Qb_dVgse_nqs =0.0 ;
898 /* PART-6 (noise) */
899 /* 1/f */
900 double NFalp =0.0, NFtrp =0.0, Cit =0.0, Nflic =0.0 ;
901 double Qi_noi =0.0 , Qiu_noi =0.0 ;
902 /* thermal */
903 double Eyd=0.0, Mu_Ave=0.0, Nthrml=0.0, Mud_hoso =0.0 ;
904 /* induced gate noise ( Part 0/3 ) */
905 double kusai00 =0.0, kusaidd =0.0, kusaiL =0.0, kusai00L =0.0 ;
906 int flg_ign = 0 ;
907 double sqrtkusaiL =0.0, kusai_ig =0.0, gds0_ign =0.0, gds0_h2 =0.0, GAMMA =0.0, crl_f =0.0 ;
908 const double c_sqrt_15 = 3.872983346207417e0 ; /* sqrt(15) */
909 const double Cox_small = 1.0e-6 ;
910 const double c_16o135 = 1.185185185185185e-1 ; /* 16/135 */
911 double Nign0 =0.0, MuModA =0.0, MuModB =0.0, correct_w1 =0.0 ;
912
913 /* Bias iteration accounting Rs/Rd */
914 int lp_bs =0 ;
915 double Ids_last =0.0 ;
916 double vtol_iprv = 2.0e-1 ;
917 double vtol_pprv = 1.01e-1 ;
918 double Vbsc_dif =0.0, Vdsc_dif =0.0, Vgsc_dif =0.0, sum_vdif =0.0 ;
919 double Vbsc_dif2 =0.0, Vdsc_dif2 =0.0, Vgsc_dif2 =0.0, sum_vdif2 =0.0 ;
920 double Rs =0.0, Rd =0.0 ;
921 double Fbs =0.0, Fds =0.0, Fgs =0.0 ;
922 double DJ =0.0, DJI =0.0 ;
923 double JI11 =0.0, JI12 =0.0, JI13 =0.0, JI21 =0.0, JI22 =0.0, JI23 =0.0, JI31 =0.0, JI32 =0.0, JI33 =0.0 ;
924 double dVbs =0.0, dVds =0.0, dVgs =0.0 ;
925 double dV_sum =0.0 ;
926 /* temporary vars. */
927 double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9 = 0.0, T10 = 0.0, T11 = 0.0, T12 ;
928 double TX =0.0, TX_dVbs =0.0, TX_dVds =0.0, TX_dVgs =0.0 ;
929 double TY =0.0, TY_dVbs =0.0, TY_dVds =0.0, TY_dVgs =0.0 ;
930 double T1_dVb =0.0, T1_dVd =0.0, T1_dVg =0.0 ;
931 double T2_dVb =0.0, T2_dVd =0.0, T2_dVg =0.0 ;
932 double T3_dVb =0.0, T3_dVd =0.0, T3_dVg =0.0 ;
933 double T4_dVb =0.0, T4_dVd =0.0, T4_dVg =0.0 ;
934 double T5_dVb =0.0, T5_dVd =0.0, T5_dVg =0.0 ;
935 double T6_dVb =0.0, T6_dVd =0.0, T6_dVg =0.0 ;
936 double T7_dVb =0.0, T7_dVd =0.0, T7_dVg =0.0 ;
937 double T8_dVb =0.0, T8_dVd =0.0, T8_dVg =0.0 ;
938 double T9_dVb =0.0, T9_dVd =0.0, T9_dVg =0.0 ;
939 double T10_dVb =0.0, T10_dVd =0.0, T10_dVg =0.0 ;
940 double T15, T16, T17 ;
941
942 int flg_zone = 0 ;
943
944 /* Vdseff */
945 double Vdseff =0.0, Vdsorg =0.0 ;
946 double Vdseff_dVbs =0.0, Vdseff_dVds =0.0, Vdseff_dVgs =0.0 ;
947
948 /* G/S and G/D Overlap Charges: Qovs/Qovd */
949 double Qovd = 0.0, Qovd_dVbse = 0.0, Qovd_dVdse = 0.0, Qovd_dVgse = 0.0 ;
950 double Qovd_dVbs = 0.0, Qovd_dVds = 0.0, Qovd_dVgs = 0.0 ;
951 double Qovs = 0.0, Qovs_dVbse = 0.0, Qovs_dVdse = 0.0, Qovs_dVgse = 0.0 ;
952 double Qovs_dVbs = 0.0, Qovs_dVds = 0.0, Qovs_dVgs = 0.0 ;
953 int lcover = 0, flg_ovloops = 0, flg_ovloopd = 0 ;
954 int flg_overs = 0, flg_overd = 0 ;
955 double VgpLD =0.0 ;
956 double QbdLD = 0.0 , QbdLD_dVbs = 0.0 , QbdLD_dVds = 0.0 , QbdLD_dVgs = 0.0 ;
957 double QidLD = 0.0 , QidLD_dVbs = 0.0 , QidLD_dVds = 0.0 , QidLD_dVgs = 0.0 ;
958 double QbsLD = 0.0 , QbsLD_dVbs = 0.0 , QbsLD_dVds = 0.0 , QbsLD_dVgs = 0.0 ;
959 double QisLD = 0.0 , QisLD_dVbs = 0.0 , QisLD_dVds = 0.0 , QisLD_dVgs = 0.0 ;
960 double QbdLD_dVbse = 0.0 , QbdLD_dVdse = 0.0 , QbdLD_dVgse = 0.0 ;
961 double QidLD_dVbse = 0.0 , QidLD_dVdse = 0.0 , QidLD_dVgse = 0.0 ;
962 double QbsLD_dVbse = 0.0 , QbsLD_dVdse = 0.0 , QbsLD_dVgse = 0.0 ;
963 double QisLD_dVbse = 0.0 , QisLD_dVdse = 0.0 , QisLD_dVgse = 0.0 ;
964 double QbuLD = 0.0 , QbuLD_dVbs = 0.0 , QbuLD_dVds = 0.0 , QbuLD_dVgs = 0.0 ;
965 double QsuLD = 0.0 , QsuLD_dVbs = 0.0 , QsuLD_dVds = 0.0 , QsuLD_dVgs = 0.0 ;
966 double QiuLD = 0.0 , QiuLD_dVbs = 0.0 , QiuLD_dVds = 0.0 , QiuLD_dVgs = 0.0 ;
967 double Ps0LD = 0.0 , Ps0LD_dVds = 0.0 ;
968 double QbuLD_dVxb = 0.0 , QbuLD_dVgb = 0.0 ;
969 double QsuLD_dVxb = 0.0 , QsuLD_dVgb = 0.0 ;
970 int flg_ovzone = 0 ;
971
972 /* Vgsz for SCE and PGD */
973 double Vbsz2 =0.0, Vbsz2_dVbs =0.0, Vbsz2_dVds =0.0, Vbsz2_dVgs =0.0 ;
974
975 /* Multiplication factor of a MOSFET instance */
976 double M = 1.0 ;
977
978 /* Mode flag ( = 0 | 1 ) */
979 double ModeNML =0.0, ModeRVS =0.0 ;
980
981 /* For Gate Leak Current Partitioning */
982 double GLPART1 ;
983 double GLPART1_dVgs=0.0, GLPART1_dVds=0.0, GLPART1_dVbs =0.0;
984 double GLPART1_dVgse=0.0, GLPART1_dVdse=0.0, GLPART1_dVbse =0.0;
985
986 /* IBPC */
987 double IdsIBPC = 0.0 ;
988 double IdsIBPC_dVbs = 0.0 , IdsIBPC_dVds = 0.0 , IdsIBPC_dVgs = 0.0 ;
989 double IdsIBPC_dVbse = 0.0 , IdsIBPC_dVdse = 0.0 , IdsIBPC_dVgse = 0.0 ;
990
991 /* Overlap Charge: Qover */
992 double Vbsgmt =0.0, Vdsgmt =0.0, Vgsgmt =0.0, Vdbgmt =0.0, Vgbgmt =0.0, Vsbgmt =0.0, Vxbgmt =0.0 ;
993 double Vxbgmtcl = 0.0, Vxbgmtcl_dVxbgmt = 0.0 ;
994
995 double Pb2over =0.0 ;
996
997 /* Qover Iterative and Analytical Model */
998 const double large_arg = 80 ;
999 int lp_ld =0 ;
1000 double T1_dVxb=0.0, T1_dVgb=0.0, T5_dVxb=0.0, T5_dVgb =0.0 ;
1001 double Vgb_fb_LD=0.0, VgpLD_dVgb =0.0 ;
1002 double VgpLD_shift=0.0, VgpLD_shift_dVxb=0.0, VgpLD_shift_dVgb =0.0 ;
1003 double TX_dVxb=0.0, TX_dVgb=0.0, TY_dVxb=0.0, TY_dVgb =0.0 ;
1004 double Ac1_dVxb=0.0, Ac1_dVgb=0.0, Ac2_dVxb=0.0, Ac2_dVgb =0.0 ;
1005 double Ac3_dVxb=0.0, Ac3_dVgb=0.0, Ac31_dVxb=0.0, Ac31_dVgb =0.0;
1006 double Acd_dVxb=0.0, Acd_dVgb=0.0, Acn_dVxb=0.0, Acn_dVgb =0.0;
1007 double Ta = 9.3868e-3, Tb = -0.1047839 ;
1008 double Tc=0.0, Tp =0.0 ;
1009 double Td=0.0, Td_dVxb=0.0, Td_dVgb =0.0 ;
1010 double Tq=0.0, Tq_dVxb=0.0, Tq_dVgb =0.0 ;
1011 double Tu=0.0, Tu_dVxb=0.0, Tu_dVgb =0.0 ;
1012 double Tv=0.0, Tv_dVxb=0.0, Tv_dVgb =0.0 ;
1013 double exp_bVbs_dVxb=0.0, exp_bPs0 =0.0 ;
1014 double cnst1over =0.0;
1015 double gamma=0.0, gamma_dVxb =0.0;
1016 double Chi_dVxb=0.0, Chi_dVgb =0.0 ;
1017 double Chi_A=0.0, Chi_A_dVxb=0.0, Chi_A_dVgb =0.0 ;
1018 double Chi_B=0.0, Chi_B_dVxb=0.0, Chi_B_dVgb =0.0 ;
1019 double Chi_1=0.0, Chi_1_dVxb=0.0, Chi_1_dVgb =0.0 ;
1020 double psi_B=0.0, arg_B =0.0 ;
1021 double psi=0.0, psi_dVgb=0.0, psi_dVxb =0.0 ;
1022 double Ps0_iniA_dVxb=0.0, Ps0_iniA_dVgb =0.0 ;
1023 double Ps0_iniB_dVxb=0.0, Ps0_iniB_dVgb =0.0 ;
1024 double Psa_dVxb=0.0, Psa_dVgb=0.0, Ps0LD_dVxb=0.0, Ps0LD_dVgb =0.0 ;
1025 double fs02_dVxb=0.0, fs02_dVgb =0.0 ;
1026
1027 /* SCE LOOP */
1028 double A =0.0, A_dVgs=0.0, A_dVds=0.0, A_dVbs =0.0 ;
1029 int NNN =0 ;
1030 double PS0_SCE=0 , PS0_SCE_dVgs = 0 , PS0_SCE_dVds = 0 , PS0_SCE_dVbs = 0 ;
1031 double PS0Z_SCE=0 , PS0Z_SCE_dVgs = 0 , PS0Z_SCE_dVds = 0 , PS0Z_SCE_dVbs = 0 ;
1032 /* double arg0 = 0.01 , arg1 = 0.04 ; */
1033 double arg0 = 0.01 ;
1034 double arg2 = here->HSM2_2qnsub_esi * 1.0e-4 ;
1035 int MAX_LOOP_SCE =0 ;
1036
1037 int codqb = 0 ;
1038 int corecip = model->HSM2_corecip ;
1039 int START_OF_SCE_LOOP = 1 , end_of_part_1 = 0 ;
1040
1041
1042 /* modify Qy in accumulation region */
1043 double Aclm_eff=0.0, Aclm_eff_dVds=0.0, Aclm_eff_dVgs=0.0, Aclm_eff_dVbs =0.0 ;
1044
1045 double Idd1 =0.0, Idd1_dVbs =0.0, Idd1_dVgs =0.0, Idd1_dVds =0.0 ;
1046
1047 double tcjbs=0.0, tcjbssw=0.0, tcjbsswg=0.0,
1048 tcjbd=0.0, tcjbdsw=0.0, tcjbdswg=0.0 ;
1049 double TTEMP =0.0 ;
1050
1051 double PS0_SCE_tol = 4.0e-7 ;
1052 double PS0_SCE_deriv_tol = 1.0e-8 ;
1053 double Ps0_ini_dVds =0.0, Ps0_ini_dVgs =0.0, Ps0_ini_dVbs =0.0 ;
1054 double Ps0_iniA_dVds =0.0, Ps0_iniA_dVgs =0.0, Ps0_iniA_dVbs =0.0 ;
1055 double Ps0_iniB_dVds =0.0, Ps0_iniB_dVgs =0.0, Ps0_iniB_dVbs =0.0 ;
1056
1057 double A_dPS0Z = 0.0, dqb_dPS0Z = 0.0, dVth_dPS0Z = 0.0, dVth0_dPS0Z = 0.0,
1058 dVthLP_dPS0Z = 0.0, dVthSC_dPS0Z = 0.0, Qbmm_dPS0Z = 0.0,
1059 Vgp_dPS0Z = 0.0, Vgpz_dPS0Z = 0.0, Vthp_dPS0Z = 0.0,
1060 Vth0_dPS0Z = 0.0 ;
1061 double T1_dPS0Z=0.0, T3_dPS0Z=0.0, T4_dPS0Z=0.0, T5_dPS0Z=0.0,
1062 T6_dPS0Z=0.0, T7_dPS0Z=0.0, T8_dPS0Z=0.0, T9_dPS0Z=0.0,
1063 T10_dPS0Z=0.0, TX_dPS0Z =0.0 ;
1064 double Ac1_dPS0Z=0.0, Ac2_dPS0Z=0.0, Ac3_dPS0Z=0.0, Ac31_dPS0Z=0.0,
1065 Acd_dPS0Z=0.0, Acn_dPS0Z=0.0, Chi_dPS0Z=0.0, Psa_dPS0Z =0.0 ;
1066 double Fs0_dPS0Z=0.0, Fsl_dPS0Z=0.0, Ps0_dPS0Z=0.0, Psl_dPS0Z=0.0,
1067 Pds_dPS0Z=0.0, Pzadd_dPS0Z=0.0, Ps0z_dPS0Z =0.0 ;
1068 double G=0.0, delta_PS0Z_SCE=0.0, delta_PS0Z_SCE_dVds=0.0,
1069 delta_PS0Z_SCE_dVgs=0.0, delta_PS0Z_SCE_dVbs =0.0 ;
1070
1071
1072 double Vgs_min =0.0 ;
1073
1074
1075 /*================ Start of executable code.=================*/
1076
1077 if (here->HSM2_mode == HiSIM_NORMAL_MODE) {
1078 ModeNML = 1.0 ;
1079 ModeRVS = 0.0 ;
1080 } else {
1081 ModeNML = 0.0 ;
1082 ModeRVS = 1.0 ;
1083 }
1084
1085 T1 = vbs + vds + vgs + vbd_jct + vbs_jct ;
1086 if ( ! finite (T1) ) {
1087 fprintf (stderr ,
1088 "*** warning(HiSIM): Unacceptable Bias(es).\n" ) ;
1089 fprintf (stderr , "----- bias information (HiSIM)\n" ) ;
1090 fprintf (stderr , "name: %s\n" , here->HSM2name ) ;
1091 fprintf (stderr , "states: %d\n" , here->HSM2states ) ;
1092 fprintf (stderr , "vds= %12.5e vgs=%12.5e vbs=%12.5e\n"
1093 , vds , vgs , vbs ) ;
1094 fprintf (stderr , "vbs_jct= %12.5e vbd_jct= %12.5e\n"
1095 , vbs_jct , vbd_jct ) ;
1096 fprintf (stderr , "vd= %12.5e vg= %12.5e vb= %12.5e vs= %12.5e\n"
1097 , *( ckt->CKTrhsOld + here->HSM2dNodePrime )
1098 , *( ckt->CKTrhsOld + here->HSM2gNodePrime )
1099 , *( ckt->CKTrhsOld + here->HSM2bNodePrime )
1100 , *( ckt->CKTrhsOld + here->HSM2sNodePrime ) ) ;
1101 if ( here->HSM2_called >= 1 ) {
1102 fprintf (stderr , "vdsc_prv= %12.5e vgsc_prv=%12.5e vbsc_prv=%12.5e\n"
1103 , here->HSM2_vdsc_prv , here->HSM2_vgsc_prv
1104 , here->HSM2_vbsc_prv ) ;
1105 }
1106 fprintf (stderr , "----- bias information (end)\n" ) ;
1107 return ( HiSIM_ERROR ) ;
1108 }
1109
1110 flg_info = model->HSM2_info ;
1111 flg_nqs = model->HSM2_conqs ;
1112
1113 /*-----------------------------------------------------------*
1114 * Start of the routine. (label)
1115 *-----------------*/
1116 /*start_of_routine:*/
1117
1118 TTEMP = ckt->CKTtemp ;
1119 if ( here->HSM2_dtemp_Given ) { TTEMP = TTEMP + here->HSM2_dtemp ; }
1120
1121 beta = here->HSM2_beta ;
1122
1123 /* Inverse of the thermal voltage */
1124 beta_inv = here->HSM2_beta_inv ;
1125 beta2 = here->HSM2_beta2 ;
1126
1127 /* Bandgap */
1128 Egp12 = here->HSM2_egp12 ;
1129 Egp32 = here->HSM2_egp32 ;
1130
1131 /* Metallurgical channel geometry */
1132 Leff = here->HSM2_leff ;
1133 Weff = here->HSM2_weff ;
1134
1135 /* Flat band voltage */
1136 Vfb = pParam->HSM2_vfbc ;
1137
1138 /* Surface impurity profile */
1139 q_Nsub = here->HSM2_qnsub ;
1140
1141 /* Velocity Temperature Dependence */
1142 Vmax = here->HSM2_vmax ;
1143
1144 /* 2 phi_B */
1145 Pb2 = here->HSM2_pb2 ;
1146 Pb20 = here->HSM2_pb20 ;
1147 Pb2c = here->HSM2_pb2c ;
1148
1149 /* Coefficient of the F function for bulk charge */
1150 cnst0 = here->HSM2_cnst0 ;
1151
1152 /* cnst1: n_{p0} / p_{p0} */
1153 cnst1 = here->HSM2_cnst1 ;
1154
1155 /* c_eox: Permitivity in ox */
1156 c_eox = here->HSM2_cecox ;
1157
1158 /* Tox and Cox without QME */
1159 Tox0 = model->HSM2_tox ;
1160 Cox0 = c_eox / Tox0 ;
1161 Cox0_inv = 1.0 / Cox0 ;
1162
1163 /* for calculation of Ps0_min */
1164 Vgs_min = model->HSM2_type * model->HSM2_Vgsmin ;
1165
1166 /*-----------------------------------------------------------*
1167 * Exchange bias conditions according to MOS type.
1168 * - Vxse are external biases for HiSIM. ( type=NMOS , Vds >= 0
1169 * are assumed.)
1170 *-----------------*/
1171 Vbse = vbs ;
1172 Vdse = vds ;
1173 Vgse = vgs ;
1174
1175 /*---------------------------------------------------*
1176 * Clamp too large biases.
1177 * -note: Quantities are extrapolated in PART-5.
1178 *-----------------*/
1179
1180 if ( Pb2 - model->HSM2_vzadd0 < Vbs_max ) {
1181 Vbs_max = Pb2 - model->HSM2_vzadd0 ;
1182 }
1183 if ( Pb20 - model->HSM2_vzadd0 < Vbs_max ) {
1184 Vbs_max = Pb20 - model->HSM2_vzadd0 ;
1185 }
1186 if ( Pb2c - model->HSM2_vzadd0 < Vbs_max ) {
1187 Vbs_max = Pb2c - model->HSM2_vzadd0 ;
1188 }
1189
1190 if ( Vbs_bnd > Vbs_max * 0.5 ) {
1191 Vbs_bnd = 0.5 * Vbs_max ;
1192 }
1193
1194 if ( Vbse > Vbs_bnd ) {
1195 flg_vbsc = 1 ;
1196 T1 = Vbse - Vbs_bnd ;
1197 T2 = Vbs_max - Vbs_bnd ;
1198 Fn_SUPoly4m( TY , T1 , T2 , Vbsc_dVbse , T0 ) ;
1199 Vbsc = Vbs_bnd + TY ;
1200
1201 T3 = 1 / T2 ;
1202 /* x/xmax */
1203 T4 = T1 * T3 ;
1204 T4_dVb = T3 ;
1205
1206 T5 = T4 * T4;
1207 T5_dVb = 2 * T4_dVb * T4 ;
1208 T15 = 2 * T4_dVb * T4_dVb ; /* T15 = T5_dVb_dVb */
1209
1210 T6 = T4 * T5 ;
1211 T6_dVb = T4_dVb * T5 + T4 * T5_dVb ;
1212 T16 = T4_dVb * T5_dVb + T4_dVb * T5_dVb + T4 * T15 ; /* T16 = T6_dVb_dVb */
1213
1214 /* T7 = Z T7_dVb = dZ_dVb T17 = dZ_dVb_dVb */
1215 T7 = 1 + T4 + T5 + T6 + T5 * T5 ;
1216 T7_dVb = T4_dVb + T5_dVb + T6_dVb + 2 * T5_dVb * T5 ;
1217 T17 = T15 + T16 + 2 * T15 * T5 + 2 * T5_dVb * T5_dVb ;
1218
1219 T8 = T7 * T7 ;
1220 T8_dVb = 2 * T7_dVb * T7 ;
1221
1222 T9 = 1 / T8 ;
1223 T9_dVb = - T8_dVb * T9 * T9 ;
1224
1225 Vbsc_dVbse = T2 * T7_dVb * T9 ;
1226 Vbsc_dVbse_dVbs = T2 * ( T17 * T9 + T7_dVb * T9_dVb ) ;
1227
1228 } else if ( Vbse < Vbs_min ) {
1229 flg_vbsc = -1 ;
1230 Vbsc = Vbs_min ;
1231 Vbsc_dVbse_dVbs = 0.0 ;
1232 } else {
1233 flg_vbsc = 0 ;
1234 Vbsc = Vbse ;
1235 Vbsc_dVbse = 1.0 ;
1236 Vbsc_dVbse_dVbs = 0.0 ;
1237 }
1238
1239 Vdsc = Vdse ;
1240 Vgsc = Vgse ;
1241
1242 if (here->HSM2_rs > 0.0 || here->HSM2_rd > 0.0) {
1243 if ( model->HSM2_corsrd == 1 ) flg_rsrd = 1 ;
1244 if ( model->HSM2_corsrd == 2 ) flg_rsrd = 2 ;
1245 }
1246
1247 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1248 * PART-1: Basic device characteristics.
1249 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
1250 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
1251 * Prepare for potential initial guesses using previous values
1252 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
1253
1254 flg_pprv = 0 ;
1255
1256 if ( here->HSM2_called >= 1 ) {
1257
1258 Vbsc_dif = Vbsc - here->HSM2_vbsc_prv ;
1259 Vdsc_dif = Vdsc - here->HSM2_vdsc_prv ;
1260 Vgsc_dif = Vgsc - here->HSM2_vgsc_prv ;
1261
1262 sum_vdif = fabs( Vbsc_dif ) + fabs( Vdsc_dif )
1263 + fabs( Vgsc_dif ) ;
1264
1265 if ( model->HSM2_copprv >= 1 && sum_vdif <= vtol_pprv &&
1266 here->HSM2_mode * here->HSM2_mode_prv > 0 ) { flg_pprv = 1 ;}
1267
1268 if ( here->HSM2_called >= 2 && flg_pprv == 1 ) {
1269 Vbsc_dif2 = here->HSM2_vbsc_prv - here->HSM2_vbsc_prv2 ;
1270 Vdsc_dif2 = here->HSM2_vdsc_prv - here->HSM2_vdsc_prv2 ;
1271 Vgsc_dif2 = here->HSM2_vgsc_prv - here->HSM2_vgsc_prv2 ;
1272 sum_vdif2 = fabs( Vbsc_dif2 ) + fabs( Vdsc_dif2 )
1273 + fabs( Vgsc_dif2 ) ;
1274 if ( epsm10 < sum_vdif2 && sum_vdif2 <= vtol_pprv &&
1275 here->HSM2_mode_prv * here->HSM2_mode_prv2 > 0 ) { flg_pprv = 2 ; }
1276 }
1277 } else {
1278 Vbsc_dif = 0.0 ;
1279 Vdsc_dif = 0.0 ;
1280 Vgsc_dif = 0.0 ;
1281 sum_vdif = 0.0 ;
1282 Vbsc_dif2 = 0.0 ;
1283 Vdsc_dif2 = 0.0 ;
1284 Vgsc_dif2 = 0.0 ;
1285 sum_vdif2 = 0.0 ;
1286 flg_iprv = 0 ;
1287 flg_pprv = 0 ;
1288 }
1289
1290 dVbs = Vbsc_dif ;
1291 dVds = Vdsc_dif ;
1292 dVgs = Vgsc_dif ;
1293
1294 if ( flg_pprv >= 1 ) {
1295 Ps0 = here->HSM2_ps0_prv ;
1296 Ps0_dVbs = here->HSM2_ps0_dvbs_prv ;
1297 Ps0_dVds = here->HSM2_ps0_dvds_prv ;
1298 Ps0_dVgs = here->HSM2_ps0_dvgs_prv ;
1299
1300 Pds = here->HSM2_pds_prv ;
1301 Pds_dVbs = here->HSM2_pds_dvbs_prv ;
1302 Pds_dVds = here->HSM2_pds_dvds_prv ;
1303 Pds_dVgs = here->HSM2_pds_dvgs_prv ;
1304 }
1305
1306
1307 /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
1308 * Bias loop: iteration to solve the system of equations of
1309 * the small circuit taking into account Rs and Rd.
1310 * - Vxs are internal (or effective) biases.
1311 * - Equations:
1312 * Vbs = Vbsc - Rs * Ids
1313 * Vds = Vdsc - ( Rs + Rd ) * Ids
1314 * Vgs = Vgsc - Rs * Ids
1315 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
1316
1317 if ( flg_rsrd == 1 ) {
1318
1319 if (here->HSM2_mode == HiSIM_NORMAL_MODE) {
1320 Rs = here->HSM2_rs ;
1321 Rd = here->HSM2_rd ;
1322 } else {
1323 Rs = here->HSM2_rd ;
1324 Rd = here->HSM2_rs ;
1325 }
1326
1327 if ( here->HSM2_called >= 1 ) {
1328
1329 if ( model->HSM2_coiprv >= 1 &&
1330 0.0 < sum_vdif && sum_vdif <= vtol_iprv ) { flg_iprv = 1 ;}
1331 }
1332
1333 /*-----------------------------------------------------------*
1334 * Initial guesses using the previous values.
1335 *-----------------*/
1336 if ( flg_iprv == 1 ) {
1337 here->HSM2_ids_dvbs_prv = Fn_Max( 0.0 , here->HSM2_ids_dvbs_prv ) ;
1338 here->HSM2_ids_dvds_prv = Fn_Max( 0.0 , here->HSM2_ids_dvds_prv ) ;
1339 here->HSM2_ids_dvgs_prv = Fn_Max( 0.0 , here->HSM2_ids_dvgs_prv ) ;
1340
1341 dVbs = Vbsc_dif * ( 1.0 - 1.0 / ( 1.0 + Rs * here->HSM2_ids_dvbs_prv ) ) ;
1342 dVds = Vdsc_dif * ( 1.0 - 1.0 / ( 1.0 + ( Rs + Rd ) * here->HSM2_ids_dvds_prv ) ) ;
1343 dVgs = Vgsc_dif * ( 1.0 - 1.0 / ( 1.0 + Rs * here->HSM2_ids_dvgs_prv ) ) ;
1344
1345 Ids = here->HSM2_ids_prv
1346 + here->HSM2_ids_dvbs_prv * dVbs
1347 + here->HSM2_ids_dvds_prv * dVds
1348 + here->HSM2_ids_dvgs_prv * dVgs ;
1349
1350 T1 = ( Ids - here->HSM2_ids_prv ) ;
1351 T2 = fabs( T1 ) ;
1352 if ( Ids_maxvar * here->HSM2_ids_prv < T2 ) {
1353 Ids = here->HSM2_ids_prv * ( 1.0 + Fn_Sgn( T1 ) * Ids_maxvar ) ;
1354 }
1355 if ( Ids < 0 ) Ids = 0.0 ;
1356
1357 } else {
1358 Ids = 0.0 ;
1359 if ( flg_pprv >= 1 ) {
1360 dVbs = Vbsc_dif ;
1361 dVds = Vdsc_dif ;
1362 dVgs = Vgsc_dif ;
1363 }
1364 } /* end of flg_iprv if-blocks */
1365
1366 Vbs = Vbsc - Ids * Rs ;
1367 Vds = Vdsc - Ids * ( Rs + Rd ) ;
1368 if ( Vds * Vdsc <= 0.0 ) { Vds = 0.0 ; }
1369
1370 Vgs = Vgsc - Ids * Rs ;
1371
1372 } else {
1373 lp_bs_max = 1 ;
1374 Ids = 0.0 ;
1375 Vbs = Vbsc ;
1376 Vds = Vdsc ;
1377 Vgs = Vgsc ;
1378 } /* end of flg_rsrd if-blocks */
1379
1380
1381 if( model->HSM2_codep == 1 ) {
1382 /*---------------------------------------------------*
1383 * CODEP=1 : Depletion mode MOSFET
1384 *-----------------*/
1385
1386 /*-----------------------------------------------------------*
1387 * Vxsz: Modified bias introduced to realize symmetry at Vds=0.
1388 *-----------------*/
1389
1390 T1 = Vbsc_dVbse * Vds / 2 ;
1391 Fn_SymAdd( Vzadd , T1 , model->HSM2_vzadd0 , T2 ) ;
1392 Vzadd_dVbs = T2 * Vbsc_dVbse_dVbs * Vds / 2 ;
1393 T2 *= Vbsc_dVbse / 2 ;
1394 Vzadd_dVds = T2 ;
1395
1396 if ( Vzadd < ps_conv ) {
1397 Vzadd = ps_conv ;
1398 Vzadd_dVds = 0.0 ;
1399 Vzadd_dVbs = 0.0 ;
1400 }
1401
1402 Vbsz = Vbs + Vzadd ;
1403 Vbsz_dVbs = 1.0 ;
1404 Vbsz_dVds = Vzadd_dVds ;
1405
1406 Vdsz = Vds + 2.0 * Vzadd ;
1407 Vdsz_dVbs = 0.0 ;
1408 Vdsz_dVds = 1.0 + 2.0 * Vzadd_dVds ;
1409
1410 Vgsz = Vgs + Vzadd ;
1411 Vgsz_dVgs = 1.0 ;
1412 Vgsz_dVbs = 0.0 ;
1413 Vgsz_dVds = Vzadd_dVds ;
1414
1415
1416 /*---------------------------------------------------*
1417 * Factor of modification for symmetry.
1418 *-----------------*/
1419
1420 T1 = here->HSM2_qnsub_esi * Cox0_inv * Cox0_inv ;
1421 T2 = Vgs - Vfb ;
1422 T3 = 1 + 2.0 / T1 * ( T2 - beta_inv - Vbs ) ;
1423 Fn_SZ( T4 , T3 , 1e-3 , T5 ) ;
1424 TX = sqrt( T4 ) ;
1425 Pslsat = T2 + T1 * ( 1.0 - TX ) ;
1426 VdsatS = Pslsat - Pb2 ;
1427 Fn_SL( VdsatS , VdsatS , 0.1 , 5e-2 , T6 ) ;
1428
1429 VdsatS_dVbs = ( TX ? (T6 * T5 / TX ) : 0.0 ) ;
1430 VdsatS_dVds = 0.0 ;
1431 VdsatS_dVgs = ( TX ? (T6 * ( 1.0 - T5 / TX )) : 0.0 ) ;
1432
1433
1434 T1 = Vds / VdsatS ;
1435 Fn_SUPoly4( TX , T1 , 1.0 , T0 ) ;
1436 FMDVDS = TX * TX ;
1437 T2 = 2 * TX * T0 ;
1438 T3 = T2 / ( VdsatS * VdsatS ) ;
1439 FMDVDS_dVbs = T3 * ( - Vds * VdsatS_dVbs ) ;
1440 FMDVDS_dVds = T3 * ( 1.0 * VdsatS - Vds * VdsatS_dVds ) ;
1441 FMDVDS_dVgs = T3 * ( - Vds * VdsatS_dVgs ) ;
1442
1443 /*-----------------------------------------------------------*
1444 * Quantum effect
1445 *-----------------*/
1446 if ( model->HSM2_flg_qme == 0 ) {
1447 flg_qme = 0 ;
1448 } else {
1449 flg_qme = 1 ;
1450 }
1451
1452
1453 T1 = here->HSM2_2qnsub_esi ;
1454 T2 = sqrt( T1 * Pb20 ) ;
1455 Vthq = Pb20 + Vfb + T2 * Cox0_inv ;
1456 Vthq_dVb = 0.0 ;
1457 Vthq_dVd = 0.0 ;
1458
1459 if ( flg_qme == 0 ) {
1460 Tox = Tox0 ;
1461 Tox_dVb = 0.0 ;
1462 Tox_dVd = 0.0 ;
1463 Tox_dVg = 0.0 ;
1464
1465 Cox = Cox0 ;
1466 Cox_dVb = 0.0 ;
1467 Cox_dVd = 0.0 ;
1468 Cox_dVg = 0.0 ;
1469
1470 Cox_inv = Cox0_inv ;
1471 Cox_inv_dVb = 0.0 ;
1472 Cox_inv_dVd = 0.0 ;
1473 Cox_inv_dVg = 0.0 ;
1474
1475 T0 = cnst0 * cnst0 * Cox_inv ;
1476 cnstCoxi = T0 * Cox_inv ;
1477 cnstCoxi_dVb = 0.0 ;
1478 cnstCoxi_dVd = 0.0 ;
1479 cnstCoxi_dVg = 0.0 ;
1480
1481 } else {
1482
1483 T5 = Vgs - Vbs - Vthq + model->HSM2_qme2 ;
1484 T5_dVb = -1.0 - Vthq_dVb ;
1485 T5_dVd = - Vthq_dVd ;
1486 T5_dVg = 1.0 ;
1487 Fn_SZ( T2 , T5 , qme_dlt, T3) ;
1488 T2 = T2 + small ;
1489 T2_dVb = T3 * T5_dVb ;
1490 T2_dVd = T3 * T5_dVd ;
1491 T2_dVg = T3 * T5_dVg ;
1492
1493 T3 = 1.0 / T2 ;
1494 T7 = -1.0 / ( T2 * T2 ) ;
1495 T3_dVb = T7 * T2_dVb ;
1496 T3_dVd = T7 * T2_dVd ;
1497 T3_dVg = T7 * T2_dVg ;
1498
1499 T4 = 2.0 * fabs(Vthq) ;
1500 T6 = Vfb - Vthq + model->HSM2_qme2 ;
1501 if(T6 > T4) { T4 = T6; }
1502
1503 Fn_SU( T2 , T3 , 1.0 / T4 , qme_dlt, T6 ) ;
1504 T2_dVb = T6 * T3_dVb ;
1505 T2_dVd = T6 * T3_dVd ;
1506 T2_dVg = T6 * T3_dVg ;
1507
1508 dTox = model->HSM2_qme1 * T2 + model->HSM2_qme3 ;
1509 T7 = model->HSM2_qme1 ;
1510 dTox_dVb = T7 * T2_dVb ;
1511 dTox_dVd = T7 * T2_dVd ;
1512 dTox_dVg = T7 * T2_dVg ;
1513
1514 if ( dTox * 1.0e12 < Tox0 ) {
1515 dTox = 0.0 ;
1516 dTox_dVb = 0.0 ;
1517 dTox_dVd = 0.0 ;
1518 dTox_dVg = 0.0 ;
1519 flg_qme = 0 ;
1520 }
1521
1522 Tox = Tox0 + dTox ;
1523 Tox_dVb = dTox_dVb ;
1524 Tox_dVd = dTox_dVd ;
1525 Tox_dVg = dTox_dVg ;
1526
1527 Cox = c_eox / Tox ;
1528 T1 = - c_eox / ( Tox * Tox ) ;
1529 Cox_dVb = T1 * Tox_dVb ;
1530 Cox_dVd = T1 * Tox_dVd ;
1531 Cox_dVg = T1 * Tox_dVg ;
1532
1533 Cox_inv = Tox / c_eox ;
1534 T1 = 1.0 / c_eox ;
1535 Cox_inv_dVb = T1 * Tox_dVb ;
1536 Cox_inv_dVd = T1 * Tox_dVd ;
1537 Cox_inv_dVg = T1 * Tox_dVg ;
1538
1539 T0 = cnst0 * cnst0 * Cox_inv ;
1540 cnstCoxi = T0 * Cox_inv ;
1541 T1 = 2.0 * T0 ;
1542 cnstCoxi_dVb = T1 * Cox_inv_dVb ;
1543 cnstCoxi_dVd = T1 * Cox_inv_dVd ;
1544 cnstCoxi_dVg = T1 * Cox_inv_dVg ;
1545 }
1546
1547
1548 fac1 = cnst0 * Cox_inv ;
1549 fac1_dVds = cnst0 * Cox_inv_dVd ;
1550 fac1_dVgs = cnst0 * Cox_inv_dVg ;
1551 fac1_dVbs = cnst0 * Cox_inv_dVb ;
1552 fac1p2 = fac1 * fac1 ;
1553
1554 /* Ps0_min: approx. solution of Poisson equation at Vgs_min */
1555 /* ( easy to improve, if necessary ) */
1556 Ps0_min = 2.0 * beta_inv * log(-Vgs_min/fac1) ;
1557 Ps0_min_dVds = -2.0 * beta_inv * fac1_dVds / fac1 ;
1558 Ps0_min_dVgs = -2.0 * beta_inv * fac1_dVgs / fac1 ;
1559 Ps0_min_dVbs = -2.0 * beta_inv * fac1_dVbs / fac1 ;
1560
1561
1562 /*---------------------------------------------------*
1563 * Vbsz2 : Vbs for dVth
1564 *-----------------*/
1565 Vbsz2 = Vbsz ;
1566 Vbsz2_dVbs = Vbsz_dVbs ;
1567 Vbsz2_dVds = Vbsz_dVds ;
1568 Vbsz2_dVgs = 0.0 ;
1569
1570 /*---------------------------------------------------*
1571 * Vthp : Vth with pocket.
1572 *-----------------*/
1573 T1 = here->HSM2_2qnsub_esi ;
1574 Qb0 = sqrt (T1 * (Pb20 - Vbsz2)) ;
1575 T2 = 0.5 * T1 / Qb0 ;
1576 Qb0_dVb = T2 * (- Vbsz2_dVbs) ;
1577 Qb0_dVd = T2 * (- Vbsz2_dVds) ;
1578 Qb0_dVg = T2 * (- Vbsz2_dVgs) ;
1579
1580 Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr;
1581 Vthp_dVb = Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ;
1582 Vthp_dVd = Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ;
1583 Vthp_dVg = Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ;
1584
1585 Pb20b = Pb20 ;
1586 Pb20b_dVb = 0.0 ;
1587 Pb20b_dVd = 0.0 ;
1588 Pb20b_dVg = 0.0 ;
1589
1590 T0 = 0.95 ;
1591 T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ;
1592 T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ;
1593 T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ;
1594 T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ;
1595 T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ;
1596 T3 = T0 * Pb20b - 0.5 * (T1 + T2) ;
1597 T4 = 2.0 * T0 * 1.0e-3 ;
1598 T5 = T1 / T2 ;
1599 T6 = T4 / T2 ;
1600 T3_dVb = T0 * Pb20b_dVb
1601 - 0.5 * (T1_dVb + (T1_dVb * T5 + T6 * Pb20b_dVb ) ) ;
1602 T3_dVd = T0 * Pb20b_dVd
1603 - 0.5 * (T1_dVd + (T1_dVd * T5 + T6 * Pb20b_dVd ) ) ;
1604 T3_dVg = T0 * Pb20b_dVg
1605 - 0.5 * (T1_dVg + (T1_dVg * T5 + T6 * Pb20b_dVg ) ) ;
1606 Pbsum = Pb20b - T3 ;
1607 Pbsum_dVb = Pb20b_dVb - T3_dVb ;
1608 Pbsum_dVd = Pb20b_dVd - T3_dVd ;
1609 Pbsum_dVg = Pb20b_dVg - T3_dVg ;
1610
1611 if( model->HSM2_codep ) {
1612 Pbsum = Pbsum + model->HSM2_depeta * Vdsz ;
1613 Pbsum_dVb = Pbsum_dVb + model->HSM2_depeta * Vdsz_dVbs ;
1614 Pbsum_dVd = Pbsum_dVd + model->HSM2_depeta * Vdsz_dVds ;
1615 }
1616
1617 sqrt_Pbsum = sqrt( Pbsum ) ;
1618
1619 /*-------------------------------------------*
1620 * dVthLP : Short-channel effect induced by pocket.
1621 * - Vth0 : Vth without pocket.
1622 *-----------------*/
1623 if ( model->HSM2_lp != 0.0 ) {
1624 T1 = here->HSM2_2qnsub_esi ;
1625 T2 = model->HSM2_bs2 - Vbsz2 ;
1626 T3 = T2 + small ;
1627 T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ;
1628 T5 = 0.5 * (T3 + T4) ;
1629 T6 = 0.5 * (1.0 + T3 / T4) ;
1630 T5_dVb = - Vbsz2_dVbs * T6 ;
1631 T5_dVd = - Vbsz2_dVds * T6 ;
1632 T5_dVg = - Vbsz2_dVgs * T6 ;
1633 T7 = 1.0 / T5 ;
1634 bs12 = model->HSM2_bs1 * T7 ;
1635 T8 = - bs12 * T7 ;
1636 bs12_dVb = T8 * T5_dVb ;
1637 bs12_dVd = T8 * T5_dVd ;
1638 bs12_dVg = T8 * T5_dVg ;
1639 Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ;
1640 Qbmm = sqrt (T1 * (Pb20 - T10 )) ;
1641 T9 = T0 / Qbmm ;
1642 Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ;
1643 Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ;
1644 Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ;
1645
1646 dqb = (Qb0 - Qbmm) * Cox_inv ;
1647 dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv - Qbmm * Cox_inv_dVb ;
1648 dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv - Qbmm * Cox_inv_dVd ;
1649 dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv - Qbmm * Cox_inv_dVg ;
1650
1651 T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ;
1652 T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ;
1653 Vth0 = Pb2c + Vfb + T2 * Cox_inv ;
1654 T3 = 0.5 * T1 / T2 * Cox_inv ;
1655 Vth0_dVb = T3 * ( - Vbsz2_dVbs ) + T2 * Cox_inv_dVb ;
1656 Vth0_dVd = T3 * ( - Vbsz2_dVds ) + T2 * Cox_inv_dVd ;
1657 Vth0_dVg = T3 * ( - Vbsz2_dVgs ) + T2 * Cox_inv_dVg ;
1658
1659 T1 = C_ESI * Cox_inv ;
1660 T2 = here->HSM2_wdplp ;
1661 T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ;
1662 T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ;
1663 dVth0 = T5 * sqrt_Pbsum ;
1664 T6 = 0.5 * T5 / sqrt_Pbsum ;
1665 T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
1666 T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
1667 dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
1668 dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
1669 dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
1670
1671 T1 = Vthp - Vth0 ;
1672 T1_dVb = Vthp_dVb - Vth0_dVb ;
1673 T2 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * Pbsum / model->HSM2_lp ;
1674 T2_dVb = pParam->HSM2_scp3 * Pbsum_dVb / model->HSM2_lp ;
1675 T3 = T2 + pParam->HSM2_scp2 * Vdsz ;
1676 T3_dVb = T2_dVb + pParam->HSM2_scp2 * Vdsz_dVbs ;
1677
1678
1679 Vdx = model->HSM2_scp21 + Vdsz ;
1680 Vdx_dVbs = Vdsz_dVbs ;
1681 Vdx2 = Vdx * Vdx ;
1682 Vdx2_dVbs = 2 * Vdx_dVbs * Vdx ;
1683
1684 dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc / Vdx2 ;
1685 dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb
1686 + dqb_dVb + here->HSM2_msc / Vdx2 /Vdx2 *Vdx2_dVbs;
1687 T4 = T1 * dVth0 * pParam->HSM2_scp3 / model->HSM2_lp ;
1688 dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3
1689 + T4 * Pbsum_dVd
1690 + T1 * dVth0 * pParam->HSM2_scp2 * Vdsz_dVds
1691 + dqb_dVd
1692 + 2.0e0 * here->HSM2_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ;
1693 dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3
1694 + T4 * Pbsum_dVg + dqb_dVg ;
1695 } else {
1696 dVthLP = 0.0e0 ;
1697 dVthLP_dVb = 0.0e0 ;
1698 dVthLP_dVd = 0.0e0 ;
1699 dVthLP_dVg = 0.0e0 ;
1700 }
1701
1702 /*---------------------------------------------------*
1703 * dVthSC : Short-channel effect induced by Vds.
1704 *-----------------*/
1705 T1 = C_ESI * Cox_inv ;
1706 T2 = here->HSM2_wdpl ;
1707 T3 = here->HSM2_lgate - model->HSM2_parl2 ;
1708 T4 = 1.0e0 / ( T3 * T3 ) ;
1709 T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ;
1710
1711 dVth0 = T5 * sqrt_Pbsum ;
1712
1713 T6 = T5 / 2.0 / sqrt_Pbsum ;
1714 T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
1715 T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
1716 dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
1717 dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
1718 dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
1719
1720 T1 = pParam->HSM2_sc3 / here->HSM2_lgate ;
1721 T4 = pParam->HSM2_sc1 + T1 * Pbsum ;
1722 T4_dVb = T1 * Pbsum_dVb ;
1723 T4_dVd = T1 * Pbsum_dVd ;
1724 T4_dVg = T1 * Pbsum_dVg ;
1725
1726 T5 = T4 + pParam->HSM2_sc2 * Vdsz * ( 1.0 + model->HSM2_sc4 * Pbsum );
1727 T5_dVb = T4_dVb + pParam->HSM2_sc2 * Vdsz * model->HSM2_sc4 * Pbsum_dVb
1728 + pParam->HSM2_sc2 * Vdsz_dVbs * model->HSM2_sc4 * Pbsum;
1729 T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds * ( 1.0 + model->HSM2_sc4 * Pbsum )
1730 + pParam->HSM2_sc2 * Vdsz * model->HSM2_sc4 * Pbsum_dVd;
1731 T5_dVg = T4_dVg + pParam->HSM2_sc2 * Vdsz * model->HSM2_sc4 * Pbsum_dVg;
1732
1733
1734 dVthSC = dVth0 * T5 ;
1735 dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ;
1736 dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ;
1737 dVthSC_dVg = dVth0_dVg * T5 + dVth0 * T5_dVg ;
1738
1739 /*---------------------------------------------------*
1740 * dVthW : narrow-channel effect.
1741 *-----------------*/
1742 T1 = 1.0 / Cox ;
1743 T2 = T1 * T1 ;
1744 T3 = 1.0 / ( Cox + pParam->HSM2_wfc / Weff ) ;
1745 T4 = T3 * T3 ;
1746 T5 = T1 - T3 ;
1747 T6 = Qb0 * ( T2 - T4 ) ;
1748
1749 dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ;
1750 dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ;
1751 dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ;
1752 dVthW_dVg = - Cox_dVg * T6 ;
1753
1754 /*---------------------------------------------------*
1755 * dVth : Total variation.
1756 * - Positive dVth means the decrease in Vth.
1757 *-----------------*/
1758 dVth = dVthSC + dVthLP + dVthW + here->HSM2_dVthsm ;
1759 dVth_dVb = dVthSC_dVb + dVthLP_dVb + dVthW_dVb ;
1760 dVth_dVd = dVthSC_dVd + dVthLP_dVd + dVthW_dVd ;
1761 dVth_dVg = dVthSC_dVg + dVthLP_dVg + dVthW_dVg ;
1762
1763 /*---------------------------------------------------*
1764 * Vth : Threshold voltagei for OP.
1765 *-----------------*/
1766 T2 = sqrt( here->HSM2_2qnsub_esi * (Pb2-Vbsz) ) ;
1767 Vth = Pb2 + Vfb + T2 * Cox0_inv - dVth ;
1768
1769 /*-----------------------------------------------------------*
1770 * Constants in the equation of Ps0 .
1771 *-----------------*/
1772
1773 fac1 = cnst0 * Cox_inv ;
1774 fac1_dVbs = cnst0 * Cox_inv_dVb ;
1775 fac1_dVds = cnst0 * Cox_inv_dVd ;
1776 fac1_dVgs = cnst0 * Cox_inv_dVg ;
1777
1778 fac1p2 = fac1 * fac1 ;
1779
1780 /*---------------------------------------------------*
1781 * Poly-Depletion Effect
1782 *-----------------*/
1783
1784 dPpg = 0.0 ;
1785 dPpg_dVb = 0.0 ;
1786 dPpg_dVd = 0.0 ;
1787 dPpg_dVg = 0.0 ;
1788
1789 if ( here->HSM2_flg_pgd == 1 ) {
1790
1791 T7 = Vgsz ;
1792 T7_dVb = Vgsz_dVbs ;
1793 T7_dVd = Vgsz_dVds ;
1794 T7_dVg = Vgsz_dVgs ;
1795
1796 T0 = here->HSM2_cnstpgd ;
1797
1798 T3 = T7 - model->HSM2_pgd2 ;
1799 T3_dVb = T7_dVb ;
1800 T3_dVd = T7_dVd ;
1801 T3_dVg = T7_dVg ;
1802
1803 Fn_ExpLim( dPpg , T3 , T6 ) ;
1804 dPpg_dVb = T6 * T3_dVb ;
1805 dPpg_dVd = T6 * T3_dVd ;
1806 dPpg_dVg = T6 * T3_dVg ;
1807
1808 Fn_SZ( dPpg , dPpg - 1.0 , pol_dlt , T6 ) ;
1809 dPpg_dVb *= T6 ;
1810 dPpg_dVd *= T6 ;
1811 dPpg_dVg *= T6 ;
1812
1813 dPpg *= T0 ;
1814 dPpg_dVb *= T0 ;
1815 dPpg_dVd *= T0 ;
1816 dPpg_dVg *= T0 ;
1817
1818 Fn_SU( dPpg , dPpg , pol_b , pol_dlt , T9 ) ;
1819 dPpg_dVb *= T9 ;
1820 dPpg_dVd *= T9 ;
1821 dPpg_dVg *= T9 ;
1822
1823 }
1824
1825 /*---------------------------------------------------*
1826 * Vgp : Effective gate bias with SCE & RSCE & flatband.
1827 *-----------------*/
1828 Vgp = Vgs - Vfb + dVth - dPpg ;
1829 Vgp_dVbs = dVth_dVb - dPpg_dVb ;
1830 Vgp_dVds = dVth_dVd - dPpg_dVd ;
1831 Vgp_dVgs = 1.0e0 + dVth_dVg - dPpg_dVg ;
1832
1833 /*---------------------------------------------------*
1834 * Vgs_fb : Actual flatband voltage taking account Vbs.
1835 * - note: if Vgs == Vgs_fb then Vgp == Ps0 == Vbs .
1836 *------------------*/
1837 Vgs_fb = Vfb - dVth + dPpg + Vbs ;
1838
1839 #include "hsm2eval_dep.h"
1840
1841 } else {
1842
1843 /*---------------------------------------------------*
1844 * Normal mode MOSFET
1845 *------------------*/
1846
1847 /*-----------------------------------------------------------*
1848 * start of the loop.
1849 *-----------------*/
1850 for ( lp_bs = 1 ; lp_bs <= lp_bs_max ; lp_bs ++ ) {
1851
1852 Ids_last = Ids ;
1853 /* Initialization of counters is needed for restart. */
1854 lp_s0 = 0 ;
1855 lp_sl = 0 ;
1856
1857 /*-----------------------------------------------------------*
1858 * Vxsz: Modified bias introduced to realize symmetry at Vds=0.
1859 *-----------------*/
1860
1861 T1 = Vbsc_dVbse * Vds / 2 ;
1862 Fn_SymAdd( Vzadd , T1 , model->HSM2_vzadd0 , T2 ) ;
1863 T2 *= Vbsc_dVbse / 2 ;
1864 Vzadd_dVds = T2 ;
1865
1866 if ( Vzadd < ps_conv ) {
1867 Vzadd = ps_conv ;
1868 Vzadd_dVds = 0.0 ;
1869 }
1870
1871 Vbsz = Vbs + Vzadd ;
1872 Vbsz_dVbs = 1.0 ;
1873 Vbsz_dVds = Vzadd_dVds ;
1874
1875 Vdsz = Vds + 2.0 * Vzadd ;
1876 Vdsz_dVds = 1.0 + 2.0 * Vzadd_dVds ;
1877
1878 Vgsz = Vgs + Vzadd ;
1879 Vgsz_dVgs = 1.0 ;
1880 Vgsz_dVds = Vzadd_dVds ;
1881
1882 /*---------------------------------------------------*
1883 * Factor of modification for symmetry.
1884 *-----------------*/
1885
1886 T1 = here->HSM2_qnsub_esi * Cox0_inv * Cox0_inv ;
1887 T2 = Vgs - Vfb ;
1888 T3 = 1 + 2.0 / T1 * ( T2 - beta_inv - Vbs ) ;
1889 Fn_SZ( T4 , T3 , 1e-3 , T5 ) ;
1890 TX = sqrt( T4 ) ;
1891 Pslsat = T2 + T1 * ( 1.0 - TX ) ;
1892 VdsatS = Pslsat - Pb2 ;
1893 Fn_SL( VdsatS , VdsatS , 0.1 , 5e-2 , T6 ) ;
1894
1895 VdsatS_dVbs = ( TX ? (T6 * T5 / TX ) : 0.0 ) ;
1896 VdsatS_dVds = 0.0 ;
1897 VdsatS_dVgs = ( TX ? (T6 * ( 1.0 - T5 / TX )) : 0.0 ) ;
1898
1899
1900 T1 = Vds / VdsatS ;
1901 Fn_SUPoly4( TX , T1 , 1.0 , T0 ) ;
1902 FMDVDS = TX * TX ;
1903 T2 = 2 * TX * T0 ;
1904 T3 = T2 / ( VdsatS * VdsatS ) ;
1905 FMDVDS_dVbs = T3 * ( - Vds * VdsatS_dVbs ) ;
1906 FMDVDS_dVds = T3 * ( 1.0 * VdsatS - Vds * VdsatS_dVds ) ;
1907 FMDVDS_dVgs = T3 * ( - Vds * VdsatS_dVgs ) ;
1908
1909 /*-----------------------------------------------------------*
1910 * Quantum effect
1911 *-----------------*/
1912 if ( model->HSM2_flg_qme == 0 ) {
1913 flg_qme = 0 ;
1914 } else {
1915 flg_qme = 1 ;
1916 }
1917
1918
1919 T1 = here->HSM2_2qnsub_esi ;
1920 T2 = sqrt( T1 * Pb20 ) ;
1921 Vthq = Pb20 + Vfb + T2 * Cox0_inv ;
1922 Vthq_dVb = 0.0 ;
1923 Vthq_dVd = 0.0 ;
1924
1925 if ( flg_qme == 0 ) {
1926 Tox = Tox0 ;
1927 Tox_dVb = 0.0 ;
1928 Tox_dVd = 0.0 ;
1929 Tox_dVg = 0.0 ;
1930
1931 Cox = Cox0 ;
1932 Cox_dVb = 0.0 ;
1933 Cox_dVd = 0.0 ;
1934 Cox_dVg = 0.0 ;
1935
1936 Cox_inv = Cox0_inv ;
1937 Cox_inv_dVb = 0.0 ;
1938 Cox_inv_dVd = 0.0 ;
1939 Cox_inv_dVg = 0.0 ;
1940
1941 T0 = cnst0 * cnst0 * Cox_inv ;
1942 cnstCoxi = T0 * Cox_inv ;
1943 cnstCoxi_dVb = 0.0 ;
1944 cnstCoxi_dVd = 0.0 ;
1945 cnstCoxi_dVg = 0.0 ;
1946 } else {
1947
1948 T5 = Vgs - Vbs - Vthq + model->HSM2_qme2 ;
1949 T5_dVb = -1.0 - Vthq_dVb ;
1950 T5_dVd = - Vthq_dVd ;
1951 T5_dVg = 1.0 ;
1952 Fn_SZ( T2 , T5 , qme_dlt, T3) ;
1953 T2 = T2 + small ;
1954 T2_dVb = T3 * T5_dVb ;
1955 T2_dVd = T3 * T5_dVd ;
1956 T2_dVg = T3 * T5_dVg ;
1957
1958 T3 = 1.0 / T2 ;
1959 T7 = -1.0 / ( T2 * T2 ) ;
1960 T3_dVb = T7 * T2_dVb ;
1961 T3_dVd = T7 * T2_dVd ;
1962 T3_dVg = T7 * T2_dVg ;
1963
1964 T4 = 2.0 * fabs(Vthq) ;
1965 T6 = Vfb - Vthq + model->HSM2_qme2 ;
1966 if(T6 > T4) { T4 = T6; }
1967
1968 Fn_SU( T2 , T3 , 1.0 / T4 , qme_dlt, T6 ) ;
1969 T2_dVb = T6 * T3_dVb ;
1970 T2_dVd = T6 * T3_dVd ;
1971 T2_dVg = T6 * T3_dVg ;
1972
1973 dTox = model->HSM2_qme1 * T2 + model->HSM2_qme3 ;
1974 T7 = model->HSM2_qme1 ;
1975 dTox_dVb = T7 * T2_dVb ;
1976 dTox_dVd = T7 * T2_dVd ;
1977 dTox_dVg = T7 * T2_dVg ;
1978
1979 if ( dTox * 1.0e12 < Tox0 ) {
1980 dTox = 0.0 ;
1981 dTox_dVb = 0.0 ;
1982 dTox_dVd = 0.0 ;
1983 dTox_dVg = 0.0 ;
1984 flg_qme = 0 ;
1985 }
1986
1987 Tox = Tox0 + dTox ;
1988 Tox_dVb = dTox_dVb ;
1989 Tox_dVd = dTox_dVd ;
1990 Tox_dVg = dTox_dVg ;
1991
1992 Cox = c_eox / Tox ;
1993 T1 = - c_eox / ( Tox * Tox ) ;
1994 Cox_dVb = T1 * Tox_dVb ;
1995 Cox_dVd = T1 * Tox_dVd ;
1996 Cox_dVg = T1 * Tox_dVg ;
1997
1998 Cox_inv = Tox / c_eox ;
1999 T1 = 1.0 / c_eox ;
2000 Cox_inv_dVb = T1 * Tox_dVb ;
2001 Cox_inv_dVd = T1 * Tox_dVd ;
2002 Cox_inv_dVg = T1 * Tox_dVg ;
2003
2004 T0 = cnst0 * cnst0 * Cox_inv ;
2005 cnstCoxi = T0 * Cox_inv ;
2006 T1 = 2.0 * T0 ;
2007 cnstCoxi_dVb = T1 * Cox_inv_dVb ;
2008 cnstCoxi_dVd = T1 * Cox_inv_dVd ;
2009 cnstCoxi_dVg = T1 * Cox_inv_dVg ;
2010 }
2011
2012
2013 fac1 = cnst0 * Cox_inv ;
2014 fac1_dVds = cnst0 * Cox_inv_dVd ;
2015 fac1_dVgs = cnst0 * Cox_inv_dVg ;
2016 fac1_dVbs = cnst0 * Cox_inv_dVb ;
2017 fac1p2 = fac1 * fac1 ;
2018
2019 /* Ps0_min: approx. solution of Poisson equation at Vgs_min */
2020 /* ( easy to improve, if necessary ) */
2021 Ps0_min = 2.0 * beta_inv * log(-Vgs_min/fac1) ;
2022 Ps0_min_dVds = -2.0 * beta_inv * fac1_dVds / fac1 ;
2023 Ps0_min_dVgs = -2.0 * beta_inv * fac1_dVgs / fac1 ;
2024 Ps0_min_dVbs = -2.0 * beta_inv * fac1_dVbs / fac1 ;
2025
2026
2027 /*---------------------------------------------------*
2028 * Vbsz2 : Vbs for dVth
2029 *-----------------*/
2030 Vbsz2 = Vbsz ;
2031 Vbsz2_dVbs = Vbsz_dVbs ;
2032 Vbsz2_dVds = Vbsz_dVds ;
2033 Vbsz2_dVgs = 0.0 ;
2034
2035 if ( corecip ) {
2036
2037 /* ************************** */
2038 /* Initial value for PS0Z_SCE */
2039 /* ************************** */
2040
2041 T1 = dP_max + dP_max ;
2042
2043 if ( flg_pprv >= 1 ) {
2044 /* -------------------------- *
2045 * Extrapolate previous value *
2046 * -------------------------- */
2047
2048 T1 = here->HSM2_PS0Z_SCE_dvbs_prv * dVbs
2049 + here->HSM2_PS0Z_SCE_dvds_prv * dVds
2050 + here->HSM2_PS0Z_SCE_dvgs_prv * dVgs ;
2051
2052 if ( fabs(T1) <= dP_max ) {
2053 Ps0_ini = here->HSM2_PS0Z_SCE_prv + T1 ; /* take extrapolated value */
2054 Ps0_ini_dVds = here->HSM2_PS0Z_SCE_dvds_prv ;
2055 Ps0_ini_dVgs = here->HSM2_PS0Z_SCE_dvgs_prv ;
2056 Ps0_ini_dVbs = here->HSM2_PS0Z_SCE_dvbs_prv ;
2057 }
2058 } /* end of (flg_pprv >=1) if-block */
2059
2060 if ( fabs(T1) > dP_max) {
2061 /* ------------------------------------- *
2062 * Analytical initial value for PS0Z_SCE *
2063 * ------------------------------------- */
2064
2065
2066 T1 = here->HSM2_2qnsub_esi ;
2067 T2 = sqrt( T1 * ( Pb20 - Vbsz ) ) ;
2068 Vthq = Pb20 + Vfb + T2 * Cox0_inv ;
2069 Vth = Vthq ;
2070
2071 TX = 4.0e0 * ( beta * ( Vgs - Vbs ) - 1.0e0 ) / ( fac1p2 * beta2 ) ;
2072 TX_dVds = - 2.0 * TX / fac1 * fac1_dVds ;
2073 TX_dVgs = - 2.0 * TX / fac1 * fac1_dVgs + 4.0 * beta / ( fac1p2 * beta2 ) ;
2074 TX_dVbs = - 2.0 * TX / fac1 * fac1_dVbs - 4.0 * beta / ( fac1p2 * beta2 ) ;
2075 TX += 1.0 ;
2076 if ( TX > epsm10 ) {
2077 T3 = sqrt( TX ) ;
2078 T3_dVd = 0.5 * TX_dVds / T3 ;
2079 T3_dVg = 0.5 * TX_dVgs / T3 ;
2080 T3_dVb = 0.5 * TX_dVbs / T3 ;
2081 } else {
2082 T3 = sqrt( epsm10 ) ;
2083 T3_dVd = T3_dVg = T3_dVb = 0.0 ;
2084 }
2085 Ps0_iniA = Vgs + fac1p2 * beta * 0.5 * ( 1.0e0 - T3 ) ;
2086 Ps0_iniA_dVds = fac1 * beta * ( 1.0 - T3 ) * fac1_dVds - fac1p2 * beta * 0.5 * T3_dVd ;
2087 Ps0_iniA_dVgs = 1.0 + fac1 * beta * ( 1.0 - T3 ) * fac1_dVgs - fac1p2 * beta * 0.5 * T3_dVg ;
2088 Ps0_iniA_dVbs = fac1 * beta * ( 1.0 - T3 ) * fac1_dVbs - fac1p2 * beta * 0.5 * T3_dVb ;
2089
2090 Chi = beta * ( Ps0_iniA - Vbs ) ;
2091
2092 if ( Chi < znbd3 ) {
2093 /*-----------------------------------*
2094 * zone-D1/D2
2095 * - Ps0_ini is the analytical solution of Qs=Qb0 with
2096 * Qb0 being approximated to 3-degree polynomial.
2097 *-----------------*/
2098 TY = beta * ( Vgs - Vbs ) ;
2099 TY_dVds = 0.0 ;
2100 TY_dVgs = beta ;
2101 TY_dVbs = - beta ;
2102 T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ;
2103 T1_dVd = - T1 / fac1 * fac1_dVds ;
2104 T1_dVg = - T1 / fac1 * fac1_dVgs ;
2105 T1_dVb = - T1 / fac1 * fac1_dVbs ;
2106 T2 = 81.0 + 3.0 * T1 ;
2107 T2_dVd = 3.0 * T1_dVd ;
2108 T2_dVg = 3.0 * T1_dVg ;
2109 T2_dVb = 3.0 * T1_dVb ;
2110 T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ;
2111 T3_dVd = ( - 81.0 + 27.0 * TY ) * T1_dVd + 27.0 * T1 * TY_dVds ;
2112 T3_dVg = ( - 81.0 + 27.0 * TY ) * T1_dVg + 27.0 * T1 * TY_dVgs ;
2113 T3_dVb = ( - 81.0 + 27.0 * TY ) * T1_dVb + 27.0 * T1 * TY_dVbs ;
2114 T4 = T3 ;
2115 T4_dVd = T3_dVd ;
2116 T4_dVg = T3_dVg ;
2117 T4_dVb = T3_dVb ;
2118 T6 = sqrt( 4 * T2 * T2 * T2 + T4 * T4 ) ;
2119 T6_dVd = ( 6.0 * T2 * T2 * T2_dVd + T4 * T4_dVd ) / T6 ;
2120 T6_dVg = ( 6.0 * T2 * T2 * T2_dVg + T4 * T4_dVg ) / T6 ;
2121 T6_dVb = ( 6.0 * T2 * T2 * T2_dVb + T4 * T4_dVb ) / T6 ;
2122 T5 = Fn_Pow( T3 + T6 , C_1o3 ) ;
2123 T5_dVd = ( T3_dVd + T6_dVd ) / ( 3.0 * T5 * T5 ) ;
2124 T5_dVg = ( T3_dVg + T6_dVg ) / ( 3.0 * T5 * T5 ) ;
2125 T5_dVb = ( T3_dVb + T6_dVb ) / ( 3.0 * T5 * T5 ) ;
2126
2127 TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 )
2128 + 1 / ( 3.0 * C_2p_1o3 ) * T5 ;
2129 TX_dVds = - C_2p_1o3 / (3.0 * T5) * T2_dVd + ( C_2p_1o3 * T2 / (3.0 * T5 * T5) + 1.0 / (3.0 * C_2p_1o3) ) * T5_dVd ;
2130 TX_dVgs = - C_2p_1o3 / (3.0 * T5) * T2_dVg + ( C_2p_1o3 * T2 / (3.0 * T5 * T5) + 1.0 / (3.0 * C_2p_1o3) ) * T5_dVg ;
2131 TX_dVbs = - C_2p_1o3 / (3.0 * T5) * T2_dVb + ( C_2p_1o3 * T2 / (3.0 * T5 * T5) + 1.0 / (3.0 * C_2p_1o3) ) * T5_dVb ;
2132
2133 Ps0_iniA = TX * beta_inv + Vbs ;
2134 Ps0_iniA_dVds = TX_dVds * beta_inv ;
2135 Ps0_iniA_dVgs = TX_dVgs * beta_inv ;
2136 Ps0_iniA_dVbs = TX_dVbs * beta_inv + 1.0 ;
2137 Ps0_ini = Ps0_iniA ;
2138 Ps0_ini_dVds = Ps0_iniA_dVds ;
2139 Ps0_ini_dVgs = Ps0_iniA_dVgs ;
2140 Ps0_ini_dVbs = Ps0_iniA_dVbs ;
2141
2142 } else if ( Vgs <= Vth ) {
2143 /*-----------------------------------*
2144 * Weak inversion zone.
2145 *-----------------*/
2146 Ps0_ini = Ps0_iniA ;
2147 Ps0_ini_dVds = Ps0_iniA_dVds ;
2148 Ps0_ini_dVgs = Ps0_iniA_dVgs ;
2149 Ps0_ini_dVbs = Ps0_iniA_dVbs ;
2150
2151 } else {
2152 /*-----------------------------------*
2153 * Strong inversion zone.
2154 * - Ps0_iniB : upper bound.
2155 *-----------------*/
2156 T1 = 1.0 / cnst1 / cnstCoxi ;
2157 T1_dVd = - T1 / cnstCoxi * cnstCoxi_dVd ;
2158 T1_dVg = - T1 / cnstCoxi * cnstCoxi_dVg ;
2159 T1_dVb = - T1 / cnstCoxi * cnstCoxi_dVb ;
2160 T0 = Vgs - Vfb ;
2161 T2 = T1 * T0 * T0 ;
2162 T2_dVd = T1_dVd * T0 * T0 ;
2163 T2_dVg = T1_dVg * T0 * T0 + 2.0 * T1 * T0 ;
2164 T2_dVb = T1_dVb * T0 * T0 ;
2165 T3 = beta + 2.0 / T0 ;
2166 T3_dVg = -2.0 / (T0 * T0) ;
2167
2168 Ps0_iniB = log( T2 + small ) / T3 ;
2169 Ps0_iniB_dVds = T2_dVd / (T2 * T3) ;
2170 Ps0_iniB_dVgs = T2_dVg / (T2 * T3) - T3_dVg * Ps0_iniB / T3 ;
2171 Ps0_iniB_dVbs = T2_dVb / (T2 * T3) ;
2172
2173 Fn_SU2( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1,T2) ;
2174 Ps0_ini_dVds = Ps0_iniA_dVds * T1 + Ps0_iniB_dVds * T2 ;
2175 Ps0_ini_dVgs = Ps0_iniA_dVgs * T1 + Ps0_iniB_dVgs * T2 ;
2176 Ps0_ini_dVbs = Ps0_iniA_dVbs * T1 + Ps0_iniB_dVbs * T2 ;
2177 }
2178 } /* end of initial value calulation */
2179
2180 /**************************/
2181
2182 /* initial value for SCE LOOP */
2183 PS0_SCE = Ps0_ini ;
2184 PS0_SCE_dVds = Ps0_ini_dVds ;
2185 PS0_SCE_dVgs = Ps0_ini_dVgs ;
2186 PS0_SCE_dVbs = Ps0_ini_dVbs ;
2187
2188 PS0Z_SCE = Ps0_ini ;
2189 PS0Z_SCE_dVds = Ps0_ini_dVds ;
2190 PS0Z_SCE_dVgs = Ps0_ini_dVgs ;
2191 PS0Z_SCE_dVbs = Ps0_ini_dVbs ;
2192 } /* end of corecip=1 case (initial value calculation) */
2193
2194 MAX_LOOP_SCE = 5 ;
2195 NNN = 0 ;
2196
2197 /* ************************************************************************* */
2198
2199 // START_OF_SCE_LOOP : /* outer loop of multi level Newton framework */
2200 START_OF_SCE_LOOP = 1 ; end_of_part_1 = 0 ;
2201 while( START_OF_SCE_LOOP ) { /* Begin: 1st SCE LOOP */
2202 while( START_OF_SCE_LOOP ) { /* Begin: 2nd SCE LOOP */
2203 while( START_OF_SCE_LOOP ) { /* Begin: 3rd SCE LOOP */
2204 START_OF_SCE_LOOP = 0 ;
2205
2206 /* ************************************************************************* */
2207
2208 /* for multi level Newton method we need the derivatives */
2209 /* with respect to PS0Z_SCE */
2210 /* naming convention: ..._dPS0Z means d.../dPS0Z_SCE */
2211
2212
2213 if ( flg_qme == 1 ) {
2214 /*---------------------------------------------------*
2215 * Vthp : Vth with pocket.
2216 *-----------------*/
2217
2218 if( corecip ){
2219
2220 T1 = here->HSM2_2qnsub_esi ;
2221 Qb0 = sqrt ( T1 ) ;
2222 Qb0_dVb = 0.0 ;
2223 Qb0_dVd = 0.0 ;
2224 Qb0_dVg = 0.0 ;
2225
2226 Vthp = PS0Z_SCE + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr ;
2227 Vthp_dVb = PS0Z_SCE_dVbs + Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ;
2228 Vthp_dVd = PS0Z_SCE_dVds + Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ;
2229 Vthp_dVg = PS0Z_SCE_dVgs + Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ;
2230 Vthp_dPS0Z = 1.0 ;
2231
2232 }else{ /* original */
2233 T1 = here->HSM2_2qnsub_esi ;
2234 Qb0 = sqrt (T1 * (Pb20 - Vbsz2)) ;
2235 T2 = 0.5 * T1 / Qb0 ;
2236 Qb0_dVb = T2 * (- Vbsz2_dVbs) ;
2237 Qb0_dVd = T2 * (- Vbsz2_dVds) ;
2238 Qb0_dVg = T2 * (- Vbsz2_dVgs) ;
2239
2240 Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr;
2241 Vthp_dVb = Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ;
2242 Vthp_dVd = Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ;
2243 Vthp_dVg = Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ;
2244 }
2245
2246
2247 Pb20b = Pb20 ;
2248 Pb20b_dVb = 0.0 ;
2249 Pb20b_dVd = 0.0 ;
2250 Pb20b_dVg = 0.0 ;
2251
2252 T0 = 0.95 ;
2253 T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ;
2254 T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ;
2255 T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ;
2256 T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ;
2257 T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ;
2258 T3 = T0 * Pb20b - 0.5 * (T1 + T2) ;
2259 T4 = 2.0 * T0 * 1.0e-3 ;
2260 T5 = T1 / T2 ;
2261 T6 = T4 / T2 ;
2262 T3_dVb = T0 * Pb20b_dVb
2263 - 0.5 * (T1_dVb + (T1_dVb * T5 + T6 * Pb20b_dVb ) ) ;
2264 T3_dVd = T0 * Pb20b_dVd
2265 - 0.5 * (T1_dVd + (T1_dVd * T5 + T6 * Pb20b_dVd ) ) ;
2266 T3_dVg = T0 * Pb20b_dVg
2267 - 0.5 * (T1_dVg + (T1_dVg * T5 + T6 * Pb20b_dVg ) ) ;
2268 Pbsum = Pb20b - T3 ;
2269 Pbsum_dVb = Pb20b_dVb - T3_dVb ;
2270 Pbsum_dVd = Pb20b_dVd - T3_dVd ;
2271 Pbsum_dVg = Pb20b_dVg - T3_dVg ;
2272
2273 sqrt_Pbsum = sqrt( Pbsum ) ;
2274
2275 /*-------------------------------------------*
2276 * dVthLP : Short-channel effect induced by pocket.
2277 * - Vth0 : Vth without pocket.
2278 *-----------------*/
2279 if ( model->HSM2_lp != 0.0 ) {
2280
2281 if( corecip ){
2282
2283 T1 = here->HSM2_2qnsub_esi ;
2284 T2 = model->HSM2_bs2 - Vbsz2 ;
2285 T3 = T2 + small ;
2286 T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ;
2287 T5 = 0.5 * (T3 + T4) ;
2288 T6 = 0.5 * (1.0 + T3 / T4) ;
2289 T5_dVb = - Vbsz2_dVbs * T6 ;
2290 T5_dVd = - Vbsz2_dVds * T6 ;
2291 T5_dVg = - Vbsz2_dVgs * T6 ;
2292 T7 = 1.0 / T5 ;
2293 bs12 = model->HSM2_bs1 * T7 ;
2294 T8 = - bs12 * T7 ;
2295 bs12_dVb = T8 * T5_dVb ;
2296 bs12_dVd = T8 * T5_dVd ;
2297 bs12_dVg = T8 * T5_dVg ;
2298
2299 T1 = 0.93 * ( PS0Z_SCE + Ps0_min - Vbsz2 );
2300 T1_dVb = 0.93 * ( PS0Z_SCE_dVbs + Ps0_min_dVbs - Vbsz2_dVbs );
2301 T1_dVd = 0.93 * ( PS0Z_SCE_dVds + Ps0_min_dVds - Vbsz2_dVds );
2302 T1_dVg = 0.93 * ( PS0Z_SCE_dVgs + Ps0_min_dVgs - Vbsz2_dVgs );
2303 T1_dPS0Z = 0.93 ;
2304
2305 T2 = bs12 ;
2306 T2_dVb = bs12_dVb ;
2307 T2_dVd = bs12_dVd ;
2308 T2_dVg = bs12_dVg ;
2309
2310 Fn_SU2( T10 , T2 , T1 , vth_dlt, T0, T3 ) ;
2311 T10_dVb = T2_dVb * T0 + T1_dVb * T3 ;
2312 T10_dVd = T2_dVd * T0 + T1_dVd * T3 ;
2313 T10_dVg = T2_dVg * T0 + T1_dVg * T3 ;
2314 T10_dPS0Z = T1_dPS0Z * T3 ;
2315
2316 T4 = here->HSM2_2qnsub_esi * ( PS0Z_SCE + Ps0_min - Vbsz2 - T10 ) ;
2317 T4_dVb = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVbs + Ps0_min_dVbs - Vbsz2_dVbs - T10_dVb ) ;
2318 T4_dVd = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVds + Ps0_min_dVds - Vbsz2_dVds - T10_dVd ) ;
2319 T4_dVg = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVgs + Ps0_min_dVgs - Vbsz2_dVgs - T10_dVg ) ;
2320 T4_dPS0Z = here->HSM2_2qnsub_esi * ( 1.0 - T10_dPS0Z ) ;
2321
2322 if (T4 > arg2){
2323 Qbmm = sqrt ( T4 ) ;
2324 Qbmm_dVb = 0.5 / Qbmm * T4_dVb ;
2325 Qbmm_dVd = 0.5 / Qbmm * T4_dVd ;
2326 Qbmm_dVg = 0.5 / Qbmm * T4_dVg ;
2327 Qbmm_dPS0Z = 0.5 / Qbmm * T4_dPS0Z ;
2328 } else {
2329 Qbmm = sqrt(arg2) + 0.5 / sqrt(arg2) * ( T4 - arg2) ;
2330 Qbmm_dVb = 0.5 / sqrt(arg2) * T4_dVb ;
2331 Qbmm_dVd = 0.5 / sqrt(arg2) * T4_dVd ;
2332 Qbmm_dVg = 0.5 / sqrt(arg2) * T4_dVg ;
2333 Qbmm_dPS0Z = 0.5 / sqrt(arg2) * T4_dPS0Z ;
2334 }
2335
2336 dqb = ( Qb0 - Qbmm ) * Cox_inv ;
2337 dqb_dVb = ( Qb0_dVb - Qbmm_dVb ) * Cox_inv + ( Qb0 - Qbmm ) * Cox_inv_dVb ;
2338 dqb_dVd = ( Qb0_dVd - Qbmm_dVd ) * Cox_inv + ( Qb0 - Qbmm ) * Cox_inv_dVd ;
2339 dqb_dVg = ( Qb0_dVg - Qbmm_dVg ) * Cox_inv + ( Qb0 - Qbmm ) * Cox_inv_dVg ;
2340 dqb_dPS0Z = - Qbmm_dPS0Z * Cox_inv ;
2341
2342 if( codqb == 0 ){
2343 dqb = 0.0 ;
2344 dqb_dVb = 0.0 ;
2345 dqb_dVd = 0.0 ;
2346 dqb_dVg = 0.0 ;
2347 dqb_dPS0Z = 0.0 ;
2348 }
2349
2350 T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ;
2351 T2 = sqrt( T1 ) ;
2352 T2_dVb = 0.0 ;
2353 T2_dVd = 0.0 ;
2354 T2_dVg = 0.0 ;
2355
2356 Vth0 = PS0Z_SCE + Vfb + T2 * Cox_inv ;
2357 Vth0_dVb = PS0Z_SCE_dVbs + T2_dVb * Cox_inv + T2 * Cox_inv_dVb ;
2358 Vth0_dVd = PS0Z_SCE_dVds + T2_dVd * Cox_inv + T2 * Cox_inv_dVd ;
2359 Vth0_dVg = PS0Z_SCE_dVgs + T2_dVg * Cox_inv + T2 * Cox_inv_dVg ;
2360 Vth0_dPS0Z = 1.0 ;
2361
2362 T1 = C_ESI * Cox_inv ;
2363 T1_dVb = C_ESI * Cox_inv_dVb ;
2364 T1_dVd = C_ESI * Cox_inv_dVd ;
2365 T1_dVg = C_ESI * Cox_inv_dVg ;
2366 T2 = here->HSM2_wdplp ;
2367
2368 T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ;
2369 T3 = 2.0 * ( model->HSM2_vbi - Pb20 ) * T2 * T4 ;
2370
2371 T5 = T1 * T3 ;
2372 T5_dVb = T1_dVb * T3 ;
2373 T5_dVd = T1_dVd * T3 ;
2374 T5_dVg = T1_dVg * T3 ;
2375
2376 T6 = PS0Z_SCE - Vbsz ;
2377 T6_dVb = PS0Z_SCE_dVbs - Vbsz_dVbs ;
2378 T6_dVd = PS0Z_SCE_dVds - Vbsz_dVds ;
2379 T6_dVg = PS0Z_SCE_dVgs ;
2380 T6_dPS0Z = 1.0 ;
2381
2382 Fn_SZ( T6, T6, C_sce_dlt, T0 );
2383 T6_dVb *= T0 ;
2384 T6_dVd *= T0 ;
2385 T6_dVg *= T0 ;
2386 T6_dPS0Z *= T0 ;
2387
2388 dVth0 = T5 * sqrt( T6 ) ;
2389 dVth0_dVb = T5 * 0.5 / sqrt( T6 ) * T6_dVb + T5_dVb * sqrt( T6 );
2390 dVth0_dVd = T5 * 0.5 / sqrt( T6 ) * T6_dVd + T5_dVd * sqrt( T6 ) ;
2391 dVth0_dVg = T5 * 0.5 / sqrt( T6 ) * T6_dVg + T5_dVg * sqrt( T6 ) ;
2392 dVth0_dPS0Z = T5 * 0.5 / sqrt( T6 ) * T6_dPS0Z ;
2393
2394 T1 = Vthp - Vth0 ;
2395 T1_dVb = Vthp_dVb - Vth0_dVb ;
2396 T1_dVd = Vthp_dVd - Vth0_dVd ;
2397 T1_dVg = Vthp_dVg - Vth0_dVg ;
2398 T1_dPS0Z = Vthp_dPS0Z - Vth0_dPS0Z ;
2399
2400 T9 = PS0Z_SCE - Vbsz2 ;
2401 T9_dVb = PS0Z_SCE_dVbs - Vbsz2_dVbs ;
2402 T9_dVd = PS0Z_SCE_dVds - Vbsz2_dVds ;
2403 T9_dVg = PS0Z_SCE_dVgs - Vbsz2_dVgs ;
2404 T9_dPS0Z = 1.0 ;
2405
2406 T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz ;
2407 T3_dVb = pParam->HSM2_scp3 * T9_dVb / model->HSM2_lp ;
2408 T3_dVd = pParam->HSM2_scp3 * T9_dVd / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz_dVds ;
2409 T3_dVg = pParam->HSM2_scp3 * T9_dVg / model->HSM2_lp ;
2410 T3_dPS0Z = pParam->HSM2_scp3 * T9_dPS0Z / model->HSM2_lp ;
2411
2412 Vdx = model->HSM2_scp21 + Vdsz ;
2413 Vdx2 = Vdx * Vdx + small ;
2414 T4 = Vdx * Vdx + small ;
2415 T4_dVb = 0.0 ;
2416 T4_dVd = 2.0 * Vdx * Vdsz_dVds ;
2417 T4_dVg = 0.0 ;
2418
2419 T5 = 1.0 / T4 ;
2420 T5_dVb = - T4_dVb / T4 / T4 ;
2421 T5_dVd = - T4_dVd / T4 / T4 ;
2422 T5_dVg = - T4_dVg / T4 / T4 ;
2423
2424 dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc * T5 ;
2425 dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb + dqb_dVb - here->HSM2_msc * T5_dVb ;
2426 dVthLP_dVd = T1_dVd * dVth0 * T3 + T1 * dVth0_dVd * T3 + T1 * dVth0 * T3_dVd + dqb_dVd - here->HSM2_msc * T5_dVd ;
2427 dVthLP_dVg = T1_dVg * dVth0 * T3 + T1 * dVth0_dVg * T3 + T1 * dVth0 * T3_dVg + dqb_dVg - here->HSM2_msc * T5_dVg ;
2428 dVthLP_dPS0Z = T1_dPS0Z * dVth0 * T3 + T1 * dVth0_dPS0Z * T3 + T1 * dVth0 * T3_dPS0Z + dqb_dPS0Z ;
2429
2430 }else{ /* original */
2431
2432 T1 = here->HSM2_2qnsub_esi ;
2433 T2 = model->HSM2_bs2 - Vbsz2 ;
2434 T3 = T2 + small ;
2435 T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ;
2436 T5 = 0.5 * (T3 + T4) ;
2437 T6 = 0.5 * (1.0 + T3 / T4) ;
2438 T5_dVb = - Vbsz2_dVbs * T6 ;
2439 T5_dVd = - Vbsz2_dVds * T6 ;
2440 T5_dVg = - Vbsz2_dVgs * T6 ;
2441 T7 = 1.0 / T5 ;
2442 bs12 = model->HSM2_bs1 * T7 ;
2443 T8 = - bs12 * T7 ;
2444 bs12_dVb = T8 * T5_dVb ;
2445 bs12_dVd = T8 * T5_dVd ;
2446 bs12_dVg = T8 * T5_dVg ;
2447 Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ;
2448 Qbmm = sqrt (T1 * (Pb20 - T10 )) ;
2449 T9 = T0 / Qbmm ;
2450 Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ;
2451 Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ;
2452 Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ;
2453
2454 dqb = (Qb0 - Qbmm) * Cox_inv ;
2455 dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv - Qbmm * Cox_inv_dVb ;
2456 dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv - Qbmm * Cox_inv_dVd ;
2457 dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv - Qbmm * Cox_inv_dVg ;
2458
2459 T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ;
2460 T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ;
2461 Vth0 = Pb2c + Vfb + T2 * Cox_inv ;
2462 T3 = 0.5 * T1 / T2 * Cox_inv ;
2463 Vth0_dVb = T3 * ( - Vbsz2_dVbs ) + T2 * Cox_inv_dVb ;
2464 Vth0_dVd = T3 * ( - Vbsz2_dVds ) + T2 * Cox_inv_dVd ;
2465 Vth0_dVg = T3 * ( - Vbsz2_dVgs ) + T2 * Cox_inv_dVg ;
2466
2467 T1 = C_ESI * Cox_inv ;
2468 T2 = here->HSM2_wdplp ;
2469 T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ;
2470 T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ;
2471 dVth0 = T5 * sqrt_Pbsum ;
2472 T6 = 0.5 * T5 / sqrt_Pbsum ;
2473 T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
2474 T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
2475 dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
2476 dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
2477 dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
2478
2479 T1 = Vthp - Vth0 ;
2480 T2 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * Pbsum / model->HSM2_lp ;
2481 T3 = T2 + pParam->HSM2_scp2 * Vdsz ;
2482
2483 Vdx = model->HSM2_scp21 + Vdsz ;
2484 Vdx2 = Vdx * Vdx + small ;
2485
2486 dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc / Vdx2 ;
2487 T4 = T1 * dVth0 * pParam->HSM2_scp3 / model->HSM2_lp ;
2488 dVthLP_dVb = (Vthp_dVb - Vth0_dVb) * dVth0 * T3 + T1 * dVth0_dVb * T3
2489 + T4 * Pbsum_dVb + dqb_dVb ;
2490 dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3
2491 + T4 * Pbsum_dVd
2492 + T1 * dVth0 * pParam->HSM2_scp2 * Vdsz_dVds
2493 + dqb_dVd
2494 + 2.0e0 * here->HSM2_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ;
2495 dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3
2496 + T4 * Pbsum_dVg + dqb_dVg ;
2497 }
2498
2499 } else {
2500 dVthLP = 0.0e0 ;
2501 dVthLP_dVb = 0.0e0 ;
2502 dVthLP_dVd = 0.0e0 ;
2503 dVthLP_dVg = 0.0e0 ;
2504 }
2505
2506 /*---------------------------------------------------*
2507 * dVthSC : Short-channel effect induced by Vds.
2508 *-----------------*/
2509
2510 if( corecip ){
2511
2512 T3 = here->HSM2_lgate - model->HSM2_parl2 ;
2513 T4 = 1.0e0 / ( T3 * T3 ) ;
2514 T5 = pParam->HSM2_sc3 / here->HSM2_lgate ;
2515
2516 T6 = pParam->HSM2_sc1 + T5 * ( PS0Z_SCE - Vbsz ) ;
2517 T6_dVb = T5 * ( PS0Z_SCE_dVbs - Vbsz_dVbs );
2518 T6_dVd = T5 * ( PS0Z_SCE_dVds - Vbsz_dVds );
2519 T6_dVg = T5 * PS0Z_SCE_dVgs ;
2520 T6_dPS0Z = T5 ;
2521
2522 /* QME:1 CORECIP:1 */
2523 if( pParam->HSM2_sc4 != 0 ){
2524 T8 = pParam->HSM2_sc4 * Vdsz * ( PS0Z_SCE - Vbsz ) ;
2525 T8_dVd = pParam->HSM2_sc4 * ( Vdsz_dVds * ( PS0Z_SCE - Vbsz ) + Vdsz * ( PS0Z_SCE_dVds - Vbsz_dVds ) ) ;
2526 T8_dVb = pParam->HSM2_sc4 * Vdsz * ( PS0Z_SCE_dVbs - Vbsz_dVbs ) ;
2527 T8_dVg = pParam->HSM2_sc4 * Vdsz * PS0Z_SCE_dVgs ;
2528 T8_dPS0Z = pParam->HSM2_sc4 * Vdsz ;
2529
2530 T1 = T6 + pParam->HSM2_sc2 * Vdsz + T8 ;
2531 T1_dVd = T6_dVd + pParam->HSM2_sc2 * Vdsz_dVds + T8_dVd ;
2532 T1_dVb = T6_dVb + T8_dVb ;
2533 T1_dVg = T6_dVg + T8_dVg ;
2534 T1_dPS0Z = T6_dPS0Z + T8_dPS0Z ;
2535 }else{
2536 T1 = T6 + pParam->HSM2_sc2 * Vdsz ;
2537 T1_dVb = T6_dVb ;
2538 T1_dVd = T6_dVd + pParam->HSM2_sc2 * Vdsz_dVds ;
2539 T1_dVg = T6_dVg ;
2540 T1_dPS0Z = T6_dPS0Z ;
2541 }
2542
2543 T0 = C_ESI * here->HSM2_wdpl * 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T4 ;
2544
2545 T2 = T0 * Cox_inv ;
2546 T2_dVb = T0 * Cox_inv_dVb ;
2547 T2_dVd = T0 * Cox_inv_dVd ;
2548 T2_dVg = T0 * Cox_inv_dVg ;
2549
2550 A = T2 * T1 ;
2551 A_dVbs = T2 * T1_dVb + T1 * T2_dVb ;
2552 A_dVds = T2 * T1_dVd + T1 * T2_dVd ;
2553 A_dVgs = T2 * T1_dVg + T1 * T2_dVg ;
2554 A_dPS0Z = T2 * T1_dPS0Z ;
2555
2556 T9 = PS0Z_SCE - Vbsz + Ps0_min ;
2557 T9_dVb = PS0Z_SCE_dVbs - Vbsz_dVbs + Ps0_min_dVbs ;
2558 T9_dVd = PS0Z_SCE_dVds - Vbsz_dVds + Ps0_min_dVds ;
2559 T9_dVg = PS0Z_SCE_dVgs + Ps0_min_dVgs ;
2560 T9_dPS0Z = 1.0 ;
2561
2562 if ( T9 > arg0 ) {
2563 T8 = sqrt( T9 ) ;
2564 T8_dVb = 0.5 * T9_dVb / T8 ;
2565 T8_dVd = 0.5 * T9_dVd / T8 ;
2566 T8_dVg = 0.5 * T9_dVg / T8 ;
2567 T8_dPS0Z = 0.5 * T9_dPS0Z / T8 ;
2568 } else {
2569 T8 = sqrt(arg0) + 0.5 / sqrt(arg0) * ( T9 - arg0) ;
2570 T8_dVb = 0.5 / sqrt(arg0) * T9_dVb ;
2571 T8_dVd = 0.5 / sqrt(arg0) * T9_dVd ;
2572 T8_dVg = 0.5 / sqrt(arg0) * T9_dVg ;
2573 T8_dPS0Z = 0.5 / sqrt(arg0) * T9_dPS0Z ;
2574 }
2575
2576 dVthSC = A * T8 ;
2577 dVthSC_dVb = A * T8_dVb + A_dVbs * T8;
2578 dVthSC_dVd = A * T8_dVd + A_dVds * T8;
2579 dVthSC_dVg = A * T8_dVg + A_dVgs * T8;
2580 dVthSC_dPS0Z = A * T8_dPS0Z + A_dPS0Z * T8;
2581
2582
2583 }else{ /* original */
2584
2585 T1 = C_ESI * Cox_inv ;
2586 T2 = here->HSM2_wdpl ;
2587 T3 = here->HSM2_lgate - model->HSM2_parl2 ;
2588 T4 = 1.0e0 / ( T3 * T3 ) ;
2589 T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ;
2590
2591 dVth0 = T5 * sqrt_Pbsum ;
2592 T6 = T5 / 2.0 / sqrt_Pbsum ;
2593 T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
2594 T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
2595 dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
2596 dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
2597 dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
2598
2599 T1 = pParam->HSM2_sc3 / here->HSM2_lgate ;
2600 T4 = pParam->HSM2_sc1 + T1 * Pbsum ;
2601 T4_dVb = T1 * Pbsum_dVb ;
2602 T4_dVd = T1 * Pbsum_dVd ;
2603 T4_dVg = T1 * Pbsum_dVg ;
2604
2605 /* QME:1 CORECIP:0 */
2606 if( pParam->HSM2_sc4 != 0 ){
2607 T8 = pParam->HSM2_sc4 * Vdsz * Pbsum ;
2608 T8_dVd = pParam->HSM2_sc4 * ( Vdsz_dVds * Pbsum + Vdsz * Pbsum_dVd ) ;
2609 T8_dVb = pParam->HSM2_sc4 * Vdsz * Pbsum_dVb ;
2610 T8_dVg = pParam->HSM2_sc4 * Vdsz * Pbsum_dVg ;
2611
2612 T5 = T4 + pParam->HSM2_sc2 * Vdsz + T8 ;
2613 T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds + T8_dVd ;
2614 T5_dVb = T4_dVb + T8_dVb ;
2615 T5_dVg = T4_dVg + T8_dVg ;
2616 }else{
2617 T5 = T4 + pParam->HSM2_sc2 * Vdsz ;
2618 T5_dVb = T4_dVb ;
2619 T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds ;
2620 T5_dVg = T4_dVg ;
2621 }
2622
2623 dVthSC = dVth0 * T5 ;
2624 dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ;
2625 dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ;
2626 dVthSC_dVg = dVth0_dVg * T5 + dVth0 * T5_dVg ;
2627
2628 }
2629
2630
2631 /*---------------------------------------------------*
2632 * dVthW : narrow-channel effect.
2633 *-----------------*/
2634 T1 = 1.0 / Cox ;
2635 T2 = T1 * T1 ;
2636 T3 = 1.0 / ( Cox + pParam->HSM2_wfc / Weff ) ;
2637 T4 = T3 * T3 ;
2638 T5 = T1 - T3 ;
2639 T6 = Qb0 * ( T2 - T4 ) ;
2640
2641 if( corecip ){
2642 dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ;
2643 dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ;
2644 dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ;
2645 dVthW_dVg = Qb0_dVg * T5 - Cox_dVg * T6 ;
2646 }else{ /* original */
2647 dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ;
2648 dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ;
2649 dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ;
2650 dVthW_dVg = - Cox_dVg * T6 ;
2651 }
2652
2653 /* end of case flg_qme = 1 */
2654
2655 } else {
2656
2657 /* now case flg_qme = 0 */
2658
2659 /*---------------------------------------------------*
2660 * Vthp : Vth with pocket.
2661 *-----------------*/
2662
2663 if( corecip ){
2664 T1 = here->HSM2_2qnsub_esi ;
2665 Qb0 = sqrt ( T1 ) ;
2666 Qb0_dVb = 0.0 ;
2667 Qb0_dVd = 0.0 ;
2668 Qb0_dVg = 0.0 ;
2669
2670 Vthp = PS0Z_SCE + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr;
2671 Vthp_dVb = PS0Z_SCE_dVbs + Qb0_dVb * Cox_inv ;
2672 Vthp_dVd = PS0Z_SCE_dVds + Qb0_dVd * Cox_inv ;
2673 Vthp_dVg = PS0Z_SCE_dVgs + Qb0_dVg * Cox_inv ;
2674 Vthp_dPS0Z = 1.0 ;
2675 }else{ /* original */
2676 T1 = here->HSM2_2qnsub_esi ;
2677 Qb0 = sqrt (T1 * (Pb20 - Vbsz2)) ;
2678 T2 = 0.5 * T1 / Qb0 ;
2679 Qb0_dVb = T2 * (- Vbsz2_dVbs) ;
2680 Qb0_dVd = T2 * (- Vbsz2_dVds) ;
2681 Qb0_dVg = T2 * (- Vbsz2_dVgs) ;
2682
2683 Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr;
2684 Vthp_dVb = Qb0_dVb * Cox_inv ;
2685 Vthp_dVd = Qb0_dVd * Cox_inv ;
2686 Vthp_dVg = Qb0_dVg * Cox_inv ;
2687 }
2688
2689 Pb20b = Pb20 ;
2690 Pb20b_dVb = 0.0 ;
2691 Pb20b_dVd = 0.0 ;
2692 Pb20b_dVg = 0.0 ;
2693
2694 T0 = 0.95 ;
2695 T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ;
2696 T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ;
2697 T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ;
2698 T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ;
2699 T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ;
2700 T3 = T0 * Pb20b - 0.5 * (T1 + T2) ;
2701 T4 = 2.0 * T0 * 1.0e-3 ;
2702 T5 = T1 / T2 ;
2703 T6 = T4 / T2 ;
2704 T3_dVb = T0 * Pb20b_dVb
2705 - 0.5 * (T1_dVb + (T1_dVb * T5 + T6 * Pb20b_dVb ) ) ;
2706 T3_dVd = T0 * Pb20b_dVd
2707 - 0.5 * (T1_dVd + (T1_dVd * T5 + T6 * Pb20b_dVd ) ) ;
2708 T3_dVg = T0 * Pb20b_dVg
2709 - 0.5 * (T1_dVg + (T1_dVg * T5 + T6 * Pb20b_dVg ) ) ;
2710 Pbsum = Pb20b - T3 ;
2711 Pbsum_dVb = Pb20b_dVb - T3_dVb ;
2712 Pbsum_dVd = Pb20b_dVd - T3_dVd ;
2713 Pbsum_dVg = Pb20b_dVg - T3_dVg ;
2714
2715 sqrt_Pbsum = sqrt( Pbsum ) ;
2716
2717 /*-------------------------------------------*
2718 * dVthLP : Short-channel effect induced by pocket.
2719 * - Vth0 : Vth without pocket.
2720 *-----------------*/
2721 if ( model->HSM2_lp != 0.0 ) {
2722
2723 if( corecip ){
2724 T1 = here->HSM2_2qnsub_esi ;
2725 T2 = model->HSM2_bs2 - Vbsz2 ;
2726 T3 = T2 + small ;
2727 T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ;
2728 T5 = 0.5 * (T3 + T4) ;
2729 T6 = 0.5 * (1.0 + T3 / T4) ;
2730 T5_dVb = - Vbsz2_dVbs * T6 ;
2731 T5_dVd = - Vbsz2_dVds * T6 ;
2732 T5_dVg = - Vbsz2_dVgs * T6 ;
2733 T7 = 1.0 / T5 ;
2734 bs12 = model->HSM2_bs1 * T7 ;
2735 T8 = - bs12 * T7 ;
2736 bs12_dVb = T8 * T5_dVb ;
2737 bs12_dVd = T8 * T5_dVd ;
2738 bs12_dVg = T8 * T5_dVg ;
2739
2740 T1 = 0.93 * ( PS0Z_SCE + Ps0_min - Vbsz2 );
2741 T1_dVb = 0.93 * ( PS0Z_SCE_dVbs + Ps0_min_dVbs - Vbsz2_dVbs );
2742 T1_dVd = 0.93 * ( PS0Z_SCE_dVds + Ps0_min_dVds - Vbsz2_dVds );
2743 T1_dVg = 0.93 * ( PS0Z_SCE_dVgs + Ps0_min_dVgs - Vbsz2_dVgs );
2744 T1_dPS0Z = 0.93 ;
2745
2746 T2 = bs12 ;
2747 T2_dVb = bs12_dVb ;
2748 T2_dVd = bs12_dVd ;
2749 T2_dVg = bs12_dVg ;
2750
2751 Fn_SU2( T10 , T2 , T1 , vth_dlt, T0, T3 ) ;
2752 T10_dVb = T2_dVb * T0 + T1_dVb * T3 ;
2753 T10_dVd = T2_dVd * T0 + T1_dVd * T3 ;
2754 T10_dVg = T2_dVg * T0 + T1_dVg * T3 ;
2755 T10_dPS0Z = T1_dPS0Z * T3 ;
2756
2757 T4 = here->HSM2_2qnsub_esi * ( PS0Z_SCE + Ps0_min - Vbsz2 - T10 ) ;
2758 T4_dVb = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVbs + Ps0_min_dVbs - Vbsz2_dVbs - T10_dVb ) ;
2759 T4_dVd = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVds + Ps0_min_dVds - Vbsz2_dVds - T10_dVd ) ;
2760 T4_dVg = here->HSM2_2qnsub_esi * ( PS0Z_SCE_dVgs + Ps0_min_dVgs - Vbsz2_dVgs - T10_dVg ) ;
2761 T4_dPS0Z = here->HSM2_2qnsub_esi * ( 1.0 - T10_dPS0Z ) ;
2762
2763 if (T4 > arg2){
2764 Qbmm = sqrt ( T4 ) ;
2765 Qbmm_dVb = 0.5 / Qbmm * T4_dVb ;
2766 Qbmm_dVd = 0.5 / Qbmm * T4_dVd ;
2767 Qbmm_dVg = 0.5 / Qbmm * T4_dVg ;
2768 Qbmm_dPS0Z = 0.5 / Qbmm * T4_dPS0Z ;
2769 } else {
2770 Qbmm = sqrt(arg2) + 0.5 / sqrt(arg2) * ( T4 - arg2) ;
2771 Qbmm_dVb = 0.5 / sqrt(arg2) * T4_dVb ;
2772 Qbmm_dVd = 0.5 / sqrt(arg2) * T4_dVd ;
2773 Qbmm_dVg = 0.5 / sqrt(arg2) * T4_dVg ;
2774 Qbmm_dPS0Z = 0.5 / sqrt(arg2) * T4_dPS0Z ;
2775 }
2776
2777 dqb = ( Qb0 - Qbmm ) * Cox_inv ;
2778 dqb_dVb = ( Qb0_dVb - Qbmm_dVb ) * Cox_inv ;
2779 dqb_dVd = ( Qb0_dVd - Qbmm_dVd ) * Cox_inv ;
2780 dqb_dVg = ( Qb0_dVg - Qbmm_dVg ) * Cox_inv ;
2781 dqb_dPS0Z = ( - Qbmm_dPS0Z ) * Cox_inv ;
2782
2783 /* W/O QME PART */
2784 if( codqb == 0 ){
2785 dqb = 0 ;
2786 dqb_dVb = 0 ;
2787 dqb_dVd = 0 ;
2788 dqb_dVg = 0 ;
2789 dqb_dPS0Z = 0.0 ;
2790 }
2791
2792 T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ;
2793 T2 = sqrt( T1 ) ;
2794 T2_dVb = 0.0 ;
2795 T2_dVd = 0.0 ;
2796 T2_dVg = 0.0 ;
2797
2798 Vth0 = PS0Z_SCE + Vfb + T2 * Cox_inv ;
2799 Vth0_dVb = PS0Z_SCE_dVbs + T2_dVb * Cox_inv ;
2800 Vth0_dVd = PS0Z_SCE_dVds + T2_dVd * Cox_inv ;
2801 Vth0_dVg = PS0Z_SCE_dVgs + T2_dVg * Cox_inv ;
2802 Vth0_dPS0Z = 1.0 ;
2803
2804 T1 = C_ESI * Cox_inv ;
2805 T2 = here->HSM2_wdplp ;
2806
2807 T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ;
2808 T5 = 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T1 * T2 * T4 ;
2809 T5_dVb = 0.0 ;
2810 T5_dVd = 0.0 ;
2811 T5_dVg = 0.0 ;
2812
2813 T6 = PS0Z_SCE - Vbsz ;
2814 T6_dVb = PS0Z_SCE_dVbs - Vbsz_dVbs ;
2815 T6_dVd = PS0Z_SCE_dVds - Vbsz_dVds ;
2816 T6_dVg = PS0Z_SCE_dVgs ;
2817 T6_dPS0Z = 1.0 ;
2818
2819 Fn_SZ(T6, T6, C_sce_dlt, T0 );
2820 T6 += small ;
2821 T6_dVb *= T0 ;
2822 T6_dVd *= T0 ;
2823 T6_dVg *= T0 ;
2824 T6_dPS0Z *= T0 ;
2825
2826 dVth0 = T5 * sqrt( T6 ) ;
2827 dVth0_dVb = T5 * 0.5 / sqrt( T6 ) * T6_dVb + T5_dVb * sqrt( T6 );
2828 dVth0_dVd = T5 * 0.5 / sqrt( T6 ) * T6_dVd + T5_dVd * sqrt( T6 ) ;
2829 dVth0_dVg = T5 * 0.5 / sqrt( T6 ) * T6_dVg + T5_dVg * sqrt( T6 ) ;
2830 dVth0_dPS0Z = T5 * 0.5 / sqrt( T6 ) * T6_dPS0Z ;
2831
2832 T1 = Vthp - Vth0 ;
2833 T1_dVb = Vthp_dVb - Vth0_dVb ;
2834 T1_dVd = Vthp_dVd - Vth0_dVd ;
2835 T1_dVg = Vthp_dVg - Vth0_dVg ;
2836 T1_dPS0Z = Vthp_dPS0Z - Vth0_dPS0Z ;
2837
2838 T9 = PS0Z_SCE - Vbsz2 ;
2839 T9_dVb = PS0Z_SCE_dVbs - Vbsz2_dVbs ;
2840 T9_dVd = PS0Z_SCE_dVds - Vbsz2_dVds ;
2841 T9_dVg = PS0Z_SCE_dVgs - Vbsz2_dVgs ;
2842 T9_dPS0Z = 1.0 ;
2843
2844 T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz ;
2845 T3_dVb = pParam->HSM2_scp3 * T9_dVb / model->HSM2_lp ;
2846 T3_dVd = pParam->HSM2_scp3 * T9_dVd / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz_dVds ;
2847 T3_dVg = pParam->HSM2_scp3 * T9_dVg / model->HSM2_lp ;
2848 T3_dPS0Z = pParam->HSM2_scp3 * T9_dPS0Z / model->HSM2_lp ;
2849
2850 Vdx = model->HSM2_scp21 + Vdsz ;
2851 Vdx2 = Vdx * Vdx + small ;
2852 T4 = Vdx * Vdx + small ;
2853 T4_dVb = 0.0 ;
2854 T4_dVd = 2.0 * Vdx * Vdsz_dVds ;
2855 T4_dVg = 0.0 ;
2856
2857 T5 = 1.0 / T4 ;
2858 T5_dVb = - T4_dVb / T4 / T4 ;
2859 T5_dVd = - T4_dVd / T4 / T4 ;
2860 T5_dVg = - T4_dVg / T4 / T4 ;
2861
2862 dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc * T5 ;
2863 dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb + dqb_dVb - here->HSM2_msc * T5_dVb ;
2864 dVthLP_dVd = T1_dVd * dVth0 * T3 + T1 * dVth0_dVd * T3 + T1 * dVth0 * T3_dVd + dqb_dVd - here->HSM2_msc * T5_dVd ;
2865 dVthLP_dVg = T1_dVg * dVth0 * T3 + T1 * dVth0_dVg * T3 + T1 * dVth0 * T3_dVg + dqb_dVg - here->HSM2_msc * T5_dVg ;
2866 dVthLP_dPS0Z = T1_dPS0Z * dVth0 * T3 + T1 * dVth0_dPS0Z * T3 + T1 * dVth0 * T3_dPS0Z + dqb_dPS0Z ;
2867
2868 }else{ /* Original */
2869
2870 T1 = here->HSM2_2qnsub_esi ;
2871 T2 = model->HSM2_bs2 - Vbsz2 ;
2872 T3 = T2 + small ;
2873 T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ;
2874 T5 = 0.5 * (T3 + T4) ;
2875 T6 = 0.5 * (1.0 + T3 / T4) ;
2876 T5_dVb = - Vbsz2_dVbs * T6 ;
2877 T5_dVd = - Vbsz2_dVds * T6 ;
2878 T5_dVg = - Vbsz2_dVgs * T6 ;
2879 T7 = 1.0 / T5 ;
2880 bs12 = model->HSM2_bs1 * T7 ;
2881 T8 = - bs12 * T7 ;
2882 bs12_dVb = T8 * T5_dVb ;
2883 bs12_dVd = T8 * T5_dVd ;
2884 bs12_dVg = T8 * T5_dVg ;
2885 Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ;
2886 Qbmm = sqrt (T1 * (Pb20 - T10 )) ;
2887
2888 T9 = T0 / Qbmm ;
2889 Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ;
2890 Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ;
2891 Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ;
2892
2893 dqb = (Qb0 - Qbmm) * Cox_inv ;
2894 dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv ;
2895 dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv ;
2896 dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv ;
2897
2898 T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ;
2899 T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ;
2900 Vth0 = Pb2c + Vfb + T2 * Cox_inv ;
2901 T3 = 0.5 * T1 / T2 * Cox_inv ;
2902 Vth0_dVb = T3 * ( - Vbsz2_dVbs ) ;
2903 Vth0_dVd = T3 * ( - Vbsz2_dVds ) ;
2904 Vth0_dVg = T3 * ( - Vbsz2_dVgs ) ;
2905
2906 T1 = C_ESI * Cox_inv ;
2907 T2 = here->HSM2_wdplp ;
2908
2909 T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ;
2910 T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ;
2911 dVth0 = T5 * sqrt_Pbsum ;
2912 T6 = 0.5 * T5 / sqrt_Pbsum ;
2913 T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
2914 T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
2915 dVth0_dVb = T6 * Pbsum_dVb + T8 * Pb20b_dVb ;
2916 dVth0_dVd = T6 * Pbsum_dVd + T8 * Pb20b_dVd ;
2917 dVth0_dVg = T6 * Pbsum_dVg + T8 * Pb20b_dVg ;
2918
2919 T1 = Vthp - Vth0 ;
2920 T2 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * Pbsum / model->HSM2_lp ;
2921 T3 = T2 + pParam->HSM2_scp2 * Vdsz ;
2922
2923 Vdx = model->HSM2_scp21 + Vdsz ;
2924 Vdx2 = Vdx * Vdx + small ;
2925
2926 dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc / Vdx2 ;
2927 T4 = T1 * dVth0 * pParam->HSM2_scp3 / model->HSM2_lp ;
2928 dVthLP_dVb = (Vthp_dVb - Vth0_dVb) * dVth0 * T3 + T1 * dVth0_dVb * T3
2929 + T4 * Pbsum_dVb + dqb_dVb ;
2930 dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3
2931 + T4 * Pbsum_dVd
2932 + T1 * dVth0 * pParam->HSM2_scp2 * Vdsz_dVds
2933 + dqb_dVd
2934 + 2.0e0 * here->HSM2_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ;
2935 dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3
2936 + T4 * Pbsum_dVg + dqb_dVg ;
2937
2938 }
2939
2940 } else {
2941 dVthLP = 0.0e0 ;
2942 dVthLP_dVb = 0.0e0 ;
2943 dVthLP_dVd = 0.0e0 ;
2944 dVthLP_dVg = 0.0e0 ;
2945 }
2946
2947 /*---------------------------------------------------*
2948 * dVthSC : Short-channel effect induced by Vds.
2949 *-----------------*/
2950
2951 if( corecip ){
2952 T3 = here->HSM2_lgate - model->HSM2_parl2 ;
2953 T4 = 1.0e0 / ( T3 * T3 ) ;
2954 T5 = pParam->HSM2_sc3 / here->HSM2_lgate ;
2955
2956 T6 = pParam->HSM2_sc1 + T5 * ( PS0Z_SCE - Vbsz ) ;
2957 T6_dVb = T5 * ( PS0Z_SCE_dVbs - Vbsz_dVbs );
2958 T6_dVd = T5 * ( PS0Z_SCE_dVds - Vbsz_dVds );
2959 T6_dVg = T5 * PS0Z_SCE_dVgs ;
2960 T6_dPS0Z = T5 ;
2961
2962 /* QME:0 CORECIP:1 */
2963 if( pParam->HSM2_sc4 != 0 ){
2964 T8 = pParam->HSM2_sc4 * Vdsz * ( PS0Z_SCE - Vbsz ) ;
2965 T8_dVd = pParam->HSM2_sc4 * ( Vdsz_dVds * ( PS0Z_SCE - Vbsz ) + Vdsz * ( PS0Z_SCE_dVds - Vbsz_dVds ) ) ;
2966 T8_dVb = pParam->HSM2_sc4 * Vdsz * ( PS0Z_SCE_dVbs - Vbsz_dVbs ) ;
2967 T8_dVg = pParam->HSM2_sc4 * Vdsz * PS0Z_SCE_dVgs ;
2968 T8_dPS0Z = pParam->HSM2_sc4 * Vdsz ;
2969
2970 T1 = T6 + pParam->HSM2_sc2 * Vdsz + T8 ;
2971 T1_dVd = T6_dVd + pParam->HSM2_sc2 * Vdsz_dVds + T8_dVd ;
2972 T1_dVb = T6_dVb + T8_dVb ;
2973 T1_dVg = T6_dVg + T8_dVg ;
2974 T1_dPS0Z = T6_dPS0Z + T8_dPS0Z ;
2975 }else{
2976 T1 = T6 + pParam->HSM2_sc2 * Vdsz ;
2977 T1_dVb = T6_dVb ;
2978 T1_dVd = T6_dVd + pParam->HSM2_sc2 * Vdsz_dVds ;
2979 T1_dVg = T6_dVg ;
2980 T1_dPS0Z = T6_dPS0Z ;
2981 }
2982
2983 T2 = C_ESI * Cox_inv * here->HSM2_wdpl * 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T4 ;
2984
2985 A = T2 * T1 ;
2986 A_dVbs = T2 * T1_dVb ;
2987 A_dVds = T2 * T1_dVd ;
2988 A_dVgs = T2 * T1_dVg ;
2989 A_dPS0Z = T2 * T1_dPS0Z ;
2990
2991 T7 = PS0Z_SCE - Vbsz + Ps0_min ;
2992 T7_dVb = PS0Z_SCE_dVbs - Vbsz_dVbs + Ps0_min_dVbs;
2993 T7_dVd = PS0Z_SCE_dVds - Vbsz_dVds + Ps0_min_dVds ;
2994 T7_dVg = PS0Z_SCE_dVgs + Ps0_min_dVgs ;
2995 T7_dPS0Z = 1.0 ;
2996
2997 if ( T7 > arg0 ) {
2998 T8 = sqrt( T7 ) ;
2999 T8_dVb = 0.5 * T7_dVb / T8 ;
3000 T8_dVd = 0.5 * T7_dVd / T8 ;
3001 T8_dVg = 0.5 * T7_dVg / T8 ;
3002 T8_dPS0Z = 0.5 * T7_dPS0Z / T8 ;
3003 } else {
3004 T8 = sqrt(arg0) + 0.5 / sqrt(arg0) * ( T7 - arg0) ;
3005 T8_dVb = 0.5 / sqrt(arg0) * T7_dVb ;
3006 T8_dVd = 0.5 / sqrt(arg0) * T7_dVd ;
3007 T8_dVg = 0.5 / sqrt(arg0) * T7_dVg ;
3008 T8_dPS0Z = 0.5 / sqrt(arg0) * T7_dPS0Z ;
3009 }
3010
3011 dVthSC = A * T8 ;
3012 dVthSC_dVb = A * T8_dVb + A_dVbs * T8;
3013 dVthSC_dVd = A * T8_dVd + A_dVds * T8;
3014 dVthSC_dVg = A * T8_dVg + A_dVgs * T8;
3015 dVthSC_dPS0Z = A * T8_dPS0Z + A_dPS0Z * T8;
3016
3017 }else{ /* original */
3018
3019 T1 = C_ESI * Cox_inv ;
3020 T2 = here->HSM2_wdpl ;
3021 T3 = here->HSM2_lgate - model->HSM2_parl2 ;
3022 T4 = 1.0e0 / ( T3 * T3 ) ;
3023 T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ;
3024
3025 dVth0 = T5 * sqrt_Pbsum ;
3026 T6 = T5 / 2.0 / sqrt_Pbsum ;
3027 T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ;
3028 T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ;
3029 dVth0_dVb = T6 * Pbsum_dVb + T8 * Pb20b_dVb ;
3030 dVth0_dVd = T6 * Pbsum_dVd + T8 * Pb20b_dVd ;
3031 dVth0_dVg = T6 * Pbsum_dVg + T8 * Pb20b_dVg ;
3032
3033 T1 = pParam->HSM2_sc3 / here->HSM2_lgate ;
3034 T4 = pParam->HSM2_sc1 + T1 * Pbsum ;
3035 T4_dVb = T1 * Pbsum_dVb ;
3036 T4_dVd = T1 * Pbsum_dVd ;
3037 T4_dVg = T1 * Pbsum_dVg ;
3038
3039 /* QME:0 CORECIP:0 */
3040 if( pParam->HSM2_sc4 != 0 ){
3041 T8 = pParam->HSM2_sc4 * Vdsz * Pbsum ;
3042 T8_dVd = pParam->HSM2_sc4 * ( Vdsz_dVds * Pbsum + Vdsz * Pbsum_dVd ) ;
3043 T8_dVb = pParam->HSM2_sc4 * Vdsz * Pbsum_dVb ;
3044 T8_dVg = pParam->HSM2_sc4 * Vdsz * Pbsum_dVg ;
3045
3046 T5 = T4 + pParam->HSM2_sc2 * Vdsz + T8 ;
3047 T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds + T8_dVd ;
3048 T5_dVb = T4_dVb + T8_dVb ;
3049 T5_dVg = T4_dVg + T8_dVg ;
3050 }else{
3051 T5 = T4 + pParam->HSM2_sc2 * Vdsz ;
3052 T5_dVb = T4_dVb ;
3053 T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds ;
3054 T5_dVg = T4_dVg ;
3055 }
3056
3057 dVthSC = dVth0 * T5 ;
3058 dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ;
3059 dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ;
3060 dVthSC_dVg = dVth0_dVg * T5 + dVth0 * T5_dVg ;
3061
3062 }
3063
3064 /*---------------------------------------------------*
3065 * dVthW : narrow-channel effect.
3066 *-----------------*/
3067 T1 = 1.0 / Cox ;
3068 T3 = 1.0 / ( Cox + pParam->HSM2_wfc / Weff ) ;
3069 T5 = T1 - T3 ;
3070
3071 if( corecip ){
3072 dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ;
3073 dVthW_dVb = Qb0_dVb * T5 ;
3074 dVthW_dVd = Qb0_dVd * T5 ;
3075 dVthW_dVg = Qb0_dVg * T5 ;
3076 }else{ /* original */
3077 dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ;
3078 dVthW_dVb = Qb0_dVb * T5 ;
3079 dVthW_dVd = Qb0_dVd * T5 ;
3080 dVthW_dVg = 0.0 ;
3081 }
3082
3083
3084
3085 } /* end of flg_qme if-blocks */
3086
3087 /*---------------------------------------------------*
3088 * dVth : Total variation.
3089 * - Positive dVth means the decrease in Vth.
3090 *-----------------*/
3091 dVth = dVthSC + dVthLP + dVthW + here->HSM2_dVthsm ;
3092 dVth_dVb = dVthSC_dVb + dVthLP_dVb + dVthW_dVb ;
3093 dVth_dVd = dVthSC_dVd + dVthLP_dVd + dVthW_dVd ;
3094 dVth_dVg = dVthSC_dVg + dVthLP_dVg + dVthW_dVg ;
3095 dVth_dPS0Z = dVthSC_dPS0Z + dVthLP_dPS0Z ;
3096
3097 /*---------------------------------------------------*
3098 * Vth : Threshold voltagei for OP.
3099 *-----------------*/
3100 T2 = sqrt( here->HSM2_2qnsub_esi * Pb2 ) ;
3101 Vth = Pb2 + Vfb + T2 * Cox0_inv - dVth ;
3102
3103 /*-----------------------------------------------------------*
3104 * Constants in the equation of Ps0 .
3105 *-----------------*/
3106
3107 fac1 = cnst0 * Cox_inv ;
3108 fac1_dVbs = cnst0 * Cox_inv_dVb ;
3109 fac1_dVds = cnst0 * Cox_inv_dVd ;
3110 fac1_dVgs = cnst0 * Cox_inv_dVg ;
3111
3112 fac1p2 = fac1 * fac1 ;
3113 /*---------------------------------------------------*
3114 * Poly-Depletion Effect
3115 *-----------------*/
3116
3117 if ( here->HSM2_flg_pgd == 0 ) {
3118 dPpg = 0.0 ;
3119 dPpg_dVb = 0.0 ;
3120 dPpg_dVd = 0.0 ;
3121 dPpg_dVg = 0.0 ;
3122 } else {
3123
3124 T7 = Vgsz ;
3125 T7_dVb = 0.0 ;
3126 T7_dVd = Vgsz_dVds ;
3127 T7_dVg = Vgsz_dVgs ;
3128
3129 T0 = here->HSM2_cnstpgd ;
3130
3131 T3 = T7 - model->HSM2_pgd2 ;
3132 T3_dVb = T7_dVb ;
3133 T3_dVd = T7_dVd ;
3134 T3_dVg = T7_dVg ;
3135
3136 Fn_ExpLim( dPpg , T3 , T6 ) ;
3137 dPpg_dVb = T6 * T3_dVb ;
3138 dPpg_dVd = T6 * T3_dVd ;
3139 dPpg_dVg = T6 * T3_dVg ;
3140
3141 Fn_SZ( dPpg , dPpg - 1.0 , 0.1 , T6 ) ;
3142 dPpg_dVb *= T6 ;
3143 dPpg_dVd *= T6 ;
3144 dPpg_dVg *= T6 ;
3145
3146 dPpg *= T0 ;
3147 dPpg_dVb *= T0 ;
3148 dPpg_dVd *= T0 ;
3149 dPpg_dVg *= T0 ;
3150
3151 Fn_SU( dPpg , dPpg , pol_b , pol_dlt , T9 ) ;
3152 dPpg_dVb *= T9 ;
3153 dPpg_dVd *= T9 ;
3154 dPpg_dVg *= T9 ;
3155
3156 }
3157
3158 /*---------------------------------------------------*
3159 * Vgp : Effective gate bias with SCE & RSCE & flatband.
3160 *-----------------*/
3161 Vgp = Vgs - Vfb + dVth - dPpg ;
3162 Vgp_dVbs = dVth_dVb - dPpg_dVb ;
3163 Vgp_dVds = dVth_dVd - dPpg_dVd ;
3164 Vgp_dVgs = 1.0e0 + dVth_dVg - dPpg_dVg ;
3165 Vgp_dPS0Z = dVth_dPS0Z ;
3166
3167 Vgpz = Vgsz - Vfb + dVth - dPpg ; /* (tmp) */
3168 Vgpz_dVbs = dVth_dVb ;
3169 Vgpz_dVds = Vgsz_dVds + dVth_dVd - dPpg_dVd ;
3170 Vgpz_dVgs = Vgsz_dVgs + dVth_dVg - dPpg_dVg ;
3171 Vgpz_dPS0Z = dVth_dPS0Z ;
3172
3173 /*---------------------------------------------------*
3174 * Vgs_fb : Actual flatband voltage taking account Vbs.
3175 * - note: if Vgs == Vgs_fb then Vgp == Ps0 == Vbs .
3176 *------------------*/
3177 Vgs_fb = Vfb - dVth + dPpg + Vbs ;
3178
3179 /*-----------------------------------------------------------*
3180 * Accumulation zone. (zone-A)
3181 * - evaluate basic characteristics and exit from this part.
3182 *-----------------*/
3183 if ( Vgs < Vgs_fb ) {
3184
3185 flg_zone = -1 ;
3186
3187 /*---------------------------------------------------*
3188 * Evaluation of Ps0.
3189 * - Psa : Analytical solution of
3190 * Cox( Vgp - Psa ) = cnst0 * Qacc
3191 * where Qacc is the 3-degree series of (fdep)^{1/2}.
3192 * The unkown is transformed to Chi=beta(Ps0-Vbs).
3193 * - Ps0_min : |Ps0_min| when Vbs=0.
3194 *-----------------*/
3195
3196 /* Ps0_min = here->HSM2_eg - Pb2 ; */
3197 /* -> replaced by approx. solving Poisson equation at Vgs=Vgs_min */
3198 /* Ps0_min = 2.0 * beta_inv * log(-Vgs_min/fac1) ; already done above */
3199
3200 TX = beta * ( Vgp - Vbs ) ;
3201 TX_dVbs = beta * ( Vgp_dVbs - 1.0 ) ;
3202 TX_dVds = beta * Vgp_dVds ;
3203 TX_dVgs = beta * Vgp_dVgs ;
3204 TX_dPS0Z = beta * Vgp_dPS0Z ;
3205
3206 T1 = 1.0 / ( beta * cnst0 ) ;
3207 TY = T1 * Cox ;
3208 TY_dVbs = T1 * Cox_dVb ;
3209 TY_dVds = T1 * Cox_dVd ;
3210 TY_dVgs = T1 * Cox_dVg ;
3211
3212 Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ;
3213
3214 Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ;
3215 T1 = 72.0 * Ac41 * Ac41 * C_SQRT_2 ;
3216 Ac4_dVbs = T1 * TY_dVbs ;
3217 Ac4_dVds = T1 * TY_dVds ;
3218 Ac4_dVgs = T1 * TY_dVgs ;
3219
3220 T4 = ( TX - 2.0 ) ;
3221 T5 = 9.0 * TY * T4 ;
3222 T5_dVb = 9.0 * ( TY_dVbs * T4 + TY * TX_dVbs ) ;
3223 T5_dVd = 9.0 * ( TY_dVds * T4 + TY * TX_dVds ) ;
3224 T5_dVg = 9.0 * ( TY_dVgs * T4 + TY * TX_dVgs ) ;
3225 T5_dPS0Z = 9.0 * ( TY * TX_dPS0Z ) ;
3226
3227 Ac31 = 7.0 * C_SQRT_2 - T5 ;
3228 Ac31_dVbs = -T5_dVb ;
3229 Ac31_dVds = -T5_dVd ;
3230 Ac31_dVgs = -T5_dVg ;
3231 Ac31_dPS0Z = -T5_dPS0Z ;
3232
3233 Ac3 = Ac31 * Ac31 ;
3234 T1 = 2.0 * Ac31 ;
3235 Ac3_dVbs = T1 * Ac31_dVbs ;
3236 Ac3_dVds = T1 * Ac31_dVds ;
3237 Ac3_dVgs = T1 * Ac31_dVgs ;
3238 Ac3_dPS0Z = T1 * Ac31_dPS0Z ;
3239
3240 Ac2 = sqrt( Ac4 + Ac3 ) ;
3241 T1 = 0.5 / Ac2 ;
3242 Ac2_dVbs = T1 * ( Ac4_dVbs + Ac3_dVbs ) ;
3243 Ac2_dVds = T1 * ( Ac4_dVds + Ac3_dVds ) ;
3244 Ac2_dVgs = T1 * ( Ac4_dVgs + Ac3_dVgs ) ;
3245 Ac2_dPS0Z = T1 * ( Ac3_dPS0Z ) ;
3246
3247 Ac1 = -7.0 * C_SQRT_2 + Ac2 + T5 ;
3248 Ac1_dVbs = Ac2_dVbs + T5_dVb ;
3249 Ac1_dVds = Ac2_dVds + T5_dVd ;
3250 Ac1_dVgs = Ac2_dVgs + T5_dVg ;
3251 Ac1_dPS0Z = Ac2_dPS0Z + T5_dPS0Z ;
3252
3253 Acd = Fn_Pow( Ac1 , C_1o3 ) ;
3254 T1 = C_1o3 / ( Acd * Acd ) ;
3255 Acd_dVbs = Ac1_dVbs * T1 ;
3256 Acd_dVds = Ac1_dVds * T1 ;
3257 Acd_dVgs = Ac1_dVgs * T1 ;
3258 Acd_dPS0Z = Ac1_dPS0Z * T1 ;
3259
3260 Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ;
3261 T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ;
3262 Acn_dVbs = - 12.0 * TY_dVbs + T1 * Acd_dVbs ;
3263 Acn_dVds = - 12.0 * TY_dVds + T1 * Acd_dVds ;
3264 Acn_dVgs = - 12.0 * TY_dVgs + T1 * Acd_dVgs ;
3265 Acn_dPS0Z = T1 * Acd_dPS0Z ;
3266
3267 T1 = 1.0 / Acd ;
3268 Chi = Acn * T1 ;
3269 Chi_dVbs = ( Acn_dVbs - Chi * Acd_dVbs ) * T1 ;
3270 Chi_dVds = ( Acn_dVds - Chi * Acd_dVds ) * T1 ;
3271 Chi_dVgs = ( Acn_dVgs - Chi * Acd_dVgs ) * T1 ;
3272 Chi_dPS0Z = ( Acn_dPS0Z - Chi * Acd_dPS0Z ) * T1 ;
3273
3274 Psa = Chi * beta_inv + Vbs ;
3275 Psa_dVbs = Chi_dVbs * beta_inv + 1.0 ;
3276 Psa_dVds = Chi_dVds * beta_inv ;
3277 Psa_dVgs = Chi_dVgs * beta_inv ;
3278 Psa_dPS0Z = Chi_dPS0Z * beta_inv ;
3279
3280 T1 = Psa - Vbs ;
3281 T2 = T1 / Ps0_min ;
3282 T3 = sqrt( 1.0 + ( T2 * T2 ) ) ;
3283
3284 T9 = T2 / T3 / Ps0_min ;
3285 T3_dVb = T9 * ( Psa_dVbs - 1.0 ) ;
3286 T3_dVd = T9 * ( Psa_dVds ) ;
3287 T3_dVg = T9 * ( Psa_dVgs ) ;
3288 T3_dPS0Z = T9 * ( Psa_dPS0Z ) ;
3289
3290 Ps0 = T1 / T3 + Vbs ;
3291 T9 = 1.0 / ( T3 * T3 ) ;
3292 Ps0_dVbs = T9 * ( ( Psa_dVbs - 1.0 ) * T3 - T1 * T3_dVb ) + 1.0 ;
3293 Ps0_dVds = T9 * ( Psa_dVds * T3 - T1 * T3_dVd ) ;
3294 Ps0_dVgs = T9 * ( Psa_dVgs * T3 - T1 * T3_dVg ) ;
3295 Ps0_dPS0Z = T9 * ( Psa_dPS0Z * T3 - T1 * T3_dPS0Z ) ;
3296
3297 /*---------------------------------------------------*
3298 * Characteristics.
3299 *-----------------*/
3300 Psl = Ps0 ;
3301 Psl_dVbs = Ps0_dVbs ;
3302 Psl_dVds = Ps0_dVds ;
3303 Psl_dVgs = Ps0_dVgs ;
3304
3305 T2 = ( Vgp - Ps0 ) ;
3306 Qbu = Cox * T2 ;
3307 Qbu_dVbs = Cox * ( Vgp_dVbs - Ps0_dVbs ) + Cox_dVb * T2 ;
3308 Qbu_dVds = Cox * ( Vgp_dVds - Ps0_dVds ) + Cox_dVd * T2 ;
3309 Qbu_dVgs = Cox * ( Vgp_dVgs - Ps0_dVgs ) + Cox_dVg * T2 ;
3310
3311 Qiu = 0.0e0 ;
3312 Qiu_dVbs = 0.0e0 ;
3313 Qiu_dVds = 0.0e0 ;
3314 Qiu_dVgs = 0.0e0 ;
3315
3316 Qdrat = 0.5e0 ;
3317 Qdrat_dVbs = 0.0e0 ;
3318 Qdrat_dVds = 0.0e0 ;
3319 Qdrat_dVgs = 0.0e0 ;
3320
3321 Lred = 0.0e0 ;
3322 Lred_dVbs = 0.0e0 ;
3323 Lred_dVds = 0.0e0 ;
3324 Lred_dVgs = 0.0e0 ;
3325
3326 Ids = 0.0e0 ;
3327 Ids_dVbs = 0.0e0 ;
3328 Ids_dVds = 0.0e0 ;
3329 Ids_dVgs = 0.0e0 ;
3330
3331 VgVt = 0.0 ;
3332
3333 flg_noqi = 1 ;
3334
3335 DJI = 1.0 ;
3336
3337 if( corecip ){
3338 /*!! This is for Accumulation Region !!*/
3339
3340 T1 = Vds * 0.5 ;
3341 Fn_SymAdd( Pzadd , T1 , model->HSM2_pzadd0 , T2 ) ;
3342 T2 /= 2 ;
3343 Pzadd_dVbs = 0.0 ;
3344 Pzadd_dVds = T2 * ( 1.0 ) ;
3345 Pzadd_dVgs = 0.0 ;
3346 Pzadd_dPS0Z = 0.0 ;
3347
3348 if ( Pzadd < epsm10 ) {
3349 Pzadd = epsm10 ;
3350 Pzadd_dVbs = 0.0 ;
3351 Pzadd_dVds = 0.0 ;
3352 Pzadd_dVgs = 0.0 ;
3353 Pzadd_dPS0Z = 0.0 ;
3354 }
3355
3356 Ps0z = Ps0 + Pzadd ;
3357 Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ;
3358 Ps0z_dVds = Ps0_dVds + Pzadd_dVds ;
3359 Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ;
3360 Ps0z_dPS0Z = Ps0_dPS0Z + Pzadd_dPS0Z ;
3361
3362 /* calculate Newton correction: */
3363 G = PS0Z_SCE - Ps0z ;
3364 delta_PS0Z_SCE = - G / (1.0 - Ps0z_dPS0Z) ;
3365
3366 delta_PS0Z_SCE_dVbs = Ps0z_dVbs - PS0Z_SCE_dVbs;
3367 delta_PS0Z_SCE_dVds = Ps0z_dVds - PS0Z_SCE_dVds;
3368 delta_PS0Z_SCE_dVgs = Ps0z_dVgs - PS0Z_SCE_dVgs;
3369 PS0Z_SCE += delta_PS0Z_SCE ;
3370 PS0Z_SCE_dVbs = Ps0z_dVbs ;
3371 PS0Z_SCE_dVds = Ps0z_dVds ;
3372 PS0Z_SCE_dVgs = Ps0z_dVgs ;
3373
3374 PS0_SCE = PS0Z_SCE - Pzadd ;
3375 PS0_SCE_dVbs = Ps0_dVbs ;
3376 PS0_SCE_dVds = Ps0_dVds ;
3377 PS0_SCE_dVgs = Ps0_dVgs ;
3378
3379 NNN += 1 ;
3380
3381 if( ( fabs(delta_PS0Z_SCE) > PS0_SCE_tol
3382 || fabs(delta_PS0Z_SCE_dVbs) > PS0_SCE_deriv_tol
3383 || fabs(delta_PS0Z_SCE_dVds) > PS0_SCE_deriv_tol
3384 || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol
3385 ) && (NNN < MAX_LOOP_SCE) ){
3386 // goto START_OF_SCE_LOOP;
3387 START_OF_SCE_LOOP = 1 ;
3388 }
3389 }
3390
3391 //goto end_of_part_1 ;
3392 if( START_OF_SCE_LOOP==0 ) end_of_part_1 = 1 ;
3393 }
3394
3395 } /* End of 3rd SCE_LOOP */
3396 if ( end_of_part_1 == 0 ) { /* skip to end_of_part_1 */
3397
3398 /*-----------------------------------------------------------*
3399 * Initial guess for Ps0.
3400 *-----------------*/
3401
3402 /*---------------------------------------------------*
3403 * Ps0_iniA: solution of subthreshold equation assuming zone-D1/D2.
3404 *-----------------*/
3405 TX = 1.0e0 + 4.0e0
3406 * ( beta * ( Vgp - Vbs ) - 1.0e0 ) / ( fac1p2 * beta2 ) ;
3407 TX = Fn_Max( TX , epsm10 ) ;
3408 Ps0_iniA = Vgp + fac1p2 * beta * 0.5 * ( 1.0e0 - sqrt( TX ) ) ;
3409
3410 /* use analitical value in subthreshold region. */
3411 if ( Vgs < ( Vfb + Vth ) * 0.5 ) {
3412 flg_pprv = 0 ;
3413 }
3414
3415 if ( flg_pprv >= 1 ) {
3416 /*---------------------------------------------------*
3417 * Use previous value.
3418 *-----------------*/
3419
3420 T1 = Ps0_dVbs * dVbs + Ps0_dVds * dVds + Ps0_dVgs * dVgs ;
3421 Ps0_ini = Ps0 + T1 ;
3422
3423 if ( flg_pprv == 2 ) {
3424 /* TX_dVxs = d^2 Ps0 / d Vxs^2 here */
3425 if ( Vbsc_dif2 > epsm10 ) {
3426 TX_dVbs = ( here->HSM2_ps0_dvbs_prv - here->HSM2_ps0_dvbs_prv2 )
3427 / Vbsc_dif2 ;
3428 } else {
3429 TX_dVbs = 0.0 ;
3430 }
3431 if ( Vdsc_dif2 > epsm10 ) {
3432 TX_dVds = ( here->HSM2_ps0_dvds_prv - here->HSM2_ps0_dvds_prv2 )
3433 / Vdsc_dif2 ;
3434 } else {
3435 TX_dVds = 0.0 ;
3436 }
3437 if ( Vgsc_dif2 > epsm10 ) {
3438 TX_dVgs = ( here->HSM2_ps0_dvgs_prv - here->HSM2_ps0_dvgs_prv2 )
3439 / Vgsc_dif2 ;
3440 } else {
3441 TX_dVgs = 0.0 ;
3442 }
3443 T2 = ( dVbs * dVbs ) / 2 * TX_dVbs
3444 + ( dVds * dVds ) / 2 * TX_dVds
3445 + ( dVgs * dVgs ) / 2 * TX_dVgs ;
3446
3447 if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) {
3448 Ps0_ini += T2 ;
3449 } else {
3450 flg_pprv = 1 ;
3451 }
3452 }
3453
3454 T1 = Ps0_ini - Ps0 ;
3455 if ( T1 < - dP_max || T1 > dP_max ) {
3456 flg_pprv = 0 ; /* flag changes to analitical */
3457 } else {
3458 Ps0_iniA = Fn_Max( Ps0_ini , Ps0_iniA ) ;
3459 }
3460 } /* end of (flg_pprv >=1) if-block */
3461
3462 if ( flg_pprv == 0 ) {
3463
3464 /*---------------------------------------------------*
3465 * Analytical initial guess.
3466 *-----------------*/
3467 /*-------------------------------------------*
3468 * Common part.
3469 *-----------------*/
3470 Chi = beta * ( Ps0_iniA - Vbs ) ;
3471
3472 if ( Chi < znbd3 ) {
3473 /*-----------------------------------*
3474 * zone-D1/D2
3475 * - Ps0_ini is the analytical solution of Qs=Qb0 with
3476 * Qb0 being approximated to 3-degree polynomial.
3477 *-----------------*/
3478 TY = beta * ( Vgp - Vbs ) ;
3479 T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ;
3480 T2 = 81.0 + 3.0 * T1 ;
3481 T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ;
3482 T4 = 1458.0 - 81.0 * ( 54.0 + T1 ) + 27.0 * T1 * TY ;
3483 T4 = T4 * T4 ;
3484 T5 = Fn_Pow( T3 + sqrt( 4 * T2 * T2 * T2 + T4 ) , C_1o3 ) ;
3485 TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 )
3486 + 1 / ( 3.0 * C_2p_1o3 ) * T5 ;
3487
3488 Ps0_iniA = TX * beta_inv + Vbs ;
3489 Ps0_ini = Ps0_iniA ;
3490
3491 } else if ( Vgs <= Vth ) {
3492 /*-----------------------------------*
3493 * Weak inversion zone.
3494 *-----------------*/
3495 Ps0_ini = Ps0_iniA ;
3496
3497 } else {
3498 /*-----------------------------------*
3499 * Strong inversion zone.
3500 * - Ps0_iniB : upper bound.
3501 *-----------------*/
3502 T1 = 1.0 / cnst1 / cnstCoxi ;
3503 T2 = T1 * Vgp * Vgp ;
3504 T3 = beta + 2.0 / Vgp ;
3505
3506 Ps0_iniB = log( T2 + small ) / T3 ;
3507
3508 Fn_SU( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1) ;
3509 }
3510 }
3511
3512 TX = Vbs + ps_conv / 2 ;
3513 if ( Ps0_ini < TX ) Ps0_ini = TX ;
3514
3515
3516 /*---------------------------------------------------*
3517 * Assign initial guess.
3518 *-----------------*/
3519 if ( NNN == 0 ) {
3520 Ps0 = Ps0_ini ;
3521 }
3522 Psl_lim = Ps0_iniA ;
3523
3524 /*---------------------------------------------------*
3525 * Calculation of Ps0. (beginning of Newton loop)
3526 * - Fs0 : Fs0 = 0 is the equation to be solved.
3527 * - dPs0 : correction value.
3528 *-----------------*/
3529 exp_bVbs = exp( beta * Vbs ) ;
3530 cfs1 = cnst1 * exp_bVbs ;
3531
3532 flg_conv = 0 ;
3533 for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) {
3534
3535 Chi = beta * ( Ps0 - Vbs ) ;
3536
3537 if ( Chi < znbd5 ) {
3538 /*-------------------------------------------*
3539 * zone-D1/D2. (Ps0)
3540 * - Qb0 is approximated to 5-degree polynomial.
3541 *-----------------*/
3542 fi = Chi * Chi * Chi
3543 * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ;
3544 fi_dChi = Chi * Chi
3545 * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ;
3546
3547 fs01 = cfs1 * fi * fi ;
3548 fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ;
3549
3550 fb = Chi * ( cn_nc51
3551 + Chi * ( cn_nc52
3552 + Chi * ( cn_nc53
3553 + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ;
3554 fb_dChi = cn_nc51
3555 + Chi * ( 2 * cn_nc52
3556 + Chi * ( 3 * cn_nc53
3557 + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ;
3558
3559 fs02 = sqrt( fb * fb + fs01 ) ;
3560 fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ;
3561
3562 } else {
3563 /*-------------------------------------------*
3564 * zone-D3. (Ps0)
3565 *-----------------*/
3566 if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */
3567 exp_Chi = exp( Chi ) ;
3568 fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ;
3569 fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ;
3570 } else {
3571 exp_bPs0 = exp( beta*Ps0 ) ;
3572 fs01 = cnst1 * ( exp_bPs0 - exp_bVbs ) ;
3573 fs01_dPs0 = cnst1 * beta * exp_bPs0 ;
3574 }
3575 fs02 = sqrt( Chi - 1.0 + fs01 ) ;
3576 fs02_dPs0 = ( beta + fs01_dPs0 ) / ( fs02 + fs02 ) ;
3577 } /* end of if ( Chi ... ) else block */
3578
3579 Fs0 = Vgp - Ps0 - fac1 * fs02 ;
3580 Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ;
3581
3582 if ( flg_conv == 1 ) break ;
3583
3584 dPs0 = - Fs0 / Fs0_dPs0 ;
3585
3586 /*-------------------------------------------*
3587 * Update Ps0 .
3588 * - clamped to Vbs if Ps0 < Vbs .
3589 *-----------------*/
3590 dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0))) ;
3591 if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ;
3592
3593 Ps0 = Ps0 + dPs0 ;
3594
3595 TX = Vbs + ps_conv / 2 ;
3596 if ( Ps0 < TX ) Ps0 = TX ;
3597
3598 /*-------------------------------------------*
3599 * Check convergence.
3600 * NOTE: This condition may be too rigid.
3601 *-----------------*/
3602 if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) {
3603 flg_conv = 1 ;
3604 }
3605
3606 } /* end of Ps0 Newton loop */
3607
3608 /* Eliminate loop count to take account of the derivative loop */
3609 lp_s0 -- ;
3610
3611 /*-------------------------------------------*
3612 * Procedure for diverged case.
3613 *-----------------*/
3614 if ( flg_conv == 0 ) {
3615 fprintf( stderr ,
3616 "*** warning(HiSIM): Went Over Iteration Maximum (Ps0)\n" ) ;
3617 fprintf( stderr ,
3618 " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" ,
3619 Vbse , Vdse , Vgse ) ;
3620 if ( flg_info >= 2 ) {
3621 printf( "*** warning(HiSIM): Went Over Iteration Maximum (Ps0)\n" ) ;
3622 }
3623 }
3624
3625 /*---------------------------------------------------*
3626 * Evaluate derivatives of Ps0.
3627 * - note: Here, fs01_dVbs and fs02_dVbs are derivatives
3628 * w.r.t. explicit Vbs. So, Ps0 in the fs01 and fs02
3629 * expressions is regarded as a constant.
3630 *-----------------*/
3631
3632 /* derivatives of fs0* w.r.t. explicit Vbs */
3633 if ( Chi < znbd5 ) {
3634 fs01_dVbs = cfs1 * beta * fi * ( fi - 2 * fi_dChi ) ;
3635 T2 = 1.0e0 / ( fs02 + fs02 ) ;
3636 fs02_dVbs = ( - beta * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ;
3637 } else {
3638 fs01_dVbs = - cfs1 * beta ;
3639 T2 = 0.5e0 / fs02 ;
3640 fs02_dVbs = ( - beta + fs01_dVbs ) * T2 ;
3641 }
3642
3643 T1 = 1.0 / Fs0_dPs0 ;
3644 Ps0_dVbs = - ( Vgp_dVbs - ( fac1 * fs02_dVbs + fac1_dVbs * fs02 ) ) * T1 ;
3645 Ps0_dVds = - ( Vgp_dVds - fac1_dVds * fs02 ) * T1 ;
3646 Ps0_dVgs = - ( Vgp_dVgs - fac1_dVgs * fs02 ) * T1 ;
3647
3648 if ( Chi < znbd5 ) {
3649 /*-------------------------------------------*
3650 * zone-D1/D2. (Ps0)
3651 * Xi0 := fdep0^2 = fb * fb [D1,D2]
3652 *-----------------*/
3653 Xi0 = fb * fb + epsm10 ;
3654 T1 = 2 * fb * fb_dChi * beta ;
3655 Xi0_dVbs = T1 * ( Ps0_dVbs - 1.0 ) ;
3656 Xi0_dVds = T1 * Ps0_dVds ;
3657 Xi0_dVgs = T1 * Ps0_dVgs ;
3658
3659 Xi0p12 = fb + epsm10 ;
3660 T1 = fb_dChi * beta ;
3661 Xi0p12_dVbs = T1 * ( Ps0_dVbs - 1.0 ) ;
3662 Xi0p12_dVds = T1 * Ps0_dVds ;
3663 Xi0p12_dVgs = T1 * Ps0_dVgs ;
3664
3665 Xi0p32 = fb * fb * fb + epsm10 ;
3666 T1 = 3 * fb * fb * fb_dChi * beta ;
3667 Xi0p32_dVbs = T1 * ( Ps0_dVbs - 1.0 ) ;
3668 Xi0p32_dVds = T1 * Ps0_dVds ;
3669 Xi0p32_dVgs = T1 * Ps0_dVgs ;
3670
3671 } else {
3672 /*-------------------------------------------*
3673 * zone-D3. (Ps0)
3674 *-----------------*/
3675 flg_zone = 3 ;
3676 flg_noqi = 0 ;
3677
3678 /*-----------------------------------*
3679 * Xi0 := fdep0^2 = Chi - 1 = beta * ( Ps0 - Vbs ) - 1 [D3]
3680 *-----------------*/
3681 Xi0 = Chi - 1.0e0 ;
3682 Xi0_dVbs = beta * ( Ps0_dVbs - 1.0e0 ) ;
3683 Xi0_dVds = beta * Ps0_dVds ;
3684 Xi0_dVgs = beta * Ps0_dVgs ;
3685
3686 Xi0p12 = sqrt( Xi0 ) ;
3687 T1 = 0.5e0 / Xi0p12 ;
3688 Xi0p12_dVbs = T1 * Xi0_dVbs ;
3689 Xi0p12_dVds = T1 * Xi0_dVds ;
3690 Xi0p12_dVgs = T1 * Xi0_dVgs ;
3691
3692 Xi0p32 = Xi0 * Xi0p12 ;
3693 T1 = 1.5e0 * Xi0p12 ;
3694 Xi0p32_dVbs = T1 * Xi0_dVbs ;
3695 Xi0p32_dVds = T1 * Xi0_dVds ;
3696 Xi0p32_dVgs = T1 * Xi0_dVgs ;
3697
3698 } /* end of if ( Chi ... ) block */
3699
3700 /*-----------------------------------------------------------*
3701 * - Recalculate the derivatives of fs01 and fs02.
3702 * note: fs01 = cnst1 * exp( Vbs ) * ( exp( Chi ) - Chi - 1.0e0 ) ;
3703 * fs02 = sqrt( Xi0 + fs01 ) ;
3704 *-----------------*/
3705 fs01_dVbs = Ps0_dVbs * fs01_dPs0 + fs01_dVbs ;
3706 fs01_dVds = Ps0_dVds * fs01_dPs0 ;
3707 fs01_dVgs = Ps0_dVgs * fs01_dPs0 ;
3708 fs02_dVbs = Ps0_dVbs * fs02_dPs0 + fs02_dVbs ;
3709 fs02_dVds = Ps0_dVds * fs02_dPs0 ;
3710 fs02_dVgs = Ps0_dVgs * fs02_dPs0 ;
3711
3712 /*-----------------------------------------------------------*
3713 * Qb0 : Qb at source side.
3714 * Qn0 : Qi at source side.
3715 *-----------------*/
3716
3717 Qb0 = cnst0 * Xi0p12 ;
3718 Qb0_dVb = cnst0 * Xi0p12_dVbs ;
3719 Qb0_dVd = cnst0 * Xi0p12_dVds ;
3720 Qb0_dVg = cnst0 * Xi0p12_dVgs ;
3721
3722 T1 = 1.0 / ( fs02 + Xi0p12 ) ;
3723 Qn0 = cnst0 * fs01 * T1 ;
3724
3725 T2 = 1.0 / ( fs01 + epsm10 ) ;
3726
3727 Qn0_dVbs = Qn0 * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ;
3728 Qn0_dVds = Qn0 * ( fs01_dVds * T2 - ( fs02_dVds + Xi0p12_dVds ) * T1 ) ;
3729 Qn0_dVgs = Qn0 * ( fs01_dVgs * T2 - ( fs02_dVgs + Xi0p12_dVgs ) * T1 ) ;
3730
3731
3732 /*-----------------------------------------------------------*
3733 * zone-D1 and D2
3734 *-----------------*/
3735 if ( Chi < znbd5 ) {
3736 if ( Chi < znbd3 ) {
3737 /*-------------------------------------------*
3738 * zone-D1. (Ps0)
3739 *-----------------*/
3740 flg_zone = 1 ;
3741 flg_noqi = 1 ; /** !! to be revisited !! **/
3742
3743 Qiu = Qn0 ;
3744 Qiu_dVbs = Qn0_dVbs ;
3745 Qiu_dVds = Qn0_dVds ;
3746 Qiu_dVgs = Qn0_dVgs ;
3747
3748 Qbu = Qb0 ;
3749 Qbu_dVbs = Qb0_dVb ;
3750 Qbu_dVds = Qb0_dVd ;
3751 Qbu_dVgs = Qb0_dVg ;
3752
3753 Qdrat = 0.5 ;
3754 Qdrat_dVbs = 0.0 ;
3755 Qdrat_dVds = 0.0 ;
3756 Qdrat_dVgs = 0.0 ;
3757
3758 Lred = 0.0e0 ;
3759 Lred_dVbs = 0.0e0 ;
3760 Lred_dVds = 0.0e0 ;
3761 Lred_dVgs = 0.0e0 ;
3762
3763 } else {
3764 /*-------------------------------------------*
3765 * zone-D2 (Ps0)
3766 *-----------------*/
3767 flg_zone = 2 ;
3768 flg_noqi = 0 ;
3769 /*-----------------------------------------------------------*
3770 * FD2 : connecting function for zone-D2.
3771 * - Qiu, Qbu, Qdrat and Lred should be interpolated later.
3772 *-----------------*/
3773 T1 = 1.0 / ( znbd5 - znbd3 ) ;
3774 TX = T1 * ( Chi - znbd3 ) ;
3775 TX_dVbs = beta * T1 * ( Ps0_dVbs - 1.0 ) ;
3776 TX_dVds = beta * T1 * Ps0_dVds ;
3777 TX_dVgs = beta * T1 * Ps0_dVgs ;
3778
3779 FD2 = TX * TX * TX * ( 10.0 + TX * ( -15.0 + TX * 6.0 ) ) ;
3780 T4 = TX * TX * ( 30.0 + TX * ( -60.0 + TX * 30.0 ) ) ;
3781
3782 FD2_dVbs = T4 * TX_dVbs ;
3783 FD2_dVds = T4 * TX_dVds ;
3784 FD2_dVgs = T4 * TX_dVgs ;
3785 } /* end of zone-D2 */
3786 }
3787
3788
3789 /*---------------------------------------------------*
3790 * VgVt : Vgp - Vth_qi. ( Vth_qi is Vth for Qi evaluation. )
3791 *-----------------*/
3792 VgVt = Qn0 * Cox_inv ;
3793 VgVt_dVbs = Qn0_dVbs * Cox_inv + Qn0 * Cox_inv_dVb ;
3794 VgVt_dVds = Qn0_dVds * Cox_inv + Qn0 * Cox_inv_dVd ;
3795 VgVt_dVgs = Qn0_dVgs * Cox_inv + Qn0 * Cox_inv_dVg ;
3796
3797 /*-----------------------------------------------------------*
3798 * make Qi=Qd=Ids=0 if VgVt <= VgVt_small
3799 *-----------------*/
3800 if ( VgVt <= VgVt_small && model->HSM2_bypass_enable ) {
3801 flg_zone = 4 ;
3802 flg_noqi = 1 ;
3803
3804 Psl = Ps0 ;
3805 Psl_dVbs = Ps0_dVbs ;
3806 Psl_dVds = Ps0_dVds ;
3807 Psl_dVgs = Ps0_dVgs ;
3808
3809
3810 Pds = 0.0 ;
3811 Pds_dVbs = 0.0 ;
3812 Pds_dVds = 0.0 ;
3813 Pds_dVgs = 0.0 ;
3814
3815 Qbu = Qb0 ;
3816 Qbu_dVbs = Qb0_dVb ;
3817 Qbu_dVds = Qb0_dVd ;
3818 Qbu_dVgs = Qb0_dVg ;
3819
3820 Qiu = 0.0 ;
3821 Qiu_dVbs = 0.0 ;
3822 Qiu_dVds = 0.0 ;
3823 Qiu_dVgs = 0.0 ;
3824
3825 Qdrat = 0.5 ;
3826 Qdrat_dVbs = 0.0 ;
3827 Qdrat_dVds = 0.0 ;
3828 Qdrat_dVgs = 0.0 ;
3829
3830 Lred = 0.0 ;
3831 Lred_dVbs = 0.0 ;
3832 Lred_dVds = 0.0 ;
3833 Lred_dVgs = 0.0 ;
3834
3835 Ids = 0.0e0 ;
3836 Ids_dVbs = 0.0e0 ;
3837 Ids_dVds = 0.0e0 ;
3838 Ids_dVgs = 0.0e0 ;
3839
3840 DJI = 1.0 ;
3841
3842
3843 if( corecip ){
3844
3845 Fs0_dPS0Z = Vgp_dPS0Z ;
3846 Ps0_dPS0Z = - Fs0_dPS0Z / Fs0_dPs0 ;
3847
3848 T1 = Vds * 0.5 ;
3849 Fn_SymAdd( Pzadd , T1 , model->HSM2_pzadd0 , T2 ) ;
3850 T2 /= 2 ;
3851 Pzadd_dVbs = 0.0 ;
3852 Pzadd_dVds = T2 * ( 1.0 ) ;
3853 Pzadd_dVgs = 0.0 ;
3854 Pzadd_dPS0Z = 0.0 ;
3855 if ( Pzadd < epsm10 ) {
3856 Pzadd = epsm10 ;
3857 Pzadd_dVbs = 0.0 ;
3858 Pzadd_dVds = 0.0 ;
3859 Pzadd_dVgs = 0.0 ;
3860 Pzadd_dPS0Z = 0.0 ;
3861 }
3862
3863 Ps0z = Ps0 + Pzadd ;
3864 Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ;
3865 Ps0z_dVds = Ps0_dVds + Pzadd_dVds ;
3866 Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ;
3867 Ps0z_dPS0Z = Ps0_dPS0Z + Pzadd_dPS0Z ;
3868
3869 /* calculate Newton correction: */
3870 G = PS0Z_SCE - Ps0z ;
3871 delta_PS0Z_SCE = - G / (1.0 - Ps0z_dPS0Z) ;
3872
3873 delta_PS0Z_SCE_dVbs = Ps0z_dVbs - PS0Z_SCE_dVbs;
3874 delta_PS0Z_SCE_dVds = Ps0z_dVds - PS0Z_SCE_dVds;
3875 delta_PS0Z_SCE_dVgs = Ps0z_dVgs - PS0Z_SCE_dVgs;
3876 PS0Z_SCE += delta_PS0Z_SCE ;
3877 PS0Z_SCE_dVbs = Ps0z_dVbs ;
3878 PS0Z_SCE_dVds = Ps0z_dVds ;
3879 PS0Z_SCE_dVgs = Ps0z_dVgs ;
3880
3881 PS0_SCE = PS0Z_SCE - Pzadd ;
3882 PS0_SCE_dVbs = Ps0_dVbs ;
3883 PS0_SCE_dVds = Ps0_dVds ;
3884 PS0_SCE_dVgs = Ps0_dVgs ;
3885
3886
3887 NNN += 1 ;
3888
3889 if( ( fabs(delta_PS0Z_SCE) > PS0_SCE_tol
3890 || fabs(delta_PS0Z_SCE_dVbs) > PS0_SCE_deriv_tol
3891 || fabs(delta_PS0Z_SCE_dVds) > PS0_SCE_deriv_tol
3892 || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol
3893 ) && (NNN < MAX_LOOP_SCE) ){
3894 //go to START_OF_SCE_LOOP;
3895 START_OF_SCE_LOOP = 1 ;
3896 }
3897
3898 }
3899
3900 //goto end_of_part_1 ;
3901 if( START_OF_SCE_LOOP==0 ) end_of_part_1 = 1 ;
3902
3903 }
3904
3905 } /* skip end_of_part_1 */
3906 } /* End of 2nd SCE_LOOP */
3907 if( end_of_part_1 == 0 ) { /* skip to end_of_part_1 */
3908
3909 /*-----------------------------------------------------------*
3910 * Start point of Psl (= Ps0 + Pds) calculation. (label)
3911 *-----------------*/
3912 /* start_of_Psl:*/
3913
3914
3915 /* Vdseff (begin) */
3916 Vdsorg = Vds ;
3917
3918 T2 = here->HSM2_qnsub_esi / ( Cox * Cox ) ;
3919 T4 = - 2.0e0 * T2 / Cox ;
3920 T2_dVb = T4 * Cox_dVb ;
3921 T2_dVd = T4 * Cox_dVd ;
3922 T2_dVg = T4 * Cox_dVg ;
3923
3924 T5 = Vgpz - beta_inv - Vbsz ;
3925 T5_dVb = Vgpz_dVbs - Vbsz_dVbs ;
3926 T5_dVd = Vgpz_dVds - Vbsz_dVds ;
3927 T5_dVg = Vgpz_dVgs ;
3928
3929 T0 = 2.0 / T2 ;
3930 T1 = 1.0e0 + T0 * T5 ;
3931 T1_dVb = ( T5_dVb * T2 - T5 * T2_dVb ) * T0 / T2 ;
3932 T1_dVd = ( T5_dVd * T2 - T5 * T2_dVd ) * T0 / T2 ;
3933 T1_dVg = ( T5_dVg * T2 - T5 * T2_dVg ) * T0 / T2 ;
3934
3935 Fn_SZ( T1 , T1 , 0.05 , T9 ) ;
3936 T1 += small ;
3937 T1_dVb *= T9 ;
3938 T1_dVd *= T9 ;
3939 T1_dVg *= T9 ;
3940
3941 T3 = sqrt( T1 ) ;
3942 T3_dVb = 0.5 / T3 * T1_dVb ;
3943 T3_dVd = 0.5 / T3 * T1_dVd ;
3944 T3_dVg = 0.5 / T3 * T1_dVg ;
3945
3946 T10 = Vgpz + T2 * ( 1.0e0 - T3 ) ;
3947 T10_dVb = Vgpz_dVbs + T2_dVb * ( 1.0e0 - T3 ) - T2 * T3_dVb ;
3948 T10_dVd = Vgpz_dVds + T2_dVd * ( 1.0e0 - T3 ) - T2 * T3_dVd ;
3949 T10_dVg = Vgpz_dVgs + T2_dVg * ( 1.0e0 - T3 ) - T2 * T3_dVg ;
3950 Fn_SZ( T10 , T10 , 0.01 , T0 ) ;
3951 T10 += epsm10 ;
3952 T10_dVb *= T0 ;
3953 T10_dVd *= T0 ;
3954 T10_dVg *= T0 ;
3955
3956
3957 T1 = Vds / T10 ;
3958 T2 = Fn_Pow( T1 , here->HSM2_ddlt - 1.0e0 ) ;
3959 T7 = T2 * T1 ;
3960 T0 = here->HSM2_ddlt * T2 / ( T10 * T10 ) ;
3961 T7_dVb = T0 * ( - Vds * T10_dVb ) ;
3962 T7_dVd = T0 * ( T10 - Vds * T10_dVd ) ;
3963 T7_dVg = T0 * ( - Vds * T10_dVg ) ;
3964
3965 T3 = 1.0 + T7 ;
3966 T4 = Fn_Pow( T3 , 1.0 / here->HSM2_ddlt - 1.0 ) ;
3967 T6 = T4 * T3 ;
3968 T0 = T4 / here->HSM2_ddlt ;
3969 T6_dVb = T0 * T7_dVb ;
3970 T6_dVd = T0 * T7_dVd ;
3971 T6_dVg = T0 * T7_dVg ;
3972
3973 Vdseff = Vds / T6 ;
3974 T0 = 1.0 / ( T6 * T6 ) ;
3975 Vdseff_dVbs = - Vds * T6_dVb * T0 ;
3976 Vdseff_dVds = ( T6 - Vds * T6_dVd ) * T0 ;
3977 Vdseff_dVgs = - Vds * T6_dVg * T0 ;
3978
3979 Vds = Vdseff ;
3980 /* Vdseff (end) */
3981
3982
3983 exp_bVbsVds = exp( beta * ( Vbs - Vds ) ) ;
3984
3985
3986 /*---------------------------------------------------*
3987 * Skip Psl calculation when Vds is very small.
3988 *-----------------*/
3989 if ( Vds <= 0.0 ) {
3990 Pds = 0.0 ;
3991 Psl = Ps0 ;
3992 flg_conv = 1 ;
3993 goto start_of_loopl ;
3994 }
3995
3996 /*-----------------------------------------------------------*
3997 * Initial guess for Pds ( = Psl - Ps0 ).
3998 *-----------------*/
3999 if ( flg_pprv >= 1 ) {
4000 /*---------------------------------------------------*
4001 * Use previous value.
4002 *-----------------*/
4003
4004 T1 = Pds_dVbs * dVbs + Pds_dVds * dVds + Pds_dVgs * dVgs ;
4005 Pds_ini = Pds + T1 ;
4006
4007 if ( flg_pprv == 2 ) {
4008 /* TX_dVxs = d^2 Pds / d Vxs^2 here */
4009 if ( Vbsc_dif2 > epsm10 ) {
4010 TX_dVbs = ( here->HSM2_pds_dvbs_prv - here->HSM2_pds_dvbs_prv2 )
4011 / Vbsc_dif2 ;
4012 } else {
4013 TX_dVbs = 0.0 ;
4014 }
4015 if ( Vdsc_dif2 > epsm10 ) {
4016 TX_dVds = ( here->HSM2_pds_dvds_prv - here->HSM2_pds_dvds_prv2 )
4017 / Vdsc_dif2 ;
4018 } else {
4019 TX_dVds = 0.0 ;
4020 }
4021 if ( Vgsc_dif2 > epsm10 ) {
4022 TX_dVgs = ( here->HSM2_pds_dvgs_prv - here->HSM2_pds_dvgs_prv2 )
4023 / Vgsc_dif2 ;
4024 } else {
4025 TX_dVgs = 0.0 ;
4026 }
4027 T2 = ( dVbs * dVbs ) / 2 * TX_dVbs
4028 + ( dVds * dVds ) / 2 * TX_dVds
4029 + ( dVgs * dVgs ) / 2 * TX_dVgs ;
4030
4031 if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) {
4032 Pds_ini += T2 ;
4033 } else {
4034 flg_pprv = 1 ;
4035 }
4036 }
4037
4038 T1 = Pds_ini - Pds ;
4039 if ( T1 < - dP_max || T1 > dP_max ) flg_pprv = 0 ; /* flag changes */
4040
4041 } /* end of (flg_pprv>=1) if-block */
4042
4043 if ( flg_pprv == 0 ) {
4044 /*---------------------------------------------------*
4045 * Analytical initial guess.
4046 *-----------------*/
4047 Pds_max = Fn_Max( Psl_lim - Ps0 , 0.0e0 ) ;
4048
4049 Fn_SU( Pds_ini , Vds, (1.0e0 + c_pslini_1) * Pds_max, c_pslini_2, T1 ) ;
4050 Pds_ini = Fn_Min( Pds_ini , Pds_max ) ;
4051 }
4052
4053 if ( Pds_ini < 0.0 ) Pds_ini = 0.0 ;
4054 else if ( Pds_ini > Vds ) Pds_ini = Vds ;
4055
4056
4057 /*---------------------------------------------------*
4058 * Assign initial guess.
4059 *-----------------*/
4060 if ( NNN == 0 ) {
4061 Pds = Pds_ini ;
4062 Psl = Ps0 + Pds ;
4063 } else {
4064 /* take solution from previous PS0_SCE_loop as initial value */
4065 Pds = Psl - Ps0 ;
4066 }
4067 TX = Vbs + ps_conv / 2 ;
4068 if ( Psl < TX ) Psl = TX ;
4069
4070 /*---------------------------------------------------*
4071 * Calculation of Psl by solving Poisson eqn.
4072 * (beginning of Newton loop)
4073 * - Fsl : Fsl = 0 is the equation to be solved.
4074 * - dPsl : correction value.
4075 *-----------------*/
4076 flg_conv = 0 ;
4077
4078 /*---------------------------------------------------*
4079 * start of Psl calculation. (label)
4080 *-----------------*/
4081 start_of_loopl:
4082
4083 for ( lp_sl = 1 ; lp_sl <= lp_sl_max + 1 ; lp_sl ++ ) {
4084
4085 Chi = beta * ( Psl - Vbs ) ;
4086
4087 if ( Chi < znbd5 ) {
4088 /*-------------------------------------------*
4089 * zone-D2. (Psl)
4090 * - Qb0 is approximated to 5-degree polynomial.
4091 *-----------------*/
4092
4093 fi = Chi * Chi * Chi
4094 * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ;
4095 fi_dChi = Chi * Chi
4096 * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ;
4097
4098 cfs1 = cnst1 * exp_bVbsVds ;
4099 fsl1 = cfs1 * fi * fi ;
4100 fsl1_dPsl = cfs1 * beta * 2 * fi * fi_dChi ;
4101
4102 fb = Chi * ( cn_nc51
4103 + Chi * ( cn_nc52
4104 + Chi * ( cn_nc53
4105 + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ;
4106 fb_dChi = cn_nc51
4107 + Chi * ( 2 * cn_nc52
4108 + Chi * ( 3 * cn_nc53
4109 + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ;
4110
4111 fsl2 = sqrt( fb * fb + fsl1 ) ;
4112 fsl2_dPsl = ( beta * fb_dChi * 2 * fb + fsl1_dPsl ) / ( fsl2 + fsl2 ) ;
4113
4114 } else {
4115 /*-------------------------------------------*
4116 * zone-D3. (Psl)
4117 *-----------------*/
4118 Rho = beta * ( Psl - Vds ) ;
4119 exp_Rho = exp( Rho ) ;
4120
4121 fsl1 = cnst1 * ( exp_Rho - exp_bVbsVds ) ;
4122 fsl1_dPsl = cnst1 * beta * ( exp_Rho ) ;
4123 Xil = Chi - 1.0e0 ;
4124 fsl2 = sqrt( Xil + fsl1 ) ;
4125 fsl2_dPsl = ( beta + fsl1_dPsl ) / ( fsl2 + fsl2 ) ;
4126 }
4127
4128 Fsl = Vgp - Psl - fac1 * fsl2 ;
4129 Fsl_dPsl = - 1.0e0 - fac1 * fsl2_dPsl ;
4130
4131 if ( flg_conv == 1 ) break ;
4132
4133 dPsl = - Fsl / Fsl_dPsl ;
4134
4135 /*-------------------------------------------*
4136 * Update Psl .
4137 * - clamped to Vbs if Psl < Vbs .
4138 *-----------------*/
4139 dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Psl))) ;
4140 if ( fabs( dPsl ) > dPlim ) dPsl = dPlim * Fn_Sgn( dPsl ) ;
4141
4142 Psl = Psl + dPsl ;
4143
4144 TX = Vbs + ps_conv / 2 ;
4145 if ( Psl < TX ) Psl = TX ;
4146
4147 /*-------------------------------------------*
4148 * Check convergence.
4149 * NOTE: This condition may be too rigid.
4150 *-----------------*/
4151 if ( fabs( dPsl ) <= ps_conv && fabs( Fsl ) <= gs_conv ) {
4152 flg_conv = 1 ;
4153 }
4154 } /* end of Psl Newton loop */
4155
4156 /* Eliminate loop count to take account of the derivative loop */
4157 lp_sl -- ;
4158
4159 /*-------------------------------------------*
4160 * Procedure for diverged case.
4161 *-----------------*/
4162 if ( flg_conv == 0 ) {
4163 fprintf( stderr ,
4164 "*** warning(HiSIM): Went Over Iteration Maximum (Psl)\n" ) ;
4165 fprintf( stderr ,
4166 " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" ,
4167 Vbse , Vdse , Vgse ) ;
4168 if ( flg_info >= 2 ) {
4169 printf("*** warning(HiSIM): Went Over Iteration Maximum (Psl)\n" ) ;
4170 }
4171 }
4172
4173
4174 /*---------------------------------------------------*
4175 * Evaluate derivatives of Psl.
4176 * - note: Here, fsl1_dVbs and fsl2_dVbs are derivatives
4177 * w.r.t. explicit Vbs. So, Psl in the fsl1 and fsl2
4178 * expressions is regarded as a constant.
4179 *-----------------*/
4180 if ( Chi < znbd5 ) {
4181 T1 = cfs1 * beta * fi ;
4182 fsl1_dVbs = T1 * ( ( 1.0 - Vdseff_dVbs ) * fi - 2.0 * fi_dChi ) ;
4183 fsl1_dVds = - T1 * fi * Vdseff_dVds ;
4184 fsl1_dVgs = - T1 * fi * Vdseff_dVgs ;
4185 T2 = 0.5 / fsl2 ;
4186 fsl2_dVbs = ( - beta * fb_dChi * 2 * fb + fsl1_dVbs ) * T2 ;
4187 fsl2_dVds = fsl1_dVds * T2 ;
4188 fsl2_dVgs = fsl1_dVgs * T2 ;
4189 } else {
4190 T1 = cnst1 * beta ;
4191 fsl1_dVbs = - T1 * ( exp_Rho * Vdseff_dVbs
4192 + ( 1.0 - Vdseff_dVbs ) * exp_bVbsVds );
4193 fsl1_dVds = - T1 * Vdseff_dVds * ( exp_Rho - exp_bVbsVds );
4194 fsl1_dVgs = T1 * Vdseff_dVgs * ( - exp_Rho + exp_bVbsVds );
4195 T2 = 0.5e0 / fsl2 ;
4196 fsl2_dVbs = ( - beta + fsl1_dVbs ) * T2 ;
4197 fsl2_dVds = ( fsl1_dVds ) * T2 ;
4198 fsl2_dVgs = ( fsl1_dVgs ) * T2 ;
4199 }
4200
4201 T1 = 1.0 / Fsl_dPsl ;
4202 Psl_dVbs = - ( Vgp_dVbs - ( fac1 * fsl2_dVbs + fac1_dVbs * fsl2 ) ) * T1 ;
4203 Psl_dVds = - ( Vgp_dVds - ( fac1 * fsl2_dVds + fac1_dVds * fsl2 ) ) * T1 ;
4204 Psl_dVgs = - ( Vgp_dVgs - ( fac1 * fsl2_dVgs + fac1_dVgs * fsl2 ) ) * T1 ;
4205
4206 if ( Chi < znbd5 ) {
4207 /*-------------------------------------------*
4208 * zone-D1/D2. (Psl)
4209 *-----------------*/
4210 Xil = fb * fb + epsm10 ;
4211 T1 = 2 * fb * fb_dChi * beta ;
4212 Xil_dVbs = T1 * ( Psl_dVbs - 1.0 ) ;
4213 Xil_dVds = T1 * Psl_dVds ;
4214 Xil_dVgs = T1 * Psl_dVgs ;
4215
4216 Xilp12 = fb + epsm10 ;
4217 T1 = fb_dChi * beta ;
4218 Xilp12_dVbs = T1 * ( Psl_dVbs - 1.0 ) ;
4219 Xilp12_dVds = T1 * Psl_dVds ;
4220 Xilp12_dVgs = T1 * Psl_dVgs ;
4221
4222 Xilp32 = fb * fb * fb + epsm10 ;
4223 T1 = 3 * fb * fb * fb_dChi * beta ;
4224 Xilp32_dVbs = T1 * ( Psl_dVbs - 1.0 ) ;
4225 Xilp32_dVds = T1 * Psl_dVds ;
4226 Xilp32_dVgs = T1 * Psl_dVgs ;
4227
4228 } else {
4229 /*-------------------------------------------*
4230 * zone-D3. (Psl)
4231 *-----------------*/
4232
4233 Xil = Chi - 1.0e0 ;
4234 Xil_dVbs = beta * ( Psl_dVbs - 1.0e0 ) ;
4235 Xil_dVds = beta * Psl_dVds ;
4236 Xil_dVgs = beta * Psl_dVgs ;
4237
4238 Xilp12 = sqrt( Xil ) ;
4239 T1 = 0.5e0 / Xilp12 ;
4240 Xilp12_dVbs = T1 * Xil_dVbs ;
4241 Xilp12_dVds = T1 * Xil_dVds ;
4242 Xilp12_dVgs = T1 * Xil_dVgs ;
4243
4244 Xilp32 = Xil * Xilp12 ;
4245 T1 = 1.5e0 * Xilp12 ;
4246 Xilp32_dVbs = T1 * Xil_dVbs ;
4247 Xilp32_dVds = T1 * Xil_dVds ;
4248 Xilp32_dVgs = T1 * Xil_dVgs ;
4249
4250 }
4251
4252 /*---------------------------------------------------*
4253 * Assign Pds.
4254 *-----------------*/
4255 Pds = Psl - Ps0 ;
4256
4257 if ( Pds < 0.0 ) {
4258 Pds = 0.0 ;
4259 Psl = Ps0 ;
4260 }
4261
4262 Pds_dVbs = Psl_dVbs - Ps0_dVbs ;
4263 Pds_dVds = Psl_dVds - Ps0_dVds ;
4264 Pds_dVgs = Psl_dVgs - Ps0_dVgs ;
4265
4266 if ( Pds < ps_conv ) {
4267 Pds_dVbs = 0.0 ;
4268 Pds_dVgs = 0.0 ;
4269 Psl_dVbs = Ps0_dVbs ;
4270 Psl_dVgs = Ps0_dVgs ;
4271 }
4272
4273 /* Vdseff */
4274 Vds = Vdsorg;
4275
4276
4277 if( corecip ){
4278
4279 /* For multi level Newton method to calculate PS0Z_SCE */
4280 /* remember that for the inner Newton: */
4281 /* Fs0(PS0Z_SCE,Ps0) = Vgp(PSOZ_SCE) - Ps0 - fac1 * fs02(Ps0) */
4282 /* -> dPs0/dPS0Z_SCE = - (dFs0/dPS0Z_SCE) / (dFs0/dPs0) */
4283 /* and */
4284 /* Fsl(PS0Z_SCE,Psl) = Vgp(PS0Z_SCE) - Psl - fac1 * fsl1(Psl) */
4285 /* -> dPsl/dPS0Z_SCE = - (dFsl/dPS0Z_SCE) / (dFsl/dPsl) */
4286
4287 /* Outer Newton: */
4288 /* PS0Z_SCE = Ps0 + Pzadd(Ps0,Psl) */
4289 /* -> G(PS0Z_SCE) := PS0Z_SCE - Ps0(PS0Z_SCE) - Pzadd(Ps0(PS0Z_SCE),Psl(Ps0Z_SCE)) = 0 */
4290 /* -> Newton correction delta_PS0Z_SCE from: */
4291 /* (1.0 - dPs0/dPS0Z_SCE - dPzadd/dPS0Z_SCE) * delta_PS0Z_SCE = - G */
4292
4293 Fs0_dPS0Z = Vgp_dPS0Z ;
4294 Ps0_dPS0Z = - Fs0_dPS0Z / Fs0_dPs0 ;
4295
4296 Fsl_dPS0Z = Vgp_dPS0Z ;
4297 Psl_dPS0Z = - Fsl_dPS0Z / Fsl_dPsl ;
4298
4299 if ( Pds < ps_conv ) {
4300 Pds_dPS0Z = 0.0 ;
4301 } else {
4302 Pds_dPS0Z = Psl_dPS0Z - Ps0_dPS0Z ;
4303 }
4304
4305 T1 = ( Vds - Pds ) / 2 ;
4306 Fn_SymAdd( Pzadd , T1 , model->HSM2_pzadd0 , T2 ) ;
4307 T2 /= 2 ;
4308 Pzadd_dVbs = T2 * ( - Pds_dVbs ) ;
4309 Pzadd_dVds = T2 * ( 1.0 - Pds_dVds ) ;
4310 Pzadd_dVgs = T2 * ( - Pds_dVgs ) ;
4311 Pzadd_dPS0Z = T2 * ( - Pds_dPS0Z) ;
4312
4313 if ( Pzadd < epsm10 ) {
4314 Pzadd = epsm10 ;
4315 Pzadd_dVbs = 0.0 ;
4316 Pzadd_dVds = 0.0 ;
4317 Pzadd_dVgs = 0.0 ;
4318 Pzadd_dPS0Z = 0.0 ;
4319 }
4320
4321 Ps0z = Ps0 + Pzadd ;
4322 Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ;
4323 Ps0z_dVds = Ps0_dVds + Pzadd_dVds ;
4324 Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ;
4325 Ps0z_dPS0Z = Ps0_dPS0Z + Pzadd_dPS0Z ;
4326
4327
4328 /* calculate Newton correction: */
4329 G = PS0Z_SCE - Ps0z ;
4330 delta_PS0Z_SCE = - G / (1.0 - Ps0z_dPS0Z) ;
4331
4332 delta_PS0Z_SCE_dVbs = Ps0z_dVbs - PS0Z_SCE_dVbs;
4333 delta_PS0Z_SCE_dVds = Ps0z_dVds - PS0Z_SCE_dVds;
4334 delta_PS0Z_SCE_dVgs = Ps0z_dVgs - PS0Z_SCE_dVgs;
4335 PS0Z_SCE += delta_PS0Z_SCE ;
4336 PS0Z_SCE_dVbs = Ps0z_dVbs ;
4337 PS0Z_SCE_dVds = Ps0z_dVds ;
4338 PS0Z_SCE_dVgs = Ps0z_dVgs ;
4339
4340 PS0_SCE = PS0Z_SCE - Pzadd ;
4341 PS0_SCE_dVbs = Ps0_dVbs ;
4342 PS0_SCE_dVds = Ps0_dVds ;
4343 PS0_SCE_dVgs = Ps0_dVgs ;
4344
4345 NNN += 1 ;
4346
4347 if( ( fabs(delta_PS0Z_SCE) > PS0_SCE_tol
4348 || fabs(delta_PS0Z_SCE_dVbs) > PS0_SCE_deriv_tol
4349 || fabs(delta_PS0Z_SCE_dVds) > PS0_SCE_deriv_tol
4350 || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol
4351 ) && (NNN < MAX_LOOP_SCE) ){
4352 // goto START_OF_SCE_LOOP;
4353 START_OF_SCE_LOOP = 1 ;
4354 }
4355
4356
4357 }
4358
4359 } /* skip end_of_part_1 */
4360 } /* End of 1st SCE_LOOP */
4361 if ( end_of_part_1 == 0 ) { /* skip to end_of_part_1 */
4362
4363 /*-----------------------------------------------------------*
4364 * Evaluate Idd.
4365 * - Eta : substantial variable of QB'/Pds and Idd/Pds.
4366 * - note: Eta = 4 * GAMMA_{hisim_0}
4367 *-----------------*/
4368 T1 = beta / Xi0 ;
4369 Eta = T1 * Pds ;
4370 T2 = Eta * beta_inv ;
4371 Eta_dVbs = T1 * ( Pds_dVbs - Xi0_dVbs * T2 ) ;
4372 Eta_dVds = T1 * ( Pds_dVds - Xi0_dVds * T2 ) ;
4373 Eta_dVgs = T1 * ( Pds_dVgs - Xi0_dVgs * T2 ) ;
4374
4375 /* ( Eta + 1 )^n */
4376 Eta1 = Eta + 1.0e0 ;
4377 Eta1p12 = sqrt( Eta1 ) ;
4378 Eta1p32 = Eta1p12 * Eta1 ;
4379 Eta1p52 = Eta1p32 * Eta1 ;
4380
4381 /* 1 / ( ( Eta + 1 )^n + 1 ) */
4382 Zeta12 = 1.0e0 / ( Eta1p12 + 1.0e0 ) ;
4383 Zeta32 = 1.0e0 / ( Eta1p32 + 1.0e0 ) ;
4384 Zeta52 = 1.0e0 / ( Eta1p52 + 1.0e0 ) ;
4385
4386 /*---------------------------------------------------*
4387 * F00 := PS00/Pds (n=1/2)
4388 *-----------------*/
4389 F00 = Zeta12 / Xi0p12 ;
4390 T3 = - 1 / Xi0 ;
4391 T4 = - 0.5e0 / Eta1p12 * F00 ;
4392 T5 = Zeta12 * T3 ;
4393 T6 = Zeta12 * T4 ;
4394 F00_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ;
4395 F00_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ;
4396 F00_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ;
4397
4398 /*---------------------------------------------------*
4399 * F10 := PS10/Pds (n=3/2)
4400 *-----------------*/
4401 T1 = 3.0e0 + Eta * ( 3.0e0 + Eta ) ;
4402 F10 = C_2o3 * Xi0p12 * Zeta32 * T1 ;
4403 T2 = 3.0e0 + Eta * 2.0e0 ;
4404 T3 = C_2o3 * T1 ;
4405 T4 = - 1.5e0 * Eta1p12 * F10 + C_2o3 * Xi0p12 * T2 ;
4406 T5 = Zeta32 * T3 ;
4407 T6 = Zeta32 * T4 ;
4408 F10_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ;
4409 F10_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ;
4410 F10_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ;
4411
4412 /*---------------------------------------------------*
4413 * F30 := PS30/Pds (n=5/2)
4414 *-----------------*/
4415 T1 = 5e0 + Eta * ( 10e0 + Eta * ( 10e0 + Eta * ( 5e0 + Eta ) ) ) ;
4416 F30 = 4e0 / ( 15e0 * beta ) * Xi0p32 * Zeta52 * T1 ;
4417 T2 = 10e0 + Eta * ( 20e0 + Eta * ( 15e0 + Eta * 4e0 ) ) ;
4418 T3 = 4e0 / ( 15e0 * beta ) * T1 ;
4419 T4 = - ( 5e0 / 2e0 ) * Eta1p32 * F30 + 4e0 / ( 15e0 * beta ) * Xi0p32 * T2 ;
4420 T5 = Zeta52 * T3 ;
4421 T6 = Zeta52 * T4 ;
4422 F30_dVbs = ( Xi0p32_dVbs * T5 + Eta_dVbs * T6 ) ;
4423 F30_dVds = ( Xi0p32_dVds * T5 + Eta_dVds * T6 ) ;
4424 F30_dVgs = ( Xi0p32_dVgs * T5 + Eta_dVgs * T6 ) ;
4425
4426 /*---------------------------------------------------*
4427 * F11 := PS11/Pds.
4428 *-----------------*/
4429 F11 = Ps0 * F10 + C_2o3 * beta_inv * Xilp32 - F30 ;
4430 T1 = C_2o3 * beta_inv ;
4431 F11_dVbs = Ps0_dVbs * F10 + Ps0 * F10_dVbs
4432 + T1 * Xilp32_dVbs - F30_dVbs ;
4433 F11_dVds = Ps0_dVds * F10 + Ps0 * F10_dVds
4434 + T1 * Xilp32_dVds - F30_dVds ;
4435 F11_dVgs = Ps0_dVgs * F10 + Ps0 * F10_dVgs
4436 + T1 * Xilp32_dVgs - F30_dVgs ;
4437
4438 /*---------------------------------------------------*
4439 * Fdd := Idd/Pds.
4440 *-----------------*/
4441 T1 = Vgp + beta_inv - 0.5e0 * ( 2.0e0 * Ps0 + Pds ) ;
4442 T2 = - F10 + F00 ;
4443 T3 = beta * Cox ;
4444 T4 = beta * cnst0 ;
4445 Fdd = T3 * T1 + T4 * T2 ;
4446 Fdd_dVbs = T3 * ( Vgp_dVbs - Ps0_dVbs - 0.5e0 * Pds_dVbs )
4447 + beta * Cox_dVb * T1 + T4 * ( - F10_dVbs + F00_dVbs ) ;
4448 Fdd_dVds = T3 * ( Vgp_dVds - Ps0_dVds - 0.5e0 * Pds_dVds )
4449 + beta * Cox_dVd * T1 + T4 * ( - F10_dVds + F00_dVds ) ;
4450 Fdd_dVgs = T3 * ( Vgp_dVgs - Ps0_dVgs - 0.5e0 * Pds_dVgs )
4451 + beta * Cox_dVg * T1 + T4 * ( - F10_dVgs + F00_dVgs ) ;
4452
4453
4454 /*---------------------------------------------------*
4455 * Idd:
4456 *-----------------*/
4457 Idd = Pds * Fdd ;
4458 Idd_dVbs = Pds_dVbs * Fdd + Pds * Fdd_dVbs ;
4459 Idd_dVds = Pds_dVds * Fdd + Pds * Fdd_dVds ;
4460 Idd_dVgs = Pds_dVgs * Fdd + Pds * Fdd_dVgs ;
4461
4462 /*-----------------------------------------------------------*
4463 * Skip CLM and integrated charges if zone==D1
4464 *-----------------*/
4465 if( flg_zone == 1 ) {
4466 goto start_of_mobility ;
4467 }
4468
4469 /*-----------------------------------------------------------*
4470 * Channel Length Modulation. Lred: \Delta L
4471 *-----------------*/
4472 if( pParam->HSM2_clm2 < epsm10 && pParam->HSM2_clm3 < epsm10 ) {
4473 Lred = 0.0e0 ;
4474 Lred_dVbs = 0.0e0 ;
4475 Lred_dVds = 0.0e0 ;
4476 Lred_dVgs = 0.0e0 ;
4477
4478 Psdl = Psl ;
4479 Psdl_dVbs = Psl_dVbs ;
4480 Psdl_dVds = Psl_dVds ;
4481 Psdl_dVgs = Psl_dVgs ;
4482 if ( Psdl > Ps0 + Vds - epsm10 ) {
4483 Psdl = Ps0 + Vds - epsm10 ;
4484 Psdl_dVbs = Ps0_dVbs ;
4485 Psdl_dVds = Ps0_dVds + 1.0 ;
4486 Psdl_dVgs = Ps0_dVgs ;
4487 }
4488
4489 } else {
4490 T1 = here->HSM2_wdpl ;
4491 T8 = sqrt (Psl - Vbs) ;
4492 Wd = T1 * T8 ;
4493 T9 = 0.5 * T1 / T8 ;
4494 Wd_dVbs = T9 * (Psl_dVbs - 1.0) ;
4495 Wd_dVds = T9 * Psl_dVds ;
4496 Wd_dVgs = T9 * Psl_dVgs ;
4497
4498 T0 = 1.0 / Wd ;
4499 T1 = Qn0 * T0 ;
4500 T2 = pParam->HSM2_clm3 * T1 ;
4501 T3 = pParam->HSM2_clm3 * T0 ;
4502 T2_dVb = T3 * (Qn0_dVbs - T1 * Wd_dVbs) ;
4503 T2_dVd = T3 * (Qn0_dVds - T1 * Wd_dVds) ;
4504 T2_dVg = T3 * (Qn0_dVgs - T1 * Wd_dVgs) ;
4505
4506 T5 = pParam->HSM2_clm2 * q_Nsub + T2 ;
4507 T1 = 1.0 / T5 ;
4508 T4 = C_ESI * T1 ;
4509 T4_dVb = - T4 * T2_dVb * T1 ;
4510 T4_dVd = - T4 * T2_dVd * T1 ;
4511 T4_dVg = - T4 * T2_dVg * T1 ;
4512
4513 T1 = (1.0e0 - pParam->HSM2_clm1) ;
4514 Psdl = pParam->HSM2_clm1 * (Vds + Ps0) + T1 * Psl ;
4515 Psdl_dVbs = pParam->HSM2_clm1 * Ps0_dVbs + T1 * Psl_dVbs ;
4516 Psdl_dVds = pParam->HSM2_clm1 * (1.0 + Ps0_dVds) + T1 * Psl_dVds ;
4517 Psdl_dVgs = pParam->HSM2_clm1 * Ps0_dVgs + T1 * Psl_dVgs ;
4518 if ( Psdl > Ps0 + Vds - epsm10 ) {
4519 Psdl = Ps0 + Vds - epsm10 ;
4520 Psdl_dVbs = Ps0_dVbs ;
4521 Psdl_dVds = Ps0_dVds + 1.0 ;
4522 Psdl_dVgs = Ps0_dVgs ;
4523 }
4524 T6 = Psdl - Psl ;
4525 T6_dVb = Psdl_dVbs - Psl_dVbs ;
4526 T6_dVd = Psdl_dVds - Psl_dVds ;
4527 T6_dVg = Psdl_dVgs - Psl_dVgs ;
4528
4529 T3 = beta * Qn0 ;
4530 T1 = 1.0 / T3 ;
4531 T5 = Idd * T1 ;
4532 T2 = T5 * beta ;
4533 T5_dVb = (Idd_dVbs - T2 * Qn0_dVbs) * T1 ;
4534 T5_dVd = (Idd_dVds - T2 * Qn0_dVds) * T1 ;
4535 T5_dVg = (Idd_dVgs - T2 * Qn0_dVgs) * T1 ;
4536
4537 T10 = q_Nsub / C_ESI ;
4538 T1 = C_E0_p2 ; // E0^2
4539 T2 = 1.0 / Leff ;
4540 T11 = (2.0 * T5 + 2.0 * T10 * T6 * T4 + T1 * T4) * T2 ;
4541 T3 = T2 * T4 ;
4542 T7 = T11 * T4 ;
4543 T7_dVb = (2.0 * T5_dVb + 2.0 * T10 * (T6_dVb * T4 + T6 * T4_dVb) + T1 * T4_dVb) * T3 + T11 * T4_dVb ;
4544 T7_dVd = (2.0 * T5_dVd + 2.0 * T10 * (T6_dVd * T4 + T6 * T4_dVd) + T1 * T4_dVd) * T3 + T11 * T4_dVd ;
4545 T7_dVg = (2.0 * T5_dVg + 2.0 * T10 * (T6_dVg * T4 + T6 * T4_dVg) + T1 * T4_dVg) * T3 + T11 * T4_dVg ;
4546
4547 T11 = 4.0 * (2.0 * T10 * T6 + T1) ;
4548 T1 = 8.0 * T10 * T4 * T4 ;
4549 T2 = 2.0 * T11 * T4 ;
4550 T8 = T11 * T4 * T4 ;
4551 T8_dVb = ( T1 * T6_dVb + T2 * T4_dVb) ;
4552 T8_dVd = ( T1 * T6_dVd + T2 * T4_dVd) ;
4553 T8_dVg = ( T1 * T6_dVg + T2 * T4_dVg) ;
4554
4555 T9 = sqrt (T7 * T7 + T8);
4556 T1 = 1.0 / T9 ;
4557 T2 = T7 * T1 ;
4558 T3 = 0.5 * T1 ;
4559 T9_dVb = (T2 * T7_dVb + T3 * T8_dVb) ;
4560 T9_dVd = (T2 * T7_dVd + T3 * T8_dVd) ;
4561 T9_dVg = (T2 * T7_dVg + T3 * T8_dVg) ;
4562
4563 Lred = 0.5 * (- T7 + T9) ;
4564 Lred_dVbs = 0.5 * (- T7_dVb + T9_dVb) ;
4565 Lred_dVds = 0.5 * (- T7_dVd + T9_dVd) ;
4566 Lred_dVgs = 0.5 * (- T7_dVg + T9_dVg) ;
4567
4568 /*---------------------------------------------------*
4569 * Modify Lred for symmetry.
4570 *-----------------*/
4571 T1 = Lred ;
4572 Lred = FMDVDS * T1 ;
4573 Lred_dVbs = FMDVDS_dVbs * T1 + FMDVDS * Lred_dVbs ;
4574 Lred_dVds = FMDVDS_dVds * T1 + FMDVDS * Lred_dVds ;
4575 Lred_dVgs = FMDVDS_dVgs * T1 + FMDVDS * Lred_dVgs ;
4576 }
4577
4578 /* CLM5 & CLM6 */
4579 Lred *= here->HSM2_clmmod ;
4580 Lred_dVbs *= here->HSM2_clmmod ;
4581 Lred_dVds *= here->HSM2_clmmod ;
4582 Lred_dVgs *= here->HSM2_clmmod ;
4583
4584
4585 /*---------------------------------------------------*
4586 * Qbu : -Qb in unit area.
4587 *-----------------*/
4588 T1 = Vgp + beta_inv ;
4589 T2 = T1 * F10 - F11 ;
4590
4591 Qbnm = cnst0 * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds )
4592 + Cox * T2 ) ;
4593 Qbnm_dVbs = cnst0 * ( cnst0 * ( - Xi0_dVbs - 0.5e0 * beta * Pds_dVbs )
4594 + Cox * ( Vgp_dVbs * F10 + T1 * F10_dVbs - F11_dVbs )
4595 + Cox_dVb * T2 ) ;
4596 Qbnm_dVds = cnst0 * ( cnst0 * ( - Xi0_dVds - 0.5e0 * beta * Pds_dVds )
4597 + Cox * ( Vgp_dVds * F10 + T1 * F10_dVds - F11_dVds )
4598 + Cox_dVd * T2 ) ;
4599 Qbnm_dVgs = cnst0 * ( cnst0 * ( - Xi0_dVgs - 0.5e0 * beta * Pds_dVgs )
4600 + Cox * ( Vgp_dVgs * F10 + T1 * F10_dVgs - F11_dVgs )
4601 + Cox_dVg * T2 ) ;
4602
4603 T1 = beta ;
4604 Qbu = T1 * Qbnm / Fdd ;
4605 T2 = T1 / ( Fdd * Fdd ) ;
4606 Qbu_dVbs = T2 * ( Fdd * Qbnm_dVbs - Qbnm * Fdd_dVbs ) ;
4607 Qbu_dVds = T2 * ( Fdd * Qbnm_dVds - Qbnm * Fdd_dVds ) ;
4608 Qbu_dVgs = T2 * ( Fdd * Qbnm_dVgs - Qbnm * Fdd_dVgs ) ;
4609
4610 /*---------------------------------------------------*
4611 * preparation for Qi and Qd.
4612 * - DtPds: Delta * Pds ;
4613 * - Achi: (1+Delta) * Pds ;
4614 *-----------------*/
4615 T1 = 2.0e0 * fac1 ;
4616 DtPds = T1 * ( F10 - Xi0p12 ) ;
4617 T2 = 2.0 * ( F10 - Xi0p12 ) ;
4618 DtPds_dVbs = T1 * ( F10_dVbs - Xi0p12_dVbs )
4619 + T2 * fac1_dVbs ;
4620 DtPds_dVds = T1 * ( F10_dVds - Xi0p12_dVds )
4621 + T2 * fac1_dVds ;
4622 DtPds_dVgs = T1 * ( F10_dVgs - Xi0p12_dVgs )
4623 + T2 * fac1_dVgs ;
4624
4625 Achi = Pds + DtPds ;
4626 Achi_dVbs = Pds_dVbs + DtPds_dVbs ;
4627 Achi_dVds = Pds_dVds + DtPds_dVds ;
4628 Achi_dVgs = Pds_dVgs + DtPds_dVgs ;
4629
4630 /*-----------------------------------------------------------*
4631 * Alpha : parameter to evaluate charges.
4632 * - Achi: (1+Delta) * Pds ;
4633 * - clamped to 0 if Alpha < 0.
4634 *-----------------*/
4635 T1 = 1.0 / VgVt ;
4636 T2 = Achi * T1 ;
4637 T3 = 1.0e0 - T2 ;
4638 TX = 1.0 - T3 ;
4639 Fn_CP( TY , TX , 1.0 , 4 , T4 ) ;
4640 Alpha = 1.0 - TY ;
4641 T5 = T1 * T4 ;
4642 Alpha_dVbs = - ( Achi_dVbs - T2 * VgVt_dVbs ) * T5 ;
4643 Alpha_dVds = - ( Achi_dVds - T2 * VgVt_dVds ) * T5 ;
4644 Alpha_dVgs = - ( Achi_dVgs - T2 * VgVt_dVgs ) * T5 ;
4645
4646
4647 /*-----------------------------------------------------------*
4648 * Qiu : -Qi in unit area.
4649 *-----------------*/
4650
4651 Qinm = 1.0e0 + Alpha * ( 1.0e0 + Alpha ) ;
4652 T1 = 1.0e0 + Alpha + Alpha ;
4653 Qinm_dVbs = Alpha_dVbs * T1 ;
4654 Qinm_dVds = Alpha_dVds * T1 ;
4655 Qinm_dVgs = Alpha_dVgs * T1 ;
4656
4657 Qidn = Fn_Max( 1.0e0 + Alpha , epsm10 ) ;
4658 Qidn_dVbs = Alpha_dVbs ;
4659 Qidn_dVds = Alpha_dVds ;
4660 Qidn_dVgs = Alpha_dVgs ;
4661
4662 T1 = C_2o3 * VgVt * Qinm / Qidn ;
4663 Qiu = T1 * Cox ;
4664 T2 = 1.0 / VgVt ;
4665 T3 = 1.0 / Qinm ;
4666 T4 = 1.0 / Qidn ;
4667 Qiu_dVbs = Qiu * ( VgVt_dVbs * T2 + Qinm_dVbs * T3 - Qidn_dVbs * T4 )
4668 + T1 * Cox_dVb ;
4669 Qiu_dVds = Qiu * ( VgVt_dVds * T2 + Qinm_dVds * T3 - Qidn_dVds * T4)
4670 + T1 * Cox_dVd ;
4671 Qiu_dVgs = Qiu * ( VgVt_dVgs * T2 + Qinm_dVgs * T3 - Qidn_dVgs * T4)
4672 + T1 * Cox_dVg ;
4673
4674 /*-----------------------------------------------------------*
4675 * Qdrat : Qd/Qi
4676 *-----------------*/
4677 Qdnm = 0.5e0 + Alpha ;
4678 Qdnm_dVbs = Alpha_dVbs ;
4679 Qdnm_dVds = Alpha_dVds ;
4680 Qdnm_dVgs = Alpha_dVgs ;
4681
4682 Qddn = Qidn * Qinm ;
4683 Qddn_dVbs = Qidn_dVbs * Qinm + Qidn * Qinm_dVbs ;
4684 Qddn_dVds = Qidn_dVds * Qinm + Qidn * Qinm_dVds ;
4685 Qddn_dVgs = Qidn_dVgs * Qinm + Qidn * Qinm_dVgs ;
4686
4687 Quot = 0.4e0 * Qdnm / Qddn ;
4688 Qdrat = 0.6e0 - Quot ;
4689
4690 if ( Qdrat <= 0.5e0 ) {
4691 T1 = 1.0 / Qddn ;
4692 T2 = 1.0 / Qdnm ;
4693 Qdrat_dVbs = Quot * ( Qddn_dVbs * T1 - Qdnm_dVbs * T2 ) ;
4694 Qdrat_dVds = Quot * ( Qddn_dVds * T1 - Qdnm_dVds * T2 ) ;
4695 Qdrat_dVgs = Quot * ( Qddn_dVgs * T1 - Qdnm_dVgs * T2 ) ;
4696 } else {
4697 Qdrat = 0.5e0 ;
4698 Qdrat_dVbs = 0.0e0 ;
4699 Qdrat_dVds = 0.0e0 ;
4700 Qdrat_dVgs = 0.0e0 ;
4701 }
4702
4703
4704 /*-----------------------------------------------------------*
4705 * Interpolate charges and CLM for zone-D2.
4706 *-----------------*/
4707
4708 if ( flg_zone == 2 ) {
4709 T1 = Qbu ;
4710 Qbu = FD2 * Qbu + ( 1.0 - FD2 ) * Qb0 ;
4711 Qbu_dVbs = FD2 * Qbu_dVbs + FD2_dVbs * T1
4712 + ( 1.0 - FD2 ) * Qb0_dVb - FD2_dVbs * Qb0 ;
4713 Qbu_dVds = FD2 * Qbu_dVds + FD2_dVds * T1
4714 + ( 1.0 - FD2 ) * Qb0_dVd - FD2_dVds * Qb0 ;
4715 Qbu_dVgs = FD2 * Qbu_dVgs + FD2_dVgs * T1
4716 + ( 1.0 - FD2 ) * Qb0_dVg - FD2_dVgs * Qb0 ;
4717
4718 if ( Qbu < 0.0 ) {
4719 Qbu = 0.0 ;
4720 Qbu_dVbs = 0.0 ;
4721 Qbu_dVds = 0.0 ;
4722 Qbu_dVgs = 0.0 ;
4723 }
4724 T1 = Qiu ;
4725 Qiu = FD2 * Qiu + ( 1.0 - FD2 ) * Qn0 ;
4726 Qiu_dVbs = FD2 * Qiu_dVbs + FD2_dVbs * T1
4727 + ( 1.0 - FD2 ) * Qn0_dVbs - FD2_dVbs * Qn0 ;
4728 Qiu_dVds = FD2 * Qiu_dVds + FD2_dVds * T1
4729 + ( 1.0 - FD2 ) * Qn0_dVds - FD2_dVds * Qn0 ;
4730 Qiu_dVgs = FD2 * Qiu_dVgs + FD2_dVgs * T1
4731 + ( 1.0 - FD2 ) * Qn0_dVgs - FD2_dVgs * Qn0 ;
4732 if ( Qiu < 0.0 ) {
4733 Qiu = 0.0 ;
4734 Qiu_dVbs = 0.0 ;
4735 Qiu_dVds = 0.0 ;
4736 Qiu_dVgs = 0.0 ;
4737 }
4738
4739 T1 = Qdrat ;
4740 Qdrat = FD2 * Qdrat + ( 1.0 - FD2 ) * 0.5e0 ;
4741 Qdrat_dVbs = FD2 * Qdrat_dVbs + FD2_dVbs * T1 - FD2_dVbs * 0.5e0 ;
4742 Qdrat_dVds = FD2 * Qdrat_dVds + FD2_dVds * T1 - FD2_dVds * 0.5e0 ;
4743 Qdrat_dVgs = FD2 * Qdrat_dVgs + FD2_dVgs * T1 - FD2_dVgs * 0.5e0 ;
4744
4745 /* note: Lred=0 in zone-D1 */
4746 T1 = Lred ;
4747 Lred = FD2 * Lred ;
4748 Lred_dVbs = FD2 * Lred_dVbs + FD2_dVbs * T1 ;
4749 Lred_dVds = FD2 * Lred_dVds + FD2_dVds * T1 ;
4750 Lred_dVgs = FD2 * Lred_dVgs + FD2_dVgs * T1 ;
4751 } /* end of flg_zone==2 if-block */
4752
4753
4754 start_of_mobility:
4755
4756 Lch = Leff - Lred ;
4757 if ( Lch < 1.0e-9 ) {
4758 Lch = 1.0e-9 ; Lch_dVbs = Lch_dVds = Lch_dVgs = 0.0 ;
4759 } else { Lch_dVbs = - Lred_dVbs ; Lch_dVds = - Lred_dVds ; Lch_dVgs = - Lred_dVgs ; }
4760
4761
4762
4763 /*-----------------------------------------------------------*
4764 * Muun : universal mobility. (CGS unit)
4765 *-----------------*/
4766
4767 T1 = here->HSM2_ndep_o_esi / C_m2cm ; /* fix in version 2.8 */
4768 T2 = here->HSM2_ninv_o_esi / C_m2cm ; /* fix in version 2.8 */
4769
4770 T0 = here->HSM2_ninvd ;
4771 T3 = sqrt(Pds*Pds + model->HSM2_vzadd0) ;
4772 Pdsz = T3 - sqrt(model->HSM2_vzadd0) ;
4773 Pdsz_dVbs = Pds_dVbs * Pds / T3 ;
4774 Pdsz_dVds = Pds_dVds * Pds / T3 ;
4775 Pdsz_dVgs = Pds_dVgs * Pds / T3 ;
4776
4777 T4 = 1.0 + Pdsz * T0 ;
4778 T4_dVb = Pdsz_dVbs * T0 ;
4779 T4_dVd = Pdsz_dVds * T0 ;
4780 T4_dVg = Pdsz_dVgs * T0 ;
4781
4782 T5 = T1 * Qbu + T2 * Qiu ;
4783 T5_dVb = T1 * Qbu_dVbs + T2 * Qiu_dVbs ;
4784 T5_dVd = T1 * Qbu_dVds + T2 * Qiu_dVds ;
4785 T5_dVg = T1 * Qbu_dVgs + T2 * Qiu_dVgs ;
4786
4787 T3 = T5 / T4 ;
4788 T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ;
4789 T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ;
4790 T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ;
4791
4792 Eeff = T3 ;
4793 Eeff_dVbs = T3_dVb ;
4794 Eeff_dVds = T3_dVd ;
4795 Eeff_dVgs = T3_dVg ;
4796
4797 T5 = Fn_Pow( Eeff , model->HSM2_mueph0 - 1.0e0 ) ;
4798 T8 = T5 * Eeff ;
4799 T7 = Fn_Pow( Eeff , here->HSM2_muesr - 1.0e0 ) ;
4800 T6 = T7 * Eeff ;
4801
4802
4803 T9 = C_QE * C_m2cm_p2 ;
4804 Rns = Qiu / T9 ;
4805 T1 = 1.0e0 / ( here->HSM2_muecb0 + here->HSM2_muecb1 * Rns / 1.0e11 )
4806 + here->HSM2_mphn0 * T8 + T6 / pParam->HSM2_muesr1 ;
4807 Muun = 1.0e0 / T1 ;
4808
4809 T1 = 1.0e0 / ( T1 * T1 ) ;
4810 T2 = here->HSM2_muecb0 + here->HSM2_muecb1 * Rns / 1.0e11 ;
4811 T2 = 1.0e0 / ( T2 * T2 ) ;
4812 T3 = here->HSM2_mphn1 * T5 ;
4813 T4 = here->HSM2_muesr * T7 / pParam->HSM2_muesr1 ;
4814 T5 = - 1.0e-11 * here->HSM2_muecb1 / C_QE * T2 / C_m2cm_p2 ;
4815 Muun_dVbs = - ( T5 * Qiu_dVbs
4816 + Eeff_dVbs * T3 + Eeff_dVbs * T4 ) * T1 ;
4817 Muun_dVds = - ( T5 * Qiu_dVds
4818 + Eeff_dVds * T3 + Eeff_dVds * T4 ) * T1 ;
4819 Muun_dVgs = - ( T5 * Qiu_dVgs
4820 + Eeff_dVgs * T3 + Eeff_dVgs * T4 ) * T1 ;
4821
4822 /* Change to MKS unit */
4823 Muun /= C_m2cm_p2 ;
4824 Muun_dVbs /= C_m2cm_p2 ;
4825 Muun_dVds /= C_m2cm_p2 ;
4826 Muun_dVgs /= C_m2cm_p2 ;
4827 /*-----------------------------------------------------------*
4828 * Mu : mobility
4829 *-----------------*/
4830 T2 = beta * (Qn0 + small) * Lch ;
4831
4832
4833 T1 = 1.0e0 / T2 ;
4834 T3 = T1 * T1 ;
4835 T4 = - beta * T3 ;
4836 T5 = T4 * Lch ;
4837 T6 = T4 * (Qn0 + small) ;
4838 T1_dVb = ( T5 * Qn0_dVbs + T6 * Lch_dVbs) ;
4839 T1_dVd = ( T5 * Qn0_dVds + T6 * Lch_dVds) ;
4840 T1_dVg = ( T5 * Qn0_dVgs + T6 * Lch_dVgs) ;
4841
4842 TY = Idd * T1 ;
4843 TY_dVbs = Idd_dVbs * T1 + Idd * T1_dVb ;
4844 TY_dVds = Idd_dVds * T1 + Idd * T1_dVd ;
4845 TY_dVgs = Idd_dVgs * T1 + Idd * T1_dVg ;
4846
4847 T2 = 0.2 * Vmax / Muun ;
4848 T3 = - T2 / Muun ;
4849 T2_dVb = T3 * Muun_dVbs ;
4850 T2_dVd = T3 * Muun_dVds ;
4851 T2_dVg = T3 * Muun_dVgs ;
4852
4853 Ey = sqrt( TY * TY + T2 * T2 ) ;
4854 T4 = 1.0 / Ey ;
4855 Ey_dVbs = T4 * ( TY * TY_dVbs + T2 * T2_dVb ) ;
4856 Ey_dVds = T4 * ( TY * TY_dVds + T2 * T2_dVd ) ;
4857 Ey_dVgs = T4 * ( TY * TY_dVgs + T2 * T2_dVg ) ;
4858
4859 Em = Muun * Ey ;
4860 Em_dVbs = Muun_dVbs * Ey + Muun * Ey_dVbs ;
4861 Em_dVds = Muun_dVds * Ey + Muun * Ey_dVds ;
4862 Em_dVgs = Muun_dVgs * Ey + Muun * Ey_dVgs ;
4863
4864 T1 = Em / Vmax ;
4865
4866 /* note: model->HSM2_bb = 2 (electron) ;1 (hole) */
4867 if ( 1.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 1.0e0 + epsm10 ) {
4868 T3 = 1.0e0 ;
4869 } else if ( 2.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 2.0e0 + epsm10 ) {
4870 T3 = T1 ;
4871 } else {
4872 T3 = Fn_Pow( T1 , model->HSM2_bb - 1.0e0 ) ;
4873 }
4874 T2 = T1 * T3 ;
4875 T4 = 1.0e0 + T2 ;
4876
4877 if ( 1.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 1.0e0 + epsm10 ) {
4878 T5 = 1.0 / T4 ;
4879 T6 = T5 / T4 ;
4880 } else if ( 2.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 2.0e0 + epsm10 ) {
4881 T5 = 1.0 / sqrt( T4 ) ;
4882 T6 = T5 / T4 ;
4883 } else {
4884 T6 = Fn_Pow( T4 , ( - 1.0e0 / model->HSM2_bb - 1.0e0 ) ) ;
4885 T5 = T4 * T6 ;
4886 }
4887
4888 T7 = Muun / Vmax * T6 * T3 ;
4889
4890 Mu = Muun * T5 ;
4891 Mu_dVbs = Muun_dVbs * T5 - T7 * Em_dVbs ;
4892 Mu_dVds = Muun_dVds * T5 - T7 * Em_dVds ;
4893 Mu_dVgs = Muun_dVgs * T5 - T7 * Em_dVgs ;
4894
4895 /* end_of_mobility : */
4896
4897 /*-----------------------------------------------------------*
4898 * Ids: channel current.
4899 *-----------------*/
4900 betaWL = here->HSM2_weff_nf * beta_inv / Lch ;
4901 T1 = - betaWL / Lch ;
4902 betaWL_dVbs = T1 * Lch_dVbs ;
4903 betaWL_dVds = T1 * Lch_dVds ;
4904 betaWL_dVgs = T1 * Lch_dVgs ;
4905
4906 Ids0 = betaWL * Idd * Mu ;
4907 T1 = betaWL * Idd ;
4908 T2 = Idd * Mu ;
4909 T3 = Mu * betaWL ;
4910 Ids0_dVbs = T3 * Idd_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ;
4911 Ids0_dVds = T3 * Idd_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ;
4912 Ids0_dVgs = T3 * Idd_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ;
4913
4914 /*-----------------------------------------------------------*
4915 * Adding parasitic components to the channel current.
4916 *-----------------*/
4917 if( model->HSM2_ptl != 0 ){
4918 T1 = 0.5 * ( Vds - Pds ) ;
4919 Fn_SymAdd( T6 , T1 , 0.01 , T2 ) ;
4920 T2 *= 0.5 ;
4921 T6_dVb = T2 * ( - Pds_dVbs ) ;
4922 T6_dVd = T2 * ( 1.0 - Pds_dVds ) ;
4923 T6_dVg = T2 * ( - Pds_dVgs ) ;
4924
4925 T1 = 1.1 - ( Ps0 + T6 );
4926 T1_dVb = - ( Ps0_dVbs + T6_dVb );
4927 T1_dVd = - ( Ps0_dVds + T6_dVd );
4928 T1_dVg = - ( Ps0_dVgs + T6_dVg );
4929
4930 Fn_SZ( T2 , T1 , 0.05 , T0 ) ;
4931 T2 += small ;
4932 T2_dVb = T1_dVb * T0 ;
4933 T2_dVd = T1_dVd * T0 ;
4934 T2_dVg = T1_dVg * T0 ;
4935
4936 T0 = beta * here->HSM2_ptl0 ;
4937 T3 = Cox * T0 ;
4938 T3_dVb = Cox_dVb * T0 ;
4939 T3_dVd = Cox_dVd * T0 ;
4940 T3_dVg = Cox_dVg * T0 ;
4941 T0 = pow( T2 , model->HSM2_ptp ) ;
4942 T9 = T3 * T0 ;
4943 T9_dVb = T3 * model->HSM2_ptp * T0 / T2 * T2_dVb + T3_dVb * T0 ;
4944 T9_dVd = T3 * model->HSM2_ptp * T0 / T2 * T2_dVd + T3_dVd * T0 ;
4945 T9_dVg = T3 * model->HSM2_ptp * T0 / T2 * T2_dVg + T3_dVg * T0 ;
4946
4947
4948 T4 = 1.0 + Vdsz * model->HSM2_pt2 ;
4949 T4_dVb = 0.0 ;
4950 T4_dVd = Vdsz_dVds * model->HSM2_pt2 ;
4951 T4_dVg = 0.0 ;
4952
4953 T0 = here->HSM2_pt40 ;
4954 T5 = Ps0 + T6 - Vbsz ;
4955 T5_dVb = Ps0_dVbs + T6_dVb - Vbsz_dVbs ;
4956 T5_dVd = Ps0_dVds + T6_dVd - Vbsz_dVds ;
4957 T5_dVg = Ps0_dVgs + T6_dVg ;
4958 T4 += Vdsz * T0 * T5 ;
4959 T4_dVb += Vdsz * T0 * T5_dVb ;
4960 T4_dVd += Vdsz * T0 * T5_dVd + Vdsz_dVds * T0 * T5 ;
4961 T4_dVg += Vdsz * T0 * T5_dVg ;
4962
4963 T6 = T9 * T4 ;
4964 T9_dVb = T9_dVb * T4 + T9 * T4_dVb ;
4965 T9_dVd = T9_dVd * T4 + T9 * T4_dVd ;
4966 T9_dVg = T9_dVg * T4 + T9 * T4_dVg ;
4967 T9 = T6 ;
4968
4969 }else{
4970 T9 = 0.0 ;
4971 T9_dVb = 0.0 ;
4972 T9_dVd = 0.0 ;
4973 T9_dVg = 0.0 ;
4974 }
4975
4976
4977 if( model->HSM2_gdl != 0 ){
4978 T1 = beta * here->HSM2_gdl0 ;
4979 T2 = Cox * T1 ;
4980 T2_dVb = Cox_dVb * T1 ;
4981 T2_dVd = Cox_dVd * T1 ;
4982 T2_dVg = Cox_dVg * T1 ;
4983 T8 = T2 * Vdsz ;
4984 T8_dVb = T2_dVb * Vdsz ;
4985 T8_dVd = T2_dVd * Vdsz + T2 * Vdsz_dVds ;
4986 T8_dVg = T2_dVg * Vdsz ;
4987 }else{
4988 T8 = 0.0 ;
4989 T8_dVb = 0.0 ;
4990 T8_dVd = 0.0 ;
4991 T8_dVg = 0.0 ;
4992 }
4993
4994
4995 if ( ( T9 + T8 ) > 0.0 ) {
4996 Idd1 = Pds * ( T9 + T8 ) ;
4997 Idd1_dVbs = Pds_dVbs * ( T9 + T8 ) + Pds * ( T9_dVb + T8_dVb ) ;
4998 Idd1_dVds = Pds_dVds * ( T9 + T8 ) + Pds * ( T9_dVd + T8_dVd ) ;
4999 Idd1_dVgs = Pds_dVgs * ( T9 + T8 ) + Pds * ( T9_dVg + T8_dVg ) ;
5000
5001 Ids0 += betaWL * Idd1 * Mu ;
5002 T1 = betaWL * Idd1 ;
5003 T2 = Idd1 * Mu ;
5004 T3 = Mu * betaWL ;
5005 Ids0_dVbs += T3 * Idd1_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ;
5006 Ids0_dVds += T3 * Idd1_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ;
5007 Ids0_dVgs += T3 * Idd1_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ;
5008 }
5009
5010
5011 /* (note: rpock procedure was removed. (2006.04.20) */
5012 if ( flg_rsrd == 2 ) {
5013 Rd = here->HSM2_rd ;
5014 T0 = Rd * Ids0 ;
5015 T1 = Vds + small ;
5016 T2 = 1.0 / T1 ;
5017 T3 = 1.0 + T0 * T2 ;
5018 T3_dVb = Rd * Ids0_dVbs * T2 ;
5019 T3_dVd = ( Rd * Ids0_dVds * T1 - T0 ) * T2 * T2 ;
5020 T3_dVg = Rd * Ids0_dVgs * T2 ;
5021 T4 = 1.0 / T3 ;
5022 Ids = Ids0 * T4 ;
5023 T5 = T4 * T4 ;
5024 Ids_dVbs = ( Ids0_dVbs * T3 - Ids0 * T3_dVb ) * T5 ;
5025 Ids_dVds = ( Ids0_dVds * T3 - Ids0 * T3_dVd ) * T5 ;
5026 Ids_dVgs = ( Ids0_dVgs * T3 - Ids0 * T3_dVg ) * T5 ;
5027 } else {
5028 Ids = Ids0 ;
5029 Ids_dVbs = Ids0_dVbs ;
5030 Ids_dVds = Ids0_dVds ;
5031 Ids_dVgs = Ids0_dVgs ;
5032 }
5033
5034 if ( Pds < ps_conv ) {
5035 Ids_dVbs = 0.0 ;
5036 Ids_dVgs = 0.0 ;
5037 }
5038
5039 Ids += Gdsmin * Vds ;
5040 Ids_dVds += Gdsmin ;
5041
5042
5043 /*-----------------------------------------------------------*
5044 * STI
5045 *-----------------*/
5046 if ( model->HSM2_coisti != 0 ) {
5047 /*---------------------------------------------------*
5048 * dVthSCSTI : Short-channel effect induced by Vds (STI).
5049 *-----------------*/
5050 T1 = C_ESI * Cox_inv ;
5051 T2 = here->HSM2_wdpl ;
5052 T3 = here->HSM2_lgatesm - model->HSM2_parl2 ;
5053 T4 = 1.0 / (T3 * T3) ;
5054 T5 = 2.0 * (model->HSM2_vbi - Pb20b) * T1 * T2 * T4 ;
5055
5056 dVth0 = T5 * sqrt_Pbsum ;
5057 T6 = T5 * 0.5 / sqrt_Pbsum ;
5058 T7 = 2.0 * (model->HSM2_vbi - Pb20b) * C_ESI * T2 * T4 * sqrt_Pbsum ;
5059 T8 = - 2.0 * T1 * T2 * T4 * sqrt_Pbsum ;
5060 dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ;
5061 dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ;
5062 dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ;
5063
5064 T4 = pParam->HSM2_scsti1 ;
5065 T6 = pParam->HSM2_scsti2 ;
5066 T1 = T4 + T6 * Vdsz ;
5067 dVthSCSTI = dVth0 * T1 ;
5068 dVthSCSTI_dVb = dVth0_dVb * T1 ;
5069 dVthSCSTI_dVd = dVth0_dVd * T1 + dVth0 * T6 * Vdsz_dVds ;
5070 dVthSCSTI_dVg = dVth0_dVg * T1 ;
5071
5072 T1 = pParam->HSM2_vthsti - model->HSM2_vdsti * Vds ;
5073 T1_dVd = - model->HSM2_vdsti ;
5074
5075 Vgssti = Vgsz - Vfb + T1 + dVthSCSTI ;
5076 Vgssti_dVbs = dVthSCSTI_dVb ;
5077 Vgssti_dVds = Vgsz_dVds + T1_dVd + dVthSCSTI_dVd ;
5078 Vgssti_dVgs = Vgsz_dVgs + dVthSCSTI_dVg ;
5079
5080 costi0 = here->HSM2_costi0 ;
5081 costi1 = here->HSM2_costi1 ;
5082
5083 costi3 = here->HSM2_costi0_p2 * Cox_inv * Cox_inv ;
5084 T1 = 2.0 * here->HSM2_costi0_p2 * Cox_inv ;
5085 costi3_dVb = T1 * Cox_inv_dVb ;
5086 costi3_dVd = T1 * Cox_inv_dVd ;
5087 costi3_dVg = T1 * Cox_inv_dVg ;
5088 T2 = 1.0 / costi3 ;
5089 costi3_dVb_c3 = costi3_dVb * T2 ;
5090 costi3_dVd_c3 = costi3_dVd * T2 ;
5091 costi3_dVg_c3 = costi3_dVg * T2 ;
5092
5093 costi4 = costi3 * beta * 0.5 ;
5094 costi5 = costi4 * beta * 2.0 ;
5095
5096 T11 = beta * 0.25 ;
5097 T10 = beta_inv - costi3 * T11 + Vfb - pParam->HSM2_vthsti - dVthSCSTI + small ;
5098 T10_dVb = - T11 * costi3_dVb - dVthSCSTI_dVb ;
5099 T10_dVd = - T11 * costi3_dVd - dVthSCSTI_dVd ;
5100 T10_dVg = - T11 * costi3_dVg - dVthSCSTI_dVg ;
5101 T1 = Vgsz - T10 - psisti_dlt ;
5102 T1_dVb = - T10_dVb ;
5103 T1_dVd = Vgsz_dVds - T10_dVd ;
5104 T1_dVg = Vgsz_dVgs - T10_dVg ;
5105 T0 = Fn_Sgn(T10) ;
5106 T2 = sqrt (T1 * T1 + T0 * 4.0 * T10 * psisti_dlt) ;
5107 T3 = T10 + 0.5 * (T1 + T2) - Vfb + pParam->HSM2_vthsti + dVthSCSTI - Vbsz ;
5108 T3_dVb = T10_dVb + 0.5 * (T1_dVb + (T1 * T1_dVb + T0 * 2.0 * T10_dVb * psisti_dlt) / T2)
5109 + dVthSCSTI_dVb - Vbsz_dVbs ;
5110 T3_dVd = T10_dVd + 0.5 * (T1_dVd + (T1 * T1_dVd + T0 * 2.0 * T10_dVd * psisti_dlt) / T2)
5111 + dVthSCSTI_dVd - Vbsz_dVds ;
5112 T3_dVg = T10_dVg + 0.5 * (T1_dVg + (T1 * T1_dVg + T0 * 2.0 * T10_dVg * psisti_dlt) / T2)
5113 + dVthSCSTI_dVg ;
5114 T4 = beta * T3 - 1.0 ;
5115 T5 = 4.0 / costi5 ;
5116 T1 = 1.0 + T4 * T5 ;
5117 T6 = beta * T5 ;
5118 T7 = T4 * T5 ;
5119 T1_dVb = (T6 * T3_dVb - T7 * costi3_dVb_c3) ;
5120 T1_dVd = (T6 * T3_dVd - T7 * costi3_dVd_c3) ;
5121 T1_dVg = (T6 * T3_dVg - T7 * costi3_dVg_c3) ;
5122 Fn_SZ( T1 , T1, 1.0e-2, T2) ;
5123 T1 += small ;
5124 T1_dVb *= T2 ;
5125 T1_dVd *= T2 ;
5126 T1_dVg *= T2 ;
5127 costi6 = sqrt (T1) ;
5128 T0 = costi4 * (1.0 - costi6) ;
5129 Psasti = Vgssti + T0 ;
5130 T2 = 0.5 * costi4 / costi6 ;
5131 Psasti_dVbs = Vgssti_dVbs + costi3_dVb_c3 * T0 - T2 * T1_dVb ;
5132 Psasti_dVds = Vgssti_dVds + costi3_dVd_c3 * T0 - T2 * T1_dVd ;
5133 Psasti_dVgs = Vgssti_dVgs + costi3_dVg_c3 * T0 - T2 * T1_dVg ;
5134
5135 T0 = 1.0 / (beta + 2.0 / (Vgssti + small)) ;
5136 Psbsti = log (1.0 / costi1 / costi3 * (Vgssti * Vgssti)) * T0 ;
5137 T2 = 2.0 * T0 / (Vgssti + small) ;
5138 T3 = Psbsti / (Vgssti + small) ;
5139 Psbsti_dVbs = T2 * (Vgssti_dVbs - 0.5 * costi3_dVb_c3 * Vgssti
5140 + T3 * Vgssti_dVbs ) ;
5141 Psbsti_dVds = T2 * (Vgssti_dVds - 0.5 * costi3_dVd_c3 * Vgssti
5142 + T3 * Vgssti_dVds ) ;
5143 Psbsti_dVgs = T2 * (Vgssti_dVgs - 0.5 * costi3_dVg_c3 * Vgssti
5144 + T3 * Vgssti_dVgs ) ;
5145
5146 Psab = Psbsti - Psasti - sti2_dlt ;
5147 Psab_dVbs = Psbsti_dVbs - Psasti_dVbs ;
5148 Psab_dVds = Psbsti_dVds - Psasti_dVds ;
5149 Psab_dVgs = Psbsti_dVgs - Psasti_dVgs ;
5150 T0 = sqrt (Psab * Psab + 4.0 * sti2_dlt * Psbsti) ;
5151 Psti = Psbsti - 0.5 * (Psab + T0) ;
5152 T1 = 1.0 / T0 ;
5153 Psti_dVbs = Psbsti_dVbs
5154 - 0.5 * ( Psab_dVbs
5155 + ( Psab * Psab_dVbs + 2.0 * sti2_dlt * Psbsti_dVbs ) * T1 ) ;
5156 Psti_dVds = Psbsti_dVds
5157 - 0.5 * ( Psab_dVds
5158 + ( Psab * Psab_dVds + 2.0 * sti2_dlt * Psbsti_dVds ) * T1 ) ;
5159 Psti_dVgs = Psbsti_dVgs
5160 - 0.5 * ( Psab_dVgs
5161 + ( Psab * Psab_dVgs + 2.0 * sti2_dlt * Psbsti_dVgs ) * T1 ) ;
5162
5163 T0 = costi1 * exp (beta * Psti) ;
5164 T1 = beta * (Psti - Vbsz) - 1.0 + T0 ;
5165 T1_dVb = beta * ((Psti_dVbs - Vbsz_dVbs) + T0 * Psti_dVbs) ;
5166 T1_dVd = beta * ((Psti_dVds - Vbsz_dVds) + T0 * Psti_dVds) ;
5167 T1_dVg = beta * (Psti_dVgs + T0 * Psti_dVgs) ;
5168 Fn_SZ ( T1 , T1, 1.0e-2, T0) ;
5169 T1 += epsm10 ;
5170 T1_dVb *= T0 ;
5171 T1_dVd *= T0 ;
5172 T1_dVg *= T0 ;
5173 sq1sti = sqrt (T1);
5174 T2 = 0.5 / sq1sti ;
5175 sq1sti_dVbs = T2 * T1_dVb ;
5176 sq1sti_dVds = T2 * T1_dVd ;
5177 sq1sti_dVgs = T2 * T1_dVg ;
5178
5179 T1 = beta * (Psti - Vbsz) - 1.0;
5180 T1_dVb = beta * (Psti_dVbs - Vbsz_dVbs) ;
5181 T1_dVd = beta * (Psti_dVds - Vbsz_dVds) ;
5182 T1_dVg = beta * Psti_dVgs ;
5183 Fn_SZ( T1 , T1, 1.0e-2, T0) ;
5184 T1 += epsm10 ;
5185 T1_dVb *= T0 ;
5186 T1_dVd *= T0 ;
5187 T1_dVg *= T0 ;
5188 sq2sti = sqrt (T1);
5189 T2 = 0.5 / sq2sti ;
5190 sq2sti_dVbs = T2 * T1_dVb ;
5191 sq2sti_dVds = T2 * T1_dVd ;
5192 sq2sti_dVgs = T2 * T1_dVg ;
5193
5194 Qn0sti = costi0 * (sq1sti - sq2sti) ;
5195 Qn0sti_dVbs = costi0 * (sq1sti_dVbs - sq2sti_dVbs) ;
5196 Qn0sti_dVds = costi0 * (sq1sti_dVds - sq2sti_dVds) ;
5197 Qn0sti_dVgs = costi0 * (sq1sti_dVgs - sq2sti_dVgs) ;
5198
5199 /* T1: Vdsatsti */
5200 T1 = Psasti - Psti ;
5201 T1_dVb = Psasti_dVbs - Psti_dVbs ;
5202 T1_dVd = Psasti_dVds - Psti_dVds ;
5203 T1_dVg = Psasti_dVgs - Psti_dVgs ;
5204
5205 Fn_SZ( T1 , T1 , 1.0e-1 , T2 ) ;
5206 T1 += epsm10 ;
5207 T1_dVb *= T2 ;
5208 T1_dVd *= T2 ;
5209 T1_dVg *= T2 ;
5210
5211
5212 TX = Vds / T1 ;
5213 T2 = 1.0 / ( T1 * T1 ) ;
5214 TX_dVbs = T2 * ( - Vds * T1_dVb ) ;
5215 TX_dVds = T2 * ( T1 - Vds * T1_dVd ) ;
5216 TX_dVgs = T2 * ( - Vds * T1_dVg ) ;
5217
5218 Fn_CP( TY , TX , 1.0 , 4 , T2 ) ;
5219 TY_dVbs = T2 * TX_dVbs ;
5220 TY_dVds = T2 * TX_dVds ;
5221 TY_dVgs = T2 * TX_dVgs ;
5222
5223 costi7 = 2.0 * here->HSM2_wsti * here->HSM2_nf * beta_inv ;
5224 T1 = Lch ;
5225 Idssti = costi7 * Mu * Qn0sti * TY / T1;
5226 T3 = 1.0 / T1 ;
5227 T4 = Mu * Qn0sti * TY / T1 / T1 ;
5228 T5 = Mu * Qn0sti ;
5229 Idssti_dVbs = costi7 * (((Mu_dVbs * Qn0sti + Mu * Qn0sti_dVbs) * TY
5230 + T5 * TY_dVbs ) * T3
5231 - Lch_dVbs * T4 ) ;
5232 Idssti_dVds = costi7 * (((Mu_dVds * Qn0sti + Mu * Qn0sti_dVds) * TY
5233 + T5 * TY_dVds ) * T3
5234 - Lch_dVds * T4 ) ;
5235 Idssti_dVgs = costi7 * (((Mu_dVgs * Qn0sti + Mu * Qn0sti_dVgs) * TY
5236 + T5 * TY_dVgs ) * T3
5237 - Lch_dVgs * T4 ) ;
5238
5239 Ids = Ids + Idssti ;
5240 Ids_dVbs = Ids_dVbs + Idssti_dVbs ;
5241 Ids_dVds = Ids_dVds + Idssti_dVds ;
5242 Ids_dVgs = Ids_dVgs + Idssti_dVgs ;
5243
5244 }
5245
5246 /*-----------------------------------------------------------*
5247 * Break point for the case of Rs=Rd=0.
5248 *-----------------*/
5249 if ( flg_rsrd == 0 ) {
5250 DJI = 1.0 ;
5251 break ;
5252 }
5253
5254 /*-----------------------------------------------------------*
5255 * calculate corrections of biases.
5256 * - Fbs = 0, etc. are the small ciucuit equations.
5257 * - DJ, Jacobian of the small circuit matrix, is g.t. 1
5258 * provided Rs, Rd and conductances are positive.
5259 *-----------------*/
5260 Fbs = Vbs - Vbsc + Ids * Rs ;
5261 Fds = Vds - Vdsc + Ids * ( Rs + Rd ) ;
5262 Fgs = Vgs - Vgsc + Ids * Rs ;
5263
5264 DJ = 1.0 + Rs * Ids_dVbs + ( Rs + Rd ) * Ids_dVds + Rs * Ids_dVgs ;
5265 DJI = 1.0 / DJ ;
5266
5267 JI11 = 1 + ( Rs + Rd ) * Ids_dVds + Rs * Ids_dVgs ;
5268 JI12 = - Rs * Ids_dVds ;
5269 JI13 = - Rs * Ids_dVgs ;
5270 JI21 = - ( Rs + Rd ) * Ids_dVbs ;
5271 JI22 = 1 + Rs * Ids_dVbs + Rs * Ids_dVgs ;
5272 JI23 = - ( Rs + Rd ) * Ids_dVgs ;
5273 JI31 = - Rs * Ids_dVbs ;
5274 JI32 = - Rs * Ids_dVds ;
5275 JI33 = 1 + Rs * Ids_dVbs + ( Rs + Rd ) * Ids_dVds ;
5276
5277 dVbs = - DJI * ( JI11 * Fbs + JI12 * Fds + JI13 * Fgs ) ;
5278 dVds = - DJI * ( JI21 * Fbs + JI22 * Fds + JI23 * Fgs ) ;
5279 dVgs = - DJI * ( JI31 * Fbs + JI32 * Fds + JI33 * Fgs ) ;
5280
5281 dV_sum = fabs( dVbs ) + fabs( dVds ) + fabs( dVgs ) ;
5282
5283
5284 /*-----------------------------------------------------------*
5285 * Break point for converged case.
5286 * - Exit from the bias loop.
5287 * - NOTE: Update of internal biases is avoided.
5288 *-----------------*/
5289 if ( Ids_last * Ids_tol >= fabs( Ids_last - Ids ) || mini_current >= fabs( Ids_last - Ids )
5290 || dV_sum < ps_conv ) break ;
5291
5292 /*-----------------------------------------------------------*
5293 * Update the internal biases.
5294 *-----------------*/
5295 Vbs = Vbs + dVbs ;
5296 Vds = Vds + dVds ;
5297 Vgs = Vgs + dVgs ;
5298 if ( Vds < 0.0 ) {
5299 Vds = 0.0 ;
5300 dVds = 0.0 ;
5301 }
5302
5303 /*-----------------------------------------------------------*
5304 * Bottom of bias loop. (label)
5305 *-----------------*/
5306 /* bottom_of_bias_loop :*/
5307
5308 /*-----------------------------------------------------------*
5309 * Make initial guess flag of potential ON.
5310 * - This effects for the 2nd and later iterations of bias loop.
5311 *-----------------*/
5312 flg_pprv = 1 ;
5313
5314 } /* skip to end_of_part_1 */
5315
5316 } /*++ End of the bias loop +++++++++++++++++++++++++++++*/
5317 if ( end_of_part_1 == 0 ) {
5318
5319 if ( lp_bs > lp_bs_max ) { lp_bs -- ; }
5320
5321
5322
5323 /*----------------------------------------------------------*
5324 * induced gate noise. ( Part 1/3 )
5325 *----------------------*/
5326 if ( model->HSM2_coign != 0 && model->HSM2_cothrml != 0 ) {
5327 kusai00 = VgVt * VgVt ;
5328 kusaidd = 2.0e0 * beta_inv * Cox_inv * Idd ;
5329 kusaiL = kusai00 - kusaidd ;
5330 Fn_SZ( kusai00 , kusai00 , 1.0e-3 , T0 ) ;
5331 Fn_SZ( kusaiL , kusaiL , 1.0e-3 , T0 ) ;
5332 kusai00L = kusai00 - kusaiL ;
5333 if ( Qn0 < epsm10 || kusai00L < epsm10 ) flg_ign = 0 ;
5334 else flg_ign = 1 ;
5335 }
5336
5337
5338 /*-----------------------------------------------------------*
5339 * End of PART-1. (label)
5340 *-----------------*/
5341 } /* skip end_of_part_1 */
5342 /* end_of_part_1: */
5343 end_of_part_1 = 0;
5344
5345 // Qiu for noise calcs
5346 Qiu_noi = Qiu ;
5347
5348 } // end of Normal mode MOSFET
5349
5350
5351 /*----------------------------------------------------------*
5352 * Evaluate integrated chages in unit [C].
5353 *----------------------*/
5354
5355 T1 = - here->HSM2_weff_nf * Leff ;
5356
5357 Qb = T1 * Qbu ;
5358 Qb_dVbs = T1 * Qbu_dVbs ;
5359 Qb_dVds = T1 * Qbu_dVds ;
5360 Qb_dVgs = T1 * Qbu_dVgs ;
5361
5362 Qi = T1 * Qiu ;
5363 Qi_dVbs = T1 * Qiu_dVbs ;
5364 Qi_dVds = T1 * Qiu_dVds ;
5365 Qi_dVgs = T1 * Qiu_dVgs ;
5366
5367 Qi_noi = T1 * Qiu_noi ; // for noise calc.
5368
5369 Qd = Qi * Qdrat ;
5370 Qd_dVbs = Qi_dVbs * Qdrat + Qi * Qdrat_dVbs ;
5371 Qd_dVds = Qi_dVds * Qdrat + Qi * Qdrat_dVds ;
5372 Qd_dVgs = Qi_dVgs * Qdrat + Qi * Qdrat_dVgs ;
5373
5374
5375 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5376 * PART-2: Substrate / gate / leak currents
5377 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
5378
5379 /*-----------------------------------------------------------*
5380 * Modified potential for symmetry.
5381 *-----------------*/
5382 T1 = ( Vds - Pds ) / 2 ;
5383 Fn_SymAdd( Pzadd , T1 , model->HSM2_pzadd0 , T2 ) ;
5384 T2 /= 2 ;
5385 Pzadd_dVbs = T2 * ( - Pds_dVbs ) ;
5386 Pzadd_dVds = T2 * ( 1.0 - Pds_dVds ) ;
5387 Pzadd_dVgs = T2 * ( - Pds_dVgs ) ;
5388
5389 if ( Pzadd < epsm10 ) {
5390 Pzadd = epsm10 ;
5391 Pzadd_dVbs = 0.0 ;
5392 Pzadd_dVds = 0.0 ;
5393 Pzadd_dVgs = 0.0 ;
5394 }
5395
5396 Ps0z = Ps0 + Pzadd ;
5397 Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ;
5398 Ps0z_dVds = Ps0_dVds + Pzadd_dVds ;
5399 Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ;
5400 /*-----------------------------------------------------------*
5401 * Isub : substrate current induced by impact ionization.
5402 *-----------------*/
5403
5404 if ( flg_noqi == 1 || model->HSM2_coisub == 0 ) {
5405 /* Accumulation zone or nonconductive case, in which Ids==0. */
5406 Isub = 0.0e0 ;
5407 Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ;
5408 } else {
5409 /*-------------------------------------------*
5410 * Conductive case.
5411 *-----------------*/
5412 if ( pParam->HSM2_sub1 > 0.0e0 && pParam->HSM2_vmax > 0.0e0 ) {
5413 T0 = here->HSM2_vg2const ;
5414 T1 = T0 * Vgp ;
5415 T1_dVd = T0 * Vgp_dVds ;
5416 T1_dVg = T0 * Vgp_dVgs ;
5417 T1_dVb = T0 * Vgp_dVbs ;
5418
5419 T7 = Cox0 * Cox0 ;
5420 T8 = here->HSM2_qnsub_esi ;
5421 T3 = T8 / T7 ;
5422
5423 T9 = 2.0 / T8 ;
5424 T4 = T9 * T7 ; /* bugfix in version 2.80 */
5425
5426 T2 = here->HSM2_xvbs ;
5427 T5 = T1 - beta_inv - T2 * Vbsz ;
5428 T5_dVd = T1_dVd - T2 * Vbsz_dVds;
5429 T5_dVg = T1_dVg ;
5430 T5_dVb = T1_dVb - T2 * Vbsz_dVbs;
5431
5432 T6 = 1.0 + T4 * T5 ; /* bugfix in version 2.80 */
5433 T6_dVd = T4 * T5_dVd ;
5434 T6_dVg = T4 * T5_dVg ;
5435 T6_dVb = T4 * T5_dVb ;
5436 Fn_SZ( T6 , T6, 1.0e-3, T9) ;
5437 T6 += small ;
5438 T6_dVd *= T9 ;
5439 T6_dVg *= T9 ;
5440 T6_dVb *= T9 ;
5441 T6 = sqrt( T6 ) ;
5442 T9 = 0.5 / T6 ;
5443 T6_dVd = T9 * T6_dVd ;
5444 T6_dVg = T9 * T6_dVg ;
5445 T6_dVb = T9 * T6_dVb ;
5446
5447 Psislsat = T1 + T3 * ( 1.0 - T6 ) ;
5448 Psislsat_dVd = T1_dVd - T3 * T6_dVd ;
5449 Psislsat_dVg = T1_dVg - T3 * T6_dVg ;
5450 Psislsat_dVb = T1_dVb - T3 * T6_dVb ;
5451
5452 T2 = here->HSM2_lgate / (here->HSM2_xgate + here->HSM2_lgate) ;
5453
5454 Psisubsat = pParam->HSM2_svds * Vdsz + Ps0z - T2 * Psislsat ;
5455 Psisubsat_dVd = pParam->HSM2_svds * Vdsz_dVds + Ps0z_dVds - T2 * Psislsat_dVd ;
5456 Psisubsat_dVg = Ps0z_dVgs - T2 * Psislsat_dVg ;
5457 Psisubsat_dVb = Ps0z_dVbs - T2 * Psislsat_dVb ;
5458 Fn_SZ( Psisubsat , Psisubsat, 1.0e-3, T9 ) ;
5459 Psisubsat += small ;
5460 Psisubsat_dVd *= T9 ;
5461 Psisubsat_dVg *= T9 ;
5462 Psisubsat_dVb *= T9 ;
5463
5464 T5 = here->HSM2_xsub1 ;
5465 T6 = here->HSM2_xsub2 ;
5466 T2 = exp( - T6 / Psisubsat ) ;
5467 T3 = T2 * T6 / ( Psisubsat * Psisubsat ) ;
5468 T2_dVd = T3 * Psisubsat_dVd ;
5469 T2_dVg = T3 * Psisubsat_dVg ;
5470 T2_dVb = T3 * Psisubsat_dVb ;
5471
5472 Isub = T5 * Psisubsat * Ids * T2 ;
5473 Isub_dVds = T5 * ( Psisubsat_dVd * Ids * T2
5474 + Psisubsat * Ids_dVds * T2
5475 + Psisubsat * Ids * T2_dVd ) ;
5476 Isub_dVgs = T5 * ( Psisubsat_dVg * Ids * T2
5477 + Psisubsat * Ids_dVgs * T2
5478 + Psisubsat * Ids * T2_dVg ) ;
5479 Isub_dVbs = T5 * ( Psisubsat_dVb * Ids * T2
5480 + Psisubsat * Ids_dVbs * T2
5481 + Psisubsat * Ids * T2_dVb ) ;
5482 } else {
5483 Isub = 0.0e0 ;
5484 Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ;
5485 } /* end of if ( pParam->HSM2_sub1 ... ) else block. */
5486 }
5487
5488
5489 /*---------------------------------------------------*
5490 * Impact-Ionization Induced Bulk Potential Change (IBPC)
5491 *-----------------*/
5492 if ( flg_noqi == 0 && Isub > 0e0 && pParam->HSM2_ibpc1 != 0e0 ) {
5493
5494 /* delta Vbs */
5495 T0 = 1e0 + pParam->HSM2_ibpc2 * dVth ;
5496 dVbsIBPC = pParam->HSM2_ibpc1 * T0 * Isub ;
5497 dVbsIBPC_dVbs = pParam->HSM2_ibpc1 * ( pParam->HSM2_ibpc2 * dVth_dVb * Isub + T0 * Isub_dVbs ) ;
5498 dVbsIBPC_dVds = pParam->HSM2_ibpc1 * ( pParam->HSM2_ibpc2 * dVth_dVd * Isub + T0 * Isub_dVds ) ;
5499 dVbsIBPC_dVgs = pParam->HSM2_ibpc1 * ( pParam->HSM2_ibpc2 * dVth_dVg * Isub + T0 * Isub_dVgs ) ;
5500
5501 /* dG3 & dG4 */
5502 T10 = 1e0 / Xi0 ;
5503 T1 = beta * dVbsIBPC * T10 ;
5504 T10 *= T10 ;
5505 T1_dVb = beta * ( dVbsIBPC_dVbs * Xi0 - dVbsIBPC * Xi0_dVbs ) * T10 ;
5506 T1_dVd = beta * ( dVbsIBPC_dVds * Xi0 - dVbsIBPC * Xi0_dVds ) * T10 ;
5507 T1_dVg = beta * ( dVbsIBPC_dVgs * Xi0 - dVbsIBPC * Xi0_dVgs ) * T10 ;
5508
5509 T10 = 1e0 / Xil ;
5510 T2 = beta * dVbsIBPC * T10 ;
5511 T10 *= T10 ;
5512 T2_dVb = beta * ( dVbsIBPC_dVbs * Xil - dVbsIBPC * Xil_dVbs ) * T10 ;
5513 T2_dVd = beta * ( dVbsIBPC_dVds * Xil - dVbsIBPC * Xil_dVds ) * T10 ;
5514 T2_dVg = beta * ( dVbsIBPC_dVgs * Xil - dVbsIBPC * Xil_dVgs ) * T10 ;
5515
5516 dG3 = cnst0 * ( Xilp32 * T2 - Xi0p32 * T1 ) ;
5517 dG3_dVbs = cnst0 * ( Xilp32_dVbs * T2 + Xilp32 * T2_dVb - Xi0p32_dVbs * T1 - Xi0p32 * T1_dVb ) ;
5518 dG3_dVds = cnst0 * ( Xilp32_dVds * T2 + Xilp32 * T2_dVd - Xi0p32_dVds * T1 - Xi0p32 * T1_dVd ) ;
5519 dG3_dVgs = cnst0 * ( Xilp32_dVgs * T2 + Xilp32 * T2_dVg - Xi0p32_dVgs * T1 - Xi0p32 * T1_dVg ) ;
5520 dG4 = cnst0 * 0.5 * ( - Xilp12 * T2 + Xi0p12 * T1 ) ;
5521 dG4_dVbs = cnst0 * 0.5 * ( - Xilp12_dVbs * T2 - Xilp12 * T2_dVb + Xi0p12_dVbs * T1 + Xi0p12 * T1_dVb ) ;
5522 dG4_dVds = cnst0 * 0.5 * ( - Xilp12_dVds * T2 - Xilp12 * T2_dVd + Xi0p12_dVds * T1 + Xi0p12 * T1_dVd ) ;
5523 dG4_dVgs = cnst0 * 0.5 * ( - Xilp12_dVgs * T2 - Xilp12 * T2_dVg + Xi0p12_dVgs * T1 + Xi0p12 * T1_dVg ) ;
5524
5525 /* Add IBPC current into Ids */
5526 dIdd = dG3 + dG4 ;
5527 dIdd_dVbs = dG3_dVbs + dG4_dVbs ;
5528 dIdd_dVds = dG3_dVds + dG4_dVds ;
5529 dIdd_dVgs = dG3_dVgs + dG4_dVgs ;
5530 IdsIBPC = betaWL * dIdd * Mu ;
5531 IdsIBPC_dVbs = betaWL * ( Mu * dIdd_dVbs + dIdd * Mu_dVbs ) + betaWL_dVbs * Mu * dIdd ;
5532 IdsIBPC_dVds = betaWL * ( Mu * dIdd_dVds + dIdd * Mu_dVds ) + betaWL_dVds * Mu * dIdd ;
5533 IdsIBPC_dVgs = betaWL * ( Mu * dIdd_dVgs + dIdd * Mu_dVgs ) + betaWL_dVgs * Mu * dIdd ;
5534
5535 } /* End if (IBPC) */
5536
5537 /*-----------------------------------------------------------*
5538 * Igate : Gate current induced by tunneling.
5539 *-----------------*/
5540 if ( model->HSM2_coiigs == 0 ) {
5541 Igate = 0.0 ;
5542 Igate_dVbs = Igate_dVds = Igate_dVgs = 0.0 ;
5543 Igs = 0.0 ;
5544 Igs_dVbs = Igs_dVds = Igs_dVgs = 0.0 ;
5545 Igd = 0.0 ;
5546 Igd_dVbs = Igd_dVds = Igd_dVgs = 0.0 ;
5547 Igb = 0.0 ;
5548 Igb_dVbs = Igb_dVds = Igb_dVgs = 0.0 ;
5549 GLPART1 = 0.0 ;
5550 GLPART1_dVgs = GLPART1_dVds = GLPART1_dVbs = 0.0 ;
5551 } else {
5552
5553
5554 /* Igate */
5555 if ( flg_noqi == 0 ) {
5556 Psdlz = Ps0z + Vdsz - epsm10 ;
5557 Psdlz_dVbs = Ps0z_dVbs ;
5558 Psdlz_dVds = Ps0z_dVds + Vdsz_dVds ;
5559 Psdlz_dVgs = Ps0z_dVgs ;
5560
5561 T1 = Vgsz - Vfb + modelMKS->HSM2_gleak4 * (dVth - dPpg) * Leff - Psdlz * pParam->HSM2_gleak3 ;
5562 T1_dVg = Vgsz_dVgs + modelMKS->HSM2_gleak4 * (dVth_dVg - dPpg_dVg) * Leff - Psdlz_dVgs * pParam->HSM2_gleak3 ;
5563 T1_dVd = Vgsz_dVds + modelMKS->HSM2_gleak4 * (dVth_dVd - dPpg_dVd) * Leff - Psdlz_dVds * pParam->HSM2_gleak3 ;
5564 T1_dVb = modelMKS->HSM2_gleak4 * ( dVth_dVb - dPpg_dVb ) * Leff - Psdlz_dVbs * pParam->HSM2_gleak3 ;
5565
5566 T3 = 1.0 / Tox0 ;
5567 T2 = T1 * T3 ;
5568 T2_dVg = (T1_dVg ) * T3 ;
5569 T2_dVd = (T1_dVd ) * T3 ;
5570 T2_dVb = (T1_dVb ) * T3 ;
5571
5572 T3 = 1.0 / modelMKS->HSM2_gleak5 ;
5573
5574 if ( VgVt <= VgVt_small ) {
5575 Ey = 0.0 ;
5576 Ey_dVgs = 0.0 ;
5577 Ey_dVds = 0.0 ;
5578 Ey_dVbs = 0.0 ;
5579 }
5580 T7 = 1.0 + Ey * T3 ;
5581 T7_dVg = Ey_dVgs * T3 ;
5582 T7_dVd = Ey_dVds * T3 ;
5583 T7_dVb = Ey_dVbs * T3 ;
5584
5585 Etun = T2 * T7 ;
5586 Etun_dVgs = T2_dVg * T7 + T7_dVg * T2 ;
5587 Etun_dVds = T2_dVd * T7 + T7_dVd * T2 ;
5588 Etun_dVbs = T2_dVb * T7 + T7_dVb * T2 ;
5589
5590 Fn_SZ( Etun , Etun , igate_dlt , T5 ) ;
5591 Etun_dVgs *= T5 ;
5592 Etun_dVds *= T5 ;
5593 Etun_dVbs *= T5 ;
5594
5595 Fn_SZ( T3 , Vgsz , 1.0e-3 , T4 ) ;
5596 T3 -= model->HSM2_vzadd0 ;
5597 TX = T3 / cclmmdf ;
5598 T2 = 1.0 + TX * TX ;
5599 T1 = 1.0 - 1.0 / T2 ;
5600 T1_dVg = 2.0 * TX * T4 / ( T2 * T2 * cclmmdf ) ;
5601 T1_dVd = T1_dVg * Vgsz_dVds ;
5602 Etun_dVgs = T1 * Etun_dVgs + Etun * T1_dVg ;
5603 Etun_dVds = T1 * Etun_dVds + Etun * T1_dVd ;
5604 Etun_dVbs *= T1 ;
5605 Etun *= T1 ;
5606
5607 T0 = Leff * here->HSM2_weff_nf ;
5608 T7 = modelMKS->HSM2_gleak7 / (modelMKS->HSM2_gleak7 + T0) ;
5609
5610 T6 = pParam->HSM2_gleak6 ;
5611 T9 = T6 / (T6 + Vdsz) ;
5612 T9_dVd = - T9 / (T6 + Vdsz) * Vdsz_dVds ;
5613
5614 T1 = - pParam->HSM2_gleak2 * Egp32 / (Etun + small) ;
5615
5616 if ( T1 < - EXP_THR ) {
5617 Igate = 0.0 ;
5618 Igate_dVbs = Igate_dVds = Igate_dVgs = 0.0 ;
5619 } else {
5620 T2 = exp ( T1 ) ;
5621 T3 = pParam->HSM2_gleak1 / Egp12 * C_QE * T0 ;
5622
5623 T4 = T2 * T3 * sqrt ((Qiu + Cox0 * VgVt_small ) / cnst0) ;
5624 T5 = T4 * Etun ;
5625 T6 = 0.5 * Etun / (Qiu + Cox0 * VgVt_small ) ;
5626 T10 = T5 * Etun ;
5627 T10_dVb = T5 * (2.0 * Etun_dVbs - T1 * Etun_dVbs + T6 * Qiu_dVbs) ;
5628 T10_dVd = T5 * (2.0 * Etun_dVds - T1 * Etun_dVds + T6 * Qiu_dVds) ;
5629 T10_dVg = T5 * (2.0 * Etun_dVgs - T1 * Etun_dVgs + T6 * Qiu_dVgs) ;
5630
5631 Igate = T7 * T9 * T10 ;
5632 Igate_dVbs = T7 * T9 * T10_dVb ;
5633 Igate_dVds = T7 * (T9_dVd * T10 + T9 * T10_dVd) ;
5634 Igate_dVgs = T7 * T9 * T10_dVg ;
5635 }
5636 } else {
5637 Igate = 0.0 ;
5638 Igate_dVbs = Igate_dVds = Igate_dVgs = 0.0 ;
5639 }
5640
5641 /* Igs */
5642 T0 = - pParam->HSM2_glksd2 * Vgs + modelMKS->HSM2_glksd3 ;
5643 T2 = exp (Tox0 * T0);
5644 T2_dVg = (- Tox0 * pParam->HSM2_glksd2) * T2;
5645
5646 T0 = Vgs / Tox0 / Tox0 ;
5647 T3 = Vgs * T0 ;
5648 T3_dVg = 2.0 * T0 * (1.0 ) ;
5649 T4 = pParam->HSM2_glksd1 / 1.0e6 * here->HSM2_weff_nf ;
5650 Igs = T4 * T2 * T3 ;
5651 Igs_dVgs = T4 * (T2_dVg * T3 + T2 * T3_dVg) ;
5652 Igs_dVds = 0.0 ;
5653 Igs_dVbs = 0.0 ;
5654
5655 if ( Vgs >= 0.0e0 ){
5656 Igs *= -1.0 ;
5657 Igs_dVgs *= -1.0 ;
5658 Igs_dVds *= -1.0 ;
5659 Igs_dVbs *= -1.0 ;
5660 }
5661
5662
5663 /* Igd */
5664 T1 = Vgs - Vds ;
5665 T0 = - pParam->HSM2_glksd2 * T1 + modelMKS->HSM2_glksd3 ;
5666 T2 = exp (Tox0 * T0);
5667 T2_dVg = (- Tox0 * pParam->HSM2_glksd2) * T2;
5668 T2_dVd = (+ Tox0 * pParam->HSM2_glksd2) * T2;
5669 T2_dVb = 0.0 ;
5670
5671 T0 = T1 / Tox0 / Tox0 ;
5672 T3 = T1 * T0 ;
5673 T3_dVg = 2.0 * T0 ;
5674 T3_dVd = - 2.0 * T0 ;
5675 T3_dVb = 0.0 ;
5676 T4 = pParam->HSM2_glksd1 / 1.0e6 * here->HSM2_weff_nf ;
5677 Igd = T4 * T2 * T3 ;
5678 Igd_dVgs = T4 * (T2_dVg * T3 + T2 * T3_dVg) ;
5679 Igd_dVds = T4 * (T2_dVd * T3 + T2 * T3_dVd) ;
5680 Igd_dVbs = 0.0 ;
5681
5682 if( T1 >= 0.0e0 ){
5683 Igd *= -1.0 ;
5684 Igd_dVgs *= -1.0 ;
5685 Igd_dVds *= -1.0 ;
5686 Igd_dVbs *= -1.0 ;
5687 }
5688
5689
5690 /* Igb */
5691 Etun = (- Vgs + Vbs + Vfb + model->HSM2_glkb3 ) / Tox0 ;
5692
5693 Etun_dVgs = - 1.0 / Tox0 ;
5694 Etun_dVds = 0.0 ;
5695 Etun_dVbs = 1.0 / Tox0 ;
5696
5697 Fn_SZ( Etun , Etun, igate_dlt, T5) ;
5698 Etun += small ;
5699 Etun_dVgs *= T5 ;
5700 Etun_dVbs *= T5 ;
5701
5702 T1 = - pParam->HSM2_glkb2 / Etun ;
5703 if ( T1 < - EXP_THR ) {
5704 Igb = 0.0 ;
5705 Igb_dVgs = Igb_dVds = Igb_dVbs = 0.0 ;
5706 } else {
5707 T2 = exp ( T1 );
5708 T3 = pParam->HSM2_glkb2 / ( Etun * Etun ) * T2 ;
5709 T2_dVg = T3 * Etun_dVgs ;
5710 T2_dVb = T3 * Etun_dVbs ;
5711
5712 T3 = pParam->HSM2_glkb1 * here->HSM2_weff_nf * Leff ;
5713 Igb = T3 * Etun * Etun * T2 ;
5714 Igb_dVgs = T3 * (2.0 * Etun * Etun_dVgs * T2 + Etun * Etun * T2_dVg);
5715 Igb_dVds = 0.0 ;
5716 Igb_dVbs = T3 * (2.0 * Etun * Etun_dVbs * T2 + Etun * Etun * T2_dVb);
5717 }
5718
5719 GLPART1 = 0.5 ;
5720 GLPART1_dVgs = 0.0 ;
5721 GLPART1_dVds = 0.0 ;
5722 GLPART1_dVbs = 0.0 ;
5723
5724 } /* if ( model->HSM2_coiigs == 0 ) */
5725
5726
5727
5728
5729 /*-----------------------------------------------------------*
5730 * Igidl : GIDL
5731 *-----------------*/
5732 if( model->HSM2_cogidl == 0 ){
5733 Igidl = 0.0e0 ;
5734 Igidl_dVbs = 0.0e0 ;
5735 Igidl_dVds = 0.0e0 ;
5736 Igidl_dVgs = 0.0e0 ;
5737 } else {
5738 T3 = here->HSM2_2qnsub_esi ;
5739 Qb0 = sqrt (T3 * (Pb20 - Vbsz2)) ;
5740 T4 = 0.5 * T3 / Qb0 ;
5741 Qb0_dVb = T4 * (- Vbsz2_dVbs) ;
5742 Qb0_dVd = T4 * (- Vbsz2_dVds) ;
5743 Qb0_dVg = T4 * (- Vbsz2_dVgs) ;
5744
5745 Qb0Cox = model->HSM2_gidl6 * Qb0 * Cox_inv ;
5746 Qb0Cox_dVb = model->HSM2_gidl6 * ( Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ) ;
5747 Qb0Cox_dVd = model->HSM2_gidl6 * ( Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ) ;
5748 Qb0Cox_dVg = model->HSM2_gidl6 * ( Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ) ;
5749
5750 T1 = model->HSM2_gidl3 * (Vds + model->HSM2_gidl4) - Vgs + (dVthSC + dVthLP) * model->HSM2_gidl5 - Qb0Cox ;
5751
5752 T2 = 1.0 / Tox0 ;
5753 E1 = T1 * T2 ;
5754
5755 E1_dVb = ( model->HSM2_gidl5 * (dVthSC_dVb + dVthLP_dVb) - Qb0Cox_dVb ) * T2 ;
5756 E1_dVd = ( model->HSM2_gidl3 + model->HSM2_gidl5 * (dVthSC_dVd + dVthLP_dVd) - Qb0Cox_dVd ) * T2 ;
5757 E1_dVg = ( -1.0 + model->HSM2_gidl5 * (dVthSC_dVg + dVthLP_dVg) - Qb0Cox_dVg ) * T2 ;
5758
5759 Fn_SZ( Egidl , E1, eef_dlt, T5) ;
5760 Egidl_dVb = T5 * E1_dVb ;
5761 Egidl_dVd = T5 * E1_dVd ;
5762 Egidl_dVg = T5 * E1_dVg ;
5763 Egidl += small ;
5764
5765 T6 = pow(Egidl,model->HSM2_gidl7) ;
5766 T1 = model->HSM2_gidl7 * pow(Egidl,model->HSM2_gidl7 -1.0) ;
5767 T6_dVb = Egidl_dVb * T1 ;
5768 T6_dVd = Egidl_dVd * T1 ;
5769 T6_dVg = Egidl_dVg * T1 ;
5770
5771 T0 = - pParam->HSM2_gidl2 * Egp32 / T6 ;
5772 if ( T0 < - EXP_THR ) {
5773 Igidl = 0.0 ;
5774 Igidl_dVbs = Igidl_dVds = Igidl_dVgs = 0.0 ;
5775 } else {
5776 T1 = exp ( T0 ) ;
5777 T2 = pParam->HSM2_gidl1 / Egp12 * C_QE * here->HSM2_weff_nf ;
5778 Igidl = T2 * Egidl * Egidl * T1 ;
5779 T3 = T2 * T1 * Egidl * (2.0 + pParam->HSM2_gidl2 * Egp32 * Egidl / T6 / T6 ) ;
5780 Igidl_dVbs = T3 * Egidl_dVb ;
5781 Igidl_dVds = T3 * Egidl_dVd ;
5782 Igidl_dVgs = T3 * Egidl_dVg ;
5783 }
5784
5785 Vdb = Vds - Vbs ;
5786 if ( Vdb > 0.0 ) {
5787 T2 = Vdb * Vdb ;
5788 T4 = T2 * Vdb ;
5789 T0 = T4 + C_gidl_delta ;
5790 T5 = T4 / T0 ;
5791 T7 = ( 3.0 * T2 * T0 - T4 * 3.0 * T2 ) / ( T0 * T0 ) ; /* == T5_dVdb */
5792 Igidl_dVbs = Igidl_dVbs * T5 + Igidl * T7 * ( - 1.0 ) ; /* Vdb_dVbs = -1 */
5793 Igidl_dVds = Igidl_dVds * T5 + Igidl * T7 * ( + 1.0 ) ; /* Vdb_dVds = +1 */
5794 Igidl_dVgs = Igidl_dVgs * T5 ; /* Vdb_dVgs = 0 */
5795 Igidl *= T5 ;
5796 } else {
5797 Igidl = 0.0 ;
5798 Igidl_dVbs = Igidl_dVds = Igidl_dVgs = 0.0 ;
5799 }
5800
5801 }
5802
5803
5804 /*-----------------------------------------------------------*
5805 * Igisl : GISL
5806 *-----------------*/
5807 if( model->HSM2_cogidl == 0){
5808 Igisl = 0.0e0 ;
5809 Igisl_dVbs = 0.0e0 ;
5810 Igisl_dVds = 0.0e0 ;
5811 Igisl_dVgs = 0.0e0 ;
5812 } else {
5813 T1 = model->HSM2_gidl3 * ( - Vds + model->HSM2_gidl4 )
5814 - ( Vgs - Vds ) + ( dVthSC + dVthLP ) * model->HSM2_gidl5 - Qb0Cox ;
5815
5816 T2 = 1.0 / Tox0 ;
5817 E1 = T1 * T2 ;
5818 E1_dVb = ( model->HSM2_gidl5 * (dVthSC_dVb + dVthLP_dVb) - Qb0Cox_dVb ) * T2 ;
5819 E1_dVd = ( -1.0 * model->HSM2_gidl3 + 1.0 + model->HSM2_gidl5 * (dVthSC_dVd + dVthLP_dVd) - Qb0Cox_dVd ) * T2 ;
5820 E1_dVg = ( -1.0 + model->HSM2_gidl5 * (dVthSC_dVg + dVthLP_dVg) - Qb0Cox_dVg ) * T2 ;
5821
5822 Fn_SZ( Egisl , E1, eef_dlt, T5) ;
5823 Egisl_dVb = T5 * E1_dVb ;
5824 Egisl_dVd = T5 * E1_dVd ;
5825 Egisl_dVg = T5 * E1_dVg ;
5826 Egisl += small ;
5827
5828 T6 = pow(Egisl,model->HSM2_gidl7) ;
5829 T1 = model->HSM2_gidl7 * pow(Egisl,model->HSM2_gidl7 -1.0) ;
5830 T6_dVb = Egisl_dVb * T1 ;
5831 T6_dVd = Egisl_dVd * T1 ;
5832 T6_dVg = Egisl_dVg * T1 ;
5833
5834 T0 = - pParam->HSM2_gidl2 * Egp32 / T6 ;
5835 if ( T0 < - EXP_THR ) {
5836 Igisl = 0.0 ;
5837 Igisl_dVbs = Igisl_dVds = Igisl_dVgs = 0.0 ;
5838 } else {
5839 T1 = exp ( T0 ) ;
5840 T2 = pParam->HSM2_gidl1 / Egp12 * C_QE * here->HSM2_weff_nf ;
5841 Igisl = T2 * Egisl * Egisl * T1 ;
5842 T3 = T2 * T1 * Egisl * (2.0 + pParam->HSM2_gidl2 * Egp32 * Egisl / T6 / T6) ;
5843 Igisl_dVbs = T3 * Egisl_dVb ;
5844 Igisl_dVds = T3 * Egisl_dVd ;
5845 Igisl_dVgs = T3 * Egisl_dVg ;
5846 }
5847
5848 Vsb = - Vbs ;
5849 if ( Vsb > 0.0 ) {
5850 T2 = Vsb * Vsb ;
5851 T4 = T2 * Vsb ;
5852 T0 = T4 + C_gidl_delta ;
5853 T5 = T4 / T0 ;
5854 T7 = ( 3.0 * T2 * T0 - T4 * 3.0 * T2 ) / ( T0 * T0 ) ; /* == T5_dVsb */
5855 Igisl_dVbs = Igisl_dVbs * T5 + Igisl * T7 * ( - 1.0 ) ; /* Vsb_dVbs = -1 */
5856 Igisl_dVds = Igisl_dVds * T5 ; /* Vsb_dVds = 0 */
5857 Igisl_dVgs = Igisl_dVgs * T5 ; /* Vsb_dVgs = 0 */
5858 Igisl *= T5 ;
5859 } else {
5860 Igisl = 0.0 ;
5861 Igisl_dVbs = Igisl_dVds = Igisl_dVgs = 0.0 ;
5862 }
5863
5864 }
5865
5866
5867 /*-----------------------------------------------------------*
5868 * End of PART-2. (label)
5869 *-----------------*/
5870 /* end_of_part_2: */
5871
5872 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5873 * PART-3: Overlap charge
5874 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
5875 Aclm = pParam->HSM2_clm1 ;
5876 if ( flg_noqi != 0 ) {
5877 /*-------------------------------------------*
5878 * Calculation of Psdl for cases of flg_noqi==1.
5879 *-----------------*/
5880 Psdl = Aclm * (Vds + Ps0) + (1.0e0 - Aclm) * Psl ;
5881 Psdl_dVbs = Aclm * Ps0_dVbs + (1.0e0 - Aclm) * Psl_dVbs ;
5882 Psdl_dVds = Aclm * (1.0e0 + Ps0_dVds) + (1.0e0 - Aclm) * Psl_dVds ;
5883 Psdl_dVgs = Aclm * Ps0_dVgs + (1.0e0 - Aclm) * Psl_dVgs ;
5884 if ( Psdl > Ps0 + Vds - epsm10 ) {
5885 Psdl = Ps0 + Vds - epsm10 ;
5886 Psdl_dVbs = Ps0_dVbs ;
5887 Psdl_dVds = Ps0_dVds + 1.0 ;
5888 Psdl_dVgs = Ps0_dVgs ;
5889 }
5890
5891 if (model->HSM2_xqy !=0) {
5892 Ec = 0.0e0 ;
5893 Ec_dVbs =0.0e0 ;
5894 Ec_dVds =0.0e0 ;
5895 Ec_dVgs =0.0e0 ;
5896 }
5897 } else {
5898 /* Ec is removed from Lred calc. part */
5899 if (model->HSM2_xqy !=0) {
5900 if ( Idd < C_IDD_MIN ) {
5901 Ec = 0.0e0 ;
5902 Ec_dVbs =0.0e0 ;
5903 Ec_dVds =0.0e0 ;
5904 Ec_dVgs =0.0e0 ;
5905 } else {
5906 T1 = beta_inv / Leff ;
5907 T2 = 1.0 / (Qn0 + 1e-20) ;
5908 T3 = T2 * T2 ;
5909 Ec = Idd * T1 * T2 ;
5910 Ec_dVbs = T1 * (Idd_dVbs * T2 - Idd * Qn0_dVbs * T3 ) ;
5911 Ec_dVds = T1 * (Idd_dVds * T2 - Idd * Qn0_dVds * T3 ) ;
5912 Ec_dVgs = T1 * (Idd_dVgs * T2 - Idd * Qn0_dVgs * T3 ) ;
5913 }
5914 }
5915 }
5916
5917
5918 /*-------------------------------------------*
5919 * Overlap charges: Qgod, Qgos, and Qover
5920 *-----------------*/
5921 if ( model->HSM2_coovlp >= 1 && pParam->HSM2_lover > 0.0 ){
5922 cov_slp = modelMKS->HSM2_ovslp ;
5923 cov_mag = model->HSM2_ovmag ;
5924
5925 covvg = Vgs ;
5926 covvg_dVgs = 1.0 ;
5927
5928 T1 = Cox0 * here->HSM2_weff_nf ;
5929 Lov = pParam->HSM2_lover ;
5930
5931 if ( pParam->HSM2_nover == 0.0 ){
5932 T4 = cov_slp * T1 * ( cov_mag + covvg ) ;
5933 T4_dVg = cov_slp * T1 * covvg_dVgs ;
5934 T4_dVd = 0.0 ;
5935 T5 = Lov * T1 ;
5936
5937 TX = Ps0 ;
5938 TX_dVbs = Ps0_dVbs ;
5939 TX_dVds = Ps0_dVds ;
5940 TX_dVgs = Ps0_dVgs ;
5941
5942 T9 = 1.2e0 - TX ;
5943 Qgos = Vgs * T5 - T9 * T4 ;
5944 Qgos_dVbs = T4 * TX_dVbs ;
5945 Qgos_dVds = T4 * TX_dVds - T9 * T4_dVd ;
5946 Qgos_dVgs = T5 + T4 * TX_dVgs - T9 * T4_dVg ;
5947
5948 T4 = cov_slp * T1 * ( cov_mag + covvg - Vds ) ;
5949 T4_dVg = cov_slp * T1 * covvg_dVgs ;
5950 T4_dVd = - cov_slp * T1 ;
5951 TX = Psl - Vds ;
5952 TX_dVbs = Psl_dVbs ;
5953 TX_dVds = Psl_dVds - 1.0 ;
5954 TX_dVgs = Psl_dVgs ;
5955 T9 = 1.2e0 - TX ;
5956 Qgod = (Vgs - Vds) * T5 - T4 * T9 ;
5957 Qgod_dVbs = T4 * TX_dVbs ;
5958 Qgod_dVds = - T5 + T4 * TX_dVds - T9 * T4_dVd ;
5959 Qgod_dVgs = T5 + T4 * TX_dVgs - T9 * T4_dVg ;
5960 } else {
5961 for ( lcover = -1 ; lcover <= +1 ; lcover += 2 ) {
5962 flg_ovloops = ( 1 - lcover ) / 2 ; /* 1 in Source overlap calc. */
5963 flg_ovloopd = ( 1 + lcover ) / 2 ; /* 1 in Drain overlap calc. */
5964 /*-------------------------------------------*
5965 * Qover (G/D overlap charge) | note: _dVxs means _dVxse
5966 *------------------------*/
5967 Vbsgmt = ModeNML * Vbse + ModeRVS * ( Vbse - Vdse ) ;
5968 Vdsgmt = ModeNML * Vdse + ModeRVS * ( - Vdse ) ;
5969 Vgsgmt = ModeNML * Vgse + ModeRVS * ( Vgse - Vdse ) ;
5970 Vdbgmt = Vdsgmt - Vbsgmt ;
5971 Vgbgmt = Vgsgmt - Vbsgmt ;
5972 Vsbgmt = - Vbsgmt ;
5973 flg_overs = flg_ovloops * (int)ModeNML + flg_ovloopd * (int)ModeRVS ; /* geometrical source */
5974 flg_overd = flg_ovloops * (int)ModeRVS + flg_ovloopd * (int)ModeNML ; /* geometrical drain */
5975 Vxbgmt = flg_overs * Vsbgmt + flg_overd * Vdbgmt + epsm10 ;
5976
5977
5978 /*---------------------------------------------------*
5979 * Clamp -Vxbgmt.
5980 *-----------------*/
5981 T0 = - Vxbgmt;
5982 if ( T0 > Vbs_bnd ) {
5983 T1 = T0 - Vbs_bnd;
5984 T2 = Vbs_max - Vbs_bnd;
5985
5986 Fn_SUPoly4( TY, T1, T2, T11 );
5987
5988 T10 = Vbs_bnd + TY ;
5989 } else {
5990 T10 = T0 ;
5991 T11 = 1.0 ;
5992 }
5993 Vxbgmtcl = - T10 - small2 ;
5994 Vxbgmtcl_dVxbgmt = T11;
5995
5996 fac1 = here->HSM2_cnst0over * Cox0_inv ;
5997 fac1_dVbs = 0.0; fac1_dVds = 0.0; fac1_dVgs = 0.0;
5998
5999 fac1p2 = fac1 * fac1 ;
6000
6001 VgpLD = - Vgbgmt + pParam->HSM2_vfbover;
6002 VgpLD_dVgb = - 1.0e0 ;
6003
6004 T0 = pParam->HSM2_nover / here->HSM2_nin ;
6005 Pb2over = 2.0 / beta * log( T0 ) ;
6006
6007 Vgb_fb_LD = - Vxbgmtcl ;
6008
6009 /*-----------------------------------*
6010 * QsuLD: total charge = Accumulation | Depletion+inversion
6011 *-----------------*/
6012 if ( VgpLD < Vgb_fb_LD ){
6013 /*---------------------------*
6014 * Accumulation
6015 *-----------------*/
6016 flg_ovzone = -1 ;
6017 T1 = 1.0 / ( beta * here->HSM2_cnst0over ) ;
6018 TY = T1 * Cox0 ;
6019 Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ;
6020 Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ;
6021
6022 Ps0_min = here->HSM2_eg - Pb2over ;
6023
6024 TX = beta * ( VgpLD + Vxbgmtcl ) ;
6025 TX_dVxb = beta * Vxbgmtcl_dVxbgmt ;
6026 TX_dVgb = beta * VgpLD_dVgb ;
6027
6028 Ac31 = 7.0 * C_SQRT_2 - 9.0 * TY * ( TX - 2.0 ) ;
6029 Ac31_dVxb = - 9.0 * TY * TX_dVxb ;
6030 Ac31_dVgb = - 9.0 * TY * TX_dVgb ;
6031
6032 Ac3 = Ac31 * Ac31 ;
6033 T1 = 2.0 * Ac31 ;
6034 Ac3_dVxb = T1 * Ac31_dVxb ;
6035 Ac3_dVgb = T1 * Ac31_dVgb ;
6036
6037 Ac2 = sqrt( Ac4 + Ac3 ) ;
6038 T1 = 0.5 / Ac2 ;
6039 Ac2_dVxb = T1 * Ac3_dVxb ;
6040 Ac2_dVgb = T1 * Ac3_dVgb ;
6041
6042 Ac1 = -7.0 * C_SQRT_2 + Ac2 + 9.0 * TY * ( TX - 2.0 ) ;
6043 Ac1_dVxb = Ac2_dVxb + 9.0 * TY * TX_dVxb ;
6044 Ac1_dVgb = Ac2_dVgb + 9.0 * TY * TX_dVgb ;
6045
6046 Acd = pow( Ac1 , C_1o3 ) ;
6047 T1 = C_1o3 / ( Acd * Acd ) ;
6048 Acd_dVxb = Ac1_dVxb * T1 ;
6049 Acd_dVgb = Ac1_dVgb * T1 ;
6050
6051 Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ;
6052 T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ;
6053 Acn_dVxb = T1 * Acd_dVxb ;
6054 Acn_dVgb = T1 * Acd_dVgb ;
6055
6056 Chi = Acn / Acd ;
6057 T1 = 1.0 / ( Acd * Acd ) ;
6058 Chi_dVxb = ( Acn_dVxb * Acd - Acn * Acd_dVxb ) * T1 ;
6059 Chi_dVgb = ( Acn_dVgb * Acd - Acn * Acd_dVgb ) * T1 ;
6060
6061 Psa = Chi * beta_inv - Vxbgmtcl ;
6062 Psa_dVxb = Chi_dVxb * beta_inv - Vxbgmtcl_dVxbgmt ;
6063 Psa_dVgb = Chi_dVgb * beta_inv ;
6064
6065 T1 = Psa + Vxbgmtcl ;
6066 T2 = T1 / Ps0_min ;
6067 T3 = sqrt( 1.0 + ( T2 * T2 ) ) ;
6068
6069 T9 = T2 / T3 / Ps0_min ;
6070 T3_dVd = T9 * ( Psa_dVxb + Vxbgmtcl_dVxbgmt ) ;
6071 T3_dVg = T9 * Psa_dVgb ;
6072
6073 Ps0LD = T1 / T3 - Vxbgmtcl ;
6074 T9 = 1.0 / ( T3 * T3 ) ;
6075 Ps0LD_dVxb = T9 * ( ( Psa_dVxb + Vxbgmtcl_dVxbgmt ) * T3 - T1 * T3_dVd ) - Vxbgmtcl_dVxbgmt ;
6076 Ps0LD_dVgb = T9 * ( Psa_dVgb * T3 - T1 * T3_dVg );
6077
6078 T2 = ( VgpLD - Ps0LD ) ;
6079 QsuLD = Cox0 * T2 ;
6080 QsuLD_dVxb = - Cox0 * Ps0LD_dVxb ;
6081 QsuLD_dVgb = Cox0 * ( VgpLD_dVgb - Ps0LD_dVgb ) ;
6082
6083 QbuLD = QsuLD ;
6084 QbuLD_dVxb = QsuLD_dVxb ;
6085 QbuLD_dVgb = QsuLD_dVgb ;
6086
6087 } else {
6088
6089 /*---------------------------*
6090 * Depletion and inversion
6091 *-----------------*/
6092
6093 /* initial value for a few fixpoint iterations
6094 to get Ps0_iniA from simplified Poisson equation: */
6095 flg_ovzone = 2 ;
6096 Chi = znbd3 ;
6097 Chi_dVxb = 0.0 ; Chi_dVgb = 0.0 ;
6098
6099 Ps0_iniA= Chi/beta - Vxbgmtcl ;
6100 Ps0_iniA_dVxb = Chi_dVxb/beta - Vxbgmtcl_dVxbgmt ;
6101 Ps0_iniA_dVgb = Chi_dVgb/beta ;
6102
6103 /* 1 .. 2 relaxation steps should be sufficient */
6104 for ( lp_ld = 1; lp_ld <= 2; lp_ld ++ ) {
6105 TY = exp(-Chi);
6106 TY_dVxb = -Chi_dVxb * TY;
6107 TY_dVgb = -Chi_dVgb * TY;
6108 TX = 1.0e0 + 4.0e0
6109 * ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 + TY ) / ( fac1p2 * beta2 ) ;
6110 TX_dVxb = 4.0e0 * ( beta * ( Vxbgmtcl_dVxbgmt ) + TY_dVxb ) / ( fac1p2 * beta2 );
6111 TX_dVgb = 4.0e0 * ( beta * ( VgpLD_dVgb ) + TY_dVgb ) / ( fac1p2 * beta2 );
6112 T1 = ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 + TY );
6113 T3 = fac1p2 * beta2 ;
6114 if ( TX < epsm10) {
6115 TX = epsm10; TX_dVxb = 0.0; TX_dVgb = 0.0;
6116 }
6117
6118 Ps0_iniA = VgpLD + fac1p2 * beta / 2.0e0 * ( 1.0e0 - sqrt( TX ) ) ;
6119 Ps0_iniA_dVxb = - fac1p2 * beta / 2.0e0 * TX_dVxb * 0.5 / sqrt( TX );
6120 Ps0_iniA_dVgb = VgpLD_dVgb - fac1p2 * beta / 2.0e0 * TX_dVgb * 0.5 / sqrt( TX );
6121 T1 = fac1p2 * beta ;
6122 T2 = 1.0 - sqrt( TX );
6123
6124 Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ;
6125 Chi_dVxb = beta * ( Ps0_iniA_dVxb + Vxbgmtcl_dVxbgmt ) ;
6126 Chi_dVgb = beta * ( Ps0_iniA_dVgb ) ;
6127 } /* End of iteration */
6128
6129 if ( Chi < znbd3 ) {
6130
6131 flg_ovzone = 1 ;
6132
6133 /*-----------------------------------*
6134 * zone-D1
6135 * - Ps0_iniA is the analytical solution of QovLD=Qb0 with
6136 * Qb0 being approximated by 3-degree polynomial.
6137 *
6138 * new: Inclusion of exp(-Chi) term at right border
6139 *-----------------*/
6140 Ta = 1.0/(9.0*sqrt(2.0)) - (5.0+7.0*exp(-3.0)) / (54.0*sqrt(2.0+exp(-3.0)));
6141 Tb = (1.0+exp(-3.0)) / (2.0*sqrt(2.0+exp(-3.0))) - sqrt(2.0) / 3.0;
6142 Tc = 1.0/sqrt(2.0) + 1.0/(beta*fac1);
6143 Td = - (VgpLD + Vxbgmtcl) / fac1;
6144 Td_dVxb = - Vxbgmtcl_dVxbgmt / fac1;
6145 Td_dVgb = - VgpLD_dVgb / fac1;
6146 Tq = Tb*Tb*Tb / (27.0*Ta*Ta*Ta) - Tb*Tc/(6.0*Ta*Ta) + Td/(2.0*Ta);
6147 Tq_dVxb = Td_dVxb/(2.0*Ta);
6148 Tq_dVgb = Td_dVgb / (2.0*Ta);
6149 Tp = (3.0*Ta*Tc-Tb*Tb)/(9.0*Ta*Ta);
6150 T5 = sqrt(Tq*Tq + Tp*Tp*Tp);
6151 T5_dVxb = 2.0*Tq*Tq_dVxb / (2.0*T5);
6152 T5_dVgb = 2.0*Tq*Tq_dVgb / (2.0*T5);
6153 Tu = pow(-Tq + T5,C_1o3);
6154 Tu_dVxb = Tu / (3.0 * (-Tq + T5)) * (-Tq_dVxb + T5_dVxb);
6155 Tu_dVgb = Tu / (3.0 * (-Tq + T5)) * (-Tq_dVgb + T5_dVgb);
6156 Tv = -pow(Tq + T5,C_1o3);
6157 Tv_dVxb = Tv / (3.0 * (-Tq - T5)) * (-Tq_dVxb - T5_dVxb);
6158 Tv_dVgb = Tv / (3.0 * (-Tq - T5)) * (-Tq_dVgb - T5_dVgb);
6159 TX = Tu + Tv - Tb/(3.0*Ta);
6160 TX_dVxb = Tu_dVxb + Tv_dVxb;
6161 TX_dVgb = Tu_dVgb + Tv_dVgb;
6162
6163 Ps0_iniA = TX * beta_inv - Vxbgmtcl ;
6164 Ps0_iniA_dVxb = TX_dVxb * beta_inv - Vxbgmtcl_dVxbgmt;
6165 Ps0_iniA_dVgb = TX_dVgb * beta_inv;
6166
6167 Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ;
6168 Chi_dVxb = beta * ( Ps0_iniA_dVxb + Vxbgmtcl_dVxbgmt ) ;
6169 Chi_dVgb = beta * ( Ps0_iniA_dVgb ) ;
6170 }
6171
6172 if ( model->HSM2_coqovsm > 0 ) {
6173 /*-----------------------------------*
6174 * - Ps0_iniB : upper bound.
6175 *-----------------*/
6176 flg_ovzone += 2;
6177
6178 VgpLD_shift = VgpLD + Vxbgmtcl + 0.1;
6179 VgpLD_shift_dVgb = VgpLD_dVgb;
6180 VgpLD_shift_dVxb = Vxbgmtcl_dVxbgmt;
6181 exp_bVbs = exp( beta * - Vxbgmtcl ) + small ;
6182 exp_bVbs_dVxb = - exp_bVbs * beta * Vxbgmtcl_dVxbgmt;
6183 T0 = here->HSM2_nin / pParam->HSM2_nover;
6184 cnst1over = T0 * T0;
6185 gamma = cnst1over * exp_bVbs ;
6186 gamma_dVxb = cnst1over * exp_bVbs_dVxb;
6187
6188 T0 = beta2 * fac1p2;
6189
6190 psi = beta*VgpLD_shift;
6191 psi_dVgb = beta*VgpLD_shift_dVgb;
6192 psi_dVxb = beta*VgpLD_shift_dVxb;
6193 Chi_1 = log(gamma*T0 + psi*psi) - log(cnst1over*T0) + beta*Vxbgmtcl;
6194 Chi_1_dVgb = 2.0*psi*psi_dVgb/ (gamma*T0 + psi*psi);
6195 Chi_1_dVxb = (gamma_dVxb*T0+2.0*psi*psi_dVxb)/(gamma*T0+psi*psi)
6196 + beta*Vxbgmtcl_dVxbgmt;
6197
6198 Fn_SU2( Chi_1, Chi_1, psi, 1.0, T1, T2 );
6199 Chi_1_dVgb = Chi_1_dVgb*T1 + psi_dVgb*T2;
6200 Chi_1_dVxb = Chi_1_dVxb*T1 + psi_dVxb*T2;
6201
6202 /* 1 fixpoint step for getting more accurate Chi_B */
6203 psi -= Chi_1 ;
6204 psi_dVgb -= Chi_1_dVgb ;
6205 psi_dVxb -= Chi_1_dVxb ;
6206
6207 psi += beta*0.1 ;
6208
6209 psi_B = psi;
6210 arg_B = psi*psi/(gamma*T0);
6211 Chi_B = log(gamma*T0 + psi*psi) - log(cnst1over*T0) + beta*Vxbgmtcl;
6212 Chi_B_dVgb = 2.0*psi*psi_dVgb/ (gamma*T0 + psi*psi);
6213 Chi_B_dVxb = (gamma_dVxb*T0+2.0*psi*psi_dVxb)/(gamma*T0+psi*psi)
6214 + beta*Vxbgmtcl_dVxbgmt;
6215 Ps0_iniB = Chi_B/beta - Vxbgmtcl ;
6216 Ps0_iniB_dVgb = Chi_B_dVgb/beta;
6217 Ps0_iniB_dVxb = Chi_B_dVxb/beta- Vxbgmtcl_dVxbgmt;
6218
6219
6220 /* construction of Ps0LD by taking Ps0_iniB as an upper limit of Ps0_iniA
6221 *
6222 * Limiting is done for Chi rather than for Ps0LD, to avoid shifting
6223 * for Fn_SU2 */
6224
6225 Chi_A = Chi;
6226 Chi_A_dVxb = Chi_dVxb;
6227 Chi_A_dVgb = Chi_dVgb;
6228
6229 Fn_SU2( Chi, Chi_A, Chi_B, c_ps0ini_2*75.00, T1, T2 ); /* org: 50 */
6230 Chi_dVgb = Chi_A_dVgb * T1 + Chi_B_dVgb * T2;
6231 Chi_dVxb = Chi_A_dVxb * T1 + Chi_B_dVxb * T2;
6232
6233 }
6234
6235 /* updating Ps0LD */
6236 Ps0LD= Chi/beta - Vxbgmtcl ;
6237 Ps0LD_dVgb = Chi_dVgb/beta;
6238 Ps0LD_dVxb = Chi_dVxb/beta- Vxbgmtcl_dVxbgmt;
6239
6240 T1 = Chi - 1.0 + exp(-Chi);
6241 T1_dVxb = (1.0 - exp(-Chi)) * Chi_dVxb ;
6242 T1_dVgb = (1.0 - exp(-Chi)) * Chi_dVgb ;
6243 if (T1 < epsm10) {
6244 T1 = epsm10 ;
6245 T1_dVxb = 0.0 ;
6246 T1_dVgb = 0.0 ;
6247 }
6248 T2 = sqrt(T1);
6249 QbuLD = here->HSM2_cnst0over * T2 ;
6250 T3 = here->HSM2_cnst0over * 0.5 / T2 ;
6251 QbuLD_dVxb = T3 * T1_dVxb ;
6252 QbuLD_dVgb = T3 * T1_dVgb ;
6253
6254 /*-----------------------------------------------------------*
6255 * QsuLD : Qovs or Qovd in unit area.
6256 * note: QsuLD = Qdep+Qinv.
6257 *-----------------*/
6258 QsuLD = Cox0 * ( VgpLD - Ps0LD ) ;
6259 QsuLD_dVxb = Cox0 * ( - Ps0LD_dVxb ) ;
6260 QsuLD_dVgb = Cox0 * ( VgpLD_dVgb - Ps0LD_dVgb ) ;
6261
6262 if ( model->HSM2_coqovsm == 1 ) { /* take initial values from analytical model */
6263
6264
6265 /*---------------------------------------------------*
6266 * Calculation of Ps0LD. (beginning of Newton loop)
6267 * - Fs0 : Fs0 = 0 is the equation to be solved.
6268 * - dPs0 : correction value.
6269 *-----------------*/
6270
6271 /* initial value too close to flat band should not be used */
6272 exp_bVbs = exp( beta * - Vxbgmtcl ) ;
6273 T0 = here->HSM2_nin / pParam->HSM2_nover;
6274 cnst1over = T0 * T0;
6275 cfs1 = cnst1over * exp_bVbs ;
6276
6277 flg_conv = 0 ;
6278 for ( lp_s0 = 1 ; lp_s0 <= 2*lp_s0_max + 1 ; lp_s0 ++ ) {
6279
6280 Chi = beta * ( Ps0LD + Vxbgmtcl ) ;
6281
6282 if ( Chi < znbd5 ) {
6283 /*-------------------------------------------*
6284 * zone-D1/D2. (Ps0LD)
6285 *-----------------*/
6286 fi = Chi * Chi * Chi
6287 * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ;
6288 fi_dChi = Chi * Chi
6289 * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ;
6290
6291 fs01 = cfs1 * fi * fi ;
6292 fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ;
6293
6294 fb = Chi * ( cn_nc51
6295 + Chi * ( cn_nc52
6296 + Chi * ( cn_nc53
6297 + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ;
6298 fb_dChi = cn_nc51
6299 + Chi * ( 2 * cn_nc52
6300 + Chi * ( 3 * cn_nc53
6301 + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ;
6302
6303 fs02 = sqrt( fb * fb + fs01 + small ) ;
6304 fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ;
6305
6306 } else {
6307 /*-------------------------------------------*
6308 * zone-D3. (Ps0LD)
6309 *-----------------*/
6310 if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */
6311 exp_Chi = exp( Chi ) ;
6312 fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ;
6313 fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ;
6314 } else {
6315 exp_bPs0 = exp( beta*Ps0LD ) ;
6316 fs01 = cnst1over * ( exp_bPs0 - exp_bVbs ) ;
6317 fs01_dPs0 = cnst1over * beta * exp_bPs0 ;
6318 }
6319 fs02 = sqrt( Chi - 1.0 + fs01 ) ;
6320 fs02_dPs0 = ( beta + fs01_dPs0 ) / fs02 * 0.5 ;
6321
6322 } /* end of if ( Chi ... ) block */
6323 /*-----------------------------------------------------------*
6324 * Fs0
6325 *-----------------*/
6326 Fs0 = VgpLD - Ps0LD - fac1 * fs02 ;
6327 Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ;
6328
6329 if ( flg_conv == 1 ) break ;
6330
6331 dPs0 = - Fs0 / Fs0_dPs0 ;
6332
6333 /*-------------------------------------------*
6334 * Update Ps0LD .
6335 *-----------------*/
6336 dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0LD))) ;
6337 if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ;
6338
6339 Ps0LD = Ps0LD + dPs0 ;
6340
6341 TX = -Vxbgmtcl + ps_conv / 2 ;
6342 if ( Ps0LD < TX ) Ps0LD = TX ;
6343
6344 /*-------------------------------------------*
6345 * Check convergence.
6346 *-----------------*/
6347 if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) {
6348 flg_conv = 1 ;
6349 }
6350
6351 } /* end of Ps0LD Newton loop */
6352
6353 /*-------------------------------------------*
6354 * Procedure for diverged case.
6355 *-----------------*/
6356 if ( flg_conv == 0 ) {
6357 fprintf( stderr ,
6358 "*** warning(HiSIM_HV): Went Over Iteration Maximum (Ps0LD)\n" ) ;
6359 fprintf( stderr , " -Vxbgmtcl = %e Vgbgmt = %e\n" , -Vxbgmtcl , Vgbgmt ) ;
6360 }
6361
6362 /*---------------------------------------------------*
6363 * Evaluate derivatives of Ps0LD.
6364 *-----------------*/
6365
6366 if ( Chi < znbd5 ) {
6367 fs01_dVbs = cfs1 * beta * fi * ( - fi + 2 * fi_dChi ) ; /* fs01_dVxbgmtcl */
6368 T2 = 1.0e0 / ( fs02 + fs02 ) ;
6369 fs02_dVbs = ( + beta * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */
6370 } else {
6371 if ( Chi < large_arg ) {
6372 fs01_dVbs = + cfs1 * beta ; /* fs01_dVxbgmtcl */
6373 } else {
6374 fs01_dVbs = + cfs1 * beta ;
6375 }
6376 T2 = 0.5e0 / fs02 ;
6377 fs02_dVbs = ( + beta + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */
6378 }
6379
6380 T1 = 1.0 / Fs0_dPs0 ;
6381 Ps0LD_dVxb = - ( - fac1 * fs02_dVbs ) * T1 ;
6382 Ps0LD_dVds = 0.0 ;
6383 Ps0LD_dVgb = - ( VgpLD_dVgb - fac1_dVgs * fs02 ) * T1 ;
6384
6385
6386 if ( Chi < znbd5 ) {
6387 /*-------------------------------------------*
6388 * zone-D1/D2. (Ps0LD)
6389 *-----------------*/
6390 if ( Chi < znbd3 ) { flg_ovzone = 1; }
6391 else { flg_ovzone = 2; }
6392
6393 Xi0 = fb * fb + epsm10 ;
6394 T1 = 2 * fb * fb_dChi * beta ;
6395 Xi0_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0_dVxbgmtcl */
6396 Xi0_dVds = T1 * Ps0LD_dVds ;
6397 Xi0_dVgs = T1 * Ps0LD_dVgb ;
6398
6399 Xi0p12 = fb + epsm10 ;
6400 T1 = fb_dChi * beta ;
6401 Xi0p12_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0p12_dVxbgmtcl */
6402 Xi0p12_dVds = T1 * Ps0LD_dVds ;
6403 Xi0p12_dVgs = T1 * Ps0LD_dVgb ;
6404
6405 Xi0p32 = fb * fb * fb + epsm10 ;
6406 T1 = 3 * fb * fb * fb_dChi * beta ;
6407 Xi0p32_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0p32_dVxbgmtcl */
6408 Xi0p32_dVds = T1 * Ps0LD_dVds ;
6409 Xi0p32_dVgs = T1 * Ps0LD_dVgb ;
6410
6411 } else {
6412 /*-------------------------------------------*
6413 * zone-D3. (Ps0LD)
6414 *-----------------*/
6415 flg_ovzone = 3 ;
6416
6417 Xi0 = Chi - 1.0e0 ;
6418 Xi0_dVbs = beta * ( Ps0LD_dVxb + 1.0e0 ) ; /* Xi0_dVxbgmtcl */
6419 Xi0_dVds = beta * Ps0LD_dVds ;
6420 Xi0_dVgs = beta * Ps0LD_dVgb ;
6421
6422 Xi0p12 = sqrt( Xi0 ) ;
6423 T1 = 0.5e0 / Xi0p12 ;
6424 Xi0p12_dVbs = T1 * Xi0_dVbs ;
6425 Xi0p12_dVds = T1 * Xi0_dVds ;
6426 Xi0p12_dVgs = T1 * Xi0_dVgs ;
6427
6428 Xi0p32 = Xi0 * Xi0p12 ;
6429 T1 = 1.5e0 * Xi0p12 ;
6430 Xi0p32_dVbs = T1 * Xi0_dVbs ;
6431 Xi0p32_dVds = T1 * Xi0_dVds ;
6432 Xi0p32_dVgs = T1 * Xi0_dVgs ;
6433
6434 if ( Chi < large_arg ) {
6435 } else {
6436 }
6437 } /* end of if ( Chi ... ) block */
6438
6439 /*-----------------------------------------------------------*
6440 * - Recalculate the derivatives of fs01 and fs02.
6441 *-----------------*/
6442 fs01_dVbs = Ps0LD_dVxb * fs01_dPs0 + fs01_dVbs ;
6443 fs01_dVds = Ps0LD_dVds * fs01_dPs0 ;
6444 fs01_dVgs = Ps0LD_dVgb * fs01_dPs0 ;
6445 fs02_dVbs = Ps0LD_dVxb * fs02_dPs0 + fs02_dVbs ;
6446 fs02_dVxb = Ps0LD_dVds * fs02_dPs0 ;
6447 fs02_dVgb = Ps0LD_dVgb * fs02_dPs0 ;
6448
6449 /*-----------------------------------------------------------*
6450 * QbuLD and QiuLD
6451 *-----------------*/
6452 QbuLD = here->HSM2_cnst0over * Xi0p12 ;
6453 QbuLD_dVxb = here->HSM2_cnst0over * Xi0p12_dVbs ;
6454 QbuLD_dVgb = here->HSM2_cnst0over * Xi0p12_dVgs ;
6455
6456 T1 = 1.0 / ( fs02 + Xi0p12 ) ;
6457 QiuLD = here->HSM2_cnst0over * fs01 * T1 ;
6458 T2 = 1.0 / ( fs01 + epsm10 ) ;
6459 QiuLD_dVbs = QiuLD * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ;
6460 QiuLD_dVgs = QiuLD * ( fs01_dVgs * T2 - ( fs02_dVgb + Xi0p12_dVgs ) * T1 ) ;
6461
6462 /*-----------------------------------------------------------*
6463 * Extrapolation: X_dVxbgmt = X_dVxbgmtcl * Vxbgmtcl_dVxbgmt
6464 *-----------------*/
6465 QbuLD_dVxb *= Vxbgmtcl_dVxbgmt ;
6466 QiuLD_dVbs *= Vxbgmtcl_dVxbgmt ;
6467
6468 /*-----------------------------------------------------------*
6469 * Total overlap charge
6470 *-----------------*/
6471 QsuLD = QbuLD + QiuLD;
6472 QsuLD_dVxb = QbuLD_dVxb + QiuLD_dVbs;
6473 QsuLD_dVgb = QbuLD_dVgb + QiuLD_dVgs;
6474
6475 } /* end of COQOVSM branches */
6476
6477 } /* end of Vgbgmt region blocks */
6478
6479
6480 /* convert to source ref. */
6481 QsuLD_dVbs = - (QsuLD_dVxb + QsuLD_dVgb) ;
6482 QsuLD_dVds = QsuLD_dVxb * flg_overd ;
6483 QsuLD_dVgs = QsuLD_dVgb ;
6484
6485 QbuLD_dVbs = - (QbuLD_dVxb + QbuLD_dVgb) ;
6486 QbuLD_dVds = QbuLD_dVxb * flg_overd ;
6487 QbuLD_dVgs = QbuLD_dVgb ;
6488
6489 /* inversion charge = total - depletion */
6490 QiuLD = QsuLD - QbuLD ;
6491 QiuLD_dVbs = QsuLD_dVbs - QbuLD_dVbs ;
6492 QiuLD_dVds = QsuLD_dVds - QbuLD_dVds ;
6493 QiuLD_dVgs = QsuLD_dVgs - QbuLD_dVgs ;
6494
6495 /* assign final outputs of Qover model */
6496 /* note: Qovs and Qovd are exchanged in reverse mode */
6497 T4 = here->HSM2_weff_nf * Lov ;
6498
6499 if(flg_ovloops) {
6500 Qovs = T4 * QsuLD ;
6501 Qovs_dVbs = T4 * QsuLD_dVbs ;
6502 Qovs_dVds = T4 * QsuLD_dVds ;
6503 Qovs_dVgs = T4 * QsuLD_dVgs ;
6504 QisLD = T4 * QiuLD ;
6505 QisLD_dVbs = T4 * QiuLD_dVbs ;
6506 QisLD_dVds = T4 * QiuLD_dVds ;
6507 QisLD_dVgs = T4 * QiuLD_dVgs ;
6508 QbsLD = T4 * QbuLD ;
6509 QbsLD_dVbs = T4 * QbuLD_dVbs ;
6510 QbsLD_dVds = T4 * QbuLD_dVds ;
6511 QbsLD_dVgs = T4 * QbuLD_dVgs ;
6512 }
6513
6514 if(flg_ovloopd) {
6515 Qovd = T4 * QsuLD ;
6516 Qovd_dVbs = T4 * QsuLD_dVbs ;
6517 Qovd_dVds = T4 * QsuLD_dVds ;
6518 Qovd_dVgs = T4 * QsuLD_dVgs ;
6519 QidLD = T4 * QiuLD ;
6520 QidLD_dVbs = T4 * QiuLD_dVbs ;
6521 QidLD_dVds = T4 * QiuLD_dVds ;
6522 QidLD_dVgs = T4 * QiuLD_dVgs ;
6523 QbdLD = T4 * QbuLD ;
6524 QbdLD_dVbs = T4 * QbuLD_dVbs ;
6525 QbdLD_dVds = T4 * QbuLD_dVds ;
6526 QbdLD_dVgs = T4 * QbuLD_dVgs ;
6527 }
6528
6529 } /* end of lcover loop */
6530
6531 /* convert to the derivatives w.r.t. mode-dependent biases */
6532 Qovs_dVds = ModeNML * Qovs_dVds
6533 - ModeRVS * ( Qovs_dVds + Qovs_dVgs + Qovs_dVbs ) ;
6534 QisLD_dVds = ModeNML * QisLD_dVds
6535 - ModeRVS * ( QisLD_dVds + QisLD_dVgs + QisLD_dVbs ) ;
6536 QbsLD_dVds = ModeNML * QbsLD_dVds
6537 - ModeRVS * ( QbsLD_dVds + QbsLD_dVgs + QbsLD_dVbs ) ;
6538 Qovd_dVds = ModeNML * Qovd_dVds
6539 - ModeRVS * ( Qovd_dVds + Qovd_dVgs + Qovd_dVbs );
6540 QidLD_dVds = ModeNML * QidLD_dVds
6541 - ModeRVS * ( QidLD_dVds + QidLD_dVgs + QidLD_dVbs ) ;
6542 QbdLD_dVds = ModeNML * QbdLD_dVds
6543 - ModeRVS * ( QbdLD_dVds + QbdLD_dVgs + QbdLD_dVbs ) ;
6544
6545 } /* end of if ( pParam->HSM2_nover == 0.0 ) */
6546
6547 /*-----------------------------------*
6548 * Additional constant capacitance model
6549 *-----------------*/
6550 flg_overgiven = ( (int)ModeRVS * model->HSM2_cgso_Given
6551 + (int)ModeNML * model->HSM2_cgdo_Given ) ;
6552 if ( flg_overgiven ) {
6553 Cgdo = ModeRVS * pParam->HSM2_cgso + ModeNML * pParam->HSM2_cgdo ;
6554 Cgdo *= - here->HSM2_weff_nf ;
6555
6556 Qgod += - Cgdo * (Vgs - Vds) ;
6557 Qgod_dVds += Cgdo ;
6558 Qgod_dVgs += -Cgdo ;
6559 }
6560
6561 flg_overgiven = ( (int)ModeNML * model->HSM2_cgso_Given
6562 + (int)ModeRVS * model->HSM2_cgdo_Given ) ;
6563 if(flg_overgiven) {
6564 Cgso = ModeNML * pParam->HSM2_cgso + ModeRVS * pParam->HSM2_cgdo ;
6565 Cgso *= - here->HSM2_weff_nf ;
6566
6567 Qgos += - Cgso * Vgs ;
6568 Qgos_dVgs += -Cgso ;
6569 }
6570
6571 } else { /* else case of if ( model->HSM2_coovlp >= 1 ) */
6572 if ( (here->HSM2_mode == HiSIM_NORMAL_MODE && !model->HSM2_cgdo_Given) ||
6573 (here->HSM2_mode != HiSIM_NORMAL_MODE && !model->HSM2_cgso_Given) ) {
6574 Cgdo = - Cox0 * pParam->HSM2_lover * here->HSM2_weff_nf ;
6575 } else {
6576 Cgdo = ModeRVS * pParam->HSM2_cgso + ModeNML * pParam->HSM2_cgdo ;
6577 Cgdo *= - here->HSM2_weff_nf ;
6578 }
6579 Qgod = - Cgdo * (Vgs - Vds) ;
6580 Qgod_dVbs = 0.0 ;
6581 Qgod_dVds = Cgdo ;
6582 Qgod_dVgs = - Cgdo ;
6583
6584 if ( (here->HSM2_mode == HiSIM_NORMAL_MODE && !model->HSM2_cgso_Given) ||
6585 (here->HSM2_mode != HiSIM_NORMAL_MODE && !model->HSM2_cgdo_Given) ) {
6586 Cgso = - Cox0 * pParam->HSM2_lover * here->HSM2_weff_nf ;
6587 } else {
6588 Cgso = ModeNML * pParam->HSM2_cgso + ModeRVS * pParam->HSM2_cgdo ;
6589 Cgso *= - here->HSM2_weff_nf ;
6590 }
6591 Qgos = - Cgso * Vgs ;
6592 Qgos_dVbs = 0.0 ;
6593 Qgos_dVds = 0.0 ;
6594 Qgos_dVgs = - Cgso ;
6595 } /* end of if ( model->HSM2_coovlp >= 1 ) */
6596
6597 /*-------------------------------------------*
6598 * Gate/Bulk overlap charge: Qgbo
6599 *-----------------*/
6600 Cgbo_loc = - model->HSM2_cgbo * here->HSM2_lgate ;
6601 Qgbo = - Cgbo_loc * (Vgs -Vbs) ;
6602 Qgbo_dVgs = - Cgbo_loc ;
6603 Qgbo_dVbs = Cgbo_loc ;
6604 Qgbo_dVds = 0.0 ;
6605
6606 /*---------------------------------------------------*
6607 * Lateral-field-induced capacitance.
6608 *-----------------*/
6609 if ( model->HSM2_coqy == 0 || model->HSM2_xqy == 0 ){
6610 Qy = 0.0e0 ;
6611 Qy_dVds = 0.0e0 ;
6612 Qy_dVgs = 0.0e0 ;
6613 Qy_dVbs = 0.0e0 ;
6614 } else {
6615 Pslk = Ec * Leff + Ps0 ;
6616 Pslk_dVbs = Ec_dVbs * Leff + Ps0_dVbs;
6617 Pslk_dVds = Ec_dVds * Leff + Ps0_dVds;
6618 Pslk_dVgs = Ec_dVgs * Leff + Ps0_dVgs;
6619 Fn_SU2( T10, (Pslk + C_PSLK_SHIFT), (Psdl + C_PSLK_SHIFT), C_PSLK_DELTA, T1, T2 );
6620 Pslk_dVbs = Pslk_dVbs * T1 + Psdl_dVbs * T2;
6621 Pslk_dVds = Pslk_dVds * T1 + Psdl_dVds * T2;
6622 Pslk_dVgs = Pslk_dVgs * T1 + Psdl_dVgs * T2;
6623 Pslk = T10 - C_PSLK_SHIFT;
6624
6625 /* suppress Qy in accumulation region */
6626 /*
6627 Aclm_eff = 1.0 - Pds / (eps_qy + Pds) * (1.0 - Aclm) ;
6628 Aclm_eff_dVds = eps_qy * Pds_dVds / ((eps_qy + Pds)*(eps_qy + Pds)) ;
6629 Aclm_eff_dVgs = eps_qy * Pds_dVgs / ((eps_qy + Pds)*(eps_qy + Pds)) ;
6630 Aclm_eff_dVbs = eps_qy * Pds_dVbs / ((eps_qy + Pds)*(eps_qy + Pds)) ;
6631 */
6632
6633 Aclm_eff = Aclm ; Aclm_eff_dVds = Aclm_eff_dVgs = Aclm_eff_dVbs = 0.0 ;
6634
6635 T1 = Aclm_eff * ( Vds + Ps0 ) + ( 1.0e0 - Aclm_eff ) * Pslk ;
6636 T1_dVb = Aclm_eff * ( Ps0_dVbs ) + ( 1.0e0 - Aclm_eff ) * Pslk_dVbs
6637 + Aclm_eff_dVbs * ( Vds + Ps0 - Pslk ) ;
6638 T1_dVd = Aclm_eff * ( 1.0 + Ps0_dVds ) + ( 1.0e0 - Aclm_eff ) * Pslk_dVds
6639 + Aclm_eff_dVds * ( Vds + Ps0 - Pslk ) ;
6640 T1_dVg = Aclm_eff * ( Ps0_dVgs ) + ( 1.0e0 - Aclm_eff ) * Pslk_dVgs
6641 + Aclm_eff_dVgs * ( Vds + Ps0 - Pslk ) ;
6642 T10 = here->HSM2_wdpl ;
6643 T3 = T10 * 1.3 ;
6644 T2 = C_ESI * here->HSM2_weff_nf * T3 ;
6645 T7 = 1.0e-9 ; /* 1nm */
6646 T0 = Fn_Max( model->HSM2_xqy , T7 ) ;
6647 T4 = T2 / T0 ;
6648 Qy = - ( Ps0 + Vds - T1 ) * T4 ;
6649 Qy_dVds = - ( Ps0_dVds + 1.0e0 - T1_dVd ) * T4 ;
6650 Qy_dVgs = - ( Ps0_dVgs - T1_dVg ) * T4 ;
6651 Qy_dVbs = - ( Ps0_dVbs - T1_dVb ) * T4 ;
6652
6653
6654 }
6655
6656 if ( model->HSM2_xqy1 != 0.0 ){
6657 Qy += here->HSM2_cqyb0 * Vbs ;
6658 Qy_dVbs += here->HSM2_cqyb0 ;
6659 }
6660
6661 Qy = Qy * FMDVDS ;
6662 Qy_dVbs = Qy_dVbs * FMDVDS + Qy * FMDVDS_dVbs ;
6663 Qy_dVds = Qy_dVds * FMDVDS + Qy * FMDVDS_dVds ;
6664 Qy_dVgs = Qy_dVgs * FMDVDS + Qy * FMDVDS_dVgs ;
6665
6666 /*---------------------------------------------------*
6667 * Fringing capacitance.
6668 *-----------------*/
6669 Cf = here->HSM2_cfrng ;
6670 Qfd = Cf * ( Vgs - Vds ) ;
6671 Qfs = Cf * Vgs ;
6672
6673 /*-----------------------------------------------------------*
6674 * End of PART-3. (label)
6675 *-----------------*/
6676
6677 /* end_of_part_3:*/
6678
6679 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6680 * PART-4: Substrate-source/drain junction diode.
6681 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
6682
6683 /*-----------------------------------------------------------*
6684 * Cbsj, Cbdj: node-base S/D biases.
6685 *-----------------*/
6686
6687 T10 = model->HSM2_cvb * here->HSM2_jd_nvtm_inv ;
6688 T11 = model->HSM2_cvbk * here->HSM2_jd_nvtm_inv ;
6689
6690 T9 = model->HSM2_cisb * here->HSM2_exptemp ;
6691 T0 = here->HSM2_isbd2 * T9 ;
6692
6693 T2 = exp (- vbd_jct * T10 );
6694 T2_dVb = - T2 * T10 ;
6695
6696 T3 = exp (- vbd_jct * T11 );
6697 T3_dVb = - T3 * T11 ;
6698
6699
6700 /* ibd */
6701 if ( vbd_jct < here->HSM2_vbdt ) {
6702 TX = vbd_jct * here->HSM2_jd_nvtm_inv ;
6703 if ( TX < - EXP_THR ) {
6704 T1 = 0.0 ;
6705 T1_dVb = 0.0 ;
6706 } else {
6707 T1 = exp ( TX ) ;
6708 T1_dVb = T1 * here->HSM2_jd_nvtm_inv ;
6709 }
6710
6711 Ibd = here->HSM2_isbd * (T1 - 1.0)
6712 + T0 * (T2 - 1.0)
6713 + pParam->HSM2_cisbk * (T3 - 1.0);
6714 Gbd = here->HSM2_isbd * T1_dVb
6715 + T0 * T2_dVb
6716 + pParam->HSM2_cisbk * T3_dVb ;
6717
6718 } else {
6719 T1 = here->HSM2_jd_expcd ;
6720
6721 T4 = here->HSM2_isbd * here->HSM2_jd_nvtm_inv * T1 ;
6722
6723 Ibd = here->HSM2_isbd * (T1 - 1.0)
6724 + T4 * (vbd_jct - here->HSM2_vbdt)
6725 + T0 * (T2 - 1.0)
6726 + pParam->HSM2_cisbk * (T3 - 1.0) ;
6727 Gbd = T4
6728 + T0 * T2_dVb
6729 + pParam->HSM2_cisbk * T3_dVb ;
6730 }
6731 T12 = model->HSM2_divx * here->HSM2_isbd2 ;
6732 Ibd += T12 * vbd_jct ;
6733 Gbd += T12 ;
6734
6735 /* ibs */
6736 T0 = here->HSM2_isbs2 * T9 ;
6737
6738 TX = - vbs_jct * T10 ;
6739 if ( TX < - EXP_THR ) {
6740 T2 = 0.0 ;
6741 T2_dVb = 0.0 ;
6742 } else {
6743 T2 = exp ( TX );
6744 T2_dVb = - T2 * T10 ;
6745 }
6746
6747 TX = - vbs_jct * T11 ;
6748 if ( TX < - EXP_THR ) {
6749 T3 = 0.0 ;
6750 T3_dVb = 0.0 ;
6751 } else {
6752 T3 = exp ( TX );
6753 T3_dVb = - T3 * T11 ;
6754 }
6755
6756 if ( vbs_jct < here->HSM2_vbst ) {
6757 TX = vbs_jct * here->HSM2_jd_nvtm_inv ;
6758 if ( TX < - EXP_THR ) {
6759 T1 = 0.0 ;
6760 T1_dVb = 0.0 ;
6761 } else {
6762 T1 = exp ( TX ) ;
6763 T1_dVb = T1 * here->HSM2_jd_nvtm_inv ;
6764 }
6765 Ibs = here->HSM2_isbs * (T1 - 1.0)
6766 + T0 * (T2 - 1.0)
6767 + pParam->HSM2_cisbk * (T3 - 1.0);
6768 Gbs = here->HSM2_isbs * T1_dVb
6769 + T0 * T2_dVb
6770 + pParam->HSM2_cisbk * T3_dVb ;
6771 } else {
6772 T1 = here->HSM2_jd_expcs ;
6773
6774 T4 = here->HSM2_isbs * here->HSM2_jd_nvtm_inv * T1 ;
6775
6776 Ibs = here->HSM2_isbs * (T1 - 1.0)
6777 + T4 * (vbs_jct - here->HSM2_vbst)
6778 + T0 * (T2 - 1.0)
6779 + pParam->HSM2_cisbk * (T3 - 1.0) ;
6780 Gbs = T4
6781 + T0 * T2_dVb
6782 + pParam->HSM2_cisbk * T3_dVb ;
6783 }
6784 T12 = model->HSM2_divx * here->HSM2_isbs2 ;
6785 Ibs += T12 * vbs_jct ;
6786 Gbs += T12 ;
6787
6788 /*---------------------------------------------------*
6789 * Add Gjmin.
6790 *-----------------*/
6791 Ibd += Gjmin * vbd_jct ;
6792 Ibs += Gjmin * vbs_jct ;
6793
6794 Gbd += Gjmin ;
6795 Gbs += Gjmin ;
6796
6797 /*-----------------------------------------------------------*
6798 * Charges and Capacitances.
6799 *-----------------*/
6800 /* charge storage elements
6801 * bulk-drain and bulk-source depletion capacitances
6802 * czbd : zero bias drain junction capacitance
6803 * czbs : zero bias source junction capacitance
6804 * czbdsw:zero bias drain junction sidewall capacitance
6805 * czbssw:zero bias source junction sidewall capacitance
6806 */
6807 /* add new parameters
6808 tcjbs : temperature dependence of czbs
6809 tcjbd : temperature dependence of czbd
6810 tcjbssw : temperature dependence of czbssw
6811 tcjbdsw : temperature dependence of czbdsw
6812 tcjbsswg : temperature dependence of czbsswg
6813 tcjbdswg : temperature dependence of czbdswg
6814 */
6815 tcjbd=model->HSM2_tcjbd;
6816 tcjbs=model->HSM2_tcjbs;
6817 tcjbdsw=model->HSM2_tcjbdsw;
6818 tcjbssw=model->HSM2_tcjbssw;
6819 tcjbdswg=model->HSM2_tcjbdswg;
6820 tcjbsswg=model->HSM2_tcjbsswg;
6821
6822 czbs = model->HSM2_cj * here->HSM2_as ;
6823 czbs = czbs * ( 1.0 + tcjbs * ( TTEMP - model->HSM2_ktnom )) ;
6824
6825 czbd = model->HSM2_cj * here->HSM2_ad ;
6826 czbd = czbd * ( 1.0 + tcjbd * ( TTEMP - model->HSM2_ktnom )) ;
6827
6828 /* Source Bulk Junction */
6829 if (here->HSM2_ps > here->HSM2_weff_nf) {
6830 czbssw = model->HSM2_cjsw * ( here->HSM2_ps - here->HSM2_weff_nf ) ;
6831 czbssw = czbssw * ( 1.0 + tcjbssw * ( TTEMP - model->HSM2_ktnom )) ;
6832
6833 czbsswg = model->HSM2_cjswg * here->HSM2_weff_nf ;
6834 czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSM2_ktnom )) ;
6835
6836 if (vbs_jct == 0.0) {
6837 Qbs = 0.0 ;
6838 Capbs = czbs + czbssw + czbsswg ;
6839 } else if (vbs_jct < 0.0) {
6840 if (czbs > 0.0) {
6841 arg = 1.0 - vbs_jct / model->HSM2_pb ;
6842 if (model->HSM2_mj == 0.5)
6843 sarg = 1.0 / sqrt(arg) ;
6844 else
6845 sarg = Fn_Pow( arg , -model->HSM2_mj ) ;
6846 Qbs = model->HSM2_pb * czbs * (1.0 - arg * sarg) / (1.0 - model->HSM2_mj) ;
6847 Capbs = czbs * sarg ;
6848 } else {
6849 Qbs = 0.0 ;
6850 Capbs = 0.0 ;
6851 }
6852 if (czbssw > 0.0) {
6853 arg = 1.0 - vbs_jct / model->HSM2_pbsw ;
6854 if (model->HSM2_mjsw == 0.5)
6855 sarg = 1.0 / sqrt(arg) ;
6856 else
6857 sarg = Fn_Pow( arg , -model->HSM2_mjsw ) ;
6858 Qbs += model->HSM2_pbsw * czbssw * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjsw) ;
6859 Capbs += czbssw * sarg ;
6860 }
6861 if (czbsswg > 0.0) {
6862 arg = 1.0 - vbs_jct / model->HSM2_pbswg ;
6863 if (model->HSM2_mjswg == 0.5)
6864 sarg = 1.0 / sqrt(arg) ;
6865 else
6866 sarg = Fn_Pow( arg , -model->HSM2_mjswg ) ;
6867 Qbs += model->HSM2_pbswg * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjswg) ;
6868 Capbs += czbsswg * sarg ;
6869 }
6870 } else {
6871 T1 = czbs + czbssw + czbsswg ;
6872 T2 = czbs * model->HSM2_mj / model->HSM2_pb
6873 + czbssw * model->HSM2_mjsw / model->HSM2_pbsw
6874 + czbsswg * model->HSM2_mjswg / model->HSM2_pbswg ;
6875 Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ;
6876 Capbs = T1 + vbs_jct * T2 ;
6877 }
6878 } else {
6879 czbsswg = model->HSM2_cjswg * here->HSM2_ps ;
6880 czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSM2_ktnom )) ;
6881 if (vbs_jct == 0.0) {
6882 Qbs = 0.0 ;
6883 Capbs = czbs + czbsswg ;
6884 } else if (vbs_jct < 0.0) {
6885 if (czbs > 0.0) {
6886 arg = 1.0 - vbs_jct / model->HSM2_pb ;
6887 if (model->HSM2_mj == 0.5)
6888 sarg = 1.0 / sqrt(arg) ;
6889 else
6890 sarg = Fn_Pow( arg , -model->HSM2_mj ) ;
6891 Qbs = model->HSM2_pb * czbs * (1.0 - arg * sarg) / (1.0 - model->HSM2_mj) ;
6892 Capbs = czbs * sarg ;
6893 } else {
6894 Qbs = 0.0 ;
6895 Capbs = 0.0 ;
6896 }
6897 if (czbsswg > 0.0) {
6898 arg = 1.0 - vbs_jct / model->HSM2_pbswg ;
6899 if (model->HSM2_mjswg == 0.5)
6900 sarg = 1.0 / sqrt(arg) ;
6901 else
6902 sarg = Fn_Pow( arg , -model->HSM2_mjswg ) ;
6903 Qbs += model->HSM2_pbswg * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjswg) ;
6904 Capbs += czbsswg * sarg ;
6905 }
6906 } else {
6907 T1 = czbs + czbsswg ;
6908 T2 = czbs * model->HSM2_mj / model->HSM2_pb
6909 + czbsswg * model->HSM2_mjswg / model->HSM2_pbswg ;
6910 Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ;
6911 Capbs = T1 + vbs_jct * T2 ;
6912 }
6913 }
6914
6915 /* Drain Bulk Junction */
6916 if (here->HSM2_pd > here->HSM2_weff_nf) {
6917 czbdsw = model->HSM2_cjsw * ( here->HSM2_pd - here->HSM2_weff_nf ) ;
6918 czbdsw = czbdsw * ( 1.0 + tcjbdsw * ( TTEMP - model->HSM2_ktnom )) ;
6919 czbdswg = model->HSM2_cjswg * here->HSM2_weff_nf ;
6920 czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSM2_ktnom )) ;
6921 if (vbd_jct == 0.0) {
6922 Qbd = 0.0 ;
6923 Capbd = czbd + czbdsw + czbdswg ;
6924 } else if (vbd_jct < 0.0) {
6925 if (czbd > 0.0) {
6926 arg = 1.0 - vbd_jct / model->HSM2_pb ;
6927 if (model->HSM2_mj == 0.5)
6928 sarg = 1.0 / sqrt(arg) ;
6929 else
6930 sarg = Fn_Pow( arg , -model->HSM2_mj ) ;
6931 Qbd = model->HSM2_pb * czbd * (1.0 - arg * sarg) / (1.0 - model->HSM2_mj) ;
6932 Capbd = czbd * sarg ;
6933 } else {
6934 Qbd = 0.0 ;
6935 Capbd = 0.0 ;
6936 }
6937 if (czbdsw > 0.0) {
6938 arg = 1.0 - vbd_jct / model->HSM2_pbsw ;
6939 if (model->HSM2_mjsw == 0.5)
6940 sarg = 1.0 / sqrt(arg) ;
6941 else
6942 sarg = Fn_Pow( arg , -model->HSM2_mjsw ) ;
6943 Qbd += model->HSM2_pbsw * czbdsw * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjsw) ;
6944 Capbd += czbdsw * sarg ;
6945 }
6946 if (czbdswg > 0.0) {
6947 arg = 1.0 - vbd_jct / model->HSM2_pbswg ;
6948 if (model->HSM2_mjswg == 0.5)
6949 sarg = 1.0 / sqrt(arg) ;
6950 else
6951 sarg = Fn_Pow( arg , -model->HSM2_mjswg ) ;
6952 Qbd += model->HSM2_pbswg * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjswg) ;
6953 Capbd += czbdswg * sarg ;
6954 }
6955 } else {
6956 T1 = czbd + czbdsw + czbdswg ;
6957 T2 = czbd * model->HSM2_mj / model->HSM2_pb
6958 + czbdsw * model->HSM2_mjsw / model->HSM2_pbsw
6959 + czbdswg * model->HSM2_mjswg / model->HSM2_pbswg ;
6960 Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ;
6961 Capbd = T1 + vbd_jct * T2 ;
6962 }
6963
6964 } else {
6965 czbdswg = model->HSM2_cjswg * here->HSM2_pd ;
6966 czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSM2_ktnom )) ;
6967 if (vbd_jct == 0.0) {
6968 Qbd = 0.0 ;
6969 Capbd = czbd + czbdswg ;
6970 } else if (vbd_jct < 0.0) {
6971 if (czbd > 0.0) {
6972 arg = 1.0 - vbd_jct / model->HSM2_pb ;
6973 if (model->HSM2_mj == 0.5)
6974 sarg = 1.0 / sqrt(arg) ;
6975 else
6976 sarg = Fn_Pow( arg , -model->HSM2_mj ) ;
6977 Qbd = model->HSM2_pb * czbd * (1.0 - arg * sarg) / (1.0 - model->HSM2_mj) ;
6978 Capbd = czbd * sarg ;
6979 } else {
6980 Qbd = 0.0 ;
6981 Capbd = 0.0 ;
6982 }
6983 if (czbdswg > 0.0) {
6984 arg = 1.0 - vbd_jct / model->HSM2_pbswg ;
6985 if (model->HSM2_mjswg == 0.5)
6986 sarg = 1.0 / sqrt(arg) ;
6987 else
6988 sarg = Fn_Pow( arg , -model->HSM2_mjswg ) ;
6989 Qbd += model->HSM2_pbswg * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSM2_mjswg) ;
6990 Capbd += czbdswg * sarg ;
6991 }
6992 } else {
6993 T1 = czbd + czbdswg ;
6994 T2 = czbd * model->HSM2_mj / model->HSM2_pb
6995 + czbdswg * model->HSM2_mjswg / model->HSM2_pbswg ;
6996 Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ;
6997 Capbd = T1 + vbd_jct * T2 ;
6998 }
6999 }
7000
7001 /*-----------------------------------------------------------*
7002 * End of PART-4. (label)
7003 *-----------------*/
7004
7005 /* end_of_part_4:*/
7006
7007
7008
7009 /*-----------------------------------------------------------*
7010 * PART-5: NQS. (label)
7011 *-----------------*/
7012 if (flg_nqs) {
7013
7014 if(ckt->CKTmode & MODETRAN){
7015 if( ckt->CKTmode & MODEINITTRAN ){
7016 Qi_nqs = Qi ;
7017 Qi_dVgs_nqs = Qi_dVgs ;
7018 Qi_dVds_nqs = Qi_dVds ;
7019 Qi_dVbs_nqs = Qi_dVbs ;
7020
7021 Qb_nqs = Qb ;
7022 Qb_dVgs_nqs = Qb_dVgs ;
7023 Qb_dVds_nqs = Qb_dVds ;
7024 Qb_dVbs_nqs = Qb_dVbs ;
7025 } else {
7026 /* tau for inversion charge */
7027 if (flg_noqi == 0) {
7028 T12 = model->HSM2_dly1;
7029 T10 = model->HSM2_dly2;
7030
7031 T3 = Lch ;
7032 T1 = T10 * T12 * T3 * T3 ;
7033 T2 = Mu * VgVt * T12 + T10 * T3 * T3 + small ;
7034 tau = T1 / T2 ;
7035
7036 T1_dVg = T10 * T12 * 2.0 * T3 * Lch_dVgs ;
7037 T1_dVd = T10 * T12 * 2.0 * T3 * Lch_dVds ;
7038 T1_dVb = T10 * T12 * 2.0 * T3 * Lch_dVbs ;
7039
7040 T2_dVg = T12 * Mu_dVgs * VgVt
7041 + T12 * Mu * VgVt_dVgs + T10 * 2.0 * T3 * Lch_dVgs ;
7042 T2_dVd = T12 * Mu_dVds * VgVt
7043 + T12 * Mu * VgVt_dVds + T10 * 2.0 * T3 * Lch_dVds ;
7044 T2_dVb = T12 * Mu_dVbs * VgVt
7045 + T12 * Mu * VgVt_dVbs + T10 * 2.0 * T3 * Lch_dVbs ;
7046
7047 T4 = 1.0 / ( T2 * T2 ) ;
7048 tau_dVgs = ( T2 * T1_dVg - T1 * T2_dVg ) * T4 ;
7049 tau_dVds = ( T2 * T1_dVd - T1 * T2_dVd ) * T4 ;
7050 tau_dVbs = ( T2 * T1_dVb - T1 * T2_dVb ) * T4 ;
7051 } else {
7052 tau = model->HSM2_dly1 + small ;
7053 tau_dVgs = tau_dVds = tau_dVbs = 0.0 ;
7054 }
7055
7056 T1 = ckt->CKTdelta ;
7057
7058 /* Calculation of Qi */
7059 Qi_prev = *(ckt->CKTstate1 + here->HSM2qi_nqs) ;
7060 T2 = T1 + tau ;
7061 T0 = Qi - Qi_prev ;
7062 Qi_nqs = Qi_prev + T1 / T2 * T0;
7063 T3 = T1 / T2 ;
7064 T4 = T0 / T2 ;
7065 Qi_dVgs_nqs = T3 * (Qi_dVgs - T4 * tau_dVgs);
7066 Qi_dVds_nqs = T3 * (Qi_dVds - T4 * tau_dVds);
7067 Qi_dVbs_nqs = T3 * (Qi_dVbs - T4 * tau_dVbs);
7068
7069 /* tau for bulk charge */
7070 T2 = modelMKS->HSM2_dly3 ;
7071 taub = T2 * Cox ;
7072 taub_dVgs = T2 * Cox_dVg ;
7073 taub_dVds = T2 * Cox_dVd ;
7074 taub_dVbs = T2 * Cox_dVb ;
7075 /* Calculation of Qb */
7076 Qb_prev = *(ckt->CKTstate1 + here->HSM2qb_nqs) ;
7077 T2 = T1 + taub ;
7078 T0 = Qb - Qb_prev ;
7079 Qb_nqs = Qb_prev + T1 / T2 * T0 ;
7080 T3 = T1 / T2 ;
7081 T4 = T0 / T2 ;
7082 Qb_dVgs_nqs = T3 * (Qb_dVgs - T4 * taub_dVgs) ;
7083 Qb_dVds_nqs = T3 * (Qb_dVds - T4 * taub_dVds) ;
7084 Qb_dVbs_nqs = T3 * (Qb_dVbs - T4 * taub_dVbs) ;
7085 }
7086 } else { /* !(CKT_mode & MODETRAN) */
7087 Qi_nqs = Qi ;
7088 Qi_dVgs_nqs = Qi_dVgs ;
7089 Qi_dVds_nqs = Qi_dVds ;
7090 Qi_dVbs_nqs = Qi_dVbs ;
7091
7092 Qb_nqs = Qb ;
7093 Qb_dVgs_nqs = Qb_dVgs ;
7094 Qb_dVds_nqs = Qb_dVds ;
7095 Qb_dVbs_nqs = Qb_dVbs ;
7096 }
7097 }
7098
7099 if ( flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG)) ) { /* ACNQS */
7100
7101 if (flg_noqi == 0) {
7102 T10 = model->HSM2_dly1 ;
7103 T11 = model->HSM2_dly2 ;
7104 T12 = Lch ;
7105
7106 T1 = T10 * T11 * T12 * T12 ;
7107 T2 = Mu * VgVt * T10 + T11 * T12 * T12 + small ;
7108 tau = T1 / T2 ;
7109
7110 T1_dVg = T10 * T11 * 2.0 * T12 * Lch_dVgs ;
7111 T1_dVd = T10 * T11 * 2.0 * T12 * Lch_dVds ;
7112 T1_dVb = T10 * T11 * 2.0 * T12 * Lch_dVbs ;
7113 T2_dVg = T10 * Mu_dVgs * VgVt + T10 * Mu * VgVt_dVgs
7114 + T11 * 2.0 * T12 * Lch_dVgs ;
7115 T2_dVd = T10 * Mu_dVds * VgVt + T10 * Mu * VgVt_dVds
7116 + T11 * 2.0 * T12 * Lch_dVds ;
7117 T2_dVb = T10 * Mu_dVbs * VgVt + T10 * Mu * VgVt_dVbs
7118 + T11 * 2.0 * T12 * Lch_dVbs ;
7119
7120 T3 = 1.0 / T2 ;
7121 tau_dVgs = (T1_dVg - tau * T2_dVg) * T3 ;
7122 tau_dVds = (T1_dVd - tau * T2_dVd) * T3 ;
7123 tau_dVbs = (T1_dVb - tau * T2_dVb) * T3 ;
7124 } else {
7125 tau = model->HSM2_dly1 + small ;
7126 tau_dVgs = tau_dVds = tau_dVbs = 0.0 ;
7127 }
7128
7129 T1 = modelMKS->HSM2_dly3 ;
7130 taub = T1 * Cox ;
7131 taub_dVgs = T1 * Cox_dVg ;
7132 taub_dVds = T1 * Cox_dVd ;
7133 taub_dVbs = T1 * Cox_dVb ;
7134 }
7135
7136 /*-----------------------------------------------------------*
7137 * End of PART-5. (label)
7138 *-----------------*/
7139 /* end_of_part_5: */
7140
7141 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7142 * PART-6: Noise Calculation.
7143 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
7144
7145 /*-----------------------------------------------------------*
7146 * 1/f noise.
7147 *-----------------*/
7148 if ( model->HSM2_coflick != 0 && !flg_noqi ) {
7149
7150 NFalp = pParam->HSM2_nfalp ;
7151 NFtrp = pParam->HSM2_nftrp ;
7152 Cit = modelMKS->HSM2_cit ;
7153
7154 T1 = Qn0 / C_QE ;
7155 T2 = ( Cox + Qn0 / ( Ps0 - Vbs ) + Cit ) * beta_inv / C_QE ;
7156 T3 = -2.0E0 * Qi_noi / C_QE / Lch / here->HSM2_weff_nf - T1 ;
7157 if ( T3 != T1 ) {
7158 T4 = 1.0E0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0E0 * NFalp * Ey * Mu / ( T3 - T1 )
7159 * log( ( T3 + T2 ) / ( T1 + T2 ) ) + NFalp * Ey * Mu * NFalp * Ey * Mu ;
7160 } else {
7161 T4 = 1.0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0 * NFalp * Ey * Mu / ( T1 + T2 )
7162 + NFalp * Ey * Mu * NFalp * Ey * Mu;
7163 }
7164 Nflic = Ids * Ids * NFtrp / ( Lch * beta * here->HSM2_weff_nf ) * T4 ;
7165 } else {
7166 Nflic = 0.0 ;
7167 }
7168
7169 /*-----------------------------------------------------------*
7170 * thermal noise.
7171 *-----------------*/
7172 if ( model->HSM2_cothrml != 0 && !flg_noqi ) {
7173
7174 Eyd = ( Psdl - Ps0 ) / Lch ;
7175 T12 = Muun * Eyd / C_vmax ;
7176 /* note: model->HSM2_bb = 2 (electron) ;1 (hole) */
7177 if ( 1.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 1.0e0 + epsm10 ) {
7178 T7 = 1.0e0 ;
7179 } else if ( 2.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 2.0e0 + epsm10 ) {
7180 T7 = T12 ;
7181 } else {
7182 T7 = Fn_Pow( Eyd, model->HSM2_bb - 1.0e0 ) ;
7183 }
7184 T8 = T12 * T7 ;
7185 T9 = 1.0e0 + T8 ;
7186 T10 = Fn_Pow( T9, ( - 1.0e0 / model->HSM2_bb - 1.0e0 ) ) ;
7187 T11 = T9 * T10 ;
7188 Mud_hoso = Muun * T11 ;
7189 Mu_Ave = ( Mu + Mud_hoso ) / 2.0 ;
7190
7191 /* Sid_h = GAMMA * 4.0 * C_KB * model->HSM2_temp * gds0_h2; */
7192 T0 = Alpha * Alpha ;
7193 Nthrml = here->HSM2_weff_nf * Cox * VgVt * Mu
7194 * ( ( 1e0 + 3e0 * Alpha + 6e0 * T0 ) * Mud_hoso * Mud_hoso
7195 + ( 3e0 + 4e0 * Alpha + 3e0 * T0 ) * Mud_hoso * Mu
7196 + ( 6e0 + 3e0 * Alpha + T0 ) * Mu * Mu )
7197 / ( 15e0 * Lch * ( 1e0 + Alpha ) * Mu_Ave * Mu_Ave ) ;
7198 } else {
7199 Nthrml = 0e0 ;
7200 }
7201
7202
7203 /*----------------------------------------------------------*
7204 * induced gate noise. ( Part 2/3 )
7205 *----------------------*/
7206 if ( model->HSM2_coign != 0 && model->HSM2_cothrml != 0 && flg_ign == 1 && !flg_noqi ) {
7207 sqrtkusaiL = sqrt( kusaiL ) ;
7208 T2 = VgVt + sqrtkusaiL ;
7209 T3 = kusai00 * kusai00 ;
7210 T4 = kusaiL * kusaiL ;
7211 T5 = 42.0e0 * kusai00 * kusaiL ;
7212 T5 += 4.0e0 * ( T3 + T4 ) ;
7213 T5 += 20.0e0 * sqrtkusaiL * VgVt * ( kusai00 + kusaiL ) ;
7214 T10 = T2 * T2 ;
7215 T10 *= T10 ;
7216 kusai_ig = T5 / ( T10 * T2 ) ; /* Induced Gate Noise parameter */
7217 gds0_ign = here->HSM2_weff_nf / Lch * Mu * Cox ;
7218 gds0_h2 = gds0_ign * VgVt ;
7219 GAMMA = Nthrml / gds0_h2 ;
7220 T7 = kusai00 + 4.0e0 * VgVt * sqrtkusaiL + kusaiL ;
7221 /* cross-correlation coefficient (= Sigid/sqrt(Sig*Sid) ) */
7222 crl_f = c_sqrt_15 * kusai00L * T7
7223 / ( 6.0e0 * T2 * sqrt( GAMMA * T2 * VgVt * T5 ) ) ;
7224 }
7225
7226
7227 /*-----------------------------------------------------------*
7228 * End of PART-6. (label)
7229 *-----------------*/
7230 /* end_of_part_6: */
7231
7232
7233 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7234 * PART-7: Evaluation of outputs.
7235 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
7236
7237 /*-----------------------------------------------------------*
7238 * Implicit quantities related to Alpha.
7239 *-----------------*/
7240 /* note: T1 = 1 + Delta */
7241 if ( flg_noqi == 0 && VgVt > VgVt_small ) {
7242 Delta = fac1 * beta / ( 2 * Xi0p12 ) ;
7243 Pslsat = VgVt / ( 1.0 + Delta ) + Ps0 ;
7244 } else {
7245 Pslsat = 0.0 ;
7246 }
7247 Vdsat = Pslsat - Pb2 ;
7248 if ( Vdsat < 0.0 ) {
7249 Vdsat = 0.0 ;
7250 }
7251
7252 /*-----------------------------------------------------------*
7253 * Evaluate the derivatives w.r.t. external biases.
7254 * - All derivatives that influence outputs must be modified here.
7255 *-----------------*/
7256
7257 /*---------------------------------------------------*
7258 * Case ignoring Rs/Rd.
7259 *-----------------*/
7260 if ( flg_rsrd != 1 || Ids < 0.0 ) {
7261 Ids_dVbse = Ids_dVbs ; Ids_dVdse = Ids_dVds ; Ids_dVgse = Ids_dVgs ;
7262 Qb_dVbse = Qb_dVbs ; Qb_dVdse = Qb_dVds ; Qb_dVgse = Qb_dVgs ;
7263 Qi_dVbse = Qi_dVbs ; Qi_dVdse = Qi_dVds ; Qi_dVgse = Qi_dVgs ;
7264 Qd_dVbse = Qd_dVbs ; Qd_dVdse = Qd_dVds ; Qd_dVgse = Qd_dVgs ;
7265 Isub_dVbse = Isub_dVbs ; Isub_dVdse = Isub_dVds ; Isub_dVgse = Isub_dVgs ;
7266 IdsIBPC_dVbse = IdsIBPC_dVbs ; IdsIBPC_dVdse = IdsIBPC_dVds ; IdsIBPC_dVgse = IdsIBPC_dVgs ;
7267 Igate_dVbse = Igate_dVbs ; Igate_dVdse = Igate_dVds ; Igate_dVgse = Igate_dVgs ;
7268 Igd_dVbse = Igd_dVbs ; Igd_dVdse = Igd_dVds ; Igd_dVgse = Igd_dVgs ;
7269 Igs_dVbse = Igs_dVbs ; Igs_dVdse = Igs_dVds ; Igs_dVgse = Igs_dVgs ;
7270 Igb_dVbse = Igb_dVbs ; Igb_dVdse = Igb_dVds ; Igb_dVgse = Igb_dVgs ;
7271 Igidl_dVbse = Igidl_dVbs ; Igidl_dVdse = Igidl_dVds ; Igidl_dVgse = Igidl_dVgs ;
7272 Igisl_dVbse = Igisl_dVbs ; Igisl_dVdse = Igisl_dVds ; Igisl_dVgse = Igisl_dVgs ;
7273 Qgos_dVbse = Qgos_dVbs ; Qgos_dVdse = Qgos_dVds ; Qgos_dVgse = Qgos_dVgs ;
7274 Qgod_dVbse = Qgod_dVbs ; Qgod_dVdse = Qgod_dVds ; Qgod_dVgse = Qgod_dVgs ;
7275 Qgbo_dVbse = Qgbo_dVbs ; Qgbo_dVdse = Qgbo_dVds ; Qgbo_dVgse = Qgbo_dVgs ;
7276 Qovd_dVbse = Qovd_dVbs ; Qovd_dVdse = Qovd_dVds ; Qovd_dVgse = Qovd_dVgs ;
7277 QidLD_dVbse = QidLD_dVbs ; QidLD_dVdse = QidLD_dVds ; QidLD_dVgse = QidLD_dVgs ;
7278 QbdLD_dVbse = QbdLD_dVbs ; QbdLD_dVdse = QbdLD_dVds ; QbdLD_dVgse = QbdLD_dVgs ;
7279 Qovs_dVbse = Qovs_dVbs ; Qovs_dVdse = Qovs_dVds ; Qovs_dVgse = Qovs_dVgs ;
7280 QisLD_dVbse = QisLD_dVbs ; QisLD_dVdse = QisLD_dVds ; QisLD_dVgse = QisLD_dVgs ;
7281 QbsLD_dVbse = QbsLD_dVbs ; QbsLD_dVdse = QbsLD_dVds ; QbsLD_dVgse = QbsLD_dVgs ;
7282 Qy_dVbse = Qy_dVbs ; Qy_dVdse = Qy_dVds ; Qy_dVgse = Qy_dVgs ;
7283 Qdrat_dVbse = Qdrat_dVbs; Qdrat_dVdse = Qdrat_dVds; Qdrat_dVgse = Qdrat_dVgs;
7284 GLPART1_dVbse = GLPART1_dVbs ;GLPART1_dVdse = GLPART1_dVds ;GLPART1_dVgse = GLPART1_dVgs ;
7285
7286 if (flg_nqs) { /* NQS */
7287 Qi_dVgse_nqs = Qi_dVgs_nqs; Qi_dVdse_nqs = Qi_dVds_nqs; Qi_dVbse_nqs = Qi_dVbs_nqs;
7288 Qb_dVgse_nqs = Qb_dVgs_nqs; Qb_dVdse_nqs = Qb_dVds_nqs; Qb_dVbse_nqs = Qb_dVbs_nqs;
7289 }
7290 if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) { /* ACNQS */
7291 tau_dVgse = tau_dVgs ; tau_dVdse = tau_dVds ; tau_dVbse = tau_dVbs ;
7292 taub_dVgse = taub_dVgs ; taub_dVdse = taub_dVds ; taub_dVbse = taub_dVbs ;
7293 }
7294
7295 } else {
7296 /*---------------------------------------------------*
7297 * Case Rs>0 or Rd>0
7298 *-----------------*/
7299
7300 /*-------------------------------------------*
7301 * Conductances w.r.t. confined biases.
7302 *-----------------*/
7303 Ids_dVbse = Ids_dVbs * DJI ;
7304 Ids_dVdse = Ids_dVds * DJI ;
7305 Ids_dVgse = Ids_dVgs * DJI ;
7306
7307 /*-------------------------------------------*
7308 * Derivatives of internal biases w.r.t. external biases.
7309 *-----------------*/
7310 Vbs_dVbse = ( 1.0 - Rs * Ids_dVbse ) ;
7311 Vbs_dVdse = - Rs * Ids_dVdse ;
7312 Vbs_dVgse = - Rs * Ids_dVgse ;
7313
7314 Vds_dVbse = - ( Rs + Rd ) * Ids_dVbse ;
7315 Vds_dVdse = ( 1.0 - ( Rs + Rd ) * Ids_dVdse ) ;
7316 Vds_dVgse = - ( Rs + Rd ) * Ids_dVgse ;
7317
7318 Vgs_dVbse = - Rs * Ids_dVbse ;
7319 Vgs_dVdse = - Rs * Ids_dVdse ;
7320 Vgs_dVgse = ( 1.0 - Rs * Ids_dVgse ) ;
7321
7322 /*-------------------------------------------*
7323 * Derivatives of charges.
7324 *-----------------*/
7325 Qb_dVbse = Qb_dVbs * Vbs_dVbse + Qb_dVds * Vds_dVbse + Qb_dVgs * Vgs_dVbse ;
7326 Qb_dVdse = Qb_dVbs * Vbs_dVdse + Qb_dVds * Vds_dVdse + Qb_dVgs * Vgs_dVdse ;
7327 Qb_dVgse = Qb_dVbs * Vbs_dVgse + Qb_dVds * Vds_dVgse + Qb_dVgs * Vgs_dVgse ;
7328 Qi_dVbse = Qi_dVbs * Vbs_dVbse + Qi_dVds * Vds_dVbse + Qi_dVgs * Vgs_dVbse ;
7329 Qi_dVdse = Qi_dVbs * Vbs_dVdse + Qi_dVds * Vds_dVdse + Qi_dVgs * Vgs_dVdse ;
7330 Qi_dVgse = Qi_dVbs * Vbs_dVgse + Qi_dVds * Vds_dVgse + Qi_dVgs * Vgs_dVgse ;
7331 Qd_dVbse = Qd_dVbs * Vbs_dVbse + Qd_dVds * Vds_dVbse + Qd_dVgs * Vgs_dVbse ;
7332 Qd_dVdse = Qd_dVbs * Vbs_dVdse + Qd_dVds * Vds_dVdse + Qd_dVgs * Vgs_dVdse ;
7333 Qd_dVgse = Qd_dVbs * Vbs_dVgse + Qd_dVds * Vds_dVgse + Qd_dVgs * Vgs_dVgse ;
7334
7335 /*-------------------------------------------*
7336 * Substrate/gate/leak conductances.
7337 *-----------------*/
7338 Isub_dVbse = Isub_dVbs * Vbs_dVbse + Isub_dVds * Vds_dVbse + Isub_dVgs * Vgs_dVbse ;
7339 Isub_dVdse = Isub_dVbs * Vbs_dVdse + Isub_dVds * Vds_dVdse + Isub_dVgs * Vgs_dVdse ;
7340 Isub_dVgse = Isub_dVbs * Vbs_dVgse + Isub_dVds * Vds_dVgse + Isub_dVgs * Vgs_dVgse ;
7341 IdsIBPC_dVbse = IdsIBPC_dVbs * Vbs_dVbse + IdsIBPC_dVds * Vds_dVbse + IdsIBPC_dVgs * Vgs_dVbse ;
7342 IdsIBPC_dVdse = IdsIBPC_dVbs * Vbs_dVdse + IdsIBPC_dVds * Vds_dVdse + IdsIBPC_dVgs * Vgs_dVdse ;
7343 IdsIBPC_dVgse = IdsIBPC_dVbs * Vbs_dVgse + IdsIBPC_dVds * Vds_dVgse + IdsIBPC_dVgs * Vgs_dVgse ;
7344 Igate_dVbse = Igate_dVbs * Vbs_dVbse + Igate_dVds * Vds_dVbse + Igate_dVgs * Vgs_dVbse ;
7345 Igate_dVdse = Igate_dVbs * Vbs_dVdse + Igate_dVds * Vds_dVdse + Igate_dVgs * Vgs_dVdse ;
7346 Igate_dVgse = Igate_dVbs * Vbs_dVgse + Igate_dVds * Vds_dVgse + Igate_dVgs * Vgs_dVgse ;
7347 Igb_dVbse = Igb_dVbs * Vbs_dVbse + Igb_dVds * Vds_dVbse + Igb_dVgs * Vgs_dVbse ;
7348 Igb_dVdse = Igb_dVbs * Vbs_dVdse + Igb_dVds * Vds_dVdse + Igb_dVgs * Vgs_dVdse ;
7349 Igb_dVgse = Igb_dVbs * Vbs_dVgse + Igb_dVds * Vds_dVgse + Igb_dVgs * Vgs_dVgse ;
7350 Igd_dVbse = Igd_dVbs * Vbs_dVbse + Igd_dVds * Vds_dVbse + Igd_dVgs * Vgs_dVbse ;
7351 Igd_dVdse = Igd_dVbs * Vbs_dVdse + Igd_dVds * Vds_dVdse + Igd_dVgs * Vgs_dVdse ;
7352 Igd_dVgse = Igd_dVbs * Vbs_dVgse + Igd_dVds * Vds_dVgse + Igd_dVgs * Vgs_dVgse ;
7353 Igs_dVbse = Igs_dVbs * Vbs_dVbse + Igs_dVds * Vds_dVbse + Igs_dVgs * Vgs_dVbse ;
7354 Igs_dVdse = Igs_dVbs * Vbs_dVdse + Igs_dVds * Vds_dVdse + Igs_dVgs * Vgs_dVdse ;
7355 Igs_dVgse = Igs_dVbs * Vbs_dVgse + Igs_dVds * Vds_dVgse + Igs_dVgs * Vgs_dVgse ;
7356 Igidl_dVbse = Igidl_dVbs * Vbs_dVbse + Igidl_dVds * Vds_dVbse + Igidl_dVgs * Vgs_dVbse ;
7357 Igidl_dVdse = Igidl_dVbs * Vbs_dVdse + Igidl_dVds * Vds_dVdse + Igidl_dVgs * Vgs_dVdse ;
7358 Igidl_dVgse = Igidl_dVbs * Vbs_dVgse + Igidl_dVds * Vds_dVgse + Igidl_dVgs * Vgs_dVgse ;
7359 Igisl_dVbse = Igisl_dVbs * Vbs_dVbse + Igisl_dVds * Vds_dVbse + Igisl_dVgs * Vgs_dVbse ;
7360 Igisl_dVdse = Igisl_dVbs * Vbs_dVdse + Igisl_dVds * Vds_dVdse + Igisl_dVgs * Vgs_dVdse ;
7361 Igisl_dVgse = Igisl_dVbs * Vbs_dVgse + Igisl_dVds * Vds_dVgse + Igisl_dVgs * Vgs_dVgse ;
7362
7363 GLPART1_dVbse = GLPART1_dVbs * Vbs_dVbse + GLPART1_dVds * Vds_dVbse + GLPART1_dVgs * Vgs_dVbse ;
7364 GLPART1_dVdse = GLPART1_dVbs * Vbs_dVdse + GLPART1_dVds * Vds_dVdse + GLPART1_dVgs * Vgs_dVdse ;
7365 GLPART1_dVgse = GLPART1_dVbs * Vbs_dVgse + GLPART1_dVds * Vds_dVgse + GLPART1_dVgs * Vgs_dVgse ;
7366
7367 /*---------------------------------------------------*
7368 * Derivatives of overlap charges.
7369 *-----------------*/
7370 Qgos_dVbse = Qgos_dVbs * Vbs_dVbse + Qgos_dVds * Vds_dVbse + Qgos_dVgs * Vgs_dVbse ;
7371 Qgos_dVdse = Qgos_dVbs * Vbs_dVdse + Qgos_dVds * Vds_dVdse + Qgos_dVgs * Vgs_dVdse ;
7372 Qgos_dVgse = Qgos_dVbs * Vbs_dVgse + Qgos_dVds * Vds_dVgse + Qgos_dVgs * Vgs_dVgse ;
7373 Qgod_dVbse = Qgod_dVbs * Vbs_dVbse + Qgod_dVds * Vds_dVbse + Qgod_dVgs * Vgs_dVbse ;
7374 Qgod_dVdse = Qgod_dVbs * Vbs_dVdse + Qgod_dVds * Vds_dVdse + Qgod_dVgs * Vgs_dVdse ;
7375 Qgod_dVgse = Qgod_dVbs * Vbs_dVgse + Qgod_dVds * Vds_dVgse + Qgod_dVgs * Vgs_dVgse ;
7376 Qgbo_dVbse = Qgbo_dVbs * Vbs_dVbse + Qgbo_dVds * Vds_dVbse + Qgbo_dVgs * Vgs_dVbse ;
7377 Qgbo_dVdse = Qgbo_dVbs * Vbs_dVdse + Qgbo_dVds * Vds_dVdse + Qgbo_dVgs * Vgs_dVdse ;
7378 Qgbo_dVgse = Qgbo_dVbs * Vbs_dVgse + Qgbo_dVds * Vds_dVgse + Qgbo_dVgs * Vgs_dVgse ;
7379 Qovd_dVbse = Qovd_dVbs * Vbs_dVbse + Qovd_dVds * Vds_dVbse + Qovd_dVgs * Vgs_dVbse ;
7380 Qovd_dVdse = Qovd_dVbs * Vbs_dVdse + Qovd_dVds * Vds_dVdse + Qovd_dVgs * Vgs_dVdse ;
7381 Qovd_dVgse = Qovd_dVbs * Vbs_dVgse + Qovd_dVds * Vds_dVgse + Qovd_dVgs * Vgs_dVgse ;
7382 QidLD_dVbse = QidLD_dVbs * Vbs_dVbse + QidLD_dVds * Vds_dVbse + QidLD_dVgs * Vgs_dVbse ;
7383 QidLD_dVdse = QidLD_dVbs * Vbs_dVdse + QidLD_dVds * Vds_dVdse + QidLD_dVgs * Vgs_dVdse ;
7384 QidLD_dVgse = QidLD_dVbs * Vbs_dVgse + QidLD_dVds * Vds_dVgse + QidLD_dVgs * Vgs_dVgse ;
7385 QbdLD_dVbse = QbdLD_dVbs * Vbs_dVbse + QbdLD_dVds * Vds_dVbse + QbdLD_dVgs * Vgs_dVbse ;
7386 QbdLD_dVdse = QbdLD_dVbs * Vbs_dVdse + QbdLD_dVds * Vds_dVdse + QbdLD_dVgs * Vgs_dVdse ;
7387 QbdLD_dVgse = QbdLD_dVbs * Vbs_dVgse + QbdLD_dVds * Vds_dVgse + QbdLD_dVgs * Vgs_dVgse ;
7388 Qovs_dVbse = Qovs_dVbs * Vbs_dVbse + Qovs_dVds * Vds_dVbse + Qovs_dVgs * Vgs_dVbse ;
7389 Qovs_dVdse = Qovs_dVbs * Vbs_dVdse + Qovs_dVds * Vds_dVdse + Qovs_dVgs * Vgs_dVdse ;
7390 Qovs_dVgse = Qovs_dVbs * Vbs_dVgse + Qovs_dVds * Vds_dVgse + Qovs_dVgs * Vgs_dVgse ;
7391 QisLD_dVbse = QisLD_dVbs * Vbs_dVbse + QisLD_dVds * Vds_dVbse + QisLD_dVgs * Vgs_dVbse ;
7392 QisLD_dVdse = QisLD_dVbs * Vbs_dVdse + QisLD_dVds * Vds_dVdse + QisLD_dVgs * Vgs_dVdse ;
7393 QisLD_dVgse = QisLD_dVbs * Vbs_dVgse + QisLD_dVds * Vds_dVgse + QisLD_dVgs * Vgs_dVgse ;
7394 QbsLD_dVbse = QbsLD_dVbs * Vbs_dVbse + QbsLD_dVds * Vds_dVbse + QbsLD_dVgs * Vgs_dVbse ;
7395 QbsLD_dVdse = QbsLD_dVbs * Vbs_dVdse + QbsLD_dVds * Vds_dVdse + QbsLD_dVgs * Vgs_dVdse ;
7396 QbsLD_dVgse = QbsLD_dVbs * Vbs_dVgse + QbsLD_dVds * Vds_dVgse + QbsLD_dVgs * Vgs_dVgse ;
7397 Qy_dVbse = Qy_dVbs * Vbs_dVbse + Qy_dVds * Vds_dVbse + Qy_dVgs * Vgs_dVbse ;
7398 Qy_dVdse = Qy_dVbs * Vbs_dVdse + Qy_dVds * Vds_dVdse + Qy_dVgs * Vgs_dVdse ;
7399 Qy_dVgse = Qy_dVbs * Vbs_dVgse + Qy_dVds * Vds_dVgse + Qy_dVgs * Vgs_dVgse ;
7400 Qdrat_dVbse = Qdrat_dVbs * Vbs_dVbse + Qdrat_dVds * Vds_dVbse + Qdrat_dVgs * Vgs_dVbse ;
7401 Qdrat_dVdse = Qdrat_dVbs * Vbs_dVdse + Qdrat_dVds * Vds_dVdse + Qdrat_dVgs * Vgs_dVdse ;
7402 Qdrat_dVgse = Qdrat_dVbs * Vbs_dVgse + Qdrat_dVds * Vds_dVgse + Qdrat_dVgs * Vgs_dVgse ;
7403
7404 if (flg_nqs) { /* NQS */
7405 Qi_dVgse_nqs = Qi_dVgs_nqs * Vgs_dVgse + Qi_dVds_nqs * Vds_dVgse + Qi_dVbs_nqs * Vbs_dVgse;
7406 Qi_dVdse_nqs = Qi_dVgs_nqs * Vgs_dVdse + Qi_dVds_nqs * Vds_dVdse + Qi_dVbs_nqs * Vbs_dVdse;
7407 Qi_dVbse_nqs = Qi_dVgs_nqs * Vgs_dVbse + Qi_dVds_nqs * Vds_dVbse + Qi_dVbs_nqs * Vbs_dVbse;
7408 Qb_dVgse_nqs = Qb_dVgs_nqs * Vgs_dVgse + Qb_dVds_nqs * Vds_dVgse + Qb_dVbs_nqs * Vbs_dVgse;
7409 Qb_dVdse_nqs = Qb_dVgs_nqs * Vgs_dVdse + Qb_dVds_nqs * Vds_dVdse + Qb_dVbs_nqs * Vbs_dVdse;
7410 Qb_dVbse_nqs = Qb_dVgs_nqs * Vgs_dVbse + Qb_dVds_nqs * Vds_dVbse + Qb_dVbs_nqs * Vbs_dVbse;
7411 }
7412 if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) { /* ACNQS */
7413 tau_dVgse = tau_dVgs * Vgs_dVgse + tau_dVds * Vds_dVgse + tau_dVbs * Vbs_dVgse;
7414 tau_dVdse = tau_dVgs * Vgs_dVdse + tau_dVds * Vds_dVdse + tau_dVbs * Vbs_dVdse;
7415 tau_dVbse = tau_dVgs * Vgs_dVbse + tau_dVds * Vds_dVbse + tau_dVbs * Vbs_dVbse;
7416 taub_dVgse = taub_dVgs * Vgs_dVgse + taub_dVds * Vds_dVgse + taub_dVbs * Vbs_dVgse;
7417 taub_dVdse = taub_dVgs * Vgs_dVdse + taub_dVds * Vds_dVdse + taub_dVbs * Vbs_dVdse;
7418 taub_dVbse = taub_dVgs * Vgs_dVbse + taub_dVds * Vds_dVbse + taub_dVbs * Vbs_dVbse;
7419 }
7420 } /* end of if ( flg_rsrd == 0 ) blocks */
7421
7422 /*-------------------------------------------*
7423 * Add IdsIBPC to Ids.
7424 *-----------------*/
7425 Ids += IdsIBPC ;
7426 Ids_dVbse += IdsIBPC_dVbse ;
7427 Ids_dVdse += IdsIBPC_dVdse ;
7428 Ids_dVgse += IdsIBPC_dVgse ;
7429
7430 /*---------------------------------------------------*
7431 * Derivatives of junction diode currents and charges.
7432 * - NOTE: These quantities are regarded as functions of
7433 * external biases.
7434 * - NOTE: node-base S/D
7435 *-----------------*/
7436 Gbse = Gbs ;
7437 Gbde = Gbd ;
7438 Capbse = Capbs ;
7439 Capbde = Capbd ;
7440
7441 /*---------------------------------------------------*
7442 * Extrapolate quantities if external biases are out of bounds.
7443 *-----------------*/
7444 if ( flg_vbsc == 1 ) {
7445 Ids_dVbse *= Vbsc_dVbse ;
7446 Qb_dVbse *= Vbsc_dVbse ;
7447 Qi_dVbse *= Vbsc_dVbse ;
7448 Qd_dVbse *= Vbsc_dVbse ;
7449 Isub_dVbse *= Vbsc_dVbse ;
7450 Igate_dVbse *= Vbsc_dVbse ;
7451 Igs_dVbse *= Vbsc_dVbse ;
7452 Igd_dVbse *= Vbsc_dVbse ;
7453 Igb_dVbse *= Vbsc_dVbse ;
7454 Igidl_dVbse *= Vbsc_dVbse ;
7455 Igisl_dVbse *= Vbsc_dVbse ;
7456 Qgos_dVbse *= Vbsc_dVbse ;
7457 Qgod_dVbse *= Vbsc_dVbse ;
7458 Qgbo_dVbse *= Vbsc_dVbse ;
7459 Qy_dVbse *= Vbsc_dVbse ;
7460 if (flg_nqs) {
7461 Qi_dVbse_nqs *= Vbsc_dVbse ;
7462 Qb_dVbse_nqs *= Vbsc_dVbse ;
7463 }
7464 if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) { /* ACNQS */
7465 tau_dVbse *= Vbsc_dVbse ;
7466 taub_dVbse *= Vbsc_dVbse ;
7467 }
7468 } else if ( flg_vbsc == -1 ) {
7469 T1 = Vbse - Vbsc ;
7470
7471 TX = Ids + T1 * Ids_dVbse ;
7472 if ( TX * Ids >= 0.0 ) {
7473 Ids = TX ;
7474 } else {
7475 Ids_dVbse = 0.0 ;
7476 Ids_dVdse = 0.0 ;
7477 Ids_dVgse = 0.0 ;
7478 Ids = 0.0 ;
7479 }
7480
7481 TX = Qb + T1 * Qb_dVbse ;
7482 /*note: The sign of Qb can be changed.*/
7483 Qb = TX ;
7484
7485 TX = Qd + T1 * Qd_dVbse ;
7486 if ( TX * Qd >= 0.0 ) {
7487 Qd = TX ;
7488 } else {
7489 Qd_dVbse = 0.0 ;
7490 Qd_dVdse = 0.0 ;
7491 Qd_dVgse = 0.0 ;
7492 Qd = 0.0 ;
7493 }
7494
7495 TX = Qi + T1 * Qi_dVbse ;
7496 if ( TX * Qi >= 0.0 ) {
7497 Qi = TX ;
7498 } else {
7499 Qi_dVbse = 0.0 ;
7500 Qi_dVdse = 0.0 ;
7501 Qi_dVgse = 0.0 ;
7502 Qi = 0.0 ;
7503 }
7504
7505 TX = Isub + T1 * Isub_dVbse ;
7506 if ( TX * Isub >= 0.0 ) {
7507 Isub = TX ;
7508 } else {
7509 Isub_dVbse = 0.0 ;
7510 Isub_dVdse = 0.0 ;
7511 Isub_dVgse = 0.0 ;
7512 Isub = 0.0 ;
7513 }
7514
7515 TX = Igate + T1 * Igate_dVbse ;
7516 if ( TX * Igate >= 0.0 ) {
7517 Igate = TX ;
7518 } else {
7519 Igate_dVbse = 0.0 ;
7520 Igate_dVdse = 0.0 ;
7521 Igate_dVgse = 0.0 ;
7522 Igate = 0.0 ;
7523 }
7524
7525 TX = Igs + T1 * Igs_dVbse ;
7526 if ( TX * Igs >= 0.0 ) {
7527 Igs = TX ;
7528 } else {
7529 Igs_dVbse = 0.0 ;
7530 Igs_dVdse = 0.0 ;
7531 Igs_dVgse = 0.0 ;
7532 Igs = 0.0 ;
7533 }
7534
7535 TX = Igd + T1 * Igd_dVbse ;
7536 if ( TX * Igd >= 0.0 ) {
7537 Igd = TX ;
7538 } else {
7539 Igd_dVbse = 0.0 ;
7540 Igd_dVdse = 0.0 ;
7541 Igd_dVgse = 0.0 ;
7542 Igd = 0.0 ;
7543 }
7544
7545 TX = Igb + T1 * Igb_dVbse ;
7546 if ( TX * Igb >= 0.0 ) {
7547 Igb = TX ;
7548 } else {
7549 Igb_dVbse = 0.0 ;
7550 Igb_dVdse = 0.0 ;
7551 Igb_dVgse = 0.0 ;
7552 Igb = 0.0 ;
7553 }
7554
7555 TX = Igidl + T1 * Igidl_dVbse ;
7556 if ( TX * Igidl >= 0.0 ) {
7557 Igidl = TX ;
7558 } else {
7559 Igidl_dVbse = 0.0 ;
7560 Igidl_dVdse = 0.0 ;
7561 Igidl_dVgse = 0.0 ;
7562 Igidl = 0.0 ;
7563 }
7564
7565 TX = Igisl + T1 * Igisl_dVbse ;
7566 if ( TX * Igisl >= 0.0 ) {
7567 Igisl = TX ;
7568 } else {
7569 Igisl_dVbse = 0.0 ;
7570 Igisl_dVdse = 0.0 ;
7571 Igisl_dVgse = 0.0 ;
7572 Igisl = 0.0 ;
7573 }
7574
7575 TX = GLPART1 + T1 * GLPART1_dVbse ;
7576 if ( TX * GLPART1 >= 0.0 ) {
7577 GLPART1 = TX ;
7578 } else{
7579 GLPART1_dVbse = 0.0 ;
7580 GLPART1_dVdse = 0.0 ;
7581 GLPART1_dVgse = 0.0 ;
7582 GLPART1 = 0.0 ;
7583 }
7584
7585 TX = Qgod + T1 * Qgod_dVbse ;
7586 if ( TX * Qgod >= 0.0 ) {
7587 Qgod = TX ;
7588 } else {
7589 Qgod_dVbse = 0.0 ;
7590 Qgod_dVdse = 0.0 ;
7591 Qgod_dVgse = 0.0 ;
7592 Qgod = 0.0 ;
7593 }
7594
7595 TX = Qgos + T1 * Qgos_dVbse ;
7596 if ( TX * Qgos >= 0.0 ) {
7597 Qgos = TX ;
7598 } else {
7599 Qgos_dVbse = 0.0 ;
7600 Qgos_dVdse = 0.0 ;
7601 Qgos_dVgse = 0.0 ;
7602 Qgos = 0.0 ;
7603 }
7604
7605 TX = Qgbo + T1 * Qgbo_dVbse ;
7606 if ( TX * Qgbo >= 0.0 ) {
7607 Qgbo = TX ;
7608 } else {
7609 Qgbo_dVbse = 0.0 ;
7610 Qgbo_dVdse = 0.0 ;
7611 Qgbo_dVgse = 0.0 ;
7612 Qgbo = 0.0 ;
7613 }
7614
7615 TX = Qy + T1 * Qy_dVbse ;
7616 if ( TX * Qy >= 0.0 ) {
7617 Qy = TX ;
7618 } else {
7619 Qy_dVbse = 0.0 ;
7620 Qy_dVdse = 0.0 ;
7621 Qy_dVgse = 0.0 ;
7622 Qy = 0.0 ;
7623 }
7624
7625 TX = Qdrat + T1 * Qdrat_dVbse ;
7626 if ( TX * Qdrat >= 0.0 ) {
7627 Qdrat = TX ;
7628 } else{
7629 Qdrat_dVbse = 0.0 ;
7630 Qdrat_dVdse = 0.0 ;
7631 Qdrat_dVgse = 0.0 ;
7632 Qdrat = 0.0 ;
7633 }
7634
7635 TX = Qovd + T1 * Qovd_dVbse ;
7636 if ( TX * Qovd >= 0.0 ) {
7637 Qovd = TX ;
7638 } else{
7639 Qovd_dVbse = 0.0 ;
7640 Qovd_dVdse = 0.0 ;
7641 Qovd_dVgse = 0.0 ;
7642 Qovd = 0.0 ;
7643 }
7644
7645 TX = QidLD + T1 * QidLD_dVbse ;
7646 if ( TX * QidLD >= 0.0 ) {
7647 QidLD = TX ;
7648 } else{
7649 QidLD_dVbse = 0.0 ;
7650 QidLD_dVdse = 0.0 ;
7651 QidLD_dVgse = 0.0 ;
7652 QidLD = 0.0 ;
7653 }
7654
7655 TX = QbdLD + T1 * QbdLD_dVbse ;
7656 if ( TX * QbdLD >= 0.0 ) {
7657 QbdLD = TX ;
7658 } else{
7659 QbdLD_dVbse = 0.0 ;
7660 QbdLD_dVdse = 0.0 ;
7661 QbdLD_dVgse = 0.0 ;
7662 QbdLD = 0.0 ;
7663 }
7664
7665 TX = Qovs + T1 * Qovs_dVbse ;
7666 if ( TX * Qovs >= 0.0 ) {
7667 Qovs = TX ;
7668 } else{
7669 T7 = Qovs / ( Qovs - TX ) ;
7670 Qovs_dVbse *= T7 ;
7671 Qovs_dVdse *= T7 ;
7672 Qovs_dVgse *= T7 ;
7673 Qovs = 0.0 ;
7674 }
7675
7676 TX = QisLD + T1 * QisLD_dVbse ;
7677 if ( TX * QisLD >= 0.0 ) {
7678 QisLD = TX ;
7679 } else{
7680 QisLD_dVbse = 0.0 ;
7681 QisLD_dVdse = 0.0 ;
7682 QisLD_dVgse = 0.0 ;
7683 QisLD = 0.0 ;
7684 }
7685
7686 TX = QbsLD + T1 * QbsLD_dVbse ;
7687 if ( TX * QbsLD >= 0.0 ) {
7688 QbsLD = TX ;
7689 } else{
7690 QbsLD_dVbse = 0.0 ;
7691 QbsLD_dVdse = 0.0 ;
7692 QbsLD_dVgse = 0.0 ;
7693 QbsLD = 0.0 ;
7694 }
7695
7696 if (flg_nqs) { /* for NQS charge */
7697 TX = Qi_nqs + T1 * Qi_dVbse_nqs ;
7698 if ( TX * Qi_nqs >= 0.0 ) {
7699 Qi_nqs = TX ;
7700 } else {
7701 Qi_dVbse_nqs = 0.0 ;
7702 Qi_dVdse_nqs = 0.0 ;
7703 Qi_dVgse_nqs = 0.0 ;
7704 Qi_nqs = 0.0 ;
7705 }
7706
7707 TX = Qb_nqs + T1 * Qb_dVbse_nqs ;
7708 Qb_nqs = TX ;
7709 }
7710
7711 if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) { /* ACNQS */
7712 TX = tau + T1 * tau_dVbse ;
7713 if ( TX * tau >= 0.0 ) {
7714 tau = TX ;
7715 } else {
7716 tau_dVbse = 0.0 ;
7717 tau_dVdse = 0.0 ;
7718 tau_dVgse = 0.0 ;
7719 tau = 0.0 ;
7720 }
7721
7722 TX = taub + T1 * taub_dVbse ;
7723 if ( TX * taub >= 0.0 ) {
7724 taub = TX ;
7725 } else {
7726 taub_dVbse = 0.0 ;
7727 taub_dVdse = 0.0 ;
7728 taub_dVgse = 0.0 ;
7729 taub = 0.0 ;
7730 }
7731 }
7732 }
7733
7734 /*-----------------------------------------------------------*
7735 * Warn negative conductance.
7736 * - T1 ( = d Ids / d Vds ) is the derivative w.r.t. circuit bias.
7737 *-----------------*/
7738 if ( here->HSM2_mode == HiSIM_NORMAL_MODE ) {
7739 T1 = Ids_dVdse ;
7740 } else {
7741 T1 = Ids_dVbse + Ids_dVdse + Ids_dVgse ; /* Ids_dVss * -1 */
7742 }
7743
7744 if ( flg_info >= 1 &&
7745 (Ids_dVbse < 0.0 || T1 < 0.0 || Ids_dVgse < 0.0) ) {
7746 printf( "*** warning(HiSIM): Negative Conductance\n" ) ;
7747 printf( " type = %d mode = %d\n" , model->HSM2_type , here->HSM2_mode ) ;
7748 printf( " Vbse = %12.5e Vdse = %12.5e Vgse = %12.5e\n" ,
7749 Vbse , Vdse , Vgse ) ;
7750 printf( " Ids_dVbse = %12.5e\n" , Ids_dVbse ) ;
7751 printf( " Ids_dVdse = %12.5e\n" , T1 ) ;
7752 printf( " Ids_dVgse = %12.5e\n" , Ids_dVgse ) ;
7753 }
7754
7755 /*-----------------------------------------------------------*
7756 * Redefine overlap charges/capacitances.
7757 *-----------------*/
7758 /*---------------------------------------------------*
7759 * Overlap capacitance.
7760 *-----------------*/
7761 Cggo = Qgos_dVgse + Qgod_dVgse + Qgbo_dVgse ;
7762 Cgdo = Qgos_dVdse + Qgod_dVdse ;
7763 Cgso = - (Qgos_dVbse + Qgod_dVbse + Qgos_dVdse + Qgod_dVdse
7764 + Qgos_dVgse + Qgod_dVgse) ;
7765 Cgbo = Qgos_dVbse + Qgod_dVbse + Qgbo_dVbse ;
7766
7767 /*---------------------------------------------------*
7768 * Add fringing charge/capacitance to overlap.
7769 *-----------------*/
7770 Qgod += Qfd ;
7771 Qgos += Qfs ;
7772
7773 Cggo += 2.0 * Cf ;
7774 Cgdo += - Cf ;
7775 Cgso += - Cf ;
7776 /*-----------------------------------------------------------*
7777 * Assign outputs.
7778 *-----------------*/
7779
7780 /*---------------------------------------------------*
7781 * Multiplication factor of a MOSFET instance.
7782 *-----------------*/
7783 M = here->HSM2_m ;
7784
7785 /*---------------------------------------------------*
7786 * Channel current and conductances.
7787 *-----------------*/
7788 here->HSM2_ids = M * Ids ;
7789 here->HSM2_gmbs = M * Ids_dVbse ;
7790 here->HSM2_gds = M * Ids_dVdse ;
7791 here->HSM2_gm = M * Ids_dVgse ;
7792
7793 /*---------------------------------------------------*
7794 * Overlap capacitances.
7795 *-----------------*/
7796 /* Q_dVsx */
7797 T2 = - ( Qovd_dVbse + Qovd_dVdse + Qovd_dVgse ) ;
7798 T6 = - ( Qovs_dVbse + Qovs_dVdse + Qovs_dVgse ) ;
7799 T5 = - ( QbdLD_dVbse + QbdLD_dVdse + QbdLD_dVgse ) ;
7800 T7 = - ( QbsLD_dVbse + QbsLD_dVdse + QbsLD_dVgse ) ;
7801
7802 here->HSM2_cgdo = M * ( Cgdo - Qovd_dVdse - Qovs_dVdse ) ;
7803 here->HSM2_cgso = M * ( Cgso - T2 - T6 ) ;
7804 here->HSM2_cgbo = M * ( Cgbo - Qovd_dVbse - Qovs_dVbse ) ;
7805
7806 here->HSM2_cdgo = M * ( - Qgod_dVgse - Cf + QbdLD_dVgse ) ;
7807 here->HSM2_cddo = M * ( - Qgod_dVdse + Cf + QbdLD_dVdse ) ;
7808 here->HSM2_cdso = M * ( Qgod_dVbse + Qgod_dVdse + Qgod_dVgse + T5 ) ;
7809
7810 here->HSM2_csgo = M * ( - Qgos_dVgse - Cf + QbsLD_dVgse ) ;
7811 here->HSM2_csdo = M * ( - Qgos_dVdse + QbsLD_dVdse ) ;
7812 here->HSM2_csso = M * ( Qgos_dVbse + Qgos_dVdse + Qgos_dVgse + Cf + T7 ) ;
7813
7814 /*---------------------------------------------------*
7815 * Lateral-field-induced capacitance.
7816 *-----------------*/
7817 T0 = model->HSM2_qyrat ;
7818 T1 = 1.0 - T0 ;
7819 Qys = Qy * T1 ;
7820 Qys_dVdse = Qy_dVdse * T1 ;
7821 Qys_dVgse = Qy_dVgse * T1 ;
7822 Qys_dVbse = Qy_dVbse * T1 ;
7823 Qy = Qy * T0 ;
7824 Qy_dVdse = Qy_dVdse * T0 ;
7825 Qy_dVgse = Qy_dVgse * T0 ;
7826 Qy_dVbse = Qy_dVbse * T0 ;
7827
7828 Cqyd = Qy_dVdse ;
7829 Cqyg = Qy_dVgse ;
7830 Cqyb = Qy_dVbse ;
7831 Cqys = - ( Cqyb + Cqyd + Cqyg ) ;
7832 here->HSM2_cqyd = M * Cqyd ;
7833 here->HSM2_cqyg = M * Cqyg ;
7834 here->HSM2_cqyb = M * Cqyb ;
7835
7836 /* -------------------------------------*
7837 * Intrinsic charges / capacitances.
7838 *-----------------*/
7839 if ( flg_nqs && ((ckt->CKTmode & MODETRAN) ||
7840 (ckt->CKTmode & MODEINITFIX)) ) { /* NQS (tran. analysis) */
7841
7842 *(ckt->CKTstate0 + here->HSM2qi_nqs) = Qi_nqs ;
7843 *(ckt->CKTstate0 + here->HSM2qb_nqs) = Qb_nqs ;
7844
7845 here->HSM2_qg = M * - (Qb_nqs + Qi_nqs) ;
7846 here->HSM2_qd = M * Qi_nqs * Qdrat ;
7847 here->HSM2_qs = M * Qi_nqs * (1.0 - Qdrat) ;
7848
7849 here->HSM2_cbgb = M * Qb_dVgse_nqs ;
7850 here->HSM2_cbdb = M * Qb_dVdse_nqs ;
7851 here->HSM2_cbsb = M * - (Qb_dVbse_nqs + Qb_dVdse_nqs + Qb_dVgse_nqs) ;
7852
7853 here->HSM2_cggb = M * ( - Qb_dVgse_nqs - Qi_dVgse_nqs ) ;
7854 here->HSM2_cgdb = M * ( - Qb_dVdse_nqs - Qi_dVdse_nqs ) ;
7855 here->HSM2_cgsb = M * ( Qb_dVbse_nqs + Qb_dVdse_nqs + Qb_dVgse_nqs
7856 + Qi_dVbse_nqs + Qi_dVdse_nqs + Qi_dVgse_nqs ) ;
7857
7858 qd_dVgse = Qi_dVgse_nqs * Qdrat + Qdrat_dVgse * Qi_nqs ;
7859 qd_dVdse = Qi_dVdse_nqs * Qdrat + Qdrat_dVdse * Qi_nqs ;
7860 qd_dVbse = Qi_dVbse_nqs * Qdrat + Qdrat_dVbse * Qi_nqs ;
7861 qd_dVsse = - ( qd_dVgse + qd_dVdse + qd_dVbse ) ;
7862 here->HSM2_cdgb = M * qd_dVgse ;
7863 here->HSM2_cddb = M * qd_dVdse ;
7864 here->HSM2_cdsb = M * qd_dVsse ;
7865 } else { /* QS or NQS (ac dc analysis) */
7866
7867 here->HSM2_qg = M * - (Qb + Qi) ;
7868 here->HSM2_qd = M * Qd ;
7869 here->HSM2_qs = M * ( Qi - Qd ) ;
7870
7871 here->HSM2_cbgb = M * Qb_dVgse ;
7872 here->HSM2_cbdb = M * Qb_dVdse ;
7873 here->HSM2_cbsb = M * - (Qb_dVbse + Qb_dVdse + Qb_dVgse) ;
7874
7875 here->HSM2_cggb = M * ( - Qb_dVgse - Qi_dVgse ) ;
7876 here->HSM2_cgdb = M * ( - Qb_dVdse - Qi_dVdse ) ;
7877 here->HSM2_cgsb = M * ( Qb_dVbse + Qb_dVdse + Qb_dVgse
7878 + Qi_dVbse + Qi_dVdse + Qi_dVgse ) ;
7879
7880 here->HSM2_cdgb = M * Qd_dVgse ;
7881 here->HSM2_cddb = M * Qd_dVdse ;
7882 here->HSM2_cdsb = M * - (Qd_dVgse + Qd_dVdse + Qd_dVbse) ;
7883 }
7884
7885
7886 /*---------------------------------------------------*
7887 * Add lateral-field-induced charges/capacitances to intrinsic ones.
7888 * - NOTE: This function depends on coqy, a control option.
7889 *-----------------*/
7890 if ( model->HSM2_coqy == 1 ) {
7891 here->HSM2_qg += M * ( Qy + Qys ) ;
7892 here->HSM2_qd += M * ( - Qy ) ;
7893 here->HSM2_qs += M * ( - Qys ) ;
7894
7895 T8 = - ( Qys_dVbse + Qys_dVdse + Qys_dVgse ) ;
7896 here->HSM2_cggb += M * ( Cqyg + Qys_dVgse ) ;
7897 here->HSM2_cgdb += M * ( Cqyd + Qys_dVdse ) ;
7898 here->HSM2_cgsb += M * ( Cqys + T8 ) ;
7899
7900 here->HSM2_cdgb += M * ( - Cqyg ) ;
7901 here->HSM2_cddb += M * ( - Cqyd ) ;
7902 here->HSM2_cdsb += M * ( - Cqys ) ;
7903 }
7904
7905 /*---------------------------------------------------*
7906 * Add S/D overlap charges/capacitances to intrinsic ones.
7907 * - NOTE: This function depends on coadov, a control option.
7908 *-----------------*/
7909 if ( model->HSM2_coadov == 1 ) {
7910 /* Q_dVsb */
7911 T0 = - ( Qgbo_dVbse + Qgbo_dVdse + Qgbo_dVgse ) ;
7912 T1 = - ( Qovd_dVbse + Qovd_dVdse + Qovd_dVgse ) ;
7913 T3 = - ( Qovs_dVbse + Qovs_dVdse + Qovs_dVgse ) ;
7914 T4 = - ( QidLD_dVbse + QidLD_dVdse + QidLD_dVgse + QisLD_dVbse + QisLD_dVdse + QisLD_dVgse ) ;
7915 T5 = - ( QbdLD_dVbse + QbdLD_dVdse + QbdLD_dVgse ) ;
7916 T7 = - ( Qgod_dVbse + Qgod_dVdse + Qgod_dVgse ) ;
7917
7918 here->HSM2_qg += M * ( Qgod + Qgos + Qgbo - Qovd - Qovs ) ;
7919 here->HSM2_qd += M * ( - Qgod + QbdLD ) ;
7920 here->HSM2_qs += M * ( - Qgos + QbsLD ) ;
7921
7922 here->HSM2_cbgb += M * ( - Qgbo_dVgse + QidLD_dVgse + QisLD_dVgse ) ;
7923 here->HSM2_cbdb += M * ( - Qgbo_dVdse + QidLD_dVdse + QisLD_dVdse ) ;
7924 here->HSM2_cbsb += M * ( - T0 + T4 ) ;
7925
7926 here->HSM2_cggb += M * ( Cggo - Qovd_dVgse - Qovs_dVgse ) ;
7927 here->HSM2_cgdb += M * ( Cgdo - Qovd_dVdse - Qovs_dVdse ) ;
7928 here->HSM2_cgsb += M * ( Cgso - T1 - T3 ) ;
7929
7930 here->HSM2_cdgb += M * ( - Qgod_dVgse - Cf + QbdLD_dVgse ) ;
7931 here->HSM2_cddb += M * ( - Qgod_dVdse + Cf + QbdLD_dVdse ) ;
7932 here->HSM2_cdsb += M * ( - T7 + T5 ) ;
7933 }
7934
7935
7936
7937 /*---------------------------------------------------*
7938 * tau (channel/bulk charge) for ACNQS.
7939 *-----------------*/
7940 if (flg_nqs && (ckt->CKTmode & (MODEDCOP | MODEINITSMSIG))) {
7941 here->HSM2_tau = tau ;
7942 here->HSM2_tau_dVgs = tau_dVgse ;
7943 here->HSM2_tau_dVds = tau_dVdse ;
7944 here->HSM2_tau_dVbs = tau_dVbse ;
7945
7946 here->HSM2_taub = taub ;
7947 here->HSM2_taub_dVgs = taub_dVgse ;
7948 here->HSM2_taub_dVds = taub_dVdse ;
7949 here->HSM2_taub_dVbs = taub_dVbse ;
7950
7951 here->HSM2_Xd = Qdrat;
7952 here->HSM2_Xd_dVgs = Qdrat_dVgse ;
7953 here->HSM2_Xd_dVds = Qdrat_dVdse ;
7954 here->HSM2_Xd_dVbs = Qdrat_dVbse ;
7955
7956 here->HSM2_Qb = M * Qb ;
7957 here->HSM2_Qb_dVgs = M * Qb_dVgse ;
7958 here->HSM2_Qb_dVds = M * Qb_dVdse ;
7959 here->HSM2_Qb_dVbs = M * Qb_dVbse ;
7960
7961 here->HSM2_Qi = M * Qi ;
7962 here->HSM2_Qi_dVgs = M * Qi_dVgse ;
7963 here->HSM2_Qi_dVds = M * Qi_dVdse ;
7964 here->HSM2_Qi_dVbs = M * Qi_dVbse ;
7965
7966 }
7967
7968 /*---------------------------------------------------*
7969 * Substrate/gate/leak currents.
7970 *-----------------*/
7971
7972 here->HSM2_isub = M * Isub ;
7973 here->HSM2_gbbs = M * Isub_dVbse ;
7974 here->HSM2_gbds = M * Isub_dVdse ;
7975 here->HSM2_gbgs = M * Isub_dVgse ;
7976
7977 here->HSM2_igb = M * -Igb ;
7978 here->HSM2_gigbb = M * -Igb_dVbse ;
7979 here->HSM2_gigbg = M * -Igb_dVgse ;
7980 if (here->HSM2_mode == HiSIM_NORMAL_MODE) {
7981 here->HSM2_gigbd = M * -Igb_dVdse ;
7982 here->HSM2_gigbs = M * ( Igb_dVbse + Igb_dVdse + Igb_dVgse ) ;
7983 } else {
7984 here->HSM2_gigbd = M * ( Igb_dVbse + Igb_dVdse + Igb_dVgse ) ;
7985 here->HSM2_gigbs = M * -Igb_dVdse ;
7986 }
7987
7988 if (here->HSM2_mode == HiSIM_NORMAL_MODE) {
7989
7990 here->HSM2_igd = M * ( GLPART1 * Igate - Igd ) ;
7991 here->HSM2_gigdb = M * ( GLPART1 * Igate_dVbse + GLPART1_dVbse * Igate - Igd_dVbse ) ;
7992 here->HSM2_gigdd = M * ( GLPART1 * Igate_dVdse + GLPART1_dVdse * Igate - Igd_dVdse ) ;
7993 here->HSM2_gigdg = M * ( GLPART1 * Igate_dVgse + GLPART1_dVgse * Igate - Igd_dVgse ) ;
7994
7995 } else {
7996
7997 T1 = 1.0 - GLPART1 ;
7998 T1_dVb = - GLPART1_dVbse ;
7999 T1_dVd = - GLPART1_dVdse ;
8000 T1_dVg = - GLPART1_dVgse ;
8001 here->HSM2_igd = M * ( T1 * Igate - Igs ) ;
8002 here->HSM2_gigdb = M * ( T1 * Igate_dVbse + T1_dVb * Igate - Igs_dVbse ) ;
8003 here->HSM2_gigdd = M * ( T1 * - ( Igate_dVgse + Igate_dVbse + Igate_dVdse )
8004 + ( - T1_dVb - T1_dVg - T1_dVd ) * Igate + ( Igs_dVgse + Igs_dVbse + Igs_dVdse ) ) ;
8005 here->HSM2_gigdg = M * ( T1 * Igate_dVgse + T1_dVg * Igate - Igs_dVgse ) ;
8006 }
8007 here->HSM2_gigds = -(here->HSM2_gigdb + here->HSM2_gigdd + here->HSM2_gigdg) ;
8008
8009 if (here->HSM2_mode == HiSIM_NORMAL_MODE) {
8010
8011 T1 = 1.0 - GLPART1 ;
8012 T1_dVb = - GLPART1_dVbse ;
8013 T1_dVd = - GLPART1_dVdse ;
8014 T1_dVg = - GLPART1_dVgse ;
8015 here->HSM2_igs = M * ( T1 * Igate - Igs ) ;
8016 here->HSM2_gigsb = M * ( T1 * Igate_dVbse + T1_dVb * Igate - Igs_dVbse ) ;
8017 here->HSM2_gigsd = M * ( T1 * Igate_dVdse + T1_dVd * Igate - Igs_dVdse ) ;
8018 here->HSM2_gigsg = M * ( T1 * Igate_dVgse + T1_dVg * Igate - Igs_dVgse ) ;
8019
8020 } else {
8021
8022 here->HSM2_igs = M * ( GLPART1 * Igate - Igd ) ;
8023 here->HSM2_gigsb = M * ( GLPART1 * Igate_dVbse + GLPART1_dVbse * Igate - Igd_dVbse ) ;
8024 here->HSM2_gigsd = M * ( GLPART1 * -(Igate_dVgse + Igate_dVbse + Igate_dVdse)
8025 - Igate * ( GLPART1_dVbse + GLPART1_dVdse + GLPART1_dVgse ) + (Igs_dVgse + Igs_dVbse + Igs_dVdse) ) ;
8026 here->HSM2_gigsg = M * ( GLPART1 * Igate_dVgse + GLPART1_dVgse * Igate - Igd_dVgse ) ;
8027
8028 }
8029 here->HSM2_gigss = -(here->HSM2_gigsb + here->HSM2_gigsd + here->HSM2_gigsg) ;
8030
8031 here->HSM2_igidl = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igidl : M * Igisl ;
8032 here->HSM2_gigidlbs = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igidl_dVbse : M * Igisl_dVbse ;
8033 here->HSM2_gigidlds = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igidl_dVdse : M * ( - Igisl_dVbse - Igisl_dVdse - Igisl_dVgse ) ;
8034 here->HSM2_gigidlgs = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igidl_dVgse : M * Igisl_dVgse ;
8035
8036 here->HSM2_igisl = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igisl : M * Igidl ;
8037 here->HSM2_gigislbd = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igisl_dVbse : M * Igidl_dVbse ;
8038 here->HSM2_gigislsd = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igisl_dVdse : M * ( - Igidl_dVbse - Igidl_dVdse - Igidl_dVgse ) ;
8039 here->HSM2_gigislgd = (here->HSM2_mode == HiSIM_NORMAL_MODE) ? M * Igisl_dVgse : M * Igidl_dVgse ;
8040
8041 /*---------------------------------------------------*
8042 * Von, Vdsat.
8043 *-----------------*/
8044 here->HSM2_von = Vth ;
8045 here->HSM2_vdsat = Vdsat ;
8046
8047 /*---------------------------------------------------*
8048 * Junction diode.
8049 *-----------------*/
8050 here->HSM2_ibs = M * Ibs ;
8051 here->HSM2_ibd = M * Ibd ;
8052 here->HSM2_gbs = M * Gbse ;
8053 here->HSM2_gbd = M * Gbde ;
8054 *(ckt->CKTstate0 + here->HSM2qbs) = M * Qbs ;
8055 *(ckt->CKTstate0 + here->HSM2qbd) = M * Qbd ;
8056 here->HSM2_capbs = M * Capbse ;
8057 here->HSM2_capbd = M * Capbde ;
8058
8059 /*-----------------------------------------------------------*
8060 * Warn floating-point exceptions.
8061 * - Function finite() in libm is called.
8062 * - Go to start with info==5.
8063 *-----------------*/
8064 T1 = here->HSM2_ids + here->HSM2_gmbs + here->HSM2_gds + here->HSM2_gm ;
8065 T1 = T1 + here->HSM2_qd + here->HSM2_cdsb ;
8066 if ( ! finite (T1) ) {
8067 flg_err = 1 ;
8068 fprintf (stderr ,
8069 "*** warning(HiSIM): FP-exception (PART-1)\n" ) ;
8070 if ( flg_info >= 1 ) {
8071 printf ( "*** warning(HiSIM): FP-exception\n") ;
8072 printf ( "here->HSM2_ids = %12.5e\n" , here->HSM2_ids ) ;
8073 printf ( "here->HSM2_gmbs = %12.5e\n" , here->HSM2_gmbs) ;
8074 printf ( "here->HSM2_gds = %12.5e\n" , here->HSM2_gds ) ;
8075 printf ( "here->HSM2_gm = %12.5e\n" , here->HSM2_gm ) ;
8076 printf ( "here->HSM2_qd = %12.5e\n" , here->HSM2_qd ) ;
8077 printf ( "here->HSM2_cdsb = %12.5e\n" , here->HSM2_cdsb) ;
8078 }
8079 }
8080
8081 T1 = here->HSM2_isub + here->HSM2_gbbs + here->HSM2_gbds + here->HSM2_gbgs ;
8082 if ( ! finite (T1) ) {
8083 flg_err = 1 ;
8084 fprintf (stderr ,
8085 "*** warning(HiSIM): FP-exception (PART-2)\n") ;
8086 if ( flg_info >= 1 ) {
8087 printf ("*** warning(HiSIM): FP-exception\n") ;
8088 }
8089 }
8090
8091 T1 = here->HSM2_cgbo + Cgdo + Cgso + Cggo ;
8092 if ( ! finite (T1) ) {
8093 flg_err = 1 ;
8094 fprintf(stderr ,
8095 "*** warning(HiSIM): FP-exception (PART-3)\n") ;
8096 if ( flg_info >= 1 ) {
8097 printf ("*** warning(HiSIM): FP-exception\n") ;
8098 }
8099 }
8100
8101 T1 = here->HSM2_ibs + here->HSM2_ibd + here->HSM2_gbs + here->HSM2_gbd ;
8102 T1 = T1 + *(ckt->CKTstate0 + here->HSM2qbs) + *(ckt->CKTstate0 + here->HSM2qbd)
8103 + here->HSM2_capbs + here->HSM2_capbd ;
8104 if ( ! finite (T1) ) {
8105 flg_err = 1 ;
8106 fprintf(stderr ,
8107 "*** warning(HiSIM): FP-exception (PART-4)\n") ;
8108 if ( flg_info >= 1 ) {
8109 printf ("*** warning(HiSIM): FP-exception\n") ;
8110 }
8111 }
8112
8113 /*-----------------------------------------------------------*
8114 * Exit for error case.
8115 *-----------------*/
8116 if ( flg_err != 0 ) {
8117 fprintf (stderr , "----- bias information (HiSIM)\n" ) ;
8118 fprintf (stderr , "name: %s\n" , here->HSM2name ) ;
8119 fprintf (stderr , "stetes: %d\n" , here->HSM2states ) ;
8120 fprintf (stderr , "vds= %12.5e vgs=%12.5e vbs=%12.5e\n"
8121 , vds , vgs , vbs ) ;
8122 fprintf (stderr , "vbs_jct= %12.5e vbd_jct= %12.5e\n"
8123 , vbs_jct , vbd_jct ) ;
8124 fprintf (stderr , "vd= %12.5e vg= %12.5e vb= %12.5e vs= %12.5e\n"
8125 , *( ckt->CKTrhsOld + here->HSM2dNodePrime )
8126 , *( ckt->CKTrhsOld + here->HSM2gNodePrime )
8127 , *( ckt->CKTrhsOld + here->HSM2bNodePrime )
8128 , *( ckt->CKTrhsOld + here->HSM2sNodePrime ) ) ;
8129 if ( here->HSM2_called >= 1 ) {
8130 fprintf (stderr , "vdsc_prv= %12.5e vgsc_prv=%12.5e vbsc_prv=%12.5e\n"
8131 , here->HSM2_vdsc_prv , here->HSM2_vgsc_prv
8132 , here->HSM2_vbsc_prv ) ;
8133 }
8134 fprintf (stderr , "----- bias information (end)\n" ) ;
8135 }
8136
8137 if ( flg_err != 0 ) return ( HiSIM_ERROR ) ;
8138
8139 /*-----------------------------------------------------------*
8140 * Noise.
8141 *-----------------*/
8142 here->HSM2_noiflick = M * Nflic ;
8143 here->HSM2_noithrml = M * Nthrml ;
8144
8145 /*----------------------------------------------------------*
8146 * induced gate noise. ( Part 3/3 )
8147 *----------------------*/
8148 if ( model->HSM2_coign != 0 && model->HSM2_cothrml != 0 && flg_ign == 1 && !flg_noqi ) {
8149 T0 = Cox_small * Cox * here->HSM2_weff_nf * Leff ;
8150 T1 = here->HSM2_cgsb / M ;
8151 if( - T1 > T0 ){
8152 Nign0 = c_16o135 * C_QE * beta_inv * T1 * T1 / gds0_ign ;
8153 if ( kusai00L > epsm10 && Vds > epsm10 ) {
8154 MuModA = Muun / Mu ;
8155 MuModB = ( Muun / Mud_hoso - MuModA ) / Vds ;
8156 correct_w1 = MuModA + C_2o3 * MuModB
8157 * ( kusai00 + VgVt * sqrtkusaiL + kusaiL )
8158 / ( VgVt + sqrtkusaiL ) ;
8159 } else {
8160 correct_w1 = Muun / Mud_hoso ;
8161 }
8162 here->HSM2_noiigate = M * Nign0 * kusai_ig * correct_w1 ;
8163 here->HSM2_noicross = crl_f ;
8164 if ( here->HSM2_noiigate < 0.0 ) here->HSM2_noiigate = 0.0e0 ;
8165 }else{
8166 here->HSM2_noiigate = 0.0e0 ;
8167 here->HSM2_noicross = 0.0e0 ;
8168 }
8169 here->HSM2_Qdrat = Qdrat ; /* needed for calculating induced gate noise */
8170 }else{
8171 here->HSM2_noiigate = 0.0e0 ;
8172 here->HSM2_noicross = 0.0e0 ;
8173 }
8174
8175 /*-----------------------------------------------------------*
8176 * Restore values for next calculation.
8177 *-----------------*/
8178
8179 /* Confined biases */
8180 if ( here->HSM2_called >= 1 ) {
8181 here->HSM2_vbsc_prv2 = here->HSM2_vbsc_prv ;
8182 here->HSM2_vdsc_prv2 = here->HSM2_vdsc_prv ;
8183 here->HSM2_vgsc_prv2 = here->HSM2_vgsc_prv ;
8184 here->HSM2_mode_prv2 = here->HSM2_mode_prv ;
8185 }
8186 here->HSM2_vbsc_prv = Vbsc ;
8187 here->HSM2_vdsc_prv = Vdsc ;
8188 here->HSM2_vgsc_prv = Vgsc ;
8189 here->HSM2_mode_prv = here->HSM2_mode ;
8190
8191 /* Surface potentials and derivatives w.r.t. internal biases */
8192 if ( here->HSM2_called >= 1 ) {
8193 here->HSM2_ps0_prv2 = here->HSM2_ps0_prv ;
8194 here->HSM2_ps0_dvbs_prv2 = here->HSM2_ps0_dvbs_prv ;
8195 here->HSM2_ps0_dvds_prv2 = here->HSM2_ps0_dvds_prv ;
8196 here->HSM2_ps0_dvgs_prv2 = here->HSM2_ps0_dvgs_prv ;
8197 here->HSM2_pds_prv2 = here->HSM2_pds_prv ;
8198 here->HSM2_pds_dvbs_prv2 = here->HSM2_pds_dvbs_prv ;
8199 here->HSM2_pds_dvds_prv2 = here->HSM2_pds_dvds_prv ;
8200 here->HSM2_pds_dvgs_prv2 = here->HSM2_pds_dvgs_prv ;
8201 }
8202
8203 here->HSM2_ps0_prv = Ps0 ;
8204 here->HSM2_ps0_dvbs_prv = Ps0_dVbs ;
8205 here->HSM2_ps0_dvds_prv = Ps0_dVds ;
8206 here->HSM2_ps0_dvgs_prv = Ps0_dVgs ;
8207 here->HSM2_pds_prv = Pds ;
8208 here->HSM2_pds_dvbs_prv = Pds_dVbs ;
8209 here->HSM2_pds_dvds_prv = Pds_dVds ;
8210 here->HSM2_pds_dvgs_prv = Pds_dVgs ;
8211
8212 /* Derivatives of channel current w.r.t. internal biases */
8213 here->HSM2_ids_prv = Ids ;
8214 here->HSM2_ids_dvbs_prv = Ids_dVbs ;
8215 here->HSM2_ids_dvds_prv = Ids_dVds ;
8216 here->HSM2_ids_dvgs_prv = Ids_dVgs ;
8217
8218 /* For CORECIP = 1 */
8219 if ( corecip ) {
8220 here->HSM2_PS0Z_SCE_prv = PS0Z_SCE ;
8221 here->HSM2_PS0Z_SCE_dvds_prv = PS0Z_SCE_dVds ;
8222 here->HSM2_PS0Z_SCE_dvgs_prv = PS0Z_SCE_dVgs ;
8223 here->HSM2_PS0Z_SCE_dvbs_prv = PS0Z_SCE_dVbs ;
8224 /* here->HSM2_nnn = NNN ; */
8225 }
8226
8227 /*-----------------------------------------------------------*
8228 * End of PART-7. (label)
8229 *-----------------*/
8230 /* end_of_part_7: */
8231
8232 /*-----------------------------------------------------------*
8233 * Bottom of hsm2eval.
8234 *-----------------*/
8235
8236
8237 return ( HiSIM_OK ) ;
8238
8239 } /* end of hsm2eval */
8240
8241