From e75fdab962dfbb0f1800da036a74143ed548e719 Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 24 Oct 2012 08:54:31 +0200 Subject: [PATCH] hisim2 update to version 2.6.1 --- src/spicelib/devices/hisim2/hisim2.h | 6 +- src/spicelib/devices/hisim2/hsm2.c | 22 +- src/spicelib/devices/hisim2/hsm2acld.c | 6 +- src/spicelib/devices/hisim2/hsm2ask.c | 17 +- src/spicelib/devices/hisim2/hsm2cvtest.c | 7 +- src/spicelib/devices/hisim2/hsm2def.h | 98 +- src/spicelib/devices/hisim2/hsm2del.c | 7 +- src/spicelib/devices/hisim2/hsm2dest.c | 7 +- src/spicelib/devices/hisim2/hsm2eval.c | 1385 ++++++++++----------- src/spicelib/devices/hisim2/hsm2evalenv.h | 6 +- src/spicelib/devices/hisim2/hsm2ext.h | 6 +- src/spicelib/devices/hisim2/hsm2getic.c | 7 +- src/spicelib/devices/hisim2/hsm2init.c | 2 +- src/spicelib/devices/hisim2/hsm2itf.h | 6 +- src/spicelib/devices/hisim2/hsm2ld.c | 10 +- src/spicelib/devices/hisim2/hsm2mask.c | 23 +- src/spicelib/devices/hisim2/hsm2mdel.c | 7 +- src/spicelib/devices/hisim2/hsm2mpar.c | 28 +- src/spicelib/devices/hisim2/hsm2noi.c | 73 +- src/spicelib/devices/hisim2/hsm2par.c | 21 +- src/spicelib/devices/hisim2/hsm2pzld.c | 11 +- src/spicelib/devices/hisim2/hsm2set.c | 48 +- src/spicelib/devices/hisim2/hsm2temp.c | 274 ++-- src/spicelib/devices/hisim2/hsm2trunc.c | 7 +- 24 files changed, 1136 insertions(+), 948 deletions(-) diff --git a/src/spicelib/devices/hisim2/hisim2.h b/src/spicelib/devices/hisim2/hisim2.h index e0643147e..548228c59 100644 --- a/src/spicelib/devices/hisim2/hisim2.h +++ b/src/spicelib/devices/hisim2/hisim2.h @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hisim2.h - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & diff --git a/src/spicelib/devices/hisim2/hsm2.c b/src/spicelib/devices/hisim2/hsm2.c index 1bb46d512..ce7d3436c 100644 --- a/src/spicelib/devices/hisim2/hsm2.c +++ b/src/spicelib/devices/hisim2/hsm2.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -14,7 +14,6 @@ ***********************************************************************/ #include "ngspice/ngspice.h" -#include #include "ngspice/devdefs.h" #include "hsm2def.h" #include "ngspice/suffix.h" @@ -50,7 +49,12 @@ IFparm HSM2pTable[] = { /* parameters */ IOP("nsubcdfm", HSM2_NSUBCDFM, IF_REAL, "constant part of Nsub for DFM [1/cm^3]"), IOP("mphdfm", HSM2_MPHDFM, IF_REAL, "NSUBCDFM dependence of phonon scattering for DFM"), IOP("m", HSM2_M, IF_REAL, "Multiplication factor [-]"), - /* Output Physical Values: */ +/* WPE */ + IOP("sca", HSM2_SCA, IF_REAL, "WPE sca"), + IOP("scb", HSM2_SCB, IF_REAL, "WPE scb"), + IOP("scc", HSM2_SCC, IF_REAL, "WPE scc"), + + /* Output Physical Values: */ OP ( "ids", HSM2_CD, IF_REAL , "Ids"), /* Drain-Source current */ OP ( "isub", HSM2_ISUB, IF_REAL , "Isub"), /* Substrate current */ OP ( "igidl", HSM2_IGIDL, IF_REAL , "Igidl"), /* Gate-Induced Drain Leakage current */ @@ -359,7 +363,13 @@ IFparm HSM2mPTable[] = { /* model parameters */ IOP("nsubcwp2", HSM2_MOD_NSUBCWP2, IF_REAL, ""), IOP("muephw2", HSM2_MOD_MUEPHW2, IF_REAL, ""), IOP("muepwp2", HSM2_MOD_MUEPWP2, IF_REAL, ""), - + +/* WPE */ + IOP("web", HSM2_MOD_WEB, IF_REAL, "Description for the model parameter WPE web"), + IOP("wec", HSM2_MOD_WEC, IF_REAL, "Description for the model parameter WPE wec"), + IOP("nsubcwpe" , HSM2_MOD_NSUBCWPE, IF_REAL, "Description for the model parameter WPE nsubcwpe"), + IOP("npextwpe" , HSM2_MOD_NPEXTWPE, IF_REAL, "Description for the model parameter WPE npextwpe"), + IOP("nsubpwpe" , HSM2_MOD_NSUBPWPE, IF_REAL, "Description for the model parameter WPE nsubpwpe"), IOP("vgsmin", HSM2_MOD_VGSMIN, IF_REAL, "minimal/maximal expected Vgs (NMOS/PMOS) [V]"), IOP("sc3vbs", HSM2_MOD_SC3VBS, IF_REAL, "Vbs value for clamping sc3 [V]"), IOP("byptol", HSM2_MOD_BYPTOL, IF_REAL, "BYP_TOL_FACTOR for bypass control"), diff --git a/src/spicelib/devices/hisim2/hsm2acld.c b/src/spicelib/devices/hisim2/hsm2acld.c index 976d146f5..54b2cca74 100644 --- a/src/spicelib/devices/hisim2/hsm2acld.c +++ b/src/spicelib/devices/hisim2/hsm2acld.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2acld.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & diff --git a/src/spicelib/devices/hisim2/hsm2ask.c b/src/spicelib/devices/hisim2/hsm2ask.c index 15358a6d3..20946041a 100644 --- a/src/spicelib/devices/hisim2/hsm2ask.c +++ b/src/spicelib/devices/hisim2/hsm2ask.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2ask.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -14,7 +14,6 @@ ***********************************************************************/ #include "ngspice/ngspice.h" -#include #include "ngspice/ifsim.h" #include "ngspice/cktdefs.h" #include "ngspice/devdefs.h" @@ -280,6 +279,16 @@ int HSM2ask( case HSM2_M: value->rValue = here->HSM2_m; return(OK); +/* WPE */ + case HSM2_SCA: + value->rValue = here->HSM2_sca; + return(OK); + case HSM2_SCB: + value->rValue = here->HSM2_scb; + return(OK); + case HSM2_SCC: + value->rValue = here->HSM2_scc; + return(OK); default: return(E_BADPARM); } diff --git a/src/spicelib/devices/hisim2/hsm2cvtest.c b/src/spicelib/devices/hisim2/hsm2cvtest.c index e203f1376..db9543e60 100644 --- a/src/spicelib/devices/hisim2/hsm2cvtest.c +++ b/src/spicelib/devices/hisim2/hsm2cvtest.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2cvtest.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -14,7 +14,6 @@ ***********************************************************************/ #include "ngspice/ngspice.h" -#include #include "ngspice/cktdefs.h" #include "hsm2def.h" #include "ngspice/trandefs.h" diff --git a/src/spicelib/devices/hisim2/hsm2def.h b/src/spicelib/devices/hisim2/hsm2def.h index 7b9ccb204..0800299b7 100644 --- a/src/spicelib/devices/hisim2/hsm2def.h +++ b/src/spicelib/devices/hisim2/hsm2def.h @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2def.h - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -24,6 +24,37 @@ /* declarations for HiSIM2 MOSFETs */ +typedef struct sHSM2modelCGSParam { + double HSM2_tox ; + double HSM2_xld ; + double HSM2_xwd ; + double HSM2_xqy ; + double HSM2_xl ; + double HSM2_xw ; + double HSM2_saref ; + double HSM2_sbref ; + double HSM2_ll ; + double HSM2_lld ; + double HSM2_wl ; + double HSM2_wld ; + double HSM2_lp ; + double HSM2_tpoly ; + double HSM2_parl2 ; + double HSM2_qme1 ; + double HSM2_qme3 ; + double HSM2_cgbo ; + double HSM2_cj ; + double HSM2_cjsw ; + double HSM2_cjswg ; + double HSM2_lpext ; + double HSM2_wl1 ; + double HSM2_rs ; + double HSM2_rd ; + double HSM2_gdld ; + double HSM2_muepwd ; + double HSM2_muepld ; +} HSM2modelCGSParam ; + /* binning parameters */ typedef struct sHSM2binningParam { double HSM2_vmax ; @@ -98,6 +129,21 @@ typedef struct sHSM2binningParam { double HSM2_ibpc2 ; } HSM2binningParam ; +/* unit-converted parameters for each instance */ +typedef struct sHSM2hereCGSParam { + double HSM2_l; + double HSM2_w; + double HSM2_ad; + double HSM2_as; + double HSM2_pd; + double HSM2_ps; + double HSM2_xgl; + double HSM2_xgw; + double HSM2_sa; + double HSM2_sb; + double HSM2_sd; +} HSM2hereCGSParam ; + /* information needed for each instance */ typedef struct sHSM2instance { struct sHSM2model *HSM2modPtr; /* pointer to model */ @@ -118,9 +164,10 @@ typedef struct sHSM2instance { int HSM2sbNode; double HSM2_noiflick; /* for 1/f noise calc. */ - double HSM2_noithrml; /* for thrmal noise calc. */ + double HSM2_noithrml; /* for thermal noise calc. */ double HSM2_noiigate; /* for induced gate noise */ double HSM2_noicross; /* for induced gate noise */ + double HSM2_Qdrat; /* for induced gate noise */ /* instance */ double HSM2_l; /* the length of the channel region */ @@ -131,7 +178,7 @@ typedef struct sHSM2instance { double HSM2_ps; /* perimeter of source junction [m] */ double HSM2_nrd; /* equivalent num of squares of drain [-] (unused) */ double HSM2_nrs; /* equivalent num of squares of source [-] (unused) */ - double HSM2_temp; /* lattice temperature [K] */ + double HSM2_temp; /* lattice temperature [C] */ double HSM2_dtemp; double HSM2_weff; /* the effective width of the channel region */ @@ -158,6 +205,11 @@ typedef struct sHSM2instance { double HSM2_nsubcdfm; /* DFM */ double HSM2_mphdfm; /* DFM */ double HSM2_m; + +/* WPE */ + double HSM2_sca; /* scc */ + double HSM2_scb; /* scb */ + double HSM2_scc; /* scc */ int HSM2_called; /* flag to check the first call */ /* previous values to evaluate initial guess */ @@ -376,8 +428,13 @@ typedef struct sHSM2instance { double HSM2_gdl0; double HSM2_muecb0; double HSM2_muecb1; + double HSM2_ktemp; /* lattice temperature [K] */ + double HSM2_mueph1 ; + double HSM2_nsubp ; + double HSM2_nsubc ; HSM2binningParam pParam ; /* binning parameters */ + HSM2hereCGSParam hereCGS ; /* unit-converted parameters */ /* no use in SPICE3f5 double HSM2drainSquares; the length of the drain in squares @@ -427,6 +484,10 @@ typedef struct sHSM2instance { unsigned HSM2_mphdfm_Given :1; /* DFM */ unsigned HSM2_m_Given :1; + /* WPE */ + unsigned HSM2_sca_Given :1; /* sca */ + unsigned HSM2_scb_Given :1; /* scb */ + unsigned HSM2_scc_Given :1; /* scc */ /* pointer to sparse matrix */ double *HSM2GgPtr; /* pointer to sparse matrix element at (gate node,gate node) */ @@ -812,6 +873,12 @@ typedef struct sHSM2model { /* model structure for a resistor */ double HSM2_muephw2 ; double HSM2_muepwp2 ; + /* variables for WPE */ + double HSM2_web ; + double HSM2_wec ; + double HSM2_nsubcwpe ; + double HSM2_npextwpe ; + double HSM2_nsubpwpe ; /* for Ps0_min */ double HSM2_Vgsmin ; double HSM2_sc3Vbs ; /* SC3 clamping */ @@ -1048,8 +1115,11 @@ typedef struct sHSM2model { /* model structure for a resistor */ double HSM2_vcrit ; int HSM2_flg_qme ; double HSM2_qme12 ; + double HSM2_ktnom ; int HSM2_bypass_enable ; + HSM2modelCGSParam modelCGS ; /* unit-converted parameters */ + /* flag for model */ unsigned HSM2_type_Given :1; unsigned HSM2_level_Given :1; @@ -1316,6 +1386,12 @@ typedef struct sHSM2model { /* model structure for a resistor */ unsigned HSM2_muephw2_Given :1; unsigned HSM2_muepwp2_Given :1; + /* val set flag for WPE */ + unsigned HSM2_web_Given :1; + unsigned HSM2_wec_Given :1; + unsigned HSM2_nsubcwpe_Given :1; + unsigned HSM2_npextwpe_Given :1; + unsigned HSM2_nsubpwpe_Given :1; unsigned HSM2_Vgsmin_Given :1; unsigned HSM2_sc3Vbs_Given :1; unsigned HSM2_byptol_Given :1; @@ -1617,6 +1693,11 @@ typedef struct sHSM2model { /* model structure for a resistor */ #define HSM2_MPHDFM 84 #define HSM2_M 83 +/* val symbol for WPE */ +#define HSM2_SCA 85 /* sca */ +#define HSM2_SCB 86 /* scb */ +#define HSM2_SCC 87 /* scc */ + /* model parameters */ #define HSM2_MOD_VMAX 100 #define HSM2_MOD_BGTMP1 101 @@ -1850,6 +1931,13 @@ typedef struct sHSM2model { /* model structure for a resistor */ #define HSM2_MOD_MUEPHW2 463 #define HSM2_MOD_MUEPWP2 464 +/* val symbol for WPE */ +#define HSM2_MOD_WEB 88 +#define HSM2_MOD_WEC 89 +#define HSM2_MOD_NSUBCWPE 91 +#define HSM2_MOD_NPEXTWPE 41 +#define HSM2_MOD_NSUBPWPE 43 + #define HSM2_MOD_VGSMIN 466 #define HSM2_MOD_SC3VBS 467 #define HSM2_MOD_BYPTOL 468 diff --git a/src/spicelib/devices/hisim2/hsm2del.c b/src/spicelib/devices/hisim2/hsm2del.c index 2c1d7450c..fe7a2217b 100644 --- a/src/spicelib/devices/hisim2/hsm2del.c +++ b/src/spicelib/devices/hisim2/hsm2del.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2del.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -14,7 +14,6 @@ ***********************************************************************/ #include "ngspice/ngspice.h" -#include #include "hsm2def.h" #include "ngspice/sperror.h" #include "ngspice/gendefs.h" diff --git a/src/spicelib/devices/hisim2/hsm2dest.c b/src/spicelib/devices/hisim2/hsm2dest.c index 27bb326f5..bbf1bcbb5 100644 --- a/src/spicelib/devices/hisim2/hsm2dest.c +++ b/src/spicelib/devices/hisim2/hsm2dest.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2dest.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -14,7 +14,6 @@ ***********************************************************************/ #include "ngspice/ngspice.h" -#include #include "hsm2def.h" #include "ngspice/suffix.h" diff --git a/src/spicelib/devices/hisim2/hsm2eval.c b/src/spicelib/devices/hisim2/hsm2eval.c index e2acfcd68..e10fd5f66 100644 --- a/src/spicelib/devices/hisim2/hsm2eval.c +++ b/src/spicelib/devices/hisim2/hsm2eval.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2eval.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -23,55 +23,32 @@ All users need to follow the "HiSIM2 Distribution Statement and Copyright Notice" attached to HiSIM2 model. -----HiSIM2 Distribution Statement and Copyright Notice-------------- - Hiroshima University and/or Semiconductor Technology Academic Research -Center ("STARC") grants to Licensee a worldwide, royalty-free, -sub-licensable, retroactive, perpetual, irrevocable license to make, -have made, offer to sell, sell, import, export, use, copy, redistribute, -perform, display and incorporate HiSIM2 intellectual property (the -"License") subject to the conditions set forth below. - This License includes rights to use and modify copyrighted material -for any purpose if the copyright is acknowledged as well as the use of -related patents which STARC owns, has applied for or will apply for -in connection with HiSIM2 intellectual property for the purpose of -implementing and using the HiSIM2 intellectual property in connection -with the standard. This license applies to all past and future versions -of HiSIM2. -1. HiSIM2 intellectual property is offered "as is" without any warranty, -explicit or implied, or service support. Hiroshima University, STARC, -its University staff and employees assume no liability for the quality -and performance of HiSIM2 intellectual property. +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. -2. As the owner of the HiSIM2 intellectual property, and all other -related rights, Hiroshima University and/or STARC grant the License -as set forth above. +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. -3. A Licensee may not charge an end user a fee for the HiSIM2 source -code, which Hiroshima University and STARC own, by itself, however, -a Licensee may charge an end user a fee for alterations or additions -to the HiSIM2 source code or for maintenance service. +Hiroshima University and STARC hereby disclaim all implied warranties. -4. A Licensee of HiSIM2 intellectual property agrees that Hiroshima -University and STARC are the developers of HiSIM2 in all products -containing HiSIM2 and the alteration thereof (subject to Licensee's -ownership of the alterations). -If future versions of HiSIM2 incorporate elements of other CMC models -the copyrights of those elements remains with the original developers. -For this purpose the copyright notice as shown below shall be used. +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 -"The HiSIM2 source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code, is owned -by Hiroshima University and/or STARC." +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. -5. A Licensee of HiSIM2 intellectual property will comply with the -export obligations pertaining to the export of the HiSIM2 intellectual -property. +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." -6. By using HiSIM2 intellectual property owned by Hiroshima University -and/or STARC, Licensee agrees not to prosecute any patents or patent -held by Licensee that are required for implementation of HiSIM2 against -any party who is infringing those patents solely by implementing and/or -using the HiSIM2 standard. *************************************************************************/ @@ -228,15 +205,12 @@ double TMF1 , TMF2 , TMF3 , TMF4 ; TMF2 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta) ) ; \ dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \ y = 0.5 * ( ( x ) + TMF2 ) ; \ - if (y < 0) \ - y = 0 ; \ } - +#if 0 /*---------------------------------------------------* * smoothZero: flooring to zero. * y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) ) *-----------------*/ -#if 0 static double smoothZero ( double x, @@ -248,7 +222,6 @@ static double smoothZero if (dx) *dx = 0.5 * ( 1.0 + x / sqr ) ; return 0.5 * ( x + sqr ) ; } -#endif /*---------------------------------------------------* * CeilingPow: ceiling for positive x, flooring for negative x. * y = x * xmax / ( x^{2m} + xmax^{2m} )^{1/(2m)} @@ -257,7 +230,6 @@ static double smoothZero * - -xmax < y < xmax. * - dy/dx|_{x=0} = 1. *-----------------*/ -#if 0 static double CeilingPow ( double x, @@ -392,6 +364,8 @@ int HSM2evaluate ) { HSM2binningParam *pParam = &here->pParam ; + HSM2modelCGSParam *modelCGS = &model->modelCGS ; + HSM2hereCGSParam *hereCGS = &here->hereCGS ; /*-----------------------------------* * Constants for Smoothing functions *---------------*/ @@ -442,6 +416,7 @@ int HSM2evaluate const double Vbs_min = -10.5e0 ; const double epsm10 = 10.0e0 * C_EPS_M ; const double small = 1.0e-50 ; + const double small2 = 1.0e-12 ; /* for Qover */ double Vbs_max = 0.8e0 ; double Vbs_bnd = 0.4e0 ; /* start point of positive Vbs bending */ @@ -453,7 +428,7 @@ int HSM2evaluate int flg_rsrd = 0 ; /* Flag for bias loop accounting Rs and Rd */ int flg_iprv = 0 ; /* Flag for initial guess of Ids */ int flg_pprv = 0 ; /* Flag for initial guesses of Ps0 and Pds */ - int flg_noqi = 0 ; /* Flag for the cases regarding Qi=Qd=0 */ + int flg_noqi = 0 ; /* Flag for the cases regarding Qi=Qd=0 */ int flg_vbsc = 0 ; /* Flag for Vbs confining */ int flg_info = 0 ; int flg_conv = 0 ; /* Flag for Poisson loop convergence */ @@ -848,8 +823,7 @@ int HSM2evaluate double Qovs_dVbs = 0.0, Qovs_dVds = 0.0, Qovs_dVgs = 0.0 ; int lcover = 0, flg_ovloops = 0, flg_ovloopd = 0 ; int flg_overs = 0, flg_overd = 0 ; - double VgpLD , VgpLD_dVgs ; - double Vgp_fb_LD ; + double VgpLD ; double QbdLD = 0.0 , QbdLD_dVbs = 0.0 , QbdLD_dVds = 0.0 , QbdLD_dVgs = 0.0 ; double QidLD = 0.0 , QidLD_dVbs = 0.0 , QidLD_dVds = 0.0 , QidLD_dVgs = 0.0 ; double QbsLD = 0.0 , QbsLD_dVbs = 0.0 , QbsLD_dVds = 0.0 , QbsLD_dVgs = 0.0 ; @@ -861,10 +835,9 @@ int HSM2evaluate double QbuLD = 0.0 , QbuLD_dVbs = 0.0 , QbuLD_dVds = 0.0 , QbuLD_dVgs = 0.0 ; double QsuLD = 0.0 , QsuLD_dVbs = 0.0 , QsuLD_dVds = 0.0 , QsuLD_dVgs = 0.0 ; double QiuLD = 0.0 , QiuLD_dVbs = 0.0 , QiuLD_dVds = 0.0 , QiuLD_dVgs = 0.0 ; - double Ps0LD = 0.0 , Ps0LD_dVbs = 0.0 , Ps0LD_dVds = 0.0 , Ps0LD_dVgs = 0.0 ; + double Ps0LD = 0.0 , Ps0LD_dVds = 0.0 ; double QbuLD_dVxb = 0.0 , QbuLD_dVgb = 0.0 ; double QsuLD_dVxb = 0.0 , QsuLD_dVgb = 0.0 ; - double VthLD = 0.0; int flg_ovzone = 0 ; /* Vgsz for SCE and PGD */ @@ -892,6 +865,36 @@ int HSM2evaluate double Pb2over ; + /* Qover Iterative and Analytical Model */ + const double large_arg = 80 ; + int lp_ld ; + double T1_dVxb, T1_dVgb, T5_dVxb, T5_dVgb ; + double Vgb_fb_LD, VgpLD_dVgb ; + double VgpLD_shift, VgpLD_shift_dVxb, VgpLD_shift_dVgb ; + double TX_dVxb, TX_dVgb, TY_dVxb, TY_dVgb ; + double Ac1_dVxb, Ac1_dVgb, Ac2_dVxb, Ac2_dVgb ; + double Ac3_dVxb, Ac3_dVgb, Ac31_dVxb, Ac31_dVgb ; + double Acd_dVxb, Acd_dVgb, Acn_dVxb, Acn_dVgb ; + double Ta = 9.3868e-3, Tb = -0.1047839 ; + double Tc, Tp ; + double Td, Td_dVxb, Td_dVgb ; + double Tq, Tq_dVxb, Tq_dVgb ; + double Tu, Tu_dVxb, Tu_dVgb ; + double Tv, Tv_dVxb, Tv_dVgb ; + double exp_bVbs_dVxb, exp_bPs0 ; + double cnst1over ; + double gamma, gamma_dVxb ; + double Chi_dVxb, Chi_dVgb ; + double Chi_A, Chi_A_dVxb, Chi_A_dVgb ; + double Chi_B, Chi_B_dVxb, Chi_B_dVgb ; + double Chi_1, Chi_1_dVxb, Chi_1_dVgb ; + double psi_B, arg_B ; + double psi, psi_dVgb, psi_dVxb ; + double Ps0_iniA_dVxb, Ps0_iniA_dVgb ; + double Ps0_iniB_dVxb, Ps0_iniB_dVgb ; + double Psa_dVxb, Psa_dVgb, Ps0LD_dVxb, Ps0LD_dVgb ; + double fs02_dVxb, fs02_dVgb ; + /* SCE LOOP */ double A , A_dVgs, A_dVds, A_dVbs ; int NNN ; @@ -907,6 +910,7 @@ int HSM2evaluate /* modify Qy in accumulation region */ +/* double eps_qy = 5.0e-3 ;*/ double Aclm_eff, Aclm_eff_dVds, Aclm_eff_dVgs, Aclm_eff_dVbs ; double Idd1 , Idd1_dVbs , Idd1_dVgs , Idd1_dVds ; @@ -1022,7 +1026,7 @@ int HSM2evaluate c_eox = here->HSM2_cecox ; /* Tox and Cox without QME */ - Tox0 = model->HSM2_tox ; + Tox0 = modelCGS->HSM2_tox ; Cox0 = c_eox / Tox0 ; Cox0_inv = 1.0 / Cox0 ; @@ -1320,6 +1324,7 @@ int HSM2evaluate T5_dVd = - Vthq_dVd ; T5_dVg = 1.0 ; Fn_SZ( T2 , T5 , qme_dlt, T3) ; + T2 = T2 + small ; T2_dVb = T3 * T5_dVb ; T2_dVd = T3 * T5_dVd ; T2_dVg = T3 * T5_dVg ; @@ -1339,8 +1344,8 @@ int HSM2evaluate T2_dVd = T6 * T3_dVd ; T2_dVg = T6 * T3_dVg ; - dTox = model->HSM2_qme1 * T2 + model->HSM2_qme3 ; - T7 = model->HSM2_qme1 ; + dTox = modelCGS->HSM2_qme1 * T2 + modelCGS->HSM2_qme3 ; + T7 = modelCGS->HSM2_qme1 ; dTox_dVb = T7 * T2_dVb ; dTox_dVd = T7 * T2_dVd ; dTox_dVg = T7 * T2_dVg ; @@ -1640,7 +1645,7 @@ int HSM2evaluate * dVthLP : Short-channel effect induced by pocket. * - Vth0 : Vth without pocket. *-----------------*/ - if ( model->HSM2_lp != 0.0 ) { + if ( modelCGS->HSM2_lp != 0.0 ) { if( corecip ){ @@ -1711,7 +1716,7 @@ int HSM2evaluate dqb_dPS0Z = 0.0 ; } - T1 = 2.0 * C_QE * pParam->HSM2_nsubc * C_ESI ; + T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ; T2 = sqrt( T1 ) ; T2_dVb = 0.0 ; T2_dVd = 0.0 ; @@ -1729,7 +1734,7 @@ int HSM2evaluate T1_dVg = C_ESI * Cox_inv_dVg ; T2 = here->HSM2_wdplp ; - T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ; + T4 = 1.0e0 / ( modelCGS->HSM2_lp * modelCGS->HSM2_lp ) ; T3 = 2.0 * ( model->HSM2_vbi - Pb20 ) * T2 * T4 ; T5 = T1 * T3 ; @@ -1767,11 +1772,11 @@ int HSM2evaluate T9_dVg = PS0Z_SCE_dVgs - Vbsz2_dVgs ; T9_dPS0Z = 1.0 ; - T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz ; - T3_dVb = pParam->HSM2_scp3 * T9_dVb / model->HSM2_lp ; - T3_dVd = pParam->HSM2_scp3 * T9_dVd / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz_dVds ; - T3_dVg = pParam->HSM2_scp3 * T9_dVg / model->HSM2_lp ; - T3_dPS0Z = pParam->HSM2_scp3 * T9_dPS0Z / model->HSM2_lp ; + T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / modelCGS->HSM2_lp + pParam->HSM2_scp2 * Vdsz ; + T3_dVb = pParam->HSM2_scp3 * T9_dVb / modelCGS->HSM2_lp ; + T3_dVd = pParam->HSM2_scp3 * T9_dVd / modelCGS->HSM2_lp + pParam->HSM2_scp2 * Vdsz_dVds ; + T3_dVg = pParam->HSM2_scp3 * T9_dVg / modelCGS->HSM2_lp ; + T3_dPS0Z = pParam->HSM2_scp3 * T9_dPS0Z / modelCGS->HSM2_lp ; Vdx = model->HSM2_scp21 + Vdsz ; Vdx2 = Vdx * Vdx + small ; @@ -1820,7 +1825,7 @@ int HSM2evaluate dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv - Qbmm * Cox_inv_dVd ; dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv - Qbmm * Cox_inv_dVg ; - T1 = 2.0 * C_QE * pParam->HSM2_nsubc * C_ESI ; + T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ; T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ; Vth0 = Pb2c + Vfb + T2 * Cox_inv ; T3 = 0.5 * T1 / T2 * Cox_inv ; @@ -1830,7 +1835,7 @@ int HSM2evaluate T1 = C_ESI * Cox_inv ; T2 = here->HSM2_wdplp ; - T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ; + T4 = 1.0e0 / ( modelCGS->HSM2_lp * modelCGS->HSM2_lp ) ; T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ; dVth0 = T5 * sqrt_Pbsum ; T6 = 0.5 * T5 / sqrt_Pbsum ; @@ -1841,14 +1846,14 @@ int HSM2evaluate dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ; T1 = Vthp - Vth0 ; - T2 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * Pbsum / model->HSM2_lp ; + T2 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * Pbsum / modelCGS->HSM2_lp ; T3 = T2 + pParam->HSM2_scp2 * Vdsz ; Vdx = model->HSM2_scp21 + Vdsz ; Vdx2 = Vdx * Vdx + small ; dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc / Vdx2 ; - T4 = T1 * dVth0 * pParam->HSM2_scp3 / model->HSM2_lp ; + T4 = T1 * dVth0 * pParam->HSM2_scp3 / modelCGS->HSM2_lp ; dVthLP_dVb = (Vthp_dVb - Vth0_dVb) * dVth0 * T3 + T1 * dVth0_dVb * T3 + T4 * Pbsum_dVb + dqb_dVb ; dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3 @@ -1873,7 +1878,7 @@ int HSM2evaluate if( corecip ){ - T3 = here->HSM2_lgate - model->HSM2_parl2 ; + T3 = here->HSM2_lgate - modelCGS->HSM2_parl2 ; T4 = 1.0e0 / ( T3 * T3 ) ; T5 = pParam->HSM2_sc3 / here->HSM2_lgate ; @@ -1948,7 +1953,7 @@ int HSM2evaluate T1 = C_ESI * Cox_inv ; T2 = here->HSM2_wdpl ; - T3 = here->HSM2_lgate - model->HSM2_parl2 ; + T3 = here->HSM2_lgate - modelCGS->HSM2_parl2 ; T4 = 1.0e0 / ( T3 * T3 ) ; T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ; @@ -2082,7 +2087,7 @@ int HSM2evaluate * dVthLP : Short-channel effect induced by pocket. * - Vth0 : Vth without pocket. *-----------------*/ - if ( model->HSM2_lp != 0.0 ) { + if ( modelCGS->HSM2_lp != 0.0 ) { if( corecip ){ T1 = here->HSM2_2qnsub_esi ; @@ -2153,7 +2158,7 @@ int HSM2evaluate dqb_dPS0Z = 0.0 ; } - T1 = 2.0 * C_QE * pParam->HSM2_nsubc * C_ESI ; + T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ; T2 = sqrt( T1 ) ; T2_dVb = 0.0 ; T2_dVd = 0.0 ; @@ -2168,7 +2173,7 @@ int HSM2evaluate T1 = C_ESI * Cox_inv ; T2 = here->HSM2_wdplp ; - T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ; + T4 = 1.0e0 / ( modelCGS->HSM2_lp * modelCGS->HSM2_lp ) ; T5 = 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T1 * T2 * T4 ; T5_dVb = 0.0 ; T5_dVd = 0.0 ; @@ -2204,11 +2209,11 @@ int HSM2evaluate T9_dVg = PS0Z_SCE_dVgs - Vbsz2_dVgs ; T9_dPS0Z = 1.0 ; - T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz ; - T3_dVb = pParam->HSM2_scp3 * T9_dVb / model->HSM2_lp ; - T3_dVd = pParam->HSM2_scp3 * T9_dVd / model->HSM2_lp + pParam->HSM2_scp2 * Vdsz_dVds ; - T3_dVg = pParam->HSM2_scp3 * T9_dVg / model->HSM2_lp ; - T3_dPS0Z = pParam->HSM2_scp3 * T9_dPS0Z / model->HSM2_lp ; + T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / modelCGS->HSM2_lp + pParam->HSM2_scp2 * Vdsz ; + T3_dVb = pParam->HSM2_scp3 * T9_dVb / modelCGS->HSM2_lp ; + T3_dVd = pParam->HSM2_scp3 * T9_dVd / modelCGS->HSM2_lp + pParam->HSM2_scp2 * Vdsz_dVds ; + T3_dVg = pParam->HSM2_scp3 * T9_dVg / modelCGS->HSM2_lp ; + T3_dPS0Z = pParam->HSM2_scp3 * T9_dPS0Z / modelCGS->HSM2_lp ; Vdx = model->HSM2_scp21 + Vdsz ; Vdx2 = Vdx * Vdx + small ; @@ -2258,7 +2263,7 @@ int HSM2evaluate dqb_dVd = Vthp_dVd - Qbmm_dVd * Cox_inv ; dqb_dVg = Vthp_dVg - Qbmm_dVg * Cox_inv ; - T1 = 2.0 * C_QE * pParam->HSM2_nsubc * C_ESI ; + T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ; T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ; Vth0 = Pb2c + Vfb + T2 * Cox_inv ; T3 = 0.5 * T1 / T2 * Cox_inv ; @@ -2269,7 +2274,7 @@ int HSM2evaluate T1 = C_ESI * Cox_inv ; T2 = here->HSM2_wdplp ; - T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ; + T4 = 1.0e0 / ( modelCGS->HSM2_lp * modelCGS->HSM2_lp ) ; T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ; dVth0 = T5 * sqrt_Pbsum ; T6 = 0.5 * T5 / sqrt_Pbsum ; @@ -2280,14 +2285,14 @@ int HSM2evaluate dVth0_dVg = T6 * Pbsum_dVg + T8 * Pb20b_dVg ; T1 = Vthp - Vth0 ; - T2 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * Pbsum / model->HSM2_lp ; + T2 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * Pbsum / modelCGS->HSM2_lp ; T3 = T2 + pParam->HSM2_scp2 * Vdsz ; Vdx = model->HSM2_scp21 + Vdsz ; Vdx2 = Vdx * Vdx + small ; dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc / Vdx2 ; - T4 = T1 * dVth0 * pParam->HSM2_scp3 / model->HSM2_lp ; + T4 = T1 * dVth0 * pParam->HSM2_scp3 / modelCGS->HSM2_lp ; dVthLP_dVb = (Vthp_dVb - Vth0_dVb) * dVth0 * T3 + T1 * dVth0_dVb * T3 + T4 * Pbsum_dVb + dqb_dVb ; dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3 @@ -2312,7 +2317,7 @@ int HSM2evaluate *-----------------*/ if( corecip ){ - T3 = here->HSM2_lgate - model->HSM2_parl2 ; + T3 = here->HSM2_lgate - modelCGS->HSM2_parl2 ; T4 = 1.0e0 / ( T3 * T3 ) ; T5 = pParam->HSM2_sc3 / here->HSM2_lgate ; @@ -2381,7 +2386,7 @@ int HSM2evaluate T1 = C_ESI * Cox_inv ; T2 = here->HSM2_wdpl ; - T3 = here->HSM2_lgate - model->HSM2_parl2 ; + T3 = here->HSM2_lgate - modelCGS->HSM2_parl2 ; T4 = 1.0e0 / ( T3 * T3 ) ; T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ; @@ -2991,9 +2996,15 @@ int HSM2evaluate /*-------------------------------------------* * zone-D3. (Ps0) *-----------------*/ - exp_Chi = exp( Chi ) ; - fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ; - fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ; + if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */ + exp_Chi = exp( Chi ) ; + fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ; + fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ; + } else { + exp_bPs0 = exp( beta*Ps0 ) ; + fs01 = cnst1 * ( exp_bPs0 - exp_bVbs ) ; + fs01_dPs0 = cnst1 * beta * exp_bPs0 ; + } fs02 = sqrt( Chi - 1.0 + fs01 ) ; fs02_dPs0 = ( beta + fs01_dPs0 ) / ( fs02 + fs02 ) ; } /* end of if ( Chi ... ) else block */ @@ -4469,7 +4480,7 @@ start_of_mobility: *-----------------*/ T1 = C_ESI * Cox_inv ; T2 = here->HSM2_wdpl ; - T3 = here->HSM2_lgatesm - model->HSM2_parl2 ; + T3 = here->HSM2_lgatesm - modelCGS->HSM2_parl2 ; T4 = 1.0 / (T3 * T3) ; T5 = 2.0 * (model->HSM2_vbi - Pb20b) * T1 * T2 * T4 ; @@ -5225,7 +5236,7 @@ start_of_mobility: /*-----------------------------------------------------------* * End of PART-2. (label) *-----------------*/ -/* end_of_part_2: */ +/* end_of_part_2:*/ /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * PART-3: Overlap charge @@ -5246,7 +5257,7 @@ start_of_mobility: Psdl_dVgs = Ps0_dVgs ; } - if (model->HSM2_xqy !=0) { + if (modelCGS->HSM2_xqy !=0) { Ec = 0.0e0 ; Ec_dVbs =0.0e0 ; Ec_dVds =0.0e0 ; @@ -5254,7 +5265,7 @@ start_of_mobility: } } else { /* Ec is removed from Lred calc. part */ - if (model->HSM2_xqy !=0) { + if (modelCGS->HSM2_xqy !=0) { if ( Idd < C_IDD_MIN ) { Ec = 0.0e0 ; Ec_dVbs =0.0e0 ; @@ -5287,21 +5298,21 @@ start_of_mobility: Lov = pParam->HSM2_lover ; if ( pParam->HSM2_nover == 0.0 ){ - T4 = cov_slp * T1 * ( cov_mag + covvg ) ; - T4_dVg = cov_slp * T1 * covvg_dVgs ; - T4_dVd = 0.0 ; - T5 = Lov * T1 ; + T4 = cov_slp * T1 * ( cov_mag + covvg ) ; + T4_dVg = cov_slp * T1 * covvg_dVgs ; + T4_dVd = 0.0 ; + T5 = Lov * T1 ; - TX = Ps0 ; - TX_dVbs = Ps0_dVbs ; - TX_dVds = Ps0_dVds ; - TX_dVgs = Ps0_dVgs ; + TX = Ps0 ; + TX_dVbs = Ps0_dVbs ; + TX_dVds = Ps0_dVds ; + TX_dVgs = Ps0_dVgs ; - T9 = 1.2e0 - TX ; - Qgos = Vgs * T5 - T9 * T4 ; - Qgos_dVbs = T4 * TX_dVbs ; - Qgos_dVds = T4 * TX_dVds - T9 * T4_dVd ; - Qgos_dVgs = T5 + T4 * TX_dVgs - T9 * T4_dVg ; + T9 = 1.2e0 - TX ; + Qgos = Vgs * T5 - T9 * T4 ; + Qgos_dVbs = T4 * TX_dVbs ; + Qgos_dVds = T4 * TX_dVds - T9 * T4_dVd ; + Qgos_dVgs = T5 + T4 * TX_dVgs - T9 * T4_dVg ; T4 = cov_slp * T1 * ( cov_mag + covvg - Vds ) ; T4_dVg = cov_slp * T1 * covvg_dVgs ; @@ -5319,593 +5330,570 @@ start_of_mobility: for ( lcover = -1 ; lcover <= +1 ; lcover += 2 ) { flg_ovloops = ( 1 - lcover ) / 2 ; /* 1 in Source overlap calc. */ flg_ovloopd = ( 1 + lcover ) / 2 ; /* 1 in Drain overlap calc. */ - /*-------------------------------------------* - * Qover (G/D overlap charge) | note: _dVxs means _dVxse - *------------------------*/ - Vbsgmt = ModeNML * Vbse + ModeRVS * ( Vbse - Vdse ) ; - Vdsgmt = ModeNML * Vdse + ModeRVS * ( - Vdse ) ; - Vgsgmt = ModeNML * Vgse + ModeRVS * ( Vgse - Vdse ) ; - Vdbgmt = Vdsgmt - Vbsgmt ; - Vgbgmt = Vgsgmt - Vbsgmt ; - Vsbgmt = - Vbsgmt ; - flg_overs = flg_ovloops * (int)ModeNML + flg_ovloopd * (int)ModeRVS ; /* geometrical source */ - flg_overd = flg_ovloops * (int)ModeRVS + flg_ovloopd * (int)ModeNML ; /* geometrical drain */ - Vxbgmt = flg_overs * Vsbgmt + flg_overd * Vdbgmt ; - - /*---------------------------------------------------* - * Clamp -Vxbgmt. - *-----------------*/ - T0 = - Vxbgmt; - if ( T0 > Vbs_bnd ) { - Fn_SUPoly4( TY, (T0 - Vbs_bnd), (Vbs_max - Vbs_bnd), T10_dVb ) ; - T10 = Vbs_bnd + TY ; - } else if ( T0 < Vbs_min ) { - T10 = Vbs_min ; - T10_dVb = 0.0; - } else { - T10 = T0 ; - T10_dVb = 1.0; - } - Vxbgmtcl = - T10; - Vxbgmtcl_dVxbgmt = T10_dVb; - fac1 = here->HSM2_cnst0over * Cox0_inv ; - fac1_dVbs = 0.0; fac1_dVds = 0.0; fac1_dVgs = 0.0; - fac1p2 = fac1 * fac1 ; - - VgpLD = - Vgbgmt + 2.0 * pParam->HSM2_vfbover; - VgpLD_dVgs = - 1.0e0 ; - - Vgp_fb_LD = pParam->HSM2_vfbover - Vxbgmtcl ; - - /*-----------------------------------* - * QsuLD: total charge = Accumulation | Depletion+inversion - *-----------------*/ - if ( VgpLD < Vgp_fb_LD ){ - /*---------------------------* - * Accumulation - *-----------------*/ - flg_ovzone = -1 ; - T1 = 1.0 / ( beta * here->HSM2_cnst0over ) ; - TY = T1 * Cox0 ; - Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ; - Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ; - - Pb2over = here->HSM2_pb2over ; - Ps0_min = here->HSM2_eg - Pb2over ; - - TX = beta * ( VgpLD + Vxbgmtcl ) ; - TX_dVds = beta * Vxbgmtcl_dVxbgmt ; - TX_dVgs = beta * VgpLD_dVgs ; - - Ac31 = 7.0 * C_SQRT_2 - 9.0 * TY * ( TX - 2.0 ) ; - Ac31_dVds = - 9.0 * TY * TX_dVds ; - Ac31_dVgs = - 9.0 * TY * TX_dVgs ; - - Ac3 = Ac31 * Ac31 ; - T1 = 2.0 * Ac31 ; - Ac3_dVds = T1 * Ac31_dVds ; - Ac3_dVgs = T1 * Ac31_dVgs ; - - Ac2 = sqrt( Ac4 + Ac3 ) ; - T1 = 0.5 / Ac2 ; - Ac2_dVds = T1 * Ac3_dVds ; - Ac2_dVgs = T1 * Ac3_dVgs ; - - Ac1 = -7.0 * C_SQRT_2 + Ac2 + 9.0 * TY * ( TX - 2.0 ) ; - Ac1_dVds = Ac2_dVds + 9.0 * TY * TX_dVds ; - Ac1_dVgs = Ac2_dVgs + 9.0 * TY * TX_dVgs ; - - Acd = pow( Ac1 , C_1o3 ) ; - T1 = C_1o3 / ( Acd * Acd ) ; - Acd_dVds = Ac1_dVds * T1 ; - Acd_dVgs = Ac1_dVgs * T1 ; - - Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ; - T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ; - Acn_dVds = T1 * Acd_dVds ; - Acn_dVgs = T1 * Acd_dVgs ; - - Chi = Acn / Acd ; - T1 = 1.0 / ( Acd * Acd ) ; - Chi_dVds = ( Acn_dVds * Acd - Acn * Acd_dVds ) * T1 ; - Chi_dVgs = ( Acn_dVgs * Acd - Acn * Acd_dVgs ) * T1 ; - - Psa = Chi * beta_inv - Vxbgmtcl ; - Psa_dVds = Chi_dVds * beta_inv - Vxbgmtcl_dVxbgmt ; - Psa_dVgs = Chi_dVgs * beta_inv ; - - T1 = Psa + Vxbgmtcl ; - T2 = T1 / Ps0_min ; - T3 = sqrt( 1.0 + ( T2 * T2 ) ) ; - - T9 = T2 / T3 / Ps0_min ; - T3_dVd = T9 * ( Psa_dVds + Vxbgmtcl_dVxbgmt ) ; - T3_dVg = T9 * Psa_dVgs ; - - Ps0LD = T1 / T3 - Vxbgmtcl ; - T9 = 1.0 / ( T3 * T3 ) ; - Ps0LD_dVds = T9 * ( ( Psa_dVds + Vxbgmtcl_dVxbgmt ) * T3 - T1 * T3_dVd ) - Vxbgmtcl_dVxbgmt ; - Ps0LD_dVgs = T9 * ( Psa_dVgs * T3 - T1 * T3_dVg ); - - T2 = ( VgpLD - Ps0LD ) ; - QbuLD = Cox0 * T2 ; - QbuLD_dVxb = - Cox0 * Ps0LD_dVds ; - QbuLD_dVgb = Cox0 * ( VgpLD_dVgs - Ps0LD_dVgs ) ; - - QsuLD = QbuLD ; - QsuLD_dVxb = QbuLD_dVxb ; - QsuLD_dVgb = QbuLD_dVgb ; - - } else { - - if ( model->HSM2_coqovsm != 1 ) { /*-- COQOVSM != 1: Analytical solution --(Original)--*/ - - Ps0_iniA = - Vxbgmtcl ; - Ps0_iniA_dVds = - Vxbgmtcl_dVxbgmt; - Ps0_iniA_dVgs = 0.0; - - /*-----------------------------------* - * Depletion - *-----------------*/ - TX = 1.0e0 + 4.0e0 - * ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 ) / ( fac1p2 * beta2 ) ; - TX_dVds = 4.0e0 * ( beta * ( Vxbgmtcl_dVxbgmt ) ) / ( fac1p2 * beta2 ); - TX_dVgs = 4.0e0 * ( beta * ( VgpLD_dVgs ) ) / ( fac1p2 * beta2 ); - - TX = Fn_Max( TX , epsm10 ) ; - Ps0_iniA = VgpLD + fac1p2 * beta / 2.0e0 * ( 1.0e0 - sqrt( TX ) ) ; - Ps0_iniA_dVds = - fac1p2 * beta / 2.0e0 * TX_dVds * 0.5 / sqrt( TX ); - Ps0_iniA_dVgs = VgpLD_dVgs - fac1p2 * beta / 2.0e0 * TX_dVgs * 0.5 / sqrt( TX ); - - Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ; - Chi_dVds = beta * ( Ps0_iniA_dVds + Vxbgmtcl_dVxbgmt ) ; - Chi_dVgs = beta * ( Ps0_iniA_dVgs ) ; - - if ( Chi < znbd3 ) { - flg_ovzone = 1 ; - /*-----------------------------------* - * zone-D1/D2 - * - Ps0LD is the analytical solution of Qs=Qb0 with - * Qb0 being approximated to 3-degree polynomial. - *-----------------*/ - TY = beta * ( VgpLD + Vxbgmtcl ) ; - TY_dVds = beta * ( Vxbgmtcl_dVxbgmt ) ; - TY_dVgs = beta * ( VgpLD_dVgs ) ; - - T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ; - T2 = 81.0 + 3.0 * T1 ; - T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ; - T3_dVd = 27.0 * T1 * TY_dVds ; - T3_dVg = 27.0 * T1 * TY_dVgs ; - - T4 = 1458.0 - 81.0 * ( 54.0 + T1 ) + 27.0 * T1 * TY ; - T4_dVd = 27.0 * T1 * TY_dVds ; - T4_dVg = 27.0 * T1 * TY_dVgs ; - T0 = 2.0 * T4; - T4 = T4 * T4 ; - T4_dVd = T0 * T4_dVd ; - T4_dVg = T0 * T4_dVg ; - - T5 = pow( T3 + sqrt( 4 * T2 * T2 * T2 + T4 ) , C_1o3 ) ; - T0 = C_1o3 / ( T5 * T5 ); - T1 = sqrt( 4 * T2 * T2 * T2 + T4 ); - T5_dVd = ( T3_dVd + T4_dVd * 0.5 / T1 ) * T0 ; - T5_dVg = ( T3_dVg + T4_dVg * 0.5 / T1 ) * T0 ; - - TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 ) - + 1 / ( 3.0 * C_2p_1o3 ) * T5 ; - T0 = 1 / ( 3.0 * C_2p_1o3 ); - T1 = ( 9.0 * T5 * T5 ); - TX_dVds = - ( - C_2p_1o3 * T2 * 3.0 * T5_dVd ) / T1 + T0 * T5_dVd; - TX_dVgs = - ( - C_2p_1o3 * T2 * 3.0 * T5_dVg ) / T1 + T0 * T5_dVg; - - Ps0_iniA = TX * beta_inv - Vxbgmtcl ; - Ps0_iniA_dVds = TX_dVds * beta_inv - Vxbgmtcl_dVxbgmt; - Ps0_iniA_dVgs = TX_dVgs * beta_inv; - - } else { - flg_ovzone = 3 ; - } - - /*---------------------------------------------------* - * Assign initial guess. - *-----------------*/ - Ps0LD = Ps0_iniA ; - Ps0LD_dVds = Ps0_iniA_dVds; - Ps0LD_dVgs = Ps0_iniA_dVgs; - - Chi = beta * ( Ps0LD + Vxbgmtcl ) ; - Chi_dVds = beta * ( Ps0LD_dVds + Vxbgmtcl_dVxbgmt ) ; - Chi_dVgs = beta * ( Ps0LD_dVgs ) ; - - if ( Chi < znbd5 ) { - if ( flg_ovzone == 3 ) { flg_ovzone = 2 ;} /*-------------------------------------------* - * zone-D1/D2. (Ps0LD) + * Qover (G/D overlap charge) | note: _dVxs means _dVxse + *------------------------*/ + Vbsgmt = ModeNML * Vbse + ModeRVS * ( Vbse - Vdse ) ; + Vdsgmt = ModeNML * Vdse + ModeRVS * ( - Vdse ) ; + Vgsgmt = ModeNML * Vgse + ModeRVS * ( Vgse - Vdse ) ; + Vdbgmt = Vdsgmt - Vbsgmt ; + Vgbgmt = Vgsgmt - Vbsgmt ; + Vsbgmt = - Vbsgmt ; + flg_overs = flg_ovloops * (int)ModeNML + flg_ovloopd * (int)ModeRVS ; /* geometrical source */ + flg_overd = flg_ovloops * (int)ModeRVS + flg_ovloopd * (int)ModeNML ; /* geometrical drain */ + Vxbgmt = flg_overs * Vsbgmt + flg_overd * Vdbgmt ; + + + /*---------------------------------------------------* + * Clamp -Vxbgmt. *-----------------*/ - - fb = Chi * ( cn_nc51 - + Chi * ( cn_nc52 - + Chi * ( cn_nc53 - + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; - fb_dChi = cn_nc51 - + Chi * ( 2 * cn_nc52 - + Chi * ( 3 * cn_nc53 - + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; + T0 = - Vxbgmt; + if ( T0 > Vbs_bnd ) { + T1 = T0 - Vbs_bnd; + T2 = Vbs_max - Vbs_bnd; - fs02 = fb ; - fs02_dVds = fb_dChi * Chi_dVds; - fs02_dVgs = fb_dChi * Chi_dVgs; + Fn_SUPoly4( TY, T1, T2, T11 ); - /* memo: Fs0 = VgpLD - Ps0LD - fac1 * fs02 */ + T10 = Vbs_bnd + TY ; + } else { + T10 = T0 ; + T11 = 1.0 ; + } + Vxbgmtcl = - T10 - small2 ; + Vxbgmtcl_dVxbgmt = T11; - QbuLD = here->HSM2_cnst0over * fs02 ; - QbuLD_dVxb = here->HSM2_cnst0over * fs02_dVds; - QbuLD_dVgb = here->HSM2_cnst0over * fs02_dVgs; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0LD) - *-----------------*/ - - if ( model->HSM2_coqovsm > 0 && VgpLD > 0.0 ) { - /*-----------------------------------* - * Strong inversion zone. - * - Ps0_iniB : upper bound. - *-----------------*/ - flg_ovzone = 5 ; - T1 = here->HSM2_ps0ldinib; /* (1 / cnst1 / cnstCoxi) */ - T2 = T1 * VgpLD * VgpLD ; - T2_dVg = T1 * 2.0 * VgpLD * VgpLD_dVgs ; - T3 = beta + 2.0 / VgpLD ; - T3_dVg = - 2.0 * VgpLD_dVgs / ( VgpLD * VgpLD ); - - Ps0_iniB = log( T2 + small ) / T3 ; - Ps0_iniB_dVgs = ( T2_dVg / T2 * T3 - log( T2 ) * T3_dVg ) / ( T3 * T3 ); - - Fn_SU2( Ps0LD, Ps0LD, Ps0_iniB, c_ps0ini_2, T1, T2 ); - Ps0LD_dVds *= T1; - Ps0LD_dVgs = Ps0LD_dVgs * T1 + Ps0_iniB_dVgs * T2; - } - - /* T1: Xi */ - T1 = beta * ( Ps0LD + Vxbgmtcl ) - 1.0 ; - T1_dVd = beta * ( Ps0LD_dVds + Vxbgmtcl_dVxbgmt ) ; - T1_dVg = beta * ( Ps0LD_dVgs ) ; - - if ( T1 > 0.0 ){ T2 = sqrt( T1 ); } else{ T2 = small; } - QbuLD = here->HSM2_cnst0over * T2 ; - T3 = here->HSM2_cnst0over * 0.5 / T2 ; - QbuLD_dVxb = T3 * T1_dVd ; - QbuLD_dVgb = T3 * T1_dVg ; - } /* end of if ( Chi ... ) block */ - /*-----------------------------------------------------------* - * QsuLD : Qovs or Qovd in unit area. - * note: QsuLD = Qdep+Qinv. - *-----------------*/ - QsuLD = Cox0 * ( VgpLD - Ps0LD ) ; - QsuLD_dVxb = Cox0 * ( - Ps0LD_dVds ) ; - QsuLD_dVgb = Cox0 * ( VgpLD_dVgs - Ps0LD_dVgs ) ; - - } else { /*-- COQOVSM == 1: Iterative solution ---------------*/ - - VthLD = here->HSM2_pb2over + 2.0 * pParam->HSM2_vfbover - + sqrt( 2 * C_QE * pParam->HSM2_nover * C_ESI * here->HSM2_pb2over ) * Cox0_inv ; - /*-----------------------------------* - * Depletion - *-----------------*/ - TX = 1.0e0 + 4.0e0 - * ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 ) / ( fac1p2 * beta2 ) ; + fac1 = here->HSM2_cnst0over * Cox0_inv ; + fac1_dVbs = 0.0; fac1_dVds = 0.0; fac1_dVgs = 0.0; + + fac1p2 = fac1 * fac1 ; - TX = Fn_Max( TX , epsm10 ) ; - Ps0_iniA = VgpLD + fac1p2 * beta / 2.0e0 * ( 1.0e0 - sqrt( TX ) ) ; - - Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ; - - if ( Chi < znbd3 ) { + VgpLD = - Vgbgmt + pParam->HSM2_vfbover; + VgpLD_dVgb = - 1.0e0 ; + + T0 = pParam->HSM2_nover / here->HSM2_nin ; + Pb2over = 2.0 / beta * log( T0 ) ; + + Vgb_fb_LD = - Vxbgmtcl ; + /*-----------------------------------* - * zone-D1/D2 - * - Ps0LD is the analytical solution of Qs=Qb0 with - * Qb0 being approximated to 3-degree polynomial. + * QsuLD: total charge = Accumulation | Depletion+inversion *-----------------*/ - TY = beta * ( VgpLD + Vxbgmtcl ) ; - T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ; - T2 = 81.0 + 3.0 * T1 ; - T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ; - T4 = 1458.0 - 81.0 * ( 54.0 + T1 ) + 27.0 * T1 * TY ; - T4 = T4 * T4 ; - T5 = pow( T3 + sqrt( 4 * T2 * T2 * T2 + T4 ) , C_1o3 ) ; - TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 ) - + 1 / ( 3.0 * C_2p_1o3 ) * T5 ; + if ( VgpLD < Vgb_fb_LD ){ + /*---------------------------* + * Accumulation + *-----------------*/ + flg_ovzone = -1 ; + T1 = 1.0 / ( beta * here->HSM2_cnst0over ) ; + TY = T1 * Cox0 ; + Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ; + Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ; + + Ps0_min = here->HSM2_eg - Pb2over ; + + TX = beta * ( VgpLD + Vxbgmtcl ) ; + TX_dVxb = beta * Vxbgmtcl_dVxbgmt ; + TX_dVgb = beta * VgpLD_dVgb ; + + Ac31 = 7.0 * C_SQRT_2 - 9.0 * TY * ( TX - 2.0 ) ; + Ac31_dVxb = - 9.0 * TY * TX_dVxb ; + Ac31_dVgb = - 9.0 * TY * TX_dVgb ; + + Ac3 = Ac31 * Ac31 ; + T1 = 2.0 * Ac31 ; + Ac3_dVxb = T1 * Ac31_dVxb ; + Ac3_dVgb = T1 * Ac31_dVgb ; + + Ac2 = sqrt( Ac4 + Ac3 ) ; + T1 = 0.5 / Ac2 ; + Ac2_dVxb = T1 * Ac3_dVxb ; + Ac2_dVgb = T1 * Ac3_dVgb ; - Ps0_iniA = TX * beta_inv - Vxbgmtcl ; - Ps0_ini = Ps0_iniA ; - - } else if ( - Vgbgmt <= VthLD ) { - Ps0_ini = Ps0_iniA ; - - } else { - /*-----------------------------------* - * Strong inversion zone. - * - Ps0_iniB : upper bound. - *-----------------*/ - T1 = here->HSM2_ps0ldinib; /* (1 / cnst1 / cnstCoxi) */ - T2 = T1 * VgpLD * VgpLD ; - T3 = beta + 2.0 / VgpLD ; - - Ps0_iniB = log( T2 + small ) / T3 ; - - Fn_SU( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1) ; - } - - TX = - Vxbgmtcl + 0.5 * ps_conv ; - if ( Ps0_ini < TX ) Ps0_ini = TX ; - - /*---------------------------------------------------* - * Assign initial guess. - *-----------------*/ - Ps0LD = Ps0_ini ; - - /*---------------------------------------------------* - * Calculation of Ps0LD. (beginning of Newton loop) - * - Fs0 : Fs0 = 0 is the equation to be solved. - * - dPs0 : correction value. - *-----------------*/ - exp_bVbs = exp( beta * - Vxbgmtcl ) ; - T0 = here->HSM2_nin / pParam->HSM2_nover; - T1 = T0 * T0; /* cnst1_over */ - cfs1 = T1 * exp_bVbs ; - - flg_conv = 0 ; - for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) { - - Chi = beta * ( Ps0LD + Vxbgmtcl ) ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0LD) - *-----------------*/ - fi = Chi * Chi * Chi - * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; - fi_dChi = Chi * Chi - * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; + Ac1 = -7.0 * C_SQRT_2 + Ac2 + 9.0 * TY * ( TX - 2.0 ) ; + Ac1_dVxb = Ac2_dVxb + 9.0 * TY * TX_dVxb ; + Ac1_dVgb = Ac2_dVgb + 9.0 * TY * TX_dVgb ; - fs01 = cfs1 * fi * fi ; - fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ; - - fb = Chi * ( cn_nc51 - + Chi * ( cn_nc52 - + Chi * ( cn_nc53 - + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; - fb_dChi = cn_nc51 - + Chi * ( 2 * cn_nc52 - + Chi * ( 3 * cn_nc53 - + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; - - fs02 = sqrt( fb * fb + fs01 ) ; - fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0LD) - *-----------------*/ - exp_Chi = exp( Chi ) ; - fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ; - fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ; - fs02 = sqrt( Chi - 1.0 + fs01 ) ; - fs02_dPs0 = ( beta + fs01_dPs0 ) / fs02 * 0.5 ; - - } /* end of if ( Chi ... ) block */ - /*-----------------------------------------------------------* - * Fs0 - *-----------------*/ - Fs0 = VgpLD - Ps0LD - fac1 * fs02 ; - Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ; - - if ( flg_conv == 1 ) break ; - - dPs0 = - Fs0 / Fs0_dPs0 ; - - /*-------------------------------------------* - * Update Ps0LD . - *-----------------*/ - dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0LD))) ; - if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ; - - Ps0LD = Ps0LD + dPs0 ; - - TX = -Vxbgmtcl + ps_conv / 2 ; - if ( Ps0LD < TX ) Ps0LD = TX ; + Acd = pow( Ac1 , C_1o3 ) ; + T1 = C_1o3 / ( Acd * Acd ) ; + Acd_dVxb = Ac1_dVxb * T1 ; + Acd_dVgb = Ac1_dVgb * T1 ; - /*-------------------------------------------* - * Check convergence. - *-----------------*/ - if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) { - flg_conv = 1 ; - } + Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ; + T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ; + Acn_dVxb = T1 * Acd_dVxb ; + Acn_dVgb = T1 * Acd_dVgb ; + + Chi = Acn / Acd ; + T1 = 1.0 / ( Acd * Acd ) ; + Chi_dVxb = ( Acn_dVxb * Acd - Acn * Acd_dVxb ) * T1 ; + Chi_dVgb = ( Acn_dVgb * Acd - Acn * Acd_dVgb ) * T1 ; - } /* end of Ps0LD Newton loop */ - - /*-------------------------------------------* - * Procedure for diverged case. - *-----------------*/ - if ( flg_conv == 0 ) { - fprintf( stderr , - "*** warning(HiSIM): Went Over Iteration Maximum (Ps0LD)\n" ) ; - fprintf( stderr , - " -Vxbgmtcl = %e Vgbgmt = %e\n" , - -Vxbgmtcl , Vgbgmt ) ; - if ( flg_info >= 2 ) { - printf( "*** warning(HiSIM): Went Over Iteration Maximum (Ps0LD)\n" ) ; - } - } - - /*---------------------------------------------------* - * Evaluate derivatives of Ps0LD. - *-----------------*/ - if ( Chi < znbd5 ) { - fs01_dVbs = cfs1 * beta * fi * ( - fi + 2 * fi_dChi ) ; /* fs01_dVxbgmtcl */ - T2 = 1.0e0 / ( fs02 + fs02 ) ; - fs02_dVbs = ( + beta * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */ - } else { - fs01_dVbs = + cfs1 * beta ; /* fs01_dVxbgmtcl */ - T2 = 0.5e0 / fs02 ; - fs02_dVbs = ( + beta + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */ - } - - T1 = 1.0 / Fs0_dPs0 ; - Ps0LD_dVbs = - ( - fac1 * fs02_dVbs ) * T1 ; - Ps0LD_dVds = 0.0 ; - Ps0LD_dVgs = - ( VgpLD_dVgs - fac1_dVgs * fs02 ) * T1 ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0LD) - *-----------------*/ - if ( Chi < znbd3 ) { flg_ovzone = 1; } - else { flg_ovzone = 2 ; } - - Xi0 = fb * fb + epsm10 ; - T1 = 2 * fb * fb_dChi * beta ; - Xi0_dVbs = T1 * ( Ps0LD_dVbs + 1.0 ) ; /* Xi0_dVxbgmtcl */ - Xi0_dVds = T1 * Ps0LD_dVds ; - Xi0_dVgs = T1 * Ps0LD_dVgs ; - - Xi0p12 = fb + epsm10 ; - T1 = fb_dChi * beta ; - Xi0p12_dVbs = T1 * ( Ps0LD_dVbs + 1.0 ) ; /* Xi0p12_dVxbgmtcl */ - Xi0p12_dVds = T1 * Ps0LD_dVds ; - Xi0p12_dVgs = T1 * Ps0LD_dVgs ; - - Xi0p32 = fb * fb * fb + epsm10 ; - T1 = 3 * fb * fb * fb_dChi * beta ; - Xi0p32_dVbs = T1 * ( Ps0LD_dVbs + 1.0 ) ; /* Xi0p32_dVxbgmtcl */ - Xi0p32_dVds = T1 * Ps0LD_dVds ; - Xi0p32_dVgs = T1 * Ps0LD_dVgs ; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0LD) - *-----------------*/ - flg_ovzone = 3 ; - - Xi0 = Chi - 1.0e0 ; - Xi0_dVbs = beta * ( Ps0LD_dVbs + 1.0e0 ) ; /* Xi0_dVxbgmtcl */ - Xi0_dVds = beta * Ps0LD_dVds ; - Xi0_dVgs = beta * Ps0LD_dVgs ; - - Xi0p12 = sqrt( Xi0 ) ; - T1 = 0.5e0 / Xi0p12 ; - Xi0p12_dVbs = T1 * Xi0_dVbs ; - Xi0p12_dVds = T1 * Xi0_dVds ; - Xi0p12_dVgs = T1 * Xi0_dVgs ; - - Xi0p32 = Xi0 * Xi0p12 ; - T1 = 1.5e0 * Xi0p12 ; - Xi0p32_dVbs = T1 * Xi0_dVbs ; - Xi0p32_dVds = T1 * Xi0_dVds ; - Xi0p32_dVgs = T1 * Xi0_dVgs ; - - } /* end of if ( Chi ... ) block */ + Psa = Chi * beta_inv - Vxbgmtcl ; + Psa_dVxb = Chi_dVxb * beta_inv - Vxbgmtcl_dVxbgmt ; + Psa_dVgb = Chi_dVgb * beta_inv ; + + T1 = Psa + Vxbgmtcl ; + T2 = T1 / Ps0_min ; + T3 = sqrt( 1.0 + ( T2 * T2 ) ) ; + + T9 = T2 / T3 / Ps0_min ; + T3_dVd = T9 * ( Psa_dVxb + Vxbgmtcl_dVxbgmt ) ; + T3_dVg = T9 * Psa_dVgb ; - /*-----------------------------------------------------------* - * - Recalculate the derivatives of fs01 and fs02. - *-----------------*/ - fs01_dVbs = Ps0LD_dVbs * fs01_dPs0 + fs01_dVbs ; - fs01_dVds = Ps0LD_dVds * fs01_dPs0 ; - fs01_dVgs = Ps0LD_dVgs * fs01_dPs0 ; - fs02_dVbs = Ps0LD_dVbs * fs02_dPs0 + fs02_dVbs ; - fs02_dVds = Ps0LD_dVds * fs02_dPs0 ; - fs02_dVgs = Ps0LD_dVgs * fs02_dPs0 ; + Ps0LD = T1 / T3 - Vxbgmtcl ; + T9 = 1.0 / ( T3 * T3 ) ; + Ps0LD_dVxb = T9 * ( ( Psa_dVxb + Vxbgmtcl_dVxbgmt ) * T3 - T1 * T3_dVd ) - Vxbgmtcl_dVxbgmt ; + Ps0LD_dVgb = T9 * ( Psa_dVgb * T3 - T1 * T3_dVg ); + + T2 = ( VgpLD - Ps0LD ) ; + QsuLD = Cox0 * T2 ; + QsuLD_dVxb = - Cox0 * Ps0LD_dVxb ; + QsuLD_dVgb = Cox0 * ( VgpLD_dVgb - Ps0LD_dVgb ) ; + + QbuLD = QsuLD ; + QbuLD_dVxb = QsuLD_dVxb ; + QbuLD_dVgb = QsuLD_dVgb ; + + } else { + + /*---------------------------* + * Depletion and inversion + *-----------------*/ + + /* initial value for a few fixpoint iterations + to get Ps0_iniA from simplified Poisson equation: */ + flg_ovzone = 2 ; + Chi = znbd3 ; + Chi_dVxb = 0.0 ; Chi_dVgb = 0.0 ; - /*-----------------------------------------------------------* - * QbuLD and QiuLD - *-----------------*/ - QbuLD = here->HSM2_cnst0over * Xi0p12 ; - QbuLD_dVxb = here->HSM2_cnst0over * Xi0p12_dVbs ; - QbuLD_dVgb = here->HSM2_cnst0over * Xi0p12_dVgs ; + Ps0_iniA= Chi/beta - Vxbgmtcl ; + Ps0_iniA_dVxb = Chi_dVxb/beta - Vxbgmtcl_dVxbgmt ; + Ps0_iniA_dVgb = Chi_dVgb/beta ; + + /* 1 .. 2 relaxation steps should be sufficient */ + for ( lp_ld = 1; lp_ld <= 2; lp_ld ++ ) { + TY = exp(-Chi); + TY_dVxb = -Chi_dVxb * TY; + TY_dVgb = -Chi_dVgb * TY; + TX = 1.0e0 + 4.0e0 + * ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 + TY ) / ( fac1p2 * beta2 ) ; + TX_dVxb = 4.0e0 * ( beta * ( Vxbgmtcl_dVxbgmt ) + TY_dVxb ) / ( fac1p2 * beta2 ); + TX_dVgb = 4.0e0 * ( beta * ( VgpLD_dVgb ) + TY_dVgb ) / ( fac1p2 * beta2 ); + T1 = ( beta * ( VgpLD + Vxbgmtcl ) - 1.0e0 + TY ); + T3 = fac1p2 * beta2 ; + if ( TX < epsm10) { + TX = epsm10; + } + + Ps0_iniA = VgpLD + fac1p2 * beta / 2.0e0 * ( 1.0e0 - sqrt( TX ) ) ; + Ps0_iniA_dVxb = - fac1p2 * beta / 2.0e0 * TX_dVxb * 0.5 / sqrt( TX ); + Ps0_iniA_dVgb = VgpLD_dVgb - fac1p2 * beta / 2.0e0 * TX_dVgb * 0.5 / sqrt( TX ); + T1 = fac1p2 * beta ; + T2 = 1.0 - sqrt( TX ); + + Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ; + Chi_dVxb = beta * ( Ps0_iniA_dVxb + Vxbgmtcl_dVxbgmt ) ; + Chi_dVgb = beta * ( Ps0_iniA_dVgb ) ; + } /* End of iteration */ + + if ( Chi < znbd3 ) { + + flg_ovzone = 1 ; + + /*-----------------------------------* + * zone-D1 + * - Ps0_iniA is the analytical solution of QovLD=Qb0 with + * Qb0 being approximated by 3-degree polynomial. + * + * new: Inclusion of exp(-Chi) term at right border + *-----------------*/ + Ta = 1.0/(9.0*sqrt(2.0)) - (5.0+7.0*exp(-3.0)) / (54.0*sqrt(2.0+exp(-3.0))); + Tb = (1.0+exp(-3.0)) / (2.0*sqrt(2.0+exp(-3.0))) - sqrt(2.0) / 3.0; + Tc = 1.0/sqrt(2.0) + 1.0/(beta*fac1); + Td = - (VgpLD + Vxbgmtcl) / fac1; + Td_dVxb = - Vxbgmtcl_dVxbgmt / fac1; + Td_dVgb = - VgpLD_dVgb / fac1; + Tq = Tb*Tb*Tb / (27.0*Ta*Ta*Ta) - Tb*Tc/(6.0*Ta*Ta) + Td/(2.0*Ta); + Tq_dVxb = Td_dVxb/(2.0*Ta); + Tq_dVgb = Td_dVgb / (2.0*Ta); + Tp = (3.0*Ta*Tc-Tb*Tb)/(9.0*Ta*Ta); + T5 = sqrt(Tq*Tq + Tp*Tp*Tp); + T5_dVxb = 2.0*Tq*Tq_dVxb / (2.0*T5); + T5_dVgb = 2.0*Tq*Tq_dVgb / (2.0*T5); + Tu = pow(-Tq + T5,C_1o3); + Tu_dVxb = Tu / (3.0 * (-Tq + T5)) * (-Tq_dVxb + T5_dVxb); + Tu_dVgb = Tu / (3.0 * (-Tq + T5)) * (-Tq_dVgb + T5_dVgb); + Tv = -pow(Tq + T5,C_1o3); + Tv_dVxb = Tv / (3.0 * (-Tq - T5)) * (-Tq_dVxb - T5_dVxb); + Tv_dVgb = Tv / (3.0 * (-Tq - T5)) * (-Tq_dVgb - T5_dVgb); + TX = Tu + Tv - Tb/(3.0*Ta); + TX_dVxb = Tu_dVxb + Tv_dVxb; + TX_dVgb = Tu_dVgb + Tv_dVgb; + + Ps0_iniA = TX * beta_inv - Vxbgmtcl ; + Ps0_iniA_dVxb = TX_dVxb * beta_inv - Vxbgmtcl_dVxbgmt; + Ps0_iniA_dVgb = TX_dVgb * beta_inv; + + Chi = beta * ( Ps0_iniA + Vxbgmtcl ) ; + Chi_dVxb = beta * ( Ps0_iniA_dVxb + Vxbgmtcl_dVxbgmt ) ; + Chi_dVgb = beta * ( Ps0_iniA_dVgb ) ; + } + + if ( model->HSM2_coqovsm > 0 ) { + /*-----------------------------------* + * - Ps0_iniB : upper bound. + *-----------------*/ + flg_ovzone += 2; + + VgpLD_shift = VgpLD + Vxbgmtcl + 0.1; + VgpLD_shift_dVgb = VgpLD_dVgb; + VgpLD_shift_dVxb = Vxbgmtcl_dVxbgmt; + exp_bVbs = exp( beta * - Vxbgmtcl ) + small ; + exp_bVbs_dVxb = - exp_bVbs * beta * Vxbgmtcl_dVxbgmt; + T0 = here->HSM2_nin / pParam->HSM2_nover; + cnst1over = T0 * T0; + gamma = cnst1over * exp_bVbs ; + gamma_dVxb = cnst1over * exp_bVbs_dVxb; + + T0 = beta2 * fac1p2; + + psi = beta*VgpLD_shift; + psi_dVgb = beta*VgpLD_shift_dVgb; + psi_dVxb = beta*VgpLD_shift_dVxb; + Chi_1 = log(gamma*T0 + psi*psi) - log(cnst1over*T0) + beta*Vxbgmtcl; + Chi_1_dVgb = 2.0*psi*psi_dVgb/ (gamma*T0 + psi*psi); + Chi_1_dVxb = (gamma_dVxb*T0+2.0*psi*psi_dVxb)/(gamma*T0+psi*psi) + + beta*Vxbgmtcl_dVxbgmt; + + Fn_SU2( Chi_1, Chi_1, psi, 1.0, T1, T2 ); + Chi_1_dVgb = Chi_1_dVgb*T1 + psi_dVgb*T2; + Chi_1_dVxb = Chi_1_dVxb*T1 + psi_dVxb*T2; + + /* 1 fixpoint step for getting more accurate Chi_B */ + psi -= Chi_1 ; + psi_dVgb -= Chi_1_dVgb ; + psi_dVxb -= Chi_1_dVxb ; + + psi += beta*0.1 ; + + psi_B = psi; + arg_B = psi*psi/(gamma*T0); + Chi_B = log(gamma*T0 + psi*psi) - log(cnst1over*T0) + beta*Vxbgmtcl; + Chi_B_dVgb = 2.0*psi*psi_dVgb/ (gamma*T0 + psi*psi); + Chi_B_dVxb = (gamma_dVxb*T0+2.0*psi*psi_dVxb)/(gamma*T0+psi*psi) + + beta*Vxbgmtcl_dVxbgmt; + Ps0_iniB = Chi_B/beta - Vxbgmtcl ; + Ps0_iniB_dVgb = Chi_B_dVgb/beta; + Ps0_iniB_dVxb = Chi_B_dVxb/beta- Vxbgmtcl_dVxbgmt; + + + /* construction of Ps0LD by taking Ps0_iniB as an upper limit of Ps0_iniA + * + * Limiting is done for Chi rather than for Ps0LD, to avoid shifting + * for Fn_SU2 */ + + Chi_A = Chi; + Chi_A_dVxb = Chi_dVxb; + Chi_A_dVgb = Chi_dVgb; + + Fn_SU2( Chi, Chi_A, Chi_B, c_ps0ini_2*75.00, T1, T2 ); /* org: 50 */ + Chi_dVgb = Chi_A_dVgb * T1 + Chi_B_dVgb * T2; + Chi_dVxb = Chi_A_dVxb * T1 + Chi_B_dVxb * T2; + + } + + /* updating Ps0LD */ + Ps0LD= Chi/beta - Vxbgmtcl ; + Ps0LD_dVgb = Chi_dVgb/beta; + Ps0LD_dVxb = Chi_dVxb/beta- Vxbgmtcl_dVxbgmt; + + T1 = Chi - 1.0 + exp(-Chi); + T1_dVxb = (1.0 - exp(-Chi)) * Chi_dVxb ; + T1_dVgb = (1.0 - exp(-Chi)) * Chi_dVgb ; + if (T1 < epsm10) { + T1 = epsm10 ; + T1_dVxb = 0.0 ; + T1_dVgb = 0.0 ; + } + T2 = sqrt(T1); + QbuLD = here->HSM2_cnst0over * T2 ; + T3 = here->HSM2_cnst0over * 0.5 / T2 ; + QbuLD_dVxb = T3 * T1_dVxb ; + QbuLD_dVgb = T3 * T1_dVgb ; + + /*-----------------------------------------------------------* + * QsuLD : Qovs or Qovd in unit area. + * note: QsuLD = Qdep+Qinv. + *-----------------*/ + QsuLD = Cox0 * ( VgpLD - Ps0LD ) ; + QsuLD_dVxb = Cox0 * ( - Ps0LD_dVxb ) ; + QsuLD_dVgb = Cox0 * ( VgpLD_dVgb - Ps0LD_dVgb ) ; + + if ( model->HSM2_coqovsm == 1 ) { /* take initial values from analytical model */ + + + /*---------------------------------------------------* + * Calculation of Ps0LD. (beginning of Newton loop) + * - Fs0 : Fs0 = 0 is the equation to be solved. + * - dPs0 : correction value. + *-----------------*/ + + /* initial value too close to flat band should not be used */ + exp_bVbs = exp( beta * - Vxbgmtcl ) ; + T0 = here->HSM2_nin / pParam->HSM2_nover; + cnst1over = T0 * T0; + cfs1 = cnst1over * exp_bVbs ; + + flg_conv = 0 ; + for ( lp_s0 = 1 ; lp_s0 <= 2*lp_s0_max + 1 ; lp_s0 ++ ) { + + Chi = beta * ( Ps0LD + Vxbgmtcl ) ; + + if ( Chi < znbd5 ) { + /*-------------------------------------------* + * zone-D1/D2. (Ps0LD) + *-----------------*/ + fi = Chi * Chi * Chi + * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; + fi_dChi = Chi * Chi + * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; + + fs01 = cfs1 * fi * fi ; + fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ; + + fb = Chi * ( cn_nc51 + + Chi * ( cn_nc52 + + Chi * ( cn_nc53 + + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; + fb_dChi = cn_nc51 + + Chi * ( 2 * cn_nc52 + + Chi * ( 3 * cn_nc53 + + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; + + fs02 = sqrt( fb * fb + fs01 + small ) ; + fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ; + + } else { + /*-------------------------------------------* + * zone-D3. (Ps0LD) + *-----------------*/ + if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */ + exp_Chi = exp( Chi ) ; + fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ; + fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ; + } else { + exp_bPs0 = exp( beta*Ps0LD ) ; + fs01 = cnst1over * ( exp_bPs0 - exp_bVbs ) ; + fs01_dPs0 = cnst1over * beta * exp_bPs0 ; + } + fs02 = sqrt( Chi - 1.0 + fs01 ) ; + fs02_dPs0 = ( beta + fs01_dPs0 ) / fs02 * 0.5 ; + + } /* end of if ( Chi ... ) block */ + /*-----------------------------------------------------------* + * Fs0 + *-----------------*/ + Fs0 = VgpLD - Ps0LD - fac1 * fs02 ; + Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ; + + if ( flg_conv == 1 ) break ; + + dPs0 = - Fs0 / Fs0_dPs0 ; + + /*-------------------------------------------* + * Update Ps0LD . + *-----------------*/ + dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0LD))) ; + if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ; + + Ps0LD = Ps0LD + dPs0 ; + + TX = -Vxbgmtcl + ps_conv / 2 ; + if ( Ps0LD < TX ) Ps0LD = TX ; + + /*-------------------------------------------* + * Check convergence. + *-----------------*/ + if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) { + flg_conv = 1 ; + } + + } /* end of Ps0LD Newton loop */ + + /*-------------------------------------------* + * Procedure for diverged case. + *-----------------*/ + if ( flg_conv == 0 ) { + fprintf( stderr , + "*** warning(HiSIM_HV): Went Over Iteration Maximum (Ps0LD)\n" ) ; + fprintf( stderr , " -Vxbgmtcl = %e Vgbgmt = %e\n" , -Vxbgmtcl , Vgbgmt ) ; + } + + /*---------------------------------------------------* + * Evaluate derivatives of Ps0LD. + *-----------------*/ + + if ( Chi < znbd5 ) { + fs01_dVbs = cfs1 * beta * fi * ( - fi + 2 * fi_dChi ) ; /* fs01_dVxbgmtcl */ + T2 = 1.0e0 / ( fs02 + fs02 ) ; + fs02_dVbs = ( + beta * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */ + } else { + if ( Chi < large_arg ) { + fs01_dVbs = + cfs1 * beta ; /* fs01_dVxbgmtcl */ + } else { + fs01_dVbs = + cfs1 * beta ; + } + T2 = 0.5e0 / fs02 ; + fs02_dVbs = ( + beta + fs01_dVbs ) * T2 ; /* fs02_dVxbgmtcl */ + } + + T1 = 1.0 / Fs0_dPs0 ; + Ps0LD_dVxb = - ( - fac1 * fs02_dVbs ) * T1 ; + Ps0LD_dVds = 0.0 ; + Ps0LD_dVgb = - ( VgpLD_dVgb - fac1_dVgs * fs02 ) * T1 ; + + + if ( Chi < znbd5 ) { + /*-------------------------------------------* + * zone-D1/D2. (Ps0LD) + *-----------------*/ + if ( Chi < znbd3 ) { flg_ovzone = 1; } + else { flg_ovzone = 2; } + + Xi0 = fb * fb + epsm10 ; + T1 = 2 * fb * fb_dChi * beta ; + Xi0_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0_dVxbgmtcl */ + Xi0_dVds = T1 * Ps0LD_dVds ; + Xi0_dVgs = T1 * Ps0LD_dVgb ; + + Xi0p12 = fb + epsm10 ; + T1 = fb_dChi * beta ; + Xi0p12_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0p12_dVxbgmtcl */ + Xi0p12_dVds = T1 * Ps0LD_dVds ; + Xi0p12_dVgs = T1 * Ps0LD_dVgb ; + + Xi0p32 = fb * fb * fb + epsm10 ; + T1 = 3 * fb * fb * fb_dChi * beta ; + Xi0p32_dVbs = T1 * ( Ps0LD_dVxb + 1.0 ) ; /* Xi0p32_dVxbgmtcl */ + Xi0p32_dVds = T1 * Ps0LD_dVds ; + Xi0p32_dVgs = T1 * Ps0LD_dVgb ; + + } else { + /*-------------------------------------------* + * zone-D3. (Ps0LD) + *-----------------*/ + flg_ovzone = 3 ; + + Xi0 = Chi - 1.0e0 ; + Xi0_dVbs = beta * ( Ps0LD_dVxb + 1.0e0 ) ; /* Xi0_dVxbgmtcl */ + Xi0_dVds = beta * Ps0LD_dVds ; + Xi0_dVgs = beta * Ps0LD_dVgb ; + + Xi0p12 = sqrt( Xi0 ) ; + T1 = 0.5e0 / Xi0p12 ; + Xi0p12_dVbs = T1 * Xi0_dVbs ; + Xi0p12_dVds = T1 * Xi0_dVds ; + Xi0p12_dVgs = T1 * Xi0_dVgs ; + + Xi0p32 = Xi0 * Xi0p12 ; + T1 = 1.5e0 * Xi0p12 ; + Xi0p32_dVbs = T1 * Xi0_dVbs ; + Xi0p32_dVds = T1 * Xi0_dVds ; + Xi0p32_dVgs = T1 * Xi0_dVgs ; + + if ( Chi < large_arg ) { + } else { + } + } /* end of if ( Chi ... ) block */ + + /*-----------------------------------------------------------* + * - Recalculate the derivatives of fs01 and fs02. + *-----------------*/ + fs01_dVbs = Ps0LD_dVxb * fs01_dPs0 + fs01_dVbs ; + fs01_dVds = Ps0LD_dVds * fs01_dPs0 ; + fs01_dVgs = Ps0LD_dVgb * fs01_dPs0 ; + fs02_dVbs = Ps0LD_dVxb * fs02_dPs0 + fs02_dVbs ; + fs02_dVxb = Ps0LD_dVds * fs02_dPs0 ; + fs02_dVgb = Ps0LD_dVgb * fs02_dPs0 ; + + /*-----------------------------------------------------------* + * QbuLD and QiuLD + *-----------------*/ + QbuLD = here->HSM2_cnst0over * Xi0p12 ; + QbuLD_dVxb = here->HSM2_cnst0over * Xi0p12_dVbs ; + QbuLD_dVgb = here->HSM2_cnst0over * Xi0p12_dVgs ; + + T1 = 1.0 / ( fs02 + Xi0p12 ) ; + QiuLD = here->HSM2_cnst0over * fs01 * T1 ; + T2 = 1.0 / ( fs01 + epsm10 ) ; + QiuLD_dVbs = QiuLD * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ; + QiuLD_dVgs = QiuLD * ( fs01_dVgs * T2 - ( fs02_dVgb + Xi0p12_dVgs ) * T1 ) ; + + /*-----------------------------------------------------------* + * Extrapolation: X_dVxbgmt = X_dVxbgmtcl * Vxbgmtcl_dVxbgmt + *-----------------*/ + QbuLD_dVxb *= Vxbgmtcl_dVxbgmt ; + QiuLD_dVbs *= Vxbgmtcl_dVxbgmt ; + + /*-----------------------------------------------------------* + * Total overlap charge + *-----------------*/ + QsuLD = QbuLD + QiuLD; + QsuLD_dVxb = QbuLD_dVxb + QiuLD_dVbs; + QsuLD_dVgb = QbuLD_dVgb + QiuLD_dVgs; + + } /* end of COQOVSM branches */ + + } /* end of Vgbgmt region blocks */ + - T1 = 1.0 / ( fs02 + Xi0p12 ) ; - QiuLD = here->HSM2_cnst0over * fs01 * T1 ; - T2 = 1.0 / ( fs01 + epsm10 ) ; - QiuLD_dVbs = QiuLD * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ; - QiuLD_dVgs = QiuLD * ( fs01_dVgs * T2 - ( fs02_dVgs + Xi0p12_dVgs ) * T1 ) ; + /* convert to source ref. */ + QsuLD_dVbs = - (QsuLD_dVxb + QsuLD_dVgb) ; + QsuLD_dVds = QsuLD_dVxb * flg_overd ; + QsuLD_dVgs = QsuLD_dVgb ; - /*-----------------------------------------------------------* - * make QiuLD=0 if VgVt <= VgVt_small - *-----------------*/ - if ( QiuLD * Cox_inv <= VgVt_small ) { - flg_ovzone = 4 ; - QiuLD = 0.0 ; - QiuLD_dVbs = 0.0 ; - QiuLD_dVgs = 0.0 ; - } + QbuLD_dVbs = - (QbuLD_dVxb + QbuLD_dVgb) ; + QbuLD_dVds = QbuLD_dVxb * flg_overd ; + QbuLD_dVgs = QbuLD_dVgb ; - /*-----------------------------------------------------------* - * Extrapolation: X_dVxbgmt = X_dVxbgmtcl * Vxbgmtcl_dVxbgmt - *-----------------*/ - QbuLD_dVxb *= Vxbgmtcl_dVxbgmt; - QiuLD_dVbs *= Vxbgmtcl_dVxbgmt; + /* inversion charge = total - depletion */ + QiuLD = QsuLD - QbuLD ; + QiuLD_dVbs = QsuLD_dVbs - QbuLD_dVbs ; + QiuLD_dVds = QsuLD_dVds - QbuLD_dVds ; + QiuLD_dVgs = QsuLD_dVgs - QbuLD_dVgs ; - /*-----------------------------------------------------------* - * Total overlap charge - *-----------------*/ - QsuLD = QbuLD + QiuLD; - QsuLD_dVxb = QbuLD_dVxb + QiuLD_dVbs; - QsuLD_dVgb = QbuLD_dVgb + QiuLD_dVgs; + /* assign final outputs of Qover model */ + /* note: Qovs and Qovd are exchanged in reverse mode */ + T4 = here->HSM2_weff_nf * Lov ; - } /* end of COQOVSM branches */ + if(flg_ovloops) { + Qovs = T4 * QsuLD ; + Qovs_dVbs = T4 * QsuLD_dVbs ; + Qovs_dVds = T4 * QsuLD_dVds ; + Qovs_dVgs = T4 * QsuLD_dVgs ; + QisLD = T4 * QiuLD ; + QisLD_dVbs = T4 * QiuLD_dVbs ; + QisLD_dVds = T4 * QiuLD_dVds ; + QisLD_dVgs = T4 * QiuLD_dVgs ; + QbsLD = T4 * QbuLD ; + QbsLD_dVbs = T4 * QbuLD_dVbs ; + QbsLD_dVds = T4 * QbuLD_dVds ; + QbsLD_dVgs = T4 * QbuLD_dVgs ; + } - } /* end of Vgbgmt region blocks */ - - /* convert to source ref. */ - QsuLD_dVbs = - (QsuLD_dVxb + QsuLD_dVgb) ; - QsuLD_dVds = QsuLD_dVxb * flg_overd ; - QsuLD_dVgs = QsuLD_dVgb ; - - QbuLD_dVbs = - (QbuLD_dVxb + QbuLD_dVgb) ; - QbuLD_dVds = QbuLD_dVxb * flg_overd ; - QbuLD_dVgs = QbuLD_dVgb ; - - /* inversion charge = total - depletion */ - QiuLD = QsuLD - QbuLD ; - QiuLD_dVbs = QsuLD_dVbs - QbuLD_dVbs ; - QiuLD_dVds = QsuLD_dVds - QbuLD_dVds ; - QiuLD_dVgs = QsuLD_dVgs - QbuLD_dVgs ; - - /* assign final outputs of Qover model */ - /* note: Qovs and Qovd are exchanged in reverse mode */ - T4 = here->HSM2_weff_nf * Lov ; - - if(flg_ovloops) { - Qovs = T4 * QsuLD ; - Qovs_dVbs = T4 * QsuLD_dVbs ; - Qovs_dVds = T4 * QsuLD_dVds ; - Qovs_dVgs = T4 * QsuLD_dVgs ; - QisLD = T4 * QiuLD ; - QisLD_dVbs = T4 * QiuLD_dVbs ; - QisLD_dVds = T4 * QiuLD_dVds ; - QisLD_dVgs = T4 * QiuLD_dVgs ; - QbsLD = T4 * QbuLD ; - QbsLD_dVbs = T4 * QbuLD_dVbs ; - QbsLD_dVds = T4 * QbuLD_dVds ; - QbsLD_dVgs = T4 * QbuLD_dVgs ; - } - - if(flg_ovloopd) { - Qovd = T4 * QsuLD ; - Qovd_dVbs = T4 * QsuLD_dVbs ; - Qovd_dVds = T4 * QsuLD_dVds ; - Qovd_dVgs = T4 * QsuLD_dVgs ; - QidLD = T4 * QiuLD ; - QidLD_dVbs = T4 * QiuLD_dVbs ; - QidLD_dVds = T4 * QiuLD_dVds ; - QidLD_dVgs = T4 * QiuLD_dVgs ; - QbdLD = T4 * QbuLD ; - QbdLD_dVbs = T4 * QbuLD_dVbs ; - QbdLD_dVds = T4 * QbuLD_dVds ; - QbdLD_dVgs = T4 * QbuLD_dVgs ; - } + if(flg_ovloopd) { + Qovd = T4 * QsuLD ; + Qovd_dVbs = T4 * QsuLD_dVbs ; + Qovd_dVds = T4 * QsuLD_dVds ; + Qovd_dVgs = T4 * QsuLD_dVgs ; + QidLD = T4 * QiuLD ; + QidLD_dVbs = T4 * QiuLD_dVbs ; + QidLD_dVds = T4 * QiuLD_dVds ; + QidLD_dVgs = T4 * QiuLD_dVgs ; + QbdLD = T4 * QbuLD ; + QbdLD_dVbs = T4 * QbuLD_dVbs ; + QbdLD_dVds = T4 * QbuLD_dVds ; + QbdLD_dVgs = T4 * QbuLD_dVgs ; + } } /* end of lcover loop */ @@ -5978,7 +5966,7 @@ start_of_mobility: /*-------------------------------------------* * Gate/Bulk overlap charge: Qgbo *-----------------*/ - Cgbo_loc = - model->HSM2_cgbo * here->HSM2_lgate ; + Cgbo_loc = - modelCGS->HSM2_cgbo * here->HSM2_lgate ; Qgbo = - Cgbo_loc * (Vgs -Vbs) ; Qgbo_dVgs = - Cgbo_loc ; Qgbo_dVbs = Cgbo_loc ; @@ -5987,7 +5975,7 @@ start_of_mobility: /*---------------------------------------------------* * Lateral-field-induced capacitance. *-----------------*/ - if ( model->HSM2_coqy == 0 || model->HSM2_xqy == 0 ){ + if ( model->HSM2_coqy == 0 || modelCGS->HSM2_xqy == 0 ){ Qy = 0.0e0 ; Qy_dVds = 0.0e0 ; Qy_dVgs = 0.0e0 ; @@ -6024,7 +6012,7 @@ start_of_mobility: T3 = T10 * 1.3 ; T2 = C_ESI * here->HSM2_weff_nf * T3 ; T7 = 1.0e-7 ; /* 1nm */ - T0 = Fn_Max( model->HSM2_xqy , T7 ) ; + T0 = Fn_Max( modelCGS->HSM2_xqy , T7 ) ; T4 = T2 / T0 ; Qy = - ( Ps0 + Vds - T1 ) * T4 ; Qy_dVds = - ( Ps0_dVds + 1.0e0 - T1_dVd ) * T4 ; @@ -6200,19 +6188,19 @@ start_of_mobility: tcjbdswg=model->HSM2_tcjbdswg; tcjbsswg=model->HSM2_tcjbsswg; - czbs = model->HSM2_cj * here->HSM2_as ; - czbs = czbs * ( 1.0 + tcjbs * ( TTEMP - model->HSM2_tnom )) ; + czbs = modelCGS->HSM2_cj * hereCGS->HSM2_as ; + czbs = czbs * ( 1.0 + tcjbs * ( TTEMP - model->HSM2_ktnom )) ; - czbd = model->HSM2_cj * here->HSM2_ad ; - czbd = czbd * ( 1.0 + tcjbd * ( TTEMP - model->HSM2_tnom )) ; + czbd = modelCGS->HSM2_cj * hereCGS->HSM2_ad ; + czbd = czbd * ( 1.0 + tcjbd * ( TTEMP - model->HSM2_ktnom )) ; /* Source Bulk Junction */ - if (here->HSM2_ps > here->HSM2_weff_nf) { - czbssw = model->HSM2_cjsw * ( here->HSM2_ps - here->HSM2_weff_nf ) ; - czbssw = czbssw * ( 1.0 + tcjbssw * ( TTEMP - model->HSM2_tnom )) ; + if (hereCGS->HSM2_ps > here->HSM2_weff_nf) { + czbssw = modelCGS->HSM2_cjsw * ( hereCGS->HSM2_ps - here->HSM2_weff_nf ) ; + czbssw = czbssw * ( 1.0 + tcjbssw * ( TTEMP - model->HSM2_ktnom )) ; - czbsswg = model->HSM2_cjswg * here->HSM2_weff_nf ; - czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSM2_tnom )) ; + czbsswg = modelCGS->HSM2_cjswg * here->HSM2_weff_nf ; + czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSM2_ktnom )) ; if (vbs_jct == 0.0) { Qbs = 0.0 ; @@ -6257,8 +6245,8 @@ start_of_mobility: Capbs = T1 + vbs_jct * T2 ; } } else { - czbsswg = model->HSM2_cjswg * here->HSM2_ps ; - czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSM2_tnom )) ; + czbsswg = modelCGS->HSM2_cjswg * hereCGS->HSM2_ps ; + czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSM2_ktnom )) ; if (vbs_jct == 0.0) { Qbs = 0.0 ; Capbs = czbs + czbsswg ; @@ -6294,11 +6282,11 @@ start_of_mobility: } /* Drain Bulk Junction */ - if (here->HSM2_pd > here->HSM2_weff_nf) { - czbdsw = model->HSM2_cjsw * ( here->HSM2_pd - here->HSM2_weff_nf ) ; - czbdsw = czbdsw * ( 1.0 + tcjbdsw * ( TTEMP - model->HSM2_tnom )) ; - czbdswg = model->HSM2_cjswg * here->HSM2_weff_nf ; - czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSM2_tnom )) ; + if (hereCGS->HSM2_pd > here->HSM2_weff_nf) { + czbdsw = modelCGS->HSM2_cjsw * ( hereCGS->HSM2_pd - here->HSM2_weff_nf ) ; + czbdsw = czbdsw * ( 1.0 + tcjbdsw * ( TTEMP - model->HSM2_ktnom )) ; + czbdswg = modelCGS->HSM2_cjswg * here->HSM2_weff_nf ; + czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSM2_ktnom )) ; if (vbd_jct == 0.0) { Qbd = 0.0 ; Capbd = czbd + czbdsw + czbdswg ; @@ -6343,8 +6331,8 @@ start_of_mobility: } } else { - czbdswg = model->HSM2_cjswg * here->HSM2_pd ; - czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSM2_tnom )) ; + czbdswg = modelCGS->HSM2_cjswg * hereCGS->HSM2_pd ; + czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSM2_ktnom )) ; if (vbd_jct == 0.0) { Qbd = 0.0 ; Capbd = czbd + czbdswg ; @@ -7545,9 +7533,10 @@ start_of_mobility: here->HSM2_noicross = crl_f ; if ( here->HSM2_noiigate < 0.0 ) here->HSM2_noiigate = 0.0e0 ; }else{ - here->HSM2_noiigate = 0.0e0 ; - here->HSM2_noicross = 0.0e0 ; - } + here->HSM2_noiigate = 0.0e0 ; + here->HSM2_noicross = 0.0e0 ; + } + here->HSM2_Qdrat = Qdrat ; /* needed for calculating induced gate noise */ }else{ here->HSM2_noiigate = 0.0e0 ; here->HSM2_noicross = 0.0e0 ; diff --git a/src/spicelib/devices/hisim2/hsm2evalenv.h b/src/spicelib/devices/hisim2/hsm2evalenv.h index 192ab8a6a..a65bfba0f 100644 --- a/src/spicelib/devices/hisim2/hsm2evalenv.h +++ b/src/spicelib/devices/hisim2/hsm2evalenv.h @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2evalenv.h - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & diff --git a/src/spicelib/devices/hisim2/hsm2ext.h b/src/spicelib/devices/hisim2/hsm2ext.h index 1d24ebf08..c7aa99a1d 100644 --- a/src/spicelib/devices/hisim2/hsm2ext.h +++ b/src/spicelib/devices/hisim2/hsm2ext.h @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2ext.h - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & diff --git a/src/spicelib/devices/hisim2/hsm2getic.c b/src/spicelib/devices/hisim2/hsm2getic.c index 652105be6..217e5998b 100644 --- a/src/spicelib/devices/hisim2/hsm2getic.c +++ b/src/spicelib/devices/hisim2/hsm2getic.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2getic.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -14,7 +14,6 @@ ***********************************************************************/ #include "ngspice/ngspice.h" -#include #include "ngspice/cktdefs.h" #include "hsm2def.h" #include "ngspice/sperror.h" diff --git a/src/spicelib/devices/hisim2/hsm2init.c b/src/spicelib/devices/hisim2/hsm2init.c index 93d3c494e..d82d83a54 100644 --- a/src/spicelib/devices/hisim2/hsm2init.c +++ b/src/spicelib/devices/hisim2/hsm2init.c @@ -8,7 +8,7 @@ SPICEdev HSM2info = { { "HiSIM2", - "Hiroshima University STARC IGFET Model 2.5.1", + "Hiroshima University STARC IGFET Model 2.6.1", &HSM2nSize, &HSM2nSize, diff --git a/src/spicelib/devices/hisim2/hsm2itf.h b/src/spicelib/devices/hisim2/hsm2itf.h index 243bd424e..407e41c43 100644 --- a/src/spicelib/devices/hisim2/hsm2itf.h +++ b/src/spicelib/devices/hisim2/hsm2itf.h @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2itf.h - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & diff --git a/src/spicelib/devices/hisim2/hsm2ld.c b/src/spicelib/devices/hisim2/hsm2ld.c index bf46f63ee..45936f853 100644 --- a/src/spicelib/devices/hisim2/hsm2ld.c +++ b/src/spicelib/devices/hisim2/hsm2ld.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2ld.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -45,7 +45,6 @@ static double vsum0 = 1.0e5 ; #endif #endif - static void ShowPhysVals ( HSM2instance *here, @@ -61,7 +60,6 @@ static void ShowPhysVals { NG_IGNORE(vgd); NG_IGNORE(vbd); - /* regard the epsilon-quantity as 0.0 */ vds = (fabs(vds) < SHOW_EPS_QUANT) ? 0.0 : vds; vgs = (fabs(vgs) < SHOW_EPS_QUANT) ? 0.0 : vgs; @@ -906,7 +904,7 @@ tm0 = gtodsecld() ; *(ckt->CKTstate1 + here->HSM2qbd) = *(ckt->CKTstate0 + here->HSM2qbd); } } - + return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSM2qb)); return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSM2qg)); return_if_error (NIintegrate(ckt, &geq, &ceq, 0.0, here->HSM2qd)); diff --git a/src/spicelib/devices/hisim2/hsm2mask.c b/src/spicelib/devices/hisim2/hsm2mask.c index 14f8ef85c..fb194d7ec 100644 --- a/src/spicelib/devices/hisim2/hsm2mask.c +++ b/src/spicelib/devices/hisim2/hsm2mask.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2mask.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -14,7 +14,6 @@ ***********************************************************************/ #include "ngspice/ngspice.h" -#include #include "ngspice/ifsim.h" #include "ngspice/cktdefs.h" #include "ngspice/devdefs.h" @@ -823,6 +822,22 @@ int HSM2mAsk( case HSM2_MOD_MUEPWP2: value->rValue = model->HSM2_muepwp2; return(OK); +/* WPE */ + case HSM2_MOD_WEB: + value->rValue = model->HSM2_web; + return(OK); + case HSM2_MOD_WEC: + value->rValue = model->HSM2_wec; + return(OK); + case HSM2_MOD_NSUBCWPE: + value->rValue = model->HSM2_nsubcwpe; + return(OK); + case HSM2_MOD_NPEXTWPE: + value->rValue = model->HSM2_npextwpe; + return(OK); + case HSM2_MOD_NSUBPWPE: + value->rValue = model->HSM2_nsubpwpe; + return(OK); case HSM2_MOD_VGSMIN: value->rValue = model->HSM2_Vgsmin; return(OK); diff --git a/src/spicelib/devices/hisim2/hsm2mdel.c b/src/spicelib/devices/hisim2/hsm2mdel.c index 75df8c282..d395ddc5e 100644 --- a/src/spicelib/devices/hisim2/hsm2mdel.c +++ b/src/spicelib/devices/hisim2/hsm2mdel.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2mdel.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -14,7 +14,6 @@ ***********************************************************************/ #include "ngspice/ngspice.h" -#include #include "hsm2def.h" #include "ngspice/sperror.h" #include "ngspice/suffix.h" diff --git a/src/spicelib/devices/hisim2/hsm2mpar.c b/src/spicelib/devices/hisim2/hsm2mpar.c index 96b345791..7cfc3f3c3 100644 --- a/src/spicelib/devices/hisim2/hsm2mpar.c +++ b/src/spicelib/devices/hisim2/hsm2mpar.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2mpar.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -14,7 +14,6 @@ ***********************************************************************/ #include "ngspice/ngspice.h" -#include #include "hsm2def.h" #include "ngspice/ifsim.h" #include "ngspice/sperror.h" @@ -1083,6 +1082,27 @@ int HSM2mParam( mod->HSM2_muepwp2 = value->rValue; mod->HSM2_muepwp2_Given = TRUE; break; +/* WPE */ + case HSM2_MOD_WEB: + mod->HSM2_web = value->rValue; + mod->HSM2_web_Given = TRUE; + break; + case HSM2_MOD_WEC: + mod->HSM2_wec = value->rValue; + mod->HSM2_wec_Given = TRUE; + break; + case HSM2_MOD_NSUBCWPE: + mod->HSM2_nsubcwpe = value->rValue; + mod->HSM2_nsubcwpe_Given = TRUE; + break; + case HSM2_MOD_NPEXTWPE: + mod->HSM2_npextwpe = value->rValue; + mod->HSM2_npextwpe_Given = TRUE; + break; + case HSM2_MOD_NSUBPWPE: + mod->HSM2_nsubpwpe = value->rValue; + mod->HSM2_nsubpwpe_Given = TRUE; + break; case HSM2_MOD_VGSMIN: mod->HSM2_Vgsmin = value->rValue; mod->HSM2_Vgsmin_Given = TRUE; diff --git a/src/spicelib/devices/hisim2/hsm2noi.c b/src/spicelib/devices/hisim2/hsm2noi.c index 22351bd3c..2fe59cb14 100644 --- a/src/spicelib/devices/hisim2/hsm2noi.c +++ b/src/spicelib/devices/hisim2/hsm2noi.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2noi.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -14,8 +14,6 @@ ***********************************************************************/ #include "ngspice/ngspice.h" -#include -#include #include "hsm2def.h" #include "ngspice/cktdefs.h" #include "ngspice/iferrmsg.h" @@ -32,6 +30,9 @@ * all of the MOSFET's is summed with the variable "OnDens". */ +extern void NevalSrc(); +extern double Nintegrate(); + int HSM2noise ( int mode, int operation, GENmodel *inModel, @@ -39,8 +40,6 @@ int HSM2noise ( register Ndata *data, double *OnDens) { - NOISEAN *job = (NOISEAN *) ckt->CKTcurJob; - register HSM2model *model = (HSM2model *)inModel; register HSM2instance *here; char name[N_MXVLNTH]; @@ -51,6 +50,11 @@ int HSM2noise ( register int i; double R = 0.0 , G = 0.0 ; double TTEMP = 0.0 ; + + /* for induced gate noise calculation: */ + double omega = ckt->CKTomega; + double sid, ci, sigrat, Qdrat; + double realXds, imagXds, realXgs, imagXgs ; /* define the names of the noise sources */ static char * HSM2nNames[HSM2NSRCS] = { @@ -76,42 +80,45 @@ int HSM2noise ( /* see if we have to to produce a summary report */ /* if so, name all the noise generators */ - if (job->NStpsSm != 0) { + if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) { switch (mode) { case N_DENS: for ( i = 0; i < HSM2NSRCS; i++ ) { (void) sprintf(name, "onoise.%s%s", - here->HSM2name, HSM2nNames[i]); + (char *)here->HSM2name, HSM2nNames[i]); data->namelist = - TREALLOC(IFuid, data->namelist, data->numPlots + 1); + (IFuid *) trealloc((char *) data->namelist, + (data->numPlots + 1) * sizeof(IFuid)); if (!data->namelist) return(E_NOMEM); - SPfrontEnd->IFnewUid + (*(SPfrontEnd->IFnewUid)) (ckt, &(data->namelist[data->numPlots++]), - NULL, name, UID_OTHER, NULL); + (IFuid) NULL, name, UID_OTHER, NULL); } break; case INT_NOIZ: for ( i = 0; i < HSM2NSRCS; i++ ) { (void) sprintf(name, "onoise_total.%s%s", - here->HSM2name, HSM2nNames[i]); + (char *)here->HSM2name, HSM2nNames[i]); data->namelist = - TREALLOC(IFuid, data->namelist, data->numPlots + 1); + (IFuid *) trealloc((char *) data->namelist, + (data->numPlots + 1) * sizeof(IFuid)); if (!data->namelist) return(E_NOMEM); - SPfrontEnd->IFnewUid + (*(SPfrontEnd->IFnewUid)) (ckt, &(data->namelist[data->numPlots++]), - NULL, name, UID_OTHER, NULL); + (IFuid) NULL, name, UID_OTHER, NULL); (void) sprintf(name, "inoise_total.%s%s", - here->HSM2name, HSM2nNames[i]); + (char *)here->HSM2name, HSM2nNames[i]); data->namelist = - TREALLOC(IFuid, data->namelist, data->numPlots + 1); + (IFuid *) trealloc((char *) data->namelist, + (data->numPlots + 1) * sizeof(IFuid)); if (!data->namelist) return(E_NOMEM); - SPfrontEnd->IFnewUid + (*(SPfrontEnd->IFnewUid)) (ckt, &(data->namelist[data->numPlots++]), - NULL, name, UID_OTHER, NULL); + (IFuid) NULL, name, UID_OTHER, NULL); } break; } @@ -123,7 +130,7 @@ int HSM2noise ( /* temperature */ TTEMP = ckt->CKTtemp ; - if ( here->HSM2_temp_Given ) TTEMP = here->HSM2_temp ; + if ( here->HSM2_temp_Given ) TTEMP = here->HSM2_ktemp ; if ( here->HSM2_dtemp_Given ) { TTEMP = TTEMP + here->HSM2_dtemp ; } @@ -215,11 +222,19 @@ int HSM2noise ( switch ( model->HSM2_noise ) { case 1: /* HiSIM model */ - NevalSrc(&noizDens[HSM2IGNOIZ], (double*) NULL, - ckt, N_GAIN, - here->HSM2dNodePrime, here->HSM2sNodePrime, - (double) 0.0); - noizDens[HSM2IGNOIZ] *= here->HSM2_noiigate * here->HSM2_noicross * here->HSM2_noicross * data->freq * data->freq; + sid = 4.0 * CONSTboltz * TTEMP * here->HSM2_noithrml ; + ci = here->HSM2_noicross ; + sigrat = (sid > 0.0 && here->HSM2_noiigate > 0.0) ? sqrt(here->HSM2_noiigate/sid) : 0.0 ; + Qdrat = here->HSM2_Qdrat ; + + realXds = *(ckt->CKTrhs +here->HSM2dNodePrime) - *(ckt->CKTrhs +here->HSM2sNodePrime); + imagXds = *(ckt->CKTirhs+here->HSM2dNodePrime) - *(ckt->CKTirhs+here->HSM2sNodePrime); + realXgs = *(ckt->CKTrhs +here->HSM2gNodePrime) - *(ckt->CKTrhs +here->HSM2sNodePrime); + imagXgs = *(ckt->CKTirhs+here->HSM2gNodePrime) - *(ckt->CKTirhs+here->HSM2sNodePrime); + + noizDens[HSM2IGNOIZ] = 2.0 * omega * ci * sigrat * sid * ( realXgs*imagXds - realXds*imagXgs ) + + omega*omega * sigrat*sigrat * sid * ( (realXgs-Qdrat*realXds) * (realXgs-Qdrat*realXds) + +(imagXgs-Qdrat*imagXds) * (imagXgs-Qdrat*imagXds) ) ; lnNdens[HSM2IGNOIZ] = log(MAX(noizDens[HSM2IGNOIZ], N_MINLOG)); break; } @@ -247,7 +262,7 @@ int HSM2noise ( /* clear out our integration variables if it's the first pass */ - if (data->freq == job->NstartFreq) { + if (data->freq == ((NOISEAN*) ckt->CKTcurJob)->NstartFreq) { for (i = 0; i < HSM2NSRCS; i++) { here->HSM2nVar[OUTNOIZ][i] = 0.0; here->HSM2nVar[INNOIZ][i] = 0.0; @@ -271,7 +286,7 @@ int HSM2noise ( here->HSM2nVar[LNLSTDENS][i] = lnNdens[i]; data->outNoiz += tempOnoise; data->inNoise += tempInoise; - if ( job->NStpsSm != 0 ) { + if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) { here->HSM2nVar[OUTNOIZ][i] += tempOnoise; here->HSM2nVar[OUTNOIZ][HSM2TOTNOIZ] += tempOnoise; here->HSM2nVar[INNOIZ][i] += tempInoise; @@ -289,7 +304,7 @@ int HSM2noise ( break; case INT_NOIZ: /* already calculated, just output */ - if ( job->NStpsSm != 0 ) { + if ( ((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0 ) { for ( i = 0; i < HSM2NSRCS; i++ ) { data->outpVector[data->outNumber++] = here->HSM2nVar[OUTNOIZ][i]; data->outpVector[data->outNumber++] = here->HSM2nVar[INNOIZ][i]; diff --git a/src/spicelib/devices/hisim2/hsm2par.c b/src/spicelib/devices/hisim2/hsm2par.c index 299e6141c..ed862b05f 100644 --- a/src/spicelib/devices/hisim2/hsm2par.c +++ b/src/spicelib/devices/hisim2/hsm2par.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2par.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -14,7 +14,6 @@ ***********************************************************************/ #include "ngspice/ngspice.h" -#include #include "ngspice/ifsim.h" #include "hsm2def.h" #include "ngspice/sperror.h" @@ -174,6 +173,20 @@ int HSM2param( here->HSM2_m = value->rValue; here->HSM2_m_Given = TRUE; break; + +/* WPE */ + case HSM2_SCA: + here->HSM2_sca = value->rValue; + here->HSM2_sca_Given = TRUE; + break; + case HSM2_SCB: + here->HSM2_scb = value->rValue; + here->HSM2_scb_Given = TRUE; + break; + case HSM2_SCC: + here->HSM2_scc= value->rValue; + here->HSM2_scc_Given = TRUE; + break; default: return(E_BADPARM); } diff --git a/src/spicelib/devices/hisim2/hsm2pzld.c b/src/spicelib/devices/hisim2/hsm2pzld.c index 1879abc73..2e6460df8 100644 --- a/src/spicelib/devices/hisim2/hsm2pzld.c +++ b/src/spicelib/devices/hisim2/hsm2pzld.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2pzld.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -14,7 +14,6 @@ ***********************************************************************/ #include "ngspice/ngspice.h" -#include #include "ngspice/cktdefs.h" #include "ngspice/complex.h" #include "ngspice/sperror.h" @@ -28,8 +27,8 @@ int HSM2pzLoad( { register HSM2model *model = (HSM2model*)inModel; register HSM2instance *here; - double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb; - double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb; + double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb = 0.0, xcbsb, xcbbb; + double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb = 0.0, xcssb, xcsbb; double xcdbdb = 0.0, xcsbsb = 0.0; double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, gm, gmbs; double gjbd, gjbs, grg; diff --git a/src/spicelib/devices/hisim2/hsm2set.c b/src/spicelib/devices/hisim2/hsm2set.c index 6051a6f9a..313ac0119 100644 --- a/src/spicelib/devices/hisim2/hsm2set.c +++ b/src/spicelib/devices/hisim2/hsm2set.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2set.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -14,7 +14,6 @@ ***********************************************************************/ #include "ngspice/ngspice.h" -#include #include "ngspice/smpdefs.h" #include "ngspice/cktdefs.h" #include "hsm2def.h" @@ -49,13 +48,13 @@ int HSM2setup( model->HSM2_noise = 1; /* allways noise is set to be 1 */ if ( !model->HSM2_version_Given) { - model->HSM2_version = 251; /* default 251 */ - printf(" 251 is selected for VERSION. (default) \n"); + model->HSM2_version = 261; /* default 261 */ + printf(" 261 is selected for VERSION. (default) \n"); } else { - if (model->HSM2_version != 251) { - model->HSM2_version = 251; /* default 251 */ - printf(" 251 is only available for VERSION. \n"); - printf(" 251 is selected for VERSION. (default) \n"); + if (model->HSM2_version != 261) { + model->HSM2_version = 261; /* default 261 */ + printf(" 261 is only available for VERSION. \n"); + printf(" 261 is selected for VERSION. (default) \n"); } else { printf(" %d is selected for VERSION \n", (int)model->HSM2_version); } @@ -357,6 +356,12 @@ int HSM2setup( if ( !model->HSM2_nsubcwp2_Given ) model->HSM2_nsubcwp2 = 1.0 ; if ( !model->HSM2_muephw2_Given ) model->HSM2_muephw2 = 0.0 ; if ( !model->HSM2_muepwp2_Given ) model->HSM2_muepwp2 = 1.0 ; + /* WPE set default Model parameter value */ + if ( !model->HSM2_web_Given ) model->HSM2_web = 0.0 ; + if ( !model->HSM2_wec_Given ) model->HSM2_wec = 0.0 ; + if ( !model->HSM2_nsubcwpe_Given ) model->HSM2_nsubcwpe = 0.0 ; + if ( !model->HSM2_npextwpe_Given ) model->HSM2_npextwpe = 0.0 ; + if ( !model->HSM2_nsubpwpe_Given ) model->HSM2_nsubpwpe = 0.0 ; if ( !model->HSM2_Vgsmin_Given ) model->HSM2_Vgsmin = -5.0 * model->HSM2_type ; if ( !model->HSM2_sc3Vbs_Given ) model->HSM2_sc3Vbs = 0.0 ; if ( !model->HSM2_byptol_Given ) model->HSM2_byptol = 0.0 ; @@ -611,8 +616,8 @@ int HSM2setup( if ( !here->HSM2_as_Given ) here->HSM2_as = 0.0 ; if ( !here->HSM2_pd_Given ) here->HSM2_pd = 0.0 ; if ( !here->HSM2_ps_Given ) here->HSM2_ps = 0.0 ; - if ( !here->HSM2_nrd_Given ) here->HSM2_nrd = 1.0 ; - if ( !here->HSM2_nrs_Given ) here->HSM2_nrs = 1.0 ; + if ( !here->HSM2_nrd_Given ) here->HSM2_nrd = 0.0 ; + if ( !here->HSM2_nrs_Given ) here->HSM2_nrs = 0.0 ; if ( !here->HSM2_ngcon_Given ) here->HSM2_ngcon = 1.0 ; if ( !here->HSM2_xgw_Given ) here->HSM2_xgw = 0e0 ; if ( !here->HSM2_xgl_Given ) here->HSM2_xgl = 0e0 ; @@ -649,34 +654,42 @@ int HSM2setup( if ( !here->HSM2_mphdfm_Given ) here->HSM2_mphdfm = model->HSM2_mphdfm ; if ( !here->HSM2_m_Given ) here->HSM2_m = 1.0 ; - - + /* WPE */ + if ( !here->HSM2_sca_Given ) here->HSM2_sca = 0.0 ; /* default value */ + if ( !here->HSM2_scb_Given ) here->HSM2_scb = 0.0 ; /* default value */ + if ( !here->HSM2_scc_Given ) here->HSM2_scc = 0.0 ; /* default value */ /* process drain series resistance */ if ((model->HSM2_corsrd < 0 && - (model->HSM2_rsh > 0.0 || model->HSM2_rd > 0.0)) && here->HSM2dNodePrime == 0) { + (model->HSM2_rsh > 0.0 || model->HSM2_rd > 0.0))) { + if(here->HSM2dNodePrime <= 0) { error = CKTmkVolt(ckt, &tmp, here->HSM2name, "drain"); if (error) return(error); here->HSM2dNodePrime = tmp->number; + } } else { here->HSM2dNodePrime = here->HSM2dNode; } /* process source series resistance */ if ((model->HSM2_corsrd < 0 && - (model->HSM2_rsh > 0.0 || model->HSM2_rs > 0.0)) && here->HSM2sNodePrime == 0) { + (model->HSM2_rsh > 0.0 || model->HSM2_rs > 0.0))) { + if(here->HSM2sNodePrime == 0) { error = CKTmkVolt(ckt, &tmp, here->HSM2name, "source"); if (error) return(error); here->HSM2sNodePrime = tmp->number; + } } else { here->HSM2sNodePrime = here->HSM2sNode; } /* process gate resistance */ - if ((here->HSM2_corg == 1 && model->HSM2_rshg > 0.0) && here->HSM2gNodePrime == 0) { + if ((here->HSM2_corg == 1 && model->HSM2_rshg > 0.0)) { + if(here->HSM2gNodePrime <= 0) { error = CKTmkVolt(ckt, &tmp, here->HSM2name, "gate"); if (error) return(error); here->HSM2gNodePrime = tmp->number; + } } else { here->HSM2gNodePrime = here->HSM2gNode; } @@ -773,7 +786,6 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(OK); } - int HSM2unsetup( GENmodel *inModel, diff --git a/src/spicelib/devices/hisim2/hsm2temp.c b/src/spicelib/devices/hisim2/hsm2temp.c index 8ce4f9bef..4d851c22f 100644 --- a/src/spicelib/devices/hisim2/hsm2temp.c +++ b/src/spicelib/devices/hisim2/hsm2temp.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2temp.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -41,8 +41,6 @@ #define Fn_SZtemp( y , x , delta ) { \ T1 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta) ) ; \ y = 0.5 * ( ( x ) + T1 ) ; \ - if (y < 0) \ - y = 0 ; \ } #define Fn_SUtemp( y , x , xmax , delta ) { \ @@ -64,6 +62,8 @@ int HSM2temp( register HSM2model *model = (HSM2model *)inModel ; register HSM2instance *here ; HSM2binningParam *pParam ; + HSM2modelCGSParam *modelCGS ; + HSM2hereCGSParam *hereCGS ; double mueph ; double Leff, dL , LG, Weff, dW , WG , WL , Lgate , Wgate; double Lbin, Wbin, LWbin ; /* binning */ @@ -88,6 +88,7 @@ int HSM2temp( for ( ;model ;model = model->HSM2nextModel ) { + modelCGS = &model->modelCGS ; /*-----------------------------------------------------------* * Range check of model parameters @@ -140,37 +141,37 @@ int HSM2temp( /*-----------------------------------------------------------* * Change units into CGS. *-----------------*/ - model->HSM2_tox *= C_m2cm ; - model->HSM2_xld *= C_m2cm ; - model->HSM2_xwd *= C_m2cm ; - model->HSM2_xqy *= C_m2cm ; - model->HSM2_xl *= C_m2cm ; - model->HSM2_xw *= C_m2cm ; - model->HSM2_saref *= C_m2cm ; - model->HSM2_sbref *= C_m2cm ; - model->HSM2_ll *= C_m2cm ; - model->HSM2_lld *= C_m2cm ; - model->HSM2_wl *= C_m2cm ; - model->HSM2_wld *= C_m2cm ; - model->HSM2_lp *= C_m2cm ; - model->HSM2_tpoly *= C_m2cm ; - model->HSM2_parl2 *= C_m2cm ; - model->HSM2_qme1 *= C_m2cm ; - model->HSM2_qme3 *= C_m2cm ; - model->HSM2_cgbo /= C_m2cm ; - model->HSM2_cj /= C_m2cm_p2 ; - model->HSM2_cjsw /= C_m2cm ; - model->HSM2_cjswg /= C_m2cm ; - model->HSM2_lpext *= C_m2cm ; - model->HSM2_wl1 *= C_m2cm ; - model->HSM2_rs *= C_m2cm ; - model->HSM2_rd *= C_m2cm ; + modelCGS->HSM2_tox = model->HSM2_tox * C_m2cm ; + modelCGS->HSM2_xld = model->HSM2_xld * C_m2cm ; + modelCGS->HSM2_xwd = model->HSM2_xwd * C_m2cm ; + modelCGS->HSM2_xqy = model->HSM2_xqy * C_m2cm ; + modelCGS->HSM2_xl = model->HSM2_xl * C_m2cm ; + modelCGS->HSM2_xw = model->HSM2_xw * C_m2cm ; + modelCGS->HSM2_saref = model->HSM2_saref * C_m2cm ; + modelCGS->HSM2_sbref = model->HSM2_sbref * C_m2cm ; + modelCGS->HSM2_ll = model->HSM2_ll * C_m2cm ; + modelCGS->HSM2_lld = model->HSM2_lld * C_m2cm ; + modelCGS->HSM2_wl = model->HSM2_wl * C_m2cm ; + modelCGS->HSM2_wld = model->HSM2_wld * C_m2cm ; + modelCGS->HSM2_lp = model->HSM2_lp * C_m2cm ; + modelCGS->HSM2_tpoly = model->HSM2_tpoly * C_m2cm ; + modelCGS->HSM2_parl2 = model->HSM2_parl2 * C_m2cm ; + modelCGS->HSM2_qme1 = model->HSM2_qme1 * C_m2cm ; + modelCGS->HSM2_qme3 = model->HSM2_qme3 * C_m2cm ; + modelCGS->HSM2_cgbo = model->HSM2_cgbo / C_m2cm ; + modelCGS->HSM2_cj = model->HSM2_cj / C_m2cm_p2 ; + modelCGS->HSM2_cjsw = model->HSM2_cjsw / C_m2cm ; + modelCGS->HSM2_cjswg = model->HSM2_cjswg / C_m2cm ; + modelCGS->HSM2_lpext = model->HSM2_lpext * C_m2cm ; + modelCGS->HSM2_wl1 = model->HSM2_wl1 * C_m2cm ; + modelCGS->HSM2_rs = model->HSM2_rs * C_m2cm ; + modelCGS->HSM2_rd = model->HSM2_rd * C_m2cm ; GDLD = model->HSM2_gdld * C_m2um ; /*-----------------------------------------------------------* * Change unit into Kelvin. *-----------------*/ - model->HSM2_tnom += 273.15 ; /* [C] -> [K] */ + model->HSM2_ktnom = model->HSM2_tnom + 273.15 ; /* [C] -> [K] */ /* SourceSatCurrent = 1.0e-14 */ @@ -186,37 +187,38 @@ int HSM2temp( } for ( here = model->HSM2instances; here; here = here->HSM2nextInstance ) { + hereCGS = &here->hereCGS ; pParam = &here->pParam ; /*-----------------------------------------------------------* * Range check of instance parameters *-----------------*/ RANGECHECK(here->HSM2_l, model->HSM2_lmin, model->HSM2_lmax, "L") ; - RANGECHECK(here->HSM2_w, model->HSM2_wmin, model->HSM2_wmax, "W") ; + RANGECHECK(here->HSM2_w/here->HSM2_nf, model->HSM2_wmin, model->HSM2_wmax, "W/NF") ; RANGECHECK(here->HSM2_mphdfm, -3.0, 3.0, "MPHDFM") ; /*-----------------------------------------------------------* * Change units into CGS. *-----------------*/ - here->HSM2_l *= C_m2cm ; - here->HSM2_w *= C_m2cm ; - here->HSM2_as *= C_m2cm_p2 ; - here->HSM2_ad *= C_m2cm_p2 ; - here->HSM2_ps *= C_m2cm ; - here->HSM2_pd *= C_m2cm ; - here->HSM2_xgw *= C_m2cm ; - here->HSM2_xgl *= C_m2cm ; - here->HSM2_sa *= C_m2cm ; - here->HSM2_sb *= C_m2cm ; - here->HSM2_sd *= C_m2cm ; + hereCGS->HSM2_l = here->HSM2_l * C_m2cm ; + hereCGS->HSM2_w = here->HSM2_w * C_m2cm ; + hereCGS->HSM2_as = here->HSM2_as * C_m2cm_p2 ; + hereCGS->HSM2_ad = here->HSM2_ad * C_m2cm_p2 ; + hereCGS->HSM2_ps = here->HSM2_ps * C_m2cm ; + hereCGS->HSM2_pd = here->HSM2_pd * C_m2cm ; + hereCGS->HSM2_xgw = here->HSM2_xgw * C_m2cm ; + hereCGS->HSM2_xgl = here->HSM2_xgl * C_m2cm ; + hereCGS->HSM2_sa = here->HSM2_sa * C_m2cm ; + hereCGS->HSM2_sb = here->HSM2_sb * C_m2cm ; + hereCGS->HSM2_sd = here->HSM2_sd * C_m2cm ; /*-----------------------------------------------------------* * Change unit into Kelvin. *-----------------*/ - here->HSM2_temp += 273.15 ; /* [C] -> [K] */ + here->HSM2_ktemp = here->HSM2_temp + 273.15 ; /* [C] -> [K] */ - here->HSM2_lgate = Lgate = here->HSM2_l + model->HSM2_xl ; - Wgate = here->HSM2_w / here->HSM2_nf + model->HSM2_xw ; + here->HSM2_lgate = Lgate = hereCGS->HSM2_l + modelCGS->HSM2_xl ; + Wgate = hereCGS->HSM2_w / here->HSM2_nf + modelCGS->HSM2_xw ; LG = Lgate * 1.0e4 ; here->HSM2_wg = WG = Wgate * 1.0e4 ; @@ -350,8 +352,8 @@ int HSM2temp( pParam->HSM2_js0sw /= C_m2cm ; /* Band gap */ - here->HSM2_egtnom = pParam->HSM2_eg0 - model->HSM2_tnom - * ( 90.25e-6 + model->HSM2_tnom * 1.0e-7 ) ; + here->HSM2_egtnom = pParam->HSM2_eg0 - model->HSM2_ktnom + * ( 90.25e-6 + model->HSM2_ktnom * 1.0e-7 ) ; /* C_EOX */ here->HSM2_cecox = C_VAC * model->HSM2_kappa ; @@ -371,19 +373,19 @@ int HSM2temp( here->HSM2_clmmod = 1e0 + pow( LG , model->HSM2_clm5 ) * model->HSM2_clm6 ; /* Half length of diffusion */ - T1 = 1.0 / (model->HSM2_saref + 0.5 * here->HSM2_l) - + 1.0 / (model->HSM2_sbref + 0.5 * here->HSM2_l); + T1 = 1.0 / (modelCGS->HSM2_saref + 0.5 * hereCGS->HSM2_l) + + 1.0 / (modelCGS->HSM2_sbref + 0.5 * hereCGS->HSM2_l); Lod_half_ref = 2.0 / T1 ; - if (here->HSM2_sa > 0.0 && here->HSM2_sb > 0.0 && + if (hereCGS->HSM2_sa > 0.0 && hereCGS->HSM2_sb > 0.0 && (here->HSM2_nf == 1.0 || - (here->HSM2_nf > 1.0 && here->HSM2_sd > 0.0))) { + (here->HSM2_nf > 1.0 && hereCGS->HSM2_sd > 0.0))) { T1 = 0.0; for (i = 0; i < here->HSM2_nf; i++) { - T1 += 1.0 / (here->HSM2_sa + 0.5 * here->HSM2_l - + i * (here->HSM2_sd + here->HSM2_l)) - + 1.0 / (here->HSM2_sb + 0.5 * here->HSM2_l - + i * (here->HSM2_sd + here->HSM2_l)); + T1 += 1.0 / (hereCGS->HSM2_sa + 0.5 * hereCGS->HSM2_l + + i * (hereCGS->HSM2_sd + hereCGS->HSM2_l)) + + 1.0 / (hereCGS->HSM2_sb + 0.5 * hereCGS->HSM2_l + + i * (hereCGS->HSM2_sd + hereCGS->HSM2_l)); } Lod_half = 2.0 * here->HSM2_nf / T1; } else { @@ -391,17 +393,41 @@ int HSM2temp( } Npext = model->HSM2_npext * ( 1.0 + model->HSM2_npextw / pow( WG, model->HSM2_npextwp ) ); /* new */ + here->HSM2_mueph1 = pParam->HSM2_mueph1 ; + here->HSM2_nsubp = pParam->HSM2_nsubp ; + here->HSM2_nsubc = pParam->HSM2_nsubc ; /* DFM */ if ( model->HSM2_codfm == 1 && here->HSM2_nsubcdfm_Given ) { RANGECHECK(here->HSM2_nsubcdfm, 1.0e16, 1.0e19, "NSUBCDFM") ; - pParam->HSM2_mueph1 *= here->HSM2_mphdfm - * ( log(here->HSM2_nsubcdfm) - log(pParam->HSM2_nsubc) ) + 1.0 ; - pParam->HSM2_nsubp += here->HSM2_nsubcdfm - pParam->HSM2_nsubc ; - Npext += here->HSM2_nsubcdfm - pParam->HSM2_nsubc ; - pParam->HSM2_nsubc = here->HSM2_nsubcdfm ; + here->HSM2_mueph1 *= here->HSM2_mphdfm + * ( log(here->HSM2_nsubcdfm) - log(here->HSM2_nsubc) ) + 1.0 ; + here->HSM2_nsubp += here->HSM2_nsubcdfm - here->HSM2_nsubc ; + Npext += here->HSM2_nsubcdfm - here->HSM2_nsubc ; + here->HSM2_nsubc = here->HSM2_nsubcdfm ; } + /* WPE */ + T0 = model->HSM2_nsubcwpe * + ( here->HSM2_sca + + model->HSM2_web * here->HSM2_scb + + model->HSM2_wec * here->HSM2_scc ) ; + here->HSM2_nsubc += T0 ; + Fn_SLtemp( here->HSM2_nsubc , here->HSM2_nsubc , 1e15 , 0.01 ) ; + T0 = model->HSM2_nsubpwpe * + ( here->HSM2_sca + + model->HSM2_web * here->HSM2_scb + + model->HSM2_wec * here->HSM2_scc ) ; + here->HSM2_nsubp += T0 ; + Fn_SLtemp( here->HSM2_nsubp , here->HSM2_nsubp , 1e15 , 0.01 ) ; + T0 = model->HSM2_npextwpe * + ( here->HSM2_sca + + model->HSM2_web * here->HSM2_scb + + model->HSM2_wec * here->HSM2_scc ) ; + Npext += T0 ; + Fn_SLtemp( Npext , Npext , 1e15 , 0.01 ) ; + /* WPE end */ + /* Coulomb Scattering */ here->HSM2_muecb0 = pParam->HSM2_muecb0 * pow( LG, model->HSM2_muecb0lp ); here->HSM2_muecb1 = pParam->HSM2_muecb1 * pow( LG, model->HSM2_muecb1lp ); @@ -439,10 +465,10 @@ int HSM2temp( here->HSM2_ninv_o_esi = pParam->HSM2_ninv / C_ESI ; /* Metallurgical channel geometry */ - dL = model->HSM2_xld - + (model->HSM2_ll / pow (Lgate + model->HSM2_lld, model->HSM2_lln)) ; - dW = model->HSM2_xwd - + (model->HSM2_wl / pow (Wgate + model->HSM2_wld, model->HSM2_wln)) ; + dL = modelCGS->HSM2_xld + + (modelCGS->HSM2_ll / pow (Lgate + modelCGS->HSM2_lld, model->HSM2_lln)) ; + dW = modelCGS->HSM2_xwd + + (modelCGS->HSM2_wl / pow (Wgate + modelCGS->HSM2_wld, model->HSM2_wln)) ; Leff = Lgate - 2.0e0 * dL ; if ( Leff <= 1.0e-7 ) { @@ -460,7 +486,7 @@ int HSM2temp( here->HSM2_leff = Leff ; /* Wg dependence for short channel devices */ - here->HSM2_lgatesm = Lgate + model->HSM2_wl1 / pow( WL , model->HSM2_wl1p ) ; + here->HSM2_lgatesm = Lgate + modelCGS->HSM2_wl1 / pow( WL , model->HSM2_wl1p ) ; here->HSM2_dVthsm = pParam->HSM2_wl2 / pow( WL , model->HSM2_wl2p ) ; /* Lg dependence of wsti */ @@ -488,10 +514,10 @@ int HSM2temp( T1 = 2.0 * ( 1.0 - model->HSM2_nsubpfac ) / model->HSM2_nsubpl * LG + 2.0 * model->HSM2_nsubpfac - 1.0 ; Fn_SUtemp( T1 , T1 , 1 , 0.01 ) ; Fn_SLtemp( T1 , T1 , model->HSM2_nsubpfac , 0.01 ) ; - pParam->HSM2_nsubp *= T1 ; + here->HSM2_nsubp *= T1 ; /* Note: Sign Changed --> */ - Nsubpp = pParam->HSM2_nsubp + Nsubpp = here->HSM2_nsubp * (1.0e0 + (model->HSM2_nsubpw / pow (WG, model->HSM2_nsubpwp))) ; /* <-- Note: Sign Changed */ @@ -506,47 +532,47 @@ int HSM2temp( T2 = 1.0e0 + ( model->HSM2_nsubcw / pow ( WG, model->HSM2_nsubcwp )) ; T2 *= 1.0e0 + ( model->HSM2_nsubcw2 / pow ( WG, model->HSM2_nsubcwp2 )) ; - T3 = model->HSM2_nsubcmax / pParam->HSM2_nsubc ; + T3 = model->HSM2_nsubcmax / here->HSM2_nsubc ; Fn_SUtemp( T1 , T2 , T3 , 0.01 ) ; - pParam->HSM2_nsubc *= T1 ; + here->HSM2_nsubc *= T1 ; - if ( pParam->HSM2_nsubc <= 0.0 ) { + if ( here->HSM2_nsubc <= 0.0 ) { fprintf ( stderr , "*** warning(HiSIM): actual NSUBC value is negative -> reset to 1E+15.\n" ) ; fprintf ( stderr , " The model parameter NSUBCW/NSUBCWP and/or NSUBCW2/NSUBCW2P might be wrong.\n" ) ; - pParam->HSM2_nsubc = 1e15 ; + here->HSM2_nsubc = 1e15 ; } - if(Npext < pParam->HSM2_nsubc || Npext > pParam->HSM2_nsubp) { + if(Npext < here->HSM2_nsubc || Npext > here->HSM2_nsubp) { fprintf ( stderr , "*** warning(HiSIM): actual NPEXT value is smaller than NSUBC and/or greater than NSUBP.\n" ) ; - fprintf ( stderr , " ( Npext = %e , NSUBC = %e , NSUBP = %e ) \n",Npext,pParam->HSM2_nsubc,pParam->HSM2_nsubp); + fprintf ( stderr , " ( Npext = %e , NSUBC = %e , NSUBP = %e ) \n",Npext,here->HSM2_nsubc,here->HSM2_nsubp); fprintf ( stderr , " The model parameter NPEXTW and/or NPEXTWP might be wrong.\n" ) ; } - if( Lgate > model->HSM2_lp ){ - Nsub = (pParam->HSM2_nsubc * (Lgate - model->HSM2_lp) - + Nsubps * model->HSM2_lp) / Lgate ; + if( Lgate > modelCGS->HSM2_lp ){ + Nsub = (here->HSM2_nsubc * (Lgate - modelCGS->HSM2_lp) + + Nsubps * modelCGS->HSM2_lp) / Lgate ; } else { Nsub = Nsubps - + (Nsubps - pParam->HSM2_nsubc) * (model->HSM2_lp - Lgate) - / model->HSM2_lp ; + + (Nsubps - here->HSM2_nsubc) * (modelCGS->HSM2_lp - Lgate) + / modelCGS->HSM2_lp ; } - T3 = 0.5e0 * Lgate - model->HSM2_lp ; + T3 = 0.5e0 * Lgate - modelCGS->HSM2_lp ; Fn_SZtemp( T3 , T3 , 1e-8 ) ; - T1 = Fn_Max(0.0e0, model->HSM2_lpext ) ; + T1 = Fn_Max(0.0e0, modelCGS->HSM2_lpext ) ; T2 = T3 * T1 / ( T3 + T1 ) ; here->HSM2_nsub = - Nsub = Nsub + T2 * (Npext - pParam->HSM2_nsubc) / Lgate ; + Nsub = Nsub + T2 * (Npext - here->HSM2_nsubc) / Lgate ; here->HSM2_qnsub = q_Nsub = C_QE * Nsub ; here->HSM2_qnsub_esi = q_Nsub * C_ESI ; here->HSM2_2qnsub_esi = 2.0 * here->HSM2_qnsub_esi ; /* Pocket Overlap (temperature-independent part) */ - if ( Lgate <= 2.0e0 * model->HSM2_lp ) { + if ( Lgate <= 2.0e0 * modelCGS->HSM2_lp ) { Nsubb = 2.0e0 * Nsubps - - (Nsubps - pParam->HSM2_nsubc) * Lgate - / model->HSM2_lp - pParam->HSM2_nsubc ; - here->HSM2_ptovr0 = log (Nsubb / pParam->HSM2_nsubc) ; + - (Nsubps - here->HSM2_nsubc) * Lgate + / modelCGS->HSM2_lp - here->HSM2_nsubc ; + here->HSM2_ptovr0 = log (Nsubb / here->HSM2_nsubc) ; } else { here->HSM2_ptovr0 = 0.0e0 ; } @@ -563,7 +589,7 @@ int HSM2temp( /* @300K, with pocket */ here->HSM2_pb20 = 2.0e0 / C_b300 * log (Nsub / C_Nin0) ; /* @300K, w/o pocket */ - here->HSM2_pb2c = 2.0e0 / C_b300 * log (pParam->HSM2_nsubc / C_Nin0) ; + here->HSM2_pb2c = 2.0e0 / C_b300 * log (here->HSM2_nsubc / C_Nin0) ; /* constant for Poly depletion */ @@ -575,8 +601,8 @@ int HSM2temp( /* Gate resistance */ if ( here->HSM2_corg == 1 ) { - T1 = here->HSM2_xgw + Weff / (3.0e0 * here->HSM2_ngcon); - T2 = Lgate - here->HSM2_xgl; + T1 = hereCGS->HSM2_xgw + Weff / (3.0e0 * here->HSM2_ngcon); + T2 = Lgate - hereCGS->HSM2_xgl; here->HSM2_grg = model->HSM2_rshg * T1 / (here->HSM2_ngcon * T2 * here->HSM2_nf); if (here->HSM2_grg > 1.0e-3) here->HSM2_grg = here->HSM2_m / here->HSM2_grg; else { @@ -590,16 +616,16 @@ int HSM2temp( if ( model->HSM2_rsh > 0.0 ) { here->HSM2_rd += model->HSM2_rsh * here->HSM2_nrd ; } - if ( model->HSM2_rd > 0.0 ) { - here->HSM2_rd += model->HSM2_rd / here->HSM2_weff_nf ; + if ( modelCGS->HSM2_rd > 0.0 ) { + here->HSM2_rd += modelCGS->HSM2_rd / here->HSM2_weff_nf ; } here->HSM2_rs = 0.0; if ( model->HSM2_rsh > 0.0 ) { here->HSM2_rs += model->HSM2_rsh * here->HSM2_nrs ; } - if ( model->HSM2_rs > 0.0 ) { - here->HSM2_rs += model->HSM2_rs / here->HSM2_weff_nf ; + if ( modelCGS->HSM2_rs > 0.0 ) { + here->HSM2_rs += modelCGS->HSM2_rs / here->HSM2_weff_nf ; } if (model->HSM2_corsrd < 0) { @@ -677,7 +703,7 @@ int HSM2temp( /* Fringing capacitance */ here->HSM2_cfrng = C_EOX / ( C_Pi / 2.0e0 ) * here->HSM2_weff_nf - * log( 1.0e0 + model->HSM2_tpoly / model->HSM2_tox ) ; + * log( 1.0e0 + modelCGS->HSM2_tpoly / modelCGS->HSM2_tox ) ; /* Additional term of lateral-field-induced capacitance */ here->HSM2_cqyb0 = 1.0e4 * here->HSM2_weff_nf @@ -686,29 +712,29 @@ int HSM2temp( /* Parasitic component of the channel current */ here->HSM2_ptl0 = model->HSM2_ptl * pow( LG , - model->HSM2_ptlp ) ; here->HSM2_pt40 = model->HSM2_pt4 * pow( LG , - model->HSM2_pt4p ) ; - here->HSM2_gdl0 = model->HSM2_gdl * pow( LG + GDLD , - model->HSM2_gdlp ) ; + here->HSM2_gdl0 = model->HSM2_gdl * pow( LG + modelCGS->HSM2_gdld , - model->HSM2_gdlp ) ; /*-----------------------------------------------------------* * Temperature dependent constants. *-----------------*/ TTEMP = ckt->CKTtemp ; - if ( here->HSM2_temp_Given ) TTEMP = here->HSM2_temp ; + if ( here->HSM2_temp_Given ) TTEMP = here->HSM2_ktemp ; if ( here->HSM2_dtemp_Given ) { TTEMP = TTEMP + here->HSM2_dtemp ; - here->HSM2_temp = TTEMP ; + here->HSM2_ktemp = TTEMP ; } /* Band gap */ - T1 = TTEMP - model->HSM2_tnom ; - T2 = TTEMP * TTEMP - model->HSM2_tnom * model->HSM2_tnom ; + T1 = TTEMP - model->HSM2_ktnom ; + T2 = TTEMP * TTEMP - model->HSM2_ktnom * model->HSM2_ktnom ; here->HSM2_eg = Eg = here->HSM2_egtnom - pParam->HSM2_bgtmp1 * T1 - pParam->HSM2_bgtmp2 * T2 ; here->HSM2_sqrt_eg = sqrt( Eg ) ; T1 = 1.0 / TTEMP ; - T2 = 1.0 / model->HSM2_tnom ; + T2 = 1.0 / model->HSM2_ktnom ; T3 = here->HSM2_egtnom + model->HSM2_egig + model->HSM2_igtemp2 * ( T1 - T2 ) + model->HSM2_igtemp3 * ( T1 * T1 - T2 * T2 ) ; @@ -720,15 +746,15 @@ int HSM2temp( here->HSM2_beta = beta = C_QE / (C_KB * TTEMP) ; here->HSM2_beta_inv = 1.0 / beta ; here->HSM2_beta2 = beta * beta ; - here->HSM2_betatnom = C_QE / (C_KB * model->HSM2_tnom) ; + here->HSM2_betatnom = C_QE / (C_KB * model->HSM2_ktnom) ; /* Intrinsic carrier concentration */ - here->HSM2_nin = Nin = C_Nin0 * pow (TTEMP / model->HSM2_tnom, 1.5e0) + here->HSM2_nin = Nin = C_Nin0 * pow (TTEMP / model->HSM2_ktnom, 1.5e0) * exp (- Eg / 2.0e0 * beta + here->HSM2_egtnom / 2.0e0 * here->HSM2_betatnom) ; /* Phonon Scattering (temperature-dependent part) */ - T1 = pow (TTEMP / model->HSM2_tnom, pParam->HSM2_muetmp) ; + T1 = pow (TTEMP / model->HSM2_ktnom, pParam->HSM2_muetmp) ; here->HSM2_mphn0 = T1 / here->HSM2_mueph ; here->HSM2_mphn1 = here->HSM2_mphn0 * model->HSM2_mueph0 ; @@ -738,7 +764,7 @@ int HSM2temp( /* Velocity Temperature Dependence */ - T1 = TTEMP / model->HSM2_tnom ; + T1 = TTEMP / model->HSM2_ktnom ; here->HSM2_vmax = here->HSM2_vmax0 * pParam->HSM2_vmax / (1.8 + 0.4 * T1 + 0.1 * T1 * T1 - pParam->HSM2_vtmp * (1.0e0 - T1)) ; @@ -754,7 +780,7 @@ int HSM2temp( here->HSM2_pb2over = 2.0 / beta * log( pParam->HSM2_nover / Nin ) ; /* (1 / cnst1 / cnstCoxi) for Ps0LD_iniB */ - T1 = here->HSM2_cnst0over * model->HSM2_tox / here->HSM2_cecox ; + T1 = here->HSM2_cnst0over * modelCGS->HSM2_tox / here->HSM2_cecox ; T2 = pParam->HSM2_nover / Nin ; T1 = T2 * T2 / ( T1 * T1 ) ; here->HSM2_ps0ldinib = T1 ; /* (1 / cnst1 / cnstCoxi) */ @@ -768,7 +794,7 @@ int HSM2temp( /* Depletion Width */ T1 = 2.0e0 * C_ESI / C_QE ; here->HSM2_wdpl = sqrt ( T1 / here->HSM2_nsub ) ; - here->HSM2_wdplp = sqrt( T1 / ( pParam->HSM2_nsubp ) ) ; + here->HSM2_wdplp = sqrt( T1 / ( here->HSM2_nsubp ) ) ; /* cnst1: n_{p0} / p_{p0} */ T1 = Nin / here->HSM2_nsub ; @@ -778,31 +804,31 @@ int HSM2temp( /* for substrate-source/drain junction diode. */ js = pParam->HSM2_js0 * exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta - + model->HSM2_xti * log (TTEMP / model->HSM2_tnom)) / pParam->HSM2_nj) ; + + model->HSM2_xti * log (TTEMP / model->HSM2_ktnom)) / pParam->HSM2_nj) ; jssw = pParam->HSM2_js0sw * exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta - + model->HSM2_xti * log (TTEMP / model->HSM2_tnom)) / model->HSM2_njsw) ; + + model->HSM2_xti * log (TTEMP / model->HSM2_ktnom)) / model->HSM2_njsw) ; js2 = pParam->HSM2_js0 * exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta - + model->HSM2_xti2 * log (TTEMP / model->HSM2_tnom)) / pParam->HSM2_nj) ; + + model->HSM2_xti2 * log (TTEMP / model->HSM2_ktnom)) / pParam->HSM2_nj) ; jssw2 = pParam->HSM2_js0sw * exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta - + model->HSM2_xti2 * log (TTEMP / model->HSM2_tnom)) / model->HSM2_njsw) ; + + model->HSM2_xti2 * log (TTEMP / model->HSM2_ktnom)) / model->HSM2_njsw) ; - here->HSM2_isbd = here->HSM2_ad * js + here->HSM2_pd * jssw ; - here->HSM2_isbd2 = here->HSM2_ad * js2 + here->HSM2_pd * jssw2 ; - here->HSM2_isbs = here->HSM2_as * js + here->HSM2_ps * jssw ; - here->HSM2_isbs2 = here->HSM2_as * js2 + here->HSM2_ps * jssw2 ; + here->HSM2_isbd = hereCGS->HSM2_ad * js + hereCGS->HSM2_pd * jssw ; + here->HSM2_isbd2 = hereCGS->HSM2_ad * js2 + hereCGS->HSM2_pd * jssw2 ; + here->HSM2_isbs = hereCGS->HSM2_as * js + hereCGS->HSM2_ps * jssw ; + here->HSM2_isbs2 = hereCGS->HSM2_as * js2 + hereCGS->HSM2_ps * jssw2 ; here->HSM2_vbdt = pParam->HSM2_nj / beta - * log (pParam->HSM2_vdiffj * (TTEMP / model->HSM2_tnom) * (TTEMP / model->HSM2_tnom) + * log (pParam->HSM2_vdiffj * (TTEMP / model->HSM2_ktnom) * (TTEMP / model->HSM2_ktnom) / (here->HSM2_isbd + 1.0e-50) + 1) ; here->HSM2_vbst = pParam->HSM2_nj / beta - * log (pParam->HSM2_vdiffj * (TTEMP / model->HSM2_tnom) * (TTEMP / model->HSM2_tnom) + * log (pParam->HSM2_vdiffj * (TTEMP / model->HSM2_ktnom) * (TTEMP / model->HSM2_ktnom) / (here->HSM2_isbs + 1.0e-50) + 1) ; - here->HSM2_exptemp = exp (((TTEMP / model->HSM2_tnom) - 1) * model->HSM2_ctemp) ; + here->HSM2_exptemp = exp (((TTEMP / model->HSM2_ktnom) - 1) * model->HSM2_ctemp) ; here->HSM2_jd_nvtm_inv = 1.0 / ( pParam->HSM2_nj / beta ) ; here->HSM2_jd_expcd = exp (here->HSM2_vbdt * here->HSM2_jd_nvtm_inv ) ; here->HSM2_jd_expcs = exp (here->HSM2_vbst * here->HSM2_jd_nvtm_inv ) ; @@ -823,7 +849,7 @@ int HSM2temp( cnst0 = here->HSM2_cnst0 ; cnst1 = here->HSM2_cnst1 ; c_eox = here->HSM2_cecox ; - Tox = model->HSM2_tox ; + Tox = modelCGS->HSM2_tox ; Cox = c_eox / Tox ; Cox_inv = 1.0 / Cox ; fac1 = cnst0 * Cox_inv ; @@ -846,12 +872,12 @@ int HSM2temp( Qb0 = sqrt ( T1 ) ; Vthp = Ps0 + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr ; - T1 = 2.0 * C_QE * pParam->HSM2_nsubc * C_ESI ; + T1 = 2.0 * C_QE * here->HSM2_nsubc * C_ESI ; T2 = sqrt( T1 ) ; Vth0 = Ps0 + Vfb + T2 * Cox_inv ; T1 = C_ESI * Cox_inv ; T2 = here->HSM2_wdplp ; - T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ; + T4 = 1.0e0 / ( modelCGS->HSM2_lp * modelCGS->HSM2_lp ) ; T3 = 2.0 * ( model->HSM2_vbi - Pb20 ) * T2 * T4 ; T5 = T1 * T3 ; T6 = Ps0 - sc3Vbs ; @@ -861,12 +887,12 @@ int HSM2temp( T1 = Vthp - Vth0 ; T9 = Ps0 - sc3Vbs ; T9_dVb = Ps0_dVbs - 1.0 ; - T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / model->HSM2_lp; - T3_dVb = pParam->HSM2_scp3 * T9_dVb / model->HSM2_lp ; + T3 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * T9 / modelCGS->HSM2_lp; + T3_dVb = pParam->HSM2_scp3 * T9_dVb / modelCGS->HSM2_lp ; dVthLP = T1 * dVth0 * T3 ; dVthLP_dVb = T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb; - T3 = here->HSM2_lgate - model->HSM2_parl2 ; + T3 = here->HSM2_lgate - modelCGS->HSM2_parl2 ; T4 = 1.0e0 / ( T3 * T3 ) ; T0 = C_ESI * here->HSM2_wdpl * 2.0e0 * ( model->HSM2_vbi - Pb20 ) * T4 ; T2 = T0 * Cox_inv ; @@ -911,7 +937,7 @@ int HSM2temp( pParam->HSM2_sc3 = sc3lim; } } - } + } /* End of instance loop */ } return(OK); } diff --git a/src/spicelib/devices/hisim2/hsm2trunc.c b/src/spicelib/devices/hisim2/hsm2trunc.c index 68df0c526..defc9c95c 100644 --- a/src/spicelib/devices/hisim2/hsm2trunc.c +++ b/src/spicelib/devices/hisim2/hsm2trunc.c @@ -1,12 +1,12 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2011 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC - VERSION : HiSIM_2.5.1 + VERSION : HiSIM 2.6.1 FILE : hsm2trunc.c - date : 2011.04.07 + date : 2012.4.6 released by Hiroshima University & @@ -14,7 +14,6 @@ ***********************************************************************/ #include "ngspice/ngspice.h" -#include #include "ngspice/cktdefs.h" #include "hsm2def.h" #include "ngspice/sperror.h"