Browse Source
Revert "update hisimhv model to version 2.2.0"
Revert "update hisimhv model to version 2.2.0"
This reverts commit c2ef7aeff3.
pre-master-46
33 changed files with 3659 additions and 10272 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
@ -1,600 +0,0 @@ |
|||
/*********************************************************************** |
|||
|
|||
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 ) ; |
|||
|
|||
} |
|||
@ -1,656 +0,0 @@ |
|||
/*********************************************************************** |
|||
|
|||
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
@ -1,223 +0,0 @@ |
|||
/*********************************************************************** |
|||
|
|||
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 */ |
|||
@ -1,103 +0,0 @@ |
|||
/*********************************************************************** |
|||
|
|||
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