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