1 /***********************************************************************
2
3 HiSIM (Hiroshima University STARC IGFET Model)
4 Copyright (C) 2014 Hiroshima University & STARC
5
6 MODEL NAME : HiSIM_HV
7 ( VERSION : 2 SUBVERSION : 2 REVISION : 0 )
8 Model Parameter 'VERSION' : 2.20
9 FILE : hsmhveval_rdrift.c
10
11 DATE : 2014.6.11
12
13 released by
14 Hiroshima University &
15 Semiconductor Technology Academic Research Center (STARC)
16 ***********************************************************************/
17
18 /**********************************************************************
19
20 The following source code, and all copyrights, trade secrets or other
21 intellectual property rights in and to the source code in its entirety,
22 is owned by the Hiroshima University and the STARC organization.
23
24 All users need to follow the "HISIM_HV Distribution Statement and
25 Copyright Notice" attached to HiSIM_HV model.
26
27 -----HISIM_HV Distribution Statement and Copyright Notice--------------
28
29 Software is distributed as is, completely without warranty or service
30 support. Hiroshima University or STARC and its employees are not liable
31 for the condition or performance of the software.
32
33 Hiroshima University and STARC own the copyright and grant users a perpetual,
34 irrevocable, worldwide, non-exclusive, royalty-free license with respect
35 to the software as set forth below.
36
37 Hiroshima University and STARC hereby disclaims all implied warranties.
38
39 Hiroshima University and STARC grant the users the right to modify, copy,
40 and redistribute the software and documentation, both within the user's
41 organization and externally, subject to the following restrictions
42
43 1. The users agree not to charge for Hiroshima University and STARC code
44 itself but may charge for additions, extensions, or support.
45
46 2. In any product based on the software, the users agree to acknowledge
47 Hiroshima University and STARC that developed the software. This
48 acknowledgment shall appear in the product documentation.
49
50 3. The users agree to reproduce any copyright notice which appears on
51 the software on any copy or modification of such made available
52 to others."
53
54 Toshimasa Asahara, President, Hiroshima University
55 Mitiko Miura-Mattausch, Professor, Hiroshima University
56 Katsuhiro Shimohigashi, President&CEO, STARC
57 June 2008 (revised October 2011)
58 *************************************************************************/
59
60 /*===========================================================*
61 * Preamble.
62 *=================*/
63 /*---------------------------------------------------*
64 * Header files.
65 *-----------------*/
66 #include "ngspice/ngspice.h"
67 #ifdef __STDC__
68 /* #include <ieeefp.h> */
69 #endif
70
71 /*-----------------------------------*
72 * HiSIM macros
73 *-----------------*/
74 #include "hisimhv2.h"
75 #include "hsmhv2evalenv.h"
76
77 /* local variables used in macro functions */
78 static double TMF0 , TMF1 , TMF2 , TMF3 ;
79
80 /*===========================================================*
81 * pow
82 *=================*/
83 #ifdef POW_TO_EXP_AND_LOG
84 #define Fn_Pow( x , y ) exp( y * log( x ) )
85 #else
86 #define Fn_Pow( x , y ) pow( x , y )
87 #endif
88
89 /*===========================================================*
90 * Macro Functions for ceiling/flooring/symmetrization.
91 *=================*/
92 /*---------------------------------------------------*
93 * smoothUpper: ceiling.
94 * y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) )
95 * arg = xmax - x - delta
96 *-----------------*/
97
98 #define Fn_SU( y , x , xmax , delta , dx ) { \
99 TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
100 TMF2 = 4.0 * ( xmax ) * ( delta) ; \
101 TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
102 TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
103 dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
104 y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
105 }
106
107 #define Fn_SU2( y , x , xmax , delta , dy_dx , dy_dxmax ) { \
108 TMF1 = ( xmax ) - ( x ) - ( delta ) ; \
109 TMF2 = 4.0 * ( xmax ) * ( delta) ; \
110 TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
111 TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
112 dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
113 dy_dxmax = 0.5 * ( 1.0 - ( TMF1 + 2.0 * delta ) / TMF2 ) ; \
114 y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \
115 }
116
117 /*---------------------------------------------------*
118 * smoothLower: flooring.
119 * y = xmin + 0.5 ( arg + sqrt( arg^2 + 4 xmin delta ) )
120 * arg = x - xmin - delta
121 *-----------------*/
122
123 #define Fn_SL( y , x , xmin , delta , dx ) { \
124 TMF1 = ( x ) - ( xmin ) - ( delta ) ; \
125 TMF2 = 4.0 * ( xmin ) * ( delta ) ; \
126 TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
127 TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
128 dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
129 y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \
130 }
131
132 #define Fn_SL2( y , x , xmin , delta , dy_dx, dy_dxmin ) { \
133 TMF1 = ( x ) - ( xmin ) - ( delta ) ; \
134 TMF2 = 4.0 * ( xmin ) * ( delta ) ; \
135 TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \
136 TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \
137 dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \
138 dy_dxmin = 0.5 * ( 1.0 - ( TMF1 - 2.0 * delta ) / TMF2 ) ; \
139 y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \
140 }
141
142 /*---------------------------------------------------*
143 * smoothZero: flooring to zero.
144 * y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) )
145 *-----------------*/
146
147 #define Fn_SZ( y , x , delta , dx ) { \
148 TMF2 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta ) ) ; \
149 dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \
150 y = 0.5 * ( ( x ) + TMF2 ) ; \
151 if( y < 0.0 ) { y=0.0; dx=0.0; } \
152 }
153
154 /*---------------------------------------------------*
155 * SymAdd: evaluate additional term for symmetry.
156 *-----------------*/
157
158 #define Fn_SymAdd( y , x , add0 , dx ) \
159 { \
160 if( ( x ) < 1e6 ) { \
161 TMF1 = 2.0 * ( x ) / ( add0 ) ; \
162 TMF2 = 1.0 + TMF1 * ( (1.0/2) + TMF1 * ( (1.0/6) \
163 + TMF1 * ( (1.0/24) + TMF1 * ( (1.0/120) \
164 + TMF1 * ( (1.0/720) + TMF1 * (1.0/5040) ) ) ) ) ) ; \
165 TMF3 = (1.0/2) + TMF1 * ( (1.0/3) \
166 + TMF1 * ( (1.0/8) + TMF1 * ( (1.0/30) \
167 + TMF1 * ( (1.0/144) + TMF1 * (1.0/840) ) ) ) ) ; \
168 y = add0 / TMF2 ; \
169 dx = - 2.0 * TMF3 / ( TMF2 * TMF2 ) ; \
170 } else { y=0.0; dx=0.9; } \
171 }
172
173 #define Fn_CP( y , x , xmax , pw , dx ) { \
174 double x2 = (x) * (x) ; \
175 double xmax2 = (xmax) * (xmax) ; \
176 double xp = 1.0 , xmp = 1.0 ; \
177 int m =0, mm =0; \
178 double arg =0.0, dnm =0.0; \
179 for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \
180 arg = xp + xmp ; \
181 dnm = arg ; \
182 if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \
183 if ( pw == 1 ) { mm = 1 ; \
184 } else if ( pw == 2 ) { mm = 2 ; \
185 } else if ( pw == 4 ) { mm = 3 ; \
186 } else if ( pw == 8 ) { mm = 4 ; } \
187 for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \
188 } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \
189 dnm = 1.0 / dnm ; \
190 y = (x) * (xmax) * dnm ; \
191 dx = (xmax) * xmp * dnm / arg ; \
192 }
193
194 #define Fn_SU_CP( y , x , xmax , delta , pw , dx ) { \
195 if(x > xmax - delta && delta >= 0.0) { \
196 TMF1 = x - xmax + delta ; \
197 Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \
198 y = xmax - delta + TMF0 ; \
199 dx = dx ; \
200 } else { \
201 y = x ; \
202 dx = 1.0 ; \
203 } \
204 }
205
206 /*===========================================================*
207 * Function hsmhvrdrift.
208 *=================*/
209
HSMHV2rdrift(double Vddp,double Vds,double Vbs,double Vsubs,double deltemp,HSMHV2instance * here,HSMHV2model * model,CKTcircuit * ckt)210 int HSMHV2rdrift
211 (
212 double Vddp,
213 double Vds,
214 double Vbs,
215 double Vsubs, /* substrate-source voltage */
216 double deltemp,
217 HSMHV2instance *here,
218 HSMHV2model *model,
219 CKTcircuit *ckt
220 )
221 {
222 HSMHV2binningParam *pParam = &here->pParam ;
223 HSMHV2modelMKSParam *modelMKS = &model->modelMKS ;
224
225 const double small = 1.0e-50 ;
226
227 double Mfactor =0.0, WeffLD_nf =0.0 ;
228 double Ldrift =0.0, Xldld =0.0 ;
229 double Nover =0.0 ;
230
231 /* temporary vars. & derivatives*/
232 double T0 =0.0, T0_dVb =0.0, T0_dVd =0.0, T0_dVg =0.0, T0_dT =0.0 ;
233 double T1 =0.0, T1_dVd =0.0, T1_dT =0.0, T1_dVddp =0.0 ;
234 double T2 =0.0, T2_dVb =0.0, T2_dVd =0.0, T2_dT =0.0, T2_dVddp =0.0 ;
235 double T3 =0.0, T3_dT =0.0, T3_dVddp =0.0 ;
236 double T4 =0.0, T4_dT =0.0, T4_dVddp =0.0 ;
237 double T5 =0.0, T5_dT =0.0, T5_dVddp =0.0 ;
238 double T6 =0.0, T6_dT =0.0, T6_dVddp =0.0 ;
239 double T9 =0.0 ;
240
241 /* bias-dependent Rd, Rs */
242
243 double Edri =0.0, Edri_dVddp =0.0 ;
244 double Vdri =0.0, Vdri_dVddp =0.0, Vdri_dT =0.0 ;
245 double Vmax =0.0, Vmax_dT =0.0 ;
246 double Mu0 =0.0, Mu0_dT =0.0 ;
247 double Cx =0.0, Cx_dT =0.0 ;
248 double Car =0.0, Car_dT =0.0 ;
249 double Mu =0.0, Mu_dVddp = 0.0, Mu_dT =0.0 ;
250 double Xov =0.0, Xov_dVds =0.0, Xov_dVgs =0.0, Xov_dVbs =0.0, Xov_dT =0.0 ;
251 double Carr =0.0, Carr_dVds=0.0, Carr_dVgs=0.0, Carr_dVbs=0.0, Carr_dVddp =0.0, Carr_dT =0.0 ;
252
253 double GD =0.0, GD_dVddp =0.0, GD_dVgse =0.0, GD_dT =0.0, GD_dVds =0.0, GD_dVgs =0.0, GD_dVbs =0.0 ;
254 double Rd =0.0, Rd_dVddp =0.0, Rd_dVdse =0.0, Rd_dVgse =0.0, Rd_dVbse =0.0, Rd_dT =0.0, Rd_dVds =0.0, Rd_dVgs =0.0, Rd_dVbs =0.0 ;
255 double Vddpz=0.0, Vddpz_dVddp=0.0, Vzadd =0.0, Vzadd_dVddp=0.0 ;
256
257 /* temperature-dependent variables for SHE model */
258 double TTEMP =0.0, TTEMP0 =0.0 ;
259
260 /* Wdepl and Wjunc */
261 double Wdepl, Wdepl_dVd, Wdepl_dVg, Wdepl_dVb, Wdepl_dT;
262 double Wjunc0, Wjunc0_dVd, Wjunc0_dVb;
263 double Wrdrdjunc, Wjunc, Wjunc_dVd, Wjunc_dVb;
264
265 const double Res_min = 1.0e-4 ;
266 const double epsm10 = 10.0e0 * C_EPS_M ;
267 const double ps_conv = 1.0e-12 ;
268
269 double Rdrbb_dT =0.0 ;
270
271 double Wdep = 0.0, Wdep_dVdserev = 0.0, Wdep_dVsubsrev = 0.0 ;
272 double T1_dVdserev = 0.0, T1_dVsubsrev = 0.0, T6_dVdserev = 0.0, T6_dVsubsrev = 0.0 ;
273 double Rd_dVsubs=0.0 ;
274
275 #define C_sub_delta 0.1 /* CHECK! */
276 #define C_sub_delta2 1.0e-9 /* CHECK! */
277
278 NG_IGNORE(Vsubs);
279
280 /*================ Start of executable code.=================*/
281
282 /*-----------------------------------------------------------*
283 * Temperature dependent constants.
284 *-----------------*/
285 if ( here->HSMHV2tempNode > 0 && pParam->HSMHV2_rth0 != 0.0 ) {
286
287 #define HSMHV2EVAL
288 #include "hsmhv2temp_eval_rdri.h"
289
290 } else {
291 if ( here->HSMHV2_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV2_dtemp ; }
292 Mu0_dT = 0.0 ;
293 Vmax_dT = 0.0 ;
294 Cx_dT = 0.0 ;
295 Car_dT = 0.0 ;
296 Rdrbb_dT = 0.0 ;
297 }
298
299 Mfactor = here->HSMHV2_m ;
300 WeffLD_nf = here->HSMHV2_weff_ld * here->HSMHV2_nf ;
301 Ldrift = here->HSMHV2_ldrift1 + here->HSMHV2_ldrift2 ;
302 Xldld = model->HSMHV2_xldld + small ;
303 Nover = pParam->HSMHV2_nover ;
304
305
306 Mu0 = here->HSMHV2_rdrmue * here->HSMHV2_rdrmuel ;
307 Mu0_dT = Mu0_dT * here->HSMHV2_rdrmuel ;
308 Vmax = here->HSMHV2_rdrvmax * here->HSMHV2_rdrvmaxw * here->HSMHV2_rdrvmaxl + small ;
309 Vmax_dT = Vmax_dT * here->HSMHV2_rdrvmaxw * here->HSMHV2_rdrvmaxl ;
310 Cx = here->HSMHV2_rdrcx * here->HSMHV2_rdrcxw ;
311 Cx_dT = Cx_dT * here->HSMHV2_rdrcxw ;
312 Car = here->HSMHV2_rdrcar ;
313
314 //-----------------------------------------------------------*
315 // Modified bias introduced to realize symmetry at Vddp=0.
316 //-----------------//
317 if(Vddp < 0) {
318 Fn_SymAdd( Vzadd , -Vddp / 2 , model->HSMHV2_vzadd0 , T2 ) ;
319 Vzadd_dVddp = - T2 / 2.0 ;
320 if( Vzadd < ps_conv ) {
321 Vzadd = ps_conv ;
322 Vzadd_dVddp = 0.0 ;
323 }
324 Vddpz = Vddp - 2 * Vzadd ;
325 Vddpz_dVddp = 1.0 - 2 * Vzadd_dVddp ;
326 } else {
327 Fn_SymAdd( Vzadd , Vddp / 2 , model->HSMHV2_vzadd0 , T2 ) ;
328 Vzadd_dVddp = T2 / 2.0 ;
329 if( Vzadd < ps_conv ) {
330 Vzadd = ps_conv ;
331 Vzadd_dVddp = 0.0 ;
332 }
333 Vddpz = Vddp + 2 * Vzadd ;
334 Vddpz_dVddp = 1.0 + 2 * Vzadd_dVddp ;
335 }
336
337 Edri = Vddpz / Ldrift ;
338 Edri_dVddp = Vddpz_dVddp / Ldrift ;
339
340 Vdri = Mu0 * Edri ;
341 Vdri_dVddp = Mu0 * Edri_dVddp ;
342 Vdri_dT = Mu0_dT * Edri ;
343
344 /*-----------------------------------------------------------*
345 * Mu : mobility
346 *-----------------*/
347 if ( Vddp >= 0 ) {
348 T1 = Vdri / Vmax ;
349 T1_dVddp = Vdri_dVddp / Vmax ;
350 T1_dT = ( Vdri_dT * Vmax - Vdri * Vmax_dT ) / ( Vmax * Vmax );
351 } else {
352 T1 = - Vdri / Vmax ;
353 T1_dVddp = - Vdri_dVddp / Vmax ;
354 T1_dT = - ( Vdri_dT * Vmax - Vdri * Vmax_dT ) / ( Vmax * Vmax );
355 }
356
357 if( model->HSMHV2_rdrbbtmp == 0.0 ) {
358 if( T1 == 0.0 ) {
359 T2 = 0.0 ; T2_dT = 0.0 ; T2_dVddp = 0.0 ;
360 T4 = 1.0 ; T4_dT = 0.0 ; T4_dVddp = 0.0 ;
361 }else {
362 if ( 1.0e0 - epsm10 <= here->HSMHV2_rdrbb && here->HSMHV2_rdrbb <= 1.0e0 + epsm10 ) {
363 T3 = 1.0e0 ;
364 T3_dT = 0.0e0 ;
365 T3_dVddp = 0.0e0 ;
366 } else if ( 2.0e0 - epsm10 <= here->HSMHV2_rdrbb && here->HSMHV2_rdrbb <= 2.0e0 + epsm10 ) {
367 T3 = T1 ;
368 T3_dT = T1_dT ;
369 T3_dVddp = T1_dVddp ;
370 } else {
371 T3 = Fn_Pow( T1 , here->HSMHV2_rdrbb - 1.0e0 ) ;
372 T3_dT = ( here->HSMHV2_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV2_rdrbb - 2.0e0 ) * T1_dT ;
373 T3_dVddp = ( here->HSMHV2_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV2_rdrbb - 2.0e0 ) * T1_dVddp ;
374 }
375 T2 = T1 * T3 ;
376 T2_dT = T1 * T3_dT + T3 * T1_dT ;
377 T2_dVddp = T1 * T3_dVddp + T3 * T1_dVddp ;
378 T4 = 1.0e0 + T2 ;
379 T4_dT = T2_dT ;
380 T4_dVddp = T2_dVddp ;
381 }
382
383 if ( 1.0e0 - epsm10 <= here->HSMHV2_rdrbb && here->HSMHV2_rdrbb <= 1.0e0 + epsm10 ) {
384 T5 = 1.0 / T4 ;
385 T5_dT = - T5 * T5 * T4_dT ;
386 T5_dVddp = - T5 * T5 * T4_dVddp ;
387 } else if ( 2.0e0 - epsm10 <= here->HSMHV2_rdrbb && here->HSMHV2_rdrbb <= 2.0e0 + epsm10 ) {
388 T5 = 1.0 / sqrt( T4 ) ;
389 T5_dT = - 0.5e0 / ( T4 * sqrt(T4) ) * T4_dT ;
390 T5_dVddp = - 0.5e0 / ( T4 * sqrt(T4) ) * T4_dVddp;
391 } else {
392 T6 = Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) ) ;
393 T5 = T4 * T6 ;
394 T6_dT = ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 2.0e0 ) ) * T4_dT ;
395 T6_dVddp = ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 2.0e0 ) ) * T4_dVddp ;
396 T5_dT = T4_dT * T6 + T4 * T6_dT ;
397 T5_dVddp = T4_dVddp * T6 + T4 * T6_dVddp ;
398 }
399
400 } else {
401 if( T1 == 0.0 ) {
402 T2 = 0.0 ; T2_dT = 0.0 ; T2_dVddp = 0.0 ;
403 T4 = 1.0 ; T4_dT = 0.0 ; T4_dVddp = 0.0 ;
404 }else {
405 T3 = Fn_Pow( T1 , here->HSMHV2_rdrbb - 1.0e0 ) ;
406 T3_dT = ( here->HSMHV2_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV2_rdrbb - 2.0e0 ) * T1_dT + T3*log(T1)*Rdrbb_dT ;
407 T3_dVddp = ( here->HSMHV2_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV2_rdrbb - 2.0e0 ) * T1_dVddp ;
408 T2 = T1 * T3 ;
409 T2_dT = T1 * T3_dT + T3 * T1_dT ;
410 T2_dVddp = T1 * T3_dVddp + T3 * T1_dVddp ;
411 T4 = 1.0e0 + T2 ;
412 T4_dT = T2_dT ;
413 T4_dVddp = T2_dVddp ;
414 }
415 T6 = Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) ) ;
416 T5 = T4 * T6 ;
417 T6_dT = ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 2.0e0 ) ) * T4_dT +T6*log(T4)/here->HSMHV2_rdrbb/here->HSMHV2_rdrbb*Rdrbb_dT ;
418 T6_dVddp = ( - 1.0e0 / here->HSMHV2_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV2_rdrbb - 2.0e0 ) ) * T4_dVddp ;
419 T5_dT = T4_dT * T6 + T4 * T6_dT ;
420 T5_dVddp = T4_dVddp * T6 + T4 * T6_dVddp ;
421 }
422
423 Mu = Mu0 * T5 ;
424 Mu_dVddp = Mu0 * T5_dVddp ;
425 Mu_dT = Mu0_dT * T5 + Mu0 * T5_dT ;
426
427 /*-----------------------------------------------------------*
428 * Carr : carrier density
429 *-----------------*/
430
431 T4 = 1.0e0 + T1 ;
432 T4_dVddp = T1_dVddp ;
433 T4_dT = T1_dT ;
434
435 T5 = 1.0 / T4 ;
436 T5_dVddp = - T5 * T5 * T4_dVddp ;
437 T5_dT = - T5 * T5 * T4_dT ;
438
439 Carr = Nover * ( 1.0 + Car * ( 1.0 - T5 ) * Vddpz / ( Ldrift - model->HSMHV2_rdrdl2 ) ) ;
440 Carr_dVddp = Nover * Car * ( - T5_dVddp * Vddpz + ( 1.0 - T5 ) * Vddpz_dVddp ) / ( Ldrift - model->HSMHV2_rdrdl2 ) ;
441 Carr_dT = Nover * ( Car_dT * ( 1.0 - T5 ) + Car * ( - T5_dT ) ) * Vddpz / ( Ldrift - model->HSMHV2_rdrdl2 ) ;
442
443 Carr += - here->HSMHV2_QbuLD / C_QE * model->HSMHV2_rdrqover;
444 Carr_dVds = - here->HSMHV2_QbuLD_dVds / C_QE * model->HSMHV2_rdrqover;
445 Carr_dVgs = - here->HSMHV2_QbuLD_dVgs / C_QE * model->HSMHV2_rdrqover;
446 Carr_dVbs = - here->HSMHV2_QbuLD_dVbs / C_QE * model->HSMHV2_rdrqover;
447 Carr_dT += - here->HSMHV2_QbuLD_dTi / C_QE * model->HSMHV2_rdrqover;
448
449 /*-----------------------------------------------------------*
450 * Xov : depth of the current flow
451 *-----------------*/
452 T0 = -here->HSMHV2_Ps0LD ;
453 T0_dVd = -here->HSMHV2_Ps0LD_dVds ;
454 T0_dVg = -here->HSMHV2_Ps0LD_dVgs ;
455 T0_dVb = -here->HSMHV2_Ps0LD_dVbs ;
456 T0_dT = -here->HSMHV2_Ps0LD_dTi ;
457
458 Fn_SZ( T0 , T0 , 1.0e-2 , T9 ) ;
459 T0 += epsm10 ;
460 T0_dVd *= T9 ;
461 T0_dVg *= T9 ;
462 T0_dVb *= T9 ;
463 T0_dT *= T9 ;
464
465 Wdepl = sqrt ( here->HSMHV2_kdep * T0 ) ;
466 Wdepl_dVd = here->HSMHV2_kdep / ( 2.0 * Wdepl ) * T0_dVd ;
467 Wdepl_dVg = here->HSMHV2_kdep / ( 2.0 * Wdepl ) * T0_dVg ;
468 Wdepl_dVb = here->HSMHV2_kdep / ( 2.0 * Wdepl ) * T0_dVb ;
469 Wdepl_dT = here->HSMHV2_kdep / ( 2.0 * Wdepl ) * T0_dT ;
470
471 T2 = Vds - Vbs + model->HSMHV2_vbi ;
472 T2_dVd = 1.0 ;
473 T2_dVb = -1.0 ;
474
475 Fn_SZ( T2 , T2 , 1.0e-2 , T9 ) ;
476 T2 += epsm10 ;
477 T2_dVd *= T9 ;
478 T2_dVb *= T9 ;
479
480 Wjunc0 = sqrt ( here->HSMHV2_kjunc * T2 ) ;
481 Wjunc0_dVd = here->HSMHV2_kjunc / ( 2.0 * Wjunc0 ) * T2_dVd ;
482 Wjunc0_dVb = here->HSMHV2_kjunc / ( 2.0 * Wjunc0 ) * T2_dVb ;
483 Fn_SU( Wjunc, Wjunc0, Xldld, 10e-3*Xldld, T0 );
484 Wjunc_dVd = Wjunc0_dVd * T0;
485 Wjunc_dVb = Wjunc0_dVb * T0;
486 // Wrdrdjunc = model->HSMHV2_rdrdjunc + small ;
487 Wrdrdjunc = model->HSMHV2_rdrdjunc + epsm10 ;
488
489
490 Xov = here->HSMHV2_Xmax - Cx * ( here->HSMHV2_Xmax
491 / Wrdrdjunc * Wdepl + here->HSMHV2_Xmax / Xldld * Wjunc ) ;
492 Xov_dVds = - Cx * here->HSMHV2_Xmax / Wrdrdjunc * Wdepl_dVd
493 - Cx * here->HSMHV2_Xmax / Xldld * Wjunc_dVd ;
494 Xov_dVgs = - Cx * here->HSMHV2_Xmax / Wrdrdjunc * Wdepl_dVg ;
495 Xov_dVbs = - Cx * here->HSMHV2_Xmax / Wrdrdjunc * Wdepl_dVb
496 - Cx * here->HSMHV2_Xmax / Xldld * Wjunc_dVb ;
497 Xov_dT = - Cx_dT * ( here->HSMHV2_Xmax
498 / Wrdrdjunc * Wdepl + here->HSMHV2_Xmax / Xldld * Wjunc )
499 - Cx * here->HSMHV2_Xmax / Wrdrdjunc * Wdepl_dT ;
500
501 Fn_SZ( Xov , Xov , (1.0 - here->HSMHV2_rdrcx) * here->HSMHV2_Xmax / 100 , T9 ) ;
502
503 Xov_dVds *= T9 ;
504 Xov_dVgs *= T9 ;
505 Xov_dVbs *= T9 ;
506 Xov_dT *= T9 ;
507
508 /*-----------------------------------------------------------*
509 * Rd : drift resistance
510 *-----------------*/
511 T0 = C_QE / ( Ldrift + model->HSMHV2_rdrdl1 );
512 T1 = T0;
513 T1_dVd = 0.0 ;
514
515 GD = T1 * Xov * Mu * Carr ;
516 GD_dVddp = T1 * Xov * Mu_dVddp * Carr
517 + T1 * Xov * Mu * Carr_dVddp ;
518 GD_dVgse = 0.0 ;
519 GD_dT = T1 * Xov * Mu_dT * Carr
520 + T1 * Xov_dT * Mu * Carr
521 + T1 * Xov * Mu * Carr_dT ;
522 GD_dVds = T1 * Mu * (Xov_dVds * Carr + Xov * Carr_dVds)
523 + T1_dVd * Mu * Xov * Carr;
524 GD_dVgs = T1 * Mu * (Xov_dVgs * Carr + Xov * Carr_dVgs);
525 GD_dVbs = T1 * Mu * (Xov_dVbs * Carr + Xov * Carr_dVbs);
526
527 if ( GD <= 0 ) {
528 // GD = small ;
529 GD = epsm10 ;
530 GD_dVddp = 0.0 ;
531 GD_dVgse = 0.0 ;
532 GD_dT = 0.0 ;
533 GD_dVds = 0.0 ;
534 GD_dVgs = 0.0 ;
535 GD_dVbs = 0.0 ;
536 }
537
538 Rd = 1 / GD ;
539 Rd_dVddp = - GD_dVddp * Rd * Rd ;
540 Rd_dVgse = - GD_dVgse * Rd * Rd ;
541 Rd_dT = - GD_dT * Rd * Rd ;
542 Rd_dVds = - GD_dVds * Rd * Rd ;
543 Rd_dVgs = - GD_dVgs * Rd * Rd ;
544 Rd_dVbs = - GD_dVbs * Rd * Rd ;
545
546 /* Weff dependence of the resistances */
547 Rd = Rd / WeffLD_nf ;
548
549 Fn_SU_CP( Rd, Rd, 1e6, 1e3, 2, T0 ) ;
550
551 Rd_dVddp = Rd_dVddp*T0/WeffLD_nf ;
552 Rd_dVgse = Rd_dVgse*T0/WeffLD_nf ;
553 Rd_dT = Rd_dT*T0/WeffLD_nf ;
554 Rd_dVds = Rd_dVds*T0/WeffLD_nf ;
555 Rd_dVgs = Rd_dVgs*T0/WeffLD_nf ;
556 Rd_dVbs = Rd_dVbs*T0/WeffLD_nf ;
557
558 if ( here->HSMHV2subNode >= 0 &&
559 ( pParam->HSMHV2_nover * ( modelMKS->HSMHV2_nsubsub + pParam->HSMHV2_nover ) ) > 0 ) {
560 /* external substrate node exists && LDMOS case: */
561 /* Substrate Effect */
562 T0 = model->HSMHV2_vbisub - model->HSMHV2_rdvdsub * here->HSMHV2_Vdserevz - model->HSMHV2_rdvsub * here->HSMHV2_Vsubsrev ;
563
564 Fn_SZ( T1, T0, 10.0, T2 ) ;
565 T1 += epsm10 ;
566
567 T1_dVdserev = - model->HSMHV2_rdvdsub * here->HSMHV2_Vdserevz_dVd * T2 ;
568 T1_dVsubsrev = - model->HSMHV2_rdvsub * T2 ;
569
570 T0 = modelMKS->HSMHV2_nsubsub / ( pParam->HSMHV2_nover * ( modelMKS->HSMHV2_nsubsub + pParam->HSMHV2_nover ) ) ;
571
572 T4 = 2 * C_ESI / C_QE * T0 ;
573 Wdep = sqrt ( T4 * T1 ) + small ;
574
575 Wdep_dVdserev = 0.5 * T4 * T1_dVdserev / Wdep ;
576 Wdep_dVsubsrev = 0.5 * T4 * T1_dVsubsrev / Wdep ;
577
578 Fn_SU( Wdep, Wdep, model->HSMHV2_ddrift, C_sub_delta * model->HSMHV2_ddrift, T0 ) ;
579 Wdep_dVdserev *= T0 ;
580 Wdep_dVsubsrev *= T0 ;
581
582 T0 = model->HSMHV2_ddrift - Wdep ;
583 Fn_SZ( T0, T0, C_sub_delta2, T2 ) ;
584 T0 += epsm10;
585
586 T6 = (here->HSMHV2_ldrift1 + here->HSMHV2_ldrift2 ) / T0 ;
587 T6_dVdserev = T2 * Wdep_dVdserev * T6 / T0 ;
588 T6_dVsubsrev = T2 * Wdep_dVsubsrev * T6 / T0 ;
589
590 T0 = Rd ;
591 Rd = T0 * T6 ;
592 Rd_dVddp = Rd_dVddp * T6 ;
593 Rd_dVgse = Rd_dVgse * T6 ;
594 Rd_dVdse = T0 * T6_dVdserev ;
595 Rd_dVbse = Rd_dVgse * T6 ;
596
597 Rd_dVds = Rd_dVds * T6 ;
598 Rd_dVgs = Rd_dVgs * T6 ;
599 Rd_dVbs = Rd_dVbs * T6 ;
600 Rd_dVsubs = T0 * T6_dVsubsrev ;
601 Rd_dT = Rd_dT * T6 ;
602
603 }
604
605
606 /* Sheet resistances are added. */
607 Rd += here->HSMHV2_rd0 ;
608
609 /* Re-stamps for hsmhvnoi.c */
610 /* Please see hsmhvnoi.c */
611 if ( Rd > Res_min && model->HSMHV2_cothrml )
612 here->HSMHV2drainConductance = Mfactor / Rd ;
613 else here->HSMHV2drainConductance = 0.0 ;
614 if ( here->HSMHV2_Rs > Res_min && model->HSMHV2_cothrml )
615 here->HSMHV2sourceConductance = Mfactor / here->HSMHV2_rs0 ;
616 else here->HSMHV2sourceConductance = 0.0 ;
617
618 /* Clamping to Res_min */
619 here->HSMHV2_Rs = here->HSMHV2_rs0 / Mfactor ;
620 if(here->HSMHV2_Rs < Res_min) { here->HSMHV2_Rs = Res_min ; }
621 here->HSMHV2_dRs_dVdse = 0.0 ;
622 here->HSMHV2_dRs_dVgse = 0.0 ;
623 here->HSMHV2_dRs_dVbse = 0.0 ;
624 here->HSMHV2_dRs_dVsubs = 0.0 ;
625 here->HSMHV2_dRs_dTi = 0.0 ;
626
627
628 /* Clamping to Res_min */
629 here->HSMHV2_Rd = Rd / Mfactor ;
630 if(here->HSMHV2_Rd < Res_min) {
631 here->HSMHV2_Rd = Res_min ;
632 here->HSMHV2_dRd_dVddp = 0.0 ;
633 here->HSMHV2_dRd_dVdse = 0.0 ;
634 here->HSMHV2_dRd_dVgse = 0.0 ;
635 here->HSMHV2_dRd_dVbse = 0.0 ;
636 here->HSMHV2_dRd_dVsubs = 0.0 ;
637 here->HSMHV2_dRd_dTi = 0.0 ;
638 here->HSMHV2_dRd_dVds = 0.0 ;
639 here->HSMHV2_dRd_dVgs = 0.0 ;
640 here->HSMHV2_dRd_dVbs = 0.0 ;
641 } else {
642 here->HSMHV2_dRd_dVddp = Rd_dVddp / Mfactor ;
643 here->HSMHV2_dRd_dVdse = Rd_dVdse / Mfactor ;
644 here->HSMHV2_dRd_dVgse = Rd_dVgse / Mfactor ;
645 here->HSMHV2_dRd_dVbse = Rd_dVbse / Mfactor ;
646 here->HSMHV2_dRd_dVsubs= Rd_dVsubs / Mfactor ;
647 here->HSMHV2_dRd_dTi = Rd_dT / Mfactor ;
648 here->HSMHV2_dRd_dVds = Rd_dVds / Mfactor ;
649 here->HSMHV2_dRd_dVgs = Rd_dVgs / Mfactor ;
650 here->HSMHV2_dRd_dVbs = Rd_dVbs / Mfactor ;
651 }
652
653
654 return ( HiSIM_OK ) ;
655
656 }
657