33 changed files with 10272 additions and 3659 deletions
-
5src/spicelib/devices/hisimhv1/Makefile.am
-
71src/spicelib/devices/hisimhv1/hisimhv.h
-
223src/spicelib/devices/hisimhv1/hsmhv.c
-
50src/spicelib/devices/hisimhv1/hsmhvacld.c
-
56src/spicelib/devices/hisimhv1/hsmhvask.c
-
50src/spicelib/devices/hisimhv1/hsmhvcvtest.c
-
643src/spicelib/devices/hisimhv1/hsmhvdef.h
-
50src/spicelib/devices/hisimhv1/hsmhvdel.c
-
50src/spicelib/devices/hisimhv1/hsmhvdest.c
-
5506src/spicelib/devices/hisimhv1/hsmhveval.c
-
2432src/spicelib/devices/hisimhv1/hsmhveval_dep.h
-
600src/spicelib/devices/hisimhv1/hsmhveval_dio.c
-
97src/spicelib/devices/hisimhv1/hsmhveval_qover.h
-
656src/spicelib/devices/hisimhv1/hsmhveval_rdrift.c
-
59src/spicelib/devices/hisimhv1/hsmhvevalenv.h
-
8src/spicelib/devices/hisimhv1/hsmhvext.h
-
50src/spicelib/devices/hisimhv1/hsmhvgetic.c
-
50src/spicelib/devices/hisimhv1/hsmhvitf.h
-
498src/spicelib/devices/hisimhv1/hsmhvld.c
-
50src/spicelib/devices/hisimhv1/hsmhvld_info_eval.h
-
488src/spicelib/devices/hisimhv1/hsmhvmask.c
-
50src/spicelib/devices/hisimhv1/hsmhvmdel.c
-
623src/spicelib/devices/hisimhv1/hsmhvmpar.c
-
73src/spicelib/devices/hisimhv1/hsmhvnoi.c
-
50src/spicelib/devices/hisimhv1/hsmhvpar.c
-
58src/spicelib/devices/hisimhv1/hsmhvpzld.c
-
608src/spicelib/devices/hisimhv1/hsmhvset.c
-
129src/spicelib/devices/hisimhv1/hsmhvtemp.c
-
262src/spicelib/devices/hisimhv1/hsmhvtemp_eval.h
-
223src/spicelib/devices/hisimhv1/hsmhvtemp_eval_dio.h
-
103src/spicelib/devices/hisimhv1/hsmhvtemp_eval_rdri.h
-
55src/spicelib/devices/hisimhv1/hsmhvtrunc.c
-
5visualc/vngspice_fftw_vc10.vcxproj
643
src/spicelib/devices/hisimhv1/hsmhvdef.h
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
5506
src/spicelib/devices/hisimhv1/hsmhveval.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2432
src/spicelib/devices/hisimhv1/hsmhveval_dep.h
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,600 @@ |
|||||
|
/*********************************************************************** |
||||
|
|
||||
|
HiSIM (Hiroshima University STARC IGFET Model) |
||||
|
Copyright (C) 2014 Hiroshima University & STARC |
||||
|
|
||||
|
MODEL NAME : HiSIM_HV |
||||
|
( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) |
||||
|
Model Parameter 'VERSION' : 2.20 |
||||
|
FILE : hsmhveval_dio.c |
||||
|
|
||||
|
DATE : 2014.6.11 |
||||
|
|
||||
|
released by |
||||
|
Hiroshima University & |
||||
|
Semiconductor Technology Academic Research Center (STARC) |
||||
|
***********************************************************************/ |
||||
|
|
||||
|
/********************************************************************** |
||||
|
|
||||
|
The following source code, and all copyrights, trade secrets or other |
||||
|
intellectual property rights in and to the source code in its entirety, |
||||
|
is owned by the Hiroshima University and the STARC organization. |
||||
|
|
||||
|
All users need to follow the "HISIM_HV Distribution Statement and |
||||
|
Copyright Notice" attached to HiSIM_HV model. |
||||
|
|
||||
|
-----HISIM_HV Distribution Statement and Copyright Notice-------------- |
||||
|
|
||||
|
Software is distributed as is, completely without warranty or service |
||||
|
support. Hiroshima University or STARC and its employees are not liable |
||||
|
for the condition or performance of the software. |
||||
|
|
||||
|
Hiroshima University and STARC own the copyright and grant users a perpetual, |
||||
|
irrevocable, worldwide, non-exclusive, royalty-free license with respect |
||||
|
to the software as set forth below. |
||||
|
|
||||
|
Hiroshima University and STARC hereby disclaims all implied warranties. |
||||
|
|
||||
|
Hiroshima University and STARC grant the users the right to modify, copy, |
||||
|
and redistribute the software and documentation, both within the user's |
||||
|
organization and externally, subject to the following restrictions |
||||
|
|
||||
|
1. The users agree not to charge for Hiroshima University and STARC code |
||||
|
itself but may charge for additions, extensions, or support. |
||||
|
|
||||
|
2. In any product based on the software, the users agree to acknowledge |
||||
|
Hiroshima University and STARC that developed the software. This |
||||
|
acknowledgment shall appear in the product documentation. |
||||
|
|
||||
|
3. The users agree to reproduce any copyright notice which appears on |
||||
|
the software on any copy or modification of such made available |
||||
|
to others." |
||||
|
|
||||
|
Toshimasa Asahara, President, Hiroshima University |
||||
|
Mitiko Miura-Mattausch, Professor, Hiroshima University |
||||
|
Katsuhiro Shimohigashi, President&CEO, STARC |
||||
|
June 2008 (revised October 2011) |
||||
|
*************************************************************************/ |
||||
|
|
||||
|
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||||
|
* Substrate-source/drain junction diode |
||||
|
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ |
||||
|
|
||||
|
/*===========================================================* |
||||
|
* Preamble |
||||
|
*=================*/ |
||||
|
/*---------------------------------------------------* |
||||
|
* Header files |
||||
|
*-----------------*/ |
||||
|
#include "ngspice/ngspice.h" |
||||
|
|
||||
|
/*-----------------------------------* |
||||
|
* HiSIM macros |
||||
|
*-----------------*/ |
||||
|
#include "hisimhv.h" |
||||
|
#include "hsmhvevalenv.h" |
||||
|
|
||||
|
/*===========================================================* |
||||
|
* Function HSMHVdio |
||||
|
*=================*/ |
||||
|
int HSMHVdio |
||||
|
( |
||||
|
double vbs_jct, |
||||
|
double vbd_jct, |
||||
|
double deltemp, |
||||
|
HSMHVinstance *here, |
||||
|
HSMHVmodel *model, |
||||
|
CKTcircuit *ckt |
||||
|
) |
||||
|
{ |
||||
|
HSMHVbinningParam *pParam = &here->pParam ; |
||||
|
|
||||
|
/* junction currents */ |
||||
|
double Ibs =0.0, Gbs =0.0, Ibs_dT =0.0 ; |
||||
|
double Ibd =0.0, Gbd =0.0, Ibd_dT =0.0 ; |
||||
|
|
||||
|
/* junction capacitances */ |
||||
|
double Qbs =0.0, Capbs =0.0, Qbs_dT =0.0 ; |
||||
|
double Qbd =0.0, Capbd =0.0, Qbd_dT =0.0 ; |
||||
|
double czbd =0.0, czbd_dT=0.0 ; |
||||
|
double czbdsw =0.0, czbdsw_dT=0.0 ; |
||||
|
double czbdswg =0.0, czbdswg_dT=0.0 ; |
||||
|
double czbs =0.0, czbs_dT=0.0 ; |
||||
|
double czbssw =0.0, czbssw_dT=0.0 ; |
||||
|
double czbsswg =0.0, czbsswg_dT=0.0 ; |
||||
|
double arg =0.0, sarg =0.0 ; |
||||
|
|
||||
|
/* temperature-dependent variables for SHE model */ |
||||
|
double log_Tratio =0.0 ; |
||||
|
double TTEMP =0.0, TTEMP0 =0.0 ; |
||||
|
double beta =0.0, beta_dT =0.0 ; |
||||
|
double beta_inv =0.0, beta_inv_dT =0.0 ; |
||||
|
double Eg =0.0, Eg_dT =0.0 ; |
||||
|
double js =0.0, js_dT =0.0 ; |
||||
|
double jssw =0.0, jssw_dT =0.0 ; |
||||
|
double js2 =0.0, js2_dT =0.0 ; |
||||
|
double jssw2 =0.0, jssw2_dT =0.0 ; |
||||
|
|
||||
|
double isbd_dT =0.0, isbs_dT =0.0 ; |
||||
|
double isbd2_dT =0.0, isbs2_dT =0.0 ; |
||||
|
double vbdt_dT =0.0, vbst_dT = 0.0 ; |
||||
|
double jd_expcd_dT =0.0 , jd_expcs_dT =0.0 ; |
||||
|
double jd_nvtm_invd_dT =0.0 , jd_nvtm_invs_dT =0.0 ; |
||||
|
double exptempd_dT = 0.0 , exptemps_dT = 0.0 ; |
||||
|
double tcjbd =0.0, tcjbs =0.0, |
||||
|
tcjbdsw =0.0, tcjbssw =0.0, |
||||
|
tcjbdswg =0.0, tcjbsswg =0.0 ; |
||||
|
|
||||
|
/* options */ |
||||
|
double Mfactor = here->HSMHV_m; |
||||
|
|
||||
|
/* Internal flags --------------------*/ |
||||
|
int flg_err = 0; /* error level */ |
||||
|
int flg_info = model->HSMHV_info; |
||||
|
|
||||
|
/* temporary vars. & derivatives */ |
||||
|
double TX =0.0 ; |
||||
|
double T0 =0.0, T0_dT =0.0 ; |
||||
|
double T1 =0.0, T1_dVb =0.0, T1_dT =0.0 ; |
||||
|
double T2 =0.0, T2_dVb =0.0, T2_dT =0.0 ; |
||||
|
double T3 =0.0, T3_dVb =0.0, T3_dT =0.0 ; |
||||
|
double T4 =0.0, T4_dT =0.0 ; |
||||
|
double T9 =0.0, T9_dT =0.0 ; |
||||
|
double T10 =0.0, T10_dT =0.0 ; |
||||
|
double T12 =0.0, T12_dT =0.0 ; |
||||
|
|
||||
|
|
||||
|
/*================ Start of executable code.=================*/ |
||||
|
|
||||
|
/*-----------------------------------------------------------* |
||||
|
* Temperature dependent constants. |
||||
|
*-----------------*/ |
||||
|
if ( here->HSMHVtempNode > 0 && pParam->HSMHV_rth0 != 0.0 ) { |
||||
|
|
||||
|
#define HSMHVEVAL |
||||
|
#include "hsmhvtemp_eval_dio.h" |
||||
|
|
||||
|
} else { |
||||
|
TTEMP = ckt->CKTtemp; |
||||
|
if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; } |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/*-----------------------------------------------------------* |
||||
|
* Cbsj, Cbdj: node-base S/D biases. |
||||
|
*-----------------*/ |
||||
|
|
||||
|
/* ibd */ |
||||
|
T10 = model->HSMHV_cvbd * here->HSMHV_jd_nvtm_invd ; |
||||
|
T10_dT = model->HSMHV_cvbd * beta_dT / pParam->HSMHV_njd ; |
||||
|
|
||||
|
T9 = model->HSMHV_cisbd * here->HSMHV_exptempd ; |
||||
|
T9_dT = model->HSMHV_cisbd * exptempd_dT ; |
||||
|
T0 = here->HSMHV_isbd2 * T9 ; |
||||
|
T0_dT = here->HSMHV_isbd2 * T9_dT + isbd2_dT * T9 ; |
||||
|
|
||||
|
TX = - vbd_jct * T10 ; |
||||
|
T2 = exp ( TX ); |
||||
|
T2_dVb = - T2 * T10 ; |
||||
|
T2_dT = T2 * TX * beta_dT * beta_inv ; |
||||
|
|
||||
|
T3 = T2 ; |
||||
|
T3_dVb = T2_dVb ; |
||||
|
T3_dT = T2_dT ; |
||||
|
|
||||
|
if ( vbd_jct < here->HSMHV_vbdt ) { |
||||
|
TX = vbd_jct * here->HSMHV_jd_nvtm_invd ; |
||||
|
|
||||
|
if ( TX < - 3*EXP_THR ) { |
||||
|
T1 = 0.0 ; |
||||
|
T1_dVb = 0.0 ; |
||||
|
T1_dT = 0.0 ; |
||||
|
} else { |
||||
|
T1 = exp ( TX ) ; |
||||
|
T1_dVb = T1 * here->HSMHV_jd_nvtm_invd ; |
||||
|
T1_dT = T1 * TX * beta_dT * beta_inv ; |
||||
|
} |
||||
|
|
||||
|
Ibd = here->HSMHV_isbd * (T1 - 1.0) |
||||
|
+ T0 * (T2 - 1.0) |
||||
|
+ pParam->HSMHV_cisbkd * (T3 - 1.0); |
||||
|
Gbd = here->HSMHV_isbd * T1_dVb |
||||
|
+ T0 * T2_dVb |
||||
|
+ pParam->HSMHV_cisbkd * T3_dVb ; |
||||
|
Ibd_dT = here->HSMHV_isbd * T1_dT + isbd_dT * ( T1 - 1.0 ) |
||||
|
+ T0 * T2_dT + T0_dT * ( T2 - 1.0 ) |
||||
|
+ pParam->HSMHV_cisbkd * T3_dT ; |
||||
|
|
||||
|
} else { |
||||
|
T1 = here->HSMHV_jd_expcd ; |
||||
|
|
||||
|
T4 = here->HSMHV_isbd * here->HSMHV_jd_nvtm_invd * T1 ; |
||||
|
|
||||
|
Ibd = here->HSMHV_isbd * (T1 - 1.0) |
||||
|
+ T4 * (vbd_jct - here->HSMHV_vbdt) |
||||
|
+ T0 * (T2 - 1.0) |
||||
|
+ pParam->HSMHV_cisbkd * (T3 - 1.0) ; |
||||
|
Gbd = T4 |
||||
|
+ T0 * T2_dVb |
||||
|
+ pParam->HSMHV_cisbkd * T3_dVb ; |
||||
|
|
||||
|
T1_dT = jd_expcd_dT ; |
||||
|
T4_dT = isbd_dT * here->HSMHV_jd_nvtm_invd * T1 |
||||
|
+ here->HSMHV_isbd * jd_nvtm_invd_dT * T1 |
||||
|
+ here->HSMHV_isbd * here->HSMHV_jd_nvtm_invd * T1_dT ; |
||||
|
Ibd_dT = isbd_dT * ( T1 - 1.0 ) + here->HSMHV_isbd * T1_dT |
||||
|
+ T4_dT * ( vbd_jct - here->HSMHV_vbdt ) - T4 * vbdt_dT |
||||
|
+ T0_dT * ( T2 - 1.0 ) + T0 * T2_dT |
||||
|
+ pParam->HSMHV_cisbkd * T3_dT ; |
||||
|
} |
||||
|
T12 = model->HSMHV_divxd * here->HSMHV_isbd2 ; |
||||
|
Ibd += T12 * vbd_jct ; |
||||
|
Gbd += T12 ; |
||||
|
|
||||
|
T12_dT = model->HSMHV_divxd * isbd2_dT ; |
||||
|
Ibd_dT += T12_dT * vbd_jct ; |
||||
|
|
||||
|
/* ibs */ |
||||
|
T10 = model->HSMHV_cvbs * here->HSMHV_jd_nvtm_invs ; |
||||
|
T10_dT = model->HSMHV_cvbs * beta_dT / pParam->HSMHV_njs ; |
||||
|
|
||||
|
T9 = model->HSMHV_cisbs * here->HSMHV_exptemps ; |
||||
|
T9_dT = model->HSMHV_cisbs * exptemps_dT ; |
||||
|
T0 = here->HSMHV_isbs2 * T9 ; |
||||
|
T0_dT = here->HSMHV_isbs2 * T9_dT + isbs2_dT * T9 ; |
||||
|
|
||||
|
TX = - vbs_jct * T10 ; |
||||
|
T2 = exp ( TX ); |
||||
|
T2_dVb = - T2 * T10 ; |
||||
|
T2_dT = T2 * TX * beta_dT * beta_inv ; |
||||
|
|
||||
|
T3 = T2 ; |
||||
|
T3_dVb = T2_dVb ; |
||||
|
T3_dT = T2_dT ; |
||||
|
|
||||
|
if ( vbs_jct < here->HSMHV_vbst ) { |
||||
|
TX = vbs_jct * here->HSMHV_jd_nvtm_invs ; |
||||
|
if ( TX < - 3*EXP_THR ) { |
||||
|
T1 = 0.0 ; |
||||
|
T1_dVb = 0.0 ; |
||||
|
T1_dT = 0.0 ; |
||||
|
} else { |
||||
|
T1 = exp ( TX ) ; |
||||
|
T1_dVb = T1 * here->HSMHV_jd_nvtm_invs ; |
||||
|
T1_dT = T1 * TX * beta_dT * beta_inv ; |
||||
|
} |
||||
|
Ibs = here->HSMHV_isbs * (T1 - 1.0) |
||||
|
+ T0 * (T2 - 1.0) |
||||
|
+ pParam->HSMHV_cisbks * (T3 - 1.0); |
||||
|
Gbs = here->HSMHV_isbs * T1_dVb |
||||
|
+ T0 * T2_dVb |
||||
|
+ pParam->HSMHV_cisbks * T3_dVb ; |
||||
|
Ibs_dT = here->HSMHV_isbs * T1_dT + isbs_dT * ( T1 - 1.0 ) |
||||
|
+ T0 * T2_dT + T0_dT * ( T2 - 1.0 ) |
||||
|
+ pParam->HSMHV_cisbks * T3_dT ; |
||||
|
} else { |
||||
|
T1 = here->HSMHV_jd_expcs ; |
||||
|
|
||||
|
T4 = here->HSMHV_isbs * here->HSMHV_jd_nvtm_invs * T1 ; |
||||
|
|
||||
|
Ibs = here->HSMHV_isbs * (T1 - 1.0) |
||||
|
+ T4 * (vbs_jct - here->HSMHV_vbst) |
||||
|
+ T0 * (T2 - 1.0) |
||||
|
+ pParam->HSMHV_cisbks * (T3 - 1.0) ; |
||||
|
Gbs = T4 |
||||
|
+ T0 * T2_dVb |
||||
|
+ pParam->HSMHV_cisbks * T3_dVb ; |
||||
|
|
||||
|
T1_dT = jd_expcs_dT ; |
||||
|
T4_dT = isbs_dT * here->HSMHV_jd_nvtm_invs * T1 |
||||
|
+ here->HSMHV_isbs * jd_nvtm_invs_dT * T1 |
||||
|
+ here->HSMHV_isbs * here->HSMHV_jd_nvtm_invs * T1_dT ; |
||||
|
Ibs_dT = isbs_dT * ( T1 - 1.0 ) + here->HSMHV_isbs * T1_dT |
||||
|
+ T4_dT * ( vbs_jct - here->HSMHV_vbst) - T4 * vbst_dT |
||||
|
+ T0_dT * ( T2 - 1.0 ) + T0 * T2_dT |
||||
|
+ pParam->HSMHV_cisbks * T3_dT ; |
||||
|
} |
||||
|
T12 = model->HSMHV_divxs * here->HSMHV_isbs2 ; |
||||
|
Ibs += T12 * vbs_jct ; |
||||
|
Gbs += T12 ; |
||||
|
|
||||
|
T12_dT = model->HSMHV_divxs * isbs2_dT ; |
||||
|
Ibs_dT += T12_dT * vbs_jct ; |
||||
|
|
||||
|
|
||||
|
/*-----------------------------------------------------------* |
||||
|
* Charges and Capacitances. |
||||
|
*-----------------*/ |
||||
|
/* charge storage elements |
||||
|
* bulk-drain and bulk-source depletion capacitances |
||||
|
* czbd : zero bias drain junction capacitance |
||||
|
* czbs : zero bias source junction capacitance |
||||
|
* czbdsw:zero bias drain junction sidewall capacitance |
||||
|
* czbssw:zero bias source junction sidewall capacitance |
||||
|
*/ |
||||
|
|
||||
|
/* Source Bulk Junction */ |
||||
|
tcjbs = model->HSMHV_tcjbs ; |
||||
|
tcjbssw = model->HSMHV_tcjbssw ; |
||||
|
tcjbsswg = model->HSMHV_tcjbsswg ; |
||||
|
|
||||
|
czbs = model->HSMHV_cjs * here->HSMHV_as ; |
||||
|
czbs = czbs * ( 1.0 + tcjbs * ( TTEMP - model->HSMHV_ktnom )) ; |
||||
|
czbs_dT = ( model->HSMHV_cjs * here->HSMHV_as ) * tcjbs ; |
||||
|
|
||||
|
if (here->HSMHV_ps > here->HSMHV_weff_nf) { |
||||
|
czbssw = model->HSMHV_cjsws * ( here->HSMHV_ps - here->HSMHV_weff_nf ) ; |
||||
|
czbssw = czbssw * ( 1.0 + tcjbssw * ( TTEMP - model->HSMHV_ktnom )) ; |
||||
|
czbssw_dT = ( model->HSMHV_cjsws * ( here->HSMHV_ps - here->HSMHV_weff_nf )) * tcjbssw ; |
||||
|
|
||||
|
czbsswg = model->HSMHV_cjswgs * here->HSMHV_weff_nf ; |
||||
|
czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSMHV_ktnom )) ; |
||||
|
czbsswg_dT = ( model->HSMHV_cjswgs * here->HSMHV_weff_nf ) * tcjbsswg ; |
||||
|
|
||||
|
// if (vbs_jct == 0.0) { |
||||
|
if (0) { |
||||
|
Qbs = 0.0 ; |
||||
|
Qbs_dT = 0.0 ; |
||||
|
Capbs = czbs + czbssw + czbsswg ; |
||||
|
} else if (vbs_jct < 0.0) { |
||||
|
if (czbs > 0.0) { |
||||
|
arg = 1.0 - vbs_jct / model->HSMHV_pbs ; |
||||
|
if (model->HSMHV_mjs == 0.5) |
||||
|
sarg = 1.0 / sqrt(arg) ; |
||||
|
else |
||||
|
sarg = Fn_Pow( arg , -model->HSMHV_mjs ) ; |
||||
|
Qbs = model->HSMHV_pbs * czbs * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjs) ; |
||||
|
Qbs_dT = model->HSMHV_pbs * czbs_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjs) ; |
||||
|
Capbs = czbs * sarg ; |
||||
|
} else { |
||||
|
Qbs = 0.0 ; |
||||
|
Qbs_dT = 0.0 ; |
||||
|
Capbs = 0.0 ; |
||||
|
} |
||||
|
if (czbssw > 0.0) { |
||||
|
arg = 1.0 - vbs_jct / model->HSMHV_pbsws ; |
||||
|
if (model->HSMHV_mjsws == 0.5) |
||||
|
sarg = 1.0 / sqrt(arg) ; |
||||
|
else |
||||
|
sarg = Fn_Pow( arg , -model->HSMHV_mjsws ) ; |
||||
|
Qbs += model->HSMHV_pbsws * czbssw * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjsws) ; |
||||
|
Qbs_dT += model->HSMHV_pbsws * czbssw_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjsws) ; |
||||
|
Capbs += czbssw * sarg ; |
||||
|
} |
||||
|
if (czbsswg > 0.0) { |
||||
|
arg = 1.0 - vbs_jct / model->HSMHV_pbswgs ; |
||||
|
if (model->HSMHV_mjswgs == 0.5) |
||||
|
sarg = 1.0 / sqrt(arg) ; |
||||
|
else |
||||
|
sarg = Fn_Pow( arg , -model->HSMHV_mjswgs ) ; |
||||
|
Qbs += model->HSMHV_pbswgs * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgs) ; |
||||
|
Qbs_dT += model->HSMHV_pbswgs * czbsswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgs) ; |
||||
|
Capbs += czbsswg * sarg ; |
||||
|
} |
||||
|
} else { |
||||
|
T1 = czbs + czbssw + czbsswg ; |
||||
|
T1_dT = czbs_dT + czbssw_dT + czbsswg_dT ; |
||||
|
T2 = czbs * model->HSMHV_mjs / model->HSMHV_pbs |
||||
|
+ czbssw * model->HSMHV_mjsws / model->HSMHV_pbsws |
||||
|
+ czbsswg * model->HSMHV_mjswgs / model->HSMHV_pbswgs ; |
||||
|
T2_dT = czbs_dT * model->HSMHV_mjs / model->HSMHV_pbs |
||||
|
+ czbssw_dT * model->HSMHV_mjsws / model->HSMHV_pbsws |
||||
|
+ czbsswg_dT * model->HSMHV_mjswgs / model->HSMHV_pbswgs ; |
||||
|
Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ; |
||||
|
Qbs_dT = vbs_jct * (T1_dT + vbs_jct * 0.5 * T2_dT) ; |
||||
|
Capbs = T1 + vbs_jct * T2 ; |
||||
|
} |
||||
|
} else { |
||||
|
czbsswg = model->HSMHV_cjswgs * here->HSMHV_ps ; |
||||
|
czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSMHV_ktnom )) ; |
||||
|
czbsswg_dT = ( model->HSMHV_cjswgs * here->HSMHV_ps ) * tcjbsswg ; |
||||
|
|
||||
|
// if (vbs_jct == 0.0) { |
||||
|
if (0) { |
||||
|
Qbs = 0.0 ; |
||||
|
Qbs_dT = 0.0 ; |
||||
|
Capbs = czbs + czbsswg ; |
||||
|
} else if (vbs_jct < 0.0) { |
||||
|
if (czbs > 0.0) { |
||||
|
arg = 1.0 - vbs_jct / model->HSMHV_pbs ; |
||||
|
if (model->HSMHV_mjs == 0.5) |
||||
|
sarg = 1.0 / sqrt(arg) ; |
||||
|
else |
||||
|
sarg = Fn_Pow( arg , -model->HSMHV_mjs ) ; |
||||
|
Qbs = model->HSMHV_pbs * czbs * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjs) ; |
||||
|
Qbs_dT = model->HSMHV_pbs * czbs_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjs) ; |
||||
|
Capbs = czbs * sarg ; |
||||
|
} else { |
||||
|
Qbs = 0.0 ; |
||||
|
Qbs_dT = 0.0 ; |
||||
|
Capbs = 0.0 ; |
||||
|
} |
||||
|
if (czbsswg > 0.0) { |
||||
|
arg = 1.0 - vbs_jct / model->HSMHV_pbswgs ; |
||||
|
if (model->HSMHV_mjswgs == 0.5) |
||||
|
sarg = 1.0 / sqrt(arg) ; |
||||
|
else |
||||
|
sarg = Fn_Pow( arg , -model->HSMHV_mjswgs ) ; |
||||
|
Qbs += model->HSMHV_pbswgs * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgs) ; |
||||
|
Qbs_dT += model->HSMHV_pbswgs * czbsswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgs) ; |
||||
|
Capbs += czbsswg * sarg ; |
||||
|
} |
||||
|
} else { |
||||
|
T1 = czbs + czbsswg ; |
||||
|
T1_dT = czbs_dT + czbsswg_dT ; |
||||
|
T2 = czbs * model->HSMHV_mjs / model->HSMHV_pbs |
||||
|
+ czbsswg * model->HSMHV_mjswgs / model->HSMHV_pbswgs ; |
||||
|
T2_dT = czbs_dT * model->HSMHV_mjs / model->HSMHV_pbs |
||||
|
+ czbsswg_dT * model->HSMHV_mjswgs / model->HSMHV_pbswgs ; |
||||
|
Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ; |
||||
|
Qbs_dT = vbs_jct * (T1_dT + vbs_jct * 0.5 * T2_dT) ; |
||||
|
Capbs = T1 + vbs_jct * T2 ; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* Drain Bulk Junction */ |
||||
|
tcjbd = model->HSMHV_tcjbd ; |
||||
|
tcjbdsw = model->HSMHV_tcjbdsw ; |
||||
|
tcjbdswg = model->HSMHV_tcjbdswg ; |
||||
|
|
||||
|
czbd = model->HSMHV_cjd * here->HSMHV_ad ; |
||||
|
czbd = czbd * ( 1.0 + tcjbd * ( TTEMP - model->HSMHV_ktnom )) ; |
||||
|
czbd_dT = ( model->HSMHV_cjd * here->HSMHV_ad ) * tcjbd ; |
||||
|
|
||||
|
if (here->HSMHV_pd > here->HSMHV_weff_nf) { |
||||
|
|
||||
|
czbdsw = model->HSMHV_cjswd * ( here->HSMHV_pd - here->HSMHV_weff_nf ) ; |
||||
|
czbdsw = czbdsw * ( 1.0 + tcjbdsw * ( TTEMP - model->HSMHV_ktnom )) ; |
||||
|
czbdsw_dT = ( model->HSMHV_cjswd * ( here->HSMHV_pd - here->HSMHV_weff_nf )) * tcjbdsw ; |
||||
|
|
||||
|
czbdswg = model->HSMHV_cjswgd * here->HSMHV_weff_nf ; |
||||
|
czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSMHV_ktnom )) ; |
||||
|
czbdswg_dT = ( model->HSMHV_cjswgd * here->HSMHV_weff_nf ) * tcjbdswg ; |
||||
|
|
||||
|
// if (vbd_jct == 0.0) { |
||||
|
if (0) { |
||||
|
Qbd = 0.0 ; |
||||
|
Qbd_dT = 0.0 ; |
||||
|
Capbd = czbd + czbdsw + czbdswg ; |
||||
|
} else if (vbd_jct < 0.0) { |
||||
|
if (czbd > 0.0) { |
||||
|
arg = 1.0 - vbd_jct / model->HSMHV_pbd ; |
||||
|
if (model->HSMHV_mjd == 0.5) |
||||
|
sarg = 1.0 / sqrt(arg) ; |
||||
|
else |
||||
|
sarg = Fn_Pow( arg , -model->HSMHV_mjd ) ; |
||||
|
Qbd = model->HSMHV_pbd * czbd * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjd) ; |
||||
|
Qbd_dT = model->HSMHV_pbd * czbd_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjd) ; |
||||
|
Capbd = czbd * sarg ; |
||||
|
} else { |
||||
|
Qbd = 0.0 ; |
||||
|
Qbd_dT = 0.0 ; |
||||
|
Capbd = 0.0 ; |
||||
|
} |
||||
|
if (czbdsw > 0.0) { |
||||
|
arg = 1.0 - vbd_jct / model->HSMHV_pbswd ; |
||||
|
if (model->HSMHV_mjswd == 0.5) |
||||
|
sarg = 1.0 / sqrt(arg) ; |
||||
|
else |
||||
|
sarg = Fn_Pow( arg , -model->HSMHV_mjswd ) ; |
||||
|
Qbd += model->HSMHV_pbswd * czbdsw * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswd) ; |
||||
|
Qbd_dT += model->HSMHV_pbswd * czbdsw_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswd) ; |
||||
|
Capbd += czbdsw * sarg ; |
||||
|
} |
||||
|
if (czbdswg > 0.0) { |
||||
|
arg = 1.0 - vbd_jct / model->HSMHV_pbswgd ; |
||||
|
if (model->HSMHV_mjswgd == 0.5) |
||||
|
sarg = 1.0 / sqrt(arg) ; |
||||
|
else |
||||
|
sarg = Fn_Pow( arg , -model->HSMHV_mjswgd ) ; |
||||
|
Qbd += model->HSMHV_pbswgd * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgd) ; |
||||
|
Qbd_dT += model->HSMHV_pbswgd * czbdswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgd) ; |
||||
|
Capbd += czbdswg * sarg ; |
||||
|
|
||||
|
} |
||||
|
} else { |
||||
|
T1 = czbd + czbdsw + czbdswg ; |
||||
|
T1_dT = czbd_dT + czbdsw_dT + czbdswg_dT ; |
||||
|
T2 = czbd * model->HSMHV_mjd / model->HSMHV_pbd |
||||
|
+ czbdsw * model->HSMHV_mjswd / model->HSMHV_pbswd |
||||
|
+ czbdswg * model->HSMHV_mjswgd / model->HSMHV_pbswgd ; |
||||
|
T2_dT = czbd_dT * model->HSMHV_mjd / model->HSMHV_pbd |
||||
|
+ czbdsw_dT * model->HSMHV_mjswd / model->HSMHV_pbswd |
||||
|
+ czbdswg_dT * model->HSMHV_mjswgd / model->HSMHV_pbswgd ; |
||||
|
Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ; |
||||
|
Qbd_dT = vbd_jct * (T1_dT + vbd_jct * 0.5 * T2_dT) ; |
||||
|
Capbd = T1 + vbd_jct * T2 ; |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
czbdswg = model->HSMHV_cjswgd * here->HSMHV_pd ; |
||||
|
czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSMHV_ktnom )) ; |
||||
|
czbdswg_dT = ( model->HSMHV_cjswgd * here->HSMHV_pd ) * tcjbdswg ; |
||||
|
|
||||
|
// if (vbd_jct == 0.0) { |
||||
|
if (0) { |
||||
|
Qbd = 0.0 ; |
||||
|
Qbd_dT = 0.0 ; |
||||
|
Capbd = czbd + czbdswg ; |
||||
|
} else if (vbd_jct < 0.0) { |
||||
|
if (czbd > 0.0) { |
||||
|
arg = 1.0 - vbd_jct / model->HSMHV_pbd ; |
||||
|
if (model->HSMHV_mjd == 0.5) |
||||
|
sarg = 1.0 / sqrt(arg) ; |
||||
|
else |
||||
|
sarg = Fn_Pow( arg , -model->HSMHV_mjd ) ; |
||||
|
Qbd = model->HSMHV_pbd * czbd * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjd) ; |
||||
|
Qbd_dT = model->HSMHV_pbd * czbd_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjd) ; |
||||
|
Capbd = czbd * sarg ; |
||||
|
} else { |
||||
|
Qbd = 0.0 ; |
||||
|
Qbd_dT = 0.0 ; |
||||
|
Capbd = 0.0 ; |
||||
|
} |
||||
|
if (czbdswg > 0.0) { |
||||
|
arg = 1.0 - vbd_jct / model->HSMHV_pbswgd ; |
||||
|
if (model->HSMHV_mjswgd == 0.5) |
||||
|
sarg = 1.0 / sqrt(arg) ; |
||||
|
else |
||||
|
sarg = Fn_Pow( arg , -model->HSMHV_mjswgd ) ; |
||||
|
Qbd += model->HSMHV_pbswgd * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgd) ; |
||||
|
Qbd_dT += model->HSMHV_pbswgd * czbdswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgd) ; |
||||
|
Capbd += czbdswg * sarg ; |
||||
|
} |
||||
|
} else { |
||||
|
T1 = czbd + czbdswg ; |
||||
|
T1_dT = czbd_dT + czbdswg_dT ; |
||||
|
T2 = czbd * model->HSMHV_mjd / model->HSMHV_pbd |
||||
|
+ czbdswg * model->HSMHV_mjswgd / model->HSMHV_pbswgd ; |
||||
|
T2_dT = czbd_dT * model->HSMHV_mjd / model->HSMHV_pbd |
||||
|
+ czbdswg_dT * model->HSMHV_mjswgd / model->HSMHV_pbswgd ; |
||||
|
Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ; |
||||
|
Qbd_dT = vbd_jct * (T1_dT + vbd_jct * 0.5 * T2_dT) ; |
||||
|
Capbd = T1 + vbd_jct * T2 ; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/*---------------------------------------------------* |
||||
|
* Junction diode. |
||||
|
*-----------------*/ |
||||
|
here->HSMHV_ibs = Mfactor * Ibs ; |
||||
|
here->HSMHV_ibd = Mfactor * Ibd ; |
||||
|
here->HSMHV_gbs = Mfactor * Gbs ; |
||||
|
here->HSMHV_gbd = Mfactor * Gbd ; |
||||
|
*(ckt->CKTstate0 + here->HSMHVqbs) = Mfactor * Qbs ; |
||||
|
*(ckt->CKTstate0 + here->HSMHVqbd) = Mfactor * Qbd ; |
||||
|
here->HSMHV_capbs = Mfactor * Capbs ; |
||||
|
here->HSMHV_capbd = Mfactor * Capbd ; |
||||
|
|
||||
|
here->HSMHV_gbdT = Mfactor * Ibd_dT ; |
||||
|
here->HSMHV_gbsT = Mfactor * Ibs_dT ; |
||||
|
here->HSMHV_gcbdT = Mfactor * Qbd_dT ; |
||||
|
here->HSMHV_gcbsT = Mfactor * Qbs_dT ; |
||||
|
|
||||
|
/*-----------------------------------------------------------* |
||||
|
* Warn floating-point exceptions. |
||||
|
* - Function finite() in libm is called. |
||||
|
*-----------------*/ |
||||
|
T1 = here->HSMHV_ibs + here->HSMHV_ibd + here->HSMHV_gbs + here->HSMHV_gbd; |
||||
|
T1 = T1 + *(ckt->CKTstate0 + here->HSMHVqbs) |
||||
|
+ *(ckt->CKTstate0 + here->HSMHVqbd) |
||||
|
+ here->HSMHV_capbs |
||||
|
+ here->HSMHV_capbd; |
||||
|
if ( ! finite (T1) ) { |
||||
|
flg_err = 1 ; |
||||
|
fprintf(stderr , |
||||
|
"*** warning(HiSIM_HV(%s)): FP-exception (junction diode)\n",model->HSMHVmodName) ; |
||||
|
if ( flg_info >= 1 ) { |
||||
|
printf ("*** warning(HiSIM_HV(%s)): FP-exception\n",model->HSMHVmodName) ; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/*-----------------------------------------------------------* |
||||
|
* End of HSMHVeval_dio |
||||
|
*-----------------*/ |
||||
|
|
||||
|
return ( HiSIM_OK ) ; |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,656 @@ |
|||||
|
/*********************************************************************** |
||||
|
|
||||
|
HiSIM (Hiroshima University STARC IGFET Model) |
||||
|
Copyright (C) 2014 Hiroshima University & STARC |
||||
|
|
||||
|
MODEL NAME : HiSIM_HV |
||||
|
( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) |
||||
|
Model Parameter 'VERSION' : 2.20 |
||||
|
FILE : hsmhveval_rdrift.c |
||||
|
|
||||
|
DATE : 2014.6.11 |
||||
|
|
||||
|
released by |
||||
|
Hiroshima University & |
||||
|
Semiconductor Technology Academic Research Center (STARC) |
||||
|
***********************************************************************/ |
||||
|
|
||||
|
/********************************************************************** |
||||
|
|
||||
|
The following source code, and all copyrights, trade secrets or other |
||||
|
intellectual property rights in and to the source code in its entirety, |
||||
|
is owned by the Hiroshima University and the STARC organization. |
||||
|
|
||||
|
All users need to follow the "HISIM_HV Distribution Statement and |
||||
|
Copyright Notice" attached to HiSIM_HV model. |
||||
|
|
||||
|
-----HISIM_HV Distribution Statement and Copyright Notice-------------- |
||||
|
|
||||
|
Software is distributed as is, completely without warranty or service |
||||
|
support. Hiroshima University or STARC and its employees are not liable |
||||
|
for the condition or performance of the software. |
||||
|
|
||||
|
Hiroshima University and STARC own the copyright and grant users a perpetual, |
||||
|
irrevocable, worldwide, non-exclusive, royalty-free license with respect |
||||
|
to the software as set forth below. |
||||
|
|
||||
|
Hiroshima University and STARC hereby disclaims all implied warranties. |
||||
|
|
||||
|
Hiroshima University and STARC grant the users the right to modify, copy, |
||||
|
and redistribute the software and documentation, both within the user's |
||||
|
organization and externally, subject to the following restrictions |
||||
|
|
||||
|
1. The users agree not to charge for Hiroshima University and STARC code |
||||
|
itself but may charge for additions, extensions, or support. |
||||
|
|
||||
|
2. In any product based on the software, the users agree to acknowledge |
||||
|
Hiroshima University and STARC that developed the software. This |
||||
|
acknowledgment shall appear in the product documentation. |
||||
|
|
||||
|
3. The users agree to reproduce any copyright notice which appears on |
||||
|
the software on any copy or modification of such made available |
||||
|
to others." |
||||
|
|
||||
|
Toshimasa Asahara, President, Hiroshima University |
||||
|
Mitiko Miura-Mattausch, Professor, Hiroshima University |
||||
|
Katsuhiro Shimohigashi, President&CEO, STARC |
||||
|
June 2008 (revised October 2011) |
||||
|
*************************************************************************/ |
||||
|
|
||||
|
/*===========================================================* |
||||
|
* Preamble. |
||||
|
*=================*/ |
||||
|
/*---------------------------------------------------* |
||||
|
* Header files. |
||||
|
*-----------------*/ |
||||
|
#include "ngspice/ngspice.h" |
||||
|
#ifdef __STDC__ |
||||
|
/* #include <ieeefp.h> */ |
||||
|
#endif |
||||
|
|
||||
|
/*-----------------------------------* |
||||
|
* HiSIM macros |
||||
|
*-----------------*/ |
||||
|
#include "hisimhv.h" |
||||
|
#include "hsmhvevalenv.h" |
||||
|
|
||||
|
/* local variables used in macro functions */ |
||||
|
double TMF0 , TMF1 , TMF2 , TMF3 , TMF4 , TMF5 , TMF6 ; |
||||
|
|
||||
|
/*===========================================================* |
||||
|
* pow |
||||
|
*=================*/ |
||||
|
#ifdef POW_TO_EXP_AND_LOG |
||||
|
#define Fn_Pow( x , y ) exp( y * log( x ) ) |
||||
|
#else |
||||
|
#define Fn_Pow( x , y ) pow( x , y ) |
||||
|
#endif |
||||
|
|
||||
|
/*===========================================================* |
||||
|
* Macro Functions for ceiling/flooring/symmetrization. |
||||
|
*=================*/ |
||||
|
/*---------------------------------------------------* |
||||
|
* smoothUpper: ceiling. |
||||
|
* y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) ) |
||||
|
* arg = xmax - x - delta |
||||
|
*-----------------*/ |
||||
|
|
||||
|
#define Fn_SU( y , x , xmax , delta , dx ) { \ |
||||
|
TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ |
||||
|
TMF2 = 4.0 * ( xmax ) * ( delta) ; \ |
||||
|
TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ |
||||
|
TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ |
||||
|
dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ |
||||
|
y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ |
||||
|
} |
||||
|
|
||||
|
#define Fn_SU2( y , x , xmax , delta , dy_dx , dy_dxmax ) { \ |
||||
|
TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ |
||||
|
TMF2 = 4.0 * ( xmax ) * ( delta) ; \ |
||||
|
TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ |
||||
|
TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ |
||||
|
dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ |
||||
|
dy_dxmax = 0.5 * ( 1.0 - ( TMF1 + 2.0 * delta ) / TMF2 ) ; \ |
||||
|
y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ |
||||
|
} |
||||
|
|
||||
|
/*---------------------------------------------------* |
||||
|
* smoothLower: flooring. |
||||
|
* y = xmin + 0.5 ( arg + sqrt( arg^2 + 4 xmin delta ) ) |
||||
|
* arg = x - xmin - delta |
||||
|
*-----------------*/ |
||||
|
|
||||
|
#define Fn_SL( y , x , xmin , delta , dx ) { \ |
||||
|
TMF1 = ( x ) - ( xmin ) - ( delta ) ; \ |
||||
|
TMF2 = 4.0 * ( xmin ) * ( delta ) ; \ |
||||
|
TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ |
||||
|
TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ |
||||
|
dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ |
||||
|
y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \ |
||||
|
} |
||||
|
|
||||
|
#define Fn_SL2( y , x , xmin , delta , dy_dx, dy_dxmin ) { \ |
||||
|
TMF1 = ( x ) - ( xmin ) - ( delta ) ; \ |
||||
|
TMF2 = 4.0 * ( xmin ) * ( delta ) ; \ |
||||
|
TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ |
||||
|
TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ |
||||
|
dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ |
||||
|
dy_dxmin = 0.5 * ( 1.0 - ( TMF1 - 2.0 * delta ) / TMF2 ) ; \ |
||||
|
y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \ |
||||
|
} |
||||
|
|
||||
|
/*---------------------------------------------------* |
||||
|
* smoothZero: flooring to zero. |
||||
|
* y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) ) |
||||
|
*-----------------*/ |
||||
|
|
||||
|
#define Fn_SZ( y , x , delta , dx ) { \ |
||||
|
TMF2 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta ) ) ; \ |
||||
|
dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \ |
||||
|
y = 0.5 * ( ( x ) + TMF2 ) ; \ |
||||
|
if( y < 0.0 ) { y=0.0; dx=0.0; } \ |
||||
|
} |
||||
|
|
||||
|
/*---------------------------------------------------* |
||||
|
* SymAdd: evaluate additional term for symmetry. |
||||
|
*-----------------*/ |
||||
|
|
||||
|
#define Fn_SymAdd( y , x , add0 , dx ) \ |
||||
|
{ \ |
||||
|
if( ( x ) < 1e6 ) { \ |
||||
|
TMF1 = 2.0 * ( x ) / ( add0 ) ; \ |
||||
|
TMF2 = 1.0 + TMF1 * ( (1.0/2) + TMF1 * ( (1.0/6) \ |
||||
|
+ TMF1 * ( (1.0/24) + TMF1 * ( (1.0/120) \ |
||||
|
+ TMF1 * ( (1.0/720) + TMF1 * (1.0/5040) ) ) ) ) ) ; \ |
||||
|
TMF3 = (1.0/2) + TMF1 * ( (1.0/3) \ |
||||
|
+ TMF1 * ( (1.0/8) + TMF1 * ( (1.0/30) \ |
||||
|
+ TMF1 * ( (1.0/144) + TMF1 * (1.0/840) ) ) ) ) ; \ |
||||
|
y = add0 / TMF2 ; \ |
||||
|
dx = - 2.0 * TMF3 / ( TMF2 * TMF2 ) ; \ |
||||
|
} else { y=0.0; dx=0.9; } \ |
||||
|
} |
||||
|
|
||||
|
#define Fn_CP( y , x , xmax , pw , dx ) { \ |
||||
|
double x2 = (x) * (x) ; \ |
||||
|
double xmax2 = (xmax) * (xmax) ; \ |
||||
|
double xp = 1.0 , xmp = 1.0 ; \ |
||||
|
int m =0, mm =0; \ |
||||
|
double arg =0.0, dnm =0.0; \ |
||||
|
for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \ |
||||
|
arg = xp + xmp ; \ |
||||
|
dnm = arg ; \ |
||||
|
if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \ |
||||
|
if ( pw == 1 ) { mm = 1 ; \ |
||||
|
} else if ( pw == 2 ) { mm = 2 ; \ |
||||
|
} else if ( pw == 4 ) { mm = 3 ; \ |
||||
|
} else if ( pw == 8 ) { mm = 4 ; } \ |
||||
|
for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \ |
||||
|
} else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \ |
||||
|
dnm = 1.0 / dnm ; \ |
||||
|
y = (x) * (xmax) * dnm ; \ |
||||
|
dx = (xmax) * xmp * dnm / arg ; \ |
||||
|
} |
||||
|
|
||||
|
#define Fn_SU_CP( y , x , xmax , delta , pw , dx ) { \ |
||||
|
if(x > xmax - delta && delta >= 0.0) { \ |
||||
|
TMF1 = x - xmax + delta ; \ |
||||
|
Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ |
||||
|
y = xmax - delta + TMF0 ; \ |
||||
|
dx = dx ; \ |
||||
|
} else { \ |
||||
|
y = x ; \ |
||||
|
dx = 1.0 ; \ |
||||
|
} \ |
||||
|
} |
||||
|
|
||||
|
/*===========================================================* |
||||
|
* Function hsmhvrdrift. |
||||
|
*=================*/ |
||||
|
|
||||
|
int HSMHVrdrift |
||||
|
( |
||||
|
double Vddp, |
||||
|
double Vds, |
||||
|
double Vbs, |
||||
|
double Vsubs, /* substrate-source voltage */ |
||||
|
double deltemp, |
||||
|
HSMHVinstance *here, |
||||
|
HSMHVmodel *model, |
||||
|
CKTcircuit *ckt |
||||
|
) |
||||
|
{ |
||||
|
HSMHVbinningParam *pParam = &here->pParam ; |
||||
|
HSMHVmodelMKSParam *modelMKS = &model->modelMKS ; |
||||
|
|
||||
|
const double small = 1.0e-50 ; |
||||
|
|
||||
|
double Mfactor =0.0, WeffLD_nf =0.0 ; |
||||
|
double Ldrift =0.0, Xldld =0.0 ; |
||||
|
double Nover =0.0 ; |
||||
|
|
||||
|
/* temporary vars. & derivatives*/ |
||||
|
double T0 =0.0, T0_dVb =0.0, T0_dVd =0.0, T0_dVg =0.0, T0_dT =0.0 ; |
||||
|
double T1 =0.0, T1_dVd =0.0, T1_dT =0.0, T1_dVddp =0.0 ; |
||||
|
double T2 =0.0, T2_dVb =0.0, T2_dVd =0.0, T2_dT =0.0, T2_dVddp =0.0 ; |
||||
|
double T3 =0.0, T3_dT =0.0, T3_dVddp =0.0 ; |
||||
|
double T4 =0.0, T4_dT =0.0, T4_dVddp =0.0 ; |
||||
|
double T5 =0.0, T5_dT =0.0, T5_dVddp =0.0 ; |
||||
|
double T6 =0.0, T6_dT =0.0, T6_dVddp =0.0 ; |
||||
|
double T9 =0.0 ; |
||||
|
|
||||
|
/* bias-dependent Rd, Rs */ |
||||
|
|
||||
|
double Edri =0.0, Edri_dVddp =0.0 ; |
||||
|
double Vdri =0.0, Vdri_dVddp =0.0, Vdri_dT =0.0 ; |
||||
|
double Vmax =0.0, Vmax_dT =0.0 ; |
||||
|
double Mu0 =0.0, Mu0_dT =0.0 ; |
||||
|
double Cx =0.0, Cx_dT =0.0 ; |
||||
|
double Car =0.0, Car_dT =0.0 ; |
||||
|
double Mu =0.0, Mu_dVddp = 0.0, Mu_dT =0.0 ; |
||||
|
double Xov =0.0, Xov_dVds =0.0, Xov_dVgs =0.0, Xov_dVbs =0.0, Xov_dT =0.0 ; |
||||
|
double Carr =0.0, Carr_dVds=0.0, Carr_dVgs=0.0, Carr_dVbs=0.0, Carr_dVddp =0.0, Carr_dT =0.0 ; |
||||
|
|
||||
|
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 ; |
||||
|
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 ; |
||||
|
double Vddpz=0.0, Vddpz_dVddp=0.0, Vzadd =0.0, Vzadd_dVddp=0.0 ; |
||||
|
|
||||
|
/* temperature-dependent variables for SHE model */ |
||||
|
double TTEMP =0.0, TTEMP0 =0.0 ; |
||||
|
|
||||
|
/* Wdepl and Wjunc */ |
||||
|
double Wdepl, Wdepl_dVd, Wdepl_dVg, Wdepl_dVb, Wdepl_dT; |
||||
|
double Wjunc0, Wjunc0_dVd, Wjunc0_dVb; |
||||
|
double Wrdrdjunc, Wjunc, Wjunc_dVd, Wjunc_dVb; |
||||
|
|
||||
|
const double Res_min = 1.0e-4 ; |
||||
|
const double epsm10 = 10.0e0 * C_EPS_M ; |
||||
|
const double ps_conv = 1.0e-12 ; |
||||
|
|
||||
|
double Rdrbb_dT =0.0 ; |
||||
|
|
||||
|
double Wdep = 0.0, Wdep_dVdserev = 0.0, Wdep_dVsubsrev = 0.0 ; |
||||
|
double T1_dVdserev = 0.0, T1_dVsubsrev = 0.0, T6_dVdserev = 0.0, T6_dVsubsrev = 0.0 ; |
||||
|
double Rd_dVsubs=0.0 ; |
||||
|
|
||||
|
#define C_sub_delta 0.1 /* CHECK! */ |
||||
|
#define C_sub_delta2 1.0e-9 /* CHECK! */ |
||||
|
|
||||
|
NG_IGNORE(Vsubs); |
||||
|
|
||||
|
/*================ Start of executable code.=================*/ |
||||
|
|
||||
|
/*-----------------------------------------------------------* |
||||
|
* Temperature dependent constants. |
||||
|
*-----------------*/ |
||||
|
if ( here->HSMHVtempNode > 0 && pParam->HSMHV_rth0 != 0.0 ) { |
||||
|
|
||||
|
#define HSMHVEVAL |
||||
|
#include "hsmhvtemp_eval_rdri.h" |
||||
|
|
||||
|
} else { |
||||
|
if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; } |
||||
|
Mu0_dT = 0.0 ; |
||||
|
Vmax_dT = 0.0 ; |
||||
|
Cx_dT = 0.0 ; |
||||
|
Car_dT = 0.0 ; |
||||
|
Rdrbb_dT = 0.0 ; |
||||
|
} |
||||
|
|
||||
|
Mfactor = here->HSMHV_m ; |
||||
|
WeffLD_nf = here->HSMHV_weff_ld * here->HSMHV_nf ; |
||||
|
Ldrift = here->HSMHV_ldrift1 + here->HSMHV_ldrift2 ; |
||||
|
Xldld = model->HSMHV_xldld + small ; |
||||
|
Nover = pParam->HSMHV_nover ; |
||||
|
|
||||
|
|
||||
|
Mu0 = here->HSMHV_rdrmue * here->HSMHV_rdrmuel ; |
||||
|
Mu0_dT = Mu0_dT * here->HSMHV_rdrmuel ; |
||||
|
Vmax = here->HSMHV_rdrvmax * here->HSMHV_rdrvmaxw * here->HSMHV_rdrvmaxl + small ; |
||||
|
Vmax_dT = Vmax_dT * here->HSMHV_rdrvmaxw * here->HSMHV_rdrvmaxl ; |
||||
|
Cx = here->HSMHV_rdrcx * here->HSMHV_rdrcxw ; |
||||
|
Cx_dT = Cx_dT * here->HSMHV_rdrcxw ; |
||||
|
Car = here->HSMHV_rdrcar ; |
||||
|
|
||||
|
//-----------------------------------------------------------* |
||||
|
// Modified bias introduced to realize symmetry at Vddp=0. |
||||
|
//-----------------// |
||||
|
if(Vddp < 0) { |
||||
|
Fn_SymAdd( Vzadd , -Vddp / 2 , model->HSMHV_vzadd0 , T2 ) ; |
||||
|
Vzadd_dVddp = - T2 / 2.0 ; |
||||
|
if( Vzadd < ps_conv ) { |
||||
|
Vzadd = ps_conv ; |
||||
|
Vzadd_dVddp = 0.0 ; |
||||
|
} |
||||
|
Vddpz = Vddp - 2 * Vzadd ; |
||||
|
Vddpz_dVddp = 1.0 - 2 * Vzadd_dVddp ; |
||||
|
} else { |
||||
|
Fn_SymAdd( Vzadd , Vddp / 2 , model->HSMHV_vzadd0 , T2 ) ; |
||||
|
Vzadd_dVddp = T2 / 2.0 ; |
||||
|
if( Vzadd < ps_conv ) { |
||||
|
Vzadd = ps_conv ; |
||||
|
Vzadd_dVddp = 0.0 ; |
||||
|
} |
||||
|
Vddpz = Vddp + 2 * Vzadd ; |
||||
|
Vddpz_dVddp = 1.0 + 2 * Vzadd_dVddp ; |
||||
|
} |
||||
|
|
||||
|
Edri = Vddpz / Ldrift ; |
||||
|
Edri_dVddp = Vddpz_dVddp / Ldrift ; |
||||
|
|
||||
|
Vdri = Mu0 * Edri ; |
||||
|
Vdri_dVddp = Mu0 * Edri_dVddp ; |
||||
|
Vdri_dT = Mu0_dT * Edri ; |
||||
|
|
||||
|
/*-----------------------------------------------------------* |
||||
|
* Mu : mobility |
||||
|
*-----------------*/ |
||||
|
if ( Vddp >= 0 ) { |
||||
|
T1 = Vdri / Vmax ; |
||||
|
T1_dVddp = Vdri_dVddp / Vmax ; |
||||
|
T1_dT = ( Vdri_dT * Vmax - Vdri * Vmax_dT ) / ( Vmax * Vmax ); |
||||
|
} else { |
||||
|
T1 = - Vdri / Vmax ; |
||||
|
T1_dVddp = - Vdri_dVddp / Vmax ; |
||||
|
T1_dT = - ( Vdri_dT * Vmax - Vdri * Vmax_dT ) / ( Vmax * Vmax ); |
||||
|
} |
||||
|
|
||||
|
if( model->HSMHV_rdrbbtmp == 0.0 ) { |
||||
|
if( T1 == 0.0 ) { |
||||
|
T2 = 0.0 ; T2_dT = 0.0 ; T2_dVddp = 0.0 ; |
||||
|
T4 = 1.0 ; T4_dT = 0.0 ; T4_dVddp = 0.0 ; |
||||
|
}else { |
||||
|
if ( 1.0e0 - epsm10 <= here->HSMHV_rdrbb && here->HSMHV_rdrbb <= 1.0e0 + epsm10 ) { |
||||
|
T3 = 1.0e0 ; |
||||
|
T3_dT = 0.0e0 ; |
||||
|
T3_dVddp = 0.0e0 ; |
||||
|
} else if ( 2.0e0 - epsm10 <= here->HSMHV_rdrbb && here->HSMHV_rdrbb <= 2.0e0 + epsm10 ) { |
||||
|
T3 = T1 ; |
||||
|
T3_dT = T1_dT ; |
||||
|
T3_dVddp = T1_dVddp ; |
||||
|
} else { |
||||
|
T3 = Fn_Pow( T1 , here->HSMHV_rdrbb - 1.0e0 ) ; |
||||
|
T3_dT = ( here->HSMHV_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV_rdrbb - 2.0e0 ) * T1_dT ; |
||||
|
T3_dVddp = ( here->HSMHV_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV_rdrbb - 2.0e0 ) * T1_dVddp ; |
||||
|
} |
||||
|
T2 = T1 * T3 ; |
||||
|
T2_dT = T1 * T3_dT + T3 * T1_dT ; |
||||
|
T2_dVddp = T1 * T3_dVddp + T3 * T1_dVddp ; |
||||
|
T4 = 1.0e0 + T2 ; |
||||
|
T4_dT = T2_dT ; |
||||
|
T4_dVddp = T2_dVddp ; |
||||
|
} |
||||
|
|
||||
|
if ( 1.0e0 - epsm10 <= here->HSMHV_rdrbb && here->HSMHV_rdrbb <= 1.0e0 + epsm10 ) { |
||||
|
T5 = 1.0 / T4 ; |
||||
|
T5_dT = - T5 * T5 * T4_dT ; |
||||
|
T5_dVddp = - T5 * T5 * T4_dVddp ; |
||||
|
} else if ( 2.0e0 - epsm10 <= here->HSMHV_rdrbb && here->HSMHV_rdrbb <= 2.0e0 + epsm10 ) { |
||||
|
T5 = 1.0 / sqrt( T4 ) ; |
||||
|
T5_dT = - 0.5e0 / ( T4 * sqrt(T4) ) * T4_dT ; |
||||
|
T5_dVddp = - 0.5e0 / ( T4 * sqrt(T4) ) * T4_dVddp; |
||||
|
} else { |
||||
|
T6 = Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV_rdrbb - 1.0e0 ) ) ; |
||||
|
T5 = T4 * T6 ; |
||||
|
T6_dT = ( - 1.0e0 / here->HSMHV_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV_rdrbb - 2.0e0 ) ) * T4_dT ; |
||||
|
T6_dVddp = ( - 1.0e0 / here->HSMHV_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV_rdrbb - 2.0e0 ) ) * T4_dVddp ; |
||||
|
T5_dT = T4_dT * T6 + T4 * T6_dT ; |
||||
|
T5_dVddp = T4_dVddp * T6 + T4 * T6_dVddp ; |
||||
|
} |
||||
|
|
||||
|
} else { |
||||
|
if( T1 == 0.0 ) { |
||||
|
T2 = 0.0 ; T2_dT = 0.0 ; T2_dVddp = 0.0 ; |
||||
|
T4 = 1.0 ; T4_dT = 0.0 ; T4_dVddp = 0.0 ; |
||||
|
}else { |
||||
|
T3 = Fn_Pow( T1 , here->HSMHV_rdrbb - 1.0e0 ) ; |
||||
|
T3_dT = ( here->HSMHV_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV_rdrbb - 2.0e0 ) * T1_dT + T3*log(T1)*Rdrbb_dT ; |
||||
|
T3_dVddp = ( here->HSMHV_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV_rdrbb - 2.0e0 ) * T1_dVddp ; |
||||
|
T2 = T1 * T3 ; |
||||
|
T2_dT = T1 * T3_dT + T3 * T1_dT ; |
||||
|
T2_dVddp = T1 * T3_dVddp + T3 * T1_dVddp ; |
||||
|
T4 = 1.0e0 + T2 ; |
||||
|
T4_dT = T2_dT ; |
||||
|
T4_dVddp = T2_dVddp ; |
||||
|
} |
||||
|
T6 = Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV_rdrbb - 1.0e0 ) ) ; |
||||
|
T5 = T4 * T6 ; |
||||
|
T6_dT = ( - 1.0e0 / here->HSMHV_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV_rdrbb - 2.0e0 ) ) * T4_dT +T6*log(T4)/here->HSMHV_rdrbb/here->HSMHV_rdrbb*Rdrbb_dT ; |
||||
|
T6_dVddp = ( - 1.0e0 / here->HSMHV_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV_rdrbb - 2.0e0 ) ) * T4_dVddp ; |
||||
|
T5_dT = T4_dT * T6 + T4 * T6_dT ; |
||||
|
T5_dVddp = T4_dVddp * T6 + T4 * T6_dVddp ; |
||||
|
} |
||||
|
|
||||
|
Mu = Mu0 * T5 ; |
||||
|
Mu_dVddp = Mu0 * T5_dVddp ; |
||||
|
Mu_dT = Mu0_dT * T5 + Mu0 * T5_dT ; |
||||
|
|
||||
|
/*-----------------------------------------------------------* |
||||
|
* Carr : carrier density |
||||
|
*-----------------*/ |
||||
|
|
||||
|
T4 = 1.0e0 + T1 ; |
||||
|
T4_dVddp = T1_dVddp ; |
||||
|
T4_dT = T1_dT ; |
||||
|
|
||||
|
T5 = 1.0 / T4 ; |
||||
|
T5_dVddp = - T5 * T5 * T4_dVddp ; |
||||
|
T5_dT = - T5 * T5 * T4_dT ; |
||||
|
|
||||
|
Carr = Nover * ( 1.0 + Car * ( 1.0 - T5 ) * Vddpz / ( Ldrift - model->HSMHV_rdrdl2 ) ) ; |
||||
|
Carr_dVddp = Nover * Car * ( - T5_dVddp * Vddpz + ( 1.0 - T5 ) * Vddpz_dVddp ) / ( Ldrift - model->HSMHV_rdrdl2 ) ; |
||||
|
Carr_dT = Nover * ( Car_dT * ( 1.0 - T5 ) + Car * ( - T5_dT ) ) * Vddpz / ( Ldrift - model->HSMHV_rdrdl2 ) ; |
||||
|
|
||||
|
Carr += - here->HSMHV_QbuLD / C_QE * model->HSMHV_rdrqover; |
||||
|
Carr_dVds = - here->HSMHV_QbuLD_dVds / C_QE * model->HSMHV_rdrqover; |
||||
|
Carr_dVgs = - here->HSMHV_QbuLD_dVgs / C_QE * model->HSMHV_rdrqover; |
||||
|
Carr_dVbs = - here->HSMHV_QbuLD_dVbs / C_QE * model->HSMHV_rdrqover; |
||||
|
Carr_dT += - here->HSMHV_QbuLD_dTi / C_QE * model->HSMHV_rdrqover; |
||||
|
|
||||
|
/*-----------------------------------------------------------* |
||||
|
* Xov : depth of the current flow |
||||
|
*-----------------*/ |
||||
|
T0 = -here->HSMHV_Ps0LD ; |
||||
|
T0_dVd = -here->HSMHV_Ps0LD_dVds ; |
||||
|
T0_dVg = -here->HSMHV_Ps0LD_dVgs ; |
||||
|
T0_dVb = -here->HSMHV_Ps0LD_dVbs ; |
||||
|
T0_dT = -here->HSMHV_Ps0LD_dTi ; |
||||
|
|
||||
|
Fn_SZ( T0 , T0 , 1.0e-2 , T9 ) ; |
||||
|
T0 += epsm10 ; |
||||
|
T0_dVd *= T9 ; |
||||
|
T0_dVg *= T9 ; |
||||
|
T0_dVb *= T9 ; |
||||
|
T0_dT *= T9 ; |
||||
|
|
||||
|
Wdepl = sqrt ( here->HSMHV_kdep * T0 ) ; |
||||
|
Wdepl_dVd = here->HSMHV_kdep / ( 2.0 * Wdepl ) * T0_dVd ; |
||||
|
Wdepl_dVg = here->HSMHV_kdep / ( 2.0 * Wdepl ) * T0_dVg ; |
||||
|
Wdepl_dVb = here->HSMHV_kdep / ( 2.0 * Wdepl ) * T0_dVb ; |
||||
|
Wdepl_dT = here->HSMHV_kdep / ( 2.0 * Wdepl ) * T0_dT ; |
||||
|
|
||||
|
T2 = Vds - Vbs + model->HSMHV_vbi ; |
||||
|
T2_dVd = 1.0 ; |
||||
|
T2_dVb = -1.0 ; |
||||
|
|
||||
|
Fn_SZ( T2 , T2 , 1.0e-2 , T9 ) ; |
||||
|
T2 += epsm10 ; |
||||
|
T2_dVd *= T9 ; |
||||
|
T2_dVb *= T9 ; |
||||
|
|
||||
|
Wjunc0 = sqrt ( here->HSMHV_kjunc * T2 ) ; |
||||
|
Wjunc0_dVd = here->HSMHV_kjunc / ( 2.0 * Wjunc0 ) * T2_dVd ; |
||||
|
Wjunc0_dVb = here->HSMHV_kjunc / ( 2.0 * Wjunc0 ) * T2_dVb ; |
||||
|
Fn_SU( Wjunc, Wjunc0, Xldld, 10e-3*Xldld, T0 ); |
||||
|
Wjunc_dVd = Wjunc0_dVd * T0; |
||||
|
Wjunc_dVb = Wjunc0_dVb * T0; |
||||
|
// Wrdrdjunc = model->HSMHV_rdrdjunc + small ; |
||||
|
Wrdrdjunc = model->HSMHV_rdrdjunc + epsm10 ; |
||||
|
|
||||
|
|
||||
|
Xov = here->HSMHV_Xmax - Cx * ( here->HSMHV_Xmax |
||||
|
/ Wrdrdjunc * Wdepl + here->HSMHV_Xmax / Xldld * Wjunc ) ; |
||||
|
Xov_dVds = - Cx * here->HSMHV_Xmax / Wrdrdjunc * Wdepl_dVd |
||||
|
- Cx * here->HSMHV_Xmax / Xldld * Wjunc_dVd ; |
||||
|
Xov_dVgs = - Cx * here->HSMHV_Xmax / Wrdrdjunc * Wdepl_dVg ; |
||||
|
Xov_dVbs = - Cx * here->HSMHV_Xmax / Wrdrdjunc * Wdepl_dVb |
||||
|
- Cx * here->HSMHV_Xmax / Xldld * Wjunc_dVb ; |
||||
|
Xov_dT = - Cx_dT * ( here->HSMHV_Xmax |
||||
|
/ Wrdrdjunc * Wdepl + here->HSMHV_Xmax / Xldld * Wjunc ) |
||||
|
- Cx * here->HSMHV_Xmax / Wrdrdjunc * Wdepl_dT ; |
||||
|
|
||||
|
Fn_SZ( Xov , Xov , (1.0 - here->HSMHV_rdrcx) * here->HSMHV_Xmax / 100 , T9 ) ; |
||||
|
|
||||
|
Xov_dVds *= T9 ; |
||||
|
Xov_dVgs *= T9 ; |
||||
|
Xov_dVbs *= T9 ; |
||||
|
Xov_dT *= T9 ; |
||||
|
|
||||
|
/*-----------------------------------------------------------* |
||||
|
* Rd : drift resistance |
||||
|
*-----------------*/ |
||||
|
T0 = C_QE / ( Ldrift + model->HSMHV_rdrdl1 ); |
||||
|
T1 = T0; |
||||
|
T1_dVd = 0.0 ; |
||||
|
|
||||
|
GD = T1 * Xov * Mu * Carr ; |
||||
|
GD_dVddp = T1 * Xov * Mu_dVddp * Carr |
||||
|
+ T1 * Xov * Mu * Carr_dVddp ; |
||||
|
GD_dVgse = 0.0 ; |
||||
|
GD_dT = T1 * Xov * Mu_dT * Carr |
||||
|
+ T1 * Xov_dT * Mu * Carr |
||||
|
+ T1 * Xov * Mu * Carr_dT ; |
||||
|
GD_dVds = T1 * Mu * (Xov_dVds * Carr + Xov * Carr_dVds) |
||||
|
+ T1_dVd * Mu * Xov * Carr; |
||||
|
GD_dVgs = T1 * Mu * (Xov_dVgs * Carr + Xov * Carr_dVgs); |
||||
|
GD_dVbs = T1 * Mu * (Xov_dVbs * Carr + Xov * Carr_dVbs); |
||||
|
|
||||
|
if ( GD <= 0 ) { |
||||
|
// GD = small ; |
||||
|
GD = epsm10 ; |
||||
|
GD_dVddp = 0.0 ; |
||||
|
GD_dVgse = 0.0 ; |
||||
|
GD_dT = 0.0 ; |
||||
|
GD_dVds = 0.0 ; |
||||
|
GD_dVgs = 0.0 ; |
||||
|
GD_dVbs = 0.0 ; |
||||
|
} |
||||
|
|
||||
|
Rd = 1 / GD ; |
||||
|
Rd_dVddp = - GD_dVddp * Rd * Rd ; |
||||
|
Rd_dVgse = - GD_dVgse * Rd * Rd ; |
||||
|
Rd_dT = - GD_dT * Rd * Rd ; |
||||
|
Rd_dVds = - GD_dVds * Rd * Rd ; |
||||
|
Rd_dVgs = - GD_dVgs * Rd * Rd ; |
||||
|
Rd_dVbs = - GD_dVbs * Rd * Rd ; |
||||
|
|
||||
|
/* Weff dependence of the resistances */ |
||||
|
Rd = Rd / WeffLD_nf ; |
||||
|
|
||||
|
Fn_SU_CP( Rd, Rd, 1e6, 1e3, 2, T0 ) ; |
||||
|
|
||||
|
Rd_dVddp = Rd_dVddp*T0/WeffLD_nf ; |
||||
|
Rd_dVgse = Rd_dVgse*T0/WeffLD_nf ; |
||||
|
Rd_dT = Rd_dT*T0/WeffLD_nf ; |
||||
|
Rd_dVds = Rd_dVds*T0/WeffLD_nf ; |
||||
|
Rd_dVgs = Rd_dVgs*T0/WeffLD_nf ; |
||||
|
Rd_dVbs = Rd_dVbs*T0/WeffLD_nf ; |
||||
|
|
||||
|
if ( here->HSMHVsubNode >= 0 && |
||||
|
( pParam->HSMHV_nover * ( modelMKS->HSMHV_nsubsub + pParam->HSMHV_nover ) ) > 0 ) { |
||||
|
/* external substrate node exists && LDMOS case: */ |
||||
|
/* Substrate Effect */ |
||||
|
T0 = model->HSMHV_vbisub - model->HSMHV_rdvdsub * here->HSMHV_Vdserevz - model->HSMHV_rdvsub * here->HSMHV_Vsubsrev ; |
||||
|
|
||||
|
Fn_SZ( T1, T0, 10.0, T2 ) ; |
||||
|
T1 += epsm10 ; |
||||
|
|
||||
|
T1_dVdserev = - model->HSMHV_rdvdsub * here->HSMHV_Vdserevz_dVd * T2 ; |
||||
|
T1_dVsubsrev = - model->HSMHV_rdvsub * T2 ; |
||||
|
|
||||
|
T0 = modelMKS->HSMHV_nsubsub / ( pParam->HSMHV_nover * ( modelMKS->HSMHV_nsubsub + pParam->HSMHV_nover ) ) ; |
||||
|
|
||||
|
T4 = 2 * C_ESI / C_QE * T0 ; |
||||
|
Wdep = sqrt ( T4 * T1 ) + small ; |
||||
|
|
||||
|
Wdep_dVdserev = 0.5 * T4 * T1_dVdserev / Wdep ; |
||||
|
Wdep_dVsubsrev = 0.5 * T4 * T1_dVsubsrev / Wdep ; |
||||
|
|
||||
|
Fn_SU( Wdep, Wdep, model->HSMHV_ddrift, C_sub_delta * model->HSMHV_ddrift, T0 ) ; |
||||
|
Wdep_dVdserev *= T0 ; |
||||
|
Wdep_dVsubsrev *= T0 ; |
||||
|
|
||||
|
T0 = model->HSMHV_ddrift - Wdep ; |
||||
|
Fn_SZ( T0, T0, C_sub_delta2, T2 ) ; |
||||
|
T0 += epsm10; |
||||
|
|
||||
|
T6 = (here->HSMHV_ldrift1 + here->HSMHV_ldrift2 ) / T0 ; |
||||
|
T6_dVdserev = T2 * Wdep_dVdserev * T6 / T0 ; |
||||
|
T6_dVsubsrev = T2 * Wdep_dVsubsrev * T6 / T0 ; |
||||
|
|
||||
|
T0 = Rd ; |
||||
|
Rd = T0 * T6 ; |
||||
|
Rd_dVddp = Rd_dVddp * T6 ; |
||||
|
Rd_dVgse = Rd_dVgse * T6 ; |
||||
|
Rd_dVdse = T0 * T6_dVdserev ; |
||||
|
Rd_dVbse = Rd_dVgse * T6 ; |
||||
|
|
||||
|
Rd_dVds = Rd_dVds * T6 ; |
||||
|
Rd_dVgs = Rd_dVgs * T6 ; |
||||
|
Rd_dVbs = Rd_dVbs * T6 ; |
||||
|
Rd_dVsubs = T0 * T6_dVsubsrev ; |
||||
|
Rd_dT = Rd_dT * T6 ; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
/* Sheet resistances are added. */ |
||||
|
Rd += here->HSMHV_rd0 ; |
||||
|
|
||||
|
/* Re-stamps for hsmhvnoi.c */ |
||||
|
/* Please see hsmhvnoi.c */ |
||||
|
if ( Rd > Res_min && model->HSMHV_cothrml ) |
||||
|
here->HSMHVdrainConductance = Mfactor / Rd ; |
||||
|
else here->HSMHVdrainConductance = 0.0 ; |
||||
|
if ( here->HSMHV_Rs > Res_min && model->HSMHV_cothrml ) |
||||
|
here->HSMHVsourceConductance = Mfactor / here->HSMHV_rs0 ; |
||||
|
else here->HSMHVsourceConductance = 0.0 ; |
||||
|
|
||||
|
/* Clamping to Res_min */ |
||||
|
here->HSMHV_Rs = here->HSMHV_rs0 / Mfactor ; |
||||
|
if(here->HSMHV_Rs < Res_min) { here->HSMHV_Rs = Res_min ; } |
||||
|
here->HSMHV_dRs_dVdse = 0.0 ; |
||||
|
here->HSMHV_dRs_dVgse = 0.0 ; |
||||
|
here->HSMHV_dRs_dVbse = 0.0 ; |
||||
|
here->HSMHV_dRs_dVsubs = 0.0 ; |
||||
|
here->HSMHV_dRs_dTi = 0.0 ; |
||||
|
|
||||
|
|
||||
|
/* Clamping to Res_min */ |
||||
|
here->HSMHV_Rd = Rd / Mfactor ; |
||||
|
if(here->HSMHV_Rd < Res_min) { |
||||
|
here->HSMHV_Rd = Res_min ; |
||||
|
here->HSMHV_dRd_dVddp = 0.0 ; |
||||
|
here->HSMHV_dRd_dVdse = 0.0 ; |
||||
|
here->HSMHV_dRd_dVgse = 0.0 ; |
||||
|
here->HSMHV_dRd_dVbse = 0.0 ; |
||||
|
here->HSMHV_dRd_dVsubs = 0.0 ; |
||||
|
here->HSMHV_dRd_dTi = 0.0 ; |
||||
|
here->HSMHV_dRd_dVds = 0.0 ; |
||||
|
here->HSMHV_dRd_dVgs = 0.0 ; |
||||
|
here->HSMHV_dRd_dVbs = 0.0 ; |
||||
|
} else { |
||||
|
here->HSMHV_dRd_dVddp = Rd_dVddp / Mfactor ; |
||||
|
here->HSMHV_dRd_dVdse = Rd_dVdse / Mfactor ; |
||||
|
here->HSMHV_dRd_dVgse = Rd_dVgse / Mfactor ; |
||||
|
here->HSMHV_dRd_dVbse = Rd_dVbse / Mfactor ; |
||||
|
here->HSMHV_dRd_dVsubs= Rd_dVsubs / Mfactor ; |
||||
|
here->HSMHV_dRd_dTi = Rd_dT / Mfactor ; |
||||
|
here->HSMHV_dRd_dVds = Rd_dVds / Mfactor ; |
||||
|
here->HSMHV_dRd_dVgs = Rd_dVgs / Mfactor ; |
||||
|
here->HSMHV_dRd_dVbs = Rd_dVbs / Mfactor ; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
return ( HiSIM_OK ) ; |
||||
|
|
||||
|
} |
||||
498
src/spicelib/devices/hisimhv1/hsmhvld.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
608
src/spicelib/devices/hisimhv1/hsmhvset.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,223 @@ |
|||||
|
/*********************************************************************** |
||||
|
|
||||
|
HiSIM (Hiroshima University STARC IGFET Model) |
||||
|
Copyright (C) 2014 Hiroshima University & STARC |
||||
|
|
||||
|
MODEL NAME : HiSIM_HV |
||||
|
( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) |
||||
|
Model Parameter 'VERSION' : 2.20 |
||||
|
FILE : hsmhvtemp_eval_dio.h |
||||
|
|
||||
|
DATE : 2014.6.11 |
||||
|
|
||||
|
released by |
||||
|
Hiroshima University & |
||||
|
Semiconductor Technology Academic Research Center (STARC) |
||||
|
***********************************************************************/ |
||||
|
|
||||
|
/********************************************************************** |
||||
|
|
||||
|
The following source code, and all copyrights, trade secrets or other |
||||
|
intellectual property rights in and to the source code in its entirety, |
||||
|
is owned by the Hiroshima University and the STARC organization. |
||||
|
|
||||
|
All users need to follow the "HISIM_HV Distribution Statement and |
||||
|
Copyright Notice" attached to HiSIM_HV model. |
||||
|
|
||||
|
-----HISIM_HV Distribution Statement and Copyright Notice-------------- |
||||
|
|
||||
|
Software is distributed as is, completely without warranty or service |
||||
|
support. Hiroshima University or STARC and its employees are not liable |
||||
|
for the condition or performance of the software. |
||||
|
|
||||
|
Hiroshima University and STARC own the copyright and grant users a perpetual, |
||||
|
irrevocable, worldwide, non-exclusive, royalty-free license with respect |
||||
|
to the software as set forth below. |
||||
|
|
||||
|
Hiroshima University and STARC hereby disclaims all implied warranties. |
||||
|
|
||||
|
Hiroshima University and STARC grant the users the right to modify, copy, |
||||
|
and redistribute the software and documentation, both within the user's |
||||
|
organization and externally, subject to the following restrictions |
||||
|
|
||||
|
1. The users agree not to charge for Hiroshima University and STARC code |
||||
|
itself but may charge for additions, extensions, or support. |
||||
|
|
||||
|
2. In any product based on the software, the users agree to acknowledge |
||||
|
Hiroshima University and STARC that developed the software. This |
||||
|
acknowledgment shall appear in the product documentation. |
||||
|
|
||||
|
3. The users agree to reproduce any copyright notice which appears on |
||||
|
the software on any copy or modification of such made available |
||||
|
to others." |
||||
|
|
||||
|
Toshimasa Asahara, President, Hiroshima University |
||||
|
Mitiko Miura-Mattausch, Professor, Hiroshima University |
||||
|
Katsuhiro Shimohigashi, President&CEO, STARC |
||||
|
June 2008 (revised October 2011) |
||||
|
*************************************************************************/ |
||||
|
|
||||
|
#define small 1.0e-50 |
||||
|
|
||||
|
TTEMP = ckt->CKTtemp; |
||||
|
if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; } |
||||
|
TTEMP0 = TTEMP ; |
||||
|
#ifdef HSMHVEVAL |
||||
|
/* Self heating */ |
||||
|
TTEMP = TTEMP + deltemp ; |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
/* Band gap */ |
||||
|
T1 = TTEMP - model->HSMHV_ktnom ; |
||||
|
T2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; |
||||
|
Eg = here->HSMHV_egtnom - pParam->HSMHV_bgtmp1 * T1 |
||||
|
- pParam->HSMHV_bgtmp2 * T2 ; |
||||
|
#ifdef HSMHVEVAL |
||||
|
Eg_dT = -pParam->HSMHV_bgtmp1 - 2.0e0 * TTEMP * pParam->HSMHV_bgtmp2 ; |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
/* Inverse of the thermal voltage */ |
||||
|
here->HSMHV_beta = beta = C_QE / (C_KB * TTEMP) ; |
||||
|
here->HSMHV_beta_inv = 1.0 / beta ; |
||||
|
here->HSMHV_beta2 = beta * beta ; |
||||
|
here->HSMHV_betatnom = C_QE / (C_KB * model->HSMHV_ktnom) ; |
||||
|
#ifdef HSMHVEVAL |
||||
|
beta_dT=-C_QE/(C_KB*TTEMP*TTEMP); |
||||
|
beta_inv_dT = C_KB / C_QE ; |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
log_Tratio = log (here->HSMHV_Tratio) ; |
||||
|
/* for substrate-drain junction diode. */ |
||||
|
js = pParam->HSMHV_js0d |
||||
|
* exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta |
||||
|
+ model->HSMHV_xtid * log_Tratio) / pParam->HSMHV_njd) ; |
||||
|
jssw = pParam->HSMHV_js0swd |
||||
|
* exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta |
||||
|
+ model->HSMHV_xtid * log_Tratio) / model->HSMHV_njswd) ; |
||||
|
|
||||
|
js2 = pParam->HSMHV_js0d |
||||
|
* exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta |
||||
|
+ model->HSMHV_xti2d * log_Tratio) / pParam->HSMHV_njd) ; |
||||
|
jssw2 = pParam->HSMHV_js0swd |
||||
|
* exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta |
||||
|
+ model->HSMHV_xti2d * log_Tratio) / model->HSMHV_njswd) ; |
||||
|
|
||||
|
#ifdef HSMHVEVAL |
||||
|
T0 = - Eg * beta_dT - Eg_dT * beta ; /* Self heating */ |
||||
|
T1 = T0 + model->HSMHV_xtid / TTEMP ; /* Self heating */ |
||||
|
T2 = T0 + model->HSMHV_xti2d / TTEMP ; /* Self heating */ |
||||
|
|
||||
|
js_dT = js * T1 / pParam->HSMHV_njd; /* Self heating */ |
||||
|
jssw_dT = jssw * T1/ model->HSMHV_njswd ; /* Self heating */ |
||||
|
js2_dT = js2 * T2 / pParam->HSMHV_njd; /* Self heating */ |
||||
|
jssw2_dT = jssw2 * T2 / model->HSMHV_njswd; /* Self heating */ |
||||
|
#endif |
||||
|
|
||||
|
here->HSMHV_isbd = here->HSMHV_ad * js + here->HSMHV_pd * jssw ; |
||||
|
here->HSMHV_isbd2 = here->HSMHV_ad * js2 + here->HSMHV_pd * jssw2 ; |
||||
|
|
||||
|
#ifdef HSMHVEVAL |
||||
|
isbd_dT = here->HSMHV_ad * js_dT + here->HSMHV_pd * jssw_dT ; /* Self heating */ |
||||
|
isbd2_dT = here->HSMHV_ad * js2_dT + here->HSMHV_pd * jssw2_dT ; /* Self heating */ |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
T0 = here->HSMHV_Tratio * here->HSMHV_Tratio ; |
||||
|
T2 = here->HSMHV_isbd + small ; |
||||
|
#ifdef HSMHVEVAL |
||||
|
T1_dT = 1.0 / model->HSMHV_ktnom ; /* Self heating */ |
||||
|
T0_dT = 2.0 * here->HSMHV_Tratio * T1_dT ; /* Self heating */ |
||||
|
T2_dT = isbd_dT ; /* Self heating */ |
||||
|
#endif |
||||
|
|
||||
|
here->HSMHV_vbdt = pParam->HSMHV_njd / beta |
||||
|
* log ( pParam->HSMHV_vdiffjd * T0 / T2 + 1.0 ) ; |
||||
|
|
||||
|
here->HSMHV_exptempd = exp (( here->HSMHV_Tratio - 1.0 ) * model->HSMHV_ctempd ) ; |
||||
|
|
||||
|
#ifdef HSMHVEVAL |
||||
|
vbdt_dT = - beta_dT / beta * here->HSMHV_vbdt |
||||
|
+ pParam->HSMHV_njd / beta * pParam->HSMHV_vdiffjd / ( pParam->HSMHV_vdiffjd * T0 / T2 + 1.0 ) |
||||
|
* ( T0_dT / T2 - T0 / T2 / T2 * T2_dT ) ; /* Self heating */ |
||||
|
#endif |
||||
|
|
||||
|
here->HSMHV_jd_nvtm_invd = 1.0 / ( pParam->HSMHV_njd / beta ) ; |
||||
|
here->HSMHV_jd_expcd = exp (here->HSMHV_vbdt * here->HSMHV_jd_nvtm_invd ) ; |
||||
|
|
||||
|
#ifdef HSMHVEVAL |
||||
|
exptempd_dT = model->HSMHV_ctempd / model->HSMHV_ktnom * here->HSMHV_exptempd ; /* Self heating */ |
||||
|
jd_nvtm_invd_dT = beta_dT / pParam->HSMHV_njd ; /* Self heating */ |
||||
|
jd_expcd_dT = here->HSMHV_jd_expcd |
||||
|
* ( vbdt_dT * here->HSMHV_jd_nvtm_invd + here->HSMHV_vbdt * jd_nvtm_invd_dT ) ; /* Self heating */ |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
/* for substrate-source junction diode. */ |
||||
|
js = pParam->HSMHV_js0s |
||||
|
* exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta |
||||
|
+ model->HSMHV_xtis * log_Tratio) / pParam->HSMHV_njs) ; |
||||
|
jssw = pParam->HSMHV_js0sws |
||||
|
* exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta |
||||
|
+ model->HSMHV_xtis * log_Tratio) / model->HSMHV_njsws) ; |
||||
|
|
||||
|
js2 = pParam->HSMHV_js0s |
||||
|
* exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta |
||||
|
+ model->HSMHV_xti2s * log_Tratio) / pParam->HSMHV_njs) ; |
||||
|
jssw2 = pParam->HSMHV_js0sws |
||||
|
* exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta |
||||
|
+ model->HSMHV_xti2s * log_Tratio) / model->HSMHV_njsws) ; |
||||
|
|
||||
|
#ifdef HSMHVEVAL |
||||
|
T0 = - Eg * beta_dT - Eg_dT * beta ; /* Self heating */ |
||||
|
T1 = T0 + model->HSMHV_xtis / TTEMP ; /* Self heating */ |
||||
|
T2 = T0 + model->HSMHV_xti2s / TTEMP ; /* Self heating */ |
||||
|
|
||||
|
js_dT = js * T1 / pParam->HSMHV_njs; /* Self heating */ |
||||
|
jssw_dT = jssw * T1/ model->HSMHV_njsws ; /* Self heating */ |
||||
|
js2_dT = js2 * T2 / pParam->HSMHV_njs; /* Self heating */ |
||||
|
jssw2_dT = jssw2 * T2 / model->HSMHV_njsws; /* Self heating */ |
||||
|
#endif |
||||
|
|
||||
|
here->HSMHV_isbs = here->HSMHV_as * js + here->HSMHV_ps * jssw ; |
||||
|
here->HSMHV_isbs2 = here->HSMHV_as * js2 + here->HSMHV_ps * jssw2 ; |
||||
|
|
||||
|
#ifdef HSMHVEVAL |
||||
|
isbs_dT = here->HSMHV_as * js_dT + here->HSMHV_ps * jssw_dT ; /* Self heating */ |
||||
|
isbs2_dT = here->HSMHV_as * js2_dT + here->HSMHV_ps * jssw2_dT ; /* Self heating */ |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
T0 = here->HSMHV_Tratio * here->HSMHV_Tratio ; |
||||
|
T3 = here->HSMHV_isbs + small ; |
||||
|
#ifdef HSMHVEVAL |
||||
|
T1_dT = 1.0 / model->HSMHV_ktnom ; /* Self heating */ |
||||
|
T0_dT = 2.0 * here->HSMHV_Tratio * T1_dT ; /* Self heating */ |
||||
|
T3_dT = isbs_dT ; /* Self heating */ |
||||
|
#endif |
||||
|
|
||||
|
here->HSMHV_vbst = pParam->HSMHV_njs / beta |
||||
|
* log ( pParam->HSMHV_vdiffjs * T0 / T3 + 1.0 ) ; |
||||
|
|
||||
|
here->HSMHV_exptemps = exp (( here->HSMHV_Tratio - 1.0 ) * model->HSMHV_ctemps ) ; |
||||
|
|
||||
|
#ifdef HSMHVEVAL |
||||
|
vbst_dT = - beta_dT / beta * here->HSMHV_vbst |
||||
|
+ pParam->HSMHV_njs / beta * pParam->HSMHV_vdiffjs / ( pParam->HSMHV_vdiffjs * T0 / T3 + 1.0 ) |
||||
|
* ( T0_dT / T3 - T0 / T3 / T3 * T3_dT ) ; /* Self heating */ |
||||
|
#endif |
||||
|
|
||||
|
here->HSMHV_jd_nvtm_invs = 1.0 / ( pParam->HSMHV_njs / beta ) ; |
||||
|
here->HSMHV_jd_expcs = exp (here->HSMHV_vbst * here->HSMHV_jd_nvtm_invs ) ; |
||||
|
|
||||
|
#ifdef HSMHVEVAL |
||||
|
exptemps_dT = model->HSMHV_ctemps / model->HSMHV_ktnom * here->HSMHV_exptemps ; /* Self heating */ |
||||
|
jd_nvtm_invs_dT = beta_dT / pParam->HSMHV_njs ; /* Self heating */ |
||||
|
jd_expcs_dT = here->HSMHV_jd_expcs |
||||
|
* ( vbst_dT * here->HSMHV_jd_nvtm_invs + here->HSMHV_vbst * jd_nvtm_invs_dT ) ; /* Self heating */ |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
/* end of HSMHVtemp_eval_dio.h */ |
||||
@ -0,0 +1,103 @@ |
|||||
|
/*********************************************************************** |
||||
|
|
||||
|
HiSIM (Hiroshima University STARC IGFET Model) |
||||
|
Copyright (C) 2014 Hiroshima University & STARC |
||||
|
|
||||
|
MODEL NAME : HiSIM_HV |
||||
|
( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) |
||||
|
Model Parameter 'VERSION' : 2.20 |
||||
|
FILE : hsmhvtemp_eval_rdri.h |
||||
|
|
||||
|
DATE : 2014.6.11 |
||||
|
|
||||
|
released by |
||||
|
Hiroshima University & |
||||
|
Semiconductor Technology Academic Research Center (STARC) |
||||
|
***********************************************************************/ |
||||
|
|
||||
|
/********************************************************************** |
||||
|
|
||||
|
The following source code, and all copyrights, trade secrets or other |
||||
|
intellectual property rights in and to the source code in its entirety, |
||||
|
is owned by the Hiroshima University and the STARC organization. |
||||
|
|
||||
|
All users need to follow the "HISIM_HV Distribution Statement and |
||||
|
Copyright Notice" attached to HiSIM_HV model. |
||||
|
|
||||
|
-----HISIM_HV Distribution Statement and Copyright Notice-------------- |
||||
|
|
||||
|
Software is distributed as is, completely without warranty or service |
||||
|
support. Hiroshima University or STARC and its employees are not liable |
||||
|
for the condition or performance of the software. |
||||
|
|
||||
|
Hiroshima University and STARC own the copyright and grant users a perpetual, |
||||
|
irrevocable, worldwide, non-exclusive, royalty-free license with respect |
||||
|
to the software as set forth below. |
||||
|
|
||||
|
Hiroshima University and STARC hereby disclaims all implied warranties. |
||||
|
|
||||
|
Hiroshima University and STARC grant the users the right to modify, copy, |
||||
|
and redistribute the software and documentation, both within the user's |
||||
|
organization and externally, subject to the following restrictions |
||||
|
|
||||
|
1. The users agree not to charge for Hiroshima University and STARC code |
||||
|
itself but may charge for additions, extensions, or support. |
||||
|
|
||||
|
2. In any product based on the software, the users agree to acknowledge |
||||
|
Hiroshima University and STARC that developed the software. This |
||||
|
acknowledgment shall appear in the product documentation. |
||||
|
|
||||
|
3. The users agree to reproduce any copyright notice which appears on |
||||
|
the software on any copy or modification of such made available |
||||
|
to others." |
||||
|
|
||||
|
Toshimasa Asahara, President, Hiroshima University |
||||
|
Mitiko Miura-Mattausch, Professor, Hiroshima University |
||||
|
Katsuhiro Shimohigashi, President&CEO, STARC |
||||
|
June 2008 (revised October 2011) |
||||
|
*************************************************************************/ |
||||
|
|
||||
|
TTEMP = ckt->CKTtemp; |
||||
|
if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; } |
||||
|
TTEMP0 = TTEMP ; |
||||
|
#ifdef HSMHVEVAL |
||||
|
/* Self heating */ |
||||
|
TTEMP = TTEMP + deltemp ; |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
/* Phonon Scattering (temperature-dependent part) */ |
||||
|
T1 = Fn_Pow ( here->HSMHV_Tratio, model->HSMHV_rdrmuetmp ) ; |
||||
|
here->HSMHV_rdrmue = modelMKS->HSMHV_rdrmue / T1 ; |
||||
|
#ifdef HSMHVEVAL |
||||
|
T1_dT = model->HSMHV_rdrmuetmp * Fn_Pow( here->HSMHV_Tratio, model->HSMHV_rdrmuetmp - 1.0 ) |
||||
|
/ model->HSMHV_ktnom ; |
||||
|
Mu0_dT = - modelMKS->HSMHV_rdrmue / ( T1 * T1 ) * T1_dT ; |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
/* Velocity Temperature Dependence */ |
||||
|
T0 = 1.8 + 0.4 * here->HSMHV_Tratio + 0.1 * here->HSMHV_Tratio * here->HSMHV_Tratio - model->HSMHV_rdrvtmp * ( 1.0 - here->HSMHV_Tratio ) ; |
||||
|
#ifdef HSMHVEVAL |
||||
|
T0_dT = 1 / model->HSMHV_ktnom * ( 0.4 + 0.2 * here->HSMHV_Tratio + model->HSMHV_rdrvtmp ) ; |
||||
|
#endif |
||||
|
here->HSMHV_rdrvmax = modelMKS->HSMHV_rdrvmax / T0 ; |
||||
|
#ifdef HSMHVEVAL |
||||
|
Vmax_dT = - modelMKS->HSMHV_rdrvmax / ( T0 * T0 ) * T0_dT ; |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
here->HSMHV_rdrcx = model->HSMHV_rdrcx ; |
||||
|
here->HSMHV_rdrcar = model->HSMHV_rdrcar ; |
||||
|
#ifdef HSMHVEVAL |
||||
|
Cx_dT = 0.0 ; |
||||
|
Car_dT = 0.0 ; |
||||
|
#endif |
||||
|
|
||||
|
//Toshiba model // |
||||
|
here->HSMHV_rdrbb = model->HSMHV_rdrbb+model->HSMHV_rdrbbtmp*(TTEMP-model->HSMHV_ktnom) ; |
||||
|
#ifdef HSMHVEVAL |
||||
|
Rdrbb_dT = model->HSMHV_rdrbbtmp ; |
||||
|
#endif |
||||
|
|
||||
|
/* end of HSMHVtemp_eval_rdri.h */ |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue