diff --git a/src/spicelib/devices/hisim2/Makefile.am b/src/spicelib/devices/hisim2/Makefile.am index 9446b93c3..f5e8106e8 100644 --- a/src/spicelib/devices/hisim2/Makefile.am +++ b/src/spicelib/devices/hisim2/Makefile.am @@ -14,6 +14,7 @@ libhisim2_la_SOURCES = hisim2.h \ hsm2dest.c \ hsm2eval.c \ hsm2evalenv.h \ + hsm2eval_dep.h \ hsm2ext.h \ hsm2getic.c \ hsm2init.c \ diff --git a/src/spicelib/devices/hisim2/hisim2.h b/src/spicelib/devices/hisim2/hisim2.h index d1521cd90..5acf36f46 100644 --- a/src/spicelib/devices/hisim2/hisim2.h +++ b/src/spicelib/devices/hisim2/hisim2.h @@ -1,14 +1,14 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hisim2.h - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & diff --git a/src/spicelib/devices/hisim2/hsm2.c b/src/spicelib/devices/hisim2/hsm2.c index 13a3ff08e..dcb0b679d 100644 --- a/src/spicelib/devices/hisim2/hsm2.c +++ b/src/spicelib/devices/hisim2/hsm2.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/devdefs.h" #include "hsm2def.h" @@ -98,7 +137,7 @@ IFparm HSM2mPTable[] = { /* model parameters */ IOP("level", HSM2_MOD_LEVEL, IF_INTEGER, ""), IOP("info", HSM2_MOD_INFO, IF_INTEGER, "information level (for debug, etc.)"), IOP("noise", HSM2_MOD_NOISE, IF_INTEGER, "noise model selector"), - IOP("version", HSM2_MOD_VERSION, IF_INTEGER, "model version 220"), + IOP("version", HSM2_MOD_VERSION, IF_INTEGER, "model version 280"), IOP("show", HSM2_MOD_SHOW, IF_INTEGER, "show physical value"), IOP("corsrd", HSM2_MOD_CORSRD, IF_INTEGER, "solve equations accounting Rs and Rd."), IOP("corg", HSM2_MOD_CORG, IF_INTEGER, "solve equations accounting Rg."), @@ -120,7 +159,9 @@ IFparm HSM2mPTable[] = { /* model parameters */ IOP("coqy", HSM2_MOD_COQY, IF_INTEGER, "calculate lateral-field-induced charge/capacitance"), IOP("coqovsm", HSM2_MOD_COQOVSM, IF_INTEGER, "select smoothing method of Qover"), IOP("coerrrep", HSM2_MOD_COERRREP, IF_INTEGER, "selector for error report"), - IOP("vmax", HSM2_MOD_VMAX, IF_REAL, "saturation velocity [cm/s"), + IOP("codep", HSM2_MOD_CODEP, IF_INTEGER, "selector for depletion device"), + IOP("coddlt", HSM2_MOD_CODDLT, IF_INTEGER, "selector for ddlt model "), + IOP("vmax", HSM2_MOD_VMAX, IF_REAL, "saturation velocity [cm/s]"), IOP("bgtmp1", HSM2_MOD_BGTMP1, IF_REAL, "first order temp. coeff. for band gap [V/K]"), IOP("bgtmp2", HSM2_MOD_BGTMP2, IF_REAL, "second order temp. coeff. for band gap [V/K^2]"), IOP("eg0", HSM2_MOD_EG0, IF_REAL, ""), @@ -190,6 +231,8 @@ IFparm HSM2mPTable[] = { /* model parameters */ IOP("ndepwp", HSM2_MOD_NDEPWP, IF_REAL, "coeff. of Qbm for Eeff [-]"), IOP("ninv", HSM2_MOD_NINV, IF_REAL, "coeff. of Qnm for Eeff [-]"), IOP("ninvd", HSM2_MOD_NINVD, IF_REAL, "modification of Vdse dependence on Eeff [1/V]"), + IOP("ninvdl", HSM2_MOD_NINVDL, IF_REAL, " LG dependence of NINVD "), + IOP("ninvdlp", HSM2_MOD_NINVDLP, IF_REAL, " LG dependence of NINVD "), IOP("muecb0", HSM2_MOD_MUECB0, IF_REAL, "const. part of coulomb scattering [cm^2/Vs]"), IOP("muecb1", HSM2_MOD_MUECB1, IF_REAL, "coeff. for coulomb scattering [cm^2/Vs]"), IOP("mueph0", HSM2_MOD_MUEPH0, IF_REAL, "power of Eeff for phonon scattering [-]"), @@ -387,6 +430,40 @@ IFparm HSM2mPTable[] = { /* model parameters */ IOP("muecb0lp", HSM2_MOD_MUECB0LP, IF_REAL, "L dependence of MUECB0"), IOP("muecb1lp", HSM2_MOD_MUECB1LP, IF_REAL, "L dependence of MUECB1"), + /* Depletion Mode MOSFET */ + IOP("ndepm", HSM2_MOD_NDEPM, IF_REAL, "N- layer concentlation of the depletion MOS model"), + IOP("ndepml", HSM2_MOD_NDEPML, IF_REAL, "L dependence of NDEPM "), + IOP("ndepmlp", HSM2_MOD_NDEPMLP, IF_REAL, "L dependence of NDEPM "), + IOP("tndep", HSM2_MOD_TNDEP, IF_REAL, "N- layer depth of the depletion MOS model"), + IOP("depleak", HSM2_MOD_DEPLEAK, IF_REAL, "leakage current modification parameter for the depletion MOS model"), + IOP("depleakl", HSM2_MOD_DEPLEAKL, IF_REAL, "L dependence of DEPLEAK"), + IOP("depleaklp", HSM2_MOD_DEPLEAKLP, IF_REAL, "L dependence of DEPLEAK"), + IOP("depeta", HSM2_MOD_DEPETA, IF_REAL, "Vds dependence of threshold voltage for the depletion MOS model"), + IOP("depmue0", HSM2_MOD_DEPMUE0, IF_REAL, " [-]"), + IOP("depmue0l", HSM2_MOD_DEPMUE0L, IF_REAL, " [-]"), + IOP("depmue0lp", HSM2_MOD_DEPMUE0LP, IF_REAL, " [-]"), + IOP("depmue1", HSM2_MOD_DEPMUE1, IF_REAL, " [-]"), + IOP("depmue1l", HSM2_MOD_DEPMUE1L, IF_REAL, " [-]"), + IOP("depmue1lp", HSM2_MOD_DEPMUE1LP, IF_REAL, " [-]"), + IOP("depmueback0", HSM2_MOD_DEPMUEBACK0, IF_REAL, " [-]"), + IOP("depmueback0l", HSM2_MOD_DEPMUEBACK0L, IF_REAL, " [-]"), + IOP("depmueback0lp", HSM2_MOD_DEPMUEBACK0LP, IF_REAL, " [-]"), + IOP("depmueback1", HSM2_MOD_DEPMUEBACK1, IF_REAL, " [-]"), + IOP("depmueback1l", HSM2_MOD_DEPMUEBACK1L, IF_REAL, " [-]"), + IOP("depmueback1lp", HSM2_MOD_DEPMUEBACK1LP, IF_REAL, " [-]"), + IOP("depmueph0", HSM2_MOD_DEPMUEPH0, IF_REAL, " [-]"), + IOP("depmueph1", HSM2_MOD_DEPMUEPH1, IF_REAL, " [-]"), + IOP("depvmax", HSM2_MOD_DEPVMAX, IF_REAL, " [-]"), + IOP("depvmaxl", HSM2_MOD_DEPVMAXL, IF_REAL, " [-]"), + IOP("depvmaxlp", HSM2_MOD_DEPVMAXLP, IF_REAL, " [-]"), + IOP("depvdsef1", HSM2_MOD_DEPVDSEF1, IF_REAL, " [-]"), + IOP("depvdsef1l", HSM2_MOD_DEPVDSEF1L, IF_REAL, " [-]"), + IOP("depvdsef1lp", HSM2_MOD_DEPVDSEF1LP, IF_REAL, " [-]"), + IOP("depvdsef2", HSM2_MOD_DEPVDSEF2, IF_REAL, " [-]"), + IOP("depvdsef2l", HSM2_MOD_DEPVDSEF2L, IF_REAL, " [-]"), + IOP("depvdsef2lp", HSM2_MOD_DEPVDSEF2LP, IF_REAL, " [-]"), + IOP("depbb", HSM2_MOD_DEPBB, IF_REAL, " [-]"), + IOP("depmuetmp", HSM2_MOD_DEPMUETMP, IF_REAL, " [-]"), /* binning parameters */ IOP("lmin", HSM2_MOD_LMIN, IF_REAL, "Minimum length for the model"), diff --git a/src/spicelib/devices/hisim2/hsm2acld.c b/src/spicelib/devices/hisim2/hsm2acld.c index c23f820cc..1a8eda54b 100644 --- a/src/spicelib/devices/hisim2/hsm2acld.c +++ b/src/spicelib/devices/hisim2/hsm2acld.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2acld.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/cktdefs.h" #include "ngspice/sperror.h" diff --git a/src/spicelib/devices/hisim2/hsm2ask.c b/src/spicelib/devices/hisim2/hsm2ask.c index 607cb3369..43f42f4fe 100644 --- a/src/spicelib/devices/hisim2/hsm2ask.c +++ b/src/spicelib/devices/hisim2/hsm2ask.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2ask.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/ifsim.h" #include "ngspice/cktdefs.h" diff --git a/src/spicelib/devices/hisim2/hsm2cvtest.c b/src/spicelib/devices/hisim2/hsm2cvtest.c index 75906c49d..a847922fe 100644 --- a/src/spicelib/devices/hisim2/hsm2cvtest.c +++ b/src/spicelib/devices/hisim2/hsm2cvtest.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2cvtest.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/cktdefs.h" #include "hsm2def.h" diff --git a/src/spicelib/devices/hisim2/hsm2def.h b/src/spicelib/devices/hisim2/hsm2def.h index 451c35952..e0a3a7b1c 100644 --- a/src/spicelib/devices/hisim2/hsm2def.h +++ b/src/spicelib/devices/hisim2/hsm2def.h @@ -1,14 +1,14 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2def.h - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & @@ -50,6 +50,7 @@ typedef struct sHSM2modelMKSParam { double HSM2_cit ; double HSM2_ovslp ; double HSM2_dly3 ; + double HSM2_ndepm ; } HSM2modelMKSParam ; /* binning parameters */ @@ -331,9 +332,18 @@ typedef struct sHSM2instance { double HSM2_Qb_dVgs ; double HSM2_Qb_dVds ; double HSM2_Qb_dVbs ; - double HSM2_alpha; /* internal variables */ + double HSM2_depleak ; + double HSM2_depvmax ; + double HSM2_depmphn0 ; + double HSM2_depmphn1 ; + double HSM2_depmue0 ; + double HSM2_depmue1 ; + double HSM2_depmueback0 ; + double HSM2_depmueback1 ; + double HSM2_depvdsef1 ; + double HSM2_depvdsef2 ; double HSM2_eg ; double HSM2_beta ; double HSM2_beta_inv ; @@ -343,6 +353,8 @@ typedef struct sHSM2instance { double HSM2_egp12 ; double HSM2_egp32 ; double HSM2_lgate ; + double HSM2_wgate ; + double HSM2_lg ; double HSM2_wg ; double HSM2_mueph ; double HSM2_mphn0 ; @@ -404,6 +416,7 @@ typedef struct sHSM2instance { int HSM2_flg_pgd ; double HSM2_ndep_o_esi ; double HSM2_ninv_o_esi ; + double HSM2_ninvd ; double HSM2_cqyb0 ; double HSM2_cnst0over ; double HSM2_costi00 ; @@ -412,7 +425,7 @@ typedef struct sHSM2instance { double HSM2_costi0_p2 ; double HSM2_costi1 ; double HSM2_pb2over ; /* for Qover model */ - double HSM2_ps0ldinib ; +//double HSM2_ps0ldinib ; double HSM2_ptl0; double HSM2_pt40; double HSM2_gdl0; @@ -422,6 +435,10 @@ typedef struct sHSM2instance { double HSM2_mueph1 ; double HSM2_nsubp ; double HSM2_nsubc ; + /* Depletion Mode MOSFET */ + double HSM2_ndepm ; + double HSM2_Pb2n ; + double HSM2_Vbipn ; HSM2hereMKSParam hereMKS ; /* unit-converted parameters */ HSM2binningParam pParam ; /* binning parameters */ @@ -670,14 +687,11 @@ typedef struct sHSM2model { /* model structure for a resistor */ HSM2instance * HSM2instances; /* pointer to list of instances that have this model */ IFuid HSM2modName; /* pointer to the name of this model */ - - /* --- end of generic struct GENmodel --- */ - int HSM2_type; /* device type: 1 = nmos, -1 = pmos */ int HSM2_level; /* level */ int HSM2_info; /* information */ int HSM2_noise; /* noise model selecter see hsm2noi.c */ - int HSM2_version; /* model version 200 */ + int HSM2_version; /* model version 2.80 */ int HSM2_show; /* show physical value 1, 2, ... , 11 */ /* flags for initial guess */ @@ -701,6 +715,8 @@ typedef struct sHSM2model { /* model structure for a resistor */ int HSM2_coqy; int HSM2_coqovsm ; int HSM2_coerrrep; + int HSM2_codep; + int HSM2_coddlt; /* add in version 2.80 */ /* HiSIM original */ double HSM2_vmax ; @@ -773,6 +789,8 @@ typedef struct sHSM2model { /* model structure for a resistor */ double HSM2_ndepwp ; double HSM2_ninv ; double HSM2_ninvd ; + double HSM2_ninvdl ; + double HSM2_ninvdlp ; double HSM2_muecb0 ; double HSM2_muecb1 ; double HSM2_mueph1 ; @@ -962,6 +980,40 @@ typedef struct sHSM2model { /* model structure for a resistor */ double HSM2_muecb0lp; double HSM2_muecb1lp; + /* Depletion Mode MOSFET */ + double HSM2_ndepm ; + double HSM2_ndepml ; + double HSM2_ndepmlp ; + double HSM2_tndep ; + double HSM2_depleak ; + double HSM2_depleakl ; + double HSM2_depleaklp ; + double HSM2_depmue0; + double HSM2_depmue0l; + double HSM2_depmue0lp; + double HSM2_depmue1; + double HSM2_depmue1l; + double HSM2_depmue1lp; + double HSM2_depmueback0; + double HSM2_depmueback0l; + double HSM2_depmueback0lp; + double HSM2_depmueback1; + double HSM2_depmueback1l; + double HSM2_depmueback1lp; + double HSM2_depmueph0; + double HSM2_depmueph1; + double HSM2_depvmax; + double HSM2_depvmaxl; + double HSM2_depvmaxlp; + double HSM2_depvdsef1; + double HSM2_depvdsef1l; + double HSM2_depvdsef1lp; + double HSM2_depvdsef2; + double HSM2_depvdsef2l; + double HSM2_depvdsef2lp; + double HSM2_depbb; + double HSM2_depmuetmp; + double HSM2_depeta ; /* binning parameters */ double HSM2_lmin ; @@ -1202,6 +1254,8 @@ typedef struct sHSM2model { /* model structure for a resistor */ double HSM2_qme12 ; double HSM2_ktnom ; int HSM2_bypass_enable ; +//int HSM2_subversion ; +//int HSM2_revision ; double HSM2vgsMax; double HSM2vgdMax; @@ -1244,6 +1298,8 @@ typedef struct sHSM2model { /* model structure for a resistor */ unsigned HSM2_coqy_Given :1; unsigned HSM2_coqovsm_Given :1; unsigned HSM2_coerrrep_Given :1; + unsigned HSM2_codep_Given :1; + unsigned HSM2_coddlt_Given :1; unsigned HSM2_kappa_Given :1; unsigned HSM2_vdiffj_Given :1; unsigned HSM2_vmax_Given :1; @@ -1316,6 +1372,8 @@ typedef struct sHSM2model { /* model structure for a resistor */ unsigned HSM2_ndepwp_Given :1; unsigned HSM2_ninv_Given :1; unsigned HSM2_ninvd_Given :1; + unsigned HSM2_ninvdl_Given :1; + unsigned HSM2_ninvdlp_Given :1; unsigned HSM2_muecb0_Given :1; unsigned HSM2_muecb1_Given :1; unsigned HSM2_mueph1_Given :1; @@ -1504,6 +1562,41 @@ typedef struct sHSM2model { /* model structure for a resistor */ unsigned HSM2_muecb0lp_Given :1; unsigned HSM2_muecb1lp_Given :1; + /* Depletion Mode MOSFET */ + unsigned HSM2_ndepm_Given :1; + unsigned HSM2_ndepml_Given :1; + unsigned HSM2_ndepmlp_Given :1; + unsigned HSM2_tndep_Given :1; + unsigned HSM2_depleak_Given :1; + unsigned HSM2_depleakl_Given :1; + unsigned HSM2_depleaklp_Given :1; + unsigned HSM2_depmue0_Given :1; + unsigned HSM2_depmue0l_Given :1; + unsigned HSM2_depmue0lp_Given :1; + unsigned HSM2_depmue1_Given :1; + unsigned HSM2_depmue1l_Given :1; + unsigned HSM2_depmue1lp_Given :1; + unsigned HSM2_depmueback0_Given :1; + unsigned HSM2_depmueback0l_Given :1; + unsigned HSM2_depmueback0lp_Given :1; + unsigned HSM2_depmueback1_Given :1; + unsigned HSM2_depmueback1l_Given :1; + unsigned HSM2_depmueback1lp_Given :1; + unsigned HSM2_depmueph0_Given :1; + unsigned HSM2_depmueph1_Given :1; + unsigned HSM2_depvmax_Given :1; + unsigned HSM2_depvmaxl_Given :1; + unsigned HSM2_depvmaxlp_Given :1; + unsigned HSM2_depvdsef1_Given :1; + unsigned HSM2_depvdsef1l_Given :1; + unsigned HSM2_depvdsef1lp_Given :1; + unsigned HSM2_depvdsef2_Given :1; + unsigned HSM2_depvdsef2l_Given :1; + unsigned HSM2_depvdsef2lp_Given :1; + unsigned HSM2_depbb_Given :1; + unsigned HSM2_depmuetmp_Given :1; + unsigned HSM2_depeta_Given :1; + /* binning parameters */ unsigned HSM2_lmin_Given :1; unsigned HSM2_lmax_Given :1; @@ -1781,6 +1874,9 @@ typedef struct sHSM2model { /* model structure for a resistor */ #define HSM2_MOD_COQY 38 #define HSM2_MOD_COQOVSM 39 #define HSM2_MOD_COERRREP 153 +#define HSM2_MOD_CODEP 45 +#define HSM2_MOD_CODDLT 40 + /* device parameters */ #define HSM2_L 51 #define HSM2_W 52 @@ -1882,6 +1978,8 @@ typedef struct sHSM2model { /* model structure for a resistor */ #define HSM2_MOD_NDEPWP 470 #define HSM2_MOD_NINV 130 #define HSM2_MOD_NINVD 300 +#define HSM2_MOD_NINVDL 301 +#define HSM2_MOD_NINVDLP 302 #define HSM2_MOD_MUECB0 131 #define HSM2_MOD_MUECB1 132 #define HSM2_MOD_MUEPH1 133 @@ -2065,15 +2163,50 @@ typedef struct sHSM2model { /* model structure for a resistor */ /* 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_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 -#define HSM2_MOD_MUECB0LP 473 -#define HSM2_MOD_MUECB1LP 474 +#define HSM2_MOD_MUECB0LP 473 +#define HSM2_MOD_MUECB1LP 474 + +#define HSM2_MOD_NDEPM 600 +#define HSM2_MOD_NDEPML 610 +#define HSM2_MOD_NDEPMLP 611 +#define HSM2_MOD_TNDEP 601 +#define HSM2_MOD_DEPLEAK 608 +#define HSM2_MOD_DEPLEAKL 614 +#define HSM2_MOD_DEPLEAKLP 615 +#define HSM2_MOD_DEPETA 609 +#define HSM2_MOD_DEPMUE0 275 +#define HSM2_MOD_DEPMUE0L 276 +#define HSM2_MOD_DEPMUE0LP 277 +#define HSM2_MOD_DEPMUE1 278 +#define HSM2_MOD_DEPMUE1L 279 +#define HSM2_MOD_DEPMUE1LP 280 +#define HSM2_MOD_DEPMUEBACK0 288 +#define HSM2_MOD_DEPMUEBACK0L 289 +#define HSM2_MOD_DEPMUEBACK0LP 291 +#define HSM2_MOD_DEPMUEBACK1 293 +#define HSM2_MOD_DEPMUEBACK1L 294 +#define HSM2_MOD_DEPMUEBACK1LP 295 +#define HSM2_MOD_DEPMUEPH0 296 +#define HSM2_MOD_DEPMUEPH1 297 +#define HSM2_MOD_DEPVMAX 298 +#define HSM2_MOD_DEPVMAXL 299 +#define HSM2_MOD_DEPVMAXLP 313 +#define HSM2_MOD_DEPVDSEF1 314 +#define HSM2_MOD_DEPVDSEF1L 315 +#define HSM2_MOD_DEPVDSEF1LP 316 +#define HSM2_MOD_DEPVDSEF2 317 +#define HSM2_MOD_DEPVDSEF2L 318 +#define HSM2_MOD_DEPVDSEF2LP 319 +#define HSM2_MOD_DEPBB 320 +#define HSM2_MOD_DEPMUETMP 321 + /* binning parameters */ #define HSM2_MOD_LMIN 1000 @@ -2389,10 +2522,14 @@ typedef struct sHSM2model { /* model structure for a resistor */ #include "hsm2ext.h" /* +#ifdef __STDC__ extern void HSM2evaluate(double,double,double,HSM2instance*,HSM2model*, double*,double*,double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, CKTcircuit*); +#else +extern void HSM2evaluate(); +#endif */ #endif /*HSM2*/ diff --git a/src/spicelib/devices/hisim2/hsm2del.c b/src/spicelib/devices/hisim2/hsm2del.c index 1f13dea1d..27678a0d4 100644 --- a/src/spicelib/devices/hisim2/hsm2del.c +++ b/src/spicelib/devices/hisim2/hsm2del.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2del.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "hsm2def.h" #include "ngspice/sperror.h" diff --git a/src/spicelib/devices/hisim2/hsm2dest.c b/src/spicelib/devices/hisim2/hsm2dest.c index ad9ffb057..5abf02594 100644 --- a/src/spicelib/devices/hisim2/hsm2dest.c +++ b/src/spicelib/devices/hisim2/hsm2dest.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2dest.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "hsm2def.h" #include "ngspice/suffix.h" diff --git a/src/spicelib/devices/hisim2/hsm2eval.c b/src/spicelib/devices/hisim2/hsm2eval.c index a3f11b8dd..fa4ddc0d0 100644 --- a/src/spicelib/devices/hisim2/hsm2eval.c +++ b/src/spicelib/devices/hisim2/hsm2eval.c @@ -1,14 +1,14 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2eval.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & @@ -131,13 +131,14 @@ to others." #define C_IDD_MIN 1.0e-15 /* local variables used in macro functions */ +double TMF0, TMF1 , TMF2 , TMF3 , TMF4 ; /*===========================================================* * pow *=================*/ #ifdef POW_TO_EXP_AND_LOG -#define Fn_Pow( x , y ) exp( (y) * log( x ) ) +#define Fn_Pow( x , y ) ( (x==0.0) ? 0.0 : exp( (y) * log( x ) ) ) #else -#define Fn_Pow( x , y ) pow( x , y ) +#define Fn_Pow( x , y ) ( (x==0.0) ? 0.0 : pow( x , y ) ) #endif /*===========================================================* @@ -170,7 +171,6 @@ to others." *-----------------*/ #define Fn_SU( y , x , xmax , delta , dx ) { \ - double TMF1, TMF2; \ TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ TMF2 = 4.0 * ( xmax ) * ( delta) ; \ TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ @@ -180,7 +180,6 @@ to others." } #define Fn_SU2( y , x , xmax , delta , dy_dx , dy_dxmax ) { \ - double TMF1, TMF2; \ TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ TMF2 = 4.0 * ( xmax ) * ( delta) ; \ TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ @@ -197,7 +196,6 @@ to others." *-----------------*/ #define Fn_SL( y , x , xmin , delta , dx ) { \ - double TMF1, TMF2; \ TMF1 = ( x ) - ( xmin ) - ( delta ) ; \ TMF2 = 4.0 * ( xmin ) * ( delta ) ; \ TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ @@ -212,7 +210,6 @@ to others." *-----------------*/ #define Fn_SZ( y , x , delta , dx ) { \ - double TMF2; \ TMF2 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta) ) ; \ dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \ y = 0.5 * ( ( x ) + TMF2 ) ; \ @@ -315,6 +312,96 @@ static double CeilingPow dx = (xmax) * xmp * dnm / arg ; \ } +#define Fn_SU_CP2( y , x , xmax , delta , pw , dx , dxmax ) { \ + if(x > xmax - delta && delta >= 0.0) { \ + TMF1 = x - xmax + delta ; \ + Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ + y = xmax - delta + TMF0 ; \ + dx = dx ; \ + dxmax = 1.0-dx ; \ + } else { \ + y = x ; \ + dx = 1.0 ; \ + dxmax = 0.0 ; \ + } \ +} + +#define Fn_CP2( y , x , xmax , pw , dx , dxmax ) { \ + double x2 = (x) * (x) ; \ + double xmax2 = (xmax) * (xmax) ; \ + double xp = 1.0 , xmp = 1.0 ; \ + int m =0, mm =0; \ + double arg =0.0, dnm =0.0; \ + for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \ + arg = xp + xmp ; \ + dnm = arg ; \ + if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \ + if ( pw == 1 ) { mm = 1 ; \ + } else if ( pw == 2 ) { mm = 2 ; \ + } else if ( pw == 4 ) { mm = 3 ; \ + } else if ( pw == 8 ) { mm = 4 ; } \ + for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \ + } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \ + dnm = 1.0 / dnm ; \ + y = (x) * (xmax) * dnm ; \ + dx = (xmax) * xmp * dnm / arg ; \ + dxmax = (x) * xp * dnm / arg ; \ +} + +#define Fn_SU_CP3( y , x , xmax , delta , pw , dx , dxmax , ddelta ) { \ + if(x > xmax - delta && delta >= 0.0) { \ + TMF1 = x - xmax + delta ; \ + Fn_CP2( TMF0 , TMF1 , delta , pw , dx , ddelta ) \ + y = xmax - delta + TMF0 ; \ + dx = dx ; \ + dxmax = 1.0-dx ; \ + ddelta = -1.0+dx+ddelta; \ + } else { \ + y = x ; \ + dx = 1.0 ; \ + dxmax = 0.0 ; \ + ddelta = 0.0 ; \ + } \ +} + +#define Fn_SU_CP( y , x , xmax , delta , pw , dx ) { \ + if(x > xmax - delta && delta >= 0.0) { \ + TMF1 = x - xmax + delta ; \ + Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ + y = xmax - delta + TMF0 ; \ + dx = dx ; \ + } else { \ + y = x ; \ + dx = 1.0 ; \ + } \ +} + +#define Fn_SL_CP2( y , x , xmin , delta , pw , dx , dxmin) { \ + if(x < xmin + delta && delta >= 0.0) { \ + TMF1 = xmin + delta - x ; \ + Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ + y = xmin + delta - TMF0 ; \ + dx = dx ; \ + dxmin = 1.0-dx ; \ + } else { \ + y = x ; \ + dx = 1.0 ; \ + dxmin = 0.0 ; \ + } \ +} +#define Fn_SL_CP( y , x , xmin , delta , pw , dx ) { \ + if(x < xmin + delta && delta >= 0.0) { \ + TMF1 = xmin + delta - x ; \ + Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ + y = xmin + delta - TMF0 ; \ + dx = dx ; \ + } else { \ + y = x ; \ + dx = 1.0 ; \ + } \ +} + + /*===========================================================* * Functions for symmetry. @@ -325,7 +412,6 @@ static double CeilingPow *-----------------*/ #define Fn_DclPoly4( y , x , dx ) { \ - double TMF2, TMF3, TMF4; \ TMF2 = (x) * (x) ; \ TMF3 = TMF2 * (x) ; \ TMF4 = TMF2 * TMF2 ; \ @@ -338,12 +424,20 @@ static double CeilingPow *-----------------*/ #define Fn_SUPoly4( y , x , xmax , dx ) { \ - double TMF1; \ TMF1 = (x) / xmax ; \ Fn_DclPoly4( y , TMF1 , dx ) ; \ y = xmax * ( 1.0 - y ) ; \ dx = - dx ; \ } + +#define Fn_SUPoly4m( y , x , xmax , dx , dxmax ) { \ + TMF1 = (x) / xmax ; \ + Fn_DclPoly4( TMF0 , TMF1 , dx ) ; \ + y = xmax * ( 1.0 - TMF0 ) ; \ + dxmax = 1.0 - TMF0 + TMF1 * dx ; \ + dx = - dx ; \ +} + /*---------------------------------------------------* * SymAdd: evaluate additional term for symmetry. @@ -351,7 +445,6 @@ static double CeilingPow #define Fn_SymAdd( y , x , add0 , dx ) \ { \ - double TMF1, TMF2, TMF3; \ TMF1 = 2.0 * ( x ) / ( add0 ) ; \ TMF2 = 1.0 + TMF1 * ( (1.0/2) + TMF1 * ( (1.0/6) \ + TMF1 * ( (1.0/24) + TMF1 * ( (1.0/120) \ @@ -380,7 +473,6 @@ int HSM2evaluate { HSM2binningParam *pParam = &here->pParam ; HSM2modelMKSParam *modelMKS = &model->modelMKS ; -/* HSM2hereMKSParam *hereMKS = &here->hereMKS ;*/ /*-----------------------------------* * Constants for Smoothing functions *---------------*/ @@ -391,7 +483,10 @@ int HSM2evaluate const double eef_dlt = 1.0e-2 * C_m2cm ; const double sti2_dlt = 2.0e-3 ; const double pol_dlt = 5.0e-2 ; +//const double psia_dlt = 1.0e-3 ; +//const double psia2_dlt = 5.0e-3 ; const double psisti_dlt = 5.0e-3 ; +//const double jct_dlt = 1.0e-2 ; /*---------------------------------------------------* * Local variables. @@ -399,11 +494,15 @@ int HSM2evaluate /* Constants ----------------------- */ const int lp_s0_max = 20 ; const int lp_sl_max = 20 ; + const int lp_se_max = 150 ; + int lp_bs_max = 10 ; const double Ids_tol = 1.0e-10 ; const double Ids_maxvar = 1.0e-1 ; const double dP_max = 0.1e0 ; const double ps_conv = 5.0e-13 ; + const double ps_conv2 = 1.0e-10 ; + /* double ps_conv = 1.0e-13 ;*/ const double gs_conv = 1.0e-8 ; const double mini_current = 1.0e-15 ; @@ -457,7 +556,7 @@ int HSM2evaluate double Vbse =0.0, Vdse =0.0, Vgse =0.0 ; /* confine bias */ double Vbsc =0.0, Vdsc =0.0, Vgsc =0.0 ; - double Vbsc_dVbse = 1.0 ; + double Vbsc_dVbse =1.0, Vbsc_dVbse_dVbs =0.0 ; /* internal bias */ double Vbs =0.0, Vds =0.0, Vgs =0.0, Vdb =0.0, Vsb =0.0 ; double Vbs_dVbse = 1.0 , Vbs_dVdse = 0.0 , Vbs_dVgse = 0.0 ; @@ -475,8 +574,9 @@ int HSM2evaluate double Psl_dVbs =0.0, Psl_dVds =0.0, Psl_dVgs =0.0 ; double Psl_lim =0.0, dPlim =0.0 ; /* Pds := Psl - Ps0 */ - double Pds = 0.0 ; + double Pds = 0.0 , Pdsz = 0.0 ; double Pds_dVbs = 0.0, Pds_dVds = 0.0 , Pds_dVgs = 0.0 ; + double Pdsz_dVbs = 0.0, Pdsz_dVds = 0.0 , Pdsz_dVgs = 0.0 ; double Pds_ini =0.0 ; double Pds_max =0.0 ; /* iteration numbers of Ps0 and Psl equations. */ @@ -494,12 +594,12 @@ int HSM2evaluate /* modified bias and potential for sym.*/ double Vbsz =0.0, Vdsz =0.0, Vgsz =0.0 ; double Vbsz_dVbs =0.0, Vbsz_dVds =0.0 ; - double Vdsz_dVds =0.0 ; - double Vgsz_dVgs =0.0, Vgsz_dVds =0.0 ; - double Vzadd =0.0, Vzadd_dVds =0.0 ; + double Vdsz_dVds =0.0, Vdsz_dVbs =0.0 ; + double Vgsz_dVgs =0.0, Vgsz_dVbs =0.0, Vgsz_dVds =0.0 ; + double Vzadd =0.0, Vzadd_dVds =0.0, Vzadd_dVbs =0.0 ; double Ps0z =0.0, Ps0z_dVbs =0.0, Ps0z_dVds =0.0, Ps0z_dVgs =0.0 ; double Pzadd =0.0, Pzadd_dVbs =0.0, Pzadd_dVds =0.0, Pzadd_dVgs =0.0 ; - double Vgpz , Vgpz_dVbs , Vgpz_dVds , Vgpz_dVgs ; /* (tmp) */ + double Vgpz = 0.0 , Vgpz_dVbs = 0.0 , Vgpz_dVds = 0.0 , Vgpz_dVgs = 0.0 ; /* (tmp) */ /* IBPC */ double dVbsIBPC =0.0, dVbsIBPC_dVbs =0.0, dVbsIBPC_dVds =0.0, dVbsIBPC_dVgs =0.0 ; @@ -614,6 +714,7 @@ int HSM2evaluate double Qbmm=0.0, Qbmm_dVb=0.0, Qbmm_dVd =0.0, Qbmm_dVg =0.0 ; double dqb=0.0, dqb_dVb=0.0, dqb_dVg=0.0, dqb_dVd =0.0 ; double Vdx=0.0, Vdx2 =0.0 ; + double Vdx_dVbs =0.0, Vdx2_dVbs =0.0 ; double Pbsum=0.0, sqrt_Pbsum =0.0 ; double Pbsum_dVb=0.0, Pbsum_dVd=0.0, Pbsum_dVg =0.0 ; /* Poly-Depletion Effect */ @@ -786,6 +887,7 @@ int HSM2evaluate /* PART-6 (noise) */ /* 1/f */ double NFalp =0.0, NFtrp =0.0, Cit =0.0, Nflic =0.0 ; + double Qi_noi =0.0 , Qiu_noi =0.0 ; /* thermal */ double Eyd=0.0, Mu_Ave=0.0, Nthrml=0.0, Mud_hoso =0.0 ; /* induced gate noise ( Part 0/3 ) */ @@ -811,7 +913,7 @@ int HSM2evaluate double dVbs =0.0, dVds =0.0, dVgs =0.0 ; double dV_sum =0.0 ; /* temporary vars. */ - double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12 ; + double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9 = 0.0, T10 = 0.0, T11 = 0.0, T12 ; double TX =0.0, TX_dVbs =0.0, TX_dVds =0.0, TX_dVgs =0.0 ; double TY =0.0, TY_dVbs =0.0, TY_dVds =0.0, TY_dVgs =0.0 ; double T1_dVb =0.0, T1_dVd =0.0, T1_dVg =0.0 ; @@ -824,9 +926,9 @@ int HSM2evaluate double T8_dVb =0.0, T8_dVd =0.0, T8_dVg =0.0 ; double T9_dVb =0.0, T9_dVd =0.0, T9_dVg =0.0 ; double T10_dVb =0.0, T10_dVd =0.0, T10_dVg =0.0 ; + double T15, T16, T17 ; int flg_zone = 0 ; - double Vfbsft = 0.0 , Vfbsft_dVbs =0.0, Vfbsft_dVds =0.0, Vfbsft_dVgs =0.0 ; /* Vdseff */ double Vdseff =0.0, Vdsorg =0.0 ; @@ -904,17 +1006,17 @@ int HSM2evaluate double Chi_A=0.0, Chi_A_dVxb=0.0, Chi_A_dVgb =0.0 ; double Chi_B=0.0, Chi_B_dVxb=0.0, Chi_B_dVgb =0.0 ; double Chi_1=0.0, Chi_1_dVxb=0.0, Chi_1_dVgb =0.0 ; -/* double psi_B=0.0, arg_B =0.0 ;*/ + double psi_B=0.0, arg_B =0.0 ; double psi=0.0, psi_dVgb=0.0, psi_dVxb =0.0 ; double Ps0_iniA_dVxb=0.0, Ps0_iniA_dVgb =0.0 ; -/* double Ps0_iniB_dVxb=0.0 , Ps0_iniB_dVgb =0.0 ;*/ + double Ps0_iniB_dVxb=0.0, Ps0_iniB_dVgb =0.0 ; double Psa_dVxb=0.0, Psa_dVgb=0.0, Ps0LD_dVxb=0.0, Ps0LD_dVgb =0.0 ; - double /*fs02_dVxb=0.0,*/ fs02_dVgb =0.0 ; + double fs02_dVxb=0.0, fs02_dVgb =0.0 ; /* SCE LOOP */ double A =0.0, A_dVgs=0.0, A_dVds=0.0, A_dVbs =0.0 ; int NNN =0 ; -/* double PS0_SCE=0 , PS0_SCE_dVgs = 0 , PS0_SCE_dVds = 0 , PS0_SCE_dVbs = 0 ;*/ + double PS0_SCE=0 , PS0_SCE_dVgs = 0 , PS0_SCE_dVds = 0 , PS0_SCE_dVbs = 0 ; double PS0Z_SCE=0 , PS0Z_SCE_dVgs = 0 , PS0Z_SCE_dVds = 0 , PS0Z_SCE_dVbs = 0 ; /* double arg0 = 0.01 , arg1 = 0.04 ; */ double arg0 = 0.01 ; @@ -923,6 +1025,7 @@ int HSM2evaluate int codqb = 0 ; int corecip = model->HSM2_corecip ; + int START_OF_SCE_LOOP = 1 , end_of_part_1 = 0 ; /* modify Qy in accumulation region */ @@ -941,7 +1044,7 @@ int HSM2evaluate double Ps0_iniB_dVds =0.0, Ps0_iniB_dVgs =0.0, Ps0_iniB_dVbs =0.0 ; double A_dPS0Z = 0.0, dqb_dPS0Z = 0.0, dVth_dPS0Z = 0.0, dVth0_dPS0Z = 0.0, - dVthLP_dPS0Z = 0.0, dVthSC_dPS0Z = 0.0, Qbmm_dPS0Z = 0.0, Vfbsft_dPS0Z = 0.0, + dVthLP_dPS0Z = 0.0, dVthSC_dPS0Z = 0.0, Qbmm_dPS0Z = 0.0, Vgp_dPS0Z = 0.0, Vgpz_dPS0Z = 0.0, Vthp_dPS0Z = 0.0, Vth0_dPS0Z = 0.0 ; double T1_dPS0Z=0.0, T3_dPS0Z=0.0, T4_dPS0Z=0.0, T5_dPS0Z=0.0, @@ -957,6 +1060,7 @@ int HSM2evaluate double Vgs_min =0.0 ; + /*================ Start of executable code.=================*/ if (here->HSM2_mode == HiSIM_NORMAL_MODE) { @@ -1080,16 +1184,45 @@ int HSM2evaluate flg_vbsc = 1 ; T1 = Vbse - Vbs_bnd ; T2 = Vbs_max - Vbs_bnd ; - Fn_SUPoly4( TY , T1 , T2 , Vbsc_dVbse ) ; + Fn_SUPoly4m( TY , T1 , T2 , Vbsc_dVbse , T0 ) ; Vbsc = Vbs_bnd + TY ; + + T3 = 1 / T2 ; + /* x/xmax */ + T4 = T1 * T3 ; + T4_dVb = T3 ; + + T5 = T4 * T4; + T5_dVb = 2 * T4_dVb * T4 ; + T15 = 2 * T4_dVb * T4_dVb ; /* T15 = T5_dVb_dVb */ + + T6 = T4 * T5 ; + T6_dVb = T4_dVb * T5 + T4 * T5_dVb ; + T16 = T4_dVb * T5_dVb + T4_dVb * T5_dVb + T4 * T15 ; /* T16 = T6_dVb_dVb */ + + /* T7 = Z T7_dVb = dZ_dVb T17 = dZ_dVb_dVb */ + T7 = 1 + T4 + T5 + T6 + T5 * T5 ; + T7_dVb = T4_dVb + T5_dVb + T6_dVb + 2 * T5_dVb * T5 ; + T17 = T15 + T16 + 2 * T15 * T5 + 2 * T5_dVb * T5_dVb ; + + T8 = T7 * T7 ; + T8_dVb = 2 * T7_dVb * T7 ; + + T9 = 1 / T8 ; + T9_dVb = - T8_dVb * T9 * T9 ; + + Vbsc_dVbse = T2 * T7_dVb * T9 ; + Vbsc_dVbse_dVbs = T2 * ( T17 * T9 + T7_dVb * T9_dVb ) ; + } else if ( Vbse < Vbs_min ) { flg_vbsc = -1 ; Vbsc = Vbs_min ; - Vbsc_dVbse = 1.0 ; + Vbsc_dVbse_dVbs = 0.0 ; } else { flg_vbsc = 0 ; Vbsc = Vbse ; Vbsc_dVbse = 1.0 ; + Vbsc_dVbse_dVbs = 0.0 ; } Vdsc = Vdse ; @@ -1233,6 +1366,473 @@ int HSM2evaluate Vgs = Vgsc ; } /* end of flg_rsrd if-blocks */ + + if( model->HSM2_codep == 1 ) { + /*---------------------------------------------------* + * CODEP=1 : Depletion mode MOSFET + *-----------------*/ + + /*-----------------------------------------------------------* + * Vxsz: Modified bias introduced to realize symmetry at Vds=0. + *-----------------*/ + + T1 = Vbsc_dVbse * Vds / 2 ; + Fn_SymAdd( Vzadd , T1 , model->HSM2_vzadd0 , T2 ) ; + Vzadd_dVbs = T2 * Vbsc_dVbse_dVbs * Vds / 2 ; + T2 *= Vbsc_dVbse / 2 ; + Vzadd_dVds = T2 ; + + if ( Vzadd < ps_conv ) { + Vzadd = ps_conv ; + Vzadd_dVds = 0.0 ; + Vzadd_dVbs = 0.0 ; + } + + Vbsz = Vbs + Vzadd ; + Vbsz_dVbs = 1.0 ; + Vbsz_dVds = Vzadd_dVds ; + + Vdsz = Vds + 2.0 * Vzadd ; + Vdsz_dVbs = 0.0 ; + Vdsz_dVds = 1.0 + 2.0 * Vzadd_dVds ; + + Vgsz = Vgs + Vzadd ; + Vgsz_dVgs = 1.0 ; + Vgsz_dVbs = 0.0 ; + Vgsz_dVds = Vzadd_dVds ; + + + /*---------------------------------------------------* + * Factor of modification for symmetry. + *-----------------*/ + + T1 = here->HSM2_qnsub_esi * Cox0_inv * Cox0_inv ; + T2 = Vgs - Vfb ; + T3 = 1 + 2.0 / T1 * ( T2 - beta_inv - Vbs ) ; + Fn_SZ( T4 , T3 , 1e-3 , T5 ) ; + TX = sqrt( T4 ) ; + Pslsat = T2 + T1 * ( 1.0 - TX ) ; + VdsatS = Pslsat - Pb2 ; + Fn_SL( VdsatS , VdsatS , 0.1 , 5e-2 , T6 ) ; + + VdsatS_dVbs = ( TX ? (T6 * T5 / TX ) : 0.0 ) ; + VdsatS_dVds = 0.0 ; + VdsatS_dVgs = ( TX ? (T6 * ( 1.0 - T5 / TX )) : 0.0 ) ; + + + T1 = Vds / VdsatS ; + Fn_SUPoly4( TX , T1 , 1.0 , T0 ) ; + FMDVDS = TX * TX ; + T2 = 2 * TX * T0 ; + T3 = T2 / ( VdsatS * VdsatS ) ; + FMDVDS_dVbs = T3 * ( - Vds * VdsatS_dVbs ) ; + FMDVDS_dVds = T3 * ( 1.0 * VdsatS - Vds * VdsatS_dVds ) ; + FMDVDS_dVgs = T3 * ( - Vds * VdsatS_dVgs ) ; + + /*-----------------------------------------------------------* + * Quantum effect + *-----------------*/ + if ( model->HSM2_flg_qme == 0 ) { + flg_qme = 0 ; + } else { + flg_qme = 1 ; + } + + + T1 = here->HSM2_2qnsub_esi ; + T2 = sqrt( T1 * Pb20 ) ; + Vthq = Pb20 + Vfb + T2 * Cox0_inv ; + Vthq_dVb = 0.0 ; + Vthq_dVd = 0.0 ; + + if ( flg_qme == 0 ) { + Tox = Tox0 ; + Tox_dVb = 0.0 ; + Tox_dVd = 0.0 ; + Tox_dVg = 0.0 ; + + Cox = Cox0 ; + Cox_dVb = 0.0 ; + Cox_dVd = 0.0 ; + Cox_dVg = 0.0 ; + + Cox_inv = Cox0_inv ; + Cox_inv_dVb = 0.0 ; + Cox_inv_dVd = 0.0 ; + Cox_inv_dVg = 0.0 ; + + T0 = cnst0 * cnst0 * Cox_inv ; + cnstCoxi = T0 * Cox_inv ; + cnstCoxi_dVb = 0.0 ; + cnstCoxi_dVd = 0.0 ; + cnstCoxi_dVg = 0.0 ; + + } else { + + T5 = Vgs - Vbs - Vthq + model->HSM2_qme2 ; + T5_dVb = -1.0 - Vthq_dVb ; + 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 ; + + T3 = 1.0 / T2 ; + T7 = -1.0 / ( T2 * T2 ) ; + T3_dVb = T7 * T2_dVb ; + T3_dVd = T7 * T2_dVd ; + T3_dVg = T7 * T2_dVg ; + + T4 = 2.0 * fabs(Vthq) ; + T6 = Vfb - Vthq + model->HSM2_qme2 ; + if(T6 > T4) { T4 = T6; } + + Fn_SU( T2 , T3 , 1.0 / T4 , qme_dlt, T6 ) ; + T2_dVb = T6 * T3_dVb ; + T2_dVd = T6 * T3_dVd ; + T2_dVg = T6 * T3_dVg ; + + dTox = model->HSM2_qme1 * T2 + model->HSM2_qme3 ; + T7 = model->HSM2_qme1 ; + dTox_dVb = T7 * T2_dVb ; + dTox_dVd = T7 * T2_dVd ; + dTox_dVg = T7 * T2_dVg ; + + if ( dTox * 1.0e12 < Tox0 ) { + dTox = 0.0 ; + dTox_dVb = 0.0 ; + dTox_dVd = 0.0 ; + dTox_dVg = 0.0 ; + flg_qme = 0 ; + } + + Tox = Tox0 + dTox ; + Tox_dVb = dTox_dVb ; + Tox_dVd = dTox_dVd ; + Tox_dVg = dTox_dVg ; + + Cox = c_eox / Tox ; + T1 = - c_eox / ( Tox * Tox ) ; + Cox_dVb = T1 * Tox_dVb ; + Cox_dVd = T1 * Tox_dVd ; + Cox_dVg = T1 * Tox_dVg ; + + Cox_inv = Tox / c_eox ; + T1 = 1.0 / c_eox ; + Cox_inv_dVb = T1 * Tox_dVb ; + Cox_inv_dVd = T1 * Tox_dVd ; + Cox_inv_dVg = T1 * Tox_dVg ; + + T0 = cnst0 * cnst0 * Cox_inv ; + cnstCoxi = T0 * Cox_inv ; + T1 = 2.0 * T0 ; + cnstCoxi_dVb = T1 * Cox_inv_dVb ; + cnstCoxi_dVd = T1 * Cox_inv_dVd ; + cnstCoxi_dVg = T1 * Cox_inv_dVg ; + } + + + fac1 = cnst0 * Cox_inv ; + fac1_dVds = cnst0 * Cox_inv_dVd ; + fac1_dVgs = cnst0 * Cox_inv_dVg ; + fac1_dVbs = cnst0 * Cox_inv_dVb ; + fac1p2 = fac1 * fac1 ; + + /* Ps0_min: approx. solution of Poisson equation at Vgs_min */ + /* ( easy to improve, if necessary ) */ + Ps0_min = 2.0 * beta_inv * log(-Vgs_min/fac1) ; + Ps0_min_dVds = -2.0 * beta_inv * fac1_dVds / fac1 ; + Ps0_min_dVgs = -2.0 * beta_inv * fac1_dVgs / fac1 ; + Ps0_min_dVbs = -2.0 * beta_inv * fac1_dVbs / fac1 ; + + + /*---------------------------------------------------* + * Vbsz2 : Vbs for dVth + *-----------------*/ + Vbsz2 = Vbsz ; + Vbsz2_dVbs = Vbsz_dVbs ; + Vbsz2_dVds = Vbsz_dVds ; + Vbsz2_dVgs = 0.0 ; + + /*---------------------------------------------------* + * Vthp : Vth with pocket. + *-----------------*/ + T1 = here->HSM2_2qnsub_esi ; + Qb0 = sqrt (T1 * (Pb20 - Vbsz2)) ; + T2 = 0.5 * T1 / Qb0 ; + Qb0_dVb = T2 * (- Vbsz2_dVbs) ; + Qb0_dVd = T2 * (- Vbsz2_dVds) ; + Qb0_dVg = T2 * (- Vbsz2_dVgs) ; + + Vthp = Pb20 + Vfb + Qb0 * Cox_inv + here->HSM2_ptovr; + Vthp_dVb = Qb0_dVb * Cox_inv + Qb0 * Cox_inv_dVb ; + Vthp_dVd = Qb0_dVd * Cox_inv + Qb0 * Cox_inv_dVd ; + Vthp_dVg = Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ; + + Pb20b = Pb20 ; + Pb20b_dVb = 0.0 ; + Pb20b_dVd = 0.0 ; + Pb20b_dVg = 0.0 ; + + T0 = 0.95 ; + T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ; + T1_dVb = T0 * Pb20b_dVb - Vbsz2_dVbs ; + T1_dVd = T0 * Pb20b_dVd - Vbsz2_dVds ; + T1_dVg = T0 * Pb20b_dVg - Vbsz2_dVgs ; + T2 = sqrt (T1 * T1 + 4.0 * T0 * Pb20b * 1.0e-3) ; + T3 = T0 * Pb20b - 0.5 * (T1 + T2) ; + T4 = 2.0 * T0 * 1.0e-3 ; + T5 = T1 / T2 ; + T6 = T4 / T2 ; + T3_dVb = T0 * Pb20b_dVb + - 0.5 * (T1_dVb + (T1_dVb * T5 + T6 * Pb20b_dVb ) ) ; + T3_dVd = T0 * Pb20b_dVd + - 0.5 * (T1_dVd + (T1_dVd * T5 + T6 * Pb20b_dVd ) ) ; + T3_dVg = T0 * Pb20b_dVg + - 0.5 * (T1_dVg + (T1_dVg * T5 + T6 * Pb20b_dVg ) ) ; + Pbsum = Pb20b - T3 ; + Pbsum_dVb = Pb20b_dVb - T3_dVb ; + Pbsum_dVd = Pb20b_dVd - T3_dVd ; + Pbsum_dVg = Pb20b_dVg - T3_dVg ; + + if( model->HSM2_codep ) { + Pbsum = Pbsum + model->HSM2_depeta * Vdsz ; + Pbsum_dVb = Pbsum_dVb + model->HSM2_depeta * Vdsz_dVbs ; + Pbsum_dVd = Pbsum_dVd + model->HSM2_depeta * Vdsz_dVds ; + } + + sqrt_Pbsum = sqrt( Pbsum ) ; + + /*-------------------------------------------* + * dVthLP : Short-channel effect induced by pocket. + * - Vth0 : Vth without pocket. + *-----------------*/ + if ( model->HSM2_lp != 0.0 ) { + T1 = here->HSM2_2qnsub_esi ; + T2 = model->HSM2_bs2 - Vbsz2 ; + T3 = T2 + small ; + T4 = sqrt (T3 * T3 + 4.0 * vth_dlt) ; + T5 = 0.5 * (T3 + T4) ; + T6 = 0.5 * (1.0 + T3 / T4) ; + T5_dVb = - Vbsz2_dVbs * T6 ; + T5_dVd = - Vbsz2_dVds * T6 ; + T5_dVg = - Vbsz2_dVgs * T6 ; + T7 = 1.0 / T5 ; + bs12 = model->HSM2_bs1 * T7 ; + T8 = - bs12 * T7 ; + bs12_dVb = T8 * T5_dVb ; + bs12_dVd = T8 * T5_dVd ; + bs12_dVg = T8 * T5_dVg ; + Fn_SU( T10 , Vbsz2 + bs12, 0.93 * Pb20, vth_dlt, T0) ; + Qbmm = sqrt (T1 * (Pb20 - T10 )) ; + T9 = T0 / Qbmm ; + Qbmm_dVb = 0.5 * T1 * - (Vbsz2_dVbs + bs12_dVb) * T9 ; + Qbmm_dVd = 0.5 * T1 * - (Vbsz2_dVds + bs12_dVd) * T9 ; + Qbmm_dVg = 0.5 * T1 * - (Vbsz2_dVgs + bs12_dVg) * T9 ; + + dqb = (Qb0 - Qbmm) * Cox_inv ; + dqb_dVb = Vthp_dVb - Qbmm_dVb * Cox_inv - Qbmm * Cox_inv_dVb ; + 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 * here->HSM2_nsubc * C_ESI ; + T2 = sqrt( T1 * ( Pb2c - Vbsz2 ) ) ; + Vth0 = Pb2c + Vfb + T2 * Cox_inv ; + T3 = 0.5 * T1 / T2 * Cox_inv ; + Vth0_dVb = T3 * ( - Vbsz2_dVbs ) + T2 * Cox_inv_dVb ; + Vth0_dVd = T3 * ( - Vbsz2_dVds ) + T2 * Cox_inv_dVd ; + Vth0_dVg = T3 * ( - Vbsz2_dVgs ) + T2 * Cox_inv_dVg ; + + T1 = C_ESI * Cox_inv ; + T2 = here->HSM2_wdplp ; + T4 = 1.0e0 / ( model->HSM2_lp * model->HSM2_lp ) ; + T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ; + dVth0 = T5 * sqrt_Pbsum ; + T6 = 0.5 * T5 / sqrt_Pbsum ; + T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ; + T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ; + dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ; + dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ; + dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ; + + T1 = Vthp - Vth0 ; + T1_dVb = Vthp_dVb - Vth0_dVb ; + T2 = pParam->HSM2_scp1 + pParam->HSM2_scp3 * Pbsum / model->HSM2_lp ; + T2_dVb = pParam->HSM2_scp3 * Pbsum_dVb / model->HSM2_lp ; + T3 = T2 + pParam->HSM2_scp2 * Vdsz ; + T3_dVb = T2_dVb + pParam->HSM2_scp2 * Vdsz_dVbs ; + + + Vdx = model->HSM2_scp21 + Vdsz ; + Vdx_dVbs = Vdsz_dVbs ; + Vdx2 = Vdx * Vdx ; + Vdx2_dVbs = 2 * Vdx_dVbs * Vdx ; + + dVthLP = T1 * dVth0 * T3 + dqb - here->HSM2_msc / Vdx2 ; + dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb + + dqb_dVb + here->HSM2_msc / Vdx2 /Vdx2 *Vdx2_dVbs; + T4 = T1 * dVth0 * pParam->HSM2_scp3 / model->HSM2_lp ; + dVthLP_dVd = (Vthp_dVd - Vth0_dVd) * dVth0 * T3 + T1 * dVth0_dVd * T3 + + T4 * Pbsum_dVd + + T1 * dVth0 * pParam->HSM2_scp2 * Vdsz_dVds + + dqb_dVd + + 2.0e0 * here->HSM2_msc * Vdx * Vdsz_dVds / ( Vdx2 * Vdx2 ) ; + dVthLP_dVg = (Vthp_dVg - Vth0_dVg) * dVth0 * T3 + T1 * dVth0_dVg * T3 + + T4 * Pbsum_dVg + dqb_dVg ; + } else { + dVthLP = 0.0e0 ; + dVthLP_dVb = 0.0e0 ; + dVthLP_dVd = 0.0e0 ; + dVthLP_dVg = 0.0e0 ; + } + + /*---------------------------------------------------* + * dVthSC : Short-channel effect induced by Vds. + *-----------------*/ + T1 = C_ESI * Cox_inv ; + T2 = here->HSM2_wdpl ; + T3 = here->HSM2_lgate - model->HSM2_parl2 ; + T4 = 1.0e0 / ( T3 * T3 ) ; + T5 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * T1 * T2 * T4 ; + + dVth0 = T5 * sqrt_Pbsum ; + + T6 = T5 / 2.0 / sqrt_Pbsum ; + T7 = 2.0e0 * ( model->HSM2_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ; + T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ; + dVth0_dVb = T6 * Pbsum_dVb + T7 * Cox_inv_dVb + T8 * Pb20b_dVb ; + dVth0_dVd = T6 * Pbsum_dVd + T7 * Cox_inv_dVd + T8 * Pb20b_dVd ; + dVth0_dVg = T6 * Pbsum_dVg + T7 * Cox_inv_dVg + T8 * Pb20b_dVg ; + + T1 = pParam->HSM2_sc3 / here->HSM2_lgate ; + T4 = pParam->HSM2_sc1 + T1 * Pbsum ; + T4_dVb = T1 * Pbsum_dVb ; + T4_dVd = T1 * Pbsum_dVd ; + T4_dVg = T1 * Pbsum_dVg ; + + T5 = T4 + pParam->HSM2_sc2 * Vdsz * ( 1.0 + model->HSM2_sc4 * Pbsum ); + T5_dVb = T4_dVb + pParam->HSM2_sc2 * Vdsz * model->HSM2_sc4 * Pbsum_dVb + + pParam->HSM2_sc2 * Vdsz_dVbs * model->HSM2_sc4 * Pbsum; + T5_dVd = T4_dVd + pParam->HSM2_sc2 * Vdsz_dVds * ( 1.0 + model->HSM2_sc4 * Pbsum ) + + pParam->HSM2_sc2 * Vdsz * model->HSM2_sc4 * Pbsum_dVd; + T5_dVg = T4_dVg + pParam->HSM2_sc2 * Vdsz * model->HSM2_sc4 * Pbsum_dVg; + + + dVthSC = dVth0 * T5 ; + dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ; + dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ; + dVthSC_dVg = dVth0_dVg * T5 + dVth0 * T5_dVg ; + + /*---------------------------------------------------* + * dVthW : narrow-channel effect. + *-----------------*/ + T1 = 1.0 / Cox ; + T2 = T1 * T1 ; + T3 = 1.0 / ( Cox + pParam->HSM2_wfc / Weff ) ; + T4 = T3 * T3 ; + T5 = T1 - T3 ; + T6 = Qb0 * ( T2 - T4 ) ; + + dVthW = Qb0 * T5 + pParam->HSM2_wvth0 / here->HSM2_wg ; + dVthW_dVb = Qb0_dVb * T5 - Cox_dVb * T6 ; + dVthW_dVd = Qb0_dVd * T5 - Cox_dVd * T6 ; + dVthW_dVg = - Cox_dVg * T6 ; + + /*---------------------------------------------------* + * dVth : Total variation. + * - Positive dVth means the decrease in Vth. + *-----------------*/ + dVth = dVthSC + dVthLP + dVthW + here->HSM2_dVthsm ; + dVth_dVb = dVthSC_dVb + dVthLP_dVb + dVthW_dVb ; + dVth_dVd = dVthSC_dVd + dVthLP_dVd + dVthW_dVd ; + dVth_dVg = dVthSC_dVg + dVthLP_dVg + dVthW_dVg ; + + /*---------------------------------------------------* + * Vth : Threshold voltagei for OP. + *-----------------*/ + T2 = sqrt( here->HSM2_2qnsub_esi * (Pb2-Vbsz) ) ; + Vth = Pb2 + Vfb + T2 * Cox0_inv - dVth ; + + /*-----------------------------------------------------------* + * Constants in the equation of Ps0 . + *-----------------*/ + + fac1 = cnst0 * Cox_inv ; + fac1_dVbs = cnst0 * Cox_inv_dVb ; + fac1_dVds = cnst0 * Cox_inv_dVd ; + fac1_dVgs = cnst0 * Cox_inv_dVg ; + + fac1p2 = fac1 * fac1 ; + + /*---------------------------------------------------* + * Poly-Depletion Effect + *-----------------*/ + + dPpg = 0.0 ; + dPpg_dVb = 0.0 ; + dPpg_dVd = 0.0 ; + dPpg_dVg = 0.0 ; + + if ( here->HSM2_flg_pgd == 1 ) { + + T7 = Vgsz ; + T7_dVb = Vgsz_dVbs ; + T7_dVd = Vgsz_dVds ; + T7_dVg = Vgsz_dVgs ; + + T0 = here->HSM2_cnstpgd ; + + T3 = T7 - model->HSM2_pgd2 ; + T3_dVb = T7_dVb ; + T3_dVd = T7_dVd ; + T3_dVg = T7_dVg ; + + Fn_ExpLim( dPpg , T3 , T6 ) ; + dPpg_dVb = T6 * T3_dVb ; + dPpg_dVd = T6 * T3_dVd ; + dPpg_dVg = T6 * T3_dVg ; + + Fn_SZ( dPpg , dPpg - 1.0 , pol_dlt , T6 ) ; + dPpg_dVb *= T6 ; + dPpg_dVd *= T6 ; + dPpg_dVg *= T6 ; + + dPpg *= T0 ; + dPpg_dVb *= T0 ; + dPpg_dVd *= T0 ; + dPpg_dVg *= T0 ; + + Fn_SU( dPpg , dPpg , pol_b , pol_dlt , T9 ) ; + dPpg_dVb *= T9 ; + dPpg_dVd *= T9 ; + dPpg_dVg *= T9 ; + + } + + /*---------------------------------------------------* + * Vgp : Effective gate bias with SCE & RSCE & flatband. + *-----------------*/ + Vgp = Vgs - Vfb + dVth - dPpg ; + Vgp_dVbs = dVth_dVb - dPpg_dVb ; + Vgp_dVds = dVth_dVd - dPpg_dVd ; + Vgp_dVgs = 1.0e0 + dVth_dVg - dPpg_dVg ; + + /*---------------------------------------------------* + * Vgs_fb : Actual flatband voltage taking account Vbs. + * - note: if Vgs == Vgs_fb then Vgp == Ps0 == Vbs . + *------------------*/ + Vgs_fb = Vfb - dVth + dPpg + Vbs ; + +#include "hsm2eval_dep.h" + + } else { + + /*---------------------------------------------------* + * Normal mode MOSFET + *------------------*/ + /*-----------------------------------------------------------* * start of the loop. *-----------------*/ @@ -1569,11 +2169,11 @@ int HSM2evaluate /**************************/ /* initial value for SCE LOOP */ -/* PS0_SCE = Ps0_ini ; + PS0_SCE = Ps0_ini ; PS0_SCE_dVds = Ps0_ini_dVds ; PS0_SCE_dVgs = Ps0_ini_dVgs ; PS0_SCE_dVbs = Ps0_ini_dVbs ; -*/ + PS0Z_SCE = Ps0_ini ; PS0Z_SCE_dVds = Ps0_ini_dVds ; PS0Z_SCE_dVgs = Ps0_ini_dVgs ; @@ -1585,7 +2185,12 @@ int HSM2evaluate /* ************************************************************************* */ - START_OF_SCE_LOOP : /* outer loop of multi level Newton framework */ +// START_OF_SCE_LOOP : /* outer loop of multi level Newton framework */ + START_OF_SCE_LOOP = 1 ; end_of_part_1 = 0 ; +while( START_OF_SCE_LOOP ) { /* Begin: 1st SCE LOOP */ + while( START_OF_SCE_LOOP ) { /* Begin: 2nd SCE LOOP */ + while( START_OF_SCE_LOOP ) { /* Begin: 3rd SCE LOOP */ + START_OF_SCE_LOOP = 0 ; /* ************************************************************************* */ @@ -2560,76 +3165,6 @@ int HSM2evaluate *------------------*/ Vgs_fb = Vfb - dVth + dPpg + Vbs ; - - /*---------------------------------------------------* - * Vfbsft : Vfb shift - *-----------------*/ - Vfbsft = 0.0 ; - Vfbsft_dVbs = 0.0 ; - Vfbsft_dVds = 0.0 ; - Vfbsft_dVgs = 0.0 ; - Vfbsft_dPS0Z = 0.0 ; - - if ( Vbs > 0.0 ) { - /* values at D2/D3 boundary + beta */ - /* Ps0 */ - T1 = Vbs + ( znbd5 + 1 ) * beta_inv ; - /* Qb0 */ - /* T2 = cnst0 * sqrt( znbd5 ) */ - T2 = cnst0 * 2.23606797749979 ; - - /* Vgp assuming Qn0=0 */ - T3 = T2 * Cox_inv + T1 ; - - /* Vgp difference */ - TX = T3 - Vgp ; - TX_dVbs = 1.0 - Vgp_dVbs ; - TX_dVds = - Vgp_dVds ; - TX_dVgs = - Vgp_dVgs ; - TX_dPS0Z = - Vgp_dPS0Z ; - - /* set lower limit to 0 */ - Fn_SZ( TX , TX , 0.1 , T4 ) ; - TX_dVbs *= T4 ; - TX_dVds *= T4 ; - TX_dVgs *= T4 ; - TX_dPS0Z *= T4 ; - - /* TY: damping factor */ - T1 = 0.5 ; - T5 = Vbs / T1 ; - T5_dVb = 1.0 / T1 ; - T6 = T5 * T5 ; - T6 *= T6 ; - T6_dVb = 4 * T5 * T5 * T5 * T5_dVb ; - T7 = 1.0 / ( 1.0 + T6 ) ; - T8 = T7 * T7 ; - TY = 1.0 - T7 ; - TY_dVbs = T8 * T6_dVb ; - - TX = TY = 0.0 ; - TX_dVbs = TX_dVds = TX_dVgs = TX_dPS0Z = TY_dVbs = 0.0 ; - - Vfbsft = TX * TY ; - Vfbsft_dVbs = TX_dVbs * TY + TX * TY_dVbs ; - Vfbsft_dVds = TX_dVds * TY ; - Vfbsft_dVgs = TX_dVgs * TY ; - Vfbsft_dPS0Z = TX_dPS0Z * TY ; - Vgs_fb -= Vfbsft ; - - Vgp += Vfbsft ; - Vgp_dVbs += Vfbsft_dVbs ; - Vgp_dVds += Vfbsft_dVds ; - Vgp_dVgs += Vfbsft_dVgs ; - Vgp_dPS0Z += Vfbsft_dPS0Z ; - - Vgpz += Vfbsft ; - Vgpz_dVbs += Vfbsft_dVbs ; - Vgpz_dVds += Vfbsft_dVds ; - Vgpz_dVgs += Vfbsft_dVgs ; - Vgpz_dPS0Z += Vfbsft_dPS0Z ; - } - /*-----------------------------------------------------------* * Accumulation zone. (zone-A) * - evaluate basic characteristics and exit from this part. @@ -2824,26 +3359,30 @@ int HSM2evaluate PS0Z_SCE_dVbs = Ps0z_dVbs ; PS0Z_SCE_dVds = Ps0z_dVds ; PS0Z_SCE_dVgs = Ps0z_dVgs ; -/* + PS0_SCE = PS0Z_SCE - Pzadd ; PS0_SCE_dVbs = Ps0_dVbs ; PS0_SCE_dVds = Ps0_dVds ; PS0_SCE_dVgs = Ps0_dVgs ; -*/ + NNN += 1 ; - if( ( fabs(delta_PS0Z_SCE) > PS0_SCE_tol - || fabs(delta_PS0Z_SCE_dVbs) > PS0_SCE_deriv_tol - || fabs(delta_PS0Z_SCE_dVds) > PS0_SCE_deriv_tol - || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol - ) && (NNN < MAX_LOOP_SCE) ){ - goto START_OF_SCE_LOOP; - } + if( ( fabs(delta_PS0Z_SCE) > PS0_SCE_tol + || fabs(delta_PS0Z_SCE_dVbs) > PS0_SCE_deriv_tol + || fabs(delta_PS0Z_SCE_dVds) > PS0_SCE_deriv_tol + || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol + ) && (NNN < MAX_LOOP_SCE) ){ + // goto START_OF_SCE_LOOP; + START_OF_SCE_LOOP = 1 ; + } } - goto end_of_part_1 ; + //goto end_of_part_1 ; + if( START_OF_SCE_LOOP==0 ) end_of_part_1 = 1 ; } + } /* End of 3rd SCE_LOOP */ + if ( end_of_part_1 == 0 ) { /* skip to end_of_part_1 */ /*-----------------------------------------------------------* * Initial guess for Ps0. @@ -3327,29 +3866,34 @@ int HSM2evaluate PS0Z_SCE_dVbs = Ps0z_dVbs ; PS0Z_SCE_dVds = Ps0z_dVds ; PS0Z_SCE_dVgs = Ps0z_dVgs ; -/* + PS0_SCE = PS0Z_SCE - Pzadd ; PS0_SCE_dVbs = Ps0_dVbs ; PS0_SCE_dVds = Ps0_dVds ; PS0_SCE_dVgs = Ps0_dVgs ; -*/ + NNN += 1 ; - if( ( fabs(delta_PS0Z_SCE) > PS0_SCE_tol - || fabs(delta_PS0Z_SCE_dVbs) > PS0_SCE_deriv_tol - || fabs(delta_PS0Z_SCE_dVds) > PS0_SCE_deriv_tol - || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol - ) && (NNN < MAX_LOOP_SCE) ){ - goto START_OF_SCE_LOOP; + if( ( fabs(delta_PS0Z_SCE) > PS0_SCE_tol + || fabs(delta_PS0Z_SCE_dVbs) > PS0_SCE_deriv_tol + || fabs(delta_PS0Z_SCE_dVds) > PS0_SCE_deriv_tol + || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol + ) && (NNN < MAX_LOOP_SCE) ){ + //go to START_OF_SCE_LOOP; + START_OF_SCE_LOOP = 1 ; } - } - goto end_of_part_1 ; + //goto end_of_part_1 ; + if( START_OF_SCE_LOOP==0 ) end_of_part_1 = 1 ; + } + } /* skip end_of_part_1 */ + } /* End of 2nd SCE_LOOP */ + if( end_of_part_1 == 0 ) { /* skip to end_of_part_1 */ /*-----------------------------------------------------------* * Start point of Psl (= Ps0 + Pds) calculation. (label) @@ -3781,25 +4325,29 @@ start_of_loopl: PS0Z_SCE_dVbs = Ps0z_dVbs ; PS0Z_SCE_dVds = Ps0z_dVds ; PS0Z_SCE_dVgs = Ps0z_dVgs ; -/* + PS0_SCE = PS0Z_SCE - Pzadd ; PS0_SCE_dVbs = Ps0_dVbs ; PS0_SCE_dVds = Ps0_dVds ; PS0_SCE_dVgs = Ps0_dVgs ; -*/ + NNN += 1 ; if( ( fabs(delta_PS0Z_SCE) > PS0_SCE_tol || fabs(delta_PS0Z_SCE_dVbs) > PS0_SCE_deriv_tol || fabs(delta_PS0Z_SCE_dVds) > PS0_SCE_deriv_tol - || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol + || fabs(delta_PS0Z_SCE_dVgs) > PS0_SCE_deriv_tol ) && (NNN < MAX_LOOP_SCE) ){ - goto START_OF_SCE_LOOP; + // goto START_OF_SCE_LOOP; + START_OF_SCE_LOOP = 1 ; } } + } /* skip end_of_part_1 */ +} /* End of 1st SCE_LOOP */ + if ( end_of_part_1 == 0 ) { /* skip to end_of_part_1 */ /*-----------------------------------------------------------* * Evaluate Idd. @@ -4200,41 +4748,25 @@ start_of_mobility: } else { Lch_dVbs = - Lred_dVbs ; Lch_dVds = - Lred_dVds ; Lch_dVgs = - Lred_dVgs ; } - /*-----------------------------------------------------------* - * Modified potential for symmetry. - *-----------------*/ - T1 = ( Vds - Pds ) / 2 ; - Fn_SymAdd( Pzadd , T1 , model->HSM2_pzadd0 , T2 ) ; - T2 /= 2 ; - Pzadd_dVbs = T2 * ( - Pds_dVbs ) ; - Pzadd_dVds = T2 * ( 1.0 - Pds_dVds ) ; - Pzadd_dVgs = T2 * ( - Pds_dVgs ) ; - - if ( Pzadd < epsm10 ) { - Pzadd = epsm10 ; - Pzadd_dVbs = 0.0 ; - Pzadd_dVds = 0.0 ; - Pzadd_dVgs = 0.0 ; - } - - Ps0z = Ps0 + Pzadd ; - Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ; - Ps0z_dVds = Ps0_dVds + Pzadd_dVds ; - Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ; - /*-----------------------------------------------------------* * Muun : universal mobility. (CGS unit) *-----------------*/ - T1 = here->HSM2_ndep_o_esi ; - T2 = here->HSM2_ninv_o_esi ; + T1 = here->HSM2_ndep_o_esi / C_m2cm ; /* fix in version 2.8 */ + T2 = here->HSM2_ninv_o_esi / C_m2cm ; /* fix in version 2.8 */ + + T0 = here->HSM2_ninvd ; + T3 = sqrt(Pds*Pds + model->HSM2_vzadd0) ; + Pdsz = T3 - sqrt(model->HSM2_vzadd0) ; + Pdsz_dVbs = Pds_dVbs * Pds / T3 ; + Pdsz_dVds = Pds_dVds * Pds / T3 ; + Pdsz_dVgs = Pds_dVgs * Pds / T3 ; - T0 = model->HSM2_ninvd ; - T4 = 1.0 + ( Psl - Ps0 ) * T0 ; - T4_dVb = ( Psl_dVbs - Ps0_dVbs ) * T0 ; - T4_dVd = ( Psl_dVds - Ps0_dVds ) * T0 ; - T4_dVg = ( Psl_dVgs - Ps0_dVgs ) * T0 ; + T4 = 1.0 + Pdsz * T0 ; + T4_dVb = Pdsz_dVbs * T0 ; + T4_dVd = Pdsz_dVds * T0 ; + T4_dVg = Pdsz_dVgs * T0 ; T5 = T1 * Qbu + T2 * Qiu ; T5_dVb = T1 * Qbu_dVbs + T2 * Qiu_dVbs ; @@ -4767,8 +5299,11 @@ start_of_mobility: * - This effects for the 2nd and later iterations of bias loop. *-----------------*/ flg_pprv = 1 ; + + } /* skip to end_of_part_1 */ } /*++ End of the bias loop +++++++++++++++++++++++++++++*/ + if ( end_of_part_1 == 0 ) { if ( lp_bs > lp_bs_max ) { lp_bs -- ; } @@ -4789,11 +5324,18 @@ start_of_mobility: } - /*-----------------------------------------------------------* * End of PART-1. (label) *-----------------*/ - end_of_part_1: + } /* skip end_of_part_1 */ +/* end_of_part_1: */ + end_of_part_1 = 0; + + // Qiu for noise calcs + Qiu_noi = Qiu ; + + } // end of Normal mode MOSFET + /*----------------------------------------------------------* * Evaluate integrated chages in unit [C]. @@ -4805,12 +5347,14 @@ start_of_mobility: Qb_dVbs = T1 * Qbu_dVbs ; Qb_dVds = T1 * Qbu_dVds ; Qb_dVgs = T1 * Qbu_dVgs ; - + Qi = T1 * Qiu ; Qi_dVbs = T1 * Qiu_dVbs ; Qi_dVds = T1 * Qiu_dVds ; Qi_dVgs = T1 * Qiu_dVgs ; - + + Qi_noi = T1 * Qiu_noi ; // for noise calc. + Qd = Qi * Qdrat ; Qd_dVbs = Qi_dVbs * Qdrat + Qi * Qdrat_dVbs ; Qd_dVds = Qi_dVds * Qdrat + Qi * Qdrat_dVds ; @@ -4821,6 +5365,27 @@ start_of_mobility: * PART-2: Substrate / gate / leak currents *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + /*-----------------------------------------------------------* + * Modified potential for symmetry. + *-----------------*/ + T1 = ( Vds - Pds ) / 2 ; + Fn_SymAdd( Pzadd , T1 , model->HSM2_pzadd0 , T2 ) ; + T2 /= 2 ; + Pzadd_dVbs = T2 * ( - Pds_dVbs ) ; + Pzadd_dVds = T2 * ( 1.0 - Pds_dVds ) ; + Pzadd_dVgs = T2 * ( - Pds_dVgs ) ; + + if ( Pzadd < epsm10 ) { + Pzadd = epsm10 ; + Pzadd_dVbs = 0.0 ; + Pzadd_dVds = 0.0 ; + Pzadd_dVgs = 0.0 ; + } + + Ps0z = Ps0 + Pzadd ; + Ps0z_dVbs = Ps0_dVbs + Pzadd_dVbs ; + Ps0z_dVds = Ps0_dVds + Pzadd_dVds ; + Ps0z_dVgs = Ps0_dVgs + Pzadd_dVgs ; /*-----------------------------------------------------------* * Isub : substrate current induced by impact ionization. *-----------------*/ @@ -4845,7 +5410,7 @@ start_of_mobility: T3 = T8 / T7 ; T9 = 2.0 / T8 ; - T4 = 1.0e0 + T9 * T7 ; + T4 = T9 * T7 ; /* bugfix in version 2.80 */ T2 = here->HSM2_xvbs ; T5 = T1 - beta_inv - T2 * Vbsz ; @@ -4853,7 +5418,7 @@ start_of_mobility: T5_dVg = T1_dVg ; T5_dVb = T1_dVb - T2 * Vbsz_dVbs; - T6 = T4 * T5 ; + T6 = 1.0 + T4 * T5 ; /* bugfix in version 2.80 */ T6_dVd = T4 * T5_dVd ; T6_dVg = T4 * T5_dVg ; T6_dVb = T4 * T5_dVb ; @@ -5328,7 +5893,7 @@ start_of_mobility: Ec_dVgs =0.0e0 ; } else { T1 = beta_inv / Leff ; - T2 = 1.0 / Qn0 ; + T2 = 1.0 / (Qn0 + 1e-20) ; T3 = T2 * T2 ; Ec = Idd * T1 * T2 ; Ec_dVbs = T1 * (Idd_dVbs * T2 - Idd * Qn0_dVbs * T3 ) ; @@ -5629,17 +6194,17 @@ start_of_mobility: psi_dVxb -= Chi_1_dVxb ; psi += beta*0.1 ; -/* + psi_B = psi; - arg_B = psi*psi/(gamma*T0);*/ + 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_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 * @@ -5867,7 +6432,7 @@ start_of_mobility: 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_dVxb = Ps0LD_dVds * fs02_dPs0 ; fs02_dVgb = Ps0LD_dVgb * fs02_dPs0 ; /*-----------------------------------------------------------* @@ -6212,11 +6777,11 @@ start_of_mobility: /*---------------------------------------------------* * Add Gjmin. *-----------------*/ - Ibd += Gjmin * vbd_jct ; - Ibs += Gjmin * vbs_jct ; + Ibd += Gjmin * vbd_jct ; + Ibs += Gjmin * vbs_jct ; - Gbd += Gjmin ; - Gbs += Gjmin ; + Gbd += Gjmin ; + Gbs += Gjmin ; /*-----------------------------------------------------------* * Charges and Capacitances. @@ -6577,7 +7142,7 @@ start_of_mobility: T1 = Qn0 / C_QE ; T2 = ( Cox + Qn0 / ( Ps0 - Vbs ) + Cit ) * beta_inv / C_QE ; - T3 = -2.0E0 * Qi / C_QE / Lch / here->HSM2_weff_nf - T1 ; + T3 = -2.0E0 * Qi_noi / C_QE / Lch / here->HSM2_weff_nf - T1 ; if ( T3 != T1 ) { T4 = 1.0E0 / ( T1 + T2 ) / ( T3 + T2 ) + 2.0E0 * NFalp * Ey * Mu / ( T3 - T1 ) * log( ( T3 + T2 ) / ( T1 + T2 ) ) + NFalp * Ey * Mu * NFalp * Ey * Mu ; @@ -7387,7 +7952,6 @@ start_of_mobility: here->HSM2_Qi_dVds = M * Qi_dVdse ; here->HSM2_Qi_dVbs = M * Qi_dVbse ; - here->HSM2_alpha = Alpha ; } /*---------------------------------------------------* diff --git a/src/spicelib/devices/hisim2/hsm2eval_dep.h b/src/spicelib/devices/hisim2/hsm2eval_dep.h new file mode 100644 index 000000000..7a1c0a749 --- /dev/null +++ b/src/spicelib/devices/hisim2/hsm2eval_dep.h @@ -0,0 +1,2112 @@ +/*********************************************************************** + + HiSIM (Hiroshima University STARC IGFET Model) + Copyright (C) 2014 Hiroshima University & STARC + + MODEL NAME : HiSIM_HV + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) + Model Parameter 'VERSION' : 2.80 + FILE : hsm2eval_dep.h + + DATE : 2014.5.12 + + released by + Hiroshima University & + Semiconductor Technology Academic Research Center (STARC) +***********************************************************************/ + +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM model. + +-----HISIM Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + +{ // Begin : hsm2eval_dep + +/* define local variavles */ + int depmode ; + double afact, afact2, afact3, bfact, cfact ; + double W_bsub0, W_bsubL, W_s0, W_sL, W_sub0, W_subL, W_b0, W_bL, vthn ; + double phi_s0_DEP = 0.0, phi_sL_DEP = 0.0 , Vbi_DEP ; + double phi_s0_DEP_dVgs, phi_s0_DEP_dVbs, phi_s0_DEP_dVds ; + double phi_sL_DEP_dVgs, phi_sL_DEP_dVbs, phi_sL_DEP_dVds ; + double phi_j0_DEP, phi_jL_DEP, Psbmax, phi_b0_DEP_lim, phi_bL_DEP_lim ; + + + double phi_jL_DEP_dVgs, phi_jL_DEP_dVds, phi_jL_DEP_dVbs ; + + double Vgp0, Vgp1, Vgp0old, phi_j0_DEP_old, phi_jL_DEP_old, phi_b0_DEP_old, phi_bL_DEP_old, phi_s0_DEP_old, phi_sL_DEP_old ; + double phi_j0_DEP_acc, phi_jL_DEP_acc ; + + + double Q_s0, Q_sL = 0.0 ; + double Q_s0_dVgs, Q_sL_dVgs = 0.0, Q_s0_dVds, Q_sL_dVds = 0.0, Q_s0_dVbs, Q_sL_dVbs = 0.0 ; + double Q_sub0, Q_subL, Q_sub0_dVgs, Q_subL_dVgs, Q_sub0_dVds, Q_subL_dVds, Q_sub0_dVbs, Q_subL_dVbs ; + double Qn_res0, Qn_res0_dVgs, Qn_res0_dVds, Qn_res0_dVbs ; + + + double y1, y2, dety ; + double y11, y12 ; + double y21, y22 ; + + double y1_dVgs, y1_dVds, y1_dVbs ; + double y2_dVgs, y2_dVds, y2_dVbs ; + + double rev11 = 0.0, rev12 = 0.0 ; + double rev21 = 0.0, rev22 = 0.0 ; + + double phi_b0_DEP_ini ; + double y0, dydPsm ; + + double W_b0_dVgs, W_b0_dVds, W_b0_dVbs ; + + double W_res0 ; + double W_s0_dVgs, W_s0_dVds, W_s0_dVbs ; + + double phi_b0_DEP, Q_b0_dep, Q_sub0_dep ; + double phi_b0_DEP_dVgs, phi_b0_DEP_dVds, phi_b0_DEP_dVbs ; + double phi_j0_DEP_dVgs, phi_j0_DEP_dVds, phi_j0_DEP_dVbs ; + double Q_b0_dep_dVgs, Q_b0_dep_dVds, Q_b0_dep_dVbs ; + double Q_sub0_dep_dVgs, Q_sub0_dep_dVds, Q_sub0_dep_dVbs ; + + double phi_bL_DEP, Q_bL_dep, Q_subL_dep ; + double phi_bL_DEP_dVgs, phi_bL_DEP_dVds, phi_bL_DEP_dVbs ; + double Q_bL_dep_dVgs, Q_bL_dep_dVds, Q_bL_dep_dVbs ; + double Q_subL_dep_dVgs, Q_subL_dep_dVds, Q_subL_dep_dVbs ; + + double q_Ndepm_esi, Idd_drift,Idd_diffu ; + double Qn_bac0 ; + double Qn_bac0_dVgs, Qn_bac0_dVds, Qn_bac0_dVbs ; + + double Mu_res, Mu_bac ; + double Mu_res_dVgs, Mu_res_dVds, Mu_res_dVbs ; + double Mu_bac_dVgs, Mu_bac_dVds, Mu_bac_dVbs ; + + double Q_n0_cur, Q_nL_cur ; + double Q_n0_cur_dVgs, Q_n0_cur_dVds, Q_n0_cur_dVbs ; + double Q_nL_cur_dVgs, Q_nL_cur_dVds, Q_nL_cur_dVbs ; + + double Q_s0_dep, Q_sL_dep ; + double Q_s0_dep_dVgs, Q_s0_dep_dVds, Q_s0_dep_dVbs ; + double Q_sL_dep_dVgs, Q_sL_dep_dVds, Q_sL_dep_dVbs ; + + double sm_delta ; + double phib_ref, phib_ref_dPs, phib_ref_dPd ; + double Q_s0_dPs, Q_sL_dPs, Q_s0_dPb, Q_sL_dPb ; + double Q_b0_dep_dPb, Q_bL_dep_dPb, Q_b0_dep_dPd, Q_bL_dep_dPd, Q_sub0_dep_dPd, Q_subL_dep_dPd ; + double phi_j0_DEP_dPb, phi_jL_DEP_dPb ; + double NdepmpNsub_inv1, NdepmpNsub ; + + + + double Q_n0, Q_n0_dVgs, Q_n0_dVds, Q_n0_dVbs ; + double Q_nL, Q_nL_dVgs, Q_nL_dVds, Q_nL_dVbs ; + + double phi_s0_DEP_ini, phi_sL_DEP_ini ; + + + double C_QE2, C_ESI2, Tn2 ; + double q_Nsub, Ndepm2, q_Ndepm ; + double C_2ESIpq_Ndepm, C_2ESIpq_Ndepm_inv , C_2ESI_q_Ndepm ; + double C_2ESIpq_Nsub , C_2ESIpq_Nsub_inv ; + double ps_conv3 , ps_conv23 ; + double Ids_res, Ids_bac, Edri ; + double Ids_res_dVgs, Ids_res_dVds, Ids_res_dVbs ; + double Ids_bac_dVgs, Ids_bac_dVds, Ids_bac_dVbs ; + double Edri_dVgs, Edri_dVds, Edri_dVbs ; + + double T0_dVg, T0_dVb,T0_dVd ; + double T1_dVgs, T1_dVds, T1_dVbs ; + double T2_dVgs, T2_dVds, T2_dVbs ; + double T3_dVgs, T3_dVds, T3_dVbs ; + double T4_dVgs, T4_dVds, T4_dVbs ; + double T5_dVgs, T5_dVds, T5_dVbs ; + + + double Vgpp ; + double Vgpp_dVgs, Vgpp_dVds, Vgpp_dVbs ; + double Vdseff0, Vdseff0_dVgs, Vdseff0_dVds, Vdseff0_dVbs ; + double phib_ref_dVgs, phib_ref_dVds, phib_ref_dVbs ; + + double Qn_delta ; + double Qn_drift, Qn_drift_dVgs, Qn_drift_dVds, Qn_drift_dVbs ; + + double Ey_suf, Ey_suf_dVgs, Ey_suf_dVds, Ey_suf_dVbs ; + double Vbsc , Vbsc_dVbse ; + + double DEPQFN1 = 2.0 ; + double DEPQFN3 = 0.3 ; + double DEPQFN_dlt = 2.0 ; + double Ps_delta = 0.06 ; + double Ps_delta0 = 0.08 ; + +/*--------------------------------------* + * CeilingPow with derivatives for delta + *-----------------*/ +#define Fn_SL_CP3( y , x , xmin , delta , pw , dx , dxmin, ddelta) { \ + if(x < xmin + delta && delta >= 0.0) { \ + TMF1 = xmin + delta - x ; \ + Fn_CP2( TMF0 , TMF1 , delta , pw , dx , ddelta ) \ + y = xmin + delta - TMF0 ; \ + dx = dx ; \ + dxmin = 1.0-dx ; \ + ddelta = 1.0-dx-ddelta; \ + } else { \ + y = x ; \ + dx = 1.0 ; \ + dxmin = 0.0 ; \ + ddelta = 0.0 ; \ + } \ +} + + + // Constants + Vbi_DEP = here->HSM2_Vbipn ; + q_Ndepm = C_QE * here->HSM2_ndepm ; + Ndepm2 = here->HSM2_ndepm * here->HSM2_ndepm ; + q_Ndepm_esi = C_QE * here->HSM2_ndepm * C_ESI ; + q_Nsub = C_QE * here->HSM2_nsub ; + C_QE2 = C_QE * C_QE ; + C_ESI2 = C_ESI * C_ESI ; + Tn2 = model->HSM2_tndep * model->HSM2_tndep ; + C_2ESIpq_Ndepm = 2.0 * C_ESI/q_Ndepm ; + C_2ESIpq_Ndepm_inv = q_Ndepm / (2.0 * C_ESI) ; + C_2ESI_q_Ndepm = 2.0 * C_ESI * q_Ndepm ; + C_2ESIpq_Nsub = 2.0 * C_ESI / q_Nsub ; + C_2ESIpq_Nsub_inv = q_Nsub / (2.0 * C_ESI) ; + NdepmpNsub = here->HSM2_ndepm / here->HSM2_nsub ; + NdepmpNsub_inv1 = 1.0 / (1.0 + NdepmpNsub ) ; + ps_conv3 = ps_conv * 1000.0 ; + ps_conv23 = ps_conv2 * 1000.0 ; + here->HSM2_qnsub_esi = q_Ndepm_esi ; + + + //---------------------------------------------------* + // depletion MOS mode + //------------------// + + Vbsc = Vbs ; + Vbsc_dVbse = 1.0 ; + + /*---------------------------------------------------* + * initial potential phi_s0_DEP,phi_b0_DEP,phi_j0_DEP calculated. + *------------------*/ + + Vgp = Vgp + epsm10 * 1.0e7 ; + + + afact = Cox * Cox / here->HSM2_cnst0 / here->HSM2_cnst0 ; + afact2 = afact / here->HSM2_nin / here->HSM2_nin * Ndepm2 ; + W_bsub0 = sqrt(2.0e0 * C_ESI / C_QE * here->HSM2_nsub / (here->HSM2_nsub + + here->HSM2_ndepm) / here->HSM2_ndepm * ( - Vbsc + Vbi_DEP)) ; + + if( W_bsub0 > model->HSM2_tndep ) { + + Vgp0 = 0.0; + + W_b0 = model->HSM2_tndep ; + phi_b0_DEP = 0.0 ; + phi_j0_DEP = phi_b0_DEP - C_2ESIpq_Ndepm_inv * W_b0 * W_b0 ; + phi_b0_DEP_lim = 0.0 ; + + Vgp0old = Vgp0 ; + phi_j0_DEP_old = phi_j0_DEP ; + + for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { + + W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; + Fn_SU_CP( W_b0 , W_b0 , model->HSM2_tndep , 1e-8, 2 , T0 ) + W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbsc + Vbi_DEP) ) ; + + Q_b0_dep = W_b0 * q_Ndepm ; + Q_b0_dep_dPd = - C_ESI / W_b0 * T0 ; + Q_sub0_dep = - W_sub0 * q_Nsub ; + Q_sub0_dep_dPd = - C_ESI / W_sub0 ; + + y1 = Cox * (Vgp0 - phi_b0_DEP) + Q_b0_dep + Q_sub0_dep ; + y11 = Cox ; + y12 = Q_b0_dep_dPd + Q_sub0_dep_dPd ; + + y2 = phi_j0_DEP - NdepmpNsub_inv1 * (NdepmpNsub * phi_b0_DEP + Vbsc - Vbi_DEP) ; + y21 = 0.0 ; + y22 = 1.0 ; + + dety = y11 * y22 - y21 * y12; + rev11 = (y22) / dety ; + rev12 = ( - y12) / dety ; + rev21 = ( - y21) / dety ; + rev22 = (y11) / dety ; + + if( fabs( rev11 * y1 + rev12 * y2 ) > 0.5 ) { + Vgp0 = Vgp0 - 0.5 * Fn_Sgn( rev11 * y1 + rev12 * y2 ) ; + phi_j0_DEP = phi_j0_DEP - 0.5 * Fn_Sgn( rev21 * y1 + rev22 * y2 ) ; + } else { + Vgp0 = Vgp0 - ( rev11 * y1 + rev12 * y2 ) ; + phi_j0_DEP = phi_j0_DEP - ( rev21 * y1 + rev22 * y2 ) ; + } + + if( fabs(Vgp0 - Vgp0old) <= ps_conv && + fabs(phi_j0_DEP - phi_j0_DEP_old) <= ps_conv ) lp_s0=lp_se_max + 1 ; + + Vgp0old = Vgp0 ; + phi_j0_DEP_old = phi_j0_DEP ; + } + phi_j0_DEP_acc = phi_j0_DEP ; + + W_sub0 = model->HSM2_tndep * NdepmpNsub ; + phi_j0_DEP = C_2ESIpq_Nsub_inv * W_sub0 * W_sub0 + Vbsc - Vbi_DEP ; + phi_b0_DEP = phi_j0_DEP + C_2ESIpq_Ndepm_inv * Tn2 ; + phi_s0_DEP = phi_b0_DEP ; + Psbmax = phi_b0_DEP ; + Vgp1 = phi_b0_DEP ; + if( Vgp > Vgp0 ) { + depmode = 1 ; + } else if(Vgp > Vgp1 ) { + depmode = 3 ; + } else { + depmode = 2 ; + } + + } else { + Vgp0 = 0.0 ; + Vgp1 = Vgp0 ; + Psbmax = 0.0 ; + phi_b0_DEP_lim = Vgp0 ; + W_b0 = W_bsub0 ; + W_sub0 = W_b0 * NdepmpNsub ; + phi_j0_DEP = C_2ESIpq_Nsub_inv * W_sub0 * W_sub0 + Vbsc - Vbi_DEP ; + phi_b0_DEP = C_2ESIpq_Ndepm_inv * W_b0 * W_b0 + phi_j0_DEP ; + phi_j0_DEP_acc = phi_j0_DEP ; + if( Vgp > Vgp0 ) { + depmode = 1 ; + } else { + depmode = 2 ; + } + + } + + + T1 = C_2ESI_q_Ndepm * ( Psbmax - ( - here->HSM2_Pb2n + Vbsc)) ; + if ( T1 > 0.0 ) { + vthn = - here->HSM2_Pb2n + Vbsc - sqrt(T1) / Cox ; + } else { + vthn = - here->HSM2_Pb2n + Vbsc ; + } + + /* primary value */ + + if( Vgp > Vgp0 ) { + /* accumulation region */ + phi_j0_DEP = phi_j0_DEP_acc ; + phi_b0_DEP = 0.0 ; + phi_s0_DEP_ini = log(afact * Vgp * Vgp) / (beta + 2.0 / Vgp) + phi_b0_DEP ; + + if( phi_s0_DEP_ini < phi_b0_DEP_lim + ps_conv23 ) phi_s0_DEP_ini = phi_b0_DEP_lim + ps_conv23 ; + + } else if( Vgp > Vgp1 ) { + /* depletion region */ + + phi_s0_DEP_ini = phi_s0_DEP ; + + } else { + /* depletion and inversion region */ + + if( Vgp > vthn ) { + /* depletion */ + bfact = - 2.0 * afact * Vgp + beta ; + cfact = afact * Vgp * Vgp - beta * phi_b0_DEP ; + phi_b0_DEP_old = phi_b0_DEP ; + + phi_s0_DEP_ini = ( - bfact + sqrt(bfact * bfact - 4.0 * afact * cfact)) / 2.0 / afact ; + if( phi_s0_DEP_ini > Psbmax - ps_conv3 ) phi_s0_DEP_ini = Psbmax - ps_conv3 ; + + W_s0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_s0_DEP_ini) ) ; + W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; + + if( W_s0 + W_b0 > model->HSM2_tndep ) { + for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { + + y0 = W_s0 + W_b0 - model->HSM2_tndep ; + + dydPsm = C_ESI / q_Ndepm / W_s0 + + C_ESI / q_Ndepm * ( 1.0 - (here->HSM2_ndepm + / here->HSM2_nsub) / ( 1.0 + (NdepmpNsub))) / W_b0 ; + + if( fabs(y0 / dydPsm) > 0.5 ) { + phi_b0_DEP = phi_b0_DEP - 0.5 * Fn_Sgn(y0 / dydPsm) ; + } else { + phi_b0_DEP = phi_b0_DEP - y0 / dydPsm ; + } + + if( (phi_b0_DEP - Vbsc + Vbi_DEP) < epsm10 ) + phi_b0_DEP=Vbsc - Vbi_DEP + epsm10 ; + + cfact = afact * Vgp * Vgp - beta * phi_b0_DEP ; + T1 = bfact * bfact - 4.0 * afact * cfact ; + if( T1 > 0.0 ) { + phi_s0_DEP_ini = ( - bfact + sqrt(T1)) / 2.0 / afact ; + } else { + phi_s0_DEP_ini = ( - bfact) / 2.0 / afact ; + } + + if( phi_s0_DEP_ini > Psbmax ) phi_s0_DEP_ini = Psbmax ; + if( phi_s0_DEP_ini > phi_b0_DEP ) { + phi_s0_DEP_ini = phi_b0_DEP - ps_conv23 ; + lp_s0=lp_se_max + 1 ; + } + + W_s0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_s0_DEP_ini) ) ; + phi_j0_DEP = ( NdepmpNsub * phi_b0_DEP + + Vbsc - Vbi_DEP) / (1.0 + NdepmpNsub) ; + W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; + + if( fabs(phi_b0_DEP - phi_b0_DEP_old) <= 1.0e-8 ) lp_s0=lp_se_max + 1 ; + phi_b0_DEP_old = phi_b0_DEP ; + } + } + + } else { + afact3 = afact2 / exp(beta * Vbsc) ; + phi_b0_DEP_old = phi_b0_DEP ; + phi_s0_DEP_ini = log(afact3 * Vgp * Vgp) / ( - beta + 2.0 / Vgp) ; + W_s0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_s0_DEP_ini) ) ; + W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; + if( W_s0 + W_b0 > model->HSM2_tndep ) { + for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) { + + y0 = W_s0 + W_b0 - model->HSM2_tndep ; + dydPsm = C_ESI / q_Ndepm / W_s0 + + C_ESI / q_Ndepm * ( 1.0 - (here->HSM2_ndepm / + here->HSM2_nsub) / ( 1.0 + (NdepmpNsub))) / W_b0 ; + + if( fabs(y0 / dydPsm) > 0.5 ) { + phi_b0_DEP = phi_b0_DEP - 0.5 * Fn_Sgn(y0 / dydPsm) ; + } else { + phi_b0_DEP = phi_b0_DEP - y0 / dydPsm ; + } + if( (phi_b0_DEP - Vbsc + Vbi_DEP) < epsm10 ) + phi_b0_DEP=Vbsc - Vbi_DEP + epsm10 ; + + W_s0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_s0_DEP_ini) ) ; + phi_j0_DEP = ( NdepmpNsub * phi_b0_DEP + + Vbsc - Vbi_DEP) / (1.0 + NdepmpNsub) ; + W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; + + if( fabs(phi_b0_DEP - phi_b0_DEP_old) <= 1.0e-5 ) lp_s0=lp_s0_max + 1 ; + phi_b0_DEP_old = phi_b0_DEP ; + } + + } + } // end of phi_b0_DEP loop // + + } + phi_b0_DEP_ini = phi_b0_DEP ; + + /* */ + /* solve poisson at source side */ + /* */ + + sm_delta = 0.12 ; + + flg_conv = 0 ; + + phi_s0_DEP = phi_s0_DEP_ini ; + phi_b0_DEP = phi_b0_DEP_ini ; + + phi_s0_DEP_old = phi_s0_DEP ; + phi_b0_DEP_old = phi_b0_DEP ; + + for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { + + phi_j0_DEP = NdepmpNsub_inv1 * (NdepmpNsub * phi_b0_DEP + Vbsc - Vbi_DEP) ; + phi_j0_DEP_dPb = NdepmpNsub_inv1 * NdepmpNsub ; + + T1 = phi_b0_DEP - phi_j0_DEP ; + Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T7 ) + W_b0 = sqrt(C_2ESIpq_Ndepm * (T2) ) ; + Fn_SU_CP( W_b0 , W_b0 , model->HSM2_tndep, 1e-8, 2 , T8 ) + W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbsc + Vbi_DEP) ) ; + Q_b0_dep = W_b0 * q_Ndepm ; + Q_b0_dep_dPb = C_ESI / W_b0 * T7 * T8 ; + Q_b0_dep_dPd = - C_ESI / W_b0 * T7 * T8 ; + Q_sub0_dep = - W_sub0 * q_Nsub ; + Q_sub0_dep_dPd = - C_ESI / W_sub0 ; + + T10 = 8.0 * q_Ndepm_esi * Tn2 ; + phib_ref = (4.0 * phi_j0_DEP * phi_j0_DEP * C_ESI2 - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP + + 4.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP + + 4.0 * phi_j0_DEP * q_Ndepm_esi * Tn2 + + 4.0 * phi_s0_DEP * q_Ndepm_esi * Tn2 + + Ndepm2 * C_QE2 * Tn2 * Tn2 ) / T10 ; + phib_ref_dPs = ( - 8.0 * phi_j0_DEP * C_ESI2 + 8.0 * C_ESI2 * phi_s0_DEP + + 4.0 * q_Ndepm_esi * Tn2 ) / T10 ; + phib_ref_dPd = ( 8.0 * phi_j0_DEP * C_ESI2 - 8.0 * C_ESI2 * phi_s0_DEP + + 4.0 * q_Ndepm_esi * Tn2 ) / T10 ; + + T1 = beta * (phi_s0_DEP - phi_b0_DEP) ; + T2 = exp(T1) ; + if( phi_s0_DEP >= phi_b0_DEP ) { + Q_s0 = - here->HSM2_cnst0 * sqrt(T2 - 1.0 - T1 + 1e-15) ; + Q_s0_dPs = 0.5 * here->HSM2_cnst0 * here->HSM2_cnst0 / Q_s0 * (beta * T2 - beta ) ; + Q_s0_dPb = - Q_s0_dPs ; + } else { + T3 = exp( - beta * (phi_s0_DEP - Vbsc)) ; + T4 = exp( - beta * (phi_b0_DEP - Vbsc)) ; + Q_s0 = here->HSM2_cnst0 * sqrt(T2 - 1.0 - T1 + 1e-15 + here->HSM2_cnst1 * (T3 - T4) ) ; + T5 = 0.5 * here->HSM2_cnst0 * here->HSM2_cnst0 / Q_s0 ; + Q_s0_dPs = T5 * (beta * T2 - beta + here->HSM2_cnst1 * ( - beta * T3) ) ; + Q_s0_dPb = T5 * ( - beta * T2 + beta + here->HSM2_cnst1 * beta * T4 ) ; + } + + Fn_SU_CP( T1 , phib_ref , phi_b0_DEP_lim , sm_delta, 4 , T9 ) + + y1 = phi_b0_DEP - T1 ; + y11 = - phib_ref_dPs * T9 ; + y12 = 1.0 - phib_ref_dPd * phi_j0_DEP_dPb * T9 ; + + y2 = Cox * (Vgp - phi_s0_DEP) + Q_s0 + Q_b0_dep + Q_sub0_dep ; + y21 = - Cox + Q_s0_dPs ; + y22 = Q_s0_dPb + Q_b0_dep_dPb + Q_b0_dep_dPd * phi_j0_DEP_dPb + Q_sub0_dep_dPd * phi_j0_DEP_dPb ; + + dety = y11 * y22 - y21 * y12; + rev11 = (y22) / dety ; + rev12 = ( - y12) / dety ; + rev21 = ( - y21) / dety ; + rev22 = (y11) / dety ; + if( fabs( rev21 * y1 + rev22 * y2 ) > 0.5 ) { + phi_s0_DEP = phi_s0_DEP - 0.5 * Fn_Sgn( rev11 * y1 + rev12 * y2 ) ; + phi_b0_DEP = phi_b0_DEP - 0.5 * Fn_Sgn( rev21 * y1 + rev22 * y2 ) ; + } else { + phi_s0_DEP = phi_s0_DEP - ( rev11 * y1 + rev12 * y2 ) ; + phi_b0_DEP = phi_b0_DEP - ( rev21 * y1 + rev22 * y2 ) ; + } + + if( fabs(phi_s0_DEP - phi_s0_DEP_old) <= ps_conv && fabs(phi_b0_DEP - phi_b0_DEP_old) <= ps_conv ) { + lp_s0=lp_se_max + 1 ; + flg_conv = 1 ; + } + + phi_s0_DEP_old = phi_s0_DEP ; + phi_b0_DEP_old = phi_b0_DEP ; + + } + + if( flg_conv == 0 ) { + printf( "*** warning(HiSIM(%s)): Went Over Iteration Maximum(Ps0)\n",model->HSM2modName ) ; + printf( " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" ,Vbse , Vdse , Vgse ) ; + } + + /* caluculate derivative */ + + y1_dVgs = 0.0 ; + y1_dVds = 0.0 ; + y1_dVbs = - (8.0 * phi_j0_DEP * C_ESI2 - 8.0 * C_ESI2 * phi_s0_DEP + + 4.0 * q_Ndepm_esi * Tn2) / T10 + * T9 * NdepmpNsub_inv1 * Vbsc_dVbse ; + + Q_b0_dep_dVbs = - C_ESI / W_b0 * T7 * T8 * NdepmpNsub_inv1 * Vbsc_dVbse ; + + Q_sub0_dep_dVbs = - C_ESI / W_sub0 * (NdepmpNsub_inv1 * Vbsc_dVbse - Vbsc_dVbse) ; + + T1 = beta * (phi_s0_DEP - phi_b0_DEP) ; + T2 = exp(T1) ; + if( phi_s0_DEP >= phi_b0_DEP ) { + Q_s0_dVbs = 0.0 ; + } else { + T3 = exp( - beta * (phi_s0_DEP - Vbsc)) ; + T4 = exp( - beta * (phi_b0_DEP - Vbsc)) ; + T5 = sqrt(T2 - 1.0 - T1 + 1e-15 + here->HSM2_cnst1 * (T3 - T4)) ; + Q_s0_dVbs = here->HSM2_cnst0 / 2.0 / T5 * + (here->HSM2_cnst1 * (beta * T3 * Vbsc_dVbse - beta * T4 * Vbsc_dVbse) ) ; + } + + y2_dVgs = Cox_dVg * (Vgp - phi_s0_DEP) + Cox * Vgp_dVgs ; + y2_dVds = Cox_dVd * (Vgp - phi_s0_DEP) + Cox * Vgp_dVds ; + y2_dVbs = Cox_dVb * (Vgp - phi_s0_DEP) + Cox * Vgp_dVbs + Q_s0_dVbs + Q_b0_dep_dVbs + Q_sub0_dep_dVbs ; + + phi_s0_DEP_dVgs = - ( rev11 * y1_dVgs + rev12 * y2_dVgs ) ; + phi_s0_DEP_dVds = - ( rev11 * y1_dVds + rev12 * y2_dVds ) ; + phi_s0_DEP_dVbs = - ( rev11 * y1_dVbs + rev12 * y2_dVbs ) ; + + phi_b0_DEP_dVgs = - ( rev21 * y1_dVgs + rev22 * y2_dVgs ) ; + phi_b0_DEP_dVds = - ( rev21 * y1_dVds + rev22 * y2_dVds ) ; + phi_b0_DEP_dVbs = - ( rev21 * y1_dVbs + rev22 * y2_dVbs ) ; + + if( W_bsub0 > model->HSM2_tndep && depmode !=2 ) { + Fn_SU_CP2(phi_b0_DEP , phi_b0_DEP , phi_s0_DEP , 0.04, 2 , T1, T2 ) // HV_dlt=0.02 + phi_b0_DEP_dVgs = phi_b0_DEP_dVgs * T1 + phi_s0_DEP_dVgs * T2 ; + phi_b0_DEP_dVds = phi_b0_DEP_dVds * T1 + phi_s0_DEP_dVds * T2 ; + phi_b0_DEP_dVbs = phi_b0_DEP_dVbs * T1 + phi_s0_DEP_dVbs * T2 ; + } + + phi_j0_DEP = NdepmpNsub_inv1 * (NdepmpNsub * phi_b0_DEP + Vbsc - Vbi_DEP) ; + phi_j0_DEP_dVgs = NdepmpNsub_inv1 * NdepmpNsub * phi_b0_DEP_dVgs ; + phi_j0_DEP_dVds = NdepmpNsub_inv1 * NdepmpNsub * phi_b0_DEP_dVds ; + phi_j0_DEP_dVbs = NdepmpNsub_inv1 * NdepmpNsub * phi_b0_DEP_dVbs + NdepmpNsub_inv1 * Vbsc_dVbse ; + + phib_ref = (4.0 * phi_j0_DEP * phi_j0_DEP * C_ESI2 - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP + + 4.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP + + 4.0 * phi_j0_DEP * q_Ndepm_esi * Tn2 + + 4.0 * phi_s0_DEP * q_Ndepm_esi * Tn2 + + Ndepm2 * C_QE2 * Tn2 * Tn2 ) / T10 ; + + phib_ref_dVgs = ( 8.0 * phi_j0_DEP * phi_j0_DEP_dVgs * C_ESI2 - 8.0 * phi_j0_DEP_dVgs * C_ESI2 * phi_s0_DEP + - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP_dVgs + 8.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP_dVgs + + 4.0 * phi_j0_DEP_dVgs * q_Ndepm_esi * Tn2 + + 4.0 * phi_s0_DEP_dVgs * q_Ndepm_esi * Tn2 ) / T10 ; + phib_ref_dVds = ( 8.0 * phi_j0_DEP * phi_j0_DEP_dVds * C_ESI2 - 8.0 * phi_j0_DEP_dVds * C_ESI2 * phi_s0_DEP + - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP_dVds + 8.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP_dVds + + 4.0 * phi_j0_DEP_dVds * q_Ndepm_esi * Tn2 + + 4.0 * phi_s0_DEP_dVds * q_Ndepm_esi * Tn2 ) / T10 ; + phib_ref_dVbs = ( 8.0 * phi_j0_DEP * phi_j0_DEP_dVbs * C_ESI2 - 8.0 * phi_j0_DEP_dVbs * C_ESI2 * phi_s0_DEP + - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP_dVbs + 8.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP_dVbs + + 4.0 * phi_j0_DEP_dVbs * q_Ndepm_esi * Tn2 + + 4.0 * phi_s0_DEP_dVbs * q_Ndepm_esi * Tn2 ) / T10 ; + + T1 = beta * (phi_s0_DEP - phi_b0_DEP) ; + T1_dVgs = beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs) ; + T1_dVds = beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds) ; + T1_dVbs = beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs) ; + + T2 = exp(T1) ; + T2_dVgs = T1_dVgs * T2 ; + T2_dVds = T1_dVds * T2 ; + T2_dVbs = T1_dVbs * T2 ; + + if( phi_s0_DEP >= phi_b0_DEP ) { + + T3 = sqrt(T2 - 1.0e0 - T1 + 1e-15 ) ; + T3_dVgs = (T2_dVgs - T1_dVgs) / 2.0 / T3 ; + T3_dVds = (T2_dVds - T1_dVds) / 2.0 / T3 ; + T3_dVbs = (T2_dVbs - T1_dVbs) / 2.0 / T3 ; + + Q_s0 = - here->HSM2_cnst0 * T3 ; + + Q_s0_dep = 0.0 ; + Q_sub0 = 0.0 ; + + W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; + Fn_SU_CP( T9 , W_b0 , model->HSM2_tndep, 5e-8, 2 , T4 ) // HV_dlt=1e-8 + + W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbsc + Vbi_DEP) ) ; + Q_b0_dep = T9 * q_Ndepm ; + Q_sub0_dep = - W_sub0 * q_Nsub ; + + /* derivative */ + Q_s0_dVgs = - here->HSM2_cnst0 * T3_dVgs ; + Q_s0_dVds = - here->HSM2_cnst0 * T3_dVds ; + Q_s0_dVbs = - here->HSM2_cnst0 * T3_dVbs ; + + Q_n0 = Q_s0 ; + Q_n0_dVgs = Q_s0_dVgs ; + Q_n0_dVds = Q_s0_dVds ; + Q_n0_dVbs = Q_s0_dVbs ; + + Q_b0_dep_dVgs = C_ESI / W_b0 * (phi_b0_DEP_dVgs - phi_j0_DEP_dVgs) * T4 ; + Q_b0_dep_dVds = C_ESI / W_b0 * (phi_b0_DEP_dVds - phi_j0_DEP_dVds) * T4 ; + Q_b0_dep_dVbs = C_ESI / W_b0 * (phi_b0_DEP_dVbs - phi_j0_DEP_dVbs) * T4 ; + + Q_sub0_dep_dVgs = - C_ESI / W_sub0 * phi_j0_DEP_dVgs ; + Q_sub0_dep_dVds = - C_ESI / W_sub0 * phi_j0_DEP_dVds ; + Q_sub0_dep_dVbs = - C_ESI / W_sub0 * (phi_j0_DEP_dVbs - Vbsc_dVbse) ; + + Q_sub0_dVgs = 0.0 ; + Q_sub0_dVds = 0.0 ; + Q_sub0_dVbs = 0.0 ; + + Q_s0_dep_dVgs = 0.0 ; + Q_s0_dep_dVds = 0.0 ; + Q_s0_dep_dVbs = 0.0 ; + + } else { + + T3 = exp( - beta * (phi_s0_DEP - Vbsc)) ; + T4 = exp( - beta * (phi_b0_DEP - Vbsc)) ; + T5 = sqrt(T2 - 1.0 - T1 + here->HSM2_cnst1 * (T3 - T4) + 1e-15) ; + Q_s0 = here->HSM2_cnst0 * T5 ; + + T3_dVgs = - beta * T3 * phi_s0_DEP_dVgs ; + T3_dVds = - beta * T3 * phi_s0_DEP_dVds ; + T3_dVbs = - beta * T3 * (phi_s0_DEP_dVbs - Vbsc_dVbse) ; + + T4_dVgs = - beta * T4 * phi_b0_DEP_dVgs ; + T4_dVds = - beta * T4 * phi_b0_DEP_dVds ; + T4_dVbs = - beta * T4 * (phi_b0_DEP_dVbs - Vbsc_dVbse) ; + + T5_dVgs = (T2_dVgs - T1_dVgs + here->HSM2_cnst1 * (T3_dVgs - T4_dVgs)) / 2.0 / T5 ; + T5_dVds = (T2_dVds - T1_dVds + here->HSM2_cnst1 * (T3_dVds - T4_dVds)) / 2.0 / T5 ; + T5_dVbs = (T2_dVbs - T1_dVbs + here->HSM2_cnst1 * (T3_dVbs - T4_dVbs)) / 2.0 / T5 ; + + Q_s0_dVgs = here->HSM2_cnst0 * T5_dVgs ; + Q_s0_dVds = here->HSM2_cnst0 * T5_dVds ; + Q_s0_dVbs = here->HSM2_cnst0 * T5_dVbs ; + + if( W_bsub0 > model->HSM2_tndep && depmode !=2 ) { + Q_sub0 = 0.0 ; + Q_s0_dep = 0.0 ; + + Q_sub0_dVgs = 0.0 ; + Q_sub0_dVds = 0.0 ; + Q_sub0_dVbs = 0.0 ; + + Q_s0_dep_dVgs = 0.0 ; + Q_s0_dep_dVds = 0.0 ; + Q_s0_dep_dVbs = 0.0 ; + } else { + T3 = exp( - beta * (phi_s0_DEP - Vbsc)) ; + T4 = exp( - beta * (phi_b0_DEP - Vbsc)) ; + T5 = sqrt( - T1 + here->HSM2_cnst1 * (T3 - T4)) ; + Q_sub0 = here->HSM2_cnst0 * T5 - here->HSM2_cnst0 * sqrt( - T1) ; + T6 = sqrt(T2 - 1.0e0 - T1 + 1e-15) ; + Q_s0_dep = here->HSM2_cnst0 * T6 ; + + Q_sub0_dVgs = here->HSM2_cnst0 / 2.0 / T5 * ( - beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs) + + here->HSM2_cnst1 * ( - beta * T3 * phi_s0_DEP_dVgs + beta * T4 * phi_b0_DEP_dVgs)) + - here->HSM2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs)) ; + Q_sub0_dVds = here->HSM2_cnst0 / 2.0 / T5 * ( - beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds) + + here->HSM2_cnst1 * ( - beta * T3 * phi_s0_DEP_dVds + beta * T4 * phi_b0_DEP_dVds)) + - here->HSM2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds)) ; + Q_sub0_dVbs = here->HSM2_cnst0 / 2.0 / T5 * ( - beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs) + + here->HSM2_cnst1 * ( - beta * T3 * (phi_s0_DEP_dVbs - Vbsc_dVbse) + beta * T4 * (phi_b0_DEP_dVbs - Vbsc_dVbse))) + - here->HSM2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs)) ; + + Q_s0_dep_dVgs = here->HSM2_cnst0 / 2.0 / T6 * beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs) * (T2 - 1) ; + Q_s0_dep_dVds = here->HSM2_cnst0 / 2.0 / T6 * beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds) * (T2 - 1) ; + Q_s0_dep_dVbs = here->HSM2_cnst0 / 2.0 / T6 * beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs) * (T2 - 1) ; + + } + + Q_n0 = 0.0 ; + Q_n0_dVgs = 0.0 ; + Q_n0_dVds = 0.0 ; + Q_n0_dVbs = 0.0 ; + + + T1 = phi_b0_DEP - phi_j0_DEP ; + Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T0 ) + W_b0 = sqrt(C_2ESIpq_Ndepm * (T2) ) ; + Fn_SU_CP( T9 , W_b0 , model->HSM2_tndep, 5e-8, 2 , T3 ) // HV_dlt=1e-8 + W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbsc + Vbi_DEP) ) ; + Q_b0_dep = T9 * q_Ndepm ; + Q_sub0_dep = - W_sub0 * q_Nsub ; + + Q_b0_dep_dVgs = C_ESI / W_b0 * (phi_b0_DEP_dVgs - phi_j0_DEP_dVgs) * T0 * T3 ; + Q_b0_dep_dVds = C_ESI / W_b0 * (phi_b0_DEP_dVds - phi_j0_DEP_dVds) * T0 * T3 ; + Q_b0_dep_dVbs = C_ESI / W_b0 * (phi_b0_DEP_dVbs - phi_j0_DEP_dVbs) * T0 * T3 ; + + Q_sub0_dep_dVgs = - C_ESI / W_sub0 * phi_j0_DEP_dVgs ; + Q_sub0_dep_dVds = - C_ESI / W_sub0 * phi_j0_DEP_dVds ; + Q_sub0_dep_dVbs = - C_ESI / W_sub0 * (phi_j0_DEP_dVbs - Vbsc_dVbse) ; + + } + + T1 = phi_b0_DEP - phi_j0_DEP ; + Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T0 ) + W_b0 = sqrt(C_2ESIpq_Ndepm * (T2) ) ; + Fn_SU_CP( T9, W_b0, model->HSM2_tndep, 1e-8, 2 , T3 ) + W_b0_dVgs = C_ESI / q_Ndepm / W_b0 * (phi_b0_DEP_dVgs - phi_j0_DEP_dVgs) * T0 * T3 ; + W_b0_dVds = C_ESI / q_Ndepm / W_b0 * (phi_b0_DEP_dVds - phi_j0_DEP_dVds) * T0 * T3 ; + W_b0_dVbs = C_ESI / q_Ndepm / W_b0 * (phi_b0_DEP_dVbs - phi_j0_DEP_dVbs) * T0 * T3 ; + + T1 = phi_b0_DEP - phi_s0_DEP ; + Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T0 ) // HV_dlt=0.05 + W_s0 = sqrt(C_2ESIpq_Ndepm * (T2) ) ; + + W_s0_dVgs = C_ESI / q_Ndepm / W_s0 * (phi_b0_DEP_dVgs - phi_s0_DEP_dVgs) * T0 ; + W_s0_dVds = C_ESI / q_Ndepm / W_s0 * (phi_b0_DEP_dVds - phi_s0_DEP_dVds) * T0 ; + W_s0_dVbs = C_ESI / q_Ndepm / W_s0 * (phi_b0_DEP_dVbs - phi_s0_DEP_dVbs) * T0 ; + + T1 = model->HSM2_tndep - T9 - W_s0 ; + Fn_SL_CP( W_res0 , T1 , 1.0e-20 , 1.0e-14, 2 , T0 ) // HV_dlt=1.0e-25,1.0e-18 + + Qn_res0 = - W_res0 * q_Ndepm ; + Qn_res0_dVgs = (W_s0_dVgs + W_b0_dVgs) * q_Ndepm * T0 ; + Qn_res0_dVds = (W_s0_dVds + W_b0_dVds) * q_Ndepm * T0 ; + Qn_res0_dVbs = (W_s0_dVbs + W_b0_dVbs) * q_Ndepm * T0 ; + + if( W_bsub0 > model->HSM2_tndep && depmode !=2 ) { + Fn_SU_CP(T3 , phi_s0_DEP , phi_b0_DEP_lim , 0.8, 2 , T1 ) + T3_dVgs = phi_s0_DEP_dVgs * T1 ; + T3_dVds = phi_s0_DEP_dVds * T1 ; + T3_dVbs = phi_s0_DEP_dVbs * T1 ; + } else { + Fn_SU_CP(T3 , phib_ref , phi_b0_DEP_lim , 0.8, 2 , T0 ) + T3_dVgs = phib_ref_dVgs * T0 ; + T3_dVds = phib_ref_dVds * T0 ; + T3_dVbs = phib_ref_dVbs * T0 ; + } + + T4 = exp(beta * (T3 - phi_b0_DEP_lim)) ; + T5 = - C_QE * here->HSM2_ndepm ; + Qn_bac0 = T5 * T4 * T9 ; + Qn_bac0_dVgs = T5 * (beta * T4 * T3_dVgs * T9 + T4 * W_b0_dVgs) ; + Qn_bac0_dVds = T5 * (beta * T4 * T3_dVds * T9 + T4 * W_b0_dVds) ; + Qn_bac0_dVbs = T5 * (beta * T4 * T3_dVbs * T9 + T4 * W_b0_dVbs) ; + + + T1 = phi_s0_DEP - phi_b0_DEP_lim ; + Fn_SL_CP( T2 , T1 , 0.0, Ps_delta, 2 , T0 ) + T2_dVgs = phi_s0_DEP_dVgs * T0 ; + T2_dVds = phi_s0_DEP_dVds * T0 ; + T2_dVbs = phi_s0_DEP_dVbs * T0 ; + + T3 = exp(beta * (T2)) ; + T3_dVgs = beta * T3 * T2_dVgs ; + T3_dVds = beta * T3 * T2_dVds ; + T3_dVbs = beta * T3 * T2_dVbs ; + + T4 = T3 - 1.0 - beta * T2 ; + + T4_dVgs = T3_dVgs - beta * T2_dVgs ; + T4_dVds = T3_dVds - beta * T2_dVds ; + T4_dVbs = T3_dVbs - beta * T2_dVbs ; + + T5 = sqrt(T4) ; + Q_n0_cur = - here->HSM2_cnst0 * T5 ; + Q_n0_cur_dVgs = - here->HSM2_cnst0 / 2.0 / T5 * T4_dVgs ; + Q_n0_cur_dVds = - here->HSM2_cnst0 / 2.0 / T5 * T4_dVds ; + Q_n0_cur_dVbs = - here->HSM2_cnst0 / 2.0 / T5 * T4_dVbs ; + + T4 = exp(beta * Ps_delta0) - 1.0 - beta * Ps_delta0 ; + T5 = sqrt(T4) ; + Qn_delta = here->HSM2_cnst0 * T5 ; + + + + /*-----------------------------------------------------------* + * Start point of phi_sL_DEP(= phi_s0_DEP + Pds) calculation.(label) + *-----------------*/ + + /* Vdseff (begin) */ + Vdsorg = Vds ; + + if( Vds > 1e-3 ) { + + T2 = q_Ndepm_esi / ( Cox * Cox ) ; + T4 = - 2.0e0 * T2 / Cox ; + T2_dVb = T4 * Cox_dVb ; + T2_dVd = T4 * Cox_dVd ; + T2_dVg = T4 * Cox_dVg ; + + T0 = Vgp + DEPQFN1 - beta_inv - Vbsz ; + T0_dVg = Vgp_dVgs ; + T0_dVd = Vgp_dVds - Vbsz_dVds ; + T0_dVb = Vgp_dVbs - Vbsz_dVbs ; + + T4 = 1.0e0 + 2.0e0 / T2 * T0 ; + T4_dVg = 2.0 / T2 * T0_dVg - 2.0 / T2 / T2 * T0 * T2_dVg ; + T4_dVd = 2.0 / T2 * T0_dVd - 2.0 / T2 / T2 * T0 * T2_dVd ; + T4_dVb = 2.0 / T2 * T0_dVb - 2.0 / T2 / T2 * T0 * T2_dVb ; + + Fn_SL_CP( T9 , T4 , 0 , DEPQFN_dlt, 2 , T0 ) + T9_dVg = T4_dVg * T0 ; + T9_dVd = T4_dVd * T0 ; + T9_dVb = T4_dVb * T0 ; + + T9 +=small ; + T3 = sqrt( T9 ) ; + T3_dVg = 0.5 / T3 * T9_dVg ; + T3_dVd = 0.5 / T3 * T9_dVd ; + T3_dVb = 0.5 / T3 * T9_dVb ; + + T10 = Vgp + DEPQFN1 + T2 * ( 1.0e0 - T3 ) ; + T10_dVb = Vgp_dVbs + T2_dVb * ( 1.0e0 - T3 ) - T2 * T3_dVb ; + T10_dVd = Vgp_dVds + T2_dVd * ( 1.0e0 - T3 ) - T2 * T3_dVd ; + T10_dVg = Vgp_dVgs + T2_dVg * ( 1.0e0 - T3 ) - T2 * T3_dVg ; + + Fn_SL_CP( T10 , T10 , DEPQFN3, 0.2, 4 , T0 ) +// T10 = T10 + epsm10 ; + T10_dVb *=T0 ; + T10_dVd *=T0 ; + T10_dVg *=T0 ; + + T1 = Vds / T10 ; + T2 = Fn_Pow( T1 , here->HSM2_ddlt - 1.0e0 ) ; + T7 = T2 * T1 ; + T0 = here->HSM2_ddlt * T2 / ( T10 * T10 ) ; + T7_dVb = T0 * ( - Vds * T10_dVb ) ; + T7_dVd = T0 * ( T10 - Vds * T10_dVd ) ; + T7_dVg = T0 * ( - Vds * T10_dVg ) ; + + T3 = 1.0 + T7 ; + T4 = Fn_Pow( T3 , 1.0 / here->HSM2_ddlt - 1.0 ) ; + T6 = T4 * T3 ; + T0 = T4 / here->HSM2_ddlt ; + T6_dVb = T0 * T7_dVb ; + T6_dVd = T0 * T7_dVd ; + T6_dVg = T0 * T7_dVg ; + + Vdseff = Vds / T6 ; + T0 = 1.0 / ( T6 * T6 ) ; + Vdseff0_dVbs = - Vds * T6_dVb * T0 ; + Vdseff0_dVds = ( T6 - Vds * T6_dVd ) * T0 ; + Vdseff0_dVgs = - Vds * T6_dVg * T0 ; + + Fn_SL_CP( Vgpp , Vgp , 0.0 , 0.5, 2 , T0 ) + Vgpp_dVgs = T0 * Vgp_dVgs ; + Vgpp_dVds = T0 * Vgp_dVds ; + Vgpp_dVbs = T0 * Vgp_dVbs ; + + T1 = Vgpp * 0.8 ; + T1_dVg = Vgpp_dVgs * 0.8 ; + T1_dVd = Vgpp_dVds * 0.8 ; + T1_dVb = Vgpp_dVbs * 0.8 ; + + Fn_SU_CP3( Vds , Vdseff , Vgpp , T1, 2 , T3, T4, T5 ) + Vdseff_dVgs = Vdseff0_dVgs * T3 + Vgpp_dVgs * T4 + T1_dVg * T5 ; + Vdseff_dVds = Vdseff0_dVds * T3 + Vgpp_dVds * T4 + T1_dVd * T5 ; + Vdseff_dVbs = Vdseff0_dVbs * T3 + Vgpp_dVbs * T4 + T1_dVb * T5 ; + + } else { + + Vdseff = Vds ; + Vdseff0_dVgs = 0.0 ; + Vdseff0_dVds = 1.0 ; + Vdseff0_dVbs = 0.0 ; + + Vdseff_dVgs = 0.0 ; + Vdseff_dVds = 1.0 ; + Vdseff_dVbs = 0.0 ; + + } + /* Vdseff (end) */ + + /*---------------------------------------------------* + * start of phi_sL_DEP calculation. (label) + *--------------------------------*/ + + if( Vds < 0.0e0 ) { + + phi_sL_DEP = phi_s0_DEP ; + phi_sL_DEP_dVgs = phi_s0_DEP_dVgs ; + phi_sL_DEP_dVds = phi_s0_DEP_dVds ; + phi_sL_DEP_dVbs = phi_s0_DEP_dVbs ; + + phi_bL_DEP = phi_b0_DEP ; + phi_bL_DEP_dVgs = phi_b0_DEP_dVgs ; + phi_bL_DEP_dVds = phi_b0_DEP_dVds ; + phi_bL_DEP_dVbs = phi_b0_DEP_dVbs ; + + phi_jL_DEP = phi_j0_DEP ; + phi_jL_DEP_dVgs = phi_j0_DEP_dVgs ; + phi_jL_DEP_dVds = phi_j0_DEP_dVds ; + phi_jL_DEP_dVbs = phi_j0_DEP_dVbs ; + + Q_subL = Q_sub0 ; + Q_subL_dVgs = Q_sub0_dVgs ; + Q_subL_dVds = Q_sub0_dVds ; + Q_subL_dVbs = Q_sub0_dVbs ; + + Q_nL = Q_n0 ; + Q_nL_dVgs = Q_n0_dVgs ; + Q_nL_dVds = Q_n0_dVds ; + Q_nL_dVbs = Q_n0_dVbs ; + + Q_bL_dep = Q_b0_dep ; + Q_bL_dep_dVgs = Q_b0_dep_dVgs ; + Q_bL_dep_dVds = Q_b0_dep_dVds ; + Q_bL_dep_dVbs = Q_b0_dep_dVbs ; + + Q_subL_dep = Q_sub0_dep ; + Q_subL_dep_dVgs = Q_sub0_dep_dVgs ; + Q_subL_dep_dVds = Q_sub0_dep_dVds ; + Q_subL_dep_dVbs = Q_sub0_dep_dVbs ; + + Q_sL_dep = Q_s0_dep ; + Q_sL_dep_dVgs = Q_s0_dep_dVgs ; + Q_sL_dep_dVds = Q_s0_dep_dVds ; + Q_sL_dep_dVbs = Q_s0_dep_dVbs ; + + Q_nL_cur = Q_n0_cur ; + Q_nL_cur_dVgs = Q_n0_cur_dVgs ; + Q_nL_cur_dVds = Q_n0_cur_dVds ; + Q_nL_cur_dVbs = Q_n0_cur_dVbs ; + + } else { + + W_bsubL = sqrt(C_2ESIpq_Ndepm * here->HSM2_nsub / (here->HSM2_nsub + here->HSM2_ndepm) * (Vds - Vbsc + Vbi_DEP)) ; + + /*---------------------------------------------------* + * region judgement + *------------------*/ + + /* fully depleted case */ + if( W_bsubL > model->HSM2_tndep ) { + + Vgp0 = Vds ; + W_bL = model->HSM2_tndep ; + phi_bL_DEP = Vds ; + phi_bL_DEP_lim = Vds ; + phi_jL_DEP = phi_bL_DEP - C_2ESIpq_Ndepm_inv * W_bL * W_bL ; + + Vgp0old = Vgp0 ; + phi_jL_DEP_old = phi_jL_DEP ; + + Q_bL_dep = W_bL * q_Ndepm ; + + for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { + + W_bL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_jL_DEP) ) ; + Fn_SU_CP( W_bL , W_bL , model->HSM2_tndep , 1e-8, 2 , T0 ) + W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbsc + Vbi_DEP) ) ; + + Q_bL_dep = W_bL * q_Ndepm ; + Q_bL_dep_dPd = - C_ESI / W_bL * T0 ; + Q_subL_dep = - W_subL * q_Nsub ; + Q_subL_dep_dPd = - C_ESI / W_subL ; + + y1 = Cox * (Vgp0 - phi_bL_DEP) + Q_bL_dep + Q_subL_dep ; + y11 = Cox ; + y12 = Q_bL_dep_dPd + Q_subL_dep_dPd ; + + y2 = phi_jL_DEP - NdepmpNsub_inv1 * (NdepmpNsub * phi_bL_DEP + Vbsc - Vbi_DEP) ; + y21 = 0.0 ; + y22 = 1.0 ; + + dety = y11 * y22 - y21 * y12; + rev11 = (y22) / dety ; + rev12 = ( - y12) / dety ; + rev21 = ( - y21) / dety ; + rev22 = (y11) / dety ; + + if( fabs( rev11 * y1 + rev12 * y2 ) > 0.5 ) { + Vgp0 = Vgp0 - 0.5 * Fn_Sgn( rev11 * y1 + rev12 * y2 ) ; + phi_jL_DEP = phi_jL_DEP - 0.5 * Fn_Sgn( rev21 * y1 + rev22 * y2 ) ; + } else { + Vgp0 = Vgp0 - ( rev11 * y1 + rev12 * y2 ) ; + phi_jL_DEP = phi_jL_DEP - ( rev21 * y1 + rev22 * y2 ) ; + } + + if( fabs(Vgp0 - Vgp0old) <= ps_conv && + fabs(phi_jL_DEP - phi_jL_DEP_old) <= ps_conv ) lp_s0=lp_se_max + 1 ; + + Vgp0old = Vgp0 ; + phi_jL_DEP_old = phi_jL_DEP ; + } + phi_jL_DEP_acc = phi_jL_DEP ; + + W_subL = model->HSM2_tndep * NdepmpNsub ; + phi_jL_DEP = C_2ESIpq_Nsub_inv * W_subL * W_subL + Vbsc - Vbi_DEP ; + phi_bL_DEP = phi_jL_DEP + C_2ESIpq_Ndepm_inv * Tn2 ; + phi_sL_DEP = phi_bL_DEP ; + Psbmax = phi_bL_DEP ; + Vgp1 = phi_bL_DEP ; + if( Vgp > Vgp0 ) { + depmode = 1 ; + } else if(Vgp > Vgp1 ) { + depmode = 3 ; + } else { + depmode = 2 ; + } + + /* else */ + } else { + Vgp0 = Vds ; + Vgp1 = Vgp0 ; + Psbmax = Vgp0 ; + phi_bL_DEP_lim = Vgp0 ; + W_bL = W_bsubL ; + W_subL = W_bL * NdepmpNsub ; + phi_jL_DEP = C_2ESIpq_Nsub_inv * W_subL * W_subL + Vbsc - Vbi_DEP ; + phi_bL_DEP = C_2ESIpq_Ndepm_inv * W_bL * W_bL + phi_jL_DEP ; + phi_jL_DEP_acc = phi_jL_DEP ; + if( Vgp > Vgp0 ) { + depmode = 1 ; + } else { + depmode = 2 ; + } + + } + + T1 = C_2ESI_q_Ndepm * ( Psbmax - ( - here->HSM2_Pb2n + Vbsc)) ; + if ( T1 > 0.0 ) { + vthn = - here->HSM2_Pb2n + Vbsc - sqrt(T1) / Cox ; + } else { + vthn = - here->HSM2_Pb2n + Vbsc ; + } + + /*---------------------------------------------------* + * initial potential phi_s0_DEP,phi_bL_DEP,phi_jL_DEP calculated. + *------------------*/ + + + /* accumulation region */ + if( Vgp > Vgp0 ) { + phi_jL_DEP = phi_jL_DEP_acc ; + phi_bL_DEP = Vds ; + phi_sL_DEP_ini = log(afact * Vgp * Vgp) / (beta + 2.0 / Vgp) + Vds ; + + if( phi_sL_DEP_ini < phi_bL_DEP_lim + ps_conv23 ) phi_sL_DEP_ini = phi_bL_DEP_lim + ps_conv23 ; + + /* fully depleted region */ + } else if( Vgp > Vgp1 ) { + + phi_sL_DEP_ini = phi_sL_DEP ; + + /* depletion & inversion */ + + } else { + + /* depletion */ + if( Vgp > vthn ) { + bfact = - 2.0 * afact * Vgp + beta ; + cfact = afact * Vgp * Vgp - beta * phi_bL_DEP ; + phi_bL_DEP_old = phi_bL_DEP ; + phi_sL_DEP_ini = ( - bfact + sqrt(bfact * bfact - 4.0 * afact * cfact)) / 2.0 / afact ; + if( phi_sL_DEP_ini > Psbmax - ps_conv23 ) phi_sL_DEP_ini = Psbmax - ps_conv23 ; + W_sL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_sL_DEP_ini) ) ; + W_bL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_jL_DEP) ) ; + + if( W_sL + W_bL > model->HSM2_tndep ) { + for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { + + y0 = W_sL + W_bL - model->HSM2_tndep ; + + dydPsm = C_ESI / q_Ndepm / W_sL + + C_ESI / q_Ndepm * ( 1.0 - (here->HSM2_ndepm + / here->HSM2_nsub) / ( 1.0 + (NdepmpNsub))) / W_bL ; + + if( fabs(y0 / dydPsm) > 0.5 ) { + phi_bL_DEP = phi_bL_DEP - 0.5 * Fn_Sgn(y0 / dydPsm) ; + } else { + phi_bL_DEP = phi_bL_DEP - y0 / dydPsm ; + } + if( (phi_bL_DEP - Vbsc + Vbi_DEP) < epsm10 ) + phi_bL_DEP=Vbsc - Vbi_DEP + epsm10 ; + + cfact = afact * Vgp * Vgp - beta * phi_bL_DEP ; + T1 = bfact * bfact - 4.0 * afact * cfact ; + if( T1 > 0.0 ) { + phi_sL_DEP_ini = ( - bfact + sqrt(T1)) / 2.0 / afact ; + } else { + phi_sL_DEP_ini = ( - bfact) / 2.0 / afact ; + } + + if( phi_sL_DEP_ini > Psbmax ) phi_sL_DEP_ini = Psbmax ; + if( phi_sL_DEP_ini > phi_bL_DEP ) { + phi_sL_DEP_ini = phi_bL_DEP - ps_conv23 ; + lp_s0=lp_se_max + 1 ; + } + W_sL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_sL_DEP_ini) ) ; + phi_jL_DEP = ( NdepmpNsub * phi_bL_DEP + + Vbsc - Vbi_DEP) / (1.0 + NdepmpNsub) ; + W_bL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_jL_DEP) ) ; + + if( fabs(phi_bL_DEP - phi_bL_DEP_old) <= 1.0e-8 ) lp_s0=lp_se_max + 1 ; + phi_bL_DEP_old = phi_bL_DEP ; + } + } + + /* inversion */ + } else { + + phi_bL_DEP = phi_b0_DEP ; + phi_jL_DEP = phi_j0_DEP ; + phi_sL_DEP_ini = phi_s0_DEP ; + + } + + } + + phi_b0_DEP_ini = phi_bL_DEP ; + /* */ + /* solve poisson at drain side */ + /* */ + + flg_conv = 0 ; + + /* accumulation */ + + phi_sL_DEP = phi_sL_DEP_ini ; + phi_bL_DEP = phi_b0_DEP_ini ; + + phi_sL_DEP_old = phi_sL_DEP ; + phi_bL_DEP_old = phi_bL_DEP ; + + for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { + + phi_jL_DEP = NdepmpNsub_inv1 * (NdepmpNsub * phi_bL_DEP + Vbsc - Vbi_DEP) ; + phi_jL_DEP_dPb = NdepmpNsub_inv1 * NdepmpNsub ; + + T1 = phi_bL_DEP - phi_jL_DEP ; + Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T7 ) + W_bL = sqrt(C_2ESIpq_Ndepm * (T2) ) ; + Fn_SU_CP( W_bL , W_bL , model->HSM2_tndep , 1e-8, 2 , T8 ) + W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbsc + Vbi_DEP) ) ; + Q_bL_dep = W_bL * q_Ndepm ; + Q_bL_dep_dPb = C_ESI / W_bL * T7 * T8 ; + Q_bL_dep_dPd = - C_ESI / W_bL * T7 * T8 ; + Q_subL_dep = - W_subL * q_Nsub ; + Q_subL_dep_dPd = - C_ESI / W_subL ; + + T10 = 8.0 * q_Ndepm_esi * Tn2 ; + phib_ref = (4.0 * phi_jL_DEP * phi_jL_DEP * C_ESI2 - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP + + 4.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP + + 4.0 * phi_jL_DEP * q_Ndepm_esi * Tn2 + + 4.0 * phi_sL_DEP * q_Ndepm_esi * Tn2 + + Ndepm2 * C_QE2 * Tn2 * Tn2 ) / T10 ; + phib_ref_dPs = ( - 8.0 * phi_jL_DEP * C_ESI2 + 8.0 * C_ESI2 * phi_sL_DEP + + 4.0 * q_Ndepm_esi * Tn2 ) / T10 ; + phib_ref_dPd = ( 8.0 * phi_jL_DEP * C_ESI2 - 8.0 * C_ESI2 * phi_sL_DEP + + 4.0 * q_Ndepm_esi * Tn2 ) / T10 ; + + T1 = beta * (phi_sL_DEP - phi_bL_DEP) ; + T2 = exp(T1) ; + if( phi_sL_DEP >= phi_bL_DEP ) { + Q_sL = - here->HSM2_cnst0 * sqrt(T2 - 1.0 - T1 + 1e-15) ; + Q_sL_dPs = 0.5 * here->HSM2_cnst0 * here->HSM2_cnst0 / Q_sL * (beta * T2 - beta) ; + Q_sL_dPb = - Q_sL_dPs ; + } else { + T3 = exp( - beta * (phi_sL_DEP - Vbsc)) ; + T4 = exp( - beta * (phi_bL_DEP - Vbsc)) ; + Q_sL = here->HSM2_cnst0 * sqrt(T2 - 1.0 - T1 + here->HSM2_cnst1 * (T3 - T4) + 1e-15) ; + T5 = 0.5 * here->HSM2_cnst0 * here->HSM2_cnst0 / Q_sL ; + Q_sL_dPs = T5 * (beta * T2 - beta + here->HSM2_cnst1 * ( - beta * T3) ) ; + Q_sL_dPb = T5 * ( - beta * T2 + beta + here->HSM2_cnst1 * beta * T4 ) ; + } + + Fn_SU_CP2( T1 , phib_ref , phi_bL_DEP_lim , sm_delta, 4 , T9, T11 ) + + y1 = phi_bL_DEP - T1 ; + y11 = - phib_ref_dPs * T9 ; + y12 = 1.0 - phib_ref_dPd * phi_jL_DEP_dPb * T9 ; + + y2 = Cox * (Vgp - phi_sL_DEP) + Q_sL + Q_bL_dep + Q_subL_dep ; + y21 = - Cox + Q_sL_dPs ; + y22 = Q_sL_dPb + Q_bL_dep_dPb + Q_bL_dep_dPd * phi_jL_DEP_dPb + Q_subL_dep_dPd * phi_jL_DEP_dPb ; + + dety = y11 * y22 - y21 * y12; + rev11 = (y22) / dety ; + rev12 = ( - y12) / dety ; + rev21 = ( - y21) / dety ; + rev22 = (y11) / dety ; + if( fabs( rev21 * y1 + rev22 * y2 ) > 0.2 ) { // HV_dlt=0.5 + phi_sL_DEP = phi_sL_DEP - 0.2 * Fn_Sgn( rev11 * y1 + rev12 * y2 ) ; + phi_bL_DEP = phi_bL_DEP - 0.2 * Fn_Sgn( rev21 * y1 + rev22 * y2 ) ; + } else { + phi_sL_DEP = phi_sL_DEP - ( rev11 * y1 + rev12 * y2 ) ; + phi_bL_DEP = phi_bL_DEP - ( rev21 * y1 + rev22 * y2 ) ; + } + + if( fabs(phi_sL_DEP - phi_sL_DEP_old) <= ps_conv && fabs(phi_bL_DEP - phi_bL_DEP_old) <= ps_conv ) { + lp_s0=lp_se_max + 1 ; + flg_conv = 1 ; + } + + phi_sL_DEP_old = phi_sL_DEP ; + phi_bL_DEP_old = phi_bL_DEP ; + + } + if( flg_conv == 0 ) { + printf( "*** warning(HiSIM(%s)): Went Over Iteration Maximum(Psl)\n",model->HSM2modName ) ; + printf( " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" ,Vbse , Vdse , Vgse ) ; + } + + /* caluculate derivative */ + + y1_dVgs = - Vdseff_dVgs * T11 ; + y1_dVds = - Vdseff_dVds * T11 ; + y1_dVbs = - (8.0 * phi_jL_DEP * C_ESI2 - 8.0 * C_ESI2 * phi_sL_DEP + + 4.0 * q_Ndepm_esi * Tn2) / T10 + * T9 * NdepmpNsub_inv1 * Vbsc_dVbse - Vdseff_dVbs * T11 ; + + Q_bL_dep_dVbs = - C_ESI / W_bL * T7 * T8 * NdepmpNsub_inv1 * Vbsc_dVbse ; + + Q_subL_dep_dVbs = - C_ESI / W_subL * (NdepmpNsub_inv1 * Vbsc_dVbse - Vbsc_dVbse) ; + + T1 = beta * (phi_sL_DEP - phi_bL_DEP) ; + T2 = exp(T1) ; + if( phi_sL_DEP >= phi_bL_DEP ) { + Q_sL_dVbs = 0.0 ; + } else { + T3 = exp( - beta * (phi_sL_DEP - Vbsc)) ; + T4 = exp( - beta * (phi_bL_DEP - Vbsc)) ; + T5 = sqrt(T2 - 1.0 - T1 + 1e-15 + here->HSM2_cnst1 * (T3 - T4)) ; + Q_sL_dVbs = here->HSM2_cnst0 / 2.0 / T5 * + (here->HSM2_cnst1 * (beta * T3 * Vbsc_dVbse - beta * T4 * Vbsc_dVbse) ) ; + } + + y2_dVgs = Cox_dVg * (Vgp - phi_sL_DEP) + Cox * Vgp_dVgs ; + y2_dVds = Cox_dVd * (Vgp - phi_sL_DEP) + Cox * Vgp_dVds ; + y2_dVbs = Cox_dVb * (Vgp - phi_sL_DEP) + Cox * Vgp_dVbs + Q_sL_dVbs + Q_bL_dep_dVbs + Q_subL_dep_dVbs ; + + phi_sL_DEP_dVgs = - ( rev11 * y1_dVgs + rev12 * y2_dVgs ) ; + phi_sL_DEP_dVds = - ( rev11 * y1_dVds + rev12 * y2_dVds ) ; + phi_sL_DEP_dVbs = - ( rev11 * y1_dVbs + rev12 * y2_dVbs ) ; + + phi_bL_DEP_dVgs = - ( rev21 * y1_dVgs + rev22 * y2_dVgs ) ; + phi_bL_DEP_dVds = - ( rev21 * y1_dVds + rev22 * y2_dVds ) ; + phi_bL_DEP_dVbs = - ( rev21 * y1_dVbs + rev22 * y2_dVbs ) ; + + if( W_bsubL > model->HSM2_tndep && depmode !=2 ) { + Fn_SU_CP2(phi_bL_DEP , phi_bL_DEP , phi_sL_DEP , 0.04, 2 , T1, T2 ) // HV_dlt=0.02 + phi_bL_DEP_dVgs = phi_bL_DEP_dVgs * T1 + phi_sL_DEP_dVgs * T2 ; + phi_bL_DEP_dVds = phi_bL_DEP_dVds * T1 + phi_sL_DEP_dVds * T2 ; + phi_bL_DEP_dVbs = phi_bL_DEP_dVbs * T1 + phi_sL_DEP_dVbs * T2 ; + } + + phi_jL_DEP = NdepmpNsub_inv1 * (NdepmpNsub * phi_bL_DEP + Vbsc - Vbi_DEP) ; + phi_jL_DEP_dVgs = NdepmpNsub_inv1 * NdepmpNsub * phi_bL_DEP_dVgs ; + phi_jL_DEP_dVds = NdepmpNsub_inv1 * NdepmpNsub * phi_bL_DEP_dVds ; + phi_jL_DEP_dVbs = NdepmpNsub_inv1 * NdepmpNsub * phi_bL_DEP_dVbs + NdepmpNsub_inv1 * Vbsc_dVbse ; + + phib_ref = (4.0 * phi_jL_DEP * phi_jL_DEP * C_ESI2 - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP + + 4.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP + + 4.0 * phi_jL_DEP * q_Ndepm_esi * Tn2 + + 4.0 * phi_sL_DEP * q_Ndepm_esi * Tn2 + + Ndepm2 * C_QE2 * Tn2 * Tn2 ) / T10 ; + + phib_ref_dVgs = ( 8.0 * phi_jL_DEP * phi_jL_DEP_dVgs * C_ESI2 - 8.0 * phi_jL_DEP_dVgs * C_ESI2 * phi_sL_DEP + - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP_dVgs + 8.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP_dVgs + + 4.0 * phi_jL_DEP_dVgs * q_Ndepm_esi * Tn2 + + 4.0 * phi_sL_DEP_dVgs * q_Ndepm_esi * Tn2 ) / T10 ; + phib_ref_dVds = ( 8.0 * phi_jL_DEP * phi_jL_DEP_dVds * C_ESI2 - 8.0 * phi_jL_DEP_dVds * C_ESI2 * phi_sL_DEP + - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP_dVds + 8.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP_dVds + + 4.0 * phi_jL_DEP_dVds * q_Ndepm_esi * Tn2 + + 4.0 * phi_sL_DEP_dVds * q_Ndepm_esi * Tn2 ) / T10 ; + phib_ref_dVbs = ( 8.0 * phi_jL_DEP * phi_jL_DEP_dVbs * C_ESI2 - 8.0 * phi_jL_DEP_dVbs * C_ESI2 * phi_sL_DEP + - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP_dVbs + 8.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP_dVbs + + 4.0 * phi_jL_DEP_dVbs * q_Ndepm_esi * Tn2 + + 4.0 * phi_sL_DEP_dVbs * q_Ndepm_esi * Tn2 ) / T10 ; + + T1 = beta * (phi_sL_DEP - phi_bL_DEP) ; + T1_dVgs = beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs) ; + T1_dVds = beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds) ; + T1_dVbs = beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs) ; + + T2 = exp(T1) ; + T2_dVgs = T1_dVgs * T2 ; + T2_dVds = T1_dVds * T2 ; + T2_dVbs = T1_dVbs * T2 ; + + if( phi_sL_DEP >= phi_bL_DEP ) { + T3 = sqrt(T2 - 1.0e0 - T1 + 1e-15 ) ; + T3_dVgs = (T2_dVgs - T1_dVgs) / 2.0 / T3 ; + T3_dVds = (T2_dVds - T1_dVds) / 2.0 / T3 ; + T3_dVbs = (T2_dVbs - T1_dVbs) / 2.0 / T3 ; + + Q_sL = - here->HSM2_cnst0 * T3 ; + + Q_sL_dep = 0.0 ; + Q_subL = 0.0 ; + + W_bL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_jL_DEP) ) ; + Fn_SU_CP( T9 , W_bL , model->HSM2_tndep, 1e-8, 2 , T4 ) + + W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbsc + Vbi_DEP) ) ; + Q_bL_dep = T9 * q_Ndepm ; + Q_subL_dep = - W_subL * q_Nsub ; + + /* derivative */ + Q_sL_dVgs = - here->HSM2_cnst0 * T3_dVgs ; + Q_sL_dVds = - here->HSM2_cnst0 * T3_dVds ; + Q_sL_dVbs = - here->HSM2_cnst0 * T3_dVbs ; + + Q_nL = Q_sL ; + Q_nL_dVgs = Q_sL_dVgs ; + Q_nL_dVds = Q_sL_dVds ; + Q_nL_dVbs = Q_sL_dVbs ; + + Q_bL_dep_dVgs = C_ESI / W_bL * (phi_bL_DEP_dVgs - phi_jL_DEP_dVgs) * T4 ; + Q_bL_dep_dVds = C_ESI / W_bL * (phi_bL_DEP_dVds - phi_jL_DEP_dVds) * T4 ; + Q_bL_dep_dVbs = C_ESI / W_bL * (phi_bL_DEP_dVbs - phi_jL_DEP_dVbs) * T4 ; + + Q_subL_dep_dVgs = - C_ESI / W_subL * phi_jL_DEP_dVgs ; + Q_subL_dep_dVds = - C_ESI / W_subL * phi_jL_DEP_dVds ; + Q_subL_dep_dVbs = - C_ESI / W_subL * (phi_jL_DEP_dVbs - Vbsc_dVbse) ; + + Q_subL_dVgs = 0.0 ; + Q_subL_dVds = 0.0 ; + Q_subL_dVbs = 0.0 ; + + Q_sL_dep_dVgs = 0.0 ; + Q_sL_dep_dVds = 0.0 ; + Q_sL_dep_dVbs = 0.0 ; + + } else { + + T3 = exp( - beta * (phi_sL_DEP - Vbsc)) ; + T4 = exp( - beta * (phi_bL_DEP - Vbsc)) ; + T5 = sqrt(T2 - 1.0 - T1 + here->HSM2_cnst1 * (T3 - T4) + 1e-15) ; + Q_sL = here->HSM2_cnst0 * T5 ; + + T3_dVgs = - beta * T3 * phi_sL_DEP_dVgs ; + T3_dVds = - beta * T3 * phi_sL_DEP_dVds ; + T3_dVbs = - beta * T3 * (phi_sL_DEP_dVbs - Vbsc_dVbse) ; + + T4_dVgs = - beta * T4 * phi_bL_DEP_dVgs ; + T4_dVds = - beta * T4 * phi_bL_DEP_dVds ; + T4_dVbs = - beta * T4 * (phi_bL_DEP_dVbs - Vbsc_dVbse) ; + + T5_dVgs = (T2_dVgs - T1_dVgs + here->HSM2_cnst1 * (T3_dVgs - T4_dVgs)) / 2.0 / T5 ; + T5_dVds = (T2_dVds - T1_dVds + here->HSM2_cnst1 * (T3_dVds - T4_dVds)) / 2.0 / T5 ; + T5_dVbs = (T2_dVbs - T1_dVbs + here->HSM2_cnst1 * (T3_dVbs - T4_dVbs)) / 2.0 / T5 ; + + Q_sL_dVgs = here->HSM2_cnst0 * T5_dVgs ; + Q_sL_dVds = here->HSM2_cnst0 * T5_dVds ; + Q_sL_dVbs = here->HSM2_cnst0 * T5_dVbs ; + + if( W_bsubL > model->HSM2_tndep && depmode !=2 ) { + Q_subL = 0.0 ; + Q_sL_dep = 0.0 ; + + Q_subL_dVgs = 0.0 ; + Q_subL_dVds = 0.0 ; + Q_subL_dVbs = 0.0 ; + + Q_sL_dep_dVgs = 0.0 ; + Q_sL_dep_dVds = 0.0 ; + Q_sL_dep_dVbs = 0.0 ; + + } else { + T3 = exp( - beta * (phi_sL_DEP - Vbsc)) ; + T4 = exp( - beta * (phi_bL_DEP - Vbsc)) ; + T5 = sqrt( - T1 + here->HSM2_cnst1 * (T3 - T4)) ; + Q_subL = here->HSM2_cnst0 * T5 - here->HSM2_cnst0 * sqrt( - T1) ; + T6 = sqrt(T2 - 1.0e0 - T1 + 1e-15) ; + Q_sL_dep = here->HSM2_cnst0 * T6 ; + + Q_subL_dVgs = here->HSM2_cnst0 / 2.0 / T5 * ( - beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs) + + here->HSM2_cnst1 * ( - beta * T3 * phi_sL_DEP_dVgs + beta * T4 * phi_bL_DEP_dVgs)) + - here->HSM2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs)) ; + Q_subL_dVds = here->HSM2_cnst0 / 2.0 / T5 * ( - beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds) + + here->HSM2_cnst1 * ( - beta * T3 * phi_sL_DEP_dVds + beta * T4 * phi_bL_DEP_dVds)) + - here->HSM2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds)) ; + Q_subL_dVbs = here->HSM2_cnst0 / 2.0 / T5 * ( - beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs) + + here->HSM2_cnst1 * ( - beta * T3 * (phi_sL_DEP_dVbs - Vbsc_dVbse) + beta * T4 * (phi_bL_DEP_dVbs - Vbsc_dVbse))) + - here->HSM2_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs)) ; + + Q_sL_dep_dVgs = here->HSM2_cnst0 / 2.0 / T6 * beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs) * (T2 - 1) ; + Q_sL_dep_dVds = here->HSM2_cnst0 / 2.0 / T6 * beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds) * (T2 - 1) ; + Q_sL_dep_dVbs = here->HSM2_cnst0 / 2.0 / T6 * beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs) * (T2 - 1) ; + + } + + Q_nL = 0.0 ; + Q_nL_dVgs = 0.0 ; + Q_nL_dVds = 0.0 ; + Q_nL_dVbs = 0.0 ; + +/// Qg = Cox * (Vgp - phi_sL_DEP) ; + + T1 = phi_bL_DEP - phi_jL_DEP ; + Fn_SL_CP( T2 , T1 , 0.0 , 0.1, 2 , T0 ) + W_bL = sqrt(C_2ESIpq_Ndepm * (T2) ) ; + Fn_SU_CP( T9 , W_bL , model->HSM2_tndep, 1e-8, 2 , T3 ) + W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbsc + Vbi_DEP) ) ; + Q_bL_dep = T9 * q_Ndepm ; + Q_subL_dep = - W_subL * q_Nsub ; + + Q_bL_dep_dVgs = C_ESI / W_bL * (phi_bL_DEP_dVgs - phi_jL_DEP_dVgs) * T0 * T3 ; + Q_bL_dep_dVds = C_ESI / W_bL * (phi_bL_DEP_dVds - phi_jL_DEP_dVds) * T0 * T3 ; + Q_bL_dep_dVbs = C_ESI / W_bL * (phi_bL_DEP_dVbs - phi_jL_DEP_dVbs) * T0 * T3 ; + + Q_subL_dep_dVgs = - C_ESI / W_subL * phi_jL_DEP_dVgs ; + Q_subL_dep_dVds = - C_ESI / W_subL * phi_jL_DEP_dVds ; + Q_subL_dep_dVbs = - C_ESI / W_subL * (phi_jL_DEP_dVbs - Vbsc_dVbse) ; + + } + + + T1 = phi_sL_DEP - phi_bL_DEP_lim ; + Fn_SL_CP( T2 , T1 , 0.0, Ps_delta, 2 , T0 ) + T2_dVgs = (phi_sL_DEP_dVgs - Vdseff_dVgs) * T0 ; + T2_dVds = (phi_sL_DEP_dVds - Vdseff_dVds) * T0 ; + T2_dVbs = (phi_sL_DEP_dVbs - Vdseff_dVbs) * T0 ; + + T3 = exp(beta * (T2)) ; + T3_dVgs = beta * T3 * T2_dVgs ; + T3_dVds = beta * T3 * T2_dVds ; + T3_dVbs = beta * T3 * T2_dVbs ; + + T4 = T3 - 1.0 - beta * T2 ; + + T4_dVgs = T3_dVgs - beta * T2_dVgs ; + T4_dVds = T3_dVds - beta * T2_dVds ; + T4_dVbs = T3_dVbs - beta * T2_dVbs ; + + T5 = sqrt(T4) ; + Q_nL_cur = - here->HSM2_cnst0 * T5 ; + Q_nL_cur_dVgs = - here->HSM2_cnst0 / 2.0 / T5 * T4_dVgs ; + Q_nL_cur_dVds = - here->HSM2_cnst0 / 2.0 / T5 * T4_dVds ; + Q_nL_cur_dVbs = - here->HSM2_cnst0 / 2.0 / T5 * T4_dVbs ; + + } + + /*---------------------------------------------------* + * Assign Pds. + *-----------------*/ + Ps0 = phi_s0_DEP ; + Psl = phi_sL_DEP ; + Pds = phi_sL_DEP - phi_s0_DEP + epsm10 ; + + Pds_dVgs = phi_sL_DEP_dVgs - phi_s0_DEP_dVgs ; + Pds_dVds = phi_sL_DEP_dVds - phi_s0_DEP_dVds ; + Pds_dVbs = phi_sL_DEP_dVbs - phi_s0_DEP_dVbs ; + + if( Pds < 0.0 ) { // take care of numerical noise // + Pds = 0.0 ; + Pds_dVgs = 0.0 ; + Pds_dVds = 0.0 ; + Pds_dVbs = 0.0 ; + + phi_sL_DEP = phi_s0_DEP ; + phi_sL_DEP_dVgs = phi_s0_DEP_dVgs ; + phi_sL_DEP_dVds = phi_s0_DEP_dVds ; + phi_sL_DEP_dVbs = phi_s0_DEP_dVbs ; + + Idd = 0.0 ; + Idd_dVgs = 0.0 ; + Idd_dVds = 0.0 ; + Idd_dVbs = 0.0 ; + + } else { + + T1 = - (Q_s0 + Q_sL) ; + T1_dVgs = - (Q_s0_dVgs + Q_sL_dVgs) ; + T1_dVds = - (Q_s0_dVds + Q_sL_dVds) ; + T1_dVbs = - (Q_s0_dVbs + Q_sL_dVbs) ; + + Fn_SL_CP3( Qn_drift , T1 , 0.0, Qn_delta , 2 , T3, T4, T5 ) + Qn_drift_dVgs = T1_dVgs * T3 ; + Qn_drift_dVds = T1_dVds * T3 ; + Qn_drift_dVbs = T1_dVbs * T3 ; + + Idd_drift = beta * Qn_drift / 2.0 * Pds ; + Idd_diffu = - ( - Q_nL_cur + Q_n0_cur); + + Idd = Idd_drift + Idd_diffu ; + Idd_dVgs = beta * Qn_drift_dVgs / 2.0 * Pds + beta * Qn_drift / 2.0 * Pds_dVgs + - ( - Q_nL_cur_dVgs + Q_n0_cur_dVgs ) ; + Idd_dVds = beta * Qn_drift_dVds / 2.0 * Pds + beta * Qn_drift / 2.0 * Pds_dVds + - ( - Q_nL_cur_dVds + Q_n0_cur_dVds ) ; + Idd_dVbs = beta * Qn_drift_dVbs / 2.0 * Pds + beta * Qn_drift / 2.0 * Pds_dVbs + - ( - Q_nL_cur_dVbs + Q_n0_cur_dVbs ) ; + + } + + + Qiu = - Q_n0_cur ; + Qiu_dVgs = - Q_n0_cur_dVgs ; + Qiu_dVds = - Q_n0_cur_dVds ; + Qiu_dVbs = - Q_n0_cur_dVbs ; + + Lch = Leff ; + + /*-----------------------------------------------------------* + * Muun : universal mobility. (CGS unit) + *-----------------*/ + + T2 = here->HSM2_ninv_o_esi / C_m2cm ; + + T0 = here->HSM2_ninvd ; + T3 = sqrt(Pds*Pds + model->HSM2_vzadd0) ; + Pdsz = T3 - sqrt(model->HSM2_vzadd0) ; + Pdsz_dVbs = Pds_dVbs * Pds / T3 ; + Pdsz_dVds = Pds_dVds * Pds / T3 ; + Pdsz_dVgs = Pds_dVgs * Pds / T3 ; + + T4 = 1.0 + ( Pdsz ) * T0 ; + T4_dVb = ( Pdsz_dVbs ) * T0 ; + T4_dVd = ( Pdsz_dVds ) * T0 ; + T4_dVg = ( Pdsz_dVgs ) * T0 ; + + T5 = T2 * Qiu ; + T5_dVb = T2 * Qiu_dVbs ; + T5_dVd = T2 * Qiu_dVds ; + T5_dVg = T2 * Qiu_dVgs ; + + T3 = T5 / T4 ; + T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ; + T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ; + T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ; + + Eeff = T3 ; + Eeff_dVbs = T3_dVb ; + Eeff_dVds = T3_dVd ; + Eeff_dVgs = T3_dVg ; + + T5 = Fn_Pow( Eeff , model->HSM2_mueph0 - 1.0e0 ) ; + T8 = T5 * Eeff ; + T7 = Fn_Pow( Eeff , here->HSM2_muesr - 1.0e0 ) ; + T6 = T7 * Eeff ; + + T9 = C_QE * C_m2cm_p2 ; + Rns = Qiu / T9 ; + + T1 = 1.0e0 / ( here->HSM2_muecb0 + here->HSM2_muecb1 * Rns / 1.0e11 ) + + here->HSM2_mphn0 * T8 + T6 / pParam->HSM2_muesr1 ; + + Muun = 1.0e0 / T1 ; + + T1 = 1.0e0 / ( T1 * T1 ) ; + T2 = here->HSM2_muecb0 + here->HSM2_muecb1 * Rns / 1.0e11 ; + T2 = 1.0e0 / ( T2 * T2 ) ; + /* here->HSM2_mphn1 = here->HSM2_mphn0 * model->HSM2_mueph0 */ + T3 = here->HSM2_mphn1 * T5 ; + T4 = here->HSM2_muesr * T7 / pParam->HSM2_muesr1 ; + T5 = - 1.0e-11 * here->HSM2_muecb1 / C_QE * T2 / C_m2cm_p2 ; + Muun_dVbs = - ( T5 * Qiu_dVbs + + Eeff_dVbs * T3 + Eeff_dVbs * T4 ) * T1 ; + Muun_dVds = - ( T5 * Qiu_dVds + + Eeff_dVds * T3 + Eeff_dVds * T4 ) * T1 ; + Muun_dVgs = - ( T5 * Qiu_dVgs + + Eeff_dVgs * T3 + Eeff_dVgs * T4 ) * T1 ; + + /* Change to MKS unit */ + Muun /=C_m2cm_p2 ; + Muun_dVbs /=C_m2cm_p2 ; + Muun_dVds /=C_m2cm_p2 ; + Muun_dVgs /=C_m2cm_p2 ; + + /*-----------------------------------------------------------* + * Mu : mobility + *-----------------*/ + T2 = beta * (Qiu + small) * Lch ; + + T1 = 1.0e0 / T2 ; + T3 = T1 * T1 ; + T4 = - beta * T3 ; + T5 = T4 * Lch ; + T6 = T4 * (Qiu + small) ; + T1_dVb = ( T5 * Qiu_dVbs ) ; + T1_dVd = ( T5 * Qiu_dVds ) ; + T1_dVg = ( T5 * Qiu_dVgs ) ; + + TY = Idd * T1 ; + TY_dVbs = Idd_dVbs * T1 + Idd * T1_dVb ; + TY_dVds = Idd_dVds * T1 + Idd * T1_dVd ; + TY_dVgs = Idd_dVgs * T1 + Idd * T1_dVg ; + + T2 = 0.2 * Vmax / Muun ; + T3 = - T2 / Muun ; + T2_dVb = T3 * Muun_dVbs ; + T2_dVd = T3 * Muun_dVds ; + T2_dVg = T3 * Muun_dVgs ; + + Ey = sqrt( TY * TY + T2 * T2 ) ; + T4 = 1.0 / Ey ; + Ey_dVbs = T4 * ( TY * TY_dVbs + T2 * T2_dVb ) ; + Ey_dVds = T4 * ( TY * TY_dVds + T2 * T2_dVd ) ; + Ey_dVgs = T4 * ( TY * TY_dVgs + T2 * T2_dVg ) ; + + Em = Muun * Ey ; + Em_dVbs = Muun_dVbs * Ey + Muun * Ey_dVbs ; + Em_dVds = Muun_dVds * Ey + Muun * Ey_dVds ; + Em_dVgs = Muun_dVgs * Ey + Muun * Ey_dVgs ; + + T1 = Em / Vmax ; + + Ey_suf = Ey ; + Ey_suf_dVgs = Ey_dVgs ; + Ey_suf_dVds = Ey_dVds ; + Ey_suf_dVbs = Ey_dVbs ; + + /* note: model->HSM2_bb = 2 (electron) ;1 (hole) */ + if ( 1.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 1.0e0 + epsm10 ) { + T3 = 1.0e0 ; + } else if ( 2.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 2.0e0 + epsm10 ) { + T3 = T1 ; + } else { + T3 = Fn_Pow( T1 , model->HSM2_bb - 1.0e0 ) ; + } + T2 = T1 * T3 ; + T4 = 1.0e0 + T2 ; + + if ( 1.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 1.0e0 + epsm10 ) { + T5 = 1.0 / T4 ; + T6 = T5 / T4 ; + } else if ( 2.0e0 - epsm10 <= model->HSM2_bb && model->HSM2_bb <= 2.0e0 + epsm10 ) { + T5 = 1.0 / sqrt( T4 ) ; + T6 = T5 / T4 ; + } else { + T6 = Fn_Pow( T4 , ( - 1.0e0 / model->HSM2_bb - 1.0e0 ) ) ; + T5 = T4 * T6 ; + } + + T7 = Muun / Vmax * T6 * T3 ; + + Mu = Muun * T5 ; + + Mu_dVbs = Muun_dVbs * T5 - T7 * Em_dVbs ; + Mu_dVds = Muun_dVds * T5 - T7 * Em_dVds ; + Mu_dVgs = Muun_dVgs * T5 - T7 * Em_dVgs ; + + //-----------------------------------------------------------* + //* resistor region current. (CGS unit) + //*-----------------// + + if( Vdsorg > 1e-3 ) { + + T2 = q_Ndepm_esi / ( Cox * Cox ) ; + T4 = - 2.0e0 * T2 / Cox ; + T2_dVb = T4 * Cox_dVb ; + T2_dVd = T4 * Cox_dVd ; + T2_dVg = T4 * Cox_dVg ; + + T0 = Vgp + here->HSM2_depvdsef1 - beta_inv - Vbsz ; + T0_dVg = Vgp_dVgs ; + T0_dVd = Vgp_dVds - Vbsz_dVds ; + T0_dVb = Vgp_dVbs - Vbsz_dVbs ; + + T4 = 1.0e0 + 2.0e0 / T2 * T0 ; + T4_dVg = 2.0 / T2 * T0_dVg - 2.0 / T2 / T2 * T0 * T2_dVg ; + T4_dVd = 2.0 / T2 * T0_dVd - 2.0 / T2 / T2 * T0 * T2_dVd ; + T4_dVb = 2.0 / T2 * T0_dVb - 2.0 / T2 / T2 * T0 * T2_dVb ; + + Fn_SL_CP( T9 , T4 , 0 , DEPQFN_dlt, 2 , T0 ) + T9_dVg = T4_dVg * T0 ; + T9_dVd = T4_dVd * T0 ; + T9_dVb = T4_dVb * T0 ; + + T9 = T9 + small ; + T3 = sqrt( T9 ) ; + T3_dVg = 0.5 / T3 * T9_dVg ; + T3_dVd = 0.5 / T3 * T9_dVd ; + T3_dVb = 0.5 / T3 * T9_dVb ; + + T10 = Vgp + here->HSM2_depvdsef1 + T2 * ( 1.0e0 - T3 ) ; + T10 = T10 * here->HSM2_depvdsef2 ; + T10_dVb = (Vgp_dVbs + T2_dVb * ( 1.0e0 - T3 ) - T2 * T3_dVb) + * here->HSM2_depvdsef2 ; + T10_dVd = (Vgp_dVds + T2_dVd * ( 1.0e0 - T3 ) - T2 * T3_dVd) + * here->HSM2_depvdsef2 ; + T10_dVg = (Vgp_dVgs + T2_dVg * ( 1.0e0 - T3 ) - T2 * T3_dVg) + * here->HSM2_depvdsef2 ; + + Fn_SL_CP( T10 , T10 , here->HSM2_depleak, 1.0, 4 , T0 ) + T10 = T10 + epsm10 ; + T10_dVb *=T0 ; + T10_dVd *=T0 ; + T10_dVg *=T0 ; + + T1 = Vdsorg / T10 ; + T2 = Fn_Pow( T1 , here->HSM2_ddlt - 1.0e0 ) ; + T7 = T2 * T1 ; + T0 = here->HSM2_ddlt * T2 / ( T10 * T10 ) ; + T7_dVb = T0 * ( - Vdsorg * T10_dVb ) ; + T7_dVd = T0 * ( T10 - Vdsorg * T10_dVd ) ; + T7_dVg = T0 * ( - Vdsorg * T10_dVg ) ; + + T3 = 1.0 + T7 ; + T4 = Fn_Pow( T3 , 1.0 / here->HSM2_ddlt - 1.0 ) ; + T6 = T4 * T3 ; + T0 = T4 / here->HSM2_ddlt ; + T6_dVb = T0 * T7_dVb ; + T6_dVd = T0 * T7_dVd ; + T6_dVg = T0 * T7_dVg ; + + Vdseff0 = Vdsorg / T6 ; + T0 = 1.0 / ( T6 * T6 ) ; + Vdseff0_dVbs = - Vdsorg * T6_dVb * T0 ; + Vdseff0_dVds = ( T6 - Vdsorg * T6_dVd ) * T0 ; + Vdseff0_dVgs = - Vdsorg * T6_dVg * T0 ; + + } else { + + Vdseff0 = Vdsorg ; + Vdseff0_dVgs = 0.0 ; + Vdseff0_dVds = 1.0 ; + Vdseff0_dVbs = 0.0 ; + + } + + T0 = here->HSM2_ninvd ; + + T4 = 1.0 + ( Pdsz ) * T0 ; + T4_dVb = ( Pdsz_dVbs ) * T0 ; + T4_dVd = ( Pdsz_dVds ) * T0 ; + T4_dVg = ( Pdsz_dVgs ) * T0 ; + + Qiu = - Qn_res0 ; + Qiu_dVgs = - Qn_res0_dVgs ; + Qiu_dVds = - Qn_res0_dVds ; + Qiu_dVbs = - Qn_res0_dVbs ; + + T5 = Qiu ; + T5_dVb = Qiu_dVbs ; + T5_dVd = Qiu_dVds ; + T5_dVg = Qiu_dVgs ; + + T3 = T5 / T4 ; + T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ; + T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ; + T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ; + + Eeff = T3 ; + Eeff_dVbs = T3_dVb ; + Eeff_dVds = T3_dVd ; + Eeff_dVgs = T3_dVg ; + + T5 = Fn_Pow( Eeff , model->HSM2_depmueph0 - 1.0e0 ) ; + T8 = T5 * Eeff ; + + T9 = C_QE * C_m2cm_p2 ; + Rns = Qiu / T9 ; + + T1 = 1.0e0 / ( here->HSM2_depmue0 + here->HSM2_depmue1 * Rns / 1.0e11 ) + + here->HSM2_depmphn0 * T8 ; + + Muun = 1.0e0 / T1 ; + + T1 = 1.0e0 / ( T1 * T1 ) ; + T2 = here->HSM2_depmue0 + here->HSM2_depmue1 * Rns / 1.0e11 ; + T2 = 1.0e0 / ( T2 * T2 ) ; + T3 = here->HSM2_depmphn1 * T5 ; + T5 = - 1.0e-11 * here->HSM2_depmue1 / C_QE * T2 / C_m2cm_p2 ; + Muun_dVbs = - ( T5 * Qiu_dVbs + + Eeff_dVbs * T3 ) * T1 ; + Muun_dVds = - ( T5 * Qiu_dVds + + Eeff_dVds * T3 ) * T1 ; + Muun_dVgs = - ( T5 * Qiu_dVgs + + Eeff_dVgs * T3 ) * T1 ; + + /* Change to MKS unit */ + Muun /=C_m2cm_p2 ; + Muun_dVbs /=C_m2cm_p2 ; + Muun_dVds /=C_m2cm_p2 ; + Muun_dVgs /=C_m2cm_p2 ; + + Edri = Vdseff0 / Lch ; + Edri_dVgs = Vdseff0_dVgs / Lch ; + Edri_dVds = Vdseff0_dVds / Lch ; + Edri_dVbs = Vdseff0_dVbs / Lch ; + + T1 = Muun * Edri / here->HSM2_depvmax ; + T1_dVgs = (Muun_dVgs * Edri + Muun * Edri_dVgs) / here->HSM2_depvmax ; + T1_dVds = (Muun_dVds * Edri + Muun * Edri_dVds) / here->HSM2_depvmax ; + T1_dVbs = (Muun_dVbs * Edri + Muun * Edri_dVbs) / here->HSM2_depvmax ; + + T1 = T1 + small ; + T2 = Fn_Pow(T1,model->HSM2_depbb) ; + T2_dVgs = model->HSM2_depbb * T1_dVgs / T1 * T2 ; + T2_dVds = model->HSM2_depbb * T1_dVds / T1 * T2 ; + T2_dVbs = model->HSM2_depbb * T1_dVbs / T1 * T2 ; + + T3 = 1.0 + T2 ; + T4 = Fn_Pow(T3,1.0 / model->HSM2_depbb) ; + T4_dVgs = 1.0 / model->HSM2_depbb * T2_dVgs / T3 * T4 ; + T4_dVds = 1.0 / model->HSM2_depbb * T2_dVds / T3 * T4 ; + T4_dVbs = 1.0 / model->HSM2_depbb * T2_dVbs / T3 * T4 ; + + Mu_res = Muun / T4 ; + Mu_res_dVgs = Muun_dVgs / T4 - Muun / T4 / T4 * T4_dVgs ; + Mu_res_dVds = Muun_dVds / T4 - Muun / T4 / T4 * T4_dVds ; + Mu_res_dVbs = Muun_dVbs / T4 - Muun / T4 / T4 * T4_dVbs ; + + Ids_res = here->HSM2_weff_nf * ( - Qn_res0) * Mu_res * Edri ; + Ids_res_dVgs = here->HSM2_weff_nf * ( - Qn_res0_dVgs * Mu_res * Edri + - Qn_res0 * Mu_res_dVgs * Edri - Qn_res0 * Mu_res * Edri_dVgs) ; + Ids_res_dVds = here->HSM2_weff_nf * ( - Qn_res0_dVds * Mu_res * Edri + - Qn_res0 * Mu_res_dVds * Edri - Qn_res0 * Mu_res * Edri_dVds) ; + Ids_res_dVbs = here->HSM2_weff_nf * ( - Qn_res0_dVbs * Mu_res * Edri + - Qn_res0 * Mu_res_dVbs * Edri - Qn_res0 * Mu_res * Edri_dVbs) ; + + + //-----------------------------------------------------------* + //* back region universal mobility. (CGS unit) + //*-----------------// + + T0 = here->HSM2_ninvd ; + + T4 = 1.0 + ( Pdsz ) * T0 ; + T4_dVb = ( Pdsz_dVbs ) * T0 ; + T4_dVd = ( Pdsz_dVds ) * T0 ; + T4_dVg = ( Pdsz_dVgs ) * T0 ; + + Qiu = - Qn_bac0 ; + Qiu_dVgs = - Qn_bac0_dVgs ; + Qiu_dVds = - Qn_bac0_dVds ; + Qiu_dVbs = - Qn_bac0_dVbs ; + + T5 = Qiu ; + T5_dVb = Qiu_dVbs ; + T5_dVd = Qiu_dVds ; + T5_dVg = Qiu_dVgs ; + + T3 = T5 / T4 ; + T3_dVb = ( - T4_dVb * T5 + T4 * T5_dVb ) / T4 / T4 ; + T3_dVd = ( - T4_dVd * T5 + T4 * T5_dVd ) / T4 / T4 ; + T3_dVg = ( - T4_dVg * T5 + T4 * T5_dVg ) / T4 / T4 ; + + Eeff = T3 ; + Eeff_dVbs = T3_dVb ; + Eeff_dVds = T3_dVd ; + Eeff_dVgs = T3_dVg ; + + T5 = Fn_Pow( Eeff , model->HSM2_depmueph0 - 1.0e0 ) ; + T8 = T5 * Eeff ; + + T9 = C_QE * C_m2cm_p2 ; + Rns = Qiu / T9 ; + + T1 = 1.0e0 / ( here->HSM2_depmueback0 + here->HSM2_depmueback1 * Rns / 1.0e11 ) + + here->HSM2_depmphn0 * T8 ; + + Muun = 1.0e0 / T1 ; + + T1 = 1.0e0 / ( T1 * T1 ) ; + T2 = here->HSM2_depmueback0 + here->HSM2_depmueback1 * Rns / 1.0e11 ; + T2 = 1.0e0 / ( T2 * T2 ) ; + T3 = here->HSM2_depmphn1 * T5 ; + T5 = - 1.0e-11 * here->HSM2_depmueback1 / C_QE * T2 / C_m2cm_p2 ; + Muun_dVbs = - ( T5 * Qiu_dVbs + + Eeff_dVbs * T3 ) * T1 ; + Muun_dVds = - ( T5 * Qiu_dVds + + Eeff_dVds * T3 ) * T1 ; + Muun_dVgs = - ( T5 * Qiu_dVgs + + Eeff_dVgs * T3 ) * T1 ; + + /* Change to MKS unit */ + Muun /=C_m2cm_p2 ; + Muun_dVbs /=C_m2cm_p2 ; + Muun_dVds /=C_m2cm_p2 ; + Muun_dVgs /=C_m2cm_p2 ; + + Edri = Vdseff0 / Lch ; + Edri_dVgs = Vdseff0_dVgs / Lch ; + Edri_dVds = Vdseff0_dVds / Lch ; + Edri_dVbs = Vdseff0_dVbs / Lch ; + + T1 = Muun * Edri / here->HSM2_depvmax ; + T1_dVgs = (Muun_dVgs * Edri + Muun * Edri_dVgs) / here->HSM2_depvmax ; + T1_dVds = (Muun_dVds * Edri + Muun * Edri_dVds) / here->HSM2_depvmax ; + T1_dVbs = (Muun_dVbs * Edri + Muun * Edri_dVbs) / here->HSM2_depvmax ; + + T1 = T1 + small ; + T2 = Fn_Pow(T1,model->HSM2_depbb) ; + T2_dVgs = model->HSM2_depbb * T1_dVgs / T1 * T2 ; + T2_dVds = model->HSM2_depbb * T1_dVds / T1 * T2 ; + T2_dVbs = model->HSM2_depbb * T1_dVbs / T1 * T2 ; + + T3 = 1.0 + T2 ; + T4 = Fn_Pow(T3,1.0 / model->HSM2_depbb) ; + T4_dVgs = 1.0 / model->HSM2_depbb * T2_dVgs / T3 * T4 ; + T4_dVds = 1.0 / model->HSM2_depbb * T2_dVds / T3 * T4 ; + T4_dVbs = 1.0 / model->HSM2_depbb * T2_dVbs / T3 * T4 ; + + + Mu_bac = Muun / T4 ; + Mu_bac_dVgs = Muun_dVgs / T4 - Muun / T4 / T4 * T4_dVgs ; + Mu_bac_dVds = Muun_dVds / T4 - Muun / T4 / T4 * T4_dVds ; + Mu_bac_dVbs = Muun_dVbs / T4 - Muun / T4 / T4 * T4_dVbs ; + + Ids_bac = here->HSM2_weff_nf * ( - Qn_bac0) * Mu_bac * Edri ; + Ids_bac_dVgs = here->HSM2_weff_nf * ( - Qn_bac0_dVgs * Mu_bac * Edri + - Qn_bac0 * Mu_bac_dVgs * Edri - Qn_bac0 * Mu_bac * Edri_dVgs) ; + Ids_bac_dVds = here->HSM2_weff_nf * ( - Qn_bac0_dVds * Mu_bac * Edri + - Qn_bac0 * Mu_bac_dVds * Edri - Qn_bac0 * Mu_bac * Edri_dVds) ; + Ids_bac_dVbs = here->HSM2_weff_nf * ( - Qn_bac0_dVbs * Mu_bac * Edri + - Qn_bac0 * Mu_bac_dVbs * Edri - Qn_bac0 * Mu_bac * Edri_dVbs) ; + + + /*-----------------------------------------------------------* + * Ids: channel current. + *-----------------*/ + betaWL = here->HSM2_weff_nf * beta_inv / Lch ; + T1 = - betaWL / Lch ; + + Ids0 = betaWL * Idd * Mu + Ids_res + Ids_bac ; + + Ids0_dVgs = betaWL * ( Idd_dVgs * Mu + Idd * Mu_dVgs ) + + Ids_res_dVgs + Ids_bac_dVgs ; + Ids0_dVds = betaWL * ( Idd_dVds * Mu + Idd * Mu_dVds ) + + Ids_res_dVds + Ids_bac_dVds ; + Ids0_dVbs = betaWL * ( Idd_dVbs * Mu + Idd * Mu_dVbs ) + + Ids_res_dVbs + Ids_bac_dVbs ; + + + // Vdseff // + + Vds = Vdsorg; + + /*-----------------------------------------------------------* + * Adding parasitic components to the channel current. + *-----------------*/ + if( model->HSM2_ptl != 0 ){ + T1 = 0.5 * ( Vds - Pds ) ; + Fn_SymAdd( T6 , T1 , 0.01 , T2 ) ; + T2 = T2 * 0.5 ; + T6_dVb = T2 * ( - Pds_dVbs ) ; + T6_dVd = T2 * ( 1.0 - Pds_dVds ) ; + T6_dVg = T2 * ( - Pds_dVgs ) ; + + T1 = 1.1 - ( phi_s0_DEP + T6 ); + T1_dVb = - ( phi_s0_DEP_dVbs + T6_dVb ); + T1_dVd = - ( phi_s0_DEP_dVds + T6_dVd ); + T1_dVg = - ( phi_s0_DEP_dVgs + T6_dVg ); + + Fn_SZ( T2 , T1 , 0.05 , T0 ) ; + T2 = T2 + small ; + T2_dVb = T1_dVb * T0 ; + T2_dVd = T1_dVd * T0 ; + T2_dVg = T1_dVg * T0 ; + + T0 = beta * here->HSM2_ptl0 ; + T3 = Cox * T0 ; + T3_dVb = Cox_dVb * T0 ; + T3_dVd = Cox_dVd * T0 ; + T3_dVg = Cox_dVg * T0 ; + T0 = pow( T2 , model->HSM2_ptp ) ; + T9 = T3 * T0 ; + T9_dVb = T3 * model->HSM2_ptp * T0 / T2 * T2_dVb + T3_dVb * T0 ; + T9_dVd = T3 * model->HSM2_ptp * T0 / T2 * T2_dVd + T3_dVd * T0 ; + T9_dVg = T3 * model->HSM2_ptp * T0 / T2 * T2_dVg + T3_dVg * T0 ; + + + T4 = 1.0 + Vdsz * model->HSM2_pt2 ; + T4_dVb = Vdsz_dVbs * model->HSM2_pt2 ; + T4_dVd = Vdsz_dVds * model->HSM2_pt2 ; + T4_dVg = 0.0 ; + + T0 = here->HSM2_pt40 ; + T5 = phi_s0_DEP + T6 - Vbsz ; + T5_dVb = phi_s0_DEP_dVbs + T6_dVb - Vbsz_dVbs ; + T5_dVd = phi_s0_DEP_dVds + T6_dVd - Vbsz_dVds ; + T5_dVg = phi_s0_DEP_dVgs + T6_dVg ; + T4 = T4 + Vdsz * T0 * T5 ; + T4_dVb = T4_dVb + Vdsz * T0 * T5_dVb + Vdsz_dVbs * T0 * T5 ; + T4_dVd = T4_dVd + Vdsz * T0 * T5_dVd + Vdsz_dVds * T0 * T5 ; + T4_dVg = T4_dVg + Vdsz * T0 * T5_dVg ; + T6 = T9 * T4 ; + T9_dVb = T9_dVb * T4 + T9 * T4_dVb ; + T9_dVd = T9_dVd * T4 + T9 * T4_dVd ; + T9_dVg = T9_dVg * T4 + T9 * T4_dVg ; + T9 = T6 ; + + } else { + T9 = 0.0 ; + T9_dVb = 0.0 ; + T9_dVd = 0.0 ; + T9_dVg = 0.0 ; + } + + if( model->HSM2_gdl != 0 ){ + T1 = beta * here->HSM2_gdl0 ; + T2 = Cox * T1 ; + T2_dVb = Cox_dVb * T1 ; + T2_dVd = Cox_dVd * T1 ; + T2_dVg = Cox_dVg * T1 ; + T8 = T2 * Vdsz ; + T8_dVb = T2_dVb * Vdsz + T2 * Vdsz_dVbs ; + T8_dVd = T2_dVd * Vdsz + T2 * Vdsz_dVds ; + T8_dVg = T2_dVg * Vdsz ; + } else { + T8 = 0.0 ; + T8_dVb = 0.0 ; + T8_dVd = 0.0 ; + T8_dVg = 0.0 ; + } + + if ( ( T9 + T8 ) > 0.0 ) { + Idd1 = Pds * ( T9 + T8 ) ; + Idd1_dVbs = Pds_dVbs * ( T9 + T8 ) + Pds * ( T9_dVb + T8_dVb ) ; + Idd1_dVds = Pds_dVds * ( T9 + T8 ) + Pds * ( T9_dVd + T8_dVd ) ; + Idd1_dVgs = Pds_dVgs * ( T9 + T8 ) + Pds * ( T9_dVg + T8_dVg ) ; + + Ids0 = Ids0 +betaWL * Idd1 * Mu ; + T1 = betaWL * Idd1 ; + T2 = Idd1 * Mu ; + T3 = Mu * betaWL ; + Ids0_dVbs +=T3 * Idd1_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ; + Ids0_dVds +=T3 * Idd1_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ; + Ids0_dVgs +=T3 * Idd1_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ; + } + + /* Ids calculation */ + if ( flg_rsrd == 2 ) { + Rd = here->HSM2_rd ; + T0 = Rd * Ids0 ; + T1 = Vds + small ; + T2 = 1.0 / T1 ; + T3 = 1.0 + T0 * T2 ; + T3_dVb = Rd * Ids0_dVbs * T2 ; + T3_dVd = ( Rd * Ids0_dVds * T1 - T0 ) * T2 * T2 ; + T3_dVg = Rd * Ids0_dVgs * T2 ; + T4 = 1.0 / T3 ; + Ids = Ids0 * T4 ; + T5 = T4 * T4 ; + Ids_dVbs = ( Ids0_dVbs * T3 - Ids0 * T3_dVb ) * T5 ; + Ids_dVds = ( Ids0_dVds * T3 - Ids0 * T3_dVd ) * T5 ; + Ids_dVgs = ( Ids0_dVgs * T3 - Ids0 * T3_dVg ) * T5 ; + } else { + Ids = Ids0 ; + Ids_dVbs = Ids0_dVbs ; + Ids_dVds = Ids0_dVds ; + Ids_dVgs = Ids0_dVgs ; + } + + /* charge calculation */ + /*---------------------------------------------------* + * Qbu : - Qb in unit area. + *-----------------*/ + Qbu = - 0.5 * (Q_sub0 + Q_subL + Q_sub0_dep + Q_subL_dep ) ; + Qbu_dVgs = - 0.5 * ( Q_sub0_dVgs + Q_subL_dVgs + Q_sub0_dep_dVgs + Q_subL_dep_dVgs ) ; + Qbu_dVds = - 0.5 * ( Q_sub0_dVds + Q_subL_dVds + Q_sub0_dep_dVds + Q_subL_dep_dVds ) ; + Qbu_dVbs = - 0.5 * ( Q_sub0_dVbs + Q_subL_dVbs + Q_sub0_dep_dVbs + Q_subL_dep_dVbs ) ; + + Qiu = - 0.5 * (Q_n0 + Q_nL + Q_s0_dep + Q_sL_dep + Q_b0_dep + Q_bL_dep) ; + Qiu_dVgs = - 0.5 * ( Q_n0_dVgs + Q_nL_dVgs + Q_s0_dep_dVgs + Q_sL_dep_dVgs + Q_b0_dep_dVgs + Q_bL_dep_dVgs ) ; + Qiu_dVds = - 0.5 * ( Q_n0_dVds + Q_nL_dVds + Q_s0_dep_dVds + Q_sL_dep_dVds + Q_b0_dep_dVds + Q_bL_dep_dVds ) ; + Qiu_dVbs = - 0.5 * ( Q_n0_dVbs + Q_nL_dVbs + Q_s0_dep_dVbs + Q_sL_dep_dVbs + Q_b0_dep_dVbs + Q_bL_dep_dVbs ) ; + + Qdrat = 0.5; + Qdrat_dVgs = 0.0 ; + Qdrat_dVds = 0.0 ; + Qdrat_dVbs = 0.0 ; + + /*-------------------------------------------------* + * set flg_noqi , Qn0 , Ey for noise calc. + *-----------------*/ + Qiu_noi = - 0.5 * (Q_n0 + Q_nL ) ; + Qn0 = - Q_n0 ; + Qn0_dVgs = - Q_n0_dVgs ; + Qn0_dVds = - Q_n0_dVds ; + Qn0_dVbs = - Q_n0_dVbs ; + + Ey = Ey_suf ; + Ey_dVbs = Ey_suf_dVbs ; + Ey_dVds = Ey_suf_dVds ; + Ey_dVgs = Ey_suf_dVgs ; + + if( Qn0 < small ) { flg_noqi = 1; } + +} /* End of hsmhveval_dep */ + + diff --git a/src/spicelib/devices/hisim2/hsm2evalenv.h b/src/spicelib/devices/hisim2/hsm2evalenv.h index 4f3e95c58..52b2dbe9c 100644 --- a/src/spicelib/devices/hisim2/hsm2evalenv.h +++ b/src/spicelib/devices/hisim2/hsm2evalenv.h @@ -1,14 +1,14 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2evalenv.h - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & diff --git a/src/spicelib/devices/hisim2/hsm2ext.h b/src/spicelib/devices/hisim2/hsm2ext.h index b5670af84..ebae516e6 100644 --- a/src/spicelib/devices/hisim2/hsm2ext.h +++ b/src/spicelib/devices/hisim2/hsm2ext.h @@ -1,14 +1,14 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2ext.h - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & diff --git a/src/spicelib/devices/hisim2/hsm2getic.c b/src/spicelib/devices/hisim2/hsm2getic.c index d7f59c404..22a06a7ed 100644 --- a/src/spicelib/devices/hisim2/hsm2getic.c +++ b/src/spicelib/devices/hisim2/hsm2getic.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2getic.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/cktdefs.h" #include "hsm2def.h" diff --git a/src/spicelib/devices/hisim2/hsm2init.c b/src/spicelib/devices/hisim2/hsm2init.c index f07f6190f..1eefbd18b 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.7.0", + "Hiroshima University STARC IGFET Model 2.8.0", &HSM2nSize, &HSM2nSize, diff --git a/src/spicelib/devices/hisim2/hsm2ld.c b/src/spicelib/devices/hisim2/hsm2ld.c index e830dc3ac..43e5c2f6c 100644 --- a/src/spicelib/devices/hisim2/hsm2ld.c +++ b/src/spicelib/devices/hisim2/hsm2ld.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2ld.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/cktdefs.h" #include "hsm2def.h" @@ -236,7 +275,7 @@ int HSM2LoadOMP(HSM2instance *here, CKTcircuit *ckt) double ivds=0.0, ivgs=0.0, ivbs=0.0 ; double gjbs=0.0, gjbd=0.0, gcdbdb=0.0, gcsbsb=0.0, gcbbb=0.0, gcdbb=0.0, gcsbb=0.0, grg=0.0 ; double vdbs=0.0, vsbs=0.0, vdbd=0.0, delvdbs=0.0, delvsbs=0.0, delvdbd=0.0 ; - double vges=0.0, vged=0.0, delvges=0.0,/* delvged=0.0,*/ vgedo=0.0 ; + double vges=0.0, vged=0.0, delvges=0.0, delvged=0.0, vgedo=0.0 ; double vsbdo=0.0, vsbd=0.0; double vbs_jct=0.0, vbd_jct=0.0, delvbs_jct=0.0, delvbd_jct=0.0 ; int ByPass=0, Check=0, Check1=0, Check2=0 ; @@ -260,7 +299,6 @@ int HSM2LoadOMP(HSM2instance *here, CKTcircuit *ckt) tm0 = gtodsecld() ; #endif - #ifdef USE_OMP model = here->HSM2modPtr; reltol = ckt->CKTreltol * BYP_TOL_FACTOR ; @@ -410,7 +448,7 @@ tm0 = gtodsecld() ; delvsbs = vsbs - *(ckt->CKTstate0 + here->HSM2vsbs); delvdbd = vdbd - *(ckt->CKTstate0 + here->HSM2vdbd); delvgd = vgd - vgdo; -/* delvged = vged - vgedo;*/ + delvged = vged - vgedo; delvbd_jct = (!here->HSM2_corbnet) ? delvbd : delvdbd; delvbs_jct = (!here->HSM2_corbnet) ? delvbs : delvsbs; diff --git a/src/spicelib/devices/hisim2/hsm2mask.c b/src/spicelib/devices/hisim2/hsm2mask.c index 5c6ce69df..c4b45a72c 100644 --- a/src/spicelib/devices/hisim2/hsm2mask.c +++ b/src/spicelib/devices/hisim2/hsm2mask.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2mask.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/ifsim.h" #include "ngspice/cktdefs.h" @@ -115,6 +154,13 @@ int HSM2mAsk( case HSM2_MOD_COERRREP: value->iValue = model->HSM2_coerrrep; return(OK); + case HSM2_MOD_CODEP: + value->iValue = model->HSM2_codep; + return(OK); + case HSM2_MOD_CODDLT: + value->iValue = model->HSM2_coddlt; + return(OK); + case HSM2_MOD_VMAX: value->rValue = model->HSM2_vmax; return(OK); @@ -298,9 +344,7 @@ int HSM2mAsk( case HSM2_MOD_PGD2: value->rValue = model->HSM2_pgd2; return(OK); -//case HSM2_MOD_PGD3: -// value->rValue = model->HSM2_pgd3; -// return(OK); + case HSM2_MOD_PGD4: value->rValue = model->HSM2_pgd4; return(OK); @@ -325,6 +369,12 @@ int HSM2mAsk( case HSM2_MOD_NINVD: value->rValue = model->HSM2_ninvd; return(OK); + case HSM2_MOD_NINVDL: + value->rValue = model->HSM2_ninvdl; + return(OK); + case HSM2_MOD_NINVDLP: + value->rValue = model->HSM2_ninvdlp; + return(OK); case HSM2_MOD_MUECB0: value->rValue = model->HSM2_muecb0; return(OK); @@ -883,6 +933,107 @@ int HSM2mAsk( value->rValue = model->HSM2_muecb1lp; return(OK); + /* Depletion Mode MOSFET */ + case HSM2_MOD_NDEPM: + value->rValue = model->HSM2_ndepm; + return(OK); + case HSM2_MOD_NDEPML: + value->rValue = model->HSM2_ndepml; + return(OK); + case HSM2_MOD_NDEPMLP: + value->rValue = model->HSM2_ndepmlp; + return(OK); + case HSM2_MOD_TNDEP: + value->rValue = model->HSM2_tndep; + return(OK); + case HSM2_MOD_DEPLEAK: + value->rValue = model->HSM2_depleak; + return(OK); + case HSM2_MOD_DEPLEAKL: + value->rValue = model->HSM2_depleakl; + return(OK); + case HSM2_MOD_DEPLEAKLP: + value->rValue = model->HSM2_depleaklp; + return(OK); + case HSM2_MOD_DEPETA: + value->rValue = model->HSM2_depeta; + return(OK); + case HSM2_MOD_DEPMUE0: + value->rValue = model->HSM2_depmue0; + return(OK); + case HSM2_MOD_DEPMUE0L: + value->rValue = model->HSM2_depmue0l; + return(OK); + case HSM2_MOD_DEPMUE0LP: + value->rValue = model->HSM2_depmue0lp; + return(OK); + case HSM2_MOD_DEPMUE1: + value->rValue = model->HSM2_depmue1; + return(OK); + case HSM2_MOD_DEPMUE1L: + value->rValue = model->HSM2_depmue1l; + return(OK); + case HSM2_MOD_DEPMUE1LP: + value->rValue = model->HSM2_depmue1lp; + return(OK); + case HSM2_MOD_DEPMUEBACK0: + value->rValue = model->HSM2_depmueback0; + return(OK); + case HSM2_MOD_DEPMUEBACK0L: + value->rValue = model->HSM2_depmueback0l; + return(OK); + case HSM2_MOD_DEPMUEBACK0LP: + value->rValue = model->HSM2_depmueback0lp; + return(OK); + case HSM2_MOD_DEPMUEBACK1: + value->rValue = model->HSM2_depmueback1; + return(OK); + case HSM2_MOD_DEPMUEBACK1L: + value->rValue = model->HSM2_depmueback1l; + return(OK); + case HSM2_MOD_DEPMUEBACK1LP: + value->rValue = model->HSM2_depmueback1lp; + return(OK); + case HSM2_MOD_DEPMUEPH0: + value->rValue = model->HSM2_depmueph0; + return(OK); + case HSM2_MOD_DEPMUEPH1: + value->rValue = model->HSM2_depmueph1; + return(OK); + case HSM2_MOD_DEPVMAX: + value->rValue = model->HSM2_depvmax; + return(OK); + case HSM2_MOD_DEPVMAXL: + value->rValue = model->HSM2_depvmaxl; + return(OK); + case HSM2_MOD_DEPVMAXLP: + value->rValue = model->HSM2_depvmaxlp; + return(OK); + case HSM2_MOD_DEPVDSEF1: + value->rValue = model->HSM2_depvdsef1; + return(OK); + case HSM2_MOD_DEPVDSEF1L: + value->rValue = model->HSM2_depvdsef1l; + return(OK); + case HSM2_MOD_DEPVDSEF1LP: + value->rValue = model->HSM2_depvdsef1lp; + return(OK); + case HSM2_MOD_DEPVDSEF2: + value->rValue = model->HSM2_depvdsef2; + return(OK); + case HSM2_MOD_DEPVDSEF2L: + value->rValue = model->HSM2_depvdsef2l; + return(OK); + case HSM2_MOD_DEPVDSEF2LP: + value->rValue = model->HSM2_depvdsef2lp; + return(OK); + case HSM2_MOD_DEPBB: + value->rValue = model->HSM2_depbb; + return(OK); + case HSM2_MOD_DEPMUETMP: + value->rValue = model->HSM2_depmuetmp; + return(OK); + /* binning parameters */ case HSM2_MOD_LMIN: diff --git a/src/spicelib/devices/hisim2/hsm2mdel.c b/src/spicelib/devices/hisim2/hsm2mdel.c index 04645c52e..c593639dc 100644 --- a/src/spicelib/devices/hisim2/hsm2mdel.c +++ b/src/spicelib/devices/hisim2/hsm2mdel.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2mdel.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "hsm2def.h" #include "ngspice/sperror.h" diff --git a/src/spicelib/devices/hisim2/hsm2mpar.c b/src/spicelib/devices/hisim2/hsm2mpar.c index ec864768b..4657811f2 100644 --- a/src/spicelib/devices/hisim2/hsm2mpar.c +++ b/src/spicelib/devices/hisim2/hsm2mpar.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2mpar.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "hsm2def.h" #include "ngspice/ifsim.h" @@ -140,6 +179,15 @@ int HSM2mParam( mod->HSM2_coerrrep = value->iValue; mod->HSM2_coerrrep_Given = TRUE; break; + case HSM2_MOD_CODEP: + mod->HSM2_codep = value->iValue; + mod->HSM2_codep_Given = TRUE; + break; + case HSM2_MOD_CODDLT: + mod->HSM2_coddlt = value->iValue; + mod->HSM2_coddlt_Given = TRUE; + break; + case HSM2_MOD_VMAX: mod->HSM2_vmax = value->rValue; mod->HSM2_vmax_Given = TRUE; @@ -420,6 +468,14 @@ int HSM2mParam( mod->HSM2_ninvd = value->rValue; mod->HSM2_ninvd_Given = TRUE; break; + case HSM2_MOD_NINVDL: + mod->HSM2_ninvdl = value->rValue; + mod->HSM2_ninvdl_Given = TRUE; + break; + case HSM2_MOD_NINVDLP: + mod->HSM2_ninvdlp = value->rValue; + mod->HSM2_ninvdlp_Given = TRUE; + break; case HSM2_MOD_MUECB0: mod->HSM2_muecb0 = value->rValue; mod->HSM2_muecb0_Given = TRUE; @@ -1162,6 +1218,139 @@ int HSM2mParam( mod->HSM2_muecb1lp_Given = TRUE; break; + /* Depletion Mode MODFET */ + case HSM2_MOD_NDEPM: + mod->HSM2_ndepm = value->rValue; + mod->HSM2_ndepm_Given = TRUE; + break; + case HSM2_MOD_NDEPML: + mod->HSM2_ndepml = value->rValue; + mod->HSM2_ndepml_Given = TRUE; + break; + case HSM2_MOD_NDEPMLP: + mod->HSM2_ndepmlp = value->rValue; + mod->HSM2_ndepmlp_Given = TRUE; + break; + case HSM2_MOD_TNDEP: + mod->HSM2_tndep = value->rValue; + mod->HSM2_tndep_Given = TRUE; + break; + case HSM2_MOD_DEPLEAK: + mod->HSM2_depleak = value->rValue; + mod->HSM2_depleak_Given = TRUE; + break; + case HSM2_MOD_DEPLEAKL: + mod->HSM2_depleakl = value->rValue; + mod->HSM2_depleakl_Given = TRUE; + break; + case HSM2_MOD_DEPLEAKLP: + mod->HSM2_depleaklp = value->rValue; + mod->HSM2_depleaklp_Given = TRUE; + break; + case HSM2_MOD_DEPETA: + mod->HSM2_depeta = value->rValue; + mod->HSM2_depeta_Given = TRUE; + break; + case HSM2_MOD_DEPMUE0: + mod->HSM2_depmue0 = value->rValue; + mod->HSM2_depmue0_Given = TRUE; + break; + case HSM2_MOD_DEPMUE0L: + mod->HSM2_depmue0l = value->rValue; + mod->HSM2_depmue0l_Given = TRUE; + break; + case HSM2_MOD_DEPMUE0LP: + mod->HSM2_depmue0lp = value->rValue; + mod->HSM2_depmue0lp_Given = TRUE; + break; + case HSM2_MOD_DEPMUE1: + mod->HSM2_depmue1 = value->rValue; + mod->HSM2_depmue1_Given = TRUE; + break; + case HSM2_MOD_DEPMUE1L: + mod->HSM2_depmue1l = value->rValue; + mod->HSM2_depmue1l_Given = TRUE; + break; + case HSM2_MOD_DEPMUE1LP: + mod->HSM2_depmue1lp = value->rValue; + mod->HSM2_depmue1lp_Given = TRUE; + break; + case HSM2_MOD_DEPMUEBACK0: + mod->HSM2_depmueback0 = value->rValue; + mod->HSM2_depmueback0_Given = TRUE; + break; + case HSM2_MOD_DEPMUEBACK0L: + mod->HSM2_depmueback0l = value->rValue; + mod->HSM2_depmueback0l_Given = TRUE; + break; + case HSM2_MOD_DEPMUEBACK0LP: + mod->HSM2_depmueback0lp = value->rValue; + mod->HSM2_depmueback0lp_Given = TRUE; + break; + case HSM2_MOD_DEPMUEBACK1: + mod->HSM2_depmueback1 = value->rValue; + mod->HSM2_depmueback1_Given = TRUE; + break; + case HSM2_MOD_DEPMUEBACK1L: + mod->HSM2_depmueback1l = value->rValue; + mod->HSM2_depmueback1l_Given = TRUE; + break; + case HSM2_MOD_DEPMUEBACK1LP: + mod->HSM2_depmueback1lp = value->rValue; + mod->HSM2_depmueback1lp_Given = TRUE; + break; + case HSM2_MOD_DEPMUEPH0: + mod->HSM2_depmueph0 = value->rValue; + mod->HSM2_depmueph0_Given = TRUE; + break; + case HSM2_MOD_DEPMUEPH1: + mod->HSM2_depmueph1 = value->rValue; + mod->HSM2_depmueph1_Given = TRUE; + break; + case HSM2_MOD_DEPVMAX: + mod->HSM2_depvmax = value->rValue; + mod->HSM2_depvmax_Given = TRUE; + break; + case HSM2_MOD_DEPVMAXL: + mod->HSM2_depvmaxl = value->rValue; + mod->HSM2_depvmaxl_Given = TRUE; + break; + case HSM2_MOD_DEPVMAXLP: + mod->HSM2_depvmaxlp = value->rValue; + mod->HSM2_depvmaxlp_Given = TRUE; + break; + case HSM2_MOD_DEPVDSEF1: + mod->HSM2_depvdsef1 = value->rValue; + mod->HSM2_depvdsef1_Given = TRUE; + break; + case HSM2_MOD_DEPVDSEF1L: + mod->HSM2_depvdsef1l = value->rValue; + mod->HSM2_depvdsef1l_Given = TRUE; + break; + case HSM2_MOD_DEPVDSEF1LP: + mod->HSM2_depvdsef1lp = value->rValue; + mod->HSM2_depvdsef1lp_Given = TRUE; + break; + case HSM2_MOD_DEPVDSEF2: + mod->HSM2_depvdsef2 = value->rValue; + mod->HSM2_depvdsef2_Given = TRUE; + break; + case HSM2_MOD_DEPVDSEF2L: + mod->HSM2_depvdsef2l = value->rValue; + mod->HSM2_depvdsef2l_Given = TRUE; + break; + case HSM2_MOD_DEPVDSEF2LP: + mod->HSM2_depvdsef2lp = value->rValue; + mod->HSM2_depvdsef2lp_Given = TRUE; + break; + case HSM2_MOD_DEPBB: + mod->HSM2_depbb = value->rValue; + mod->HSM2_depbb_Given = TRUE; + break; + case HSM2_MOD_DEPMUETMP: + mod->HSM2_depmuetmp = value->rValue; + mod->HSM2_depmuetmp_Given = TRUE; + break; /* binning parameters */ case HSM2_MOD_LMIN: diff --git a/src/spicelib/devices/hisim2/hsm2noi.c b/src/spicelib/devices/hisim2/hsm2noi.c index 6559a2696..5f5a860af 100644 --- a/src/spicelib/devices/hisim2/hsm2noi.c +++ b/src/spicelib/devices/hisim2/hsm2noi.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2noi.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "hsm2def.h" #include "ngspice/cktdefs.h" diff --git a/src/spicelib/devices/hisim2/hsm2par.c b/src/spicelib/devices/hisim2/hsm2par.c index 02910e852..a8fe25747 100644 --- a/src/spicelib/devices/hisim2/hsm2par.c +++ b/src/spicelib/devices/hisim2/hsm2par.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2par.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/ifsim.h" #include "hsm2def.h" diff --git a/src/spicelib/devices/hisim2/hsm2pzld.c b/src/spicelib/devices/hisim2/hsm2pzld.c index 090dd9baa..b40e9a3ec 100644 --- a/src/spicelib/devices/hisim2/hsm2pzld.c +++ b/src/spicelib/devices/hisim2/hsm2pzld.c @@ -1,14 +1,14 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2pzld.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & @@ -29,8 +29,8 @@ int HSM2pzLoad( { HSM2model *model = (HSM2model*)inModel; HSM2instance *here; - double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb = 0.0, xcbsb, xcbbb; - double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb = 0.0, xcssb, xcsbb; + double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb; + double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, 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 7a1944cb6..84bb8896a 100644 --- a/src/spicelib/devices/hisim2/hsm2set.c +++ b/src/spicelib/devices/hisim2/hsm2set.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2set.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/smpdefs.h" #include "ngspice/cktdefs.h" @@ -91,17 +130,18 @@ int HSM2setup( model->HSM2_noise = 1; /* allways noise is set to be 1 */ if ( !model->HSM2_version_Given) { - model->HSM2_version = 270; /* default 270 */ - printf(" 270 is selected for VERSION. (default) \n"); + model->HSM2_version = 280; /* default 2.80 */ + printf(" 2.80 is selected for VERSION. (default) \n"); } else { - if (model->HSM2_version != 270) { - model->HSM2_version = 270; /* default 270 */ - printf(" 270 is the only available VERSION. \n"); - printf(" 270 is selected for VERSION. (default) \n"); - } else { - printf(" %d is selected for VERSION \n", (int)model->HSM2_version); - } + if (model->HSM2_version < 280 || model->HSM2_version > 280 ) { + printf(" %d is not available for VERSION. \n", model->HSM2_version ); + model->HSM2_version = 280; /* 2.80 */ + } + printf(" 2.80 is selected for VERSION. \n"); } + /* set subversion & revision */ +// model->HSM2_subversion = fmod(model->HSM2_version * 10 , 10 ); +// model->HSM2_revision = fmod(model->HSM2_version * 100 , 10 ); if ( !model->HSM2_corsrd_Given ) model->HSM2_corsrd = 0 ; if ( !model->HSM2_corg_Given ) model->HSM2_corg = 0 ; @@ -121,12 +161,27 @@ int HSM2setup( if ( !model->HSM2_corbnet_Given ) model->HSM2_corbnet = 0 ; else if ( model->HSM2_corbnet != 0 && model->HSM2_corbnet != 1 ) { model->HSM2_corbnet = 0; - printf("warning(HiSIM2): CORBNET has been set to its default value: %d.\n", model->HSM2_corbnet); + printf("warning(HiSIM): CORBNET has been set to its default value: %d.\n", model->HSM2_corbnet); } if ( !model->HSM2_corecip_Given ) model->HSM2_corecip = 1 ; if ( !model->HSM2_coqy_Given ) model->HSM2_coqy = 0 ; if ( !model->HSM2_coqovsm_Given ) model->HSM2_coqovsm = 1 ; if ( !model->HSM2_coerrrep_Given ) model->HSM2_coerrrep = 1 ; + if ( !model->HSM2_codep_Given ) model->HSM2_codep = 0 ; + if ( !model->HSM2_coddlt_Given ) model->HSM2_coddlt = 1 ; + + if ( model->HSM2_codep_Given ) { + if( model->HSM2_codep != 0 && model->HSM2_codep != 1 ) { + printf("warning(HiSIM): Invalid CODEP (%d) was specified, resetted to 0.\n",model->HSM2_codep); + model->HSM2_codep = 0 ; + } + } + if ( model->HSM2_coddlt_Given ) { + if( model->HSM2_coddlt != 0 && model->HSM2_coddlt != 1 ) { + printf("warning(HiSIM): Invalid CODDLT (%d) was specified, resetted to 0.\n",model->HSM2_coddlt); + model->HSM2_coddlt = 0 ; + } + } if ( !model->HSM2_vmax_Given ) model->HSM2_vmax = 1.0e7 ; @@ -137,8 +192,13 @@ int HSM2setup( if ( !model->HSM2_xld_Given ) model->HSM2_xld = 0.0 ; if ( !model->HSM2_lover_Given ) model->HSM2_lover = 30e-9 ; if ( !model->HSM2_ddltmax_Given ) model->HSM2_ddltmax = 10.0 ; /* Vdseff */ - if ( !model->HSM2_ddltslp_Given ) model->HSM2_ddltslp = 0.0 ; /* Vdseff */ - if ( !model->HSM2_ddltict_Given ) model->HSM2_ddltict = 10.0 ; /* Vdseff */ + if ( model->HSM2_coddlt == 0 ) { + if ( !model->HSM2_ddltslp_Given ) model->HSM2_ddltslp = 0.0 ; /* Vdseff */ + if ( !model->HSM2_ddltict_Given ) model->HSM2_ddltict = 10.0 ; /* Vdseff */ + } else { + if ( !model->HSM2_ddltslp_Given ) model->HSM2_ddltslp = 10.0 ; /* Vdseff */ + if ( !model->HSM2_ddltict_Given ) model->HSM2_ddltict = 0.0 ; /* Vdseff */ + } if ( !model->HSM2_vfbover_Given ) model->HSM2_vfbover = 0.0 ; if ( !model->HSM2_nover_Given ) model->HSM2_nover = 1E19 ; if ( !model->HSM2_xwd_Given ) model->HSM2_xwd = 0.0 ; @@ -200,6 +260,8 @@ int HSM2setup( if ( !model->HSM2_ndepwp_Given ) model->HSM2_ndepwp = 1.0 ; if ( !model->HSM2_ninv_Given ) model->HSM2_ninv = 0.5 ; if ( !model->HSM2_ninvd_Given ) model->HSM2_ninvd = 0.0 ; + if ( !model->HSM2_ninvdl_Given ) model->HSM2_ninvdl = 0.0 ; + if ( !model->HSM2_ninvdlp_Given ) model->HSM2_ninvdlp = 1.0 ; if ( !model->HSM2_muecb0_Given ) model->HSM2_muecb0 = 1.0e3 ; if ( !model->HSM2_muecb1_Given ) model->HSM2_muecb1 = 100.0 ; if ( !model->HSM2_mueph0_Given ) model->HSM2_mueph0 = 300.0e-3 ; @@ -327,7 +389,7 @@ int HSM2setup( if ( !model->HSM2_nsubcmax_Given ) model->HSM2_nsubcmax = 5e18 ; if ( !model->HSM2_qme1_Given ) model->HSM2_qme1 = 0.0 ; - if ( !model->HSM2_qme2_Given ) model->HSM2_qme2 = 2.0 ; + if ( !model->HSM2_qme2_Given ) model->HSM2_qme2 = 2.0 ; /* fix in version 2.80 */ if ( !model->HSM2_qme3_Given ) model->HSM2_qme3 = 0.0 ; if ( !model->HSM2_vovers_Given ) model->HSM2_vovers = 0.0 ; @@ -408,18 +470,65 @@ 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 ; if ( !model->HSM2_muecb0lp_Given ) model->HSM2_muecb0lp = 0.0; if ( !model->HSM2_muecb1lp_Given ) model->HSM2_muecb1lp = 0.0; + /* Depletion Mode MOSFET */ + if ( !model->HSM2_ndepm_Given ) model->HSM2_ndepm = 1e17 ; + if ( !model->HSM2_ndepml_Given ) model->HSM2_ndepml = 0.0 ; + if ( !model->HSM2_ndepmlp_Given ) model->HSM2_ndepmlp = 1.0 ; + if ( !model->HSM2_tndep_Given ) model->HSM2_tndep = 0.2e-6 ; + if ( !model->HSM2_depleak_Given ) model->HSM2_depleak = 0.5 ; + if ( !model->HSM2_depleakl_Given ) model->HSM2_depleakl = 0.0 ; + if ( !model->HSM2_depleaklp_Given ) model->HSM2_depleaklp = 1.0 ; + if ( !model->HSM2_depeta_Given ) model->HSM2_depeta = 0.0 ; + if ( !model->HSM2_depmue0_Given ) model->HSM2_depmue0 = 1e3 ; + if ( !model->HSM2_depmue0l_Given ) model->HSM2_depmue0l = 0.0 ; + if ( !model->HSM2_depmue0lp_Given ) model->HSM2_depmue0lp = 1.0 ; + if ( !model->HSM2_depmue1_Given ) model->HSM2_depmue1 = 0.0 ; + if ( !model->HSM2_depmue1l_Given ) model->HSM2_depmue1l = 0.0 ; + if ( !model->HSM2_depmue1lp_Given ) model->HSM2_depmue1lp = 1.0 ; + if ( !model->HSM2_depmueback0_Given ) model->HSM2_depmueback0 = 1e2 ; + if ( !model->HSM2_depmueback0l_Given ) model->HSM2_depmueback0l = 0.0 ; + if ( !model->HSM2_depmueback0lp_Given ) model->HSM2_depmueback0lp = 1.0 ; + if ( !model->HSM2_depmueback1_Given ) model->HSM2_depmueback1 = 0.0 ; + if ( !model->HSM2_depmueback1l_Given ) model->HSM2_depmueback1l = 0.0 ; + if ( !model->HSM2_depmueback1lp_Given ) model->HSM2_depmueback1lp = 1.0 ; + if ( !model->HSM2_depmueph0_Given ) model->HSM2_depmueph0 = 0.3 ; + if ( !model->HSM2_depmueph1_Given ) model->HSM2_depmueph1 = 5e3 ; + if ( !model->HSM2_depvmax_Given ) model->HSM2_depvmax = 3e7 ; + if ( !model->HSM2_depvmaxl_Given ) model->HSM2_depvmaxl = 0.0 ; + if ( !model->HSM2_depvmaxlp_Given ) model->HSM2_depvmaxlp = 1.0 ; + if ( !model->HSM2_depvdsef1_Given ) model->HSM2_depvdsef1 = 2.0 ; + if ( !model->HSM2_depvdsef1l_Given ) model->HSM2_depvdsef1l = 0.0 ; + if ( !model->HSM2_depvdsef1lp_Given ) model->HSM2_depvdsef1lp = 1.0 ; + if ( !model->HSM2_depvdsef2_Given ) model->HSM2_depvdsef2 = 0.5 ; + if ( !model->HSM2_depvdsef2l_Given ) model->HSM2_depvdsef2l = 0.0 ; + if ( !model->HSM2_depvdsef2lp_Given ) model->HSM2_depvdsef2lp = 1.0 ; + if ( !model->HSM2_depbb_Given ) model->HSM2_depbb = 1.0 ; + if ( !model->HSM2_depmuetmp_Given ) model->HSM2_depmuetmp = 1.5 ; + + if ( model->HSM2_codep ) { /* change default value for depletion mod MOSFET */ + if ( !model->HSM2_corecip_Given ) model->HSM2_corecip = 0 ; + if ( !model->HSM2_copprv_Given ) model->HSM2_copprv = 0 ; + if ( !model->HSM2_vfbc_Given ) model->HSM2_vfbc = 0.2 ; + if ( !model->HSM2_nsubc_Given ) model->HSM2_nsubc = 5.0e16 ; + if ( !model->HSM2_lp_Given ) model->HSM2_lp = 0.0 ; + if ( !model->HSM2_nsubp_Given ) model->HSM2_nsubp = 1.0e17 ; + if ( !model->HSM2_muesr1_Given ) model->HSM2_muesr1 = 5.0e15 ; + } + /* binning parameters */ if ( !model->HSM2_lmin_Given ) model->HSM2_lmin = 0.0 ; if ( !model->HSM2_lmax_Given ) model->HSM2_lmax = 1.0 ; @@ -657,7 +766,37 @@ int HSM2setup( if (!model->HSM2vbsMaxGiven) model->HSM2vbsMax = 1e99; if (!model->HSM2vbdMaxGiven) model->HSM2vbdMax = 1e99; - if ( model->HSM2_corecip == 1 ){ + if ( model->HSM2_codep ) { + RANGERESET(model->HSM2_ndepm, 5e15, 2e17, "NDEPM" ) ; + RANGERESET(model->HSM2_tndep, 1e-7, 1e-6, "TNDEP" ) ; + RANGECHECK(model->HSM2_depleak, 0.0, 10.0, "DEPLEAK" ) ; + + if( model->HSM2_corecip ) { + printf("warning(HiSIM): CORECIP is not supported yet in depletion mode MOSFET, resetted to 0.\n"); + model->HSM2_corecip = 0; + } + if( model->HSM2_copprv ) { + printf("warning(HiSIM): COPPRV is not supported yet in depletion mode MOSFET, resetted to 0.\n"); + model->HSM2_copprv = 0; + } + if( model->HSM2_corsrd == 1 ) { + printf("warning(HiSIM): CORSRD=1 is not supported yet in depletion mode MOSFET, resetted to -1.\n"); + model->HSM2_corsrd = -1; + } + if( model->HSM2_coisti ) { + printf("warning(HiSIM): STI leak model is not supported yet in depletion mode MOSFET, skipped\n"); + model->HSM2_coisti = 0 ; + } + if( model->HSM2_cothrml ) { + printf("warning(HiSIM): Thermal noise model is not supported yet in depletion mode MOSFET, skipped\n"); + model->HSM2_cothrml = 0 ; + } + if( model->HSM2_coign ) { + printf("warning(HiSIM): Induced gate noise model is not supported yet in depletion mode MOSFET, skipped\n"); + model->HSM2_coign = 0 ; + } + } + if ( model->HSM2_corecip ){ model->HSM2_sc2 = 0.0 ; model->HSM2_lsc2 = 0.0 ; model->HSM2_wsc2 = 0.0 ; model->HSM2_psc2 = 0.0 ; model->HSM2_scp2 = 0.0 ; model->HSM2_lscp2 = 0.0 ; model->HSM2_wscp2 = 0.0 ; model->HSM2_pscp2 = 0.0 ; model->HSM2_sc4 = 0.0 ; model->HSM2_lsc4 = 0.0 ; model->HSM2_wsc4 = 0.0 ; model->HSM2_psc4 = 0.0 ; @@ -705,7 +844,7 @@ int HSM2setup( else if ( here->HSM2_corbnet != 0 && here->HSM2_corbnet != 1 ) { here->HSM2_corbnet = model->HSM2_corbnet ; if(model->HSM2_coerrrep) - printf("warning(HiSIM2): CORBNET has been set to its default value: %d.\n", here->HSM2_corbnet); + printf("warning(HiSIM): CORBNET has been set to its default value: %d.\n", here->HSM2_corbnet); } if ( !here->HSM2_rbdb_Given) here->HSM2_rbdb = model->HSM2_rbdb; /* in ohm */ if ( !here->HSM2_rbsb_Given) here->HSM2_rbsb = model->HSM2_rbsb; @@ -718,7 +857,7 @@ int HSM2setup( else if ( here->HSM2_corg != 0 && here->HSM2_corg != 1 ) { here->HSM2_corg = model->HSM2_corg ; if(model->HSM2_coerrrep) - printf("warning(HiSIM2): CORG has been set to its default value: %d.\n", here->HSM2_corg); + printf("warning(HiSIM): CORG has been set to its default value: %d.\n", here->HSM2_corg); } if ( !here->HSM2_mphdfm_Given ) here->HSM2_mphdfm = model->HSM2_mphdfm ; @@ -789,33 +928,33 @@ int HSM2setup( /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ +if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(E_NOMEM);\ -} } while(0) - - TSTALLOC(HSM2DPbpPtr, HSM2dNodePrime, HSM2bNodePrime); - TSTALLOC(HSM2SPbpPtr, HSM2sNodePrime, HSM2bNodePrime); - TSTALLOC(HSM2GPbpPtr, HSM2gNodePrime, HSM2bNodePrime); - - TSTALLOC(HSM2BPdpPtr, HSM2bNodePrime, HSM2dNodePrime); - TSTALLOC(HSM2BPspPtr, HSM2bNodePrime, HSM2sNodePrime); - TSTALLOC(HSM2BPgpPtr, HSM2bNodePrime, HSM2gNodePrime); - TSTALLOC(HSM2BPbpPtr, HSM2bNodePrime, HSM2bNodePrime); - - TSTALLOC(HSM2DdPtr, HSM2dNode, HSM2dNode); - TSTALLOC(HSM2GPgpPtr, HSM2gNodePrime, HSM2gNodePrime); - TSTALLOC(HSM2SsPtr, HSM2sNode, HSM2sNode); - TSTALLOC(HSM2DPdpPtr, HSM2dNodePrime, HSM2dNodePrime); - TSTALLOC(HSM2SPspPtr, HSM2sNodePrime, HSM2sNodePrime); - TSTALLOC(HSM2DdpPtr, HSM2dNode, HSM2dNodePrime); - TSTALLOC(HSM2GPdpPtr, HSM2gNodePrime, HSM2dNodePrime); - TSTALLOC(HSM2GPspPtr, HSM2gNodePrime, HSM2sNodePrime); - TSTALLOC(HSM2SspPtr, HSM2sNode, HSM2sNodePrime); - TSTALLOC(HSM2DPspPtr, HSM2dNodePrime, HSM2sNodePrime); - TSTALLOC(HSM2DPdPtr, HSM2dNodePrime, HSM2dNode); - TSTALLOC(HSM2DPgpPtr, HSM2dNodePrime, HSM2gNodePrime); - TSTALLOC(HSM2SPgpPtr, HSM2sNodePrime, HSM2gNodePrime); - TSTALLOC(HSM2SPsPtr, HSM2sNodePrime, HSM2sNode); +} + + TSTALLOC(HSM2DPbpPtr, HSM2dNodePrime, HSM2bNodePrime) + TSTALLOC(HSM2SPbpPtr, HSM2sNodePrime, HSM2bNodePrime) + TSTALLOC(HSM2GPbpPtr, HSM2gNodePrime, HSM2bNodePrime) + + TSTALLOC(HSM2BPdpPtr, HSM2bNodePrime, HSM2dNodePrime) + TSTALLOC(HSM2BPspPtr, HSM2bNodePrime, HSM2sNodePrime) + TSTALLOC(HSM2BPgpPtr, HSM2bNodePrime, HSM2gNodePrime) + TSTALLOC(HSM2BPbpPtr, HSM2bNodePrime, HSM2bNodePrime) + + TSTALLOC(HSM2DdPtr, HSM2dNode, HSM2dNode) + TSTALLOC(HSM2GPgpPtr, HSM2gNodePrime, HSM2gNodePrime) + TSTALLOC(HSM2SsPtr, HSM2sNode, HSM2sNode) + TSTALLOC(HSM2DPdpPtr, HSM2dNodePrime, HSM2dNodePrime) + TSTALLOC(HSM2SPspPtr, HSM2sNodePrime, HSM2sNodePrime) + TSTALLOC(HSM2DdpPtr, HSM2dNode, HSM2dNodePrime) + TSTALLOC(HSM2GPdpPtr, HSM2gNodePrime, HSM2dNodePrime) + TSTALLOC(HSM2GPspPtr, HSM2gNodePrime, HSM2sNodePrime) + TSTALLOC(HSM2SspPtr, HSM2sNode, HSM2sNodePrime) + TSTALLOC(HSM2DPspPtr, HSM2dNodePrime, HSM2sNodePrime) + TSTALLOC(HSM2DPdPtr, HSM2dNodePrime, HSM2dNode) + TSTALLOC(HSM2DPgpPtr, HSM2dNodePrime, HSM2gNodePrime) + TSTALLOC(HSM2SPgpPtr, HSM2sNodePrime, HSM2gNodePrime) + TSTALLOC(HSM2SPsPtr, HSM2sNodePrime, HSM2sNode) TSTALLOC(HSM2SPdpPtr, HSM2sNodePrime, HSM2dNodePrime); if ( here->HSM2_corg == 1 ) { @@ -866,9 +1005,9 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL 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_wgate = Wgate = here->HSM2_w / here->HSM2_nf + model->HSM2_xw ; - LG = Lgate * C_m2um ; + here->HSM2_lg = LG = Lgate * C_m2um ; here->HSM2_wg = WG = Wgate * C_m2um ; /* binning calculation */ @@ -957,7 +1096,9 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL RANGECHECK(pParam->HSM2_bgtmp1, 50.0e-6, 1.0e-3, "BGTMP1") ; RANGECHECK(pParam->HSM2_bgtmp2, -1.0e-6, 1.0e-6, "BGTMP2") ; RANGECHECK(pParam->HSM2_eg0, 1.0, 1.3, "EG0") ; - RANGECHECK(pParam->HSM2_vfbc, -1.2, 0.0, "VFBC") ; + if( model->HSM2_codep == 0 ) + { RANGECHECK(pParam->HSM2_vfbc, -1.2, 0.0, "VFBC") ; } + else { RANGECHECK(pParam->HSM2_vfbc, -1.2, 0.8, "VFBC") ; } RANGECHECK(pParam->HSM2_vfbover, -0.2, 0.2, "VFBOVER") ; RANGECHECK(pParam->HSM2_nsubc, 1.0e16, 1.0e19, "NSUBC") ; RANGECHECK(pParam->HSM2_nsubp, 1.0e16, 1.0e19, "NSUBP") ; @@ -970,7 +1111,7 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL RANGECHECK(pParam->HSM2_pgd1, 0.0, 50.0e-3, "PGD1") ; RANGECHECK(pParam->HSM2_ndep, 0.0, 1.0, "NDEP") ; RANGECHECK(pParam->HSM2_ninv, 0.0, 1.0, "NINV") ; - RANGECHECK(pParam->HSM2_muecb0, 100.0, 100.0e3, "MUECB0") ; + RANGECHECK(pParam->HSM2_muecb0, 10.0, 100.0e3, "MUECB0") ; RANGECHECK(pParam->HSM2_muecb1, 5.0, 1.0e4, "MUECB1") ; RANGECHECK(pParam->HSM2_mueph1, 2.0e3, 35.0e3, "MUEPH1") ; RANGECHECK(pParam->HSM2_vtmp, -5.0, 1.0, "VTMP") ; @@ -1006,8 +1147,8 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL pParam->HSM2_nsubpsti1 = pParam->HSM2_nsubpsti1 / C_m2cm ; pParam->HSM2_nsubcsti1 = pParam->HSM2_nsubcsti1 / C_m2cm ; pParam->HSM2_muesti1 = pParam->HSM2_muesti1 / C_m2cm ; - pParam->HSM2_ndep = pParam->HSM2_ndep / C_m2cm ; - pParam->HSM2_ninv = pParam->HSM2_ninv / C_m2cm ; + pParam->HSM2_ndep = pParam->HSM2_ndep ; + pParam->HSM2_ninv = pParam->HSM2_ninv ; pParam->HSM2_vmax = pParam->HSM2_vmax / C_m2cm ; pParam->HSM2_wfc = pParam->HSM2_wfc * C_m2cm_p2 ; @@ -1028,7 +1169,7 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL MINCHECK (model->HSM2_tox, 0.0, "TOX") ; RANGECHECK(model->HSM2_xld, 0.0, 50.0e-9, "XLD") ; RANGECHECK(model->HSM2_xwd, -10.0e-9, 100.0e-9, "XWD") ; - RANGECHECK(model->HSM2_rsh, 0.0, 200.0, "RSH") ; + RANGECHECK(model->HSM2_rsh, 0.0, 200.0, "RSH") ; /* fix in version 2.80 */ RANGECHECK(model->HSM2_rshg, 0.0, 100.0, "RSHG") ; RANGECHECK(model->HSM2_xqy, 10.0e-9, 50.0e-9, "XQY") ; RANGECHECK(model->HSM2_rs, 0.0, 10.0e-3, "RS") ; @@ -1046,7 +1187,7 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL RANGECHECK(model->HSM2_npext, 1.0e16, 1.0e18, "NPEXT") ; RANGECHECK(model->HSM2_scp21, 0.0, 5.0, "SCP21") ; RANGECHECK(model->HSM2_scp22, 0.0, 0.0, "SCP22") ; - RANGECHECK(model->HSM2_bs1, 0.0, 50.0e-3, "BS1") ; + RANGECHECK(model->HSM2_bs1, -1.0, 50.0e-3, "BS1") ; RANGECHECK(model->HSM2_bs2, 0.5, 1.0, "BS2") ; MINCHECK (model->HSM2_cgbo, 0.0, "CGBO") ; RANGECHECK(model->HSM2_clm5, 0.0, 2.0, "CLM5") ; @@ -1055,7 +1196,7 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL RANGECHECK(model->HSM2_voverp, 0.0, 2.0, "VOVERP") ; RANGECHECK(model->HSM2_qme1, 0.0, 300.0e-9, "QME1") ; RANGECHECK(model->HSM2_qme2, 1.0, 3.0, "QME2") ; - RANGECHECK(model->HSM2_qme3, 0.0, 1.0e-09, "QME3") ; + RANGECHECK(model->HSM2_qme3, 0.0, 1.0e-9, "QME3") ; RANGECHECK(model->HSM2_tnom, 22.0, 32.0, "TNOM") ; RANGECHECK(model->HSM2_ddltmax, 1.0, 20.0, "DDLTMAX") ; RANGECHECK(model->HSM2_ddltict, -3.0, 20.0, "DDLTICT") ; @@ -1094,6 +1235,8 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL modelMKS->HSM2_ovslp = model->HSM2_ovslp / C_m2cm ; modelMKS->HSM2_dly3 = model->HSM2_dly3 / C_m2cm_p2 ; + modelMKS->HSM2_ndepm = model->HSM2_ndepm / C_cm2m_p3 ; + /*-----------------------------------------------------------* * Change unit into Kelvin. *-----------------*/ diff --git a/src/spicelib/devices/hisim2/hsm2temp.c b/src/spicelib/devices/hisim2/hsm2temp.c index c8b344300..eb61bf37c 100644 --- a/src/spicelib/devices/hisim2/hsm2temp.c +++ b/src/spicelib/devices/hisim2/hsm2temp.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2temp.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/smpdefs.h" #include "ngspice/cktdefs.h" @@ -60,6 +99,15 @@ y = ( xmin ) + 0.5 * ( T1 + T2 ) ; \ } +/*===========================================================* +* pow +*=================*/ +#ifdef POW_TO_EXP_AND_LOG +#define Fn_Pow( x , y ) ( (x==0.0) ? 0.0 : exp( (y) * log( x ) ) ) +#else +#define Fn_Pow( x , y ) ( (x==0.0) ? 0.0 : pow( x , y ) ) +#endif + int HSM2temp( GENmodel *inModel, CKTcircuit *ckt) @@ -77,9 +125,11 @@ int HSM2temp( double MUEPLD = 0.0 ; double GDLD = 0.0 ; double T1, T2, T3 ; + const double small = 1.0e-50 ; /* temperature-dependent variables */ double Eg ,TTEMP, beta, Nin; double js, jssw, js2, jssw2 ; + double Tratio ; int i; /* declarations for the sc3 clamping part */ @@ -99,11 +149,11 @@ int HSM2temp( pParam = &here->pParam ; hereMKS = &here->hereMKS ; - here->HSM2_lgate = Lgate = here->HSM2_l + model->HSM2_xl ; - Wgate = here->HSM2_w / here->HSM2_nf + model->HSM2_xw ; + Lgate = here->HSM2_lgate ; + Wgate = here->HSM2_wgate ; - LG = Lgate * C_m2um ; - here->HSM2_wg = WG = Wgate * C_m2um ; + LG = here->HSM2_lg ; + WG = here->HSM2_wg ; WL = WG * LG ; MUEPWD = model->HSM2_muepwd * C_m2um ; MUEPLD = model->HSM2_muepld * C_m2um ; @@ -139,7 +189,7 @@ int HSM2temp( (here->HSM2_nf > 1.0 && here->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 + T1 = 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)); @@ -157,10 +207,10 @@ int HSM2temp( /* DFM */ if ( model->HSM2_codfm == 1 && here->HSM2_nsubcdfm_Given ) { RANGECHECK(here->HSM2_nsubcdfm, 1.0e16, 1.0e19, "NSUBCDFM") ; - here->HSM2_mueph1 *= here->HSM2_mphdfm - * ( log(hereMKS->HSM2_nsubcdfm) - log(here->HSM2_nsubc) ) + 1.0 ; - here->HSM2_nsubp += hereMKS->HSM2_nsubcdfm - here->HSM2_nsubc ; - Npext += hereMKS->HSM2_nsubcdfm - here->HSM2_nsubc ; + here->HSM2_mueph1 = here->HSM2_mueph1 * ( here->HSM2_mphdfm + * ( log(hereMKS->HSM2_nsubcdfm) - log(here->HSM2_nsubc) ) + 1.0 ) ; + here->HSM2_nsubp = here->HSM2_nsubp + hereMKS->HSM2_nsubcdfm - here->HSM2_nsubc ; + Npext = Npext + hereMKS->HSM2_nsubcdfm - here->HSM2_nsubc ; here->HSM2_nsubc = hereMKS->HSM2_nsubcdfm ; } @@ -169,19 +219,19 @@ int HSM2temp( ( here->HSM2_sca + model->HSM2_web * here->HSM2_scb + model->HSM2_wec * here->HSM2_scc ) ; - here->HSM2_nsubc += T0 ; + here->HSM2_nsubc = here->HSM2_nsubc + T0 ; Fn_SLtemp( here->HSM2_nsubc , here->HSM2_nsubc , Nsubmin , Nsubmin_dlt ) ; T0 = modelMKS->HSM2_nsubpwpe * ( here->HSM2_sca + model->HSM2_web * here->HSM2_scb + model->HSM2_wec * here->HSM2_scc ) ; - here->HSM2_nsubp += T0 ; + here->HSM2_nsubp = here->HSM2_nsubp + T0 ; Fn_SLtemp( here->HSM2_nsubp , here->HSM2_nsubp , Nsubmin , Nsubmin_dlt ) ; T0 = modelMKS->HSM2_npextwpe * ( here->HSM2_sca + model->HSM2_web * here->HSM2_scb + model->HSM2_wec * here->HSM2_scc ) ; - Npext += T0 ; + Npext = Npext + T0 ; Fn_SLtemp( Npext , Npext , Nsubmin , Nsubmin_dlt ) ; /* WPE end */ @@ -221,6 +271,9 @@ int HSM2temp( / C_ESI ; here->HSM2_ninv_o_esi = pParam->HSM2_ninv / C_ESI ; + /* LG dependence of NINVD */ + here->HSM2_ninvd = model->HSM2_ninvd * ( 1.0 + (model->HSM2_ninvdl / pow( LG, model->HSM2_ninvdlp))); + /* Metallurgical channel geometry */ dL = model->HSM2_xld + (modelMKS->HSM2_ll / pow (Lgate + model->HSM2_lld, model->HSM2_lln)) ; @@ -229,11 +282,15 @@ int HSM2temp( Leff = Lgate - 2.0e0 * dL ; if ( Leff <= 1.0e-9 ) { - SPfrontEnd->IFerrorf + IFuid namarr[2]; + namarr[0] = model->HSM2modName; + namarr[1] = here->HSM2name; + (*(SPfrontEnd->IFerror)) ( ERR_FATAL, "HiSIM2: MOSFET(%s) MODEL(%s): effective channel length is smaller than 1nm", - model->HSM2modName, here->HSM2name); + namarr + ); return (E_BADPARM); } here->HSM2_leff = Leff ; @@ -249,11 +306,15 @@ int HSM2temp( here->HSM2_weff = Weff = Wgate - 2.0e0 * dW ; if ( Weff <= 0.0 ) { - SPfrontEnd->IFerrorf + IFuid namarr[2]; + namarr[0] = model->HSM2modName; + namarr[1] = here->HSM2name; + (*(SPfrontEnd->IFerror)) ( ERR_FATAL, "HiSIM2: MOSFET(%s) MODEL(%s): effective channel width is negative or 0", - model->HSM2modName, here->HSM2name); + namarr + ); return (E_BADPARM); } here->HSM2_weff_nf = Weff * here->HSM2_nf ; @@ -264,7 +325,7 @@ 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 , model->HSM2_nsubpdlt ) ; Fn_SLtemp( T1 , T1 , model->HSM2_nsubpfac , model->HSM2_nsubpdlt ) ; - here->HSM2_nsubp *= T1 ; + here->HSM2_nsubp = here->HSM2_nsubp * T1 ; } /* Note: Sign Changed --> */ @@ -282,11 +343,11 @@ int HSM2temp( } T2 = 1.0e0 + ( model->HSM2_nsubcw / pow ( WG, model->HSM2_nsubcwp )) ; - T2 *= 1.0e0 + ( model->HSM2_nsubcw2 / pow ( WG, model->HSM2_nsubcwp2 )) ; + T2 = T2 * ( 1.0e0 + ( model->HSM2_nsubcw2 / pow ( WG, model->HSM2_nsubcwp2 )) ) ; T3 = modelMKS->HSM2_nsubcmax / here->HSM2_nsubc ; Fn_SUtemp( T1 , T2 , T3 , 0.01 ) ; - here->HSM2_nsubc *= T1 ; + here->HSM2_nsubc = here->HSM2_nsubc * T1 ; if (Lod_half > 0.0) { T1 = 1.0e0 / (1.0e0 + pParam->HSM2_nsubcsti2) ; @@ -300,7 +361,7 @@ int HSM2temp( fprintf ( stderr , " The model parameter NSUBCW/NSUBCWP and/or NSUBCW2/NSUBCW2P might be wrong.\n" ) ; here->HSM2_nsubc = 1e15 / C_cm2m_p3 ; } - if(model->HSM2_coerrrep && (Npext < here->HSM2_nsubc || Npext > here->HSM2_nsubp)) { + if( (model->HSM2_codep==0) && model->HSM2_coerrrep && (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,here->HSM2_nsubc,here->HSM2_nsubp); fprintf ( stderr , " The model parameter NPEXTW and/or NPEXTWP might be wrong.\n" ) ; @@ -373,18 +434,18 @@ int HSM2temp( /* Process source/drain series resistamce */ here->HSM2_rd = 0.0; if ( model->HSM2_rsh > 0.0 ) { - here->HSM2_rd += model->HSM2_rsh * here->HSM2_nrd ; + here->HSM2_rd = 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 ; + here->HSM2_rd = here->HSM2_rd + model->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 ; + here->HSM2_rs = 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 ; + here->HSM2_rs = here->HSM2_rs + model->HSM2_rs / here->HSM2_weff_nf ; } if (model->HSM2_corsrd < 0) { @@ -436,8 +497,13 @@ int HSM2temp( } /* Vdseff */ - T1 = model->HSM2_ddltslp * LG + model->HSM2_ddltict ; - here->HSM2_ddlt = T1 * model->HSM2_ddltmax / ( T1 + model->HSM2_ddltmax ) + 1.0 ; + if ( model->HSM2_coddlt == 0 ) { + T1 = model->HSM2_ddltslp * LG + model->HSM2_ddltict ; + here->HSM2_ddlt = T1 * model->HSM2_ddltmax / ( T1 + model->HSM2_ddltmax ) + 1.0 ; + } else { /* fix in version 2.80 */ + T1 = model->HSM2_ddltslp * LG ; + here->HSM2_ddlt = T1 * model->HSM2_ddltmax / ( T1 + model->HSM2_ddltmax ) + model->HSM2_ddltict + small ; + } /* Isub */ T2 = pow( Weff , model->HSM2_svgswp ) ; @@ -508,13 +574,15 @@ int HSM2temp( here->HSM2_beta2 = beta * beta ; here->HSM2_betatnom = C_QE / (C_KB * model->HSM2_ktnom) ; + Tratio = TTEMP / model->HSM2_ktnom ; + /* Intrinsic carrier concentration */ - here->HSM2_nin = Nin = C_Nin0 * pow (TTEMP / model->HSM2_ktnom, 1.5e0) + here->HSM2_nin = Nin = C_Nin0 * pow (Tratio, 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_ktnom, pParam->HSM2_muetmp) ; + T1 = pow (Tratio, pParam->HSM2_muetmp) ; here->HSM2_mphn0 = T1 / here->HSM2_mueph ; here->HSM2_mphn1 = here->HSM2_mphn0 * model->HSM2_mueph0 ; @@ -524,30 +592,79 @@ int HSM2temp( /* Velocity Temperature Dependence */ - 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)) ; + / (1.8 + 0.4 * Tratio + 0.1 * Tratio * Tratio - pParam->HSM2_vtmp * (1.0e0 - Tratio)) ; /* Coefficient of the F function for bulk charge */ - here->HSM2_cnst0 = sqrt ( 2.0 * C_ESI * C_QE * here->HSM2_nsub / beta ) ; - here->HSM2_cnst0over = here->HSM2_cnst0 * sqrt( pParam->HSM2_nover / here->HSM2_nsub ) ; + /* Depletion mode MOSFET */ + if( model->HSM2_codep ) { + T3 = pow(here->HSM2_lg,model->HSM2_ndepmlp) ; + here->HSM2_ndepm = modelMKS->HSM2_ndepm * ( 1.0 + model->HSM2_ndepml / T3 ); + if ( here->HSM2_ndepm < 1e+21 ) { here->HSM2_ndepm = 1e+21 ; } + here->HSM2_Pb2n = 2.0/beta*log(here->HSM2_ndepm/Nin) ; + here->HSM2_Vbipn = 1.0/beta*log(here->HSM2_ndepm*here->HSM2_nsub/Nin/Nin) ; + here->HSM2_cnst0 = sqrt ( 2.0 * C_ESI * C_QE * here->HSM2_ndepm / beta ) ; + here->HSM2_cnst1 = Nin*Nin/here->HSM2_ndepm/here->HSM2_ndepm ; + + T1 = Fn_Pow(Tratio, model->HSM2_depmuetmp) ; + here->HSM2_depmphn0 = T1 / model->HSM2_depmueph1 ; + here->HSM2_depmphn1 = here->HSM2_depmphn0 * model->HSM2_depmueph0 ; +// T0 = 1.8 + 0.4 * Tratio + 0.1 * Tratio * Tratio - model->HSM2_depvtmp * ( 1.0 - Tratio ) ; + T0 = 1.0 ; // ignore DEPVTMP in HiSIM2 + here->HSM2_depvmax = model->HSM2_depvmax / T0 / C_m2cm ; + + // LG dependence DEPVMAX + T3 = pow( here->HSM2_lg, model->HSM2_depvmaxlp ) ; + here->HSM2_depvmax = here->HSM2_depvmax * ( 1.0 + model->HSM2_depvmaxl / T3 ) ; + if( here->HSM2_depvmax < 0.0 ) { here->HSM2_depvmax = 0.0; } + + // LG dependence DEPLEAK + T3 = pow( here->HSM2_lg, model->HSM2_depleaklp ) ; + here->HSM2_depleak = model->HSM2_depleak * ( 1.0 + model->HSM2_depleakl / T3 ) ; + if( here->HSM2_depleak < 0.0 ) { here->HSM2_depleak = 0.0; } + + // LG dependence DEPMUE0 & DEPMUE1 + T3 = pow( here->HSM2_lg, model->HSM2_depmue0lp ) ; + here->HSM2_depmue0 = model->HSM2_depmue0 * ( 1.0 + model->HSM2_depmue0l / T3 ) ; + if( here->HSM2_depmue0 < 1.0 ) { here->HSM2_depmue0 = 1.0; } + T3 = pow( here->HSM2_lg, model->HSM2_depmue1lp ) ; + here->HSM2_depmue1 = model->HSM2_depmue1 * ( 1.0 + model->HSM2_depmue1l / T3 ) ; + if( here->HSM2_depmue1 < 0.0 ) { here->HSM2_depmue1 = 0.0; } + + // LG dependence DEPMUEBACK0 & DEPMUEBACK1 + T3 = pow( here->HSM2_lg, model->HSM2_depmueback0lp ) ; + here->HSM2_depmueback0 = model->HSM2_depmueback0 * ( 1.0 + model->HSM2_depmueback0l / T3 ) ; + if( here->HSM2_depmueback0 < 0.0 ) { here->HSM2_depmueback0 = 0.0; } + T3 = pow( here->HSM2_lg, model->HSM2_depmueback1lp ) ; + here->HSM2_depmueback1 = model->HSM2_depmueback1 * ( 1.0 + model->HSM2_depmueback1l / T3 ) ; + if( here->HSM2_depmueback1 < 0.0 ) { here->HSM2_depmueback1 = 0.0; } + + // LG dependence DEPVDSEF1 & DEPVDSEF2 + T3 = pow( here->HSM2_lg, model->HSM2_depvdsef1lp ) ; + here->HSM2_depvdsef1 = model->HSM2_depvdsef1 * ( 1.0 + model->HSM2_depvdsef1l / T3 ) ; + if( here->HSM2_depvdsef1 < 0.0 ) { here->HSM2_depvdsef1 = 0.0; } + T3 = pow( here->HSM2_lg, model->HSM2_depvdsef2lp ) ; + here->HSM2_depvdsef2 = model->HSM2_depvdsef2 * ( 1.0 + model->HSM2_depvdsef2l / T3 ) ; + if( here->HSM2_depvdsef2 < 0.1 ) { here->HSM2_depvdsef2 = 0.1; } + + } else { + /* Normal mode MOSFET */ + here->HSM2_cnst0 = sqrt ( 2.0 * C_ESI * C_QE * here->HSM2_nsub / beta ) ; + /* cnst1: n_{p0} / p_{p0} */ + T1 = Nin / here->HSM2_nsub ; + here->HSM2_cnst1 = T1 * T1 ; + } /* 2 phi_B (temperature-dependent) */ /* @temp, with pocket */ here->HSM2_pb2 = 2.0e0 / beta * log (here->HSM2_nsub / Nin) ; if ( pParam->HSM2_nover != 0.0) { 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 ; - T2 = pParam->HSM2_nover / Nin ; - T1 = T2 * T2 / ( T1 * T1 ) ; - here->HSM2_ps0ldinib = T1 ; /* (1 / cnst1 / cnstCoxi) */ - + here->HSM2_cnst0over = sqrt ( 2.0 * C_ESI * C_QE * pParam->HSM2_nover / beta ) ; }else { here->HSM2_pb2over = 0.0 ; - here->HSM2_ps0ldinib = 0.0 ; + here->HSM2_cnst0over = 0.0 ; } @@ -556,25 +673,21 @@ int HSM2temp( here->HSM2_wdpl = sqrt ( T1 / here->HSM2_nsub ) ; here->HSM2_wdplp = sqrt( T1 / ( here->HSM2_nsubp ) ) ; - /* cnst1: n_{p0} / p_{p0} */ - T1 = Nin / here->HSM2_nsub ; - here->HSM2_cnst1 = T1 * T1 ; - /* 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_ktnom)) / pParam->HSM2_nj) ; + + model->HSM2_xti * log (Tratio)) / pParam->HSM2_nj) ; jssw = pParam->HSM2_js0sw * exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta - + model->HSM2_xti * log (TTEMP / model->HSM2_ktnom)) / model->HSM2_njsw) ; + + model->HSM2_xti * log (Tratio)) / model->HSM2_njsw) ; js2 = pParam->HSM2_js0 * exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta - + model->HSM2_xti2 * log (TTEMP / model->HSM2_ktnom)) / pParam->HSM2_nj) ; + + model->HSM2_xti2 * log (Tratio)) / pParam->HSM2_nj) ; jssw2 = pParam->HSM2_js0sw * exp ((here->HSM2_egtnom * here->HSM2_betatnom - Eg * beta - + model->HSM2_xti2 * log (TTEMP / model->HSM2_ktnom)) / model->HSM2_njsw) ; + + model->HSM2_xti2 * log (Tratio)) / 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 ; @@ -582,13 +695,13 @@ int HSM2temp( here->HSM2_isbs2 = here->HSM2_as * js2 + here->HSM2_ps * jssw2 ; here->HSM2_vbdt = pParam->HSM2_nj / beta - * log (pParam->HSM2_vdiffj * (TTEMP / model->HSM2_ktnom) * (TTEMP / model->HSM2_ktnom) + * log (pParam->HSM2_vdiffj * (Tratio) * (Tratio) / (here->HSM2_isbd + 1.0e-50) + 1) ; here->HSM2_vbst = pParam->HSM2_nj / beta - * log (pParam->HSM2_vdiffj * (TTEMP / model->HSM2_ktnom) * (TTEMP / model->HSM2_ktnom) + * log (pParam->HSM2_vdiffj * (Tratio) * (Tratio) / (here->HSM2_isbs + 1.0e-50) + 1) ; - here->HSM2_exptemp = exp (((TTEMP / model->HSM2_ktnom) - 1) * model->HSM2_ctemp) ; + here->HSM2_exptemp = exp (((Tratio) - 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 ) ; diff --git a/src/spicelib/devices/hisim2/hsm2trunc.c b/src/spicelib/devices/hisim2/hsm2trunc.c index 4eb9e7fc0..ea27086ac 100644 --- a/src/spicelib/devices/hisim2/hsm2trunc.c +++ b/src/spicelib/devices/hisim2/hsm2trunc.c @@ -1,20 +1,59 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM - ( VERSION : 2 SUBVERSION : 7 REVISION : 0 ) Beta + ( VERSION : 2 SUBVERSION : 8 REVISION : 0 ) FILE : hsm2trunc.c - Date : 2012.10.25 + Date : 2014.6.5 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HiSIM2 Distribution Statement and +Copyright Notice" attached to HiSIM2 model. + +-----HiSIM2 Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaim all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + + +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/cktdefs.h" #include "hsm2def.h" @@ -25,7 +64,6 @@ int HSM2trunc( GENmodel *inModel, CKTcircuit *ckt, double *timeStep) - { HSM2model *model = (HSM2model*)inModel; HSM2instance *here;