From c2ef7aeff3e0a2179402a2f88c8a8cff22130bdf Mon Sep 17 00:00:00 2001 From: dwarning Date: Wed, 25 Mar 2015 06:47:32 +0100 Subject: [PATCH] update hisimhv model to version 2.2.0 --- src/spicelib/devices/hisimhv1/Makefile.am | 5 + src/spicelib/devices/hisimhv1/hisimhv.h | 71 +- src/spicelib/devices/hisimhv1/hsmhv.c | 223 +- src/spicelib/devices/hisimhv1/hsmhvacld.c | 50 +- src/spicelib/devices/hisimhv1/hsmhvask.c | 56 +- src/spicelib/devices/hisimhv1/hsmhvcvtest.c | 50 +- src/spicelib/devices/hisimhv1/hsmhvdef.h | 641 +- src/spicelib/devices/hisimhv1/hsmhvdel.c | 50 +- src/spicelib/devices/hisimhv1/hsmhvdest.c | 50 +- src/spicelib/devices/hisimhv1/hsmhveval.c | 5458 ++++++++--------- src/spicelib/devices/hisimhv1/hsmhveval_dep.h | 2432 ++++++++ src/spicelib/devices/hisimhv1/hsmhveval_dio.c | 600 ++ .../devices/hisimhv1/hsmhveval_qover.h | 97 +- .../devices/hisimhv1/hsmhveval_rdrift.c | 656 ++ src/spicelib/devices/hisimhv1/hsmhvevalenv.h | 59 +- src/spicelib/devices/hisimhv1/hsmhvext.h | 8 +- src/spicelib/devices/hisimhv1/hsmhvgetic.c | 50 +- src/spicelib/devices/hisimhv1/hsmhvitf.h | 50 +- src/spicelib/devices/hisimhv1/hsmhvld.c | 498 +- .../devices/hisimhv1/hsmhvld_info_eval.h | 50 +- src/spicelib/devices/hisimhv1/hsmhvmask.c | 488 +- src/spicelib/devices/hisimhv1/hsmhvmdel.c | 50 +- src/spicelib/devices/hisimhv1/hsmhvmpar.c | 623 +- src/spicelib/devices/hisimhv1/hsmhvnoi.c | 73 +- src/spicelib/devices/hisimhv1/hsmhvpar.c | 50 +- src/spicelib/devices/hisimhv1/hsmhvpzld.c | 58 +- src/spicelib/devices/hisimhv1/hsmhvset.c | 608 +- src/spicelib/devices/hisimhv1/hsmhvtemp.c | 129 +- .../devices/hisimhv1/hsmhvtemp_eval.h | 262 +- .../devices/hisimhv1/hsmhvtemp_eval_dio.h | 223 + .../devices/hisimhv1/hsmhvtemp_eval_rdri.h | 103 + src/spicelib/devices/hisimhv1/hsmhvtrunc.c | 55 +- visualc/vngspice_fftw_vc10.vcxproj | 5 + 33 files changed, 10247 insertions(+), 3634 deletions(-) create mode 100644 src/spicelib/devices/hisimhv1/hsmhveval_dep.h create mode 100644 src/spicelib/devices/hisimhv1/hsmhveval_dio.c create mode 100644 src/spicelib/devices/hisimhv1/hsmhveval_rdrift.c create mode 100644 src/spicelib/devices/hisimhv1/hsmhvtemp_eval_dio.h create mode 100644 src/spicelib/devices/hisimhv1/hsmhvtemp_eval_rdri.h diff --git a/src/spicelib/devices/hisimhv1/Makefile.am b/src/spicelib/devices/hisimhv1/Makefile.am index 44b121f18..37713c676 100644 --- a/src/spicelib/devices/hisimhv1/Makefile.am +++ b/src/spicelib/devices/hisimhv1/Makefile.am @@ -11,7 +11,10 @@ libhisimhv1_la_SOURCES = hisimhv.h \ hsmhvdel.c \ hsmhvdest.c \ hsmhveval.c \ + hsmhveval_dep.h \ + hsmhveval_dio.c \ hsmhveval_qover.h \ + hsmhveval_rdrift.c \ hsmhvevalenv.h \ hsmhvext.h \ hsmhvgetic.c \ @@ -30,6 +33,8 @@ libhisimhv1_la_SOURCES = hisimhv.h \ hsmhvsoachk.c \ hsmhvtemp.c \ hsmhvtemp_eval.h \ + hsmhvtemp_eval_dio.h \ + hsmhvtemp_eval_rdri.h \ hsmhvtrunc.c AM_CPPFLAGS = @AM_CPPFLAGS@ -I$(top_srcdir)/src/include diff --git a/src/spicelib/devices/hisimhv1/hisimhv.h b/src/spicelib/devices/hisimhv1/hisimhv.h index 8a4ce50b8..e4de570ba 100644 --- a/src/spicelib/devices/hisimhv1/hisimhv.h +++ b/src/spicelib/devices/hisimhv1/hisimhv.h @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hisimhv.h - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "hsmhvdef.h" #include "ngspice/cktdefs.h" @@ -68,10 +110,31 @@ extern int HSMHVevaluate double vbs_jct, double vbd_jct, double vsubs, + double vddp, double deltemp, HSMHVinstance *here, HSMHVmodel *model, CKTcircuit *ckt ) ; +extern int HSMHVrdrift +( + double vddp, + double ivds, + double ivbs, + double vsubs, + double deltemp, + HSMHVinstance *here, + HSMHVmodel *model, + CKTcircuit *ckt + ) ; +extern int HSMHVdio +( + double vbs_jct, + double vbd_jct, + double deltemp, + HSMHVinstance *here, + HSMHVmodel *model, + CKTcircuit *ckt + ) ; #endif /* _HiSIMHV_H */ diff --git a/src/spicelib/devices/hisimhv1/hsmhv.c b/src/spicelib/devices/hisimhv1/hsmhv.c index f94803ab8..3d1640e95 100644 --- a/src/spicelib/devices/hisimhv1/hsmhv.c +++ b/src/spicelib/devices/hisimhv1/hsmhv.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_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhv.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by @@ -16,6 +16,48 @@ Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/devdefs.h" #include "hsmhvdef.h" @@ -64,6 +106,8 @@ IFparm HSMHVpTable[] = { /* parameters */ /* Output Physical Values: */ OP ( "ids", HSMHV_CD, IF_REAL , "Ids"), /* Drain-Source current */ OP ( "isub", HSMHV_ISUB, IF_REAL , "Isub"), /* Substrate current */ + OP ( "isubld", HSMHV_ISUBLD, IF_REAL , "IsubLD"), /* Substrate current */ + OP ( "idsibpc", HSMHV_IDSIBPC, IF_REAL , "IdsIBPC"), /* Impact-Ionization Induced Bulk Potential Change (IBPC)*/ OP ( "igidl", HSMHV_IGIDL, IF_REAL , "Igidl"), /* Gate-Induced Drain Leakage current */ OP ( "igisl", HSMHV_IGISL, IF_REAL , "Igisl"), /* Gate-Induced Source Leakage current */ OP ( "igd", HSMHV_IGD, IF_REAL , "Igd"), /* Gate-Drain current */ @@ -124,11 +168,15 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("coign", HSMHV_MOD_COIGN, IF_INTEGER, "Calculate induced gate noise"), IOP("codfm", HSMHV_MOD_CODFM, IF_INTEGER, "Calculation of model for DFM"), IOP("coqovsm", HSMHV_MOD_COQOVSM, IF_INTEGER, "select smoothing method of Qover"), - IOP("coselfheat", HSMHV_MOD_COSELFHEAT, IF_INTEGER, "Calculation of self heating model"), + IOP("coselfheat", HSMHV_MOD_COSELFHEAT, IF_INTEGER, "Calculation of self heating model"), IOP("cosubnode", HSMHV_MOD_COSUBNODE, IF_INTEGER, "Switch tempNode to subNode"), IOP("cosym", HSMHV_MOD_COSYM, IF_INTEGER, "Model selector for symmetry device"), IOP("cotemp", HSMHV_MOD_COTEMP, IF_INTEGER, "Model flag for temperature dependence"), IOP("coldrift", HSMHV_MOD_COLDRIFT, IF_INTEGER, "selector for Ldrift parameter"), + IOP("cordrift", HSMHV_MOD_CORDRIFT, IF_INTEGER, ""), + IOP("coerrrep", HSMHV_MOD_COERRREP, IF_INTEGER, "selector for error report"), + IOP("codep", HSMHV_MOD_CODEP, IF_INTEGER, "selector for depletion device"), + IOP("coddlt", HSMHV_MOD_CODDLT, IF_INTEGER, "selector for DDLT model"), IOP("vbsmin", HSMHV_MOD_VBSMIN, IF_REAL, "Minimum back bias voltage to be treated in hsmhveval [V]"), @@ -157,7 +205,12 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("ldrift1s", HSMHV_MOD_LDRIFT1S, IF_REAL, "Drift region length-1 on the source side[m]"), IOP("ldrift2s", HSMHV_MOD_LDRIFT2S, IF_REAL, "Drift region length-2 on the source side[m]"), IOP("subld1", HSMHV_MOD_SUBLD1, IF_REAL, "Impact-ionization current in the drift region [-]"), + IOP("subld1l", HSMHV_MOD_SUBLD1L, IF_REAL, "Impact-ionization current in the drift region [um^{subld1lp}]"), + IOP("subld1lp", HSMHV_MOD_SUBLD1LP, IF_REAL, "Impact-ionization current in the drift region [-]"), IOP("subld2", HSMHV_MOD_SUBLD2, IF_REAL, "Impact-ionization current in the drift region [m^{-1}*V^{3/2}]"), + IOP("xpdv", HSMHV_MOD_XPDV, IF_REAL, "Impact-ionization current in the drift region [m^{-1}]"), + IOP("xpvdth", HSMHV_MOD_XPVDTH, IF_REAL, "Impact-ionization current in the drift region [V]"), + IOP("xpvdthg", HSMHV_MOD_XPVDTHG, IF_REAL, "Impact-ionization current in the drift region [V^{-1}]"), IOP("ddltmax", HSMHV_MOD_DDLTMAX, IF_REAL, ""), /* Vdseff */ IOP("ddltslp", HSMHV_MOD_DDLTSLP, IF_REAL, ""), /* Vdseff */ IOP("ddltict", HSMHV_MOD_DDLTICT, IF_REAL, ""), /* Vdseff */ @@ -204,7 +257,7 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("sc4", HSMHV_MOD_SC4, IF_REAL, "Parameter for SCE [1/V]"), IOP("pgd1", HSMHV_MOD_PGD1, IF_REAL, "Parameter for gate-poly depletion [V]"), IOP("pgd2", HSMHV_MOD_PGD2, IF_REAL, "Parameter for gate-poly depletion [V]"), - IOP("pgd3", HSMHV_MOD_PGD3, IF_REAL, "Parameter for gate-poly depletion [-]"), +//IOP("pgd3", HSMHV_MOD_PGD3, IF_REAL, "Parameter for gate-poly depletion [-]"), IOP("pgd4", HSMHV_MOD_PGD4, IF_REAL, "Parameter for gate-poly depletion [-]"), IOP("ndep", HSMHV_MOD_NDEP, IF_REAL, "Coeff. of Qbm for Eeff [-]"), IOP("ndepl", HSMHV_MOD_NDEPL, IF_REAL, "Coeff. of Qbm for Eeff [-]"), @@ -302,7 +355,7 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("cvb", HSMHV_MOD_CVB, IF_REAL, "Bias dependence coefficient of cisb [-]"), IOP("ctemp", HSMHV_MOD_CTEMP, IF_REAL, "Temperature coefficient [-]"), IOP("cisbk", HSMHV_MOD_CISBK, IF_REAL, "Reverse bias saturation current [A]"), - IOP("cvbk", HSMHV_MOD_CVBK, IF_REAL, "Bias dependence coefficient of cisb [-]"), + IOP("cvbk", HSMHV_MOD_CVBK, IF_REAL, "Inactived by CVB "), IOP("divx", HSMHV_MOD_DIVX, IF_REAL, " [1/V]"), IOP("clm1", HSMHV_MOD_CLM1, IF_REAL, "Parameter for CLM [-]"), @@ -350,7 +403,7 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("cit", HSMHV_MOD_CIT, IF_REAL, ""), IOP("falph", HSMHV_MOD_FALPH, IF_REAL, "Parameter for 1/f noise"), IOP("kappa", HSMHV_MOD_KAPPA, IF_REAL, "Dielectric constant for high-k stacked gate"), - IOP("pthrou", HSMHV_MOD_PTHROU, IF_REAL, "Modify subthreshold slope [-]"), +//IOP("pthrou", HSMHV_MOD_PTHROU, IF_REAL, "Modify subthreshold slope [-]"), IOP("vdiffj", HSMHV_MOD_VDIFFJ, IF_REAL, "Threshold voltage for S/D junction diode [V]"), IOP("dly1", HSMHV_MOD_DLY1, IF_REAL, "Parameter for transit time [-]"), IOP("dly2", HSMHV_MOD_DLY2, IF_REAL, "Parameter for transit time [-]"), @@ -368,10 +421,23 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("rbsb", HSMHV_MOD_RBSB, IF_REAL, ""), IOP("ibpc1", HSMHV_MOD_IBPC1, IF_REAL, "Parameter for impact-ionization induced bulk potential change"), + IOP("ibpc1l", HSMHV_MOD_IBPC1L, IF_REAL, "Parameter for impact-ionization induced bulk potential change"), + IOP("ibpc1lp", HSMHV_MOD_IBPC1LP, IF_REAL, "Parameter for impact-ionization induced bulk potential change"), IOP("ibpc2", HSMHV_MOD_IBPC2, IF_REAL, "Parameter for impact-ionization induced bulk potential change"), IOP("mphdfm", HSMHV_MOD_MPHDFM, IF_REAL, "NSUBCDFM dependence of phonon scattering for DFM"), + + IOP("ptl", HSMHV_MOD_PTL, IF_REAL, ""), + IOP("ptp", HSMHV_MOD_PTP, IF_REAL, ""), + IOP("pt2", HSMHV_MOD_PT2, IF_REAL, ""), + IOP("ptlp", HSMHV_MOD_PTLP, IF_REAL, ""), + IOP("gdl", HSMHV_MOD_GDL, IF_REAL, ""), + IOP("gdlp", HSMHV_MOD_GDLP, IF_REAL, ""), + + IOP("gdld", HSMHV_MOD_GDLD, IF_REAL, ""), + IOP("pt4", HSMHV_MOD_PT4, IF_REAL, ""), + IOP("pt4p", HSMHV_MOD_PT4P, IF_REAL, ""), IOP("rdvg11", HSMHV_MOD_RDVG11, IF_REAL, ""), IOP("rdvg12", HSMHV_MOD_RDVG12, IF_REAL, ""), IOP("rth0", HSMHV_MOD_RTH0, IF_REAL, "Thermal resistance"), /* Self-heating model --SHE---*/ @@ -400,7 +466,6 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("rd23", HSMHV_MOD_RD23, IF_REAL, ""), IOP("rd24", HSMHV_MOD_RD24, IF_REAL, ""), IOP("rd25", HSMHV_MOD_RD25, IF_REAL, ""), - IOP("rd26", HSMHV_MOD_RD26, IF_REAL, "alias for qovsm"), IOP("rdvdl", HSMHV_MOD_RDVDL, IF_REAL, ""), IOP("rdvdlp", HSMHV_MOD_RDVDLP, IF_REAL, ""), IOP("rdvds", HSMHV_MOD_RDVDS, IF_REAL, ""), @@ -411,8 +476,8 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("rd23sp", HSMHV_MOD_RD23SP, IF_REAL, ""), IOP("rds", HSMHV_MOD_RDS, IF_REAL, ""), IOP("rdsp", HSMHV_MOD_RDSP, IF_REAL, ""), - IOP("qovsm", HSMHV_MOD_QOVSM, IF_REAL, "Smoothing Qover at depletion/inversion transition"), - IOP("ldrift", HSMHV_MOD_LDRIFT, IF_REAL, "alias for ldrift2"), +//IOP("qovsm", HSMHV_MOD_QOVSM, IF_REAL, "Smoothing Qover at depletion/inversion transition"), +// IOP("ldrift", HSMHV_MOD_LDRIFT, IF_REAL, "alias for ldrift2"), IOP("rdtemp1", HSMHV_MOD_RDTEMP1, IF_REAL, "Temperature-dependence of Rd"), IOP("rdtemp2", HSMHV_MOD_RDTEMP2, IF_REAL, "Temperature-dependence of Rd"), IOP("rth0r", HSMHV_MOD_RTH0R, IF_REAL, "Heat radiation for SHE"), /* not used */ @@ -428,7 +493,95 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("ddrift", HSMHV_MOD_DDRIFT, IF_REAL, "model parameter for the substrate effect"), IOP("vbisub", HSMHV_MOD_VBISUB, IF_REAL, "model parameter for the substrate effect"), IOP("nsubsub", HSMHV_MOD_NSUBSUB, IF_REAL, "model parameter for the substrate effect"), + + IOP("rdrmue", HSMHV_MOD_RDRMUE, IF_REAL, ""), + IOP("rdrvmax", HSMHV_MOD_RDRVMAX, IF_REAL, ""), + IOP("rdrmuetmp", HSMHV_MOD_RDRMUETMP, IF_REAL, ""), + IOP("ndepm", HSMHV_MOD_NDEPM, IF_REAL, "N- layer concentlation of the depletion MOS model"), + IOP("tndep", HSMHV_MOD_TNDEP, IF_REAL, "N- layer depth of the depletion MOS model"), + IOP("depmue0", HSMHV_MOD_DEPMUE0, IF_REAL, "coulomb scattering of resistor region "), + IOP("depmue1", HSMHV_MOD_DEPMUE1, IF_REAL, "coulomb scattering of resistor region"), + IOP("depmueback0", HSMHV_MOD_DEPMUEBACK0, IF_REAL, "coulomb scattering of back region"), + IOP("depmueback1", HSMHV_MOD_DEPMUEBACK1, IF_REAL, "coulomb scattering of back region"), + IOP("depleak", HSMHV_MOD_DEPLEAK, IF_REAL, "leakage current coefficient"), + IOP("depeta", HSMHV_MOD_DEPETA, IF_REAL, "Vds dependence"), + IOP("depvmax", HSMHV_MOD_DEPVMAX, IF_REAL, "velocity saturation"), + IOP("depvdsef1", HSMHV_MOD_DEPVDSEF1, IF_REAL, "Vds dependece of leakage current"), + IOP("depvdsef2", HSMHV_MOD_DEPVDSEF2, IF_REAL, "Vds dependece of leakage current"), + IOP("depmueph0", HSMHV_MOD_DEPMUEPH0, IF_REAL, "phonon scattering"), + IOP("depmueph1", HSMHV_MOD_DEPMUEPH1, IF_REAL, "phonon scattering"), + IOP("depbb", HSMHV_MOD_DEPBB, IF_REAL, "high field effect coeeficient"), + IOP("depvtmp", HSMHV_MOD_DEPVTMP, IF_REAL, "temperature dependence of velocity saturation"), + IOP("depmuetmp", HSMHV_MOD_DEPMUETMP, IF_REAL, "temperature dependence of mobility"), + + + IOP("isbreak", HSMHV_MOD_ISBREAK, IF_REAL, "reverse saturation current for breakdown"), + IOP("rwell", HSMHV_MOD_RWELL, IF_REAL, "well resistance for breakdown"), + + IOP("rdrvtmp", HSMHV_MOD_RDRVTMP, IF_REAL, ""), +/* IOP("rdrvmaxt1", HSMHV_MOD_RDRVMAXT1, IF_REAL, ""), */ +/* IOP("rdrvmaxt2", HSMHV_MOD_RDRVMAXT2, IF_REAL, ""), */ + IOP("rdrdjunc", HSMHV_MOD_RDRDJUNC, IF_REAL, ""), + IOP("rdrcx", HSMHV_MOD_RDRCX, IF_REAL, ""), + IOP("rdrcar", HSMHV_MOD_RDRCAR, IF_REAL, ""), + IOP("rdrdl1", HSMHV_MOD_RDRDL1, IF_REAL, ""), + IOP("rdrdl2", HSMHV_MOD_RDRDL2, IF_REAL, ""), + IOP("rdrvmaxw", HSMHV_MOD_RDRVMAXW, IF_REAL, ""), + IOP("rdrvmaxwp", HSMHV_MOD_RDRVMAXWP, IF_REAL, ""), + IOP("rdrvmaxl", HSMHV_MOD_RDRVMAXL, IF_REAL, ""), + IOP("rdrvmaxlp", HSMHV_MOD_RDRVMAXLP, IF_REAL, ""), + IOP("rdrmuel", HSMHV_MOD_RDRMUEL, IF_REAL, ""), + IOP("rdrmuelp", HSMHV_MOD_RDRMUELP, IF_REAL, ""), + IOP("rdrqover", HSMHV_MOD_RDRQOVER, IF_REAL, ""), + IOP("qovadd", HSMHV_MOD_QOVADD, IF_REAL, "parameter for additional Qover Charge [-]"), + IOP("js0d", HSMHV_MOD_JS0D, IF_REAL, "Saturation current density for drain junction [A/m^2]"), + IOP("js0swd", HSMHV_MOD_JS0SWD, IF_REAL, "Side wall saturation current density for drain junction [A/m ]"), + IOP("njd", HSMHV_MOD_NJD, IF_REAL, "Emission coefficient for drain junction [- ]"), + IOP("njswd", HSMHV_MOD_NJSWD, IF_REAL, "Sidewall emission coefficient for drain junction [ ]"), + IOP("xtid", HSMHV_MOD_XTID, IF_REAL, "Junction current temparature exponent coefficient for drain junction [- ]"), + IOP("cjd", HSMHV_MOD_CJD, IF_REAL, "Bottom junction capacitance per unit area at zero bias for drain junction [F/m^2]"), + IOP("cjswd", HSMHV_MOD_CJSWD, IF_REAL, "Sidewall junction capacitance grading coefficient per unit length at zero bias for drain junction [F/m ]"), + IOP("cjswgd", HSMHV_MOD_CJSWGD, IF_REAL, "Gate sidewall junction capacitance per unit length at zero bias for drain junction [F/m ]"), + IOP("mjd", HSMHV_MOD_MJD, IF_REAL, "Bottom junction capacitance grading coefficient for drain junction [ ]"), + IOP("mjswd", HSMHV_MOD_MJSWD, IF_REAL, "Sidewall junction capacitance grading coefficient for drain junction [ ]"), + IOP("mjswgd", HSMHV_MOD_MJSWGD, IF_REAL, "Gate sidewall junction capacitance grading coefficient for drain junction [ ]"), + IOP("pbd", HSMHV_MOD_PBD, IF_REAL, "Bottom junction build-in potential for drain junction [V ]"), + IOP("pbswd", HSMHV_MOD_PBSWD, IF_REAL, "Sidewall junction build-in potential for drain junction [V ]"), + IOP("pbswgd", HSMHV_MOD_PBSWDG, IF_REAL, "Gate sidewall junction build-in potential for drain junction [V ]"), + IOP("xti2d", HSMHV_MOD_XTI2D, IF_REAL, "Temperature coefficient for drain junction [- ]"), + IOP("cisbd", HSMHV_MOD_CISBD, IF_REAL, "Reverse bias saturation current for drain junction [- ]"), + IOP("cvbd", HSMHV_MOD_CVBD, IF_REAL, "Bias dependence coefficient of cisb for drain junction [- ]"), + IOP("ctempd", HSMHV_MOD_CTEMPD, IF_REAL, "Temperature coefficient for drain junction [- ]"), + IOP("cisbkd", HSMHV_MOD_CISBKD, IF_REAL, "Reverse bias saturation current for drain junction [A ]"), + IOP("divxd", HSMHV_MOD_DIVXD, IF_REAL, "Reverse coefficient coefficient for drain junction [1/V ]"), + IOP("vdiffjd", HSMHV_MOD_VDIFFJD, IF_REAL, "Threshold voltage for junction diode for drain junction [V ]"), + IOP("js0s", HSMHV_MOD_JS0S, IF_REAL, "Saturation current density for source junction [A/m^2]"), + IOP("js0sws", HSMHV_MOD_JS0SWS, IF_REAL, "Side wall saturation current density for source junction [A/m ]"), + IOP("njs", HSMHV_MOD_NJS, IF_REAL, "Emission coefficient for source junction [- ]"), + IOP("njsws", HSMHV_MOD_NJSWS, IF_REAL, "Sidewall emission coefficient for source junction [ ]"), + IOP("xtis", HSMHV_MOD_XTIS, IF_REAL, "Junction current temparature exponent coefficient for source junction [- ]"), + IOP("cjs", HSMHV_MOD_CJS, IF_REAL, "Bottom junction capacitance per unit area at zero bias for source junction [F/m^2]"), + IOP("cjsws", HSMHV_MOD_CJSSW, IF_REAL, "Sidewall junction capacitance grading coefficient per unit length at zero bias for source junction [F/m ]"), + IOP("cjswgs", HSMHV_MOD_CJSWGS, IF_REAL, "Gate sidewall junction capacitance per unit length at zero bias for source junction [F/m ]"), + IOP("mjs", HSMHV_MOD_MJS, IF_REAL, "Bottom junction capacitance grading coefficient for source junction [ ]"), + IOP("mjsws", HSMHV_MOD_MJSWS, IF_REAL, "Sidewall junction capacitance grading coefficient for source junction [ ]"), + IOP("mjswgs", HSMHV_MOD_MJSWGS, IF_REAL, "Gate sidewall junction capacitance grading coefficient for source junction [ ]"), + IOP("pbs", HSMHV_MOD_PBS, IF_REAL, "Bottom junction build-in potential for source junction [V ]"), + IOP("pbsws", HSMHV_MOD_PBSWS, IF_REAL, "Sidewall junction build-in potential for source junction [V ]"), + IOP("pbswgs", HSMHV_MOD_PBSWSG, IF_REAL, "Gate sidewall junction build-in potential for source junction [V ]"), + IOP("xti2s", HSMHV_MOD_XTI2S, IF_REAL, "Temperature coefficient for source junction [- ]"), + IOP("cisbs", HSMHV_MOD_CISBS, IF_REAL, "Reverse bias saturation current for source junction [- ]"), + IOP("cvbs", HSMHV_MOD_CVBS, IF_REAL, "Bias dependence coefficient of cisb for source junction [- ]"), + IOP("ctemps", HSMHV_MOD_CTEMPS, IF_REAL, "Temperature coefficient for source junction [- ]"), + IOP("cisbks", HSMHV_MOD_CISBKS, IF_REAL, "Reverse bias saturation current for source junction [A ]"), + IOP("divxs", HSMHV_MOD_DIVXS, IF_REAL, "Reverse coefficient coefficient for source junction [1/V ]"), + IOP("vdiffjs", HSMHV_MOD_VDIFFJS, IF_REAL, "Threshold voltage for junction diode for source junction [V ]"), IOP("shemax", HSMHV_MOD_SHEMAX, IF_REAL, "Maximum rise temperatue for SHE [C]"), + IOP("vgsmin", HSMHV_MOD_VGSMIN, IF_REAL, "minimal/maximal expected Vgs (NMOS/PMOS) [V]"), + IOP("gdsleak", HSMHV_MOD_GDSLEAK, IF_REAL, "Channel leakage conductance [A/V]"), + IOP("rdrbb", HSMHV_MOD_RDRBB, IF_REAL, "degradation of the mobility in drift region"), + IOP("rdrbbtmp", HSMHV_MOD_RDRBBTMP, IF_REAL, "temperature coeeficient of RDRBB"), + /* binning parameters */ IOP("lmin", HSMHV_MOD_LMIN, IF_REAL, "Minimum length for the model"), @@ -445,7 +598,7 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("leg0", HSMHV_MOD_LEG0, IF_REAL, "Length dependence of eg0"), IOP("lvfbover", HSMHV_MOD_LVFBOVER, IF_REAL, "Length dependence of vfbover"), IOP("lnover", HSMHV_MOD_LNOVER, IF_REAL, "Length dependence of nover"), - IOP("lnovers", HSMHV_MOD_LNOVERS, IF_REAL, "Length dependence of nover on source size"), + IOP("lnovers", HSMHV_MOD_LNOVERS, IF_REAL, "Length dependence of nover on source side"), IOP("lwl2", HSMHV_MOD_LWL2, IF_REAL, "Length dependence of wl2"), IOP("lvfbc", HSMHV_MOD_LVFBC, IF_REAL, "Length dependence of vfbc"), IOP("lnsubc", HSMHV_MOD_LNSUBC, IF_REAL, "Length dependence of nsubc"), @@ -457,7 +610,7 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("lsc2", HSMHV_MOD_LSC2, IF_REAL, "Length dependence of sc2"), IOP("lsc3", HSMHV_MOD_LSC3, IF_REAL, "Length dependence of sc3"), IOP("lpgd1", HSMHV_MOD_LPGD1, IF_REAL, "Length dependence of pgd1"), - IOP("lpgd3", HSMHV_MOD_LPGD3, IF_REAL, "Length dependence of pgd3"), +//IOP("lpgd3", HSMHV_MOD_LPGD3, IF_REAL, "Length dependence of pgd3"), IOP("lndep", HSMHV_MOD_LNDEP, IF_REAL, "Length dependence of ndep"), IOP("lninv", HSMHV_MOD_LNINV, IF_REAL, "Length dependence of ninv"), IOP("lmuecb0", HSMHV_MOD_LMUECB0, IF_REAL, "Length dependence of muecb0"), @@ -509,7 +662,7 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("lglkb2", HSMHV_MOD_LGLKB2, IF_REAL, "Length dependence of glkb2"), IOP("lnftrp", HSMHV_MOD_LNFTRP, IF_REAL, "Length dependence of nftrp"), IOP("lnfalp", HSMHV_MOD_LNFALP, IF_REAL, "Length dependence of nfalp"), - IOP("lpthrou", HSMHV_MOD_LPTHROU, IF_REAL, "Length dependence of pthrou"), +//IOP("lpthrou", HSMHV_MOD_LPTHROU, IF_REAL, "Length dependence of pthrou"), IOP("lvdiffj", HSMHV_MOD_LVDIFFJ, IF_REAL, "Length dependence of vdiffj"), IOP("libpc1", HSMHV_MOD_LIBPC1, IF_REAL, "Length dependence of ibpc1"), IOP("libpc2", HSMHV_MOD_LIBPC2, IF_REAL, "Length dependence of ibpc2"), @@ -531,6 +684,16 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("lrs", HSMHV_MOD_LRS, IF_REAL, "Length dependence of rs"), IOP("lrth0", HSMHV_MOD_LRTH0, IF_REAL, "Length dependence of rth0"), IOP("lvover", HSMHV_MOD_LVOVER, IF_REAL, "Length dependence of vover"), + IOP("ljs0d", HSMHV_MOD_LJS0D, IF_REAL, "Length dependence of js0d"), + IOP("ljs0swd", HSMHV_MOD_LJS0SWD, IF_REAL, "Length dependence of js0swd"), + IOP("lnjd", HSMHV_MOD_LNJD, IF_REAL, "Length dependence of njd"), + IOP("lcisbkd", HSMHV_MOD_LCISBKD, IF_REAL, "Length dependence of cisbkd"), + IOP("lvdiffjd", HSMHV_MOD_LVDIFFJD, IF_REAL, "Length dependence of vdiffjd"), + IOP("ljs0s", HSMHV_MOD_LJS0S, IF_REAL, "Length dependence of js0s"), + IOP("ljs0sws", HSMHV_MOD_LJS0SWS, IF_REAL, "Length dependence of js0sws"), + IOP("lnjs", HSMHV_MOD_LNJS, IF_REAL, "Length dependence of njs"), + IOP("lcisbks", HSMHV_MOD_LCISBKS, IF_REAL, "Length dependence of cisbks"), + IOP("lvdiffjs", HSMHV_MOD_LVDIFFJS, IF_REAL, "Length dependence of vdiffjs"), /* Width dependence */ IOP("wvmax", HSMHV_MOD_WVMAX, IF_REAL, "Width dependence of vmax"), @@ -539,7 +702,7 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("weg0", HSMHV_MOD_WEG0, IF_REAL, "Width dependence of eg0"), IOP("wvfbover", HSMHV_MOD_WVFBOVER, IF_REAL, "Width dependence of vfbover"), IOP("wnover", HSMHV_MOD_WNOVER, IF_REAL, "Width dependence of nover"), - IOP("wnovers", HSMHV_MOD_WNOVERS, IF_REAL, "Width dependence of novers on source size"), + IOP("wnovers", HSMHV_MOD_WNOVERS, IF_REAL, "Width dependence of novers on source side"), IOP("wwl2", HSMHV_MOD_WWL2, IF_REAL, "Width dependence of wl2"), IOP("wvfbc", HSMHV_MOD_WVFBC, IF_REAL, "Width dependence of vfbc"), IOP("wnsubc", HSMHV_MOD_WNSUBC, IF_REAL, "Width dependence of nsubc"), @@ -551,7 +714,7 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("wsc2", HSMHV_MOD_WSC2, IF_REAL, "Width dependence of sc2"), IOP("wsc3", HSMHV_MOD_WSC3, IF_REAL, "Width dependence of sc3"), IOP("wpgd1", HSMHV_MOD_WPGD1, IF_REAL, "Width dependence of pgd1"), - IOP("wpgd3", HSMHV_MOD_WPGD3, IF_REAL, "Width dependence of pgd3"), +//IOP("wpgd3", HSMHV_MOD_WPGD3, IF_REAL, "Width dependence of pgd3"), IOP("wndep", HSMHV_MOD_WNDEP, IF_REAL, "Width dependence of ndep"), IOP("wninv", HSMHV_MOD_WNINV, IF_REAL, "Width dependence of ninv"), IOP("wmuecb0", HSMHV_MOD_WMUECB0, IF_REAL, "Width dependence of muecb0"), @@ -603,7 +766,7 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("wglkb2", HSMHV_MOD_WGLKB2, IF_REAL, "Width dependence of glkb2"), IOP("wnftrp", HSMHV_MOD_WNFTRP, IF_REAL, "Width dependence of nftrp"), IOP("wnfalp", HSMHV_MOD_WNFALP, IF_REAL, "Width dependence of nfalp"), - IOP("wpthrou", HSMHV_MOD_WPTHROU, IF_REAL, "Width dependence of pthrou"), +//IOP("wpthrou", HSMHV_MOD_WPTHROU, IF_REAL, "Width dependence of pthrou"), IOP("wvdiffj", HSMHV_MOD_WVDIFFJ, IF_REAL, "Width dependence of vdiffj"), IOP("wibpc1", HSMHV_MOD_WIBPC1, IF_REAL, "Width dependence of ibpc1"), IOP("wibpc2", HSMHV_MOD_WIBPC2, IF_REAL, "Width dependence of ibpc2"), @@ -625,6 +788,16 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("wrs", HSMHV_MOD_WRS, IF_REAL, "Width dependence of rs"), IOP("wrth0", HSMHV_MOD_WRTH0, IF_REAL, "Width dependence of rth0"), IOP("wvover", HSMHV_MOD_WVOVER, IF_REAL, "Width dependence of vover"), + IOP("wjs0d", HSMHV_MOD_WJS0D, IF_REAL, "Wength dependence of js0d"), + IOP("wjs0swd", HSMHV_MOD_WJS0SWD, IF_REAL, "Wength dependence of js0swd"), + IOP("wnjd", HSMHV_MOD_WNJD, IF_REAL, "Wength dependence of njd"), + IOP("wcisbkd", HSMHV_MOD_WCISBKD, IF_REAL, "Wength dependence of cisbkd"), + IOP("wvdiffjd", HSMHV_MOD_WVDIFFJD, IF_REAL, "Wength dependence of vdiffjd"), + IOP("wjs0s", HSMHV_MOD_WJS0S, IF_REAL, "Wength dependence of js0s"), + IOP("wjs0sws", HSMHV_MOD_WJS0SWS, IF_REAL, "Wength dependence of js0sws"), + IOP("wnjs", HSMHV_MOD_WNJS, IF_REAL, "Wength dependence of njs"), + IOP("wcisbks", HSMHV_MOD_WCISBKS, IF_REAL, "Wength dependence of cisbks"), + IOP("wvdiffjs", HSMHV_MOD_WVDIFFJS, IF_REAL, "Wength dependence of vdiffjs"), /* Cross-term dependence */ IOP("pvmax", HSMHV_MOD_PVMAX, IF_REAL, "Cross-term dependence of vmax"), @@ -633,7 +806,7 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("peg0", HSMHV_MOD_PEG0, IF_REAL, "Cross-term dependence of eg0"), IOP("pvfbover", HSMHV_MOD_PVFBOVER, IF_REAL, "Cross-term dependence of vfbover"), IOP("pnover", HSMHV_MOD_PNOVER, IF_REAL, "Cross-term dependence of nover"), - IOP("pnovers", HSMHV_MOD_PNOVERS, IF_REAL, "Cross-term dependence of nover on source size"), + IOP("pnovers", HSMHV_MOD_PNOVERS, IF_REAL, "Cross-term dependence of nover on source side"), IOP("pwl2", HSMHV_MOD_PWL2, IF_REAL, "Cross-term dependence of wl2"), IOP("pvfbc", HSMHV_MOD_PVFBC, IF_REAL, "Cross-term dependence of vfbc"), IOP("pnsubc", HSMHV_MOD_PNSUBC, IF_REAL, "Cross-term dependence of nsubc"), @@ -645,7 +818,7 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("psc2", HSMHV_MOD_PSC2, IF_REAL, "Cross-term dependence of sc2"), IOP("psc3", HSMHV_MOD_PSC3, IF_REAL, "Cross-term dependence of sc3"), IOP("ppgd1", HSMHV_MOD_PPGD1, IF_REAL, "Cross-term dependence of pgd1"), - IOP("ppgd3", HSMHV_MOD_PPGD3, IF_REAL, "Cross-term dependence of pgd3"), +//IOP("ppgd3", HSMHV_MOD_PPGD3, IF_REAL, "Cross-term dependence of pgd3"), IOP("pndep", HSMHV_MOD_PNDEP, IF_REAL, "Cross-term dependence of ndep"), IOP("pninv", HSMHV_MOD_PNINV, IF_REAL, "Cross-term dependence of ninv"), IOP("pmuecb0", HSMHV_MOD_PMUECB0, IF_REAL, "Cross-term dependence of muecb0"), @@ -697,7 +870,7 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("pglkb2", HSMHV_MOD_PGLKB2, IF_REAL, "Cross-term dependence of glkb2"), IOP("pnftrp", HSMHV_MOD_PNFTRP, IF_REAL, "Cross-term dependence of nftrp"), IOP("pnfalp", HSMHV_MOD_PNFALP, IF_REAL, "Cross-term dependence of nfalp"), - IOP("ppthrou", HSMHV_MOD_PPTHROU, IF_REAL, "Cross-term dependence of pthrou"), +//IOP("ppthrou", HSMHV_MOD_PPTHROU, IF_REAL, "Cross-term dependence of pthrou"), IOP("pvdiffj", HSMHV_MOD_PVDIFFJ, IF_REAL, "Cross-term dependence of vdiffj"), IOP("pibpc1", HSMHV_MOD_PIBPC1, IF_REAL, "Cross-term dependence of ibpc1"), IOP("pibpc2", HSMHV_MOD_PIBPC2, IF_REAL, "Cross-term dependence of ibpc2"), @@ -719,6 +892,16 @@ IFparm HSMHVmPTable[] = { /* model parameters */ IOP("prs", HSMHV_MOD_PRS, IF_REAL, "Cross-term dependence of rs"), IOP("prth0", HSMHV_MOD_PRTH0, IF_REAL, "Cross-term dependence of rth0"), IOP("pvover", HSMHV_MOD_PVOVER, IF_REAL, "Cross-term dependence of vover"), + IOP("pjs0d", HSMHV_MOD_PJS0D, IF_REAL, "Cross-term dependence of js0d"), + IOP("pjs0swd", HSMHV_MOD_PJS0SWD, IF_REAL, "Cross-term dependence of js0swd"), + IOP("pnjd", HSMHV_MOD_PNJD, IF_REAL, "Cross-term dependence of njd"), + IOP("pcisbkd", HSMHV_MOD_PCISBKD, IF_REAL, "Cross-term dependence of cisbkd"), + IOP("pvdiffjd", HSMHV_MOD_PVDIFFJD, IF_REAL, "Cross-term dependence of vdiffjd"), + IOP("pjs0s", HSMHV_MOD_PJS0S, IF_REAL, "Cross-term dependence of js0s"), + IOP("pjs0sws", HSMHV_MOD_PJS0SWS, IF_REAL, "Cross-term dependence of js0sws"), + IOP("pnjs", HSMHV_MOD_PNJS, IF_REAL, "Cross-term dependence of njs"), + IOP("pcisbks", HSMHV_MOD_PCISBKS, IF_REAL, "Cross-term dependence of cisbks"), + IOP("pvdiffjs", HSMHV_MOD_PVDIFFJS, IF_REAL, "Cross-term dependence of vdiffjs"), IOP("vgs_max", HSMHV_MOD_VGS_MAX, IF_REAL, "maximum voltage G-S branch"), IOP("vgd_max", HSMHV_MOD_VGD_MAX, IF_REAL, "maximum voltage G-D branch"), diff --git a/src/spicelib/devices/hisimhv1/hsmhvacld.c b/src/spicelib/devices/hisimhv1/hsmhvacld.c index 9f2fcd180..0e08ab46d 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvacld.c +++ b/src/spicelib/devices/hisimhv1/hsmhvacld.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvacld.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/cktdefs.h" #include "ngspice/sperror.h" diff --git a/src/spicelib/devices/hisimhv1/hsmhvask.c b/src/spicelib/devices/hisimhv1/hsmhvask.c index a40082d6c..a28c8b7a8 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvask.c +++ b/src/spicelib/devices/hisimhv1/hsmhvask.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvask.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/ifsim.h" #include "ngspice/cktdefs.h" @@ -205,6 +247,12 @@ int HSMHVask( case HSMHV_ISUB: value->rValue = here->HSMHV_isub; return(OK); + case HSMHV_ISUBLD: + value->rValue = here->HSMHV_isubld; + return(OK); + case HSMHV_IDSIBPC: + value->rValue = here->HSMHV_idsibpc; + return(OK); case HSMHV_IGIDL: value->rValue = here->HSMHV_igidl; return(OK); diff --git a/src/spicelib/devices/hisimhv1/hsmhvcvtest.c b/src/spicelib/devices/hisimhv1/hsmhvcvtest.c index 430d53b5b..5205dd3ee 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvcvtest.c +++ b/src/spicelib/devices/hisimhv1/hsmhvcvtest.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvcvtest.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/cktdefs.h" #include "hsmhvdef.h" diff --git a/src/spicelib/devices/hisimhv1/hsmhvdef.h b/src/spicelib/devices/hisimhv1/hsmhvdef.h index c1e2e0343..fce3ed686 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvdef.h +++ b/src/spicelib/devices/hisimhv1/hsmhvdef.h @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvdef - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #ifndef HSMHV #define HSMHV @@ -48,10 +90,6 @@ typedef struct sHSMHVmodelMKSParam { double HSMHV_rdvd ; double HSMHV_rdvdtemp1 ; double HSMHV_rdvdtemp2 ; -//double HSMHV_muecb0 ; -//double HSMHV_muecb1 ; -//double HSMHV_muesr1 ; -//double HSMHV_mueph1 ; double HSMHV_nsubsub ; double HSMHV_nsubpsti1 ; double HSMHV_muesti1 ; @@ -74,6 +112,11 @@ typedef struct sHSMHVmodelMKSParam { double HSMHV_dly3 ; double HSMHV_rth0 ; double HSMHV_cth0 ; + double HSMHV_rdrmue ; + double HSMHV_rdrvmax ; + double HSMHV_ndepm ; + double HSMHV_depvmax ; + } HSMHVmodelMKSParam ; @@ -97,7 +140,7 @@ typedef struct sHSMHVbinningParam { double HSMHV_sc2 ; double HSMHV_sc3 ; double HSMHV_pgd1 ; - double HSMHV_pgd3 ; +//double HSMHV_pgd3 ; double HSMHV_ndep ; double HSMHV_ninv ; double HSMHV_muecb0 ; @@ -149,7 +192,6 @@ typedef struct sHSMHVbinningParam { double HSMHV_glkb2 ; double HSMHV_nftrp ; double HSMHV_nfalp ; - double HSMHV_pthrou ; double HSMHV_vdiffj ; double HSMHV_ibpc1 ; double HSMHV_ibpc2 ; @@ -174,6 +216,16 @@ typedef struct sHSMHVbinningParam { /*-----------SHE--------------*/ double HSMHV_rth ; double HSMHV_cth ; + double HSMHV_js0d; + double HSMHV_js0swd; + double HSMHV_njd; + double HSMHV_cisbkd; + double HSMHV_vdiffjd; + double HSMHV_js0s; + double HSMHV_js0sws; + double HSMHV_njs; + double HSMHV_cisbks; + double HSMHV_vdiffjs; /*-----------------------------*/ } HSMHVbinningParam ; @@ -183,10 +235,6 @@ typedef struct sHSMHVbinningParam { typedef struct sHSMHVhereMKSParam { double HSMHV_vmax ; double HSMHV_subld2 ; -//double HSMHV_muecb0 ; -//double HSMHV_muecb1 ; -//double HSMHV_muesr1 ; -//double HSMHV_mueph1 ; double HSMHV_ndep ; double HSMHV_ninv ; double HSMHV_nsubc ; @@ -369,8 +417,12 @@ typedef struct sHSMHVinstance { double HSMHV_dRd_dVdse ; double HSMHV_dRd_dVgse ; double HSMHV_dRd_dVbse ; + double HSMHV_dRd_dVddp ; double HSMHV_dRd_dVsubs ; double HSMHV_dRd_dTi ; + double HSMHV_dRd_dVds ; + double HSMHV_dRd_dVgs ; + double HSMHV_dRd_dVbs ; double HSMHV_Rs ; /* different from HSMHV_rs */ double HSMHV_dRs_dVdse ; double HSMHV_dRs_dVgse ; @@ -398,7 +450,18 @@ typedef struct sHSMHVinstance { double HSMHV_dIsub_dVgsi ; double HSMHV_dIsub_dVbsi ; double HSMHV_dIsub_dTi ; - double HSMHV_dIsub_dVdse ; + double HSMHV_isubld; + double HSMHV_dIsubLD_dVdsi ; + double HSMHV_dIsubLD_dVgsi ; + double HSMHV_dIsubLD_dVbsi ; + double HSMHV_dIsubLD_dTi ; + double HSMHV_dIsubLD_dVddp ; + double HSMHV_idsibpc; + double HSMHV_dIdsIBPC_dVdsi ; + double HSMHV_dIdsIBPC_dVgsi ; + double HSMHV_dIdsIBPC_dVbsi ; + double HSMHV_dIdsIBPC_dTi ; + double HSMHV_dIdsIBPC_dVddp ; /* gidl and gisl current */ double HSMHV_igidl; /* gate induced drain leakage */ /* double HSMHV_gigidlgs; not used */ @@ -562,6 +625,10 @@ typedef struct sHSMHVinstance { /* internal variables */ + double HSMHV_exptempd ; + double HSMHV_exptemps ; + double HSMHV_jd_nvtm_invd ; + double HSMHV_jd_nvtm_invs ; double HSMHV_eg ; double HSMHV_beta ; double HSMHV_beta_inv ; @@ -574,7 +641,9 @@ typedef struct sHSMHVinstance { double HSMHV_wg ; double HSMHV_mueph ; double HSMHV_mphn0 ; + double HSMHV_depmphn0 ; double HSMHV_mphn1 ; + double HSMHV_depmphn1 ; double HSMHV_muesr ; double HSMHV_rdvd ; double HSMHV_rsvd ; /* for the reverse mode */ @@ -602,7 +671,6 @@ typedef struct sHSMHVinstance { double HSMHV_isbs2 ; double HSMHV_vbdt ; double HSMHV_vbst ; - double HSMHV_exptemp ; double HSMHV_wsti ; double HSMHV_cnstpgd ; /* double HSMHV_ninvp0 ; not used */ @@ -622,13 +690,13 @@ typedef struct sHSMHVinstance { double HSMHV_ddlt ; double HSMHV_xsub1 ; double HSMHV_xsub2 ; + double HSMHV_ibpc1 ; double HSMHV_xgate ; double HSMHV_xvbs ; double HSMHV_vg2const ; double HSMHV_wdpl ; double HSMHV_wdplp ; double HSMHV_cfrng ; - double HSMHV_jd_nvtm_inv ; double HSMHV_jd_expcd ; double HSMHV_jd_expcs ; double HSMHV_sqrt_eg ; @@ -647,16 +715,58 @@ typedef struct sHSMHVinstance { double HSMHV_costi0 ; double HSMHV_costi0_p2 ; double HSMHV_costi1 ; - double HSMHV_ps0ldinib ; - double HSMHV_ps0ldinibs ; + double HSMHV_ptl0; + double HSMHV_pt40; + double HSMHV_gdl0; double HSMHV_rdvdtemp0 ; double HSMHV_rthtemp0 ; double HSMHV_powratio ; + double HSMHV_rdrmue ; + double HSMHV_rdrvmax ; + + double HSMHV_depvmax ; + + double HSMHV_rdrcx ; + double HSMHV_rdrcar ; + + double HSMHV_xpdv ; + double HSMHV_Ps0LD ; + double HSMHV_Ps0LD_dVds ; + double HSMHV_Ps0LD_dVgs ; + double HSMHV_Ps0LD_dVbs ; + double HSMHV_Ps0LD_dTi ; + double HSMHV_QbuLD ; + double HSMHV_QbuLD_dVds ; + double HSMHV_QbuLD_dVgs ; + double HSMHV_QbuLD_dVbs ; + double HSMHV_QbuLD_dTi ; + + double HSMHV_kjunc ; + double HSMHV_kdep ; + double HSMHV_Xmax ; + double HSMHV_rdrcxw ; + double HSMHV_rdrvmaxw ; + double HSMHV_rdrvmaxl ; + double HSMHV_rdrmuel ; + double HSMHV_mueph1 ; double HSMHV_nsubp; double HSMHV_nsubc; + double HSMHV_Tratio; + + double HSMHV_ndepm ; + double HSMHV_Pb2n ; + double HSMHV_Vbipn ; + + double HSMHV_rdrbb ; + + int HSMHV_cordrift ; + + double HSMHV_Vdserevz ; + double HSMHV_Vdserevz_dVd ; + double HSMHV_Vsubsrev ; HSMHVhereMKSParam hereMKS ; /* unit-converted parameters */ @@ -915,9 +1025,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ HSMHVinstance * HSMHVinstances; /* pointer to list of instances that have this model */ IFuid HSMHVmodName; /* pointer to the name of this model */ - - /* --- end of generic struct GENmodel --- */ - int HSMHV_type; /* device type: 1 = nmos, -1 = pmos */ int HSMHV_level; /* level */ int HSMHV_info; /* information */ @@ -949,7 +1056,10 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ int HSMHV_cosym; /* Symmetry model for HV */ int HSMHV_cotemp; int HSMHV_coldrift; - + int HSMHV_cordrift; + int HSMHV_coerrrep; + int HSMHV_codep; + int HSMHV_coddlt; double HSMHV_vmax ; double HSMHV_vmaxt1 ; @@ -976,7 +1086,12 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_ldrift1s ; double HSMHV_ldrift2s ; double HSMHV_subld1 ; + double HSMHV_subld1l ; + double HSMHV_subld1lp ; double HSMHV_subld2 ; + double HSMHV_xpdv ; + double HSMHV_xpvdth ; + double HSMHV_xpvdthg ; double HSMHV_ddltmax ; double HSMHV_ddltslp ; double HSMHV_ddltict ; @@ -1028,7 +1143,7 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_sc4 ; double HSMHV_pgd1 ; double HSMHV_pgd2 ; - double HSMHV_pgd3 ; +//double HSMHV_pgd3 ; double HSMHV_pgd4 ; double HSMHV_ndep ; double HSMHV_ndepl ; @@ -1171,7 +1286,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_cit ; double HSMHV_falph ; double HSMHV_kappa ; - double HSMHV_pthrou ; double HSMHV_vdiffj ; double HSMHV_dly1 ; double HSMHV_dly2 ; @@ -1189,15 +1303,23 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_rbsb ; /* IBPC */ double HSMHV_ibpc1 ; + double HSMHV_ibpc1l ; + double HSMHV_ibpc1lp ; double HSMHV_ibpc2 ; /* DFM */ double HSMHV_mphdfm ; + double HSMHV_ptl, HSMHV_ptp, HSMHV_pt2, HSMHV_ptlp, HSMHV_gdl, HSMHV_gdlp ; + + double HSMHV_gdld ; + double HSMHV_pt4 ; + double HSMHV_pt4p ; + double HSMHV_vbsmin ; double HSMHV_rdvg11 ; double HSMHV_rdvg12 ; double HSMHV_rd20 ; - double HSMHV_qovsm ; +//double HSMHV_qovsm ; double HSMHV_ldrift ; double HSMHV_rd21 ; double HSMHV_rd22 ; @@ -1205,7 +1327,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_rd23 ; double HSMHV_rd24 ; double HSMHV_rd25 ; - double HSMHV_rd26 ; double HSMHV_rdvdl ; double HSMHV_rdvdlp ; double HSMHV_rdvds ; @@ -1254,7 +1375,94 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_cvdsover ; + + double HSMHV_rdrmue ; + double HSMHV_rdrvmax ; + double HSMHV_rdrmuetmp ; + double HSMHV_ndepm ; + double HSMHV_tndep ; + double HSMHV_depmue0 ; + double HSMHV_depmue1 ; + double HSMHV_depmueback0 ; + double HSMHV_depmueback1 ; + double HSMHV_depvmax ; + double HSMHV_depvdsef1 ; + double HSMHV_depvdsef2 ; + double HSMHV_depmueph0 ; + double HSMHV_depmueph1 ; + double HSMHV_depbb ; + double HSMHV_depleak ; + double HSMHV_depeta ; + double HSMHV_depvtmp ; + double HSMHV_depmuetmp ; + + double HSMHV_isbreak ; + double HSMHV_rwell ; + + double HSMHV_rdrvtmp ; + // double HSMHV_rdrvmaxt1 ; + // double HSMHV_rdrvmaxt2 ; + double HSMHV_rdrdjunc ; + double HSMHV_rdrcx ; + double HSMHV_rdrcar ; + double HSMHV_rdrdl1 ; + double HSMHV_rdrdl2 ; + double HSMHV_rdrvmaxw ; + double HSMHV_rdrvmaxwp ; + double HSMHV_rdrvmaxl ; + double HSMHV_rdrvmaxlp ; + double HSMHV_rdrmuel ; + double HSMHV_rdrmuelp ; + double HSMHV_qovadd; + double HSMHV_rdrqover ; + double HSMHV_js0d; + double HSMHV_js0swd; + double HSMHV_njd; + double HSMHV_njswd; + double HSMHV_xtid; + double HSMHV_cjd; + double HSMHV_cjswd; + double HSMHV_cjswgd; + double HSMHV_mjd; + double HSMHV_mjswd; + double HSMHV_mjswgd; + double HSMHV_pbd; + double HSMHV_pbswd; + double HSMHV_pbswgd; + double HSMHV_xti2d; + double HSMHV_cisbd; + double HSMHV_cvbd; + double HSMHV_ctempd; + double HSMHV_cisbkd; + double HSMHV_divxd; + double HSMHV_vdiffjd; + double HSMHV_js0s; + double HSMHV_js0sws; + double HSMHV_njs; + double HSMHV_njsws; + double HSMHV_xtis; + double HSMHV_cjs; + double HSMHV_cjsws; + double HSMHV_cjswgs; + double HSMHV_mjs; + double HSMHV_mjsws; + double HSMHV_mjswgs; + double HSMHV_pbs; + double HSMHV_pbsws; + double HSMHV_pbswgs; + double HSMHV_xti2s; + double HSMHV_cisbs; + double HSMHV_cvbs; + double HSMHV_ctemps; + double HSMHV_cisbks; + double HSMHV_divxs; + double HSMHV_vdiffjs; double HSMHV_shemax; + double HSMHV_vgsmin; + double HSMHV_gdsleak; + double HSMHV_rdrbb; + double HSMHV_rdrbbtmp; + /* binning parameters */ double HSMHV_lmin ; @@ -1283,7 +1491,7 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_lsc2 ; double HSMHV_lsc3 ; double HSMHV_lpgd1 ; - double HSMHV_lpgd3 ; +//double HSMHV_lpgd3 ; double HSMHV_lndep ; double HSMHV_lninv ; double HSMHV_lmuecb0 ; @@ -1335,7 +1543,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_lglkb2 ; double HSMHV_lnftrp ; double HSMHV_lnfalp ; - double HSMHV_lpthrou ; double HSMHV_lvdiffj ; double HSMHV_libpc1 ; double HSMHV_libpc2 ; @@ -1357,6 +1564,16 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_lrs ; double HSMHV_lrth0 ; double HSMHV_lvover ; + double HSMHV_ljs0d; + double HSMHV_ljs0swd; + double HSMHV_lnjd; + double HSMHV_lcisbkd; + double HSMHV_lvdiffjd; + double HSMHV_ljs0s; + double HSMHV_ljs0sws; + double HSMHV_lnjs; + double HSMHV_lcisbks; + double HSMHV_lvdiffjs; /* Width dependence */ double HSMHV_wvmax ; @@ -1377,7 +1594,7 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_wsc2 ; double HSMHV_wsc3 ; double HSMHV_wpgd1 ; - double HSMHV_wpgd3 ; +//double HSMHV_wpgd3 ; double HSMHV_wndep ; double HSMHV_wninv ; double HSMHV_wmuecb0 ; @@ -1429,7 +1646,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_wglkb2 ; double HSMHV_wnftrp ; double HSMHV_wnfalp ; - double HSMHV_wpthrou ; double HSMHV_wvdiffj ; double HSMHV_wibpc1 ; double HSMHV_wibpc2 ; @@ -1451,6 +1667,16 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_wrs ; double HSMHV_wrth0 ; double HSMHV_wvover ; + double HSMHV_wjs0d; + double HSMHV_wjs0swd; + double HSMHV_wnjd; + double HSMHV_wcisbkd; + double HSMHV_wvdiffjd; + double HSMHV_wjs0s; + double HSMHV_wjs0sws; + double HSMHV_wnjs; + double HSMHV_wcisbks; + double HSMHV_wvdiffjs; /* Cross-term dependence */ double HSMHV_pvmax ; @@ -1471,7 +1697,7 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_psc2 ; double HSMHV_psc3 ; double HSMHV_ppgd1 ; - double HSMHV_ppgd3 ; +//double HSMHV_ppgd3 ; double HSMHV_pndep ; double HSMHV_pninv ; double HSMHV_pmuecb0 ; @@ -1523,7 +1749,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_pglkb2 ; double HSMHV_pnftrp ; double HSMHV_pnfalp ; - double HSMHV_ppthrou ; double HSMHV_pvdiffj ; double HSMHV_pibpc1 ; double HSMHV_pibpc2 ; @@ -1545,13 +1770,30 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ double HSMHV_prs ; double HSMHV_prth0 ; double HSMHV_pvover ; + double HSMHV_pjs0d; + double HSMHV_pjs0swd; + double HSMHV_pnjd; + double HSMHV_pcisbkd; + double HSMHV_pvdiffjd; + double HSMHV_pjs0s; + double HSMHV_pjs0sws; + double HSMHV_pnjs; + double HSMHV_pcisbks; + double HSMHV_pvdiffjs; /* internal variables */ + double HSMHV_exptempd ; + double HSMHV_exptemps ; + double HSMHV_jd_nvtm_invd ; + double HSMHV_jd_nvtm_invs ; double HSMHV_vcrit ; int HSMHV_flg_qme ; double HSMHV_qme12 ; double HSMHV_ktnom ; + int HSMHV_subversion ; + int HSMHV_revision ; + double HSMHVvgsMax; double HSMHVvgdMax; double HSMHVvgbMax; @@ -1592,8 +1834,11 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_cosym_Given :1; /* Symmetry model for HV */ unsigned HSMHV_cotemp_Given :1; unsigned HSMHV_coldrift_Given :1; + unsigned HSMHV_cordrift_Given :1; + unsigned HSMHV_coerrrep_Given :1; + unsigned HSMHV_codep_Given :1; + unsigned HSMHV_coddlt_Given :1; unsigned HSMHV_kappa_Given :1; - unsigned HSMHV_pthrou_Given :1; unsigned HSMHV_vdiffj_Given :1; unsigned HSMHV_vmax_Given :1; unsigned HSMHV_vmaxt1_Given :1; @@ -1620,7 +1865,12 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_ldrift1s_Given :1; unsigned HSMHV_ldrift2s_Given :1; unsigned HSMHV_subld1_Given :1; + unsigned HSMHV_subld1l_Given :1; + unsigned HSMHV_subld1lp_Given :1; unsigned HSMHV_subld2_Given :1; + unsigned HSMHV_xpdv_Given :1; + unsigned HSMHV_xpvdth_Given :1; + unsigned HSMHV_xpvdthg_Given :1; unsigned HSMHV_ddltmax_Given :1; unsigned HSMHV_ddltslp_Given :1; unsigned HSMHV_ddltict_Given :1; @@ -1660,6 +1910,27 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_parl2_Given :1; unsigned HSMHV_lp_Given :1; unsigned HSMHV_nsubp_Given :1; + unsigned HSMHV_ndepm_Given :1; + unsigned HSMHV_tndep_Given :1; + unsigned HSMHV_depmue0_Given :1; + unsigned HSMHV_depmue1_Given :1; + unsigned HSMHV_depmueback0_Given :1; + unsigned HSMHV_depmueback1_Given :1; + unsigned HSMHV_depleak_Given :1; + unsigned HSMHV_depeta_Given :1; + unsigned HSMHV_depvmax_Given :1; + unsigned HSMHV_depvdsef1_Given :1; + unsigned HSMHV_depvdsef2_Given :1; + unsigned HSMHV_depmueph0_Given :1; + unsigned HSMHV_depmueph1_Given :1; + unsigned HSMHV_depbb_Given :1; + unsigned HSMHV_depvtmp_Given :1; + unsigned HSMHV_depmuetmp_Given :1; + + unsigned HSMHV_isbreak_Given :1; + unsigned HSMHV_rwell_Given :1; + + unsigned HSMHV_nsubp0_Given :1; unsigned HSMHV_nsubwp_Given :1; unsigned HSMHV_scp1_Given :1; @@ -1671,7 +1942,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_sc4_Given :1; unsigned HSMHV_pgd1_Given :1; unsigned HSMHV_pgd2_Given :1; - unsigned HSMHV_pgd3_Given :1; unsigned HSMHV_pgd4_Given :1; unsigned HSMHV_ndep_Given :1; unsigned HSMHV_ndepl_Given :1; @@ -1822,11 +2092,23 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_rbdb_Given :1; unsigned HSMHV_rbsb_Given :1; unsigned HSMHV_ibpc1_Given :1; + unsigned HSMHV_ibpc1l_Given :1; + unsigned HSMHV_ibpc1lp_Given :1; unsigned HSMHV_ibpc2_Given :1; unsigned HSMHV_mphdfm_Given :1; + + unsigned HSMHV_ptl_Given :1; + unsigned HSMHV_ptp_Given :1; + unsigned HSMHV_pt2_Given :1; + unsigned HSMHV_ptlp_Given :1; + unsigned HSMHV_gdl_Given :1; + unsigned HSMHV_gdlp_Given :1; + + unsigned HSMHV_gdld_Given :1; + unsigned HSMHV_pt4_Given :1; + unsigned HSMHV_pt4p_Given :1; unsigned HSMHV_rdvg11_Given :1; unsigned HSMHV_rdvg12_Given :1; - unsigned HSMHV_qovsm_Given :1; unsigned HSMHV_ldrift_Given :1; unsigned HSMHV_rd20_Given :1; unsigned HSMHV_rd21_Given :1; @@ -1835,7 +2117,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_rd23_Given :1; unsigned HSMHV_rd24_Given :1; unsigned HSMHV_rd25_Given :1; - unsigned HSMHV_rd26_Given :1; unsigned HSMHV_rdvdl_Given :1; unsigned HSMHV_rdvdlp_Given :1; unsigned HSMHV_rdvds_Given :1; @@ -1893,7 +2174,78 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_ddrift_Given :1; /* substrate effect */ unsigned HSMHV_vbisub_Given :1; /* substrate effect */ unsigned HSMHV_nsubsub_Given :1; /* substrate effect */ + + unsigned HSMHV_rdrmue_Given :1; + unsigned HSMHV_rdrvmax_Given :1; + unsigned HSMHV_rdrmuetmp_Given :1; + unsigned HSMHV_myu0_leak_Given :1; + unsigned HSMHV_myu0_leaktmp_Given :1; + unsigned HSMHV_myu0_vmax_Given :1; + unsigned HSMHV_myu0_cotemp1_Given :1; + unsigned HSMHV_myu0_cotemp2_Given :1; + + unsigned HSMHV_rdrvtmp_Given :1; + unsigned HSMHV_rdrdjunc_Given :1; + unsigned HSMHV_rdrcx_Given :1; + unsigned HSMHV_rdrcar_Given :1; + unsigned HSMHV_rdrdl1_Given :1; + unsigned HSMHV_rdrdl2_Given :1; + unsigned HSMHV_rdrvmaxw_Given :1; + unsigned HSMHV_rdrvmaxwp_Given :1; + unsigned HSMHV_rdrvmaxl_Given :1; + unsigned HSMHV_rdrvmaxlp_Given :1; + unsigned HSMHV_rdrmuel_Given :1; + unsigned HSMHV_rdrmuelp_Given :1; + unsigned HSMHV_qovadd_Given :1; + unsigned HSMHV_rdrqover_Given :1; + unsigned HSMHV_js0d_Given :1; + unsigned HSMHV_js0swd_Given :1; + unsigned HSMHV_njd_Given :1; + unsigned HSMHV_njswd_Given :1; + unsigned HSMHV_xtid_Given :1; + unsigned HSMHV_cjd_Given :1; + unsigned HSMHV_cjswd_Given :1; + unsigned HSMHV_cjswgd_Given :1; + unsigned HSMHV_mjd_Given :1; + unsigned HSMHV_mjswd_Given :1; + unsigned HSMHV_mjswgd_Given :1; + unsigned HSMHV_pbd_Given :1; + unsigned HSMHV_pbswd_Given :1; + unsigned HSMHV_pbswgd_Given :1; + unsigned HSMHV_xti2d_Given :1; + unsigned HSMHV_cisbd_Given :1; + unsigned HSMHV_cvbd_Given :1; + unsigned HSMHV_ctempd_Given :1; + unsigned HSMHV_cisbkd_Given :1; + unsigned HSMHV_divxd_Given :1; + unsigned HSMHV_vdiffjd_Given :1; + unsigned HSMHV_js0s_Given :1; + unsigned HSMHV_js0sws_Given :1; + unsigned HSMHV_njs_Given :1; + unsigned HSMHV_njsws_Given :1; + unsigned HSMHV_xtis_Given :1; + unsigned HSMHV_cjs_Given :1; + unsigned HSMHV_cjsws_Given :1; + unsigned HSMHV_cjswgs_Given :1; + unsigned HSMHV_mjs_Given :1; + unsigned HSMHV_mjsws_Given :1; + unsigned HSMHV_mjswgs_Given :1; + unsigned HSMHV_pbs_Given :1; + unsigned HSMHV_pbsws_Given :1; + unsigned HSMHV_pbswgs_Given :1; + unsigned HSMHV_xti2s_Given :1; + unsigned HSMHV_cisbs_Given :1; + unsigned HSMHV_cvbs_Given :1; + unsigned HSMHV_ctemps_Given :1; + unsigned HSMHV_cisbks_Given :1; + unsigned HSMHV_divxs_Given :1; + unsigned HSMHV_vdiffjs_Given :1; unsigned HSMHV_shemax_Given :1; + unsigned HSMHV_vgsmin_Given :1; + unsigned HSMHV_gdsleak_Given :1; + unsigned HSMHV_rdrbb_Given :1; + unsigned HSMHV_rdrbbtmp_Given :1; + /* binning parameters */ unsigned HSMHV_lmin_Given :1; @@ -1922,7 +2274,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_lsc2_Given :1; unsigned HSMHV_lsc3_Given :1; unsigned HSMHV_lpgd1_Given :1; - unsigned HSMHV_lpgd3_Given :1; unsigned HSMHV_lndep_Given :1; unsigned HSMHV_lninv_Given :1; unsigned HSMHV_lmuecb0_Given :1; @@ -1974,7 +2325,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_lglkb2_Given :1; unsigned HSMHV_lnftrp_Given :1; unsigned HSMHV_lnfalp_Given :1; - unsigned HSMHV_lpthrou_Given :1; unsigned HSMHV_lvdiffj_Given :1; unsigned HSMHV_libpc1_Given :1; unsigned HSMHV_libpc2_Given :1; @@ -1996,6 +2346,16 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_lrs_Given :1; unsigned HSMHV_lrth0_Given :1; unsigned HSMHV_lvover_Given :1; + unsigned HSMHV_ljs0d_Given :1; + unsigned HSMHV_ljs0swd_Given :1; + unsigned HSMHV_lnjd_Given :1; + unsigned HSMHV_lcisbkd_Given :1; + unsigned HSMHV_lvdiffjd_Given :1; + unsigned HSMHV_ljs0s_Given :1; + unsigned HSMHV_ljs0sws_Given :1; + unsigned HSMHV_lnjs_Given :1; + unsigned HSMHV_lcisbks_Given :1; + unsigned HSMHV_lvdiffjs_Given :1; /* Width dependence */ unsigned HSMHV_wvmax_Given :1; @@ -2016,7 +2376,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_wsc2_Given :1; unsigned HSMHV_wsc3_Given :1; unsigned HSMHV_wpgd1_Given :1; - unsigned HSMHV_wpgd3_Given :1; unsigned HSMHV_wndep_Given :1; unsigned HSMHV_wninv_Given :1; unsigned HSMHV_wmuecb0_Given :1; @@ -2068,7 +2427,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_wglkb2_Given :1; unsigned HSMHV_wnftrp_Given :1; unsigned HSMHV_wnfalp_Given :1; - unsigned HSMHV_wpthrou_Given :1; unsigned HSMHV_wvdiffj_Given :1; unsigned HSMHV_wibpc1_Given :1; unsigned HSMHV_wibpc2_Given :1; @@ -2090,6 +2448,16 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_wrs_Given :1; unsigned HSMHV_wrth0_Given :1; unsigned HSMHV_wvover_Given :1; + unsigned HSMHV_wjs0d_Given :1; + unsigned HSMHV_wjs0swd_Given :1; + unsigned HSMHV_wnjd_Given :1; + unsigned HSMHV_wcisbkd_Given :1; + unsigned HSMHV_wvdiffjd_Given :1; + unsigned HSMHV_wjs0s_Given :1; + unsigned HSMHV_wjs0sws_Given :1; + unsigned HSMHV_wnjs_Given :1; + unsigned HSMHV_wcisbks_Given :1; + unsigned HSMHV_wvdiffjs_Given :1; /* Cross-term dependence */ unsigned HSMHV_pvmax_Given :1; @@ -2110,7 +2478,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_psc2_Given :1; unsigned HSMHV_psc3_Given :1; unsigned HSMHV_ppgd1_Given :1; - unsigned HSMHV_ppgd3_Given :1; unsigned HSMHV_pndep_Given :1; unsigned HSMHV_pninv_Given :1; unsigned HSMHV_pmuecb0_Given :1; @@ -2162,7 +2529,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_pglkb2_Given :1; unsigned HSMHV_pnftrp_Given :1; unsigned HSMHV_pnfalp_Given :1; - unsigned HSMHV_ppthrou_Given :1; unsigned HSMHV_pvdiffj_Given :1; unsigned HSMHV_pibpc1_Given :1; unsigned HSMHV_pibpc2_Given :1; @@ -2184,13 +2550,23 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ unsigned HSMHV_prs_Given :1; unsigned HSMHV_prth0_Given :1; unsigned HSMHV_pvover_Given :1; + unsigned HSMHV_pjs0d_Given :1; + unsigned HSMHV_pjs0swd_Given :1; + unsigned HSMHV_pnjd_Given :1; + unsigned HSMHV_pcisbkd_Given :1; + unsigned HSMHV_pvdiffjd_Given :1; + unsigned HSMHV_pjs0s_Given :1; + unsigned HSMHV_pjs0sws_Given :1; + unsigned HSMHV_pnjs_Given :1; + unsigned HSMHV_pcisbks_Given :1; + unsigned HSMHV_pvdiffjs_Given :1; - unsigned HSMHVvgsMaxGiven :1; - unsigned HSMHVvgdMaxGiven :1; - unsigned HSMHVvgbMaxGiven :1; - unsigned HSMHVvdsMaxGiven :1; - unsigned HSMHVvbsMaxGiven :1; - unsigned HSMHVvbdMaxGiven :1; + unsigned HSMHVvgsMaxGiven :1; + unsigned HSMHVvgdMaxGiven :1; + unsigned HSMHVvgbMaxGiven :1; + unsigned HSMHVvdsMaxGiven :1; + unsigned HSMHVvbsMaxGiven :1; + unsigned HSMHVvbdMaxGiven :1; } HSMHVmodel; @@ -2232,6 +2608,10 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_COSYM 37 /* Symmery model for HV */ #define HSMHV_MOD_COTEMP 38 #define HSMHV_MOD_COLDRIFT 39 +#define HSMHV_MOD_CORDRIFT 40 +#define HSMHV_MOD_COERRREP 44 +#define HSMHV_MOD_CODEP 45 +#define HSMHV_MOD_CODDLT 46 /* device parameters */ #define HSMHV_COSELFHEAT 49 #define HSMHV_COSUBNODE 50 @@ -2307,7 +2687,12 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_LDRIFT1S 324 #define HSMHV_MOD_LDRIFT2S 325 #define HSMHV_MOD_SUBLD1 321 +#define HSMHV_MOD_SUBLD1L 329 +#define HSMHV_MOD_SUBLD1LP 330 #define HSMHV_MOD_SUBLD2 322 +#define HSMHV_MOD_XPDV 326 +#define HSMHV_MOD_XPVDTH 327 +#define HSMHV_MOD_XPVDTHG 328 #define HSMHV_MOD_DDLTMAX 421 /* Vdseff */ #define HSMHV_MOD_DDLTSLP 422 /* Vdseff */ #define HSMHV_MOD_DDLTICT 423 /* Vdseff */ @@ -2409,17 +2794,35 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_PBSW 176 #define HSMHV_MOD_PBSWG 177 #define HSMHV_MOD_TPOLY 179 -/* #define HSMHV_MOD_TPOLYLD 477 not used */ +/* #define HSMHV_MOD_TPOLYLD not used */ #define HSMHV_MOD_LP 180 #define HSMHV_MOD_NSUBP 181 #define HSMHV_MOD_NSUBP0 182 #define HSMHV_MOD_NSUBWP 183 +#define HSMHV_MOD_NDEPM 600 +#define HSMHV_MOD_TNDEP 601 +#define HSMHV_MOD_DEPMUE0 605 +#define HSMHV_MOD_DEPMUE1 606 +#define HSMHV_MOD_DEPMUEBACK0 607 +#define HSMHV_MOD_DEPMUEBACK1 608 +#define HSMHV_MOD_DEPVMAX 609 +#define HSMHV_MOD_DEPBB 610 +#define HSMHV_MOD_DEPVDSEF1 611 +#define HSMHV_MOD_DEPVDSEF2 612 +#define HSMHV_MOD_DEPMUEPH0 613 +#define HSMHV_MOD_DEPMUEPH1 614 +#define HSMHV_MOD_DEPLEAK 615 +#define HSMHV_MOD_DEPETA 616 +#define HSMHV_MOD_DEPVTMP 617 +#define HSMHV_MOD_DEPMUETMP 618 +#define HSMHV_MOD_ISBREAK 619 +#define HSMHV_MOD_RWELL 620 #define HSMHV_MOD_SCP1 184 #define HSMHV_MOD_SCP2 185 #define HSMHV_MOD_SCP3 186 #define HSMHV_MOD_PGD1 187 #define HSMHV_MOD_PGD2 188 -#define HSMHV_MOD_PGD3 189 +//#define HSMHV_MOD_PGD3 #define HSMHV_MOD_PGD4 190 #define HSMHV_MOD_CLM1 191 #define HSMHV_MOD_CLM2 192 @@ -2481,7 +2884,7 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_BS1 245 #define HSMHV_MOD_BS2 246 #define HSMHV_MOD_KAPPA 251 -#define HSMHV_MOD_PTHROU 253 +//#define HSMHV_MOD_PTHROU 253 #define HSMHV_MOD_VDIFFJ 254 #define HSMHV_MOD_DLY1 255 #define HSMHV_MOD_DLY2 256 @@ -2516,8 +2919,21 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_SLGLP 311 #define HSMHV_MOD_SUB1LP 312 #define HSMHV_MOD_IBPC1 404 +#define HSMHV_MOD_IBPC1L 331 +#define HSMHV_MOD_IBPC1LP 332 #define HSMHV_MOD_IBPC2 405 #define HSMHV_MOD_MPHDFM 409 + +#define HSMHV_MOD_PTL 530 +#define HSMHV_MOD_PTP 531 +#define HSMHV_MOD_PT2 532 +#define HSMHV_MOD_PTLP 533 +#define HSMHV_MOD_GDL 534 +#define HSMHV_MOD_GDLP 535 + +#define HSMHV_MOD_GDLD 536 +#define HSMHV_MOD_PT4 537 +#define HSMHV_MOD_PT4P 538 #define HSMHV_MOD_RDVG11 424 #define HSMHV_MOD_RDVG12 425 #define HSMHV_MOD_RTH0 432 @@ -2537,8 +2953,8 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_VBISUB 484 /* substrate effect */ #define HSMHV_MOD_NSUBSUB 485 /* substrate effect */ -#define HSMHV_MOD_QOVSM 323 -#define HSMHV_MOD_LDRIFT 458 +//#define HSMHV_MOD_QOVSM 323 +//#define HSMHV_MOD_LDRIFT 458 #define HSMHV_MOD_RD20 447 #define HSMHV_MOD_RD21 441 #define HSMHV_MOD_RD22 442 @@ -2546,7 +2962,6 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_RD23 443 #define HSMHV_MOD_RD24 444 #define HSMHV_MOD_RD25 445 -#define HSMHV_MOD_RD26 446 #define HSMHV_MOD_RDVDL 448 #define HSMHV_MOD_RDVDLP 449 #define HSMHV_MOD_RDVDS 450 @@ -2573,7 +2988,77 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_CVDSOVER 480 -#define HSMHV_MOD_SHEMAX 100 + +#define HSMHV_MOD_RDRMUE 520 +#define HSMHV_MOD_RDRVMAX 521 +#define HSMHV_MOD_RDRMUETMP 522 +#define HSMHV_MOD_M0LEAK 524 +#define HSMHV_MOD_M0LEAKTMP 525 +#define HSMHV_MOD_LEAKVMAX 543 +#define HSMHV_MOD_M0TEMP1 551 +#define HSMHV_MOD_M0TEMP2 553 + +#define HSMHV_MOD_RDRVTMP 523 +#define HSMHV_MOD_RDRDJUNC 527 +#define HSMHV_MOD_RDRCX 528 +#define HSMHV_MOD_RDRCAR 529 +#define HSMHV_MOD_RDRDL1 540 +#define HSMHV_MOD_RDRDL2 541 +#define HSMHV_MOD_RDRVMAXW 544 +#define HSMHV_MOD_RDRVMAXWP 545 +#define HSMHV_MOD_RDRVMAXL 546 +#define HSMHV_MOD_RDRVMAXLP 547 +#define HSMHV_MOD_RDRMUEL 548 +#define HSMHV_MOD_RDRMUELP 549 +#define HSMHV_MOD_RDRQOVER 552 +#define HSMHV_MOD_QOVADD 338 +#define HSMHV_MOD_JS0D 100 +#define HSMHV_MOD_JS0SWD 150 +#define HSMHV_MOD_NJD 153 +#define HSMHV_MOD_NJSWD 189 +#define HSMHV_MOD_XTID 194 +#define HSMHV_MOD_CJD 196 +#define HSMHV_MOD_CJSWD 197 +#define HSMHV_MOD_CJSWGD 247 +#define HSMHV_MOD_MJD 252 +#define HSMHV_MOD_MJSWD 253 +#define HSMHV_MOD_MJSWGD 264 +#define HSMHV_MOD_PBD 265 +#define HSMHV_MOD_PBSWD 266 +#define HSMHV_MOD_PBSWDG 267 +#define HSMHV_MOD_XTI2D 268 +#define HSMHV_MOD_CISBD 269 +#define HSMHV_MOD_CVBD 270 +#define HSMHV_MOD_CTEMPD 271 +#define HSMHV_MOD_CISBKD 272 +#define HSMHV_MOD_DIVXD 274 +#define HSMHV_MOD_VDIFFJD 275 +#define HSMHV_MOD_JS0S 276 +#define HSMHV_MOD_JS0SWS 277 +#define HSMHV_MOD_NJS 278 +#define HSMHV_MOD_NJSWS 279 +#define HSMHV_MOD_XTIS 280 +#define HSMHV_MOD_CJS 288 +#define HSMHV_MOD_CJSSW 289 +#define HSMHV_MOD_CJSWGS 291 +#define HSMHV_MOD_MJS 293 +#define HSMHV_MOD_MJSWS 298 +#define HSMHV_MOD_MJSWGS 299 +#define HSMHV_MOD_PBS 300 +#define HSMHV_MOD_PBSWS 302 +#define HSMHV_MOD_PBSWSG 323 +#define HSMHV_MOD_XTI2S 333 +#define HSMHV_MOD_CISBS 334 +#define HSMHV_MOD_CVBS 335 +#define HSMHV_MOD_CTEMPS 336 +#define HSMHV_MOD_CISBKS 337 +#define HSMHV_MOD_DIVXS 339 +#define HSMHV_MOD_VDIFFJS 340 +#define HSMHV_MOD_SHEMAX 501 +#define HSMHV_MOD_VGSMIN 502 +#define HSMHV_MOD_GDSLEAK 511 +#define HSMHV_MOD_RDRBB 273 +#define HSMHV_MOD_RDRBBTMP 602 /* binning parameters */ #define HSMHV_MOD_LMIN 1000 @@ -2602,7 +3087,7 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_LSC2 1127 #define HSMHV_MOD_LSC3 1128 #define HSMHV_MOD_LPGD1 1187 -#define HSMHV_MOD_LPGD3 1189 +//#define HSMHV_MOD_LPGD3 1189 #define HSMHV_MOD_LNDEP 1129 #define HSMHV_MOD_LNINV 1130 #define HSMHV_MOD_LMUECB0 1131 @@ -2654,7 +3139,7 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_LGLKB2 1219 #define HSMHV_MOD_LNFTRP 1258 #define HSMHV_MOD_LNFALP 1259 -#define HSMHV_MOD_LPTHROU 1253 +//#define HSMHV_MOD_LPTHROU 1253 #define HSMHV_MOD_LVDIFFJ 1254 #define HSMHV_MOD_LIBPC1 1404 #define HSMHV_MOD_LIBPC2 1405 @@ -2676,6 +3161,16 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_LRS 1398 #define HSMHV_MOD_LRTH0 1432 #define HSMHV_MOD_LVOVER 1199 +#define HSMHV_MOD_LJS0D 345 +#define HSMHV_MOD_LJS0SWD 370 +#define HSMHV_MOD_LNJD 372 +#define HSMHV_MOD_LCISBKD 386 +#define HSMHV_MOD_LVDIFFJD 387 +#define HSMHV_MOD_LJS0S 388 +#define HSMHV_MOD_LJS0SWS 395 +#define HSMHV_MOD_LNJS 396 +#define HSMHV_MOD_LCISBKS 397 +#define HSMHV_MOD_LVDIFFJS 400 /* Width dependence */ #define HSMHV_MOD_WVMAX 2100 @@ -2696,7 +3191,7 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_WSC2 2127 #define HSMHV_MOD_WSC3 2128 #define HSMHV_MOD_WPGD1 2187 -#define HSMHV_MOD_WPGD3 2189 +//#define HSMHV_MOD_WPGD3 2189 #define HSMHV_MOD_WNDEP 2129 #define HSMHV_MOD_WNINV 2130 #define HSMHV_MOD_WMUECB0 2131 @@ -2748,7 +3243,7 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_WGLKB2 2219 #define HSMHV_MOD_WNFTRP 2258 #define HSMHV_MOD_WNFALP 2259 -#define HSMHV_MOD_WPTHROU 2253 +//#define HSMHV_MOD_WPTHROU 2253 #define HSMHV_MOD_WVDIFFJ 2254 #define HSMHV_MOD_WIBPC1 2404 #define HSMHV_MOD_WIBPC2 2405 @@ -2770,6 +3265,16 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_WRS 2398 #define HSMHV_MOD_WRTH0 2432 #define HSMHV_MOD_WVOVER 2199 +#define HSMHV_MOD_WJS0D 401 +#define HSMHV_MOD_WJS0SWD 435 +#define HSMHV_MOD_WNJD 440 +#define HSMHV_MOD_WCISBKD 446 +#define HSMHV_MOD_WVDIFFJD 459 +#define HSMHV_MOD_WJS0S 460 +#define HSMHV_MOD_WJS0SWS 467 +#define HSMHV_MOD_WNJS 468 +#define HSMHV_MOD_WCISBKS 469 +#define HSMHV_MOD_WVDIFFJS 477 /* Cross-term dependence */ #define HSMHV_MOD_PVMAX 3100 @@ -2790,7 +3295,7 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_PSC2 3127 #define HSMHV_MOD_PSC3 3128 #define HSMHV_MOD_PPGD1 3187 -#define HSMHV_MOD_PPGD3 3189 +//#define HSMHV_MOD_PPGD3 3189 #define HSMHV_MOD_PNDEP 3129 #define HSMHV_MOD_PNINV 3130 #define HSMHV_MOD_PMUECB0 3131 @@ -2842,7 +3347,7 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_PGLKB2 3219 #define HSMHV_MOD_PNFTRP 3258 #define HSMHV_MOD_PNFALP 3259 -#define HSMHV_MOD_PPTHROU 3253 +//#define HSMHV_MOD_PPTHROU 3253 #define HSMHV_MOD_PVDIFFJ 3254 #define HSMHV_MOD_PIBPC1 3404 #define HSMHV_MOD_PIBPC2 3405 @@ -2864,6 +3369,16 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_PRS 3398 #define HSMHV_MOD_PRTH0 3432 #define HSMHV_MOD_PVOVER 3199 +#define HSMHV_MOD_PJS0D 479 +#define HSMHV_MOD_PJS0SWD 486 +#define HSMHV_MOD_PNJD 487 +#define HSMHV_MOD_PCISBKD 488 +#define HSMHV_MOD_PVDIFFJD 489 +#define HSMHV_MOD_PJS0S 495 +#define HSMHV_MOD_PJS0SWS 496 +#define HSMHV_MOD_PNJS 497 +#define HSMHV_MOD_PCISBKS 498 +#define HSMHV_MOD_PVDIFFJS 499 /* device requests */ #define HSMHV_DNODE 341 @@ -2927,6 +3442,8 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_GBMIN 394 #define HSMHV_ISUB 410 +#define HSMHV_ISUBLD 426 +#define HSMHV_IDSIBPC 427 #define HSMHV_IGIDL 411 #define HSMHV_IGISL 412 #define HSMHV_IGD 413 diff --git a/src/spicelib/devices/hisimhv1/hsmhvdel.c b/src/spicelib/devices/hisimhv1/hsmhvdel.c index 8e838fc58..2a720e701 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvdel.c +++ b/src/spicelib/devices/hisimhv1/hsmhvdel.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvdel.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "hsmhvdef.h" #include "ngspice/sperror.h" diff --git a/src/spicelib/devices/hisimhv1/hsmhvdest.c b/src/spicelib/devices/hisimhv1/hsmhvdest.c index d31b06616..016ac8adf 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvdest.c +++ b/src/spicelib/devices/hisimhv1/hsmhvdest.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvdest.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "hsmhvdef.h" #include "ngspice/suffix.h" diff --git a/src/spicelib/devices/hisimhv1/hsmhveval.c b/src/spicelib/devices/hisimhv1/hsmhveval.c index d083ff320..5a2798fa3 100644 --- a/src/spicelib/devices/hisimhv1/hsmhveval.c +++ b/src/spicelib/devices/hisimhv1/hsmhveval.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_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhveval.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & @@ -25,61 +25,36 @@ All users need to follow the "HISIM_HV Distribution Statement and Copyright Notice" attached to HiSIM_HV model. -----HISIM_HV Distribution Statement and Copyright Notice-------------- - Hiroshima University and/or Semiconductor Technology Academic Research -Center ("STARC") grants to Licensee a worldwide, royalty-free, -sub-licensable, retroactive, perpetual, irrevocable license to make, -have made, offer to sell, sell, import, export, use, copy, redistribute, -perform, display and incorporate HiSIM_HV intellectual property (the -"License") subject to the conditions set forth below. - This License includes rights to use and modify copyrighted material -for any purpose if the copyright is acknowledged as well as the use of -related patents which STARC owns, has applied for or will apply for -in connection with HiSIM_HV intellectual property for the purpose of -implementing and using he HiSIM_HV intellectual property in connection -with the standard. This license applies to all past and future versions -of HiSIM_HV. -1. HiSIM_HV intellectual property is offered "as is" without any warranty, -explicit or implied, or service support. Hiroshima University, STARC, -its University staff and employees assume no liability for the quality -and performance of HiSIM_HV intellectual property. +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. -2. As the owner of the HiSIM_HV intellectual property, and all other -related rights, Hiroshima University and/or STARC grant the License -as set forth above. +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. -3. A Licensee may not charge an end user a fee for the HiSIM_HV source -code, which Hiroshima University and STARC own, by itself, however, -a Licensee may charge an end user a fee for alterations or additions -to the HiSIM_HV source code or for maintenance service. +Hiroshima University and STARC hereby disclaims all implied warranties. -4. A Licensee of HiSIM_HV intellectual property agrees that Hiroshima -University and STARC are the developers of HiSIM_HV in all products -containing HiSIM_HV and the alteration thereof (subject to Licensee's -ownership of the alterations). -If future versions of HiSIM_HV incorporate elements of other CMC models -the copyrights of those elements remains with the original developers. -For this purpose the copyright notice as shown below shall be used. +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions -"The HiSIM_HV source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code, is owned -by Hiroshima University and/or STARC." +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. -5. A Licensee of HiSIM_HV intellectual property will comply with the -export obligations pertaining to the export of the HiSIM_HV intellectual -property. - -6. By using HiSIM_HV intellectual property owned by Hiroshima University -and/or STARC, Licensee agrees not to prosecute any patents or patent -held by Licensee that are required for implementation of HiSIM_HV against -any party who is infringing those patents solely by implementing and/or -using the HiSIM_HV standard. +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 in June 2011) +June 2008 (revised October 2011) *************************************************************************/ /********************************************************************* @@ -160,15 +135,8 @@ June. 2008 (revised in June 2011) #define C_gidl_delta 0.5 /* local variables used in macro functions */ -static double TMF0 , TMF1 , TMF2 , TMF3 , TMF4 , TMF5 , TMF6 ; -/*===========================================================* -* pow -*=================*/ -#ifdef POW_TO_EXP_AND_LOG -#define Fn_Pow( x , y ) exp( y * log( x ) ) -#else -#define Fn_Pow( x , y ) pow( x , y ) -#endif +double TMF0 , TMF1 , TMF2 , TMF3 , TMF4 , TMF5 , TMF6 ; +double TCF0 , TCF1 , TCF2 , TCF3 , TCF4 , TCF5 ; /*===========================================================* * Exp() for PGD. @@ -288,6 +256,115 @@ static double TMF0 , TMF1 , TMF2 , TMF3 , TMF4 , TMF5 , TMF6 ; 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_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 ; \ + } \ +} + +#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 ; \ + } \ +} + + + /*---------------------------------------------------* * Declining function using a polynomial. *-----------------*/ @@ -357,6 +434,8 @@ static double TMF0 , TMF1 , TMF2 , TMF3 , TMF4 , TMF5 , TMF6 ; dx = - 2.0 * TMF3 / ( TMF2 * TMF2 ) ; \ } + + /*===========================================================* * Function hsmhvevaluate. *=================*/ @@ -371,6 +450,7 @@ int HSMHVevaluate double vbs_jct, double vbd_jct, double Vsubs, /* substrate-source voltage */ + double Vddp, /* drain-drainPrime voltage */ double deltemp, HSMHVinstance *here, HSMHVmodel *model, @@ -379,7 +459,7 @@ int HSMHVevaluate { HSMHVbinningParam *pParam = &here->pParam ; HSMHVmodelMKSParam *modelMKS = &model->modelMKS ; - HSMHVhereMKSParam *hereMKS = &here->hereMKS ; +/* HSMHVhereMKSParam *hereMKS = &here->hereMKS ;*/ /*-----------------------------------* * Constants for Smoothing functions *---------------*/ @@ -391,12 +471,11 @@ int HSMHVevaluate const double rdsl2_dlt = 10.0e-3 * C_cm2m ; const double rdsu2_dlt = 50.0e-6 * C_cm2m ; const double rdsz_dlt = 0.1e-3 * C_cm2m ; - const double qme2_dlt = 5.0e-2 ; +/* const double qme2_dlt = 5.0e-2 ;*/ const double eef_dlt = 1.0e-2 / C_cm2m ; 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 psia2_dlt = 5.0e-3 ;*/ const double psisti_dlt = 5.0e-3 ; /*---------------------------------------------------* @@ -405,8 +484,12 @@ int HSMHVevaluate /* Constants ----------------------- */ const int lp_s0_max = 20 ; const int lp_sl_max = 40 ; + const int lp_se_max = 150 ; + const double dP_max = 0.1e0 ; const double ps_conv = 1.0e-12 ; + const double ps_conv2 = 1.0e-10 ; + /* double ps_conv = 1.0e-13 ;*/ const double gs_conv = 1.0e-8 ; /** depletion **/ @@ -434,7 +517,7 @@ int HSMHVevaluate /* const double Vds_max = 10.5e0 ; */ /* const double Vgs_max = 10.5e0 ; */ const double epsm10 = 10.0e0 * C_EPS_M ; - const double small = 1.0e-50 ; + const double small = 1.0e-25 ; const double small2= 1e-12 ; /* for Ra(Vdse) dependence */ const double c_exp_2 = 7.38905609893065 ; const double large_arg = 80 ; // log(1.0e100) ; @@ -442,7 +525,6 @@ int HSMHVevaluate double Vbs_max = 0.8e0, Vbs_max_dT =0.0 ; double Vbs_bnd = 0.4e0, Vbs_bnd_dT =0.0 ; /* start point of positive Vbs bending */ double Gdsmin = 0.0 ; - double Gjmin = ckt->CKTgmin ; /* Internal flags --------------------*/ int flg_err = 0 ; /* error level */ @@ -465,7 +547,7 @@ int HSMHVevaluate double Ps0 =0.0, Ps0_dVbs =0.0, Ps0_dVds =0.0, Ps0_dVgs =0.0, Ps0_dT =0.0 ; double Ps0_ini =0.0 ; double Ps0_iniA =0.0, Ps0_iniA_dVxb =0.0, Ps0_iniA_dVgb =0.0, Ps0_iniA_dT =0.0 ; - double Ps0_iniB =0.0;/*, Ps0_iniB_dVxb =0.0, Ps0_iniB_dVgb =0.0, Ps0_iniB_dT =0.0 ;*/ + double Ps0_iniB =0.0, Ps0_iniB_dVxb =0.0, Ps0_iniB_dVgb =0.0, Ps0_iniB_dT =0.0 ; /* Psl : surface potential at the drain side */ double Psl =0.0, Psl_dVbs =0.0, Psl_dVds =0.0, Psl_dVgs =0.0, Psl_dT =0.0 ; double Psl_lim =0.0, dPlim =0.0 ; @@ -492,10 +574,10 @@ int HSMHVevaluate double Pzadd =0.0, Pzadd_dVbs =0.0, Pzadd_dVds =0.0, Pzadd_dVgs =0.0, Pzadd_dT =0.0 ; /* IBPC */ - double dVbsIBPC =0.0, dVbsIBPC_dVbs =0.0, dVbsIBPC_dVds =0.0, dVbsIBPC_dVgs =0.0, dVbsIBPC_dT =0.0 ; - double dG3 =0.0, dG3_dVbs =0.0, dG3_dVds =0.0, dG3_dVgs =0.0, dG3_dT =0.0 ; - double dG4 =0.0, dG4_dVbs =0.0, dG4_dVds =0.0, dG4_dVgs =0.0, dG4_dT =0.0 ; - double dIdd =0.0, dIdd_dVbs =0.0, dIdd_dVds =0.0, dIdd_dVgs =0.0, dIdd_dT =0.0 ; + double dVbsIBPC =0.0, dVbsIBPC_dVbs =0.0, dVbsIBPC_dVds =0.0, dVbsIBPC_dVgs =0.0, dVbsIBPC_dT =0.0 , dVbsIBPC_dVddp =0.0 ; + double dG3 =0.0, dG3_dVbs =0.0, dG3_dVds =0.0, dG3_dVgs =0.0, dG3_dT =0.0 , dG3_dVddp =0.0 ; + double dG4 =0.0, dG4_dVbs =0.0, dG4_dVds =0.0, dG4_dVgs =0.0, dG4_dT =0.0 , dG4_dVddp =0.0 ; + double dIdd =0.0, dIdd_dVbs =0.0, dIdd_dVds =0.0, dIdd_dVgs =0.0, dIdd_dT =0.0 , dIdd_dVddp =0.0 ; double betaWL =0.0, betaWL_dVbs =0.0, betaWL_dVds =0.0, betaWL_dVgs =0.0, betaWL_dT =0.0 ; @@ -512,9 +594,6 @@ int HSMHVevaluate double dVth0_dVb =0.0, dVth0_dVd =0.0, dVth0_dVg =0.0, dVth0_dT =0.0 ; double dVthSC =0.0 ; double dVthSC_dVb =0.0, dVthSC_dVd =0.0, dVthSC_dVg =0.0, dVthSC_dT =0.0 ; - double delta0 = 5.0e-3 ; - double Psi_a =0.0, Psi_a_dVg =0.0, Psi_a_dVb =0.0, Psi_a_dVd =0.0, Psi_a_dT =0.0 ; - double Pb20a =0.0, Pb20a_dVg =0.0, Pb20a_dVb =0.0, Pb20a_dVd =0.0, Pb20a_dT =0.0 ; double Pb20b =0.0, Pb20b_dVg =0.0, Pb20b_dVb =0.0, Pb20b_dVd =0.0, Pb20b_dT =0.0 ; double dVthW =0.0, dVthW_dVb =0.0, dVthW_dVd =0.0, dVthW_dVg =0.0, dVthW_dT =0.0 ; /* Alpha and related parameters */ @@ -542,7 +621,7 @@ int HSMHVevaluate double costi0 =0.0 ; double costi1 =0.0, costi1_dT =0.0 ; double costi3 =0.0, costi3_dVb =0.0, costi3_dVd =0.0, costi3_dVg =0.0, costi3_dT =0.0 ; - double costi3_dVb_c3 =0.0, costi3_dVd_c3 =0.0, costi3_dVg_c3 =0.0;/*, costi3_dT_c3 =0.0 ;*/ + double costi3_dVb_c3 =0.0, costi3_dVd_c3 =0.0, costi3_dVg_c3 =0.0, costi3_dT_c3 =0.0 ; double costi4 =0.0, costi4_dT =0.0 ; double costi5 =0.0, costi5_dT =0.0 ; double costi6 =0.0, costi6_dT =0.0 ; @@ -564,7 +643,7 @@ int HSMHVevaluate double Pb2c =0.0 ; double Vfb =0.0 ; double c_eox =0.0 ; - double Leff =0.0, Weff =0.0, WeffLD_nf =0.0, Ldrift =0.0 ; + double Leff =0.0, Weff =0.0, WeffLD_nf =0.0 ; double Ldrift0 =0.0 ; double q_Nsub =0.0 ; /* PART-1 */ @@ -583,8 +662,8 @@ int HSMHVevaluate double bs12=0.0, bs12_dVb=0.0, bs12_dVd =0.0, bs12_dVg =0.0, bs12_dT =0.0 ; double Qbmm=0.0, Qbmm_dVb=0.0, Qbmm_dVd =0.0, Qbmm_dVg =0.0, Qbmm_dT =0.0 ; double dqb=0.0, dqb_dVb=0.0, dqb_dVg=0.0, dqb_dVd =0.0, dqb_dT =0.0 ; - double Vdx=0.0, Vdx_dVbs=0.0;/*, Vdx_dT=0.0 ;*/ - double Vdx2=0.0, Vdx2_dVbs=0.0;/*, Vdx2_dT=0.0 ;*/ + double Vdx=0.0, Vdx_dVbs=0.0, Vdx_dT=0.0 ; + double Vdx2=0.0, Vdx2_dVbs=0.0, Vdx2_dT=0.0 ; double Pbsum=0.0, Pbsum_dVb=0.0, Pbsum_dVd=0.0, Pbsum_dVg =0.0, Pbsum_dT =0.0 ; double sqrt_Pbsum =0.0 ; /* Poly-Depletion Effect */ @@ -619,8 +698,6 @@ int HSMHVevaluate /* connecting function */ double FD2 =0.0, FD2_dVbs =0.0, FD2_dVds =0.0, FD2_dVgs =0.0, FD2_dT =0.0 ; double FMDVDS =0.0, FMDVDS_dVbs =0.0, FMDVDS_dVds =0.0, FMDVDS_dVgs =0.0, FMDVDS_dT =0.0 ; - double FMDVGS =0.0, FMDVGS_dVgs =0.0 ; - double FMDPG =0.0, FMDPG_dVbs =0.0, FMDPG_dVds =0.0, FMDPG_dVgs =0.0, FMDPG_dT =0.0 ; double cnst0 =0.0, cnst0_dT =0.0; double cnst1 =0.0, cnst1_dT =0.0; @@ -653,6 +730,7 @@ int HSMHVevaluate double Quot =0.0 ; double Qdrat =0.5, Qdrat_dVbs =0.0, Qdrat_dVds =0.0, Qdrat_dVgs =0.0, Qdrat_dT =0.0 ; double Idd =0.0, Idd_dVbs =0.0, Idd_dVds =0.0, Idd_dVgs =0.0, Idd_dT =0.0 ; + double Idd1 =0.0, Idd1_dVbs =0.0, Idd1_dVds =0.0, Idd1_dVgs =0.0, Idd1_dT =0.0 ; double Fdd =0.0, Fdd_dVbs =0.0, Fdd_dVds =0.0, Fdd_dVgs =0.0, Fdd_dT =0.0 ; double Eeff =0.0, Eeff_dVbs =0.0, Eeff_dVds =0.0, Eeff_dVgs =0.0, Eeff_dT =0.0 ; double Rns =0.0, Rns_dT =0.0 ; @@ -673,7 +751,8 @@ int HSMHVevaluate double F10 =0.0, F10_dVbs =0.0, F10_dVds =0.0, F10_dVgs =0.0, F10_dT =0.0 ; double F30 =0.0, F30_dVbs =0.0, F30_dVds =0.0, F30_dVgs =0.0, F30_dT =0.0 ; double F11 =0.0, F11_dVbs =0.0, F11_dVds =0.0, F11_dVgs =0.0, F11_dT =0.0 ; - double Ps0_min =0.0, Ps0_min_dT =0.0 ; + double Vgs_min =0.0 ; + double Ps0_min =0.0, Ps0_min_dVbs =0.0, Ps0_min_dVds =0.0, Ps0_min_dVgs =0.0, Ps0_min_dT =0.0 ; double Acn =0.0, Acn_dVbs =0.0, Acn_dVds =0.0, Acn_dVgs =0.0, Acn_dT =0.0 ; double Acd =0.0, Acd_dVbs =0.0, Acd_dVds =0.0, Acd_dVgs =0.0, Acd_dT =0.0 ; double Ac1 =0.0, Ac1_dVbs =0.0, Ac1_dVds =0.0, Ac1_dVgs =0.0, Ac1_dT =0.0 ; @@ -685,7 +764,8 @@ int HSMHVevaluate double ninvd_dT =0.0 ; /* PART-2 (Isub) */ double Isub =0.0, Isub_dVbs =0.0, Isub_dVds =0.0, Isub_dVgs =0.0, Isub_dT=0.0 ; - double Isub_dVdse = 0.0 ; + double IsubLD =0.0, IsubLD_dVbs =0.0, IsubLD_dVds =0.0, IsubLD_dVgs =0.0, IsubLD_dT=0.0 ; + double IsubLD_dVddp = 0.0 ; double Psislsat =0.0, Psislsat_dVb =0.0, Psislsat_dVd =0.0, Psislsat_dVg =0.0, Psislsat_dT =0.0 ; double Psisubsat =0.0, Psisubsat_dVb =0.0, Psisubsat_dVd =0.0, Psisubsat_dVg =0.0, Psisubsat_dT =0.0 ; double Ifn =0.0, Ifn_dVb =0.0, Ifn_dVd=0.0, Ifn_dVg=0.0, Ifn_dT = 0.0 ; @@ -707,20 +787,7 @@ int HSMHVevaluate double Ec =0.0, Ec_dVbs =0.0, Ec_dVds =0.0, Ec_dVgs =0.0, Ec_dT =0.0 ; double Pslk =0.0, Pslk_dVbs =0.0, Pslk_dVds =0.0, Pslk_dVgs =0.0, Pslk_dT =0.0 ; double Qy =0.0, Qy_dVbs =0.0, Qy_dVds =0.0, Qy_dVgs =0.0, Qy_dT =0.0 ; - /* PART-4 (junction diode) */ - double Ibs =0.0, Gbs =0.0, Gbse =0.0, Ibs_dT =0.0 ; - double Ibd =0.0, Gbd =0.0, Gbde =0.0, Ibd_dT =0.0 ; -/* double Nvtm =0.0 ;*/ - /* junction capacitance */ - double Qbs =0.0, Capbs =0.0, Capbse =0.0, Qbs_dT =0.0 ; - double Qbd =0.0, Capbd =0.0, Capbde =0.0, Qbd_dT =0.0 ; - double czbd =0.0, czbd_dT=0.0 ; - double czbdsw =0.0, czbdsw_dT=0.0 ; - double czbdswg =0.0, czbdswg_dT=0.0 ; - double czbs =0.0, czbs_dT=0.0 ; - double czbssw =0.0, czbssw_dT=0.0 ; - double czbsswg =0.0, czbsswg_dT=0.0 ; - double arg =0.0, sarg =0.0 ; + /* PART-5 (NQS) */ double tau =0.0, tau_dVbs=0.0, tau_dVds=0.0, tau_dVgs =0.0, tau_dT=0.0 ; double taub =0.0, taub_dVbs=0.0, taub_dVds=0.0, taub_dVgs =0.0, taub_dT =0.0 ; @@ -759,13 +826,14 @@ int HSMHVevaluate double T9 =0.0, T9_dVb =0.0, T9_dVd =0.0, T9_dVg =0.0, T9_dT =0.0, T9_dVdse_eff =0.0 ; double T10 =0.0, T10_dVb =0.0, T10_dVd =0.0, T10_dVg =0.0, T10_dT =0.0 ; double T11 =0.0, T11_dT =0.0 ; - double T12 =0.0, T12_dT =0.0 ; + double T12 =0.0; double T15 =0.0, T16 =0.0, T17 =0.0 ; - double T2_dVdse = 0.0, T5_dVdse = 0.0 ; double T4_dVb_dT, T5_dVb_dT, T6_dVb_dT, T7_dVb_dT ; + double T1_dVddp = 0.0 , T2_dVddp = 0.0 ; + double T0_dVddp = 0.0 , T3_dVddp = 0.0, T4_dVddp = 0.0 ; + int flg_zone =0 ; - double Vfbsft =0.0, Vfbsft_dVbs =0.0, Vfbsft_dVds =0.0, Vfbsft_dVgs =0.0, Vfbsft_dT =0.0 ; /* Vdseff */ double Vdseff =0.0, Vdseff_dVbs =0.0, Vdseff_dVds =0.0, Vdseff_dVgs =0.0, Vdseff_dT =0.0 ; @@ -779,12 +847,13 @@ int HSMHVevaluate double Qovs =0.0, Qovs_dVbs =0.0, Qovs_dVds =0.0, Qovs_dVgs =0.0, Qovs_dT =0.0 ; double QbuLD =0.0, QbuLD_dVbs =0.0, QbuLD_dVds =0.0, QbuLD_dVgs =0.0, QbuLD_dT =0.0 ; double QbdLD =0.0, QbdLD_dVbs =0.0, QbdLD_dVds =0.0, QbdLD_dVgs =0.0, QbdLD_dT =0.0 ; - double QbsLD =0.0;/*, QbsLD_dVbs =0.0, QbsLD_dVds =0.0, QbsLD_dVgs =0.0, QbsLD_dT =0.0 ;*/ + double QbsLD =0.0, QbsLD_dVbs =0.0, QbsLD_dVds =0.0, QbsLD_dVgs =0.0, QbsLD_dT =0.0 ; + double QodAD =0.0, QodAD_dVbs =0.0, QodAD_dVds =0.0, QodAD_dVgs =0.0, QodAD_dT =0.0 ; + double QosAD =0.0, QosAD_dVbs =0.0, QosAD_dVds =0.0, QosAD_dVgs =0.0, QosAD_dT =0.0 ; double QbdLDext =0.0, QbdLDext_dVbse =0.0, QbdLDext_dVdse =0.0, QbdLDext_dVgse =0.0, QbdLDext_dT =0.0 ; - double QbsLDext =0.0;/*, QbsLDext_dVbse =0.0, QbsLDext_dVdse =0.0, QbsLDext_dVgse =0.0, QbsLDext_dT =0.0 ;*/ + double QbsLDext =0.0, QbsLDext_dVbse =0.0, QbsLDext_dVdse =0.0, QbsLDext_dVgse =0.0, QbsLDext_dT =0.0 ; /* Vgsz for SCE and PGD */ - double dmpacc =0.0, dmpacc_dVbs =0.0, dmpacc_dVds =0.0, dmpacc_dVgs =0.0 ; double Vbsz2 =0.0, Vbsz2_dVbs =0.0, Vbsz2_dVds =0.0, Vbsz2_dVgs =0.0 , Vbsz2_dT =0.0; /* Multiplication factor * number of gate fingers */ @@ -814,7 +883,7 @@ int HSMHVevaluate double Ra_alpha, Ra_beta ; /* modified external biases for symmetry */ - double /*Vzadd_ext = 0.0,*/ Vzadd_ext_dVd = 0.0 ; + double Vzadd_ext_dVd = 0.0 ; double Vdserevz = 0.0, Vdserevz_dVd = 0.0 ; double Vgserevz = 0.0, Vgserevz_dVd = 0.0 ; double Vbserevz = 0.0, Vbserevz_dVd = 0.0 ; @@ -833,43 +902,39 @@ int HSMHVevaluate /* temperature-dependent variables for SHE model */ double TTEMP =0.0, TTEMP0 =0.0 ; - double/* Tdiff0 = 0.0, Tdiff0_2 = 0.0,*/ Tdiff = 0.0, Tdiff_2 = 0.0 ; + double Tdiff0 = 0.0, Tdiff0_2 = 0.0, Tdiff = 0.0, Tdiff_2 = 0.0 ; double Eg =0.0, Eg_dT =0.0 ; double Nin =0.0, Nin_dT =0.0 ; - double js =0.0, js_dT =0.0 ; - double jssw =0.0, jssw_dT =0.0 ; - double js2 =0.0, js2_dT =0.0 ; - double jssw2 =0.0, jssw2_dT =0.0 ; /* Qover 5/1 ckt-bias use */ double Vgbgmt =0.0, Vgbgmt_dVbs =0.0, Vgbgmt_dVds =0.0, Vgbgmt_dVgs =0.0 ; double Vxbgmt =0.0, Vxbgmt_dVbs =0.0, Vxbgmt_dVds =0.0, Vxbgmt_dVgs =0.0 ; - double Vxbgmtcl =0.0, Vxbgmtcl_dVxbgmt =0.0, Vxbgmtcl_dT =0.0 ; + double Vxbgmtcl =0.0, Vxbgmtcl_dVxbgmt =0.0, Vxbgmtcl_dT =0.0 ; double ModeNML =0.0, ModeRVS =0.0 ; double QsuLD =0.0, QsuLD_dVbs =0.0, QsuLD_dVds =0.0, QsuLD_dVgs =0.0, QsuLD_dT =0.0 ; double QiuLD =0.0, QiuLD_dVbs =0.0, QiuLD_dVds =0.0, QiuLD_dVgs =0.0, QiuLD_dT =0.0 ; - double /*QidLD =0.0,*/ QidLD_dVbs =0.0, QidLD_dVds =0.0, QidLD_dVgs =0.0, QidLD_dT =0.0 ; - double /*QisLD =0.0,*/ QisLD_dVbs =0.0, QisLD_dVds =0.0, QisLD_dVgs =0.0, QisLD_dT =0.0 ; - double /*QidLDext =0.0,*/ QidLDext_dVbse =0.0, QidLDext_dVdse =0.0, QidLDext_dVgse =0.0, QidLDext_dT =0.0 ; - double /*QisLDext =0.0,*/ QisLDext_dVbse =0.0, QisLDext_dVdse =0.0, QisLDext_dVgse =0.0, QisLDext_dT =0.0 ; + double QidLD =0.0, QidLD_dVbs =0.0, QidLD_dVds =0.0, QidLD_dVgs =0.0, QidLD_dT =0.0 ; + double QisLD =0.0, QisLD_dVbs =0.0, QisLD_dVds =0.0, QisLD_dVgs =0.0, QisLD_dT =0.0 ; + double QidLDext =0.0, QidLDext_dVbse =0.0, QidLDext_dVdse =0.0, QidLDext_dVgse =0.0, QidLDext_dT =0.0 ; + double QisLDext =0.0, QisLDext_dVbse =0.0, QisLDext_dVdse =0.0, QisLDext_dVgse =0.0, QisLDext_dT =0.0 ; /* Self heating */ double mphn0_dT =0.0 ; - double ps0ldinib_dT =0.0, cnst0over_dT =0.0 ; - double ps0ldinibs_dT =0.0, cnst0overs_dT =0.0 ; + double cnst0over_dT =0.0 ; + double cnst0overs_dT =0.0 ; double Temp_dif =0.0 ; /* for SCE */ double ptovr_dT =0.0 ; /* IBPC */ - double IdsIBPC =0.0, IdsIBPC_dVbs =0.0, IdsIBPC_dVds =0.0, IdsIBPC_dVgs =0.0, IdsIBPC_dT =0.0 ; + double IdsIBPC =0.0, IdsIBPC_dVbs =0.0, IdsIBPC_dVds =0.0, IdsIBPC_dVgs =0.0, IdsIBPC_dT =0.0, IdsIBPC_dVddp =0.0 ; /* Qover */ int flg_ovzone = 0 ; - double VgpLD =0.0, VgpLD_dVgb =0.0 ; - double /*VthLD =0.0,*/ Vgb_fb_LD =0.0 ; + double VgpLD =0.0, VgpLD_dVgb =0.0 ; + double Vgb_fb_LD =0.0 ; double Ac31_dVgb =0.0, Ac31_dVxb =0.0 ; double Ac1_dVgb =0.0, Ac1_dVxb =0.0 ; double Ac2_dVgb =0.0, Ac2_dVxb =0.0 ; @@ -880,21 +945,20 @@ int HSMHVevaluate double Psa_dVgb =0.0, Psa_dVxb =0.0 ; double QsuLD_dVgb =0.0, QsuLD_dVxb =0.0 ; double QbuLD_dVgb =0.0, QbuLD_dVxb =0.0 ; - double fs02_dVgb =0.0 ;/*, fs02_dVxb =0.0 ;*/ + double fs02_dVgb =0.0, fs02_dVxb =0.0 ; double TX_dVgb =0.0, TX_dVxb =0.0 ; double TY_dVgb =0.0, TY_dVxb =0.0 ; double Ps0LD =0.0, Ps0LD_dVgb =0.0, Ps0LD_dVxb =0.0, Ps0LD_dT =0.0 ; - double /*Ps0LD_dVbs =0.0,*/ Ps0LD_dVds =0.0; /*Ps0LD_dVgs =0.0 ;*/ + double Ps0LD_dVds =0.0, Ps0LD_dVgs =0.0, Ps0LD_dVbs =0.0 ; double Pb2over =0.0, Pb2over_dT =0.0 ; + double cnst1over =0.0, cnst1over_dT =0.0 ; int flg_overgiven =0 ; int Coovlps =0, Coovlpd =0 ; double Lovers =0.0, Loverd =0.0 ; double Novers =0.0, Noverd =0.0 ; double Nover_func =0.0 ; -/* double ps0ldinib_func =0.0, ps0ldinib_func_dT =0.0 ;*/ double cnst0over_func =0.0, cnst0over_func_dT =0.0 ; - double cnst1over =0.0, cnst1over_dT =0.0; /* Qover Analytical Model */ int lp_ld; double Ta = 9.3868e-3, Tb = -0.1047839 ; @@ -905,28 +969,21 @@ int HSMHVevaluate double Tp, Tp_dT ; double Tq, Tq_dVxb, Tq_dVgb, Tq_dT ; double T1_dVxb, T1_dVgb ; -/* double T2_dVxb, T2_dVgb ;*/ -/* double T3_dVxb, T3_dVgb ;*/ double T5_dVxb, T5_dVgb ; double VgpLD_shift, VgpLD_shift_dT ; double VgpLD_shift_dVgb, VgpLD_shift_dVxb, exp_bVbs_dVxb ; double gamma, gamma_dVxb, gamma_dT ; double psi , psi_dVgb , psi_dVxb , psi_dT ; -/* double psi_B, arg_B ;*/ - double Chi_1, Chi_1_dVgb, Chi_1_dVxb ,Chi_1_dT ; double Chi_A, Chi_A_dVgb, Chi_A_dVxb, Chi_A_dT ; - double Chi_B, Chi_B_dVgb, Chi_B_dVxb, Chi_B_dT;/*, Chi_B_dpsi , Chi_B_dgamma ;*/ + double Chi_B, Chi_B_dVgb, Chi_B_dVxb, Chi_B_dT ; + + double psi_B =0.0, arg_B =0.0 ; + double Chi_1 =0.0, Chi_1_dVgb =0.0, Chi_1_dVxb =0.0, Chi_1_dT =0.0 ; + + /* global variables for depletion mode MOSFET */ + double Pb2n_dT, Vbipn_dT = 0.0, depmphn0_dT = 0.0, depVmax_dT = 0.0 ; + double Qiu_noi, Qi_noi ; - /* X_dT for leakage currents & junction diodes */ - double isbd_dT =0.0, isbs_dT =0.0 ; - double isbd2_dT =0.0, isbs2_dT =0.0 ; - double vbdt_dT =0.0, vbst_dT = 0.0 ; - double jd_expcd_dT =0.0 , jd_expcs_dT =0.0 ; - double jd_nvtm_inv_dT =0.0 ; - double exptemp_dT = 0.0 ; - double tcjbd =0.0, tcjbs =0.0, - tcjbdsw =0.0, tcjbssw =0.0, - tcjbdswg =0.0, tcjbsswg =0.0 ; /*================ Start of executable code.=================*/ @@ -942,7 +999,7 @@ int HSMHVevaluate T1 = Vdse + Vgse + Vbse + Vds + Vgs + Vbs + vbd_jct + vbs_jct ; if ( ! finite (T1) ) { fprintf (stderr , - "*** warning(HiSIM_HV): Unacceptable Bias(es).\n" ) ; + "*** warning(HiSIM_HV(%s)): Unacceptable Bias(es).\n",model->HSMHVmodName ) ; fprintf (stderr , "----- bias information (HiSIM_HV)\n" ) ; fprintf (stderr , "name: %s\n" , here->HSMHVname ) ; fprintf (stderr , "states: %d\n" , here->HSMHVstates ) ; @@ -992,6 +1049,14 @@ int HSMHVevaluate Pb2_dT = 0.0 ; cnst0_dT = 0.0 ; cnst1_dT = 0.0 ; + Nin_dT = 0.0 ; + + /* depletion MOS */ + Pb2n_dT = 0.0 ; + Vbipn_dT = 0.0 ; + depmphn0_dT = 0.0 ; + depVmax_dT = 0.0 ; + } /* Inverse of the thermal voltage */ @@ -1008,8 +1073,6 @@ int HSMHVevaluate WeffLD_nf = here->HSMHV_weff_ld * here->HSMHV_nf ; Ldrift0 = here->HSMHV_ldrift1 + here->HSMHV_ldrift2 ; - Ldrift = (model->HSMHV_coldrift) ? Ldrift0 - : Ldrift0 + here->HSMHV_loverld ; /* Flat band voltage */ Vfb = pParam->HSMHV_vfbc ; @@ -1017,8 +1080,9 @@ int HSMHVevaluate /* Surface impurity profile */ q_Nsub = here->HSMHV_qnsub ; - /* Velocity Temperature Dependence */ + /* satulation Velocity */ Vmax = here->HSMHV_vmax ; + /* 2 phi_B */ Pb2 = here->HSMHV_pb2 ; @@ -1039,6 +1103,9 @@ int HSMHVevaluate Cox0 = c_eox / Tox0 ; Cox0_inv = 1.0 / Cox0 ; + /* for calculation of Ps0_min */ + Vgs_min = model->HSMHV_type * model->HSMHV_vgsmin ; + /*---------------------------------------------------* * Determine clamping limits for too large Vbs (internal). *-----------------*/ @@ -1046,6 +1113,7 @@ int HSMHVevaluate Fn_SU( T1 , Pb2 - model->HSMHV_vzadd0 , Vbs_max , 0.1 , T0 ) ; Vbs_max = T1 ; Vbs_max_dT = Pb2_dT * T0 ; + if ( Pb20 - model->HSMHV_vzadd0 < Vbs_max ) { Vbs_max = Pb20 - model->HSMHV_vzadd0 ; Vbs_max_dT = 0.0 ; @@ -1129,6 +1197,38 @@ int HSMHVevaluate Pds_dVgs = here->HSMHV_pds_dvgs_prv ; } + if( here->HSMHV_cordrift == 1 && here->HSMHVsubNode >= 0 ) { + /*----------------------------------------------------------* + * Considering these special cases: + * ( here->HSMHV_mode == HiSIM_NORMAL_MODE && Vdse < 0.0 ) + * ( here->HSMHV_mode == HiSIM_REVERSE_MODE && Vdse < 0.0 ) + *----------------------------------------------------------*/ + + Vdsegmt = here->HSMHV_mode * Vdse ; /* geometrical outer bias */ + if ( Vdsegmt >= 0.0 ) { /* vdse normal mode */ + Vdserev = Vdsegmt ; + Vsubsrev = Vsubs ; + } else { /* vdse reverse mode */ + Vdserev = - Vdsegmt ; + Vsubsrev = Vsubs - Vdsegmt ; + } + here->HSMHV_Vsubsrev = Vsubsrev ; + + /*-----------------------------------------------------------* + * Vxserevz: Modified bias introduced to realize symmetry at Vds=0. + *-----------------*/ + Fn_SymAdd( Vzadd , Vdserev / 2 , model->HSMHV_vzadd0 , T2 ) ; + Vzadd_ext_dVd = T2 / 2 ; + if ( Vzadd < ps_conv ) { + Vzadd = ps_conv ; + Vzadd_ext_dVd = 0.0 ; + } + Vdserevz = Vdserev + 2.0 * Vzadd ; + Vdserevz_dVd = 1.0 + 2.0 * Vzadd_ext_dVd ; + here->HSMHV_Vdserevz = Vdserevz ; + here->HSMHV_Vdserevz_dVd = Vdserevz_dVd ; + + } if ( flg_rsrd == 1 || flg_rsrd == 3 ) { @@ -1137,6 +1237,7 @@ int HSMHVevaluate * ( here->HSMHV_mode == HiSIM_NORMAL_MODE && Vdse < 0.0 ) * ( here->HSMHV_mode == HiSIM_REVERSE_MODE && Vdse < 0.0 ) *----------------------------------------------------------*/ + Vdsegmt = here->HSMHV_mode * Vdse ; /* geometrical outer bias */ Vgsegmt = Vgse - ModeRVS * Vdse ; /* geometrical outer bias */ Vbsegmt = Vbse - ModeRVS * Vdse ; /* geometrical outer bias */ @@ -1156,7 +1257,6 @@ int HSMHVevaluate Vsubsrev = Vsubs - Vdsegmt ; } - if ( here->HSMHV_rdvd > 0.0 || here->HSMHV_rsvd > 0.0 || pParam->HSMHV_rdvg11 > 0.0 || pParam->HSMHV_rdvb > 0.0 || here->HSMHVsubNode >= 0 ) { /*-----------------------------------------------------------* * Vxserevz: Modified bias introduced to realize symmetry at Vds=0. @@ -1174,7 +1274,6 @@ int HSMHVevaluate Vbserevz = Vbserev + Vzadd ; Vbserevz_dVd = Vzadd_ext_dVd ; - /* bias-dependent Rdrift for HVMOS/LDMOS */ if ( model->HSMHV_cosym == 1 || VdseModeNML == 1 ) { /* HVMOS or normal mode LDMOS: */ @@ -1212,6 +1311,7 @@ int HSMHVevaluate T1_dVb = - pParam->HSMHV_rdvb ; T1_dVd = - pParam->HSMHV_rdvb * Vbserevz_dVd ; Fn_SZ( T3 , T1 , rdsz_dlt , T4 ) ; + T3 += small ; T3_dVb = T4 * T1_dVb ; T3_dVd = T4 * T1_dVd ; T0 = Rdrift ; @@ -1239,14 +1339,8 @@ int HSMHVevaluate /* ... Vdse dependence */ T0 = VdseModeNML * here->HSMHV_rsvd + VdseModeRVS * here->HSMHV_rdvd ; T0_dT = VdseModeNML * Rsvd_dT + VdseModeRVS * Rdvd_dT ; -/* if ( model->HSMHV_cosym == 2 ) { /\* latest case with bugfix: *\/ */ -/* T4 = T4 + T0 * Vdserevz ; */ -/* T4_dVd = T0 * Vdserevz_dVd ; */ -/* T4_dT = T4_dT + T0_dT * Vdserevz ; */ -/* } else { /\* HiSIM_HV 1.1.1 compatible case *\/ */ - T4 = T4 + T0 * ( 2.0 * model->HSMHV_vzadd0 ) ; /* 2.0 * Fn_SymAdd( x=0, add0=model->HSMHV_vzadd0 ) */ - T4_dT = T4_dT + T0_dT * ( 2.0 * model->HSMHV_vzadd0 ) ; -/* } */ + T4 = T4 + T0 * ( 2.0 * model->HSMHV_vzadd0 ) ; + T4_dT = T4_dT + T0_dT * ( 2.0 * model->HSMHV_vzadd0 ) ; /* ... Vgse dependence */ T10 = model->HSMHV_rdvg12 + small ; @@ -1273,6 +1367,7 @@ int HSMHVevaluate T1_dVb = - pParam->HSMHV_rdvb ; T1_dVd = - pParam->HSMHV_rdvb * Vbserevz_dVd ; Fn_SZ( T3 , T1 , rdsz_dlt , T4 ) ; + T3 += small ; T3_dVb = T4 * T1_dVb ; T3_dVd = T4 * T1_dVd ; T0 = Rsdrift ; @@ -1296,6 +1391,8 @@ int HSMHVevaluate /* Substrate Effect */ T0 = VBISUB - RDVDSUB * Vdserevz - RDVSUB * Vsubsrev ; Fn_SZ( T1, T0, 10.0, T2 ) ; + T1 += epsm10 ; + T1_dVdserev = - RDVDSUB * Vdserevz_dVd * T2 ; T1_dVsubsrev = - RDVSUB * T2 ; @@ -1311,6 +1408,7 @@ int HSMHVevaluate T0 = DDRIFT - Wdep ; Fn_SZ( T0, T0, C_sub_delta2, T2 ) ; + T0 += epsm10; T6 = Ldrift0 / T0 ; T6_dVdserev = T2 * Wdep_dVdserev * T6 / T0 ; T6_dVsubsrev = T2 * Wdep_dVsubsrev * T6 / T0 ; @@ -1375,17 +1473,15 @@ int HSMHVevaluate /* Re-stamps for hsmhvnoi.c */ /* Please see hsmhvnoi.c */ T0 = VdseModeNML * Rd + VdseModeRVS * Rs ; /* mode-dependent --> geometrical */ - if ( T0 > 0.0 && model->HSMHV_cothrml != 0 ) here->HSMHVdrainConductance = Mfactor / T0 ; + if ( T0 > Res_min && model->HSMHV_cothrml != 0 ) here->HSMHVdrainConductance = Mfactor / T0 ; else here->HSMHVdrainConductance = 0.0 ; T0 = VdseModeNML * Rs + VdseModeRVS * Rd ; /* mode-dependent --> geometrical */ - if ( T0 > 0.0 && model->HSMHV_cothrml != 0 ) here->HSMHVsourceConductance = Mfactor / T0 ; + if ( T0 > Res_min && model->HSMHV_cothrml != 0 ) here->HSMHVsourceConductance = Mfactor / T0 ; else here->HSMHVsourceConductance = 0.0 ; } /* end of case flg_rsrd=1 or flg_rsrd=3 */ - - /* Clamping for Vbs > Vbs_bnd */ if ( Vbs > Vbs_bnd ) { T1 = Vbs - Vbs_bnd ; @@ -1488,6 +1584,7 @@ int HSMHVevaluate T3 = 1 + 2.0 / T1 * ( T2 - 1.0 / here->HSMHV_betatnom - Vbscl ) ; Fn_SZ( T4 , T3 , 1e-3 , T5 ) ; + T4 += small ; TX = sqrt( T4 ) ; Pslsat = T2 + T1 * ( 1.0 - TX ) ; VdsatS = Pslsat - Pb2c ; @@ -1528,16 +1625,19 @@ int HSMHVevaluate Tox_dVb = 0.0 ; Tox_dVd = 0.0 ; Tox_dVg = 0.0 ; + Tox_dT = 0.0 ; Cox = Cox0 ; Cox_dVb = 0.0 ; Cox_dVd = 0.0 ; Cox_dVg = 0.0 ; + Cox_dT = 0.0 ; Cox_inv = Cox0_inv ; Cox_inv_dVb = 0.0 ; Cox_inv_dVd = 0.0 ; Cox_inv_dVg = 0.0 ; + Cox_inv_dT = 0.0 ; T0 = cnst0 * cnst0 * Cox_inv ; cnstCoxi = T0 * Cox_inv ; @@ -1548,27 +1648,42 @@ int HSMHVevaluate } else { - T1 = - model->HSMHV_qme2 ; - T5 = Vgsz - Vthq - model->HSMHV_qme2 ; - T5_dVb = Vgsz_dVbs - Vthq_dVb ; - T5_dVd = Vgsz_dVds - Vthq_dVd ; - T5_dVg = Vgsz_dVgs ; - T5_dT = Vgsz_dT ; - Fn_SZ( T2 , - T5 , qme2_dlt, T3) ; + T5 = Vgs - Vbs - Vthq + model->HSMHV_qme2 ; + T5_dVb = -1.0 - Vthq_dVb ; + T5_dVd = - Vthq_dVd ; + T5_dVg = 1.0 ; + T5_dT = 0.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 ; - T2_dT = - T3 * T5_dT ; - T3 = model->HSMHV_qme12 * T1 * T1 ; - T4 = model->HSMHV_qme12 * T2 * T2 + model->HSMHV_qme3 ; - Fn_SU( dTox , T4 , T3 , qme_dlt , T6 ) ; - T7 = 2 * model->HSMHV_qme12 * T2 * T6 ; + T2_dVb = T3 * T5_dVb ; + T2_dVd = T3 * T5_dVd ; + T2_dVg = T3 * T5_dVg ; + T2_dT = T3 * T5_dT ; + + T3 = 1.0 / T2 ; + T7 = -1.0 / ( T2 * T2 ) ; + T3_dVb = T7 * T2_dVb ; + T3_dVd = T7 * T2_dVd ; + T3_dVg = T7 * T2_dVg ; + T3_dT = T7 * T2_dT ; + + T4 = 2.0 * fabs(Vthq) ; + T6 = T5 - Vgs + Vfb ; + 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 ; + T2_dT = T6 * T3_dT ; + + dTox = model->HSMHV_qme1 * T2 + model->HSMHV_qme3 ; + T7 = model->HSMHV_qme1 ; dTox_dVb = T7 * T2_dVb ; dTox_dVd = T7 * T2_dVd ; dTox_dVg = T7 * T2_dVg ; dTox_dT = T7 * T2_dT ; - if ( dTox * 1.0e12 < Tox0 ) { dTox = 0.0 ; @@ -1634,94 +1749,11 @@ int HSMHVevaluate Vthp_dVg = Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ; Vthp_dT = Qb0_dT * Cox_inv + Qb0 * Cox_inv_dT + ptovr_dT ; - if ( pParam->HSMHV_pthrou != 0.0 ) { - /* Modify Pb20 to Pb20b */ - T11 = beta * 0.25 ; - T10 = beta_inv - cnstCoxi * T11 + small ; - T10_dVg = - T11 * cnstCoxi_dVg ; - T10_dVd = - T11 * cnstCoxi_dVd ; - T10_dVb = - T11 * cnstCoxi_dVb ; - T10_dT = beta_inv_dT - ( T11 * cnstCoxi_dT + beta_dT * 0.25 * cnstCoxi ) ; - - T1 = Vgsz - T10 - psia2_dlt ; - T1_dVg = Vgsz_dVgs - T10_dVg ; - T1_dVd = Vgsz_dVds - T10_dVd ; - T1_dVb = Vgsz_dVbs - T10_dVb ; - T1_dT = Vgsz_dT - T10_dT ; - T0 = Fn_Sgn (T10) ; - T2 = sqrt (T1 * T1 + T0 * 4.0 * T10 * psia2_dlt) ; - T3 = T10 + 0.5 * (T1 + T2) - Vfb ; /* Vgpa for sqrt calc. */ - T4 = T1 / T2 ; - T5 = T0 * 2.0 * psia2_dlt / T2 ; - T3_dVg = T10_dVg - + 0.5 * (T1_dVg - + (T4 * T1_dVg + T5 * T10_dVg ) ) ; - T3_dVd = T10_dVd - + 0.5 * (T1_dVd - + (T4 * T1_dVd + T5 * T10_dVd ) ) ; - T3_dVb = T10_dVb - + 0.5 * (T1_dVb - + (T4 * T1_dVb + T5 * T10_dVb ) ) ; - T3_dT = T10_dT - + 0.5 * (T1_dT - + (T4 * T1_dT + T5 * T10_dT ) ) ; - T4 = 4.0 / cnstCoxi * beta_inv * beta_inv ; - T8 = 4.0 / cnstCoxi ; - T9 = beta_inv * beta_inv ; - T4_dT = - 4.0 * cnstCoxi_dT / ( cnstCoxi * cnstCoxi ) * T9 - + T8 * 2.0 * beta_inv * beta_inv_dT ; - T5 = beta * T3 - 1.0 ; - T5_dT = beta_dT * T3 + beta * T3_dT ; - T6 = T5 / cnstCoxi ; - T1 = 1.0 + T5 * T4 ; - T2 = beta * T4 ; - T6 = T6 * T4 ; - T1_dVg = (T2 * T3_dVg - T6 * cnstCoxi_dVg ) ; - T1_dVd = (T2 * T3_dVd - T6 * cnstCoxi_dVd ) ; - T1_dVb = (T2 * T3_dVb - T6 * cnstCoxi_dVb ) ; - T1_dT = T5_dT * T4 + T5 * T4_dT ; - Fn_SZ( T1 ,T1, psia_dlt, T7) ; - T1 += epsm10 ; - - T1_dVg *= T7 ; - T1_dVd *= T7 ; - T1_dVb *= T7 ; - T1_dT *= T7 ; - - T2 = sqrt (T1) ; - T5 = 0.5 / T2 ; - T2_dVg = T1_dVg * T5 ; - T2_dVd = T1_dVd * T5 ; - T2_dVb = T1_dVb * T5 ; - T2_dT = T1_dT * T5 ; - - T4 = 0.5 * beta ; - Psi_a = T3 + cnstCoxi * T4 * (1.0 - T2) ; - T5 = T4 * (1.0 - T2) ; - T6 = T4 * cnstCoxi ; - Psi_a_dVg = T3_dVg - + (cnstCoxi_dVg * T5 - T6 * T2_dVg) ; - Psi_a_dVd = T3_dVd - + (cnstCoxi_dVd * T5 - T6 * T2_dVd) ; - Psi_a_dVb = T3_dVb - + (cnstCoxi_dVb * T5 - T6 * T2_dVb) ; - Psi_a_dT = T3_dT - + (cnstCoxi_dT * T5 - T6 * T2_dT) - + cnstCoxi * 0.5 * beta_dT * ( 1.0 - T2 ) ; - - Fn_SU( Pb20a , Psi_a, Pb20, delta0, T2) ; - Pb20a_dVb = T2 * Psi_a_dVb ; - Pb20a_dVd = T2 * Psi_a_dVd ; - Pb20a_dVg = T2 * Psi_a_dVg ; - Pb20a_dT = T2 * Psi_a_dT ; - } - - T1 = pParam->HSMHV_pthrou ; - Pb20b = Pb20 + T1 * (Pb20a - Pb20) ; - Pb20b_dVb = T1 * Pb20a_dVb ; - Pb20b_dVd = T1 * Pb20a_dVd ; - Pb20b_dVg = T1 * Pb20a_dVg ; - Pb20b_dT = T1 * Pb20a_dT ; + Pb20b = Pb20 ; + Pb20b_dVb = 0.0 ; + Pb20b_dVd = 0.0 ; + Pb20b_dVg = 0.0 ; + Pb20b_dT = 0.0 ; T0 = 0.95 ; T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ; @@ -1748,6 +1780,12 @@ int HSMHVevaluate Pbsum_dVg = Pb20b_dVg - T3_dVg ; Pbsum_dT = Pb20b_dT - T3_dT ; + if( model->HSMHV_codep ) { + Pbsum = Pbsum + model->HSMHV_depeta * Vdsz ; + Pbsum_dVb = Pbsum_dVb + model->HSMHV_depeta * Vdsz_dVbs ; + Pbsum_dVd = Pbsum_dVd + model->HSMHV_depeta * Vdsz_dVds ; + } + sqrt_Pbsum = sqrt( Pbsum ) ; /*-------------------------------------------* @@ -1818,10 +1856,10 @@ int HSMHVevaluate Vdx = model->HSMHV_scp21 + Vdsz ; Vdx_dVbs = Vdsz_dVbs ; -/* Vdx_dT = Vdsz_dT ;*/ + Vdx_dT = Vdsz_dT ; Vdx2 = Vdx * Vdx ; Vdx2_dVbs = 2 * Vdx_dVbs * Vdx ; -/* Vdx2_dT = 2 * Vdx_dT * Vdx ;*/ + Vdx2_dT = 2 * Vdx_dT * Vdx ; dVthLP = T1 * dVth0 * T3 + dqb - here->HSMHV_msc / Vdx2 ; dVthLP_dVb = T1_dVb * dVth0 * T3 + T1 * dVth0_dVb * T3 + T1 * dVth0 * T3_dVb @@ -1857,6 +1895,7 @@ int HSMHVevaluate T5 = 2.0e0 * ( model->HSMHV_vbi - Pb20b ) * T1 * T2 * T4 ; dVth0 = T5 * sqrt_Pbsum ; + T6 = T5 / 2.0 / sqrt_Pbsum ; T7 = 2.0e0 * ( model->HSMHV_vbi - Pb20b ) * C_ESI * T2 * T4 * sqrt_Pbsum ; T8 = - 2.0e0 * T1 * T2 * T4 * sqrt_Pbsum ; @@ -1881,6 +1920,7 @@ int HSMHVevaluate T5_dT = T4_dT + pParam->HSMHV_sc2 * Vdsz * model->HSMHV_sc4 * Pbsum_dT + pParam->HSMHV_sc2 * Vdsz_dT * model->HSMHV_sc4 * Pbsum; + dVthSC = dVth0 * T5 ; dVthSC_dVb = dVth0_dVb * T5 + dVth0 * T5_dVb ; dVthSC_dVd = dVth0_dVd * T5 + dVth0 * T5_dVd ; @@ -1914,9 +1954,10 @@ int HSMHVevaluate dVth_dT = dVthSC_dT + dVthLP_dT + dVthW_dT ; /*---------------------------------------------------* - * Vth : Threshold voltage. + * Vth : Threshold voltagei for OP. *-----------------*/ - Vth = Vthq - dVth ; + T2 = sqrt( here->HSMHV_2qnsub_esi * (Pb2-Vbsz) ) ; + Vth = Pb2 + Vfb + T2 * Cox0_inv - dVth ; /*-----------------------------------------------------------* * Constants in the equation of Ps0 . @@ -1926,117 +1967,62 @@ int HSMHVevaluate fac1_dVbs = cnst0 * Cox_inv_dVb ; fac1_dVds = cnst0 * Cox_inv_dVd ; fac1_dVgs = cnst0 * Cox_inv_dVg ; + fac1_dT = Cox_inv * cnst0_dT ; fac1p2 = fac1 * fac1 ; - fac1_dT = Cox_inv * cnst0_dT ; fac1p2_dT = 2.0 * fac1 * fac1_dT ; /*---------------------------------------------------* * Poly-Depletion Effect *-----------------*/ - if ( here->HSMHV_flg_pgd == 0 ) { dPpg = 0.0 ; dPpg_dVb = 0.0 ; dPpg_dVd = 0.0 ; dPpg_dVg = 0.0 ; - dPpg_dT = 0.0 ; - } else { - T7 = Vgs ; - T7_dVd = 0.0 ; - T7_dVg = 1.0 ; + dPpg_dT = 0.0 ; - T8 = Vds ; - T8_dVd = 1.0 ; + if ( here->HSMHV_flg_pgd == 1 ) { - T0 = here->HSMHV_cnstpgd ; + T7 = Vgsz ; + T7_dVb = Vgsz_dVbs ; + T7_dVd = Vgsz_dVds ; + T7_dVg = Vgsz_dVgs ; + T7_dT = Vgsz_dT ; - TX = pParam->HSMHV_pgd3 ; - TY = FMDVDS * TX + ( 1.0 - FMDVDS ) * 0.5 ; - T1 = TX - 0.5 ; - TY_dVbs = T1 * FMDVDS_dVbs ; - TY_dVds = T1 * FMDVDS_dVds ; - TY_dVgs = T1 * FMDVDS_dVgs ; + T0 = here->HSMHV_cnstpgd ; + + T3 = T7 - model->HSMHV_pgd2 ; + T3_dVb = T7_dVb ; + T3_dVd = T7_dVd ; + T3_dVg = T7_dVg ; + T3_dT = T7_dT ; + + Fn_ExpLim( dPpg , T3 , T6 ) ; + dPpg_dVb = T6 * T3_dVb ; + dPpg_dVd = T6 * T3_dVd ; + dPpg_dVg = T6 * T3_dVg ; + dPpg_dT = T6 * T3_dT ; + + Fn_SZ( dPpg , dPpg - 1.0 , pol_dlt , T6 ) ; + dPpg_dVb *= T6 ; + dPpg_dVd *= T6 ; + dPpg_dVg *= T6 ; + dPpg_dT *= T6 ; + + dPpg *= T0 ; + dPpg_dVb *= T0 ; + dPpg_dVd *= T0 ; + dPpg_dVg *= T0 ; + dPpg_dT *= T0 ; + + Fn_SU( dPpg , dPpg , pol_b , pol_dlt , T9 ) ; + dPpg_dVb *= T9 ; + dPpg_dVd *= T9 ; + dPpg_dVg *= T9 ; + dPpg_dT *= T9 ; - FMDVGS = 1.0 ; - FMDVGS_dVgs = 0.0 ; - if ( model->HSMHV_pgd2 > Vfb ) { - T1 = model->HSMHV_pgd2 - Vfb ; - T2 = ( Vgs - Vfb ) / T1 ; - Fn_SZ( T3 , T2 , 1e-3 , T4 ) ; - Fn_SU( T5 , T3 , 1.0 , 1e-3 , T6 ) ; - T5_dVg = T4 * T6 / T1 ; - FMDVGS = T5 * T5 ; - FMDVGS_dVgs = 2 * T5 * T5_dVg ; } - FMDPG = FMDVDS * FMDVGS ; - FMDPG_dVbs = FMDVDS_dVbs * FMDVGS ; - FMDPG_dVds = FMDVDS_dVds * FMDVGS ; - FMDPG_dVgs = FMDVDS_dVgs * FMDVGS + FMDVDS * FMDVGS_dVgs ; - FMDPG_dT = FMDVDS_dT * FMDVGS ; - - - TX = pParam->HSMHV_pgd3 ; - TY = FMDPG * TX + ( 1.0 - FMDPG ) * 0.5 ; - T1 = TX - 0.5 ; - TY_dVbs = T1 * FMDPG_dVbs ; - TY_dVds = T1 * FMDPG_dVds ; - TY_dVgs = T1 * FMDPG_dVgs ; - TY_dT = T1 * FMDPG_dT ; - if ( TX == 0.0 ) { TY =0.0 ; TY_dVbs =0.0 ; TY_dVds =0.0 ; TY_dVgs =0.0 ; TY_dT =0.0 ; } - - T3 = T7 - model->HSMHV_pgd2 - TY * T8 ; - T3_dVb = - TY_dVbs * T8 ; - T3_dVd = T7_dVd - ( TY_dVds * T8 + TY * T8_dVd ) ; - T3_dVg = T7_dVg - ( TY_dVgs * T8 ) ; - T3_dT = - TY_dT * T8; - - Fn_ExpLim( dPpg , T3 , T6 ) ; - dPpg *= T0 ; - dPpg_dVb = T0 * T6 * T3_dVb ; - dPpg_dVd = T0 * T6 * T3_dVd ; - dPpg_dVg = T0 * T6 * T3_dVg ; - dPpg_dT = T0 * T6 * T3_dT ; - - Fn_SU( dPpg , dPpg , pol_b , pol_dlt , T9 ) ; - dPpg_dVb *= T9 ; - dPpg_dVd *= T9 ; - dPpg_dVg *= T9 ; - dPpg_dT *= T9 ; - - /* damping in accumulation zone */ - - T0 = Vfb + Vbsz ; - T0_dVb = Vbsz_dVbs ; - T1 = 0.6 * ( Vthq - T0 ) ; - T1_dVb = 0.6 * ( Vthq_dVb - Vbsz_dVbs ) ; - T1_dVd = 0.6 * ( Vthq_dVd - Vbsz_dVds ) ; - Fn_SZ( T1 , T1 , 1e-2 , T2 ) ; - T1_dVb *= T2 ; - T1_dVd *= T2 ; - T1 += T0 ; - T1_dVb += Vbsz_dVbs ; - T4 = 1.0 / ( T1 - T0 ) ; - T5 = T4 * T4 ; - T4_dVb = - ( T1_dVb - Vbsz_dVbs ) * T5 ; - T4_dVd = - ( T1_dVd ) * T5 ; - - T6 = Vgsz - T0 ; - T6_dVb = Vgsz_dVbs - T0_dVb ; - dmpacc = T6 * T4 ; - dmpacc_dVbs = T6 * T4_dVb + T6_dVb * T4 ; - dmpacc_dVds = T6 * T4_dVd + ( Vgsz_dVds - Vbsz_dVds ) * T4 ; - dmpacc_dVgs = Vgsz_dVgs * T4 ; - Fn_SZ( dmpacc , dmpacc , 0.3 , T1 ) ; - dmpacc_dVbs *= T1 ; - dmpacc_dVds *= T1 ; - dmpacc_dVgs *= T1 ; - Fn_SU( dmpacc , dmpacc ,1.0 , 0.1 , T1 ) ; - dmpacc_dVbs *= T1 ; - dmpacc_dVds *= T1 ; - dmpacc_dVgs *= T1 ; - - } /*---------------------------------------------------* * Vgp : Effective gate bias with SCE & RSCE & flatband. @@ -2046,658 +2032,713 @@ int HSMHVevaluate Vgp_dVds = dVth_dVd - dPpg_dVd ; Vgp_dVgs = 1.0e0 + dVth_dVg - dPpg_dVg ; Vgp_dT = dVth_dT - dPpg_dT ; - - + + /*---------------------------------------------------* * Vgs_fb : Actual flatband voltage taking account Vbscl. * - note: if Vgs == Vgs_fb then Vgp == Ps0 == Vbscl . *------------------*/ Vgs_fb = Vfb - dVth + dPpg + Vbscl ; - + if( model->HSMHV_codep == 1 ) { + /*---------------------------------------------------* - * Vfbsft : Vfb shift (trial for Vbscl >> 0) - *-----------------*/ - Vfbsft = 0.0 ; - Vfbsft_dVbs = 0.0 ; - Vfbsft_dVds = 0.0 ; - Vfbsft_dVgs = 0.0 ; + * depletion mode MOSFET + *------------------*/ - if ( Vbscl > 0.0 ) { - /* values at D2/D3 boundary + beta */ - /* Ps0 */ - T1 = Vbscl + ( znbd5 + 1 ) * beta_inv ; - T1_dT = Vbscl_dT + ( znbd5 + 1 ) * beta_inv_dT ; - /* Qb0 */ - /* T2 = cnst0 * sqrt( znbd5 ) */ - T2 = cnst0 * 2.23606797749979 ; - T2_dT = cnst0_dT * 2.23606797749979 ; +#include "hsmhveval_dep.h" - /* Vgp assuming Qn0=0 */ - T3 = T2 * Cox_inv + T1 ; - T3_dT = T2_dT * Cox_inv + T1_dT ; + } else { - /* Vgp difference */ - TX = T3 - Vgp ; - TX_dVbs = T2 * Cox_inv_dVb + Vbscl_dVbs - Vgp_dVbs ; - TX_dVds = T2 * Cox_inv_dVd - Vgp_dVds ; - TX_dVgs = T2 * Cox_inv_dVg - Vgp_dVgs ; - TX_dT = T3_dT - Vgp_dT ; + /*---------------------------------------------------* + * normal mode MOSFET + *------------------*/ - /* set lower limit to 0 */ - Fn_SZ( TX , TX , 0.1 , T4 ) ; - TX_dVbs *= T4 ; - TX_dVds *= T4 ; - TX_dVgs *= T4 ; - TX_dT *= T4 ; - - /* TY: damping factor */ - T1 = 0.5 ; - T5 = Vbscl / T1 ; - T5_dVb = Vbscl_dVbs / T1 ; - T5_dT = Vbscl_dT / T1 ; - T0 = T5 * T5 ; - T6 = T0 * T0 ; - T6_dVb = 4 * T0 * T5 * T5_dVb ; - T6_dT = 4 * T0 * T5 * T5_dT ; - T7 = 1.0 / ( 1.0 + T6 ) ; - T8 = T7 * T7 ; - TY = 1.0 - T7 ; - TY_dVbs = T8 * T6_dVb ; - TY_dT = T8 * T6_dT ; - - TX = TY = 0.0 ; - Vfbsft = TX * TY ; - Vfbsft_dVbs = TX_dVbs * TY + TX * TY_dVbs ; - Vfbsft_dVds = TX_dVds * TY ; - Vfbsft_dVgs = TX_dVgs * TY ; - Vfbsft_dT = TX_dT * TY + TX * TY_dT ; - - Vgs_fb -= Vfbsft ; - - Vgp += Vfbsft ; - Vgp_dVbs += Vfbsft_dVbs ; - Vgp_dVds += Vfbsft_dVds ; - Vgp_dVgs += Vfbsft_dVgs ; - Vgp_dT += Vfbsft_dT ; - - } - - - /*-----------------------------------------------------------* - * Accumulation zone. (zone-A) - * - evaluate basic characteristics and exit from this part. - *-----------------*/ - if ( Vgs < Vgs_fb ) { - - flg_zone = -1 ; - - /*---------------------------------------------------* - * Evaluation of Ps0. - * - Psa : Analytical solution of - * Cox( Vgp - Psa ) = cnst0 * Qacc - * where Qacc is the 3-degree series of (fdep)^{1/2}. - * The unkown is transformed to Chi=beta(Ps0-Vbs). - * - Ps0_min : |Ps0_min| when Vbs=0. + /*-----------------------------------------------------------* + * Accumulation zone. (zone-A) + * - evaluate basic characteristics and exit from this part. *-----------------*/ - Ps0_min = here->HSMHV_eg - Pb2 ; - Ps0_min_dT = Eg_dT - Pb2_dT ; - TX = beta * ( Vgp - Vbscl ) ; - TX_dVbs = beta * ( Vgp_dVbs - Vbscl_dVbs ) ; - TX_dVds = beta * Vgp_dVds ; - TX_dVgs = beta * Vgp_dVgs ; - TX_dT = beta_dT * ( Vgp - Vbscl ) + beta * ( Vgp_dT - Vbscl_dT ); + if ( Vgs < Vgs_fb ) { - T1 = 1.0 / ( beta * cnst0 ) ; - TY = T1 * Cox ; - TY_dVbs = T1 * Cox_dVb ; - TY_dVds = T1 * Cox_dVd ; - TY_dVgs = T1 * Cox_dVg ; - T1_dT = - T1 / ( beta * cnst0 ) * ( beta_dT * cnst0 + beta * cnst0_dT ) ; - TY_dT = T1_dT * Cox ; + flg_zone = -1 ; + + /*---------------------------------------------------* + * Evaluation of Ps0. + * - Psa : Analytical solution of + * Cox( Vgp - Psa ) = cnst0 * Qacc + * where Qacc is the 3-degree series of (fdep)^{1/2}. + * The unkown is transformed to Chi=beta(Ps0-Vbs). + * - Ps0_min : |Ps0_min| when Vbs=0. + *-----------------*/ + /* Ps0_min: approx. solution of Poisson equation at Vgs_min */ + /* ( easy to improve, if necessary ) */ +// Ps0_min = here->HSMHV_eg - Pb2 ; +// Ps0_min_dT = Eg_dT - Pb2_dT ; + 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 ; + Ps0_min_dT = -2.0 * beta_inv * fac1_dT / fac1 + beta * Ps0_min * beta_inv_dT; - Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ; + + TX = beta * ( Vgp - Vbscl ) ; + TX_dVbs = beta * ( Vgp_dVbs - Vbscl_dVbs ) ; + TX_dVds = beta * Vgp_dVds ; + TX_dVgs = beta * Vgp_dVgs ; + TX_dT = beta_dT * ( Vgp - Vbscl ) + beta * ( Vgp_dT - Vbscl_dT ); + + T1 = 1.0 / ( beta * cnst0 ) ; + TY = T1 * Cox ; + TY_dVbs = T1 * Cox_dVb ; + TY_dVds = T1 * Cox_dVd ; + TY_dVgs = T1 * Cox_dVg ; + T1_dT = - T1 / ( beta * cnst0 ) * ( beta_dT * cnst0 + beta * cnst0_dT ) ; + TY_dT = T1_dT * Cox ; + + Ac41 = 2.0 + 3.0 * C_SQRT_2 * TY ; - Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ; - T1 = 72.0 * Ac41 * Ac41 * C_SQRT_2 ; - Ac4_dVbs = T1 * TY_dVbs ; - Ac4_dVds = T1 * TY_dVds ; - Ac4_dVgs = T1 * TY_dVgs ; - Ac4_dT = T1 * TY_dT ; + Ac4 = 8.0 * Ac41 * Ac41 * Ac41 ; + T1 = 72.0 * Ac41 * Ac41 * C_SQRT_2 ; + Ac4_dVbs = T1 * TY_dVbs ; + Ac4_dVds = T1 * TY_dVds ; + Ac4_dVgs = T1 * TY_dVgs ; + Ac4_dT = T1 * TY_dT ; - T4 = ( TX - 2.0 ) ; - T5 = 9.0 * TY * T4 ; - T5_dVb = 9.0 * ( TY_dVbs * T4 + TY * TX_dVbs ) ; - T5_dVd = 9.0 * ( TY_dVds * T4 + TY * TX_dVds ) ; - T5_dVg = 9.0 * ( TY_dVgs * T4 + TY * TX_dVgs ) ; - T5_dT = 9.0 * ( TY_dT * T4 + TY * TX_dT ) ; + T4 = ( TX - 2.0 ) ; + T5 = 9.0 * TY * T4 ; + T5_dVb = 9.0 * ( TY_dVbs * T4 + TY * TX_dVbs ) ; + T5_dVd = 9.0 * ( TY_dVds * T4 + TY * TX_dVds ) ; + T5_dVg = 9.0 * ( TY_dVgs * T4 + TY * TX_dVgs ) ; + T5_dT = 9.0 * ( TY_dT * T4 + TY * TX_dT ) ; - Ac31 = 7.0 * C_SQRT_2 - T5 ; - Ac31_dVbs = -T5_dVb ; - Ac31_dVds = -T5_dVd ; - Ac31_dVgs = -T5_dVg ; - Ac31_dT = -T5_dT ; + Ac31 = 7.0 * C_SQRT_2 - T5 ; + Ac31_dVbs = -T5_dVb ; + Ac31_dVds = -T5_dVd ; + Ac31_dVgs = -T5_dVg ; + Ac31_dT = -T5_dT ; - Ac3 = Ac31 * Ac31 ; - T1 = 2.0 * Ac31 ; - Ac3_dVbs = T1 * Ac31_dVbs ; - Ac3_dVds = T1 * Ac31_dVds ; - Ac3_dVgs = T1 * Ac31_dVgs ; - Ac3_dT = T1 * Ac31_dT ; + Ac3 = Ac31 * Ac31 ; + T1 = 2.0 * Ac31 ; + Ac3_dVbs = T1 * Ac31_dVbs ; + Ac3_dVds = T1 * Ac31_dVds ; + Ac3_dVgs = T1 * Ac31_dVgs ; + Ac3_dT = T1 * Ac31_dT ; - Ac2 = sqrt( Ac4 + Ac3 ) ; - T1 = 0.5 / Ac2 ; - Ac2_dVbs = T1 * ( Ac4_dVbs + Ac3_dVbs ) ; - Ac2_dVds = T1 * ( Ac4_dVds + Ac3_dVds ) ; - Ac2_dVgs = T1 * ( Ac4_dVgs + Ac3_dVgs ) ; - Ac2_dT = T1 * ( Ac4_dT + Ac3_dT ) ; + Ac2 = sqrt( Ac4 + Ac3 ) ; + T1 = 0.5 / Ac2 ; + Ac2_dVbs = T1 * ( Ac4_dVbs + Ac3_dVbs ) ; + Ac2_dVds = T1 * ( Ac4_dVds + Ac3_dVds ) ; + Ac2_dVgs = T1 * ( Ac4_dVgs + Ac3_dVgs ) ; + Ac2_dT = T1 * ( Ac4_dT + Ac3_dT ) ; - Ac1 = -7.0 * C_SQRT_2 + Ac2 + T5 ; - Ac1_dVbs = Ac2_dVbs + T5_dVb ; - Ac1_dVds = Ac2_dVds + T5_dVd ; - Ac1_dVgs = Ac2_dVgs + T5_dVg ; - Ac1_dT = Ac2_dT + T5_dT ; + Ac1 = -7.0 * C_SQRT_2 + Ac2 + T5 ; + Ac1_dVbs = Ac2_dVbs + T5_dVb ; + Ac1_dVds = Ac2_dVds + T5_dVd ; + Ac1_dVgs = Ac2_dVgs + T5_dVg ; + Ac1_dT = Ac2_dT + T5_dT ; - Acd = Fn_Pow( Ac1 , C_1o3 ) ; - T1 = C_1o3 / ( Acd * Acd ) ; - Acd_dVbs = Ac1_dVbs * T1 ; - Acd_dVds = Ac1_dVds * T1 ; - Acd_dVgs = Ac1_dVgs * T1 ; - Acd_dT = Ac1_dT * T1 ; + Acd = Fn_Pow( Ac1 , C_1o3 ) ; + T1 = C_1o3 / ( Acd * Acd ) ; + Acd_dVbs = Ac1_dVbs * T1 ; + Acd_dVds = Ac1_dVds * T1 ; + Acd_dVgs = Ac1_dVgs * T1 ; + Acd_dT = Ac1_dT * T1 ; - Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ; - T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ; - Acn_dVbs = - 12.0 * TY_dVbs + T1 * Acd_dVbs ; - Acn_dVds = - 12.0 * TY_dVds + T1 * Acd_dVds ; - Acn_dVgs = - 12.0 * TY_dVgs + T1 * Acd_dVgs ; - Acn_dT = - 12.0 * TY_dT + T1 * Acd_dT ; + Acn = -4.0 * C_SQRT_2 - 12.0 * TY + 2.0 * Acd + C_SQRT_2 * Acd * Acd ; + T1 = 2.0 + 2.0 * C_SQRT_2 * Acd ; + Acn_dVbs = - 12.0 * TY_dVbs + T1 * Acd_dVbs ; + Acn_dVds = - 12.0 * TY_dVds + T1 * Acd_dVds ; + Acn_dVgs = - 12.0 * TY_dVgs + T1 * Acd_dVgs ; + Acn_dT = - 12.0 * TY_dT + T1 * Acd_dT ; - T1 = 1.0 / Acd ; - Chi = Acn * T1 ; - Chi_dVbs = ( Acn_dVbs - Chi * Acd_dVbs ) * T1 ; - Chi_dVds = ( Acn_dVds - Chi * Acd_dVds ) * T1 ; - Chi_dVgs = ( Acn_dVgs - Chi * Acd_dVgs ) * T1 ; - Chi_dT = ( Acn_dT - Chi * Acd_dT ) * T1 ; + T1 = 1.0 / Acd ; + Chi = Acn * T1 ; + Chi_dVbs = ( Acn_dVbs - Chi * Acd_dVbs ) * T1 ; + Chi_dVds = ( Acn_dVds - Chi * Acd_dVds ) * T1 ; + Chi_dVgs = ( Acn_dVgs - Chi * Acd_dVgs ) * T1 ; + Chi_dT = ( Acn_dT - Chi * Acd_dT ) * T1 ; - Psa = Chi * beta_inv + Vbscl ; - Psa_dVbs = Chi_dVbs * beta_inv + Vbscl_dVbs ; - Psa_dVds = Chi_dVds * beta_inv ; - Psa_dVgs = Chi_dVgs * beta_inv ; - Psa_dT = Chi_dT * beta_inv + Chi * beta_inv_dT + Vbscl_dT; + Psa = Chi * beta_inv + Vbscl ; + Psa_dVbs = Chi_dVbs * beta_inv + Vbscl_dVbs ; + Psa_dVds = Chi_dVds * beta_inv ; + Psa_dVgs = Chi_dVgs * beta_inv ; + Psa_dT = Chi_dT * beta_inv + Chi * beta_inv_dT + Vbscl_dT; - T1 = Psa - Vbscl ; - T1_dT = Psa_dT - Vbscl_dT ; - T2 = T1 / Ps0_min ; - T2_dT = ( T1_dT * Ps0_min - T1 * Ps0_min_dT ) / ( Ps0_min * Ps0_min ) ; - T3 = sqrt( 1.0 + ( T2 * T2 ) ) ; - - T3_dT = 1.0 / T3 * T2 * T2_dT ; + T1 = Psa - Vbscl ; + T1_dVb = Psa_dVbs - Vbscl_dVbs ; + T1_dVd = Psa_dVds ; + T1_dVg = Psa_dVgs ; + T1_dT = Psa_dT - Vbscl_dT ; - T9 = T2 / T3 / Ps0_min ; - T3_dVb = T9 * ( Psa_dVbs - Vbscl_dVbs ) ; - T3_dVd = T9 * ( Psa_dVds ) ; - T3_dVg = T9 * ( Psa_dVgs ) ; + T2 = T1 / Ps0_min ; + T2_dVb = ( T1_dVb * Ps0_min - T1 * Ps0_min_dVbs ) / ( Ps0_min * Ps0_min ) ; + T2_dVd = ( T1_dVd * Ps0_min - T1 * Ps0_min_dVds ) / ( Ps0_min * Ps0_min ) ; + T2_dVg = ( T1_dVg * Ps0_min - T1 * Ps0_min_dVgs ) / ( Ps0_min * Ps0_min ) ; + T2_dT = ( T1_dT * Ps0_min - T1 * Ps0_min_dT ) / ( Ps0_min * Ps0_min ) ; + + T3 = sqrt( 1.0 + ( T2 * T2 ) ) ; + T3_dVb = 1.0 / T3 * T2 * T2_dVb ; + T3_dVd = 1.0 / T3 * T2 * T2_dVd ; + T3_dVg = 1.0 / T3 * T2 * T2_dVg ; + T3_dT = 1.0 / T3 * T2 * T2_dT ; - Ps0 = T1 / T3 + Vbscl ; - T9 = 1.0 / ( T3 * T3 ) ; - Ps0_dVbs = T9 * ( ( Psa_dVbs - Vbscl_dVbs ) * T3 - T1 * T3_dVb ) + Vbscl_dVbs ; - Ps0_dVds = T9 * ( Psa_dVds * T3 - T1 * T3_dVd ) ; - Ps0_dVgs = T9 * ( Psa_dVgs * T3 - T1 * T3_dVg ) ; - Ps0_dT = T9 * ( ( Psa_dT - Vbscl_dT )* T3 - T1 * T3_dT ) + Vbscl_dT; + Ps0 = T1 / T3 + Vbscl ; + T9 = 1.0 / ( T3 * T3 ) ; + Ps0_dVbs = T9 * ( ( Psa_dVbs - Vbscl_dVbs ) * T3 - T1 * T3_dVb ) + Vbscl_dVbs ; + Ps0_dVds = T9 * ( Psa_dVds * T3 - T1 * T3_dVd ) ; + Ps0_dVgs = T9 * ( Psa_dVgs * T3 - T1 * T3_dVg ) ; + Ps0_dT = T9 * ( ( Psa_dT - Vbscl_dT )* T3 - T1 * T3_dT ) + Vbscl_dT; /*---------------------------------------------------* * Characteristics. *-----------------*/ - Psl = Ps0 ; - Psl_dVbs = Ps0_dVbs ; - Psl_dVds = Ps0_dVds ; - Psl_dVgs = Ps0_dVgs ; - Psl_dT = Ps0_dT ; - - /** (reminder) - Psdl = Psl ; - Psdl_dVbs = Psl_dVbs ; - Psdl_dVds = Psl_dVds ; - Psdl_dVgs = Psl_dVgs ; - **/ + Psl = Ps0 ; + Psl_dVbs = Ps0_dVbs ; + Psl_dVds = Ps0_dVds ; + Psl_dVgs = Ps0_dVgs ; + Psl_dT = Ps0_dT ; + /** (reminder) + Psdl = Psl ; + Psdl_dVbs = Psl_dVbs ; + Psdl_dVds = Psl_dVds ; + Psdl_dVgs = Psl_dVgs ; + **/ + Pds = 0.0 ; + Pds_dVbs = 0.0 ; + Pds_dVds = 0.0 ; + Pds_dVgs = 0.0 ; + Pds_dT = 0.0 ; - T2 = ( Vgp - Ps0 ) ; - T2_dT = Vgp_dT - Ps0_dT ; - Qbu = Cox * T2 ; - Qbu_dVbs = Cox * ( Vgp_dVbs - Ps0_dVbs ) + Cox_dVb * T2 ; - Qbu_dVds = Cox * ( Vgp_dVds - Ps0_dVds ) + Cox_dVd * T2 ; - Qbu_dVgs = Cox * ( Vgp_dVgs - Ps0_dVgs ) + Cox_dVg * T2 ; - Qbu_dT = Cox * T2_dT ; + T2 = ( Vgp - Ps0 ) ; + T2_dT = Vgp_dT - Ps0_dT ; - Qiu = 0.0e0 ; - Qiu_dVbs = 0.0e0 ; - Qiu_dVds = 0.0e0 ; - Qiu_dVgs = 0.0e0 ; - Qiu_dT = 0.0e0 ; + Qbu = Cox * T2 ; + Qbu_dVbs = Cox * ( Vgp_dVbs - Ps0_dVbs ) + Cox_dVb * T2 ; + Qbu_dVds = Cox * ( Vgp_dVds - Ps0_dVds ) + Cox_dVd * T2 ; + Qbu_dVgs = Cox * ( Vgp_dVgs - Ps0_dVgs ) + Cox_dVg * T2 ; + Qbu_dT = Cox * T2_dT ; + + Qiu = 0.0e0 ; + Qiu_dVbs = 0.0e0 ; + Qiu_dVds = 0.0e0 ; + Qiu_dVgs = 0.0e0 ; + Qiu_dT = 0.0e0 ; - Qdrat = 0.0e0 ; - Qdrat_dVbs = 0.0e0 ; - Qdrat_dVds = 0.0e0 ; - Qdrat_dVgs = 0.0e0 ; - Qdrat_dT = 0.0 ; + Qdrat = 0.0e0 ; + Qdrat_dVbs = 0.0e0 ; + Qdrat_dVds = 0.0e0 ; + Qdrat_dVgs = 0.0e0 ; + Qdrat_dT = 0.0 ; - Lred = 0.0e0 ; - Lred_dVbs = 0.0e0 ; - Lred_dVds = 0.0e0 ; - Lred_dVgs = 0.0e0 ; - Lred_dT = 0.0e0 ; + Lred = 0.0e0 ; + Lred_dVbs = 0.0e0 ; + Lred_dVds = 0.0e0 ; + Lred_dVgs = 0.0e0 ; + Lred_dT = 0.0e0 ; - Ids = 0.0e0 ; - Ids_dVbs = 0.0e0 ; - Ids_dVds = 0.0e0 ; - Ids_dVgs = 0.0e0 ; - Ids_dT = 0.0e0 ; + Ids = 0.0e0 ; + Ids_dVbs = 0.0e0 ; + Ids_dVds = 0.0e0 ; + Ids_dVgs = 0.0e0 ; + Ids_dT = 0.0e0 ; - VgVt = 0.0 ; + VgVt = 0.0 ; - flg_noqi = 1 ; + flg_noqi = 1 ; - goto end_of_part_1 ; - } + goto end_of_part_1 ; + } + + /*-----------------------------------------------------------* + * Initial guess for Ps0. + *-----------------*/ - - /*-----------------------------------------------------------* - * Initial guess for Ps0. - *-----------------*/ + /*---------------------------------------------------* + * Ps0_iniA: solution of subthreshold equation assuming zone-D1/D2. + *-----------------*/ + TX = 1.0e0 + 4.0e0 + * ( beta * ( Vgp - Vbscl ) - 1.0e0 ) / ( fac1p2 * beta2 ) ; + TX = Fn_Max( TX , epsm10 ) ; + Ps0_iniA = Vgp + fac1p2 * beta * 0.5 * ( 1.0e0 - sqrt( TX ) ) ; - /*---------------------------------------------------* - * Ps0_iniA: solution of subthreshold equation assuming zone-D1/D2. - *-----------------*/ - TX = 1.0e0 + 4.0e0 - * ( beta * ( Vgp - Vbscl ) - 1.0e0 ) / ( fac1p2 * beta2 ) ; - TX = Fn_Max( TX , epsm10 ) ; - Ps0_iniA = Vgp + fac1p2 * beta * 0.5 * ( 1.0e0 - sqrt( TX ) ) ; - - /* use analytical value in subthreshold region. */ - if ( Vgs < ( Vfb + Vth ) * 0.5 ) { - flg_pprv = 0 ; - } + /* use analytical value in subthreshold region. */ + if ( Vgs < ( Vfb + Vth ) * 0.5 ) { + flg_pprv = 0 ; + } - if ( flg_pprv >= 1 ) { - /*---------------------------------------------------* - * Use previous value. - *-----------------*/ + if ( flg_pprv >= 1 ) { + /*---------------------------------------------------* + * Use previous value. + *-----------------*/ - T1 = Ps0_dVbs * dVbs + Ps0_dVds * dVds + Ps0_dVgs * dVgs ; - Ps0_ini = Ps0 + T1 ; + T1 = Ps0_dVbs * dVbs + Ps0_dVds * dVds + Ps0_dVgs * dVgs ; + Ps0_ini = Ps0 + T1 ; T2 = here->HSMHV_ps0_dtemp_prv * Temp_dif ; if ( fabs( T1 + T2 ) < dP_max ) { Ps0_ini += T2 ; } - if ( flg_pprv == 2 ) { - /* TX_dVxs = d^2 Ps0 / d Vxs^2 here */ - if ( Vbsc_dif2 > epsm10 ) { - TX_dVbs = ( here->HSMHV_ps0_dvbs_prv - here->HSMHV_ps0_dvbs_prv2 ) + if ( flg_pprv == 2 ) { + /* TX_dVxs = d^2 Ps0 / d Vxs^2 here */ + if ( Vbsc_dif2 > epsm10 ) { + TX_dVbs = ( here->HSMHV_ps0_dvbs_prv - here->HSMHV_ps0_dvbs_prv2 ) / Vbsc_dif2 ; - } else { - TX_dVbs = 0.0 ; - } - if ( Vdsc_dif2 > epsm10 ) { - TX_dVds = ( here->HSMHV_ps0_dvds_prv - here->HSMHV_ps0_dvds_prv2 ) + } else { + TX_dVbs = 0.0 ; + } + if ( Vdsc_dif2 > epsm10 ) { + TX_dVds = ( here->HSMHV_ps0_dvds_prv - here->HSMHV_ps0_dvds_prv2 ) / Vdsc_dif2 ; - } else { - TX_dVds = 0.0 ; - } - if ( Vgsc_dif2 > epsm10 ) { - TX_dVgs = ( here->HSMHV_ps0_dvgs_prv - here->HSMHV_ps0_dvgs_prv2 ) + } else { + TX_dVds = 0.0 ; + } + if ( Vgsc_dif2 > epsm10 ) { + TX_dVgs = ( here->HSMHV_ps0_dvgs_prv - here->HSMHV_ps0_dvgs_prv2 ) / Vgsc_dif2 ; - } else { - TX_dVgs = 0.0 ; + } else { + TX_dVgs = 0.0 ; + } + T2 = ( dVbs * dVbs ) / 2 * TX_dVbs + + ( dVds * dVds ) / 2 * TX_dVds + + ( dVgs * dVgs ) / 2 * TX_dVgs ; + + if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) { + Ps0_ini += T2 ; + } else { + flg_pprv = 1 ; + } } - T2 = ( dVbs * dVbs ) / 2 * TX_dVbs - + ( dVds * dVds ) / 2 * TX_dVds - + ( dVgs * dVgs ) / 2 * TX_dVgs ; - if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) { - Ps0_ini += T2 ; + T1 = Ps0_ini - Ps0 ; + if ( T1 < - dP_max || T1 > dP_max ) { + flg_pprv = 0 ; /* flag changes to analytical */ } else { - flg_pprv = 1 ; + Ps0_iniA = Fn_Max( Ps0_ini , Ps0_iniA ) ; } - } + } /* end of (flg_pprv >=1) if-block */ - T1 = Ps0_ini - Ps0 ; - if ( T1 < - dP_max || T1 > dP_max ) { - flg_pprv = 0 ; /* flag changes to analytical */ - } else { - Ps0_iniA = Fn_Max( Ps0_ini , Ps0_iniA ) ; - } - } /* end of (flg_pprv >=1) if-block */ + if ( flg_pprv == 0 ) { - if ( flg_pprv == 0 ) { - - /*---------------------------------------------------* - * Analytical initial guess. - *-----------------*/ - /*-------------------------------------------* - * Common part. - *-----------------*/ - Chi = beta * ( Ps0_iniA - Vbscl ) ; + /*---------------------------------------------------* + * Analytical initial guess. + *-----------------*/ + /*-------------------------------------------* + * Common part. + *-----------------*/ + Chi = beta * ( Ps0_iniA - Vbscl ) ; - if ( Chi < znbd3 ) { - /*-----------------------------------* - * zone-D1/D2 - * - Ps0_ini is the analytical solution of Qs=Qb0 with - * Qb0 being approximated to 3-degree polynomial. - *-----------------*/ - TY = beta * ( Vgp - Vbscl ) ; - T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ; - T2 = 81.0 + 3.0 * T1 ; - T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ; - T4 = 1458.0 - 81.0 * ( 54.0 + T1 ) + 27.0 * T1 * TY ; - T4 = T4 * T4 ; - T5 = Fn_Pow( T3 + sqrt( 4 * T2 * T2 * T2 + T4 ) , C_1o3 ) ; - TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 ) - + 1 / ( 3.0 * C_2p_1o3 ) * T5 ; + if ( Chi < znbd3 ) { + /*-----------------------------------* + * zone-D1/D2 + * - Ps0_ini is the analytical solution of Qs=Qb0 with + * Qb0 being approximated to 3-degree polynomial. + *-----------------*/ + TY = beta * ( Vgp - Vbscl ) ; + T1 = 1.0e0 / ( cn_nc3 * beta * fac1 ) ; + T2 = 81.0 + 3.0 * T1 ; + T3 = -2916.0 - 81.0 * T1 + 27.0 * T1 * TY ; + T4 = 1458.0 - 81.0 * ( 54.0 + T1 ) + 27.0 * T1 * TY ; + T4 = T4 * T4 ; + T5 = Fn_Pow( T3 + sqrt( 4 * T2 * T2 * T2 + T4 ) , C_1o3 ) ; + TX = 3.0 - ( C_2p_1o3 * T2 ) / ( 3.0 * T5 ) + + 1 / ( 3.0 * C_2p_1o3 ) * T5 ; - Ps0_iniA = TX * beta_inv + Vbscl ; - Ps0_ini = Ps0_iniA ; + Ps0_iniA = TX * beta_inv + Vbscl ; + Ps0_ini = Ps0_iniA ; - } else if ( Vgs <= Vth ) { - /*-----------------------------------* - * Weak inversion zone. - *-----------------*/ - Ps0_ini = Ps0_iniA ; + } else if ( Vgs <= Vth ) { + /*-----------------------------------* + * Weak inversion zone. + *-----------------*/ + Ps0_ini = Ps0_iniA ; - } else { - /*-----------------------------------* - * Strong inversion zone. - * - Ps0_iniB : upper bound. - *-----------------*/ - T1 = 1.0 / cnst1 / cnstCoxi ; - T2 = T1 * Vgp * Vgp ; - T3 = beta + 2.0 / Vgp ; + } else { + /*-----------------------------------* + * Strong inversion zone. + * - Ps0_iniB : upper bound. + *-----------------*/ + T1 = 1.0 / cnst1 / cnstCoxi ; + T2 = T1 * Vgp * Vgp ; + T3 = beta + 2.0 / Vgp ; - Ps0_iniB = log( T2 ) / T3 ; + Ps0_iniB = log( T2 ) / T3 ; - Fn_SU( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1) ; - } - } - - TX = Vbscl + ps_conv / 2 ; - if ( Ps0_ini < TX ) Ps0_ini = TX ; - - - /*---------------------------------------------------* - * Assign initial guess. - *-----------------*/ - Ps0 = Ps0_ini ; - Psl_lim = Ps0_iniA ; - - /*---------------------------------------------------* - * Calculation of Ps0. (beginning of Newton loop) - * - Fs0 : Fs0 = 0 is the equation to be solved. - * - dPs0 : correction value. - *-----------------*/ - exp_bVbs = exp( beta * Vbscl ) ; - cfs1 = cnst1 * exp_bVbs ; - - flg_conv = 0 ; - for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) { - - Chi = beta * ( Ps0 - Vbscl ) ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0) - * - Qb0 is approximated to 5-degree polynomial. - *-----------------*/ - fi = Chi * Chi * Chi - * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; - fi_dChi = Chi * Chi - * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; - - fs01 = cfs1 * fi * fi ; - fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ; - - fb = Chi * ( cn_nc51 - + Chi * ( cn_nc52 - + Chi * ( cn_nc53 - + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; - fb_dChi = cn_nc51 - + Chi * ( 2 * cn_nc52 - + Chi * ( 3 * cn_nc53 - + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; - - fs02 = sqrt( fb * fb + fs01 ) ; - fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ; - - } else { - /*-------------------------------------------* - * zone-D3. (Ps0) - *-----------------*/ - if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */ - exp_Chi = exp( Chi ) ; - fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ; - fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ; - } else { - exp_bPs0 = exp( beta*Ps0 ) ; - fs01 = cnst1 * ( exp_bPs0 - exp_bVbs ) ; - fs01_dPs0 = cnst1 * beta * exp_bPs0 ; - } - fs02 = sqrt( Chi - 1.0 + fs01 ) ; - fs02_dPs0 = ( beta + fs01_dPs0 ) / ( fs02 + fs02 ) ; - } /* end of if ( Chi ... ) else block */ - - Fs0 = Vgp - Ps0 - fac1 * fs02 ; - Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ; - - if ( flg_conv == 1 ) break ; - - dPs0 = - Fs0 / Fs0_dPs0 ; - - - /*-------------------------------------------* - * Update Ps0 . - * - clamped to Vbscl if Ps0 < Vbscl . - *-----------------*/ - dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0))) ; - if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ; - - Ps0 = Ps0 + dPs0 ; - - TX = Vbscl + ps_conv / 2 ; - if ( Ps0 < TX ) Ps0 = TX ; - - /*-------------------------------------------* - * Check convergence. - * NOTE: This condition may be too rigid. - *-----------------*/ - if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) { - flg_conv = 1 ; + Fn_SU( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1) ; + } } + + TX = Vbscl + ps_conv / 2 ; + if ( Ps0_ini < TX ) Ps0_ini = TX ; + + + /*---------------------------------------------------* + * Assign initial guess. + *-----------------*/ + Ps0 = Ps0_ini ; + Psl_lim = Ps0_iniA ; + + + /*---------------------------------------------------* + * Calculation of Ps0. (beginning of Newton loop) + * - Fs0 : Fs0 = 0 is the equation to be solved. + * - dPs0 : correction value. + *-----------------*/ + exp_bVbs = exp( beta * Vbscl ) ; + cfs1 = cnst1 * exp_bVbs ; + + flg_conv = 0 ; + for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) { - } /* end of Ps0 Newton loop */ + Chi = beta * ( Ps0 - Vbscl ) ; + + if ( Chi < znbd5 ) { + /*-------------------------------------------* + * zone-D1/D2. (Ps0) + * - Qb0 is approximated to 5-degree polynomial. + *-----------------*/ + fi = Chi * Chi * Chi + * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; + fi_dChi = Chi * Chi + * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; + + fs01 = cfs1 * fi * fi ; + fs01_dPs0 = cfs1 * beta * 2 * fi * fi_dChi ; - /* Reduce loop count to exclude the sweep for derivative calculation */ - lp_s0 -- ; + fb = Chi * ( cn_nc51 + + Chi * ( cn_nc52 + + Chi * ( cn_nc53 + + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; + fb_dChi = cn_nc51 + + Chi * ( 2 * cn_nc52 + + Chi * ( 3 * cn_nc53 + + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; + + fs02 = sqrt( fb * fb + fs01 ) ; + fs02_dPs0 = ( beta * fb_dChi * 2 * fb + fs01_dPs0 ) / ( fs02 + fs02 ) ; + + } else { + /*-------------------------------------------* + * zone-D3. (Ps0) + *-----------------*/ + if ( Chi < large_arg ) { /* avoid exp_Chi to become extremely large */ + exp_Chi = exp( Chi ) ; + fs01 = cfs1 * ( exp_Chi - 1.0e0 ) ; + fs01_dPs0 = cfs1 * beta * ( exp_Chi ) ; + } else { + exp_bPs0 = exp( beta*Ps0 ) ; + fs01 = cnst1 * ( exp_bPs0 - exp_bVbs ) ; + fs01_dPs0 = cnst1 * beta * exp_bPs0 ; + } + fs02 = sqrt( Chi - 1.0 + fs01 ) ; + fs02_dPs0 = ( beta + fs01_dPs0 ) / ( fs02 + fs02 ) ; + } /* end of if ( Chi ... ) else block */ - /*-------------------------------------------* - * Procedure for diverged case. - *-----------------*/ - if ( flg_conv == 0 ) { - fprintf( stderr , - "*** warning(HiSIM_HV): Went Over Iteration Maximum (Ps0)\n" ) ; - fprintf( stderr , + Fs0 = Vgp - Ps0 - fac1 * fs02 ; + Fs0_dPs0 = - 1.0e0 - fac1 * fs02_dPs0 ; + + if ( flg_conv == 1 ) break ; + + dPs0 = - Fs0 / Fs0_dPs0 ; + + /*-------------------------------------------* + * Update Ps0 . + * - clamped to Vbscl if Ps0 < Vbscl . + *-----------------*/ + dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Ps0))) ; + if ( fabs( dPs0 ) > dPlim ) dPs0 = dPlim * Fn_Sgn( dPs0 ) ; + + Ps0 = Ps0 + dPs0 ; + +// TX = Vbscl + ps_conv / 2 ; +// if ( Ps0 < TX ) Ps0 = TX ; + + /*-------------------------------------------* + * Check convergence. + * NOTE: This condition may be too rigid. + *-----------------*/ + if ( fabs( dPs0 ) <= ps_conv && fabs( Fs0 ) <= gs_conv ) { + flg_conv = 1 ; + } + + } /* end of Ps0 Newton loop */ + + /* Reduce loop count to exclude the sweep for derivative calculation */ + lp_s0 -- ; + + /*-------------------------------------------* + * Procedure for diverged case. + *-----------------*/ + if ( flg_conv == 0 ) { + fprintf( stderr , + "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Ps0)\n", model->HSMHVmodName ) ; + fprintf( stderr , " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" , Vbse , Vdse , Vgse ) ; - if ( flg_info >= 2 ) { - printf( "*** warning(HiSIM_HV): Went Over Iteration Maximum (Ps0)\n" ) ; - } - } + if ( flg_info >= 2 ) { + printf( "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Ps0)\n", model->HSMHVmodName ) ; + } + } - /*---------------------------------------------------* - * Evaluate derivatives of Ps0. - * - note: Here, fs01_dVbs and fs02_dVbs are derivatives - * w.r.t. explicit Vbs. So, Ps0 in the fs01 and fs02 - * expressions is regarded as a constant. - *-----------------*/ - /* self heating */ - Chi_dT = beta_dT *( Ps0 - Vbscl ) - beta * Vbscl_dT ; - exp_bVbs_dT = ( beta_dT * Vbscl + beta * Vbscl_dT ) * exp_bVbs ; - cfs1_dT = exp_bVbs * cnst1_dT + exp_bVbs_dT * cnst1 ; + /*---------------------------------------------------* + * Evaluate derivatives of Ps0. + * - note: Here, fs01_dVbs and fs02_dVbs are derivatives + * w.r.t. explicit Vbs. So, Ps0 in the fs01 and fs02 + * expressions is regarded as a constant. + *-----------------*/ + /* self heating */ + Chi_dT = beta_dT *( Ps0 - Vbscl ) - beta * Vbscl_dT ; + exp_bVbs_dT = ( beta_dT * Vbscl + beta * Vbscl_dT ) * exp_bVbs ; + cfs1_dT = exp_bVbs * cnst1_dT + exp_bVbs_dT * cnst1 ; - /* derivatives of fs0* w.r.t. explicit Vbs */ - if ( Chi < znbd5 ) { - fs01_dVbs = cfs1 * beta * fi * ( fi - 2 * fi_dChi ) * Vbscl_dVbs ; - fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ; - T2 = 1.0e0 / ( fs02 + fs02 ) ; - fs02_dVbs = ( - beta * Vbscl_dVbs * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ; - fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ; - } else { - if ( Chi < large_arg ) { - fs01_dVbs = - cfs1 * beta * Vbscl_dVbs ; - exp_Chi_dT = exp_Chi * Chi_dT ; - fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ; + /* derivatives of fs0* w.r.t. explicit Vbs */ + if ( Chi < znbd5 ) { + fs01_dVbs = cfs1 * beta * fi * ( fi - 2 * fi_dChi ) * Vbscl_dVbs ; + fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ; + T2 = 1.0e0 / ( fs02 + fs02 ) ; + fs02_dVbs = ( - beta * Vbscl_dVbs * fb_dChi * 2 * fb + fs01_dVbs ) * T2 ; + fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ; } else { - fs01_dVbs = - cfs1 * beta * Vbscl_dVbs ; - exp_bPs0_dT = exp_bPs0 * Ps0 * beta_dT ; - fs01_dT = cnst1_dT*(exp_bPs0-exp_bVbs) + cnst1*(exp_bPs0_dT-exp_bVbs_dT) ; + if ( Chi < large_arg ) { + fs01_dVbs = - cfs1 * beta * Vbscl_dVbs ; + exp_Chi_dT = exp_Chi * Chi_dT ; + fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ; + } else { + fs01_dVbs = - cfs1 * beta * Vbscl_dVbs ; + exp_bPs0_dT = exp_bPs0 * Ps0 * beta_dT ; + fs01_dT = cnst1_dT*(exp_bPs0-exp_bVbs) + cnst1*(exp_bPs0_dT-exp_bVbs_dT) ; + } + T2 = 0.5e0 / fs02 ; + fs02_dVbs = ( - beta * Vbscl_dVbs + fs01_dVbs ) * T2 ; + fs02_dT = T2 * ( Chi_dT + fs01_dT ) ; } - T2 = 0.5e0 / fs02 ; - fs02_dVbs = ( - beta * Vbscl_dVbs + fs01_dVbs ) * T2 ; - fs02_dT = T2 * ( Chi_dT + fs01_dT ) ; - } - T1 = 1.0 / Fs0_dPs0 ; - Ps0_dVbs = - ( Vgp_dVbs - ( fac1 * fs02_dVbs + fac1_dVbs * fs02 ) ) * T1 ; - Ps0_dVds = - ( Vgp_dVds - fac1_dVds * fs02 ) * T1 ; - Ps0_dVgs = - ( Vgp_dVgs - fac1_dVgs * fs02 ) * T1 ; - Ps0_dT = - ( Vgp_dT - ( fac1 * fs02_dT + fac1_dT * fs02 ) ) * T1 ; + T1 = 1.0 / Fs0_dPs0 ; + Ps0_dVbs = - ( Vgp_dVbs - ( fac1 * fs02_dVbs + fac1_dVbs * fs02 ) ) * T1 ; + Ps0_dVds = - ( Vgp_dVds - fac1_dVds * fs02 ) * T1 ; + Ps0_dVgs = - ( Vgp_dVgs - fac1_dVgs * fs02 ) * T1 ; + Ps0_dT = - ( Vgp_dT - ( fac1 * fs02_dT + fac1_dT * fs02 ) ) * T1 ; - Chi_dT = beta_dT *( Ps0 - Vbscl ) + beta * ( Ps0_dT - Vbscl_dT ) ; + Chi_dT = beta_dT *( Ps0 - Vbscl ) + beta * ( Ps0_dT - Vbscl_dT ) ; - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Ps0) - * Xi0 := fdep0^2 = fb * fb [D1,D2] - *-----------------*/ - Xi0 = fb * fb + epsm10 ; - T1 = 2 * fb * fb_dChi * beta ; - Xi0_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; - Xi0_dVds = T1 * Ps0_dVds ; - Xi0_dVgs = T1 * Ps0_dVgs ; - Xi0_dT = 2 * fb * fb_dChi * Chi_dT ; + if ( Chi < znbd5 ) { - Xi0p12 = fb + epsm10 ; - T1 = fb_dChi * beta ; - Xi0p12_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; - Xi0p12_dVds = T1 * Ps0_dVds ; - Xi0p12_dVgs = T1 * Ps0_dVgs ; - Xi0p12_dT = fb_dChi * Chi_dT ; + /*-------------------------------------------* + * zone-D1/D2. (Ps0) + * Xi0 := fdep0^2 = fb * fb [D1,D2] + *-----------------*/ + Xi0 = fb * fb + epsm10 ; + T1 = 2 * fb * fb_dChi * beta ; + Xi0_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; + Xi0_dVds = T1 * Ps0_dVds ; + Xi0_dVgs = T1 * Ps0_dVgs ; + Xi0_dT = 2 * fb * fb_dChi * Chi_dT ; - Xi0p32 = fb * fb * fb + epsm10 ; - T1 = 3 * fb * fb * fb_dChi * beta ; - Xi0p32_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; - Xi0p32_dVds = T1 * Ps0_dVds ; - Xi0p32_dVgs = T1 * Ps0_dVgs ; - Xi0p32_dT = 3 * fb * fb * fb_dChi * Chi_dT ; + Xi0p12 = fb + epsm10 ; + T1 = fb_dChi * beta ; + Xi0p12_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; + Xi0p12_dVds = T1 * Ps0_dVds ; + Xi0p12_dVgs = T1 * Ps0_dVgs ; + Xi0p12_dT = fb_dChi * Chi_dT ; - fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ; - fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ; + Xi0p32 = fb * fb * fb + epsm10 ; + T1 = 3 * fb * fb * fb_dChi * beta ; + Xi0p32_dVbs = T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; + Xi0p32_dVds = T1 * Ps0_dVds ; + Xi0p32_dVgs = T1 * Ps0_dVgs ; + Xi0p32_dT = 3 * fb * fb * fb_dChi * Chi_dT ; + + fs01_dT = cfs1 * 2 * fi * fi_dChi * Chi_dT + fi * fi * cfs1_dT ; + fs02_dT = ( 2 * fb * fb_dChi * Chi_dT + fs01_dT ) * T2 ; - } else { - /*-------------------------------------------* - * zone-D3. (Ps0) - *-----------------*/ - flg_zone = 3 ; - flg_noqi = 0 ; + } else { - /*-----------------------------------* - * Xi0 := fdep0^2 = Chi - 1 = beta * ( Ps0 - Vbscl ) - 1 [D3] - *-----------------*/ - Xi0 = Chi - 1.0e0 ; - Xi0_dVbs = beta * ( Ps0_dVbs - Vbscl_dVbs ) ; - Xi0_dVds = beta * Ps0_dVds ; - Xi0_dVgs = beta * Ps0_dVgs ; - Xi0_dT = Chi_dT ; + /*-------------------------------------------* + * zone-D3. (Ps0) + *-----------------*/ + flg_zone = 3 ; + flg_noqi = 0 ; + + /*-----------------------------------* + * Xi0 := fdep0^2 = Chi - 1 = beta * ( Ps0 - Vbscl ) - 1 [D3] + *-----------------*/ + Xi0 = Chi - 1.0e0 ; + Xi0_dVbs = beta * ( Ps0_dVbs - Vbscl_dVbs ) ; + Xi0_dVds = beta * Ps0_dVds ; + Xi0_dVgs = beta * Ps0_dVgs ; + Xi0_dT = Chi_dT ; - Xi0p12 = sqrt( Xi0 ) ; - T1 = 0.5e0 / Xi0p12 ; - Xi0p12_dVbs = T1 * Xi0_dVbs ; - Xi0p12_dVds = T1 * Xi0_dVds ; - Xi0p12_dVgs = T1 * Xi0_dVgs ; - Xi0p12_dT = T1 * Xi0_dT ; + Xi0p12 = sqrt( Xi0 ) ; + T1 = 0.5e0 / Xi0p12 ; + Xi0p12_dVbs = T1 * Xi0_dVbs ; + Xi0p12_dVds = T1 * Xi0_dVds ; + Xi0p12_dVgs = T1 * Xi0_dVgs ; + Xi0p12_dT = T1 * Xi0_dT ; - Xi0p32 = Xi0 * Xi0p12 ; - T1 = 1.5e0 * Xi0p12 ; - Xi0p32_dVbs = T1 * Xi0_dVbs ; - Xi0p32_dVds = T1 * Xi0_dVds ; - Xi0p32_dVgs = T1 * Xi0_dVgs ; - Xi0p32_dT = T1 * Xi0_dT ; + Xi0p32 = Xi0 * Xi0p12 ; + T1 = 1.5e0 * Xi0p12 ; + Xi0p32_dVbs = T1 * Xi0_dVbs ; + Xi0p32_dVds = T1 * Xi0_dVds ; + Xi0p32_dVgs = T1 * Xi0_dVgs ; + Xi0p32_dT = T1 * Xi0_dT ; - if ( Chi < large_arg ) { - exp_Chi_dT = exp_Chi * Chi_dT ; - fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ; - } else { - exp_bPs0_dT = exp_bPs0 * (beta_dT * Ps0 + beta * Ps0_dT) ; - fs01_dT = cnst1_dT*(exp_bPs0-exp_bVbs) + cnst1*(exp_bPs0_dT-exp_bVbs_dT) ; - } - fs02_dT = T2 * ( Chi_dT + fs01_dT ) ; + if ( Chi < large_arg ) { + exp_Chi_dT = exp_Chi * Chi_dT ; + fs01_dT = ( exp_Chi - 1.0e0 ) * cfs1_dT + cfs1 * exp_Chi_dT ; + } else { + exp_bPs0_dT = exp_bPs0 * (beta_dT * Ps0 + beta * Ps0_dT) ; + fs01_dT = cnst1_dT*(exp_bPs0-exp_bVbs) + cnst1*(exp_bPs0_dT-exp_bVbs_dT) ; + } + fs02_dT = T2 * ( Chi_dT + fs01_dT ) ; - } /* end of if ( Chi ... ) block */ + } /* end of if ( Chi ... ) block */ /*-----------------------------------------------------------* - * - Recalculate the derivatives of fs01 and fs02. - * note: fs01 = cnst1 * exp( Vbs ) * ( exp( Chi ) - Chi - 1.0e0 ) ; - * fs02 = sqrt( Xi0 + fs01 ) ; - *-----------------*/ - fs01_dVbs = Ps0_dVbs * fs01_dPs0 + fs01_dVbs ; - fs01_dVds = Ps0_dVds * fs01_dPs0 ; - fs01_dVgs = Ps0_dVgs * fs01_dPs0 ; - fs02_dVbs = Ps0_dVbs * fs02_dPs0 + fs02_dVbs ; - fs02_dVds = Ps0_dVds * fs02_dPs0 ; - fs02_dVgs = Ps0_dVgs * fs02_dPs0 ; + * - Recalculate the derivatives of fs01 and fs02. + * note: fs01 = cnst1 * exp( Vbs ) * ( exp( Chi ) - Chi - 1.0e0 ) ; + * fs02 = sqrt( Xi0 + fs01 ) ; + *-----------------*/ + fs01_dVbs = Ps0_dVbs * fs01_dPs0 + fs01_dVbs ; + fs01_dVds = Ps0_dVds * fs01_dPs0 ; + fs01_dVgs = Ps0_dVgs * fs01_dPs0 ; + fs02_dVbs = Ps0_dVbs * fs02_dPs0 + fs02_dVbs ; + fs02_dVds = Ps0_dVds * fs02_dPs0 ; + fs02_dVgs = Ps0_dVgs * fs02_dPs0 ; - /*-----------------------------------------------------------* - * Qb0 : Qb at source side. - * Qn0 : Qi at source side. - *-----------------*/ + /*-----------------------------------------------------------* + * Qb0 : Qb at source side. + * Qn0 : Qi at source side. + *-----------------*/ - Qb0 = cnst0 * Xi0p12 ; - Qb0_dVb = cnst0 * Xi0p12_dVbs ; - Qb0_dVd = cnst0 * Xi0p12_dVds ; - Qb0_dVg = cnst0 * Xi0p12_dVgs ; - Qb0_dT = cnst0 * Xi0p12_dT + cnst0_dT * Xi0p12 ; + Qb0 = cnst0 * Xi0p12 ; + Qb0_dVb = cnst0 * Xi0p12_dVbs ; + Qb0_dVd = cnst0 * Xi0p12_dVds ; + Qb0_dVg = cnst0 * Xi0p12_dVgs ; + Qb0_dT = cnst0 * Xi0p12_dT + cnst0_dT * Xi0p12 ; - T1 = 1.0 / ( fs02 + Xi0p12 ) ; - Qn0 = cnst0 * fs01 * T1 ; - T1_dT = - T1 * T1 * ( fs02_dT + Xi0p12_dT ) ; - Qn0_dT = cnst0 * ( fs01 * T1_dT + T1 * fs01_dT ) + fs01 * T1 * cnst0_dT ; + T1 = 1.0 / ( fs02 + Xi0p12 ) ; + Qn0 = cnst0 * fs01 * T1 ; + T1_dT = - T1 * T1 * ( fs02_dT + Xi0p12_dT ) ; + Qn0_dT = cnst0 * ( fs01 * T1_dT + T1 * fs01_dT ) + fs01 * T1 * cnst0_dT ; - T2 = 1.0 / ( fs01 + epsm10 ) ; + T2 = 1.0 / ( fs01 + small ) ; - Qn0_dVbs = Qn0 * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ; - Qn0_dVds = Qn0 * ( fs01_dVds * T2 - ( fs02_dVds + Xi0p12_dVds ) * T1 ) ; - Qn0_dVgs = Qn0 * ( fs01_dVgs * T2 - ( fs02_dVgs + Xi0p12_dVgs ) * T1 ) ; + Qn0_dVbs = Qn0 * ( fs01_dVbs * T2 - ( fs02_dVbs + Xi0p12_dVbs ) * T1 ) ; + Qn0_dVds = Qn0 * ( fs01_dVds * T2 - ( fs02_dVds + Xi0p12_dVds ) * T1 ) ; + Qn0_dVgs = Qn0 * ( fs01_dVgs * T2 - ( fs02_dVgs + Xi0p12_dVgs ) * T1 ) ; - /*-----------------------------------------------------------* - * zone-D1 and D2 - *-----------------*/ - if ( Chi < znbd5 ) { - if ( Chi < znbd3 ) { - /*-------------------------------------------* - * zone-D1. (Ps0) - *-----------------*/ - flg_zone = 1 ; - flg_noqi = 1 ; /** !! to be revisited !! **/ + /*-----------------------------------------------------------* + * zone-D1 and D2 + *-----------------*/ + if ( Chi < znbd5 ) { + if ( Chi < znbd3 ) { + /*-------------------------------------------* + * zone-D1. (Ps0) + *-----------------*/ + flg_zone = 1 ; + flg_noqi = 1 ; /** !! to be revisited !! **/ - Qiu = Qn0 ; - Qiu_dVbs = Qn0_dVbs ; - Qiu_dVds = Qn0_dVds ; - Qiu_dVgs = Qn0_dVgs ; - Qiu_dT = Qn0_dT; + Qiu = Qn0 ; + Qiu_dVbs = Qn0_dVbs ; + Qiu_dVds = Qn0_dVds ; + Qiu_dVgs = Qn0_dVgs ; + Qiu_dT = Qn0_dT; + + Qbu = Qb0 ; + Qbu_dVbs = Qb0_dVb ; + Qbu_dVds = Qb0_dVd ; + Qbu_dVgs = Qb0_dVg ; + Qbu_dT = Qb0_dT ; + + Qdrat = 0.5 ; + Qdrat_dVbs = 0.0 ; + Qdrat_dVds = 0.0 ; + Qdrat_dVgs = 0.0 ; + Qdrat_dT = 0.0; + + Lred = 0.0e0 ; + Lred_dVbs = 0.0e0 ; + Lred_dVds = 0.0e0 ; + Lred_dVgs = 0.0e0 ; + Lred_dT = 0.0e0 ; + + /** (reminder) + *Psdl = Psl ; + *Psdl_dVbs = Psl_dVbs ; + *Psdl_dVds = Psl_dVds ; + *Psdl_dVgs = Psl_dVgs ; + **/ + + } else { + /*-------------------------------------------* + * zone-D2 (Ps0) + *-----------------*/ + + flg_zone = 2 ; + flg_noqi = 0 ; + /*-----------------------------------------------------------* + * FD2 : connecting function for zone-D2. + * - Qiu, Qbu, Qdrat and Lred should be interpolated later. + *-----------------*/ + T1 = 1.0 / ( znbd5 - znbd3 ) ; + TX = T1 * ( Chi - znbd3 ) ; + TX_dVbs = beta * T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; + TX_dVds = beta * T1 * Ps0_dVds ; + TX_dVgs = beta * T1 * Ps0_dVgs ; + TX_dT = T1 * Chi_dT ; + + FD2 = TX * TX * TX * ( 10.0 + TX * ( -15.0 + TX * 6.0 ) ) ; + T4 = TX * TX * ( 30.0 + TX * ( -60.0 + TX * 30.0 ) ) ; + + FD2_dVbs = T4 * TX_dVbs ; + FD2_dVds = T4 * TX_dVds ; + FD2_dVgs = T4 * TX_dVgs ; + FD2_dT = T4 * TX_dT ; + + + } /* end of zone-D2 */ + } + + + /*---------------------------------------------------* + * VgVt : Vgp - Vth_qi. ( Vth_qi is Vth for Qi evaluation. ) + *-----------------*/ + VgVt = Qn0 * Cox_inv ; + VgVt_dVbs = Qn0_dVbs * Cox_inv + Qn0 * Cox_inv_dVb ; + VgVt_dVds = Qn0_dVds * Cox_inv + Qn0 * Cox_inv_dVd ; + VgVt_dVgs = Qn0_dVgs * Cox_inv + Qn0 * Cox_inv_dVg ; + VgVt_dT = Qn0_dT * Cox_inv ; + + /*-----------------------------------------------------------* + * make Qi=Qd=Ids=0 if VgVt <= VgVt_small + *-----------------*/ + if ( VgVt <= VgVt_small ) { + flg_zone = 4 ; + flg_noqi = 1 ; + + Psl = Ps0 ; + Psl_dVbs = Ps0_dVbs ; + Psl_dVds = Ps0_dVds ; + Psl_dVgs = Ps0_dVgs ; + Psl_dT = Ps0_dT ; + + /** (reminder) + *Psdl = Psl ; + *Psdl_dVbs = Psl_dVbs ; + *Psdl_dVds = Psl_dVds ; + *Psdl_dVgs = Psl_dVgs ; + **/ + + Pds = 0.0 ; + Pds_dVbs = 0.0 ; + Pds_dVds = 0.0 ; + Pds_dVgs = 0.0 ; + Pds_dT = 0.0 ; Qbu = Qb0 ; Qbu_dVbs = Qb0_dVb ; @@ -2705,1571 +2746,1606 @@ int HSMHVevaluate Qbu_dVgs = Qb0_dVg ; Qbu_dT = Qb0_dT ; + Qiu = 0.0 ; + Qiu_dVbs = 0.0 ; + Qiu_dVds = 0.0 ; + Qiu_dVgs = 0.0 ; + Qiu_dT = 0.0 ; + Qdrat = 0.5 ; Qdrat_dVbs = 0.0 ; Qdrat_dVds = 0.0 ; Qdrat_dVgs = 0.0 ; - Qdrat_dT = 0.0; + Qdrat_dT = 0.0 ; + + Lred = 0.0 ; + Lred_dVbs = 0.0 ; + Lred_dVds = 0.0 ; + Lred_dVgs = 0.0 ; + Lred_dT = 0.0 ; + + Ids = 0.0e0 ; + Ids_dVbs = 0.0e0 ; + Ids_dVds = 0.0e0 ; + Ids_dVgs = 0.0e0 ; + Ids_dT = 0.0e0 ; + + goto end_of_part_1 ; + } + + /*-----------------------------------------------------------* + * Start point of Psl (= Ps0 + Pds) calculation. (label) + *-----------------*/ +/* start_of_Psl: */ + + + /* Vdseff (begin) */ + Vdsorg = Vds ; + + T2 = here->HSMHV_qnsub_esi / ( Cox * Cox ) ; + T4 = - 2.0e0 * T2 / Cox ; + T2_dVb = T4 * Cox_dVb ; + T2_dVd = T4 * Cox_dVd ; + T2_dVg = T4 * Cox_dVg ; + T2_dT = T4 * Cox_dT ; + + T0 = Vgp - beta_inv - Vbsz ; + T0_dT = Vgp_dT - beta_inv_dT - Vbsz_dT ; + Fn_SZ( T9, 1.0e0 + 2.0e0 / T2 * T0, 1e-3, TX ) ; + T9 += small ; + T3 = sqrt( T9 ) ; + T4 = 0.5e0 / T3 ; + T5 = 1.0e0 / ( T2 * T2 ) ; + T6 = T4 * 2.0e0 * T5 * TX ; + T7 = T6 * T0 ; + T8 = T6 * T2 ; + T3_dVb = - T2_dVb * T7 + T8 * ( Vgp_dVbs - Vbsz_dVbs ) ; + T3_dVd = - T2_dVd * T7 + T8 * ( Vgp_dVds - Vbsz_dVds ) ; + T3_dVg = - T2_dVg * T7 + T8 * Vgp_dVgs ; + T3_dT = - T2_dT * T7 + T8 * T0_dT ; + + T10 = Vgp + 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 ; + T10_dT = Vgp_dT + T2_dT * ( 1.0e0 - T3 ) - T2 * T3_dT ; + Fn_SZ( T10 , T10 , 0.01 , T0 ) ; + T10 += epsm10 ; + T10_dVb *= T0 ; + T10_dVd *= T0 ; + T10_dVg *= T0 ; + T10_dT *= T0 ; + + T1 = Vds / T10 ; + T2 = Fn_Pow( T1 , here->HSMHV_ddlt - 1.0e0 ) ; + T7 = T2 * T1 ; + T0 = here->HSMHV_ddlt * T2 / ( T10 * T10 ) ; + T7_dVb = T0 * ( - Vds * T10_dVb ) ; + T7_dVd = T0 * ( T10 - Vds * T10_dVd ) ; + T7_dVg = T0 * ( - Vds * T10_dVg ) ; + T7_dT = T0 * ( - Vds * T10_dT ) ; + + T3 = 1.0 + T7 ; + T4 = Fn_Pow( T3 , 1.0 / here->HSMHV_ddlt - 1.0 ) ; + T6 = T4 * T3 ; + T0 = T4 / here->HSMHV_ddlt ; + T6_dVb = T0 * T7_dVb ; + T6_dVd = T0 * T7_dVd ; + T6_dVg = T0 * T7_dVg ; + T6_dT = T0 * T7_dT ; + + Vdseff = Vds / T6 ; + T0 = 1.0 / ( T6 * T6 ) ; + Vdseff_dVbs = - Vds * T6_dVb * T0 ; + Vdseff_dVds = ( T6 - Vds * T6_dVd ) * T0 ; + Vdseff_dVgs = - Vds * T6_dVg * T0 ; + Vdseff_dT = - Vds * T6_dT * T0 ; + + Vds = Vdseff ; + /* Vdseff (end) */ + + + exp_bVbsVds = exp( beta * ( Vbscl - Vds ) ) ; + exp_bVbsVds_dT = ( beta_dT * ( Vbscl - Vds ) + beta * (Vbscl_dT - Vdseff_dT) ) * exp_bVbsVds ; + + + /*---------------------------------------------------* + * Skip Psl calculation when Vds is very small. + *-----------------*/ + if ( Vds < 0.0 ) { + Pds = 0.0 ; + Psl = Ps0 ; +// flg_conv = 1 ; + goto start_of_loopl ; + } + + /*-----------------------------------------------------------* + * Initial guess for Pds ( = Psl - Ps0 ). + *-----------------*/ + if ( flg_pprv >= 1 ) { + /*---------------------------------------------------* + * Use previous value. + *-----------------*/ + + T1 = Pds_dVbs * dVbs + Pds_dVds * dVds + Pds_dVgs * dVgs ; + Pds_ini = Pds + T1 ; + + /* self heating */ + T2 = here->HSMHV_pds_dtemp_prv * Temp_dif ; + if ( fabs( T1 + T2 ) < dP_max ) { Pds_ini += T2 ; } + + if ( flg_pprv == 2 ) { + /* TX_dVxs = d^2 Pds / d Vxs^2 here */ + if ( Vbsc_dif2 > epsm10 ) { + TX_dVbs = ( here->HSMHV_pds_dvbs_prv - here->HSMHV_pds_dvbs_prv2 ) + / Vbsc_dif2 ; + } else { + TX_dVbs = 0.0 ; + } + if ( Vdsc_dif2 > epsm10 ) { + TX_dVds = ( here->HSMHV_pds_dvds_prv - here->HSMHV_pds_dvds_prv2 ) + / Vdsc_dif2 ; + } else { + TX_dVds = 0.0 ; + } + if ( Vgsc_dif2 > epsm10 ) { + TX_dVgs = ( here->HSMHV_pds_dvgs_prv - here->HSMHV_pds_dvgs_prv2 ) + / Vgsc_dif2 ; + } else { + TX_dVgs = 0.0 ; + } + T2 = ( dVbs * dVbs ) / 2 * TX_dVbs + + ( dVds * dVds ) / 2 * TX_dVds + + ( dVgs * dVgs ) / 2 * TX_dVgs ; + + if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) { + Pds_ini += T2 ; + } else { + flg_pprv = 1 ; + } + } + + T1 = Pds_ini - Pds ; + if ( T1 < - dP_max || T1 > dP_max ) flg_pprv = 0 ; /* flag changes */ + + } /* end of (flg_pprv>=1) if-block */ + + if ( flg_pprv == 0 ) { + /*---------------------------------------------------* + * Analytical initial guess. + *-----------------*/ + Pds_max = Fn_Max( Psl_lim - Ps0 , 0.0e0 ) ; + + Fn_SU( Pds_ini , Vds, (1.0e0 + c_pslini_1) * Pds_max, c_pslini_2, T1 ) ; + Pds_ini = Fn_Min( Pds_ini , Pds_max ) ; + } + + if ( Pds_ini < 0.0 ) Pds_ini = 0.0 ; + else if ( Pds_ini > Vds ) Pds_ini = Vds ; + + + /*---------------------------------------------------* + * Assign initial guess. + *-----------------*/ + Pds = Pds_ini ; + Psl = Ps0 + Pds ; + /*---------------------------------------------------* + * Calculation of Psl by solving Poisson eqn. + * (beginning of Newton loop) + * - Fsl : Fsl = 0 is the equation to be solved. + * - dPsl : correction value. + *-----------------*/ + flg_conv = 0 ; + + /*---------------------------------------------------* + * start of Psl calculation. (label) + *-----------------*/ +start_of_loopl: + + for ( lp_sl = 1 ; lp_sl <= lp_sl_max + 1 ; lp_sl ++ ) { + + Chi = beta * ( Psl - Vbscl ) ; + + if ( Chi < znbd5 ) { + /*-------------------------------------------* + * zone-D2. (Psl) + * - Qb0 is approximated to 5-degree polynomial. + *-----------------*/ + + fi = Chi * Chi * Chi + * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; + fi_dChi = Chi * Chi + * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; + + cfs1 = cnst1 * exp_bVbsVds ; + + fsl1 = cfs1 * fi * fi ; + fsl1_dPsl = cfs1 * beta * 2 * fi * fi_dChi ; + + fb = Chi * ( cn_nc51 + + Chi * ( cn_nc52 + + Chi * ( cn_nc53 + + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; + fb_dChi = cn_nc51 + + Chi * ( 2 * cn_nc52 + + Chi * ( 3 * cn_nc53 + + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; + + fsl2 = sqrt( fb * fb + fsl1 ) ; + fsl2_dPsl = ( beta * fb_dChi * 2 * fb + fsl1_dPsl ) / ( fsl2 + fsl2 ) ; + + } else { + /*-------------------------------------------* + * zone-D3. (Psl) + *-----------------*/ + Rho = beta * ( Psl - Vds ) ; + exp_Rho = exp( Rho ) ; + + fsl1 = cnst1 * ( exp_Rho - exp_bVbsVds ) ; + fsl1_dPsl = cnst1 * beta * ( exp_Rho ) ; + Xil = Chi - 1.0e0 ; + fsl2 = sqrt( Xil + fsl1 ) ; + fsl2_dPsl = ( beta + fsl1_dPsl ) / ( fsl2 + fsl2 ) ; + } + + Fsl = Vgp - Psl - fac1 * fsl2 ; + Fsl_dPsl = - 1.0e0 - fac1 * fsl2_dPsl ; + + if ( flg_conv == 1 ) break ; + + dPsl = - Fsl / Fsl_dPsl ; + + /*-------------------------------------------* + * Update Psl . + * - clamped to Vbscl if Psl < Vbscl . + *-----------------*/ + dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Psl))) ; + if ( fabs( dPsl ) > dPlim ) dPsl = dPlim * Fn_Sgn( dPsl ) ; + Psl = Psl + dPsl ; + + + /*-------------------------------------------* + * Check convergence. + * NOTE: This condition may be too rigid. + *-----------------*/ + if ( fabs( dPsl ) <= ps_conv && fabs( Fsl ) <= gs_conv ) { + flg_conv = 1 ; + } + } /* end of Psl Newton loop */ + + /* Reduce loop count to exclude derivative calculation sweep */ + lp_sl -- ; + + /*-------------------------------------------* + * Procedure for diverged case. + *-----------------*/ + if ( flg_conv == 0 ) { + fprintf( stderr , + "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Psl)\n", model->HSMHVmodName ) ; + fprintf( stderr , + " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" , + Vbse , Vdse , Vgse ) ; + if ( flg_info >= 2 ) { + printf("*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Psl)\n", model->HSMHVmodName ) ; + } + } + + + /*---------------------------------------------------* + * Evaluate derivatives of Psl. + * - note: Here, fsl1_dVbs and fsl2_dVbs are derivatives + * w.r.t. explicit Vbscl. So, Psl in the fsl1 and fsl2 + * expressions is regarded as a constant. + *-----------------*/ + Chi_dT = ( Psl - Vbscl ) * beta_dT - Vbscl_dT * beta ; + + if ( Chi < znbd5 ) { + T1 = cfs1 * beta * fi ; + fsl1_dVbs = T1 * ( ( Vbscl_dVbs - Vdseff_dVbs ) * fi - 2.0 * fi_dChi * Vbscl_dVbs ) ; + fsl1_dVds = - T1 * fi * Vdseff_dVds ; + fsl1_dVgs = - T1 * fi * Vdseff_dVgs ; + cfs1_dT = exp_bVbsVds * cnst1_dT + cnst1 * exp_bVbsVds_dT ; + fsl1_dT = fi * fi * cfs1_dT + 2 * cfs1 * fi * fi_dChi * Chi_dT ; + T2 = 0.5 / fsl2 ; + fsl2_dVbs = ( - beta * fb_dChi * 2 * fb * Vbscl_dVbs + fsl1_dVbs ) * T2 ; + fsl2_dVds = fsl1_dVds * T2 ; + fsl2_dVgs = fsl1_dVgs * T2 ; + fsl2_dT = ( 2 * fb * fb_dChi * Chi_dT + fsl1_dT ) * T2 ; + } else { + Rho_dT = beta_dT * ( Psl - Vds ) - beta * Vdseff_dT ; + exp_Rho_dT = Rho_dT * exp_Rho ; + + T1 = cnst1 * beta ; + fsl1_dVbs = - T1 * ( exp_Rho * Vdseff_dVbs + + ( Vbscl_dVbs - Vdseff_dVbs ) * exp_bVbsVds ); + fsl1_dVds = - T1 * Vdseff_dVds * ( exp_Rho - exp_bVbsVds ); + fsl1_dVgs = T1 * Vdseff_dVgs * ( - exp_Rho + exp_bVbsVds ); + fsl1_dT = cnst1 * ( exp_Rho_dT - exp_bVbsVds_dT ) + cnst1_dT * ( exp_Rho - exp_bVbsVds ) ; + T2 = 0.5e0 / fsl2 ; + fsl2_dVbs = ( - beta * Vbscl_dVbs + fsl1_dVbs ) * T2 ; + fsl2_dVds = ( fsl1_dVds ) * T2 ; + fsl2_dVgs = ( fsl1_dVgs ) * T2 ; + fsl2_dT = ( Chi_dT + fsl1_dT ) * T2 ; + } + + T1 = 1.0 / Fsl_dPsl ; + Psl_dVbs = - ( Vgp_dVbs - ( fac1 * fsl2_dVbs + fac1_dVbs * fsl2 ) ) * T1 ; + Psl_dVds = - ( Vgp_dVds - ( fac1 * fsl2_dVds + fac1_dVds * fsl2 ) ) * T1 ; + Psl_dVgs = - ( Vgp_dVgs - ( fac1 * fsl2_dVgs + fac1_dVgs * fsl2 ) ) * T1 ; + Psl_dT = - ( Vgp_dT - ( fac1 * fsl2_dT + fac1_dT * fsl2 ) ) * T1 ; + + Chi_dT = ( Psl - Vbscl ) * beta_dT + beta * ( Psl_dT - Vbscl_dT ); + exp_Chi_dT = exp_Chi * Chi_dT ; + + + if ( Chi < znbd5 ) { + /*-------------------------------------------* + * zone-D1/D2. (Psl) + *-----------------*/ + Xil = fb * fb + epsm10 ; + T1 = 2 * fb * fb_dChi * beta ; + Xil_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ; + Xil_dVds = T1 * Psl_dVds ; + Xil_dVgs = T1 * Psl_dVgs ; + Xil_dT = 2 * fb * fb_dChi * Chi_dT ; + + Xilp12 = fb + epsm10 ; + T1 = fb_dChi * beta ; + Xilp12_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ; + Xilp12_dVds = T1 * Psl_dVds ; + Xilp12_dVgs = T1 * Psl_dVgs ; + Xilp12_dT = fb_dChi * Chi_dT ; + + Xilp32 = fb * fb * fb + epsm10 ; + T1 = 3 * fb * fb * fb_dChi * beta ; + Xilp32_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ; + Xilp32_dVds = T1 * Psl_dVds ; + Xilp32_dVgs = T1 * Psl_dVgs ; + Xilp32_dT = 3 * fb * fb * fb_dChi * Chi_dT ; + + } else { + /*-------------------------------------------* + * zone-D3. (Psl) + *-----------------*/ + + Xil = Chi - 1.0e0 ; + Xil_dVbs = beta * ( Psl_dVbs - Vbscl_dVbs ) ; + Xil_dVds = beta * Psl_dVds ; + Xil_dVgs = beta * Psl_dVgs ; + Xil_dT = Chi_dT ; + + Xilp12 = sqrt( Xil ) ; + T1 = 0.5e0 / Xilp12 ; + Xilp12_dVbs = T1 * Xil_dVbs ; + Xilp12_dVds = T1 * Xil_dVds ; + Xilp12_dVgs = T1 * Xil_dVgs ; + Xilp12_dT = T1 * Xil_dT ; + + Xilp32 = Xil * Xilp12 ; + T1 = 1.5e0 * Xilp12 ; + Xilp32_dVbs = T1 * Xil_dVbs ; + Xilp32_dVds = T1 * Xil_dVds ; + Xilp32_dVgs = T1 * Xil_dVgs ; + Xilp32_dT = T1 * Xil_dT ; + + } + + + /*---------------------------------------------------* + * Assign Pds. + *-----------------*/ + Pds = Psl - Ps0 ; + + /* if ( Pds < ps_conv ) { */ + if ( Pds < 0.0 ) { /* take care of numerical noise */ + Pds = 0.0 ; + Psl = Ps0 ; + } + + Pds_dVbs = Psl_dVbs - Ps0_dVbs ; + Pds_dVds = Psl_dVds - Ps0_dVds ; + Pds_dVgs = Psl_dVgs - Ps0_dVgs ; + Pds_dT = Psl_dT - Ps0_dT ; + + /* if ( Pds < ps_conv ) { */ + if ( Pds < 0.0 ) { + Pds_dVbs = 0.0 ; + Pds_dVgs = 0.0 ; + Psl_dVbs = Ps0_dVbs ; + Psl_dVgs = Ps0_dVgs ; + Pds_dT = 0.0 ; + Psl_dT = Ps0_dT ; + } + + /* Vdseff */ + Vds = Vdsorg; + + /*-----------------------------------------------------------* + * Evaluate Idd. + * - Eta : substantial variable of QB'/Pds and Idd/Pds. + * - note: Eta = 4 * GAMMA_{hisim_0} + *-----------------*/ + T1 = beta / Xi0 ; + Eta = T1 * Pds ; + T2 = Eta * beta_inv ; + Eta_dVbs = T1 * ( Pds_dVbs - Xi0_dVbs * T2 ) ; + Eta_dVds = T1 * ( Pds_dVds - Xi0_dVds * T2 ) ; + Eta_dVgs = T1 * ( Pds_dVgs - Xi0_dVgs * T2 ) ; + T1_dT = ( beta_dT * Xi0 - beta * Xi0_dT ) / Xi0 / Xi0 ; + Eta_dT = T1_dT * Pds + T1 * Pds_dT ; + + /* ( Eta + 1 )^n */ + Eta1 = Eta + 1.0e0 ; + Eta1p12 = sqrt( Eta1 ) ; + Eta1p32 = Eta1p12 * Eta1 ; + Eta1p52 = Eta1p32 * Eta1 ; + Eta1_dT = Eta_dT ; + Eta1p12_dT = 0.5e0 / Eta1p12 * Eta1_dT ; + Eta1p32_dT = Eta1p12_dT * Eta1 + Eta1p12 * Eta1_dT ; + Eta1p52_dT = Eta1p32_dT * Eta1 + Eta1p32 * Eta1_dT ; + + /* 1 / ( ( Eta + 1 )^n + 1 ) */ + Zeta12 = 1.0e0 / ( Eta1p12 + 1.0e0 ) ; + Zeta32 = 1.0e0 / ( Eta1p32 + 1.0e0 ) ; + Zeta52 = 1.0e0 / ( Eta1p52 + 1.0e0 ) ; + Zeta12_dT = - 1.0e0 / ( Eta1p12 + 1.0e0 ) / ( Eta1p12 + 1.0e0 ) * Eta1p12_dT ; + Zeta32_dT = - 1.0e0 / ( Eta1p32 + 1.0e0 ) / ( Eta1p32 + 1.0e0 ) * Eta1p32_dT ; + Zeta52_dT = - 1.0e0 / ( Eta1p52 + 1.0e0 ) / ( Eta1p52 + 1.0e0 ) * Eta1p52_dT ; + + /*---------------------------------------------------* + * F00 := PS00/Pds (n=1/2) + *-----------------*/ + F00 = Zeta12 / Xi0p12 ; + T3 = - 1 / Xi0 ; + T4 = - 0.5e0 / Eta1p12 * F00 ; + T5 = Zeta12 * T3 ; + T6 = Zeta12 * T4 ; + F00_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ; + F00_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ; + F00_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ; + F00_dT = ( Zeta12_dT * Xi0p12 - Zeta12 * Xi0p12_dT ) / Xi0p12 / Xi0p12 ; + + /*---------------------------------------------------* + * F10 := PS10/Pds (n=3/2) + *-----------------*/ + T1 = 3.0e0 + Eta * ( 3.0e0 + Eta ) ; + F10 = C_2o3 * Xi0p12 * Zeta32 * T1 ; + T2 = 3.0e0 + Eta * 2.0e0 ; + T3 = C_2o3 * T1 ; + T4 = - 1.5e0 * Eta1p12 * F10 + C_2o3 * Xi0p12 * T2 ; + T5 = Zeta32 * T3 ; + T6 = Zeta32 * T4 ; + F10_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ; + F10_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ; + F10_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ; + T1_dT = Eta_dT * ( 3.0e0 + Eta ) + Eta * Eta_dT ; + F10_dT = C_2o3 * Xi0p12 * Zeta32 * T1_dT + + C_2o3 * T1 * ( Xi0p12 * Zeta32_dT + Zeta32 * Xi0p12_dT ) ; + + /*---------------------------------------------------* + * F30 := PS30/Pds (n=5/2) + *-----------------*/ + T1 = 5e0 + Eta * ( 10e0 + Eta * ( 10e0 + Eta * ( 5e0 + Eta ) ) ) ; + F30 = 4e0 / ( 15e0 * beta ) * Xi0p32 * Zeta52 * T1 ; + T2 = 10e0 + Eta * ( 20e0 + Eta * ( 15e0 + Eta * 4e0 ) ) ; + T3 = 4e0 / ( 15e0 * beta ) * T1 ; + T4 = - ( 5e0 / 2e0 ) * Eta1p32 * F30 + 4e0 / ( 15e0 * beta ) * Xi0p32 * T2 ; + T5 = Zeta52 * T3 ; + T6 = Zeta52 * T4 ; + F30_dVbs = ( Xi0p32_dVbs * T5 + Eta_dVbs * T6 ) ; + F30_dVds = ( Xi0p32_dVds * T5 + Eta_dVds * T6 ) ; + F30_dVgs = ( Xi0p32_dVgs * T5 + Eta_dVgs * T6 ) ; + T1_dT = ( 10e0 + 20e0 * Eta + 15e0 * Eta * Eta + 4e0 * Eta * Eta * Eta ) * Eta_dT ; + F30_dT = 4e0 / 15e0 * beta_inv_dT * ( Xi0p32 * Zeta52 * T1 ) + + 4e0 / 15e0 * beta_inv * ( Xi0p32_dT * Zeta52 * T1 + Xi0p32 * Zeta52_dT * T1 + Xi0p32 * Zeta52 * T1_dT ) ; + + /*---------------------------------------------------* + * F11 := PS11/Pds. + *-----------------*/ + F11 = Ps0 * F10 + C_2o3 * beta_inv * Xilp32 - F30 ; + T1 = C_2o3 * beta_inv ; + F11_dVbs = Ps0_dVbs * F10 + Ps0 * F10_dVbs + + T1 * Xilp32_dVbs - F30_dVbs ; + F11_dVds = Ps0_dVds * F10 + Ps0 * F10_dVds + + T1 * Xilp32_dVds - F30_dVds ; + F11_dVgs = Ps0_dVgs * F10 + Ps0 * F10_dVgs + + T1 * Xilp32_dVgs - F30_dVgs ; + F11_dT = Ps0_dT * F10 + Ps0 * F10_dT + + C_2o3 *( beta_inv_dT * Xilp32 + beta_inv * Xilp32_dT ) - F30_dT ; + + /*---------------------------------------------------* + * Fdd := Idd/Pds. + *-----------------*/ + T1 = Vgp + beta_inv - 0.5e0 * ( 2.0e0 * Ps0 + Pds ) ; + T2 = - F10 + F00 ; + T3 = beta * Cox ; + T4 = beta * cnst0 ; + Fdd = T3 * T1 + T4 * T2 ; + Fdd_dVbs = T3 * ( Vgp_dVbs - Ps0_dVbs - 0.5e0 * Pds_dVbs ) + + beta * Cox_dVb * T1 + T4 * ( - F10_dVbs + F00_dVbs ) ; + Fdd_dVds = T3 * ( Vgp_dVds - Ps0_dVds - 0.5e0 * Pds_dVds ) + + beta * Cox_dVd * T1 + T4 * ( - F10_dVds + F00_dVds ) ; + Fdd_dVgs = T3 * ( Vgp_dVgs - Ps0_dVgs - 0.5e0 * Pds_dVgs ) + + beta * Cox_dVg * T1 + T4 * ( - F10_dVgs + F00_dVgs ) ; + T1_dT = Vgp_dT + beta_inv_dT - 0.5e0 * ( 2.0e0 * Ps0_dT + Pds_dT ) ; + T2_dT = -F10_dT + F00_dT ; + T3_dT = Cox * beta_dT ; + T4_dT = beta * cnst0_dT + cnst0 * beta_dT ; + Fdd_dT = T1 * T3_dT + T3 * T1_dT + T2 * T4_dT + T4 * T2_dT ; + + + /*---------------------------------------------------* + * Idd: + *-----------------*/ + Idd = Pds * Fdd ; + Idd_dVbs = Pds_dVbs * Fdd + Pds * Fdd_dVbs ; + Idd_dVds = Pds_dVds * Fdd + Pds * Fdd_dVds ; + Idd_dVgs = Pds_dVgs * Fdd + Pds * Fdd_dVgs ; + Idd_dT = Fdd * Pds_dT + Pds * Fdd_dT ; + + /*-----------------------------------------------------------* + * Skip CLM and integrated charges if zone==D1 + *-----------------*/ + if( flg_zone == 1 ) { + goto start_of_mobility ; + } + + /*-----------------------------------------------------------* + * Channel Length Modulation. Lred: \Delta L + *-----------------*/ + if( pParam->HSMHV_clm2 < epsm10 && pParam->HSMHV_clm3 < epsm10 ) { Lred = 0.0e0 ; Lred_dVbs = 0.0e0 ; Lred_dVds = 0.0e0 ; Lred_dVgs = 0.0e0 ; Lred_dT = 0.0e0 ; - /** (reminder) - *Psdl = Psl ; - *Psdl_dVbs = Psl_dVbs ; - *Psdl_dVds = Psl_dVds ; - *Psdl_dVgs = Psl_dVgs ; - **/ - + Psdl = Psl ; + Psdl_dVbs = Psl_dVbs ; + Psdl_dVds = Psl_dVds ; + Psdl_dVgs = Psl_dVgs ; + Psdl_dT = Psl_dT ; + + if ( Psdl > Ps0 + Vds - epsm10 ) { + Psdl = Ps0 + Vds - epsm10 ; + Psdl_dVbs = Ps0_dVbs ; + Psdl_dVds = Ps0_dVds + 1.0 ; + Psdl_dVgs = Ps0_dVgs ; + Psdl_dT = Ps0_dT ; + } + } else { - /*-------------------------------------------* - * zone-D2 (Ps0) - *-----------------*/ - flg_zone = 2 ; - flg_noqi = 0 ; - /*-----------------------------------------------------------* - * FD2 : connecting function for zone-D2. - * - Qiu, Qbu, Qdrat and Lred should be interpolated later. - *-----------------*/ - T1 = 1.0 / ( znbd5 - znbd3 ) ; - TX = T1 * ( Chi - znbd3 ) ; - TX_dVbs = beta * T1 * ( Ps0_dVbs - Vbscl_dVbs ) ; - TX_dVds = beta * T1 * Ps0_dVds ; - TX_dVgs = beta * T1 * Ps0_dVgs ; - TX_dT = T1 * Chi_dT ; + T1 = here->HSMHV_wdpl ; + T8 = sqrt (Psl - Vbscl) ; + Wd = T1 * T8 ; + T9 = 0.5 * T1 / T8 ; + Wd_dVbs = T9 * (Psl_dVbs - Vbscl_dVbs) ; + Wd_dVds = T9 * Psl_dVds ; + Wd_dVgs = T9 * Psl_dVgs ; + Wd_dT = T9 * (Psl_dT - Vbscl_dT) ; - FD2 = TX * TX * TX * ( 10.0 + TX * ( -15.0 + TX * 6.0 ) ) ; - T4 = TX * TX * ( 30.0 + TX * ( -60.0 + TX * 30.0 ) ) ; + T0 = 1.0 / Wd ; + T1 = Qn0 * T0 ; + T2 = pParam->HSMHV_clm3 * T1 ; + T3 = pParam->HSMHV_clm3 * T0 ; + T2_dVb = T3 * (Qn0_dVbs - T1 * Wd_dVbs) ; + T2_dVd = T3 * (Qn0_dVds - T1 * Wd_dVds) ; + T2_dVg = T3 * (Qn0_dVgs - T1 * Wd_dVgs) ; + T2_dT = T3 * (Qn0_dT - T1 * Wd_dT) ; - FD2_dVbs = T4 * TX_dVbs ; - FD2_dVds = T4 * TX_dVds ; - FD2_dVgs = T4 * TX_dVgs ; - FD2_dT = T4 * TX_dT ; + T5 = pParam->HSMHV_clm2 * q_Nsub + T2 ; + T1 = 1.0 / T5 ; + T4 = C_ESI * T1 ; + T4_dVb = - T4 * T2_dVb * T1 ; + T4_dVd = - T4 * T2_dVd * T1 ; + T4_dVg = - T4 * T2_dVg * T1 ; + T4_dT = -T4 * T2_dT * T1 ; - } /* end of zone-D2 */ - } + T1 = (1.0e0 - pParam->HSMHV_clm1) ; + Psdl = pParam->HSMHV_clm1 * (Vds + Ps0) + T1 * Psl ; + Psdl_dVbs = pParam->HSMHV_clm1 * Ps0_dVbs + T1 * Psl_dVbs ; + Psdl_dVds = pParam->HSMHV_clm1 * (1.0 + Ps0_dVds) + T1 * Psl_dVds ; + Psdl_dVgs = pParam->HSMHV_clm1 * Ps0_dVgs + T1 * Psl_dVgs ; + Psdl_dT = pParam->HSMHV_clm1 * Ps0_dT + T1 * Psl_dT ; - - /*---------------------------------------------------* - * VgVt : Vgp - Vth_qi. ( Vth_qi is Vth for Qi evaluation. ) - *-----------------*/ - VgVt = Qn0 * Cox_inv ; - VgVt_dVbs = Qn0_dVbs * Cox_inv + Qn0 * Cox_inv_dVb ; - VgVt_dVds = Qn0_dVds * Cox_inv + Qn0 * Cox_inv_dVd ; - VgVt_dVgs = Qn0_dVgs * Cox_inv + Qn0 * Cox_inv_dVg ; - VgVt_dT = Qn0_dT * Cox_inv ; - - /*-----------------------------------------------------------* - * make Qi=Qd=Ids=0 if VgVt <= VgVt_small - *-----------------*/ - if ( VgVt <= VgVt_small ) { - flg_zone = 4 ; - flg_noqi = 1 ; - - Psl = Ps0 ; - Psl_dVbs = Ps0_dVbs ; - Psl_dVds = Ps0_dVds ; - Psl_dVgs = Ps0_dVgs ; - Psl_dT = Ps0_dT ; - - /** (reminder) - *Psdl = Psl ; - *Psdl_dVbs = Psl_dVbs ; - *Psdl_dVds = Psl_dVds ; - *Psdl_dVgs = Psl_dVgs ; - **/ - - Pds = 0.0 ; - Pds_dVbs = 0.0 ; - Pds_dVds = 0.0 ; - Pds_dVgs = 0.0 ; - Pds_dT = 0.0 ; - - Qbu = Qb0 ; - Qbu_dVbs = Qb0_dVb ; - Qbu_dVds = Qb0_dVd ; - Qbu_dVgs = Qb0_dVg ; - Qbu_dT = Qb0_dT ; - - Qiu = 0.0 ; - Qiu_dVbs = 0.0 ; - Qiu_dVds = 0.0 ; - Qiu_dVgs = 0.0 ; - Qiu_dT = 0.0 ; - - Qdrat = 0.5 ; - Qdrat_dVbs = 0.0 ; - Qdrat_dVds = 0.0 ; - Qdrat_dVgs = 0.0 ; - Qdrat_dT = 0.0 ; - - Lred = 0.0 ; - Lred_dVbs = 0.0 ; - Lred_dVds = 0.0 ; - Lred_dVgs = 0.0 ; - Lred_dT = 0.0 ; - - Ids = 0.0e0 ; - Ids_dVbs = 0.0e0 ; - Ids_dVds = 0.0e0 ; - Ids_dVgs = 0.0e0 ; - Ids_dT = 0.0e0 ; - - goto end_of_part_1 ; - } - - - /*-----------------------------------------------------------* - * Start point of Psl (= Ps0 + Pds) calculation. (label) - *-----------------*/ -/* start_of_Psl: */ - - - /* Vdseff (begin) */ - Vdsorg = Vds ; - - T2 = here->HSMHV_qnsub_esi / ( Cox * Cox ) ; - T4 = - 2.0e0 * T2 / Cox ; - T2_dVb = T4 * Cox_dVb ; - T2_dVd = T4 * Cox_dVd ; - T2_dVg = T4 * Cox_dVg ; - T2_dT = T4 * Cox_dT ; - - T0 = Vgp - beta_inv - Vbsz ; - T0_dT = Vgp_dT - beta_inv_dT - Vbsz_dT ; - Fn_SZ( T9, 1.0e0 + 2.0e0 / T2 * T0, 1e-3, TX ) ; - T3 = sqrt( T9 ) ; - T4 = 0.5e0 / T3 ; - T5 = 1.0e0 / ( T2 * T2 ) ; - T6 = T4 * 2.0e0 * T5 * TX ; - T7 = T6 * T0 ; - T8 = T6 * T2 ; - T3_dVb = - T2_dVb * T7 + T8 * ( Vgp_dVbs - Vbsz_dVbs ) ; - T3_dVd = - T2_dVd * T7 + T8 * ( Vgp_dVds - Vbsz_dVds ) ; - T3_dVg = - T2_dVg * T7 + T8 * Vgp_dVgs ; - T3_dT = - T2_dT * T7 + T8 * T0_dT ; - - T10 = Vgp + 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 ; - T10_dT = Vgp_dT + T2_dT * ( 1.0e0 - T3 ) - T2 * T3_dT ; - Fn_SZ( T10 , T10 , 0.01 , T0 ) ; - T10 += epsm10 ; - T10_dVb *= T0 ; - T10_dVd *= T0 ; - T10_dVg *= T0 ; - T10_dT *= T0 ; - - T1 = Vds / T10 ; - T2 = Fn_Pow( T1 , here->HSMHV_ddlt - 1.0e0 ) ; - T7 = T2 * T1 ; - T0 = here->HSMHV_ddlt * T2 / ( T10 * T10 ) ; - T7_dVb = T0 * ( - Vds * T10_dVb ) ; - T7_dVd = T0 * ( T10 - Vds * T10_dVd ) ; - T7_dVg = T0 * ( - Vds * T10_dVg ) ; - T7_dT = T0 * ( - Vds * T10_dT ) ; - - T3 = 1.0 + T7 ; - T4 = Fn_Pow( T3 , 1.0 / here->HSMHV_ddlt - 1.0 ) ; - T6 = T4 * T3 ; - T0 = T4 / here->HSMHV_ddlt ; - T6_dVb = T0 * T7_dVb ; - T6_dVd = T0 * T7_dVd ; - T6_dVg = T0 * T7_dVg ; - T6_dT = T0 * T7_dT ; - - Vdseff = Vds / T6 ; - T0 = 1.0 / ( T6 * T6 ) ; - Vdseff_dVbs = - Vds * T6_dVb * T0 ; - Vdseff_dVds = ( T6 - Vds * T6_dVd ) * T0 ; - Vdseff_dVgs = - Vds * T6_dVg * T0 ; - Vdseff_dT = - Vds * T6_dT * T0 ; - - Vds = Vdseff ; - /* Vdseff (end) */ - - - exp_bVbsVds = exp( beta * ( Vbscl - Vds ) ) ; - exp_bVbsVds_dT = ( beta_dT * ( Vbscl - Vds ) + beta * (Vbscl_dT - Vdseff_dT) ) * exp_bVbsVds ; - - - /*---------------------------------------------------* - * Skip Psl calculation when Vds is very small. - *-----------------*/ - if ( Vds <= 0.0 ) { - Pds = 0.0 ; - Psl = Ps0 ; -// flg_conv = 1 ; - goto start_of_loopl ; - } - - /*-----------------------------------------------------------* - * Initial guess for Pds ( = Psl - Ps0 ). - *-----------------*/ - if ( flg_pprv >= 1 ) { - /*---------------------------------------------------* - * Use previous value. - *-----------------*/ - - T1 = Pds_dVbs * dVbs + Pds_dVds * dVds + Pds_dVgs * dVgs ; - Pds_ini = Pds + T1 ; - - /* self heating */ - T2 = here->HSMHV_pds_dtemp_prv * Temp_dif ; - if ( fabs( T1 + T2 ) < dP_max ) { Pds_ini += T2 ; } - - if ( flg_pprv == 2 ) { - /* TX_dVxs = d^2 Pds / d Vxs^2 here */ - if ( Vbsc_dif2 > epsm10 ) { - TX_dVbs = ( here->HSMHV_pds_dvbs_prv - here->HSMHV_pds_dvbs_prv2 ) - / Vbsc_dif2 ; - } else { - TX_dVbs = 0.0 ; + if ( Psdl > Ps0 + Vds - epsm10 ) { + Psdl = Ps0 + Vds - epsm10 ; + Psdl_dVbs = Ps0_dVbs ; + Psdl_dVds = Ps0_dVds + 1.0 ; + Psdl_dVgs = Ps0_dVgs ; + Psdl_dT = Ps0_dT ; } - if ( Vdsc_dif2 > epsm10 ) { - TX_dVds = ( here->HSMHV_pds_dvds_prv - here->HSMHV_pds_dvds_prv2 ) - / Vdsc_dif2 ; - } else { - TX_dVds = 0.0 ; - } - if ( Vgsc_dif2 > epsm10 ) { - TX_dVgs = ( here->HSMHV_pds_dvgs_prv - here->HSMHV_pds_dvgs_prv2 ) - / Vgsc_dif2 ; - } else { - TX_dVgs = 0.0 ; - } - T2 = ( dVbs * dVbs ) / 2 * TX_dVbs - + ( dVds * dVds ) / 2 * TX_dVds - + ( dVgs * dVgs ) / 2 * TX_dVgs ; + T6 = Psdl - Psl ; + T6_dVb = Psdl_dVbs - Psl_dVbs ; + T6_dVd = Psdl_dVds - Psl_dVds ; + T6_dVg = Psdl_dVgs - Psl_dVgs ; + T6_dT = Psdl_dT - Psl_dT ; - if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) { - Pds_ini += T2 ; - } else { - flg_pprv = 1 ; - } - } + T3 = beta * Qn0 ; + T1 = 1.0 / T3 ; + T5 = Idd * T1 ; + T3_dT = beta * Qn0_dT + beta_dT * Qn0 ; + T1_dT = - T1 * T1 * T3_dT ; + T5_dT = Idd_dT * T1 + Idd * T1_dT ; + T2 = T5 * beta ; + T5_dVb = (Idd_dVbs - T2 * Qn0_dVbs) * T1 ; + T5_dVd = (Idd_dVds - T2 * Qn0_dVds) * T1 ; + T5_dVg = (Idd_dVgs - T2 * Qn0_dVgs) * T1 ; - T1 = Pds_ini - Pds ; - if ( T1 < - dP_max || T1 > dP_max ) flg_pprv = 0 ; /* flag changes */ + T10 = q_Nsub / C_ESI ; + T1 = 1.0e5 ; + T2 = 1.0 / Leff ; + T11 = (2.0 * T5 + 2.0 * T10 * T6 * T4 + T1 * T4) * T2 ; + T3 = T2 * T4 ; + T7 = T11 * T4 ; + T7_dVb = (2.0 * T5_dVb + 2.0 * T10 * (T6_dVb * T4 + T6 * T4_dVb) + T1 * T4_dVb) * T3 + T11 * T4_dVb ; + T7_dVd = (2.0 * T5_dVd + 2.0 * T10 * (T6_dVd * T4 + T6 * T4_dVd) + T1 * T4_dVd) * T3 + T11 * T4_dVd ; + T7_dVg = (2.0 * T5_dVg + 2.0 * T10 * (T6_dVg * T4 + T6 * T4_dVg) + T1 * T4_dVg) * T3 + T11 * T4_dVg ; + T7_dT = (2.0 * T5_dT + 2.0 * T10 * ( T6_dT * T4 + T6 * T4_dT ) + T1 * T4_dT ) * T3 + T11 * T4_dT ; - } /* end of (flg_pprv>=1) if-block */ - - if ( flg_pprv == 0 ) { - /*---------------------------------------------------* - * Analytical initial guess. - *-----------------*/ - Pds_max = Fn_Max( Psl_lim - Ps0 , 0.0e0 ) ; - - Fn_SU( Pds_ini , Vds, (1.0e0 + c_pslini_1) * Pds_max, c_pslini_2, T1 ) ; - Pds_ini = Fn_Min( Pds_ini , Pds_max ) ; - } + T11 = 4.0 * (2.0 * T10 * T6 + T1) ; + T1 = 8.0 * T10 * T4 * T4 ; + T2 = 2.0 * T11 * T4 ; + T8 = T11 * T4 * T4 ; + T8_dVb = ( T1 * T6_dVb + T2 * T4_dVb) ; + T8_dVd = ( T1 * T6_dVd + T2 * T4_dVd) ; + T8_dVg = ( T1 * T6_dVg + T2 * T4_dVg) ; + T8_dT = ( T1 * T6_dT + T2 * T4_dT) ; - if ( Pds_ini < 0.0 ) Pds_ini = 0.0 ; - else if ( Pds_ini > Vds ) Pds_ini = Vds ; + T9 = sqrt (T7 * T7 + T8); + T1 = 1.0 / T9 ; + T2 = T7 * T1 ; + T3 = 0.5 * T1 ; + T9_dVb = (T2 * T7_dVb + T3 * T8_dVb) ; + T9_dVd = (T2 * T7_dVd + T3 * T8_dVd) ; + T9_dVg = (T2 * T7_dVg + T3 * T8_dVg) ; + T9_dT = (T2 * T7_dT + T3 * T8_dT) ; - - /*---------------------------------------------------* - * Assign initial guess. - *-----------------*/ - Pds = Pds_ini ; - Psl = Ps0 + Pds ; - TX = Vbscl + ps_conv / 2 ; - if ( Psl < TX ) Psl = TX ; - - /*---------------------------------------------------* - * Calculation of Psl by solving Poisson eqn. - * (beginning of Newton loop) - * - Fsl : Fsl = 0 is the equation to be solved. - * - dPsl : correction value. - *-----------------*/ - flg_conv = 0 ; - - /*---------------------------------------------------* - * start of Psl calculation. (label) - *-----------------*/ -start_of_loopl: - - for ( lp_sl = 1 ; lp_sl <= lp_sl_max + 1 ; lp_sl ++ ) { - - Chi = beta * ( Psl - Vbscl ) ; - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D2. (Psl) - * - Qb0 is approximated to 5-degree polynomial. - *-----------------*/ - - fi = Chi * Chi * Chi - * ( cn_im53 + Chi * ( cn_im54 + Chi * cn_im55 ) ) ; - fi_dChi = Chi * Chi - * ( 3 * cn_im53 + Chi * ( 4 * cn_im54 + Chi * 5 * cn_im55 ) ) ; - - cfs1 = cnst1 * exp_bVbsVds ; - - fsl1 = cfs1 * fi * fi ; - fsl1_dPsl = cfs1 * beta * 2 * fi * fi_dChi ; - - fb = Chi * ( cn_nc51 - + Chi * ( cn_nc52 - + Chi * ( cn_nc53 - + Chi * ( cn_nc54 + Chi * cn_nc55 ) ) ) ) ; - fb_dChi = cn_nc51 - + Chi * ( 2 * cn_nc52 - + Chi * ( 3 * cn_nc53 - + Chi * ( 4 * cn_nc54 + Chi * 5 * cn_nc55 ) ) ) ; - - fsl2 = sqrt( fb * fb + fsl1 ) ; - fsl2_dPsl = ( beta * fb_dChi * 2 * fb + fsl1_dPsl ) / ( fsl2 + fsl2 ) ; - - } else { - /*-------------------------------------------* - * zone-D3. (Psl) - *-----------------*/ - Rho = beta * ( Psl - Vds ) ; - exp_Rho = exp( Rho ) ; - - fsl1 = cnst1 * ( exp_Rho - exp_bVbsVds ) ; - fsl1_dPsl = cnst1 * beta * ( exp_Rho ) ; - Xil = Chi - 1.0e0 ; - fsl2 = sqrt( Xil + fsl1 ) ; - fsl2_dPsl = ( beta + fsl1_dPsl ) / ( fsl2 + fsl2 ) ; - } - - Fsl = Vgp - Psl - fac1 * fsl2 ; - Fsl_dPsl = - 1.0e0 - fac1 * fsl2_dPsl ; - - if ( flg_conv == 1 ) break ; - - dPsl = - Fsl / Fsl_dPsl ; - - /*-------------------------------------------* - * Update Psl . - * - clamped to Vbscl if Psl < Vbscl . - *-----------------*/ - dPlim = 0.5*dP_max*(1.0 + Fn_Max(1.e0,fabs(Psl))) ; - if ( fabs( dPsl ) > dPlim ) dPsl = dPlim * Fn_Sgn( dPsl ) ; - if (Psl + dPsl < Ps0 ) { - dPsl = Ps0 - Psl; - Psl = Ps0 ; - } else { - Psl = Psl + dPsl ; + Lred = 0.5 * (- T7 + T9) ; + Lred_dVbs = 0.5 * (- T7_dVb + T9_dVb) ; + Lred_dVds = 0.5 * (- T7_dVd + T9_dVd) ; + Lred_dVgs = 0.5 * (- T7_dVg + T9_dVg) ; + Lred_dT = 0.5 * (- T7_dT + T9_dT ) ; + /*---------------------------------------------------* + * Modify Lred for symmetry. + *-----------------*/ + T1 = Lred ; + Lred = FMDVDS * T1 ; + Lred_dVbs = FMDVDS_dVbs * T1 + FMDVDS * Lred_dVbs ; + Lred_dVds = FMDVDS_dVds * T1 + FMDVDS * Lred_dVds ; + Lred_dVgs = FMDVDS_dVgs * T1 + FMDVDS * Lred_dVgs ; + Lred_dT = FMDVDS_dT * T1 + FMDVDS * Lred_dT ; } - TX = Vbscl + ps_conv / 2 ; - if ( Psl < TX ) Psl = TX ; + /* CLM5 & CLM6 */ + Lred *= here->HSMHV_clmmod ; + Lred_dVbs *= here->HSMHV_clmmod ; + Lred_dVds *= here->HSMHV_clmmod ; + Lred_dVgs *= here->HSMHV_clmmod ; + Lred_dT *= here->HSMHV_clmmod ; - /*-------------------------------------------* - * Check convergence. - * NOTE: This condition may be too rigid. - *-----------------*/ - if ( fabs( dPsl ) <= ps_conv && fabs( Fsl ) <= gs_conv ) { - flg_conv = 1 ; - } - } /* end of Psl Newton loop */ - - /* Reduce loop count to exclude derivative calculation sweep */ - lp_sl -- ; - - /*-------------------------------------------* - * Procedure for diverged case. - *-----------------*/ - if ( flg_conv == 0 ) { - fprintf( stderr , - "*** warning(HiSIM_HV): Went Over Iteration Maximum (Psl)\n" ) ; - fprintf( stderr , - " Vbse = %7.3f Vdse = %7.3f Vgse = %7.3f\n" , - Vbse , Vdse , Vgse ) ; - if ( flg_info >= 2 ) { - printf("*** warning(HiSIM_HV): Went Over Iteration Maximum (Psl)\n" ) ; - } - } - - - /*---------------------------------------------------* - * Evaluate derivatives of Psl. - * - note: Here, fsl1_dVbs and fsl2_dVbs are derivatives - * w.r.t. explicit Vbscl. So, Psl in the fsl1 and fsl2 - * expressions is regarded as a constant. - *-----------------*/ - Chi_dT = ( Psl - Vbscl ) * beta_dT - Vbscl_dT * beta ; - - if ( Chi < znbd5 ) { - T1 = cfs1 * beta * fi ; - fsl1_dVbs = T1 * ( ( Vbscl_dVbs - Vdseff_dVbs ) * fi - 2.0 * fi_dChi * Vbscl_dVbs ) ; - fsl1_dVds = - T1 * fi * Vdseff_dVds ; - fsl1_dVgs = - T1 * fi * Vdseff_dVgs ; - cfs1_dT = exp_bVbsVds * cnst1_dT + cnst1 * exp_bVbsVds_dT ; - fsl1_dT = fi * fi * cfs1_dT + 2 * cfs1 * fi * fi_dChi * Chi_dT ; - T2 = 0.5 / fsl2 ; - fsl2_dVbs = ( - beta * fb_dChi * 2 * fb * Vbscl_dVbs + fsl1_dVbs ) * T2 ; - fsl2_dVds = fsl1_dVds * T2 ; - fsl2_dVgs = fsl1_dVgs * T2 ; - fsl2_dT = ( 2 * fb * fb_dChi * Chi_dT + fsl1_dT ) * T2 ; - } else { - Rho_dT = beta_dT * ( Psl - Vds ) - beta * Vdseff_dT ; - exp_Rho_dT = Rho_dT * exp_Rho ; - - T1 = cnst1 * beta ; - fsl1_dVbs = - T1 * ( exp_Rho * Vdseff_dVbs - + ( Vbscl_dVbs - Vdseff_dVbs ) * exp_bVbsVds ); - fsl1_dVds = - T1 * Vdseff_dVds * ( exp_Rho - exp_bVbsVds ); - fsl1_dVgs = T1 * Vdseff_dVgs * ( - exp_Rho + exp_bVbsVds ); - fsl1_dT = cnst1 * ( exp_Rho_dT - exp_bVbsVds_dT ) + cnst1_dT * ( exp_Rho - exp_bVbsVds ) ; - T2 = 0.5e0 / fsl2 ; - fsl2_dVbs = ( - beta * Vbscl_dVbs + fsl1_dVbs ) * T2 ; - fsl2_dVds = ( fsl1_dVds ) * T2 ; - fsl2_dVgs = ( fsl1_dVgs ) * T2 ; - fsl2_dT = ( Chi_dT + fsl1_dT ) * T2 ; - } - - T1 = 1.0 / Fsl_dPsl ; - Psl_dVbs = - ( Vgp_dVbs - ( fac1 * fsl2_dVbs + fac1_dVbs * fsl2 ) ) * T1 ; - Psl_dVds = - ( Vgp_dVds - ( fac1 * fsl2_dVds + fac1_dVds * fsl2 ) ) * T1 ; - Psl_dVgs = - ( Vgp_dVgs - ( fac1 * fsl2_dVgs + fac1_dVgs * fsl2 ) ) * T1 ; - Psl_dT = - ( Vgp_dT - ( fac1 * fsl2_dT + fac1_dT * fsl2 ) ) * T1 ; - - Chi_dT = ( Psl - Vbscl ) * beta_dT + beta * ( Psl_dT - Vbscl_dT ); - exp_Chi_dT = exp_Chi * Chi_dT ; - - - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D1/D2. (Psl) - *-----------------*/ - Xil = fb * fb + epsm10 ; - T1 = 2 * fb * fb_dChi * beta ; - Xil_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ; - Xil_dVds = T1 * Psl_dVds ; - Xil_dVgs = T1 * Psl_dVgs ; - Xil_dT = 2 * fb * fb_dChi * Chi_dT ; - - Xilp12 = fb + epsm10 ; - T1 = fb_dChi * beta ; - Xilp12_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ; - Xilp12_dVds = T1 * Psl_dVds ; - Xilp12_dVgs = T1 * Psl_dVgs ; - Xilp12_dT = fb_dChi * Chi_dT ; + /*---------------------------------------------------* + * Qbu : -Qb in unit area. + *-----------------*/ + T1 = Vgp + beta_inv ; + T2 = T1 * F10 - F11 ; + T1_dT = Vgp_dT + beta_inv_dT ; + T2_dT = T1_dT * F10 + T1 * F10_dT - F11_dT ; - Xilp32 = fb * fb * fb + epsm10 ; - T1 = 3 * fb * fb * fb_dChi * beta ; - Xilp32_dVbs = T1 * ( Psl_dVbs - Vbscl_dVbs ) ; - Xilp32_dVds = T1 * Psl_dVds ; - Xilp32_dVgs = T1 * Psl_dVgs ; - Xilp32_dT = 3 * fb * fb * fb_dChi * Chi_dT ; - - } else { - /*-------------------------------------------* - * zone-D3. (Psl) - *-----------------*/ - - Xil = Chi - 1.0e0 ; - Xil_dVbs = beta * ( Psl_dVbs - Vbscl_dVbs ) ; - Xil_dVds = beta * Psl_dVds ; - Xil_dVgs = beta * Psl_dVgs ; - Xil_dT = Chi_dT ; - - Xilp12 = sqrt( Xil ) ; - T1 = 0.5e0 / Xilp12 ; - Xilp12_dVbs = T1 * Xil_dVbs ; - Xilp12_dVds = T1 * Xil_dVds ; - Xilp12_dVgs = T1 * Xil_dVgs ; - Xilp12_dT = T1 * Xil_dT ; - - Xilp32 = Xil * Xilp12 ; - T1 = 1.5e0 * Xilp12 ; - Xilp32_dVbs = T1 * Xil_dVbs ; - Xilp32_dVds = T1 * Xil_dVds ; - Xilp32_dVgs = T1 * Xil_dVgs ; - Xilp32_dT = T1 * Xil_dT ; - - } - - /*---------------------------------------------------* - * Assign Pds. - *-----------------*/ - Pds = Psl - Ps0 ; - - /* if ( Pds < ps_conv ) { */ - if ( Pds < 0.0 ) { /* take care of numerical noise */ - Pds = 0.0 ; - Psl = Ps0 ; - } - - Pds_dVbs = Psl_dVbs - Ps0_dVbs ; - Pds_dVds = Psl_dVds - Ps0_dVds ; - Pds_dVgs = Psl_dVgs - Ps0_dVgs ; - Pds_dT = Psl_dT - Ps0_dT ; - - /* if ( Pds < ps_conv ) { */ - if ( Pds < 0.0 ) { - Pds_dVbs = 0.0 ; - Pds_dVgs = 0.0 ; - Psl_dVbs = Ps0_dVbs ; - Psl_dVgs = Ps0_dVgs ; - Pds_dT = 0.0 ; - Psl_dT = Ps0_dT ; - } - - /* Vdseff */ - Vds = Vdsorg; - - /*-----------------------------------------------------------* - * Evaluate Idd. - * - Eta : substantial variable of QB'/Pds and Idd/Pds. - * - note: Eta = 4 * GAMMA_{hisim_0} - *-----------------*/ - T1 = beta / Xi0 ; - Eta = T1 * Pds ; - T2 = Eta * beta_inv ; - Eta_dVbs = T1 * ( Pds_dVbs - Xi0_dVbs * T2 ) ; - Eta_dVds = T1 * ( Pds_dVds - Xi0_dVds * T2 ) ; - Eta_dVgs = T1 * ( Pds_dVgs - Xi0_dVgs * T2 ) ; - T1_dT = ( beta_dT * Xi0 - beta * Xi0_dT ) / Xi0 / Xi0 ; - Eta_dT = T1_dT * Pds + T1 * Pds_dT ; - - /* ( Eta + 1 )^n */ - Eta1 = Eta + 1.0e0 ; - Eta1p12 = sqrt( Eta1 ) ; - Eta1p32 = Eta1p12 * Eta1 ; - Eta1p52 = Eta1p32 * Eta1 ; - Eta1_dT = Eta_dT ; - Eta1p12_dT = 0.5e0 / Eta1p12 * Eta1_dT ; - Eta1p32_dT = Eta1p12_dT * Eta1 + Eta1p12 * Eta1_dT ; - Eta1p52_dT = Eta1p32_dT * Eta1 + Eta1p32 * Eta1_dT ; - - /* 1 / ( ( Eta + 1 )^n + 1 ) */ - Zeta12 = 1.0e0 / ( Eta1p12 + 1.0e0 ) ; - Zeta32 = 1.0e0 / ( Eta1p32 + 1.0e0 ) ; - Zeta52 = 1.0e0 / ( Eta1p52 + 1.0e0 ) ; - Zeta12_dT = - 1.0e0 / ( Eta1p12 + 1.0e0 ) / ( Eta1p12 + 1.0e0 ) * Eta1p12_dT ; - Zeta32_dT = - 1.0e0 / ( Eta1p32 + 1.0e0 ) / ( Eta1p32 + 1.0e0 ) * Eta1p32_dT ; - Zeta52_dT = - 1.0e0 / ( Eta1p52 + 1.0e0 ) / ( Eta1p52 + 1.0e0 ) * Eta1p52_dT ; - - /*---------------------------------------------------* - * F00 := PS00/Pds (n=1/2) - *-----------------*/ - F00 = Zeta12 / Xi0p12 ; - T3 = - 1 / Xi0 ; - T4 = - 0.5e0 / Eta1p12 * F00 ; - T5 = Zeta12 * T3 ; - T6 = Zeta12 * T4 ; - F00_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ; - F00_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ; - F00_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ; - F00_dT = ( Zeta12_dT * Xi0p12 - Zeta12 * Xi0p12_dT ) / Xi0p12 / Xi0p12 ; - - /*---------------------------------------------------* - * F10 := PS10/Pds (n=3/2) - *-----------------*/ - T1 = 3.0e0 + Eta * ( 3.0e0 + Eta ) ; - F10 = C_2o3 * Xi0p12 * Zeta32 * T1 ; - T2 = 3.0e0 + Eta * 2.0e0 ; - T3 = C_2o3 * T1 ; - T4 = - 1.5e0 * Eta1p12 * F10 + C_2o3 * Xi0p12 * T2 ; - T5 = Zeta32 * T3 ; - T6 = Zeta32 * T4 ; - F10_dVbs = ( Xi0p12_dVbs * T5 + Eta_dVbs * T6 ) ; - F10_dVds = ( Xi0p12_dVds * T5 + Eta_dVds * T6 ) ; - F10_dVgs = ( Xi0p12_dVgs * T5 + Eta_dVgs * T6 ) ; - T1_dT = Eta_dT * ( 3.0e0 + Eta ) + Eta * Eta_dT ; - F10_dT = C_2o3 * Xi0p12 * Zeta32 * T1_dT - + C_2o3 * T1 * ( Xi0p12 * Zeta32_dT + Zeta32 * Xi0p12_dT ) ; - - /*---------------------------------------------------* - * F30 := PS30/Pds (n=5/2) - *-----------------*/ - T1 = 5e0 + Eta * ( 10e0 + Eta * ( 10e0 + Eta * ( 5e0 + Eta ) ) ) ; - F30 = 4e0 / ( 15e0 * beta ) * Xi0p32 * Zeta52 * T1 ; - T2 = 10e0 + Eta * ( 20e0 + Eta * ( 15e0 + Eta * 4e0 ) ) ; - T3 = 4e0 / ( 15e0 * beta ) * T1 ; - T4 = - ( 5e0 / 2e0 ) * Eta1p32 * F30 + 4e0 / ( 15e0 * beta ) * Xi0p32 * T2 ; - T5 = Zeta52 * T3 ; - T6 = Zeta52 * T4 ; - F30_dVbs = ( Xi0p32_dVbs * T5 + Eta_dVbs * T6 ) ; - F30_dVds = ( Xi0p32_dVds * T5 + Eta_dVds * T6 ) ; - F30_dVgs = ( Xi0p32_dVgs * T5 + Eta_dVgs * T6 ) ; - T1_dT = ( 10e0 + 20e0 * Eta + 15e0 * Eta * Eta + 4e0 * Eta * Eta * Eta ) * Eta_dT ; - F30_dT = 4e0 / 15e0 * beta_inv_dT * ( Xi0p32 * Zeta52 * T1 ) - + 4e0 / 15e0 * beta_inv * ( Xi0p32_dT * Zeta52 * T1 + Xi0p32 * Zeta52_dT * T1 + Xi0p32 * Zeta52 * T1_dT ) ; - - /*---------------------------------------------------* - * F11 := PS11/Pds. - *-----------------*/ - F11 = Ps0 * F10 + C_2o3 * beta_inv * Xilp32 - F30 ; - T1 = C_2o3 * beta_inv ; - F11_dVbs = Ps0_dVbs * F10 + Ps0 * F10_dVbs - + T1 * Xilp32_dVbs - F30_dVbs ; - F11_dVds = Ps0_dVds * F10 + Ps0 * F10_dVds - + T1 * Xilp32_dVds - F30_dVds ; - F11_dVgs = Ps0_dVgs * F10 + Ps0 * F10_dVgs - + T1 * Xilp32_dVgs - F30_dVgs ; - F11_dT = Ps0_dT * F10 + Ps0 * F10_dT - + C_2o3 *( beta_inv_dT * Xilp32 + beta_inv * Xilp32_dT ) - F30_dT ; - - /*---------------------------------------------------* - * Fdd := Idd/Pds. - *-----------------*/ - T1 = Vgp + beta_inv - 0.5e0 * ( 2.0e0 * Ps0 + Pds ) ; - T2 = - F10 + F00 ; - T3 = beta * Cox ; - T4 = beta * cnst0 ; - Fdd = T3 * T1 + T4 * T2 ; - Fdd_dVbs = T3 * ( Vgp_dVbs - Ps0_dVbs - 0.5e0 * Pds_dVbs ) - + beta * Cox_dVb * T1 + T4 * ( - F10_dVbs + F00_dVbs ) ; - Fdd_dVds = T3 * ( Vgp_dVds - Ps0_dVds - 0.5e0 * Pds_dVds ) - + beta * Cox_dVd * T1 + T4 * ( - F10_dVds + F00_dVds ) ; - Fdd_dVgs = T3 * ( Vgp_dVgs - Ps0_dVgs - 0.5e0 * Pds_dVgs ) - + beta * Cox_dVg * T1 + T4 * ( - F10_dVgs + F00_dVgs ) ; - T1_dT = Vgp_dT + beta_inv_dT - 0.5e0 * ( 2.0e0 * Ps0_dT + Pds_dT ) ; - T2_dT = -F10_dT + F00_dT ; - T3_dT = Cox * beta_dT ; - T4_dT = beta * cnst0_dT + cnst0 * beta_dT ; - Fdd_dT = T1 * T3_dT + T3 * T1_dT + T2 * T4_dT + T4 * T2_dT ; - - - /*---------------------------------------------------* - * Idd: - *-----------------*/ - Idd = Pds * Fdd ; - Idd_dVbs = Pds_dVbs * Fdd + Pds * Fdd_dVbs ; - Idd_dVds = Pds_dVds * Fdd + Pds * Fdd_dVds ; - Idd_dVgs = Pds_dVgs * Fdd + Pds * Fdd_dVgs ; - Idd_dT = Fdd * Pds_dT + Pds * Fdd_dT ; - - /*-----------------------------------------------------------* - * Skip CLM and integrated charges if zone==D1 - *-----------------*/ - if( flg_zone == 1 ) { - goto start_of_mobility ; - } - - /*-----------------------------------------------------------* - * Channel Length Modulation. Lred: \Delta L - *-----------------*/ - if( pParam->HSMHV_clm2 < epsm10 && pParam->HSMHV_clm3 < epsm10 ) { - Lred = 0.0e0 ; - Lred_dVbs = 0.0e0 ; - Lred_dVds = 0.0e0 ; - Lred_dVgs = 0.0e0 ; - Lred_dT = 0.0e0 ; - - Psdl = Psl ; - Psdl_dVbs = Psl_dVbs ; - Psdl_dVds = Psl_dVds ; - Psdl_dVgs = Psl_dVgs ; - Psdl_dT = Psl_dT ; - - if ( Psdl > Ps0 + Vds - epsm10 ) { - Psdl = Ps0 + Vds - epsm10 ; - Psdl_dVbs = Ps0_dVbs ; - Psdl_dVds = Ps0_dVds + 1.0 ; - Psdl_dVgs = Ps0_dVgs ; - Psdl_dT = Ps0_dT ; - } - - } else { - T1 = here->HSMHV_wdpl ; - T8 = sqrt (Psl - Vbscl) ; - Wd = T1 * T8 ; - T9 = 0.5 * T1 / T8 ; - Wd_dVbs = T9 * (Psl_dVbs - Vbscl_dVbs) ; - Wd_dVds = T9 * Psl_dVds ; - Wd_dVgs = T9 * Psl_dVgs ; - Wd_dT = T9 * (Psl_dT - Vbscl_dT) ; - - T0 = 1.0 / Wd ; - T1 = Qn0 * T0 ; - T2 = pParam->HSMHV_clm3 * T1 ; - T3 = pParam->HSMHV_clm3 * T0 ; - T2_dVb = T3 * (Qn0_dVbs - T1 * Wd_dVbs) ; - T2_dVd = T3 * (Qn0_dVds - T1 * Wd_dVds) ; - T2_dVg = T3 * (Qn0_dVgs - T1 * Wd_dVgs) ; - T2_dT = T3 * (Qn0_dT - T1 * Wd_dT) ; - - T5 = pParam->HSMHV_clm2 * q_Nsub + T2 ; - T1 = 1.0 / T5 ; - T4 = C_ESI * T1 ; - T4_dVb = - T4 * T2_dVb * T1 ; - T4_dVd = - T4 * T2_dVd * T1 ; - T4_dVg = - T4 * T2_dVg * T1 ; - T4_dT = -T4 * T2_dT * T1 ; - - T1 = (1.0e0 - pParam->HSMHV_clm1) ; - Psdl = pParam->HSMHV_clm1 * (Vds + Ps0) + T1 * Psl ; - Psdl_dVbs = pParam->HSMHV_clm1 * Ps0_dVbs + T1 * Psl_dVbs ; - Psdl_dVds = pParam->HSMHV_clm1 * (1.0 + Ps0_dVds) + T1 * Psl_dVds ; - Psdl_dVgs = pParam->HSMHV_clm1 * Ps0_dVgs + T1 * Psl_dVgs ; - Psdl_dT = pParam->HSMHV_clm1 * Ps0_dT + T1 * Psl_dT ; - - if ( Psdl > Ps0 + Vds - epsm10 ) { - Psdl = Ps0 + Vds - epsm10 ; - Psdl_dVbs = Ps0_dVbs ; - Psdl_dVds = Ps0_dVds + 1.0 ; - Psdl_dVgs = Ps0_dVgs ; - Psdl_dT = Ps0_dT ; - } - T6 = Psdl - Psl ; - T6_dVb = Psdl_dVbs - Psl_dVbs ; - T6_dVd = Psdl_dVds - Psl_dVds ; - T6_dVg = Psdl_dVgs - Psl_dVgs ; - T6_dT = Psdl_dT - Psl_dT ; - - T3 = beta * Qn0 ; - T1 = 1.0 / T3 ; - T5 = Idd * T1 ; - T3_dT = beta * Qn0_dT + beta_dT * Qn0 ; - T1_dT = - T1 * T1 * T3_dT ; - T5_dT = Idd_dT * T1 + Idd * T1_dT ; - T2 = T5 * beta ; - T5_dVb = (Idd_dVbs - T2 * Qn0_dVbs) * T1 ; - T5_dVd = (Idd_dVds - T2 * Qn0_dVds) * T1 ; - T5_dVg = (Idd_dVgs - T2 * Qn0_dVgs) * T1 ; - - T10 = q_Nsub / C_ESI ; - T1 = 1.0e5 ; - T2 = 1.0 / Leff ; - T11 = (2.0 * T5 + 2.0 * T10 * T6 * T4 + T1 * T4) * T2 ; - T3 = T2 * T4 ; - T7 = T11 * T4 ; - T7_dVb = (2.0 * T5_dVb + 2.0 * T10 * (T6_dVb * T4 + T6 * T4_dVb) + T1 * T4_dVb) * T3 + T11 * T4_dVb ; - T7_dVd = (2.0 * T5_dVd + 2.0 * T10 * (T6_dVd * T4 + T6 * T4_dVd) + T1 * T4_dVd) * T3 + T11 * T4_dVd ; - T7_dVg = (2.0 * T5_dVg + 2.0 * T10 * (T6_dVg * T4 + T6 * T4_dVg) + T1 * T4_dVg) * T3 + T11 * T4_dVg ; - T7_dT = (2.0 * T5_dT + 2.0 * T10 * ( T6_dT * T4 + T6 * T4_dT ) + T1 * T4_dT ) * T3 + T11 * T4_dT ; - - T11 = 4.0 * (2.0 * T10 * T6 + T1) ; - T1 = 8.0 * T10 * T4 * T4 ; - T2 = 2.0 * T11 * T4 ; - T8 = T11 * T4 * T4 ; - T8_dVb = ( T1 * T6_dVb + T2 * T4_dVb) ; - T8_dVd = ( T1 * T6_dVd + T2 * T4_dVd) ; - T8_dVg = ( T1 * T6_dVg + T2 * T4_dVg) ; - T8_dT = ( T1 * T6_dT + T2 * T4_dT) ; - - T9 = sqrt (T7 * T7 + T8); - T1 = 1.0 / T9 ; - T2 = T7 * T1 ; - T3 = 0.5 * T1 ; - T9_dVb = (T2 * T7_dVb + T3 * T8_dVb) ; - T9_dVd = (T2 * T7_dVd + T3 * T8_dVd) ; - T9_dVg = (T2 * T7_dVg + T3 * T8_dVg) ; - T9_dT = (T2 * T7_dT + T3 * T8_dT) ; - - Lred = 0.5 * (- T7 + T9) ; - Lred_dVbs = 0.5 * (- T7_dVb + T9_dVb) ; - Lred_dVds = 0.5 * (- T7_dVd + T9_dVd) ; - Lred_dVgs = 0.5 * (- T7_dVg + T9_dVg) ; - Lred_dT = 0.5 * (- T7_dT + T9_dT ) ; - /*---------------------------------------------------* - * Modify Lred for symmetry. - *-----------------*/ - T1 = Lred ; - Lred = FMDVDS * T1 ; - Lred_dVbs = FMDVDS_dVbs * T1 + FMDVDS * Lred_dVbs ; - Lred_dVds = FMDVDS_dVds * T1 + FMDVDS * Lred_dVds ; - Lred_dVgs = FMDVDS_dVgs * T1 + FMDVDS * Lred_dVgs ; - Lred_dT = FMDVDS_dT * T1 + FMDVDS * Lred_dT ; - } - - /* CLM5 & CLM6 */ - Lred *= here->HSMHV_clmmod ; - Lred_dVbs *= here->HSMHV_clmmod ; - Lred_dVds *= here->HSMHV_clmmod ; - Lred_dVgs *= here->HSMHV_clmmod ; - Lred_dT *= here->HSMHV_clmmod ; - - /*---------------------------------------------------* - * Qbu : -Qb in unit area. - *-----------------*/ - T1 = Vgp + beta_inv ; - T2 = T1 * F10 - F11 ; - T1_dT = Vgp_dT + beta_inv_dT ; - T2_dT = T1_dT * F10 + T1 * F10_dT - F11_dT ; - - - Qbnm = cnst0 * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds ) + Qbnm = cnst0 * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds ) + Cox * T2 ) ; - Qbnm_dVbs = cnst0 * ( cnst0 * ( - Xi0_dVbs - 0.5e0 * beta * Pds_dVbs ) + Qbnm_dVbs = cnst0 * ( cnst0 * ( - Xi0_dVbs - 0.5e0 * beta * Pds_dVbs ) + Cox * ( Vgp_dVbs * F10 + T1 * F10_dVbs - F11_dVbs ) + Cox_dVb * T2 ) ; - Qbnm_dVds = cnst0 * ( cnst0 * ( - Xi0_dVds - 0.5e0 * beta * Pds_dVds ) + Qbnm_dVds = cnst0 * ( cnst0 * ( - Xi0_dVds - 0.5e0 * beta * Pds_dVds ) + Cox * ( Vgp_dVds * F10 + T1 * F10_dVds - F11_dVds ) + Cox_dVd * T2 ) ; - Qbnm_dVgs = cnst0 * ( cnst0 * ( - Xi0_dVgs - 0.5e0 * beta * Pds_dVgs ) + Qbnm_dVgs = cnst0 * ( cnst0 * ( - Xi0_dVgs - 0.5e0 * beta * Pds_dVgs ) + Cox * ( Vgp_dVgs * F10 + T1 * F10_dVgs - F11_dVgs ) + Cox_dVg * T2 ) ; - Qbnm_dT = cnst0_dT * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds ) + Qbnm_dT = cnst0_dT * ( cnst0 * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds ) + Cox * T2 ) - + cnst0 * ( cnst0_dT * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds ) + + cnst0 * ( cnst0_dT * ( 1.5e0 - ( Xi0 + 1.0e0 ) - 0.5e0 * beta * Pds ) + cnst0 * ( - Xi0_dT - 0.5 * beta_dT * Pds - 0.5 * beta * Pds_dT ) + Cox * T2_dT ); - T1 = beta ; - Qbu = T1 * Qbnm / Fdd ; - T2 = T1 / ( Fdd * Fdd ) ; - Qbu_dVbs = T2 * ( Fdd * Qbnm_dVbs - Qbnm * Fdd_dVbs ) ; - Qbu_dVds = T2 * ( Fdd * Qbnm_dVds - Qbnm * Fdd_dVds ) ; - Qbu_dVgs = T2 * ( Fdd * Qbnm_dVgs - Qbnm * Fdd_dVgs ) ; - T1_dT = beta_dT ; - Qbu_dT = ( Fdd * ( T1_dT * Qbnm + T1 * Qbnm_dT ) - T1 * Qbnm * Fdd_dT ) / ( Fdd * Fdd ) ; + T1 = beta ; + Qbu = T1 * Qbnm / Fdd ; + T2 = T1 / ( Fdd * Fdd ) ; + Qbu_dVbs = T2 * ( Fdd * Qbnm_dVbs - Qbnm * Fdd_dVbs ) ; + Qbu_dVds = T2 * ( Fdd * Qbnm_dVds - Qbnm * Fdd_dVds ) ; + Qbu_dVgs = T2 * ( Fdd * Qbnm_dVgs - Qbnm * Fdd_dVgs ) ; + T1_dT = beta_dT ; + Qbu_dT = ( Fdd * ( T1_dT * Qbnm + T1 * Qbnm_dT ) - T1 * Qbnm * Fdd_dT ) / ( Fdd * Fdd ) ; - /*---------------------------------------------------* - * preparation for Qi and Qd. - * - DtPds: Delta * Pds ; - * - Achi: (1+Delta) * Pds ; - *-----------------*/ - T1 = 2.0e0 * fac1 ; - DtPds = T1 * ( F10 - Xi0p12 ) ; - T2 = 2.0 * ( F10 - Xi0p12 ) ; - DtPds_dVbs = T1 * ( F10_dVbs - Xi0p12_dVbs ) + + /*---------------------------------------------------* + * preparation for Qi and Qd. + * - DtPds: Delta * Pds ; + * - Achi: (1+Delta) * Pds ; + *-----------------*/ + T1 = 2.0e0 * fac1 ; + DtPds = T1 * ( F10 - Xi0p12 ) ; + T2 = 2.0 * ( F10 - Xi0p12 ) ; + DtPds_dVbs = T1 * ( F10_dVbs - Xi0p12_dVbs ) + T2 * fac1_dVbs ; - DtPds_dVds = T1 * ( F10_dVds - Xi0p12_dVds ) + DtPds_dVds = T1 * ( F10_dVds - Xi0p12_dVds ) + T2 * fac1_dVds ; - DtPds_dVgs = T1 * ( F10_dVgs - Xi0p12_dVgs ) + DtPds_dVgs = T1 * ( F10_dVgs - Xi0p12_dVgs ) + T2 * fac1_dVgs ; - T1_dT = 2.0e0 * fac1_dT ; - DtPds_dT = T1_dT * ( F10 - Xi0p12 ) + T1 * ( F10_dT -Xi0p12_dT ) ; + T1_dT = 2.0e0 * fac1_dT ; + DtPds_dT = T1_dT * ( F10 - Xi0p12 ) + T1 * ( F10_dT -Xi0p12_dT ) ; - Achi = Pds + DtPds ; - Achi_dVbs = Pds_dVbs + DtPds_dVbs ; - Achi_dVds = Pds_dVds + DtPds_dVds ; - Achi_dVgs = Pds_dVgs + DtPds_dVgs ; - Achi_dT = Pds_dT + DtPds_dT ; + Achi = Pds + DtPds ; + Achi_dVbs = Pds_dVbs + DtPds_dVbs ; + Achi_dVds = Pds_dVds + DtPds_dVds ; + Achi_dVgs = Pds_dVgs + DtPds_dVgs ; + Achi_dT = Pds_dT + DtPds_dT ; - /*-----------------------------------------------------------* - * Alpha : parameter to evaluate charges. - * - Achi: (1+Delta) * Pds ; - * - clamped to 0 if Alpha < 0. - *-----------------*/ - T1 = 1.0 / VgVt ; - T2 = Achi * T1 ; - T3 = 1.0e0 - T2 ; - TX = 1.0 - T3 ; - Fn_CP( TY , TX , 1.0 , 4 , T4 ) ; - Alpha = 1.0 - TY ; - T5 = T1 * T4 ; - Alpha_dVbs = - ( Achi_dVbs - T2 * VgVt_dVbs ) * T5 ; - Alpha_dVds = - ( Achi_dVds - T2 * VgVt_dVds ) * T5 ; - Alpha_dVgs = - ( Achi_dVgs - T2 * VgVt_dVgs ) * T5 ; - Alpha_dT = - ( Achi_dT - T2 * VgVt_dT ) * T5 ; + /*-----------------------------------------------------------* + * Alpha : parameter to evaluate charges. + * - Achi: (1+Delta) * Pds ; + * - clamped to 0 if Alpha < 0. + *-----------------*/ + T1 = 1.0 / VgVt ; + T2 = Achi * T1 ; + T3 = 1.0e0 - T2 ; + TX = 1.0 - T3 ; + Fn_CP( TY , TX , 1.0 , 4 , T4 ) ; + Alpha = 1.0 - TY ; + T5 = T1 * T4 ; + Alpha_dVbs = - ( Achi_dVbs - T2 * VgVt_dVbs ) * T5 ; + Alpha_dVds = - ( Achi_dVds - T2 * VgVt_dVds ) * T5 ; + Alpha_dVgs = - ( Achi_dVgs - T2 * VgVt_dVgs ) * T5 ; + Alpha_dT = - ( Achi_dT - T2 * VgVt_dT ) * T5 ; - /*-----------------------------------------------------------* - * Qiu : -Qi in unit area. - *-----------------*/ + /*-----------------------------------------------------------* + * Qiu : -Qi in unit area. + *-----------------*/ - Qinm = 1.0e0 + Alpha * ( 1.0e0 + Alpha ) ; - T1 = 1.0e0 + Alpha + Alpha ; - Qinm_dVbs = Alpha_dVbs * T1 ; - Qinm_dVds = Alpha_dVds * T1 ; - Qinm_dVgs = Alpha_dVgs * T1 ; - Qinm_dT = Alpha_dT * T1 ; + Qinm = 1.0e0 + Alpha * ( 1.0e0 + Alpha ) ; + T1 = 1.0e0 + Alpha + Alpha ; + Qinm_dVbs = Alpha_dVbs * T1 ; + Qinm_dVds = Alpha_dVds * T1 ; + Qinm_dVgs = Alpha_dVgs * T1 ; + Qinm_dT = Alpha_dT * T1 ; - Qidn = Fn_Max( 1.0e0 + Alpha , epsm10 ) ; - Qidn_dVbs = Alpha_dVbs ; - Qidn_dVds = Alpha_dVds ; - Qidn_dVgs = Alpha_dVgs ; - Qidn_dT = Alpha_dT ; + Qidn = Fn_Max( 1.0e0 + Alpha , epsm10 ) ; + Qidn_dVbs = Alpha_dVbs ; + Qidn_dVds = Alpha_dVds ; + Qidn_dVgs = Alpha_dVgs ; + Qidn_dT = Alpha_dT ; - T1 = C_2o3 * VgVt * Qinm / Qidn ; - Qiu = T1 * Cox ; - T2 = 1.0 / VgVt ; - T3 = 1.0 / Qinm ; - T4 = 1.0 / Qidn ; - Qiu_dVbs = Qiu * ( VgVt_dVbs * T2 + Qinm_dVbs * T3 - Qidn_dVbs * T4 ) + T1 = C_2o3 * VgVt * Qinm / Qidn ; + Qiu = T1 * Cox ; + T2 = 1.0 / VgVt ; + T3 = 1.0 / Qinm ; + T4 = 1.0 / Qidn ; + Qiu_dVbs = Qiu * ( VgVt_dVbs * T2 + Qinm_dVbs * T3 - Qidn_dVbs * T4 ) + T1 * Cox_dVb ; - Qiu_dVds = Qiu * ( VgVt_dVds * T2 + Qinm_dVds * T3 - Qidn_dVds * T4) + Qiu_dVds = Qiu * ( VgVt_dVds * T2 + Qinm_dVds * T3 - Qidn_dVds * T4) + T1 * Cox_dVd ; - Qiu_dVgs = Qiu * ( VgVt_dVgs * T2 + Qinm_dVgs * T3 - Qidn_dVgs * T4) + Qiu_dVgs = Qiu * ( VgVt_dVgs * T2 + Qinm_dVgs * T3 - Qidn_dVgs * T4) + T1 * Cox_dVg ; - T1_dT = C_2o3 * ( Qidn * ( VgVt_dT * Qinm + VgVt * Qinm_dT ) - Qidn_dT * VgVt * Qinm ) - / ( Qidn * Qidn ) ; - Qiu_dT = Cox * T1_dT ; + T1_dT = C_2o3 * ( Qidn * ( VgVt_dT * Qinm + VgVt * Qinm_dT ) - Qidn_dT * VgVt * Qinm ) + / ( Qidn * Qidn ) ; + Qiu_dT = Cox * T1_dT ; - /*-----------------------------------------------------------* - * Qdrat : Qd/Qi - *-----------------*/ - Qdnm = 0.5e0 + Alpha ; - Qdnm_dVbs = Alpha_dVbs ; - Qdnm_dVds = Alpha_dVds ; - Qdnm_dVgs = Alpha_dVgs ; - Qdnm_dT = Alpha_dT ; + /*-----------------------------------------------------------* + * Qdrat : Qd/Qi + *-----------------*/ + Qdnm = 0.5e0 + Alpha ; + Qdnm_dVbs = Alpha_dVbs ; + Qdnm_dVds = Alpha_dVds ; + Qdnm_dVgs = Alpha_dVgs ; + Qdnm_dT = Alpha_dT ; - Qddn = Qidn * Qinm ; - Qddn_dVbs = Qidn_dVbs * Qinm + Qidn * Qinm_dVbs ; - Qddn_dVds = Qidn_dVds * Qinm + Qidn * Qinm_dVds ; - Qddn_dVgs = Qidn_dVgs * Qinm + Qidn * Qinm_dVgs ; - Qddn_dT = Qidn_dT * Qinm + Qidn * Qinm_dT ; + Qddn = Qidn * Qinm ; + Qddn_dVbs = Qidn_dVbs * Qinm + Qidn * Qinm_dVbs ; + Qddn_dVds = Qidn_dVds * Qinm + Qidn * Qinm_dVds ; + Qddn_dVgs = Qidn_dVgs * Qinm + Qidn * Qinm_dVgs ; + Qddn_dT = Qidn_dT * Qinm + Qidn * Qinm_dT ; - Quot = 0.4e0 * Qdnm / Qddn ; - Qdrat = 0.6e0 - Quot ; + Quot = 0.4e0 * Qdnm / Qddn ; + Qdrat = 0.6e0 - Quot ; - if ( Qdrat <= 0.5e0 ) { - T1 = 1.0 / Qddn ; - T2 = 1.0 / Qdnm ; - Qdrat_dVbs = Quot * ( Qddn_dVbs * T1 - Qdnm_dVbs * T2 ) ; - Qdrat_dVds = Quot * ( Qddn_dVds * T1 - Qdnm_dVds * T2 ) ; - Qdrat_dVgs = Quot * ( Qddn_dVgs * T1 - Qdnm_dVgs * T2 ) ; - Qdrat_dT = Quot * ( Qddn_dT * T1 - Qdnm_dT * T2 ) ; - } else { - Qdrat = 0.5e0 ; - Qdrat_dVbs = 0.0e0 ; - Qdrat_dVds = 0.0e0 ; - Qdrat_dVgs = 0.0e0 ; - Qdrat_dT = 0.0e0 ; + if ( Qdrat <= 0.5e0 ) { + T1 = 1.0 / Qddn ; + T2 = 1.0 / Qdnm ; + Qdrat_dVbs = Quot * ( Qddn_dVbs * T1 - Qdnm_dVbs * T2 ) ; + Qdrat_dVds = Quot * ( Qddn_dVds * T1 - Qdnm_dVds * T2 ) ; + Qdrat_dVgs = Quot * ( Qddn_dVgs * T1 - Qdnm_dVgs * T2 ) ; + Qdrat_dT = Quot * ( Qddn_dT * T1 - Qdnm_dT * T2 ) ; + } else { + Qdrat = 0.5e0 ; + Qdrat_dVbs = 0.0e0 ; + Qdrat_dVds = 0.0e0 ; + Qdrat_dVgs = 0.0e0 ; + Qdrat_dT = 0.0e0 ; - } + } - /*-----------------------------------------------------------* - * Interpolate charges and CLM for zone-D2. - *-----------------*/ + /*-----------------------------------------------------------* + * Interpolate charges and CLM for zone-D2. + *-----------------*/ - if ( flg_zone == 2 ) { - T1 = Qbu ; - Qbu = FD2 * Qbu + ( 1.0 - FD2 ) * Qb0 ; - Qbu_dVbs = FD2 * Qbu_dVbs + FD2_dVbs * T1 - + ( 1.0 - FD2 ) * Qb0_dVb - FD2_dVbs * Qb0 ; - Qbu_dVds = FD2 * Qbu_dVds + FD2_dVds * T1 - + ( 1.0 - FD2 ) * Qb0_dVd - FD2_dVds * Qb0 ; - Qbu_dVgs = FD2 * Qbu_dVgs + FD2_dVgs * T1 - + ( 1.0 - FD2 ) * Qb0_dVg - FD2_dVgs * Qb0 ; - Qbu_dT = FD2 * Qbu_dT + FD2_dT * T1 - + ( 1.0 - FD2 ) * Qb0_dT - FD2_dT * Qb0 ; + if ( flg_zone == 2 ) { + T1 = Qbu ; + Qbu = FD2 * Qbu + ( 1.0 - FD2 ) * Qb0 ; + Qbu_dVbs = FD2 * Qbu_dVbs + FD2_dVbs * T1 + + ( 1.0 - FD2 ) * Qb0_dVb - FD2_dVbs * Qb0 ; + Qbu_dVds = FD2 * Qbu_dVds + FD2_dVds * T1 + + ( 1.0 - FD2 ) * Qb0_dVd - FD2_dVds * Qb0 ; + Qbu_dVgs = FD2 * Qbu_dVgs + FD2_dVgs * T1 + + ( 1.0 - FD2 ) * Qb0_dVg - FD2_dVgs * Qb0 ; + Qbu_dT = FD2 * Qbu_dT + FD2_dT * T1 + + ( 1.0 - FD2 ) * Qb0_dT - FD2_dT * Qb0 ; - if ( Qbu < 0.0 ) { - Qbu = 0.0 ; - Qbu_dVbs = 0.0 ; - Qbu_dVds = 0.0 ; - Qbu_dVgs = 0.0 ; - Qbu_dT = 0.0 ; - } - T1 = Qiu ; - Qiu = FD2 * Qiu + ( 1.0 - FD2 ) * Qn0 ; - Qiu_dVbs = FD2 * Qiu_dVbs + FD2_dVbs * T1 - + ( 1.0 - FD2 ) * Qn0_dVbs - FD2_dVbs * Qn0 ; - Qiu_dVds = FD2 * Qiu_dVds + FD2_dVds * T1 - + ( 1.0 - FD2 ) * Qn0_dVds - FD2_dVds * Qn0 ; - Qiu_dVgs = FD2 * Qiu_dVgs + FD2_dVgs * T1 - + ( 1.0 - FD2 ) * Qn0_dVgs - FD2_dVgs * Qn0 ; - Qiu_dT = FD2 * Qiu_dT + FD2_dT * T1 - + ( 1.0 - FD2 ) * Qn0_dT - FD2_dT * Qn0 ; + if ( Qbu < 0.0 ) { + Qbu = 0.0 ; + Qbu_dVbs = 0.0 ; + Qbu_dVds = 0.0 ; + Qbu_dVgs = 0.0 ; + Qbu_dT = 0.0 ; + } + T1 = Qiu ; + Qiu = FD2 * Qiu + ( 1.0 - FD2 ) * Qn0 ; + Qiu_dVbs = FD2 * Qiu_dVbs + FD2_dVbs * T1 + + ( 1.0 - FD2 ) * Qn0_dVbs - FD2_dVbs * Qn0 ; + Qiu_dVds = FD2 * Qiu_dVds + FD2_dVds * T1 + + ( 1.0 - FD2 ) * Qn0_dVds - FD2_dVds * Qn0 ; + Qiu_dVgs = FD2 * Qiu_dVgs + FD2_dVgs * T1 + + ( 1.0 - FD2 ) * Qn0_dVgs - FD2_dVgs * Qn0 ; + Qiu_dT = FD2 * Qiu_dT + FD2_dT * T1 + + ( 1.0 - FD2 ) * Qn0_dT - FD2_dT * Qn0 ; - if ( Qiu < 0.0 ) { - Qiu = 0.0 ; - Qiu_dVbs = 0.0 ; - Qiu_dVds = 0.0 ; - Qiu_dVgs = 0.0 ; - Qiu_dT = 0.0 ; - } + if ( Qiu < 0.0 ) { + Qiu = 0.0 ; + Qiu_dVbs = 0.0 ; + Qiu_dVds = 0.0 ; + Qiu_dVgs = 0.0 ; + Qiu_dT = 0.0 ; + } - T1 = Qdrat ; - Qdrat = FD2 * Qdrat + ( 1.0 - FD2 ) * 0.5e0 ; - Qdrat_dVbs = FD2 * Qdrat_dVbs + FD2_dVbs * T1 - FD2_dVbs * 0.5e0 ; - Qdrat_dVds = FD2 * Qdrat_dVds + FD2_dVds * T1 - FD2_dVds * 0.5e0 ; - Qdrat_dVgs = FD2 * Qdrat_dVgs + FD2_dVgs * T1 - FD2_dVgs * 0.5e0 ; - Qdrat_dT = FD2 * Qdrat_dT + FD2_dT * T1 - FD2_dT * 0.5e0 ; + T1 = Qdrat ; + Qdrat = FD2 * Qdrat + ( 1.0 - FD2 ) * 0.5e0 ; + Qdrat_dVbs = FD2 * Qdrat_dVbs + FD2_dVbs * T1 - FD2_dVbs * 0.5e0 ; + Qdrat_dVds = FD2 * Qdrat_dVds + FD2_dVds * T1 - FD2_dVds * 0.5e0 ; + Qdrat_dVgs = FD2 * Qdrat_dVgs + FD2_dVgs * T1 - FD2_dVgs * 0.5e0 ; + Qdrat_dT = FD2 * Qdrat_dT + FD2_dT * T1 - FD2_dT * 0.5e0 ; - /* note: Lred=0 in zone-D1 */ - T1 = Lred ; - Lred = FD2 * Lred ; - Lred_dVbs = FD2 * Lred_dVbs + FD2_dVbs * T1 ; - Lred_dVds = FD2 * Lred_dVds + FD2_dVds * T1 ; - Lred_dVgs = FD2 * Lred_dVgs + FD2_dVgs * T1 ; - Lred_dT = FD2 * Lred_dT + FD2_dT * T1 ; + /* note: Lred=0 in zone-D1 */ + T1 = Lred ; + Lred = FD2 * Lred ; + Lred_dVbs = FD2 * Lred_dVbs + FD2_dVbs * T1 ; + Lred_dVds = FD2 * Lred_dVds + FD2_dVds * T1 ; + Lred_dVgs = FD2 * Lred_dVgs + FD2_dVgs * T1 ; + Lred_dT = FD2 * Lred_dT + FD2_dT * T1 ; - } /* end of flg_zone==2 if-block */ + } /* end of flg_zone==2 if-block */ start_of_mobility: - Lch = Leff - Lred ; - if ( Lch < 1.0e-9 ) { - fprintf ( stderr , "*** warning(HiSIM_HV): actual channel length is too small. (Lch=%e[m])\n" , Lch ) ; - fprintf ( stderr , " CLM5 and/or CLM6 might be too large.\n" ) ; - Lch = 1.0e-9 ; Lch_dVbs = Lch_dVds = Lch_dVgs = 0.0 ; - Lch_dT = 0.0 ; - } else { Lch_dVbs = - Lred_dVbs ; Lch_dVds = - Lred_dVds ; Lch_dVgs = - Lred_dVgs ; - Lch_dT = - Lred_dT ; - } + Lch = Leff - Lred ; + if ( Lch < 1.0e-9 ) { + fprintf ( stderr , "*** warning(HiSIM_HV(%s)): actual channel length is too small. (Lch=%e[m])\n" , model->HSMHVmodName, Lch ) ; + fprintf ( stderr , " CLM5 and/or CLM6 might be too large.\n" ) ; + Lch = 1.0e-9 ; Lch_dVbs = Lch_dVds = Lch_dVgs = 0.0 ; + Lch_dT = 0.0 ; + } else { Lch_dVbs = - Lred_dVbs ; Lch_dVds = - Lred_dVds ; Lch_dVgs = - Lred_dVgs ; + Lch_dT = - Lred_dT ; + } - /*-----------------------------------------------------------* - * Muun : universal mobility. (CGS unit) - *-----------------*/ + /*-----------------------------------------------------------* + * Muun : universal mobility. (CGS unit) + *-----------------*/ - T1 = here->HSMHV_ndep_o_esi ; - T2 = here->HSMHV_ninv_o_esi ; + T1 = here->HSMHV_ndep_o_esi ; + T2 = here->HSMHV_ninv_o_esi ; - T0 = here->HSMHV_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_dT = ( Psl_dT - Ps0_dT ) * T0 + ( Psl - Ps0 ) * ninvd_dT ; + T0 = here->HSMHV_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_dT = ( Psl_dT - Ps0_dT ) * T0 + ( Psl - Ps0 ) * ninvd_dT ; - T5 = T1 * Qbu + T2 * Qiu ; - T5_dVb = T1 * Qbu_dVbs + T2 * Qiu_dVbs ; - T5_dVd = T1 * Qbu_dVds + T2 * Qiu_dVds ; - T5_dVg = T1 * Qbu_dVgs + T2 * Qiu_dVgs ; - T5_dT = T1 * Qbu_dT + T2 * Qiu_dT ; + T5 = T1 * Qbu + T2 * Qiu ; + T5_dVb = T1 * Qbu_dVbs + T2 * Qiu_dVbs ; + T5_dVd = T1 * Qbu_dVds + T2 * Qiu_dVds ; + T5_dVg = T1 * Qbu_dVgs + T2 * Qiu_dVgs ; + T5_dT = T1 * Qbu_dT + T2 * Qiu_dT ; - 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 ; - T3_dT = ( - T4_dT * T5 + T4 * T5_dT ) / T4 / T4 ; + 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 ; + T3_dT = ( - T4_dT * T5 + T4 * T5_dT ) / T4 / T4 ; - Eeff = T3 ; - Eeff_dVbs = T3_dVb ; - Eeff_dVds = T3_dVd ; - Eeff_dVgs = T3_dVg ; - Eeff_dT = T3_dT ; + Eeff = T3 ; + Eeff_dVbs = T3_dVb ; + Eeff_dVds = T3_dVd ; + Eeff_dVgs = T3_dVg ; + Eeff_dT = T3_dT ; - T5 = Fn_Pow( Eeff , model->HSMHV_mueph0 - 1.0e0 ) ; - T8 = T5 * Eeff ; - T7 = Fn_Pow( Eeff , here->HSMHV_muesr - 1.0e0 ) ; - T6 = T7 * Eeff ; - T8_dT = model->HSMHV_mueph0 * T5 * Eeff_dT ; - T6_dT = here->HSMHV_muesr * T7 * Eeff_dT ; + T5 = Fn_Pow( Eeff , model->HSMHV_mueph0 - 1.0e0 ) ; + T8 = T5 * Eeff ; + T7 = Fn_Pow( Eeff , here->HSMHV_muesr - 1.0e0 ) ; + T6 = T7 * Eeff ; + T8_dT = model->HSMHV_mueph0 * T5 * Eeff_dT ; + T6_dT = here->HSMHV_muesr * T7 * Eeff_dT ; + + T9 = C_QE * C_m2cm_p2 ; + Rns = Qiu / T9 ; + Rns_dT = Qiu_dT / T9 ; + + T1 = 1.0e0 / ( pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ) + + here->HSMHV_mphn0 * T8 + T6 / pParam->HSMHV_muesr1 ; - T9 = C_QE * C_m2cm_p2 ; - Rns = Qiu / T9 ; - Rns_dT = Qiu_dT / T9 ; + T1_dT = - 1.0e0 / ( pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ) + / ( pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ) + * pParam->HSMHV_muecb1 * Rns_dT / 1.0e11 + + here->HSMHV_mphn0 * T8_dT + mphn0_dT * T8 + T6_dT / pParam->HSMHV_muesr1 ; - T1 = 1.0e0 / ( pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ) - + here->HSMHV_mphn0 * T8 + T6 / pParam->HSMHV_muesr1 ; + Muun = 1.0e0 / T1 ; + Muun_dT = - Muun / T1 * T1_dT ; - - T1_dT = - 1.0e0 / ( pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ) - / ( pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ) - * pParam->HSMHV_muecb1 * Rns_dT / 1.0e11 - + here->HSMHV_mphn0 * T8_dT + mphn0_dT * T8 + T6_dT / pParam->HSMHV_muesr1 ; - - Muun = 1.0e0 / T1 ; - Muun_dT = - Muun / T1 * T1_dT ; - - T1 = 1.0e0 / ( T1 * T1 ) ; - T2 = pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ; - T2 = 1.0e0 / ( T2 * T2 ) ; - T3 = here->HSMHV_mphn1 * T5 ; - T4 = here->HSMHV_muesr * T7 / pParam->HSMHV_muesr1 ; - T5 = - 1.0e-11 * pParam->HSMHV_muecb1 / C_QE * T2 / C_m2cm_p2 ; - Muun_dVbs = - ( T5 * Qiu_dVbs + T1 = 1.0e0 / ( T1 * T1 ) ; + T2 = pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ; + T2 = 1.0e0 / ( T2 * T2 ) ; + T3 = here->HSMHV_mphn1 * T5 ; + T4 = here->HSMHV_muesr * T7 / pParam->HSMHV_muesr1 ; + T5 = - 1.0e-11 * pParam->HSMHV_muecb1 / C_QE * T2 / C_m2cm_p2 ; + Muun_dVbs = - ( T5 * Qiu_dVbs + Eeff_dVbs * T3 + Eeff_dVbs * T4 ) * T1 ; - Muun_dVds = - ( T5 * Qiu_dVds + Muun_dVds = - ( T5 * Qiu_dVds + Eeff_dVds * T3 + Eeff_dVds * T4 ) * T1 ; - Muun_dVgs = - ( T5 * Qiu_dVgs + Muun_dVgs = - ( T5 * Qiu_dVgs + Eeff_dVgs * T3 + Eeff_dVgs * T4 ) * T1 ; - /* Change to MKS unit */ - Muun /= C_m2cm_p2 ; - Muun_dT /= C_m2cm_p2 ; - Muun_dVbs /= C_m2cm_p2 ; - Muun_dVds /= C_m2cm_p2 ; - Muun_dVgs /= C_m2cm_p2 ; + /* Change to MKS unit */ + Muun /= C_m2cm_p2 ; + Muun_dT /= C_m2cm_p2 ; + Muun_dVbs /= C_m2cm_p2 ; + Muun_dVds /= C_m2cm_p2 ; + Muun_dVgs /= C_m2cm_p2 ; - /*-----------------------------------------------------------* - * Mu : mobility - *-----------------*/ - T2 = beta * (Qn0 + small) * Lch ; + /*-----------------------------------------------------------* + * Mu : mobility + *-----------------*/ + T2 = beta * (Qn0 + small) * Lch ; - T1 = 1.0e0 / T2 ; - T3 = T1 * T1 ; - T4 = - beta * T3 ; - T5 = T4 * Lch ; - T6 = T4 * (Qn0 + small) ; - T1_dVb = ( T5 * Qn0_dVbs + T6 * Lch_dVbs) ; - T1_dVd = ( T5 * Qn0_dVds + T6 * Lch_dVds) ; - T1_dVg = ( T5 * Qn0_dVgs + T6 * Lch_dVgs) ; - T2_dT = beta_dT * (Qn0 + small) * Lch + beta * Qn0_dT * Lch + beta * (Qn0 + small) * Lch_dT ; - T1_dT = - T1 / T2 * T2_dT ; + T1 = 1.0e0 / T2 ; + T3 = T1 * T1 ; + T4 = - beta * T3 ; + T5 = T4 * Lch ; + T6 = T4 * (Qn0 + small) ; + T1_dVb = ( T5 * Qn0_dVbs + T6 * Lch_dVbs) ; + T1_dVd = ( T5 * Qn0_dVds + T6 * Lch_dVds) ; + T1_dVg = ( T5 * Qn0_dVgs + T6 * Lch_dVgs) ; + T2_dT = beta_dT * (Qn0 + small) * Lch + beta * Qn0_dT * Lch + beta * (Qn0 + small) * Lch_dT ; + T1_dT = - T1 / T2 * T2_dT ; - 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 ; - TY_dT = Idd_dT * T1 + Idd * T1_dT ; + 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 ; + TY_dT = Idd_dT * T1 + Idd * T1_dT ; - T2 = 0.2 * Vmax / Muun ; - T3 = - T2 / Muun ; - T2_dVb = T3 * Muun_dVbs ; - T2_dVd = T3 * Muun_dVds ; - T2_dVg = T3 * Muun_dVgs ; - T2_dT = 0.2 * ( Vmax_dT * Muun - Muun_dT * Vmax )/ ( Muun * Muun ) ; + T2 = 0.2 * Vmax / Muun ; + T3 = - T2 / Muun ; + T2_dVb = T3 * Muun_dVbs ; + T2_dVd = T3 * Muun_dVds ; + T2_dVg = T3 * Muun_dVgs ; + T2_dT = 0.2 * ( Vmax_dT * Muun - Muun_dT * Vmax )/ ( Muun * Muun ) ; - 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 ) ; - Ey_dT = T4 * ( TY * TY_dT + T2 * T2_dT ) ; + 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 ) ; + Ey_dT = T4 * ( TY * TY_dT + T2 * T2_dT ) ; - 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 ; - Em_dT = Ey * Muun_dT + Ey_dT * Muun ; + 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 ; + Em_dT = Ey * Muun_dT + Ey_dT * Muun ; - T1 = Em / Vmax ; - T1_dT = ( Em_dT * Vmax - Vmax_dT * Em ) / ( Vmax * Vmax ); + T1 = Em / Vmax ; + T1_dT = ( Em_dT * Vmax - Vmax_dT * Em ) / ( Vmax * Vmax ); - /* note: model->HSMHV_bb = 2 (electron) ;1 (hole) */ - if ( 1.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 1.0e0 + epsm10 ) { - T3 = 1.0e0 ; - T3_dT = 0.0e0 ; - } else if ( 2.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 2.0e0 + epsm10 ) { - T3 = T1 ; - T3_dT = T1_dT ; - } else { - T3 = Fn_Pow( T1 , model->HSMHV_bb - 1.0e0 ) ; - T3_dT = ( model->HSMHV_bb - 1.0e0 )* Fn_Pow( T1 , model->HSMHV_bb - 2.0e0 ) * T1_dT ; - } - T2 = T1 * T3 ; - T4 = 1.0e0 + T2 ; - T2_dT = T1 * T3_dT + T3 * T1_dT ; - T4_dT = T2_dT ; + /* note: model->HSMHV_bb = 2 (electron) ;1 (hole) */ + if ( 1.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 1.0e0 + epsm10 ) { + T3 = 1.0e0 ; + T3_dT = 0.0e0 ; + } else if ( 2.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 2.0e0 + epsm10 ) { + T3 = T1 ; + T3_dT = T1_dT ; + } else { + T3 = Fn_Pow( T1 , model->HSMHV_bb - 1.0e0 ) ; + T3_dT = ( model->HSMHV_bb - 1.0e0 )* Fn_Pow( T1 , model->HSMHV_bb - 2.0e0 ) * T1_dT ; + } + T2 = T1 * T3 ; + T4 = 1.0e0 + T2 ; + T2_dT = T1 * T3_dT + T3 * T1_dT ; + T4_dT = T2_dT ; - if ( 1.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 1.0e0 + epsm10 ) { - T5 = 1.0 / T4 ; + if ( 1.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 1.0e0 + epsm10 ) { + T5 = 1.0 / T4 ; + T6 = T5 / T4 ; + T5_dT = - T5 * T5 * T4_dT ; + T6_dT = T5 * T5 * ( T5_dT * T4 - T5 * T4_dT ) ; + } else if ( 2.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 2.0e0 + epsm10 ) { + T5 = 1.0 / sqrt( T4 ) ; T6 = T5 / T4 ; - T5_dT = - T5 * T5 * T4_dT ; - T6_dT = T5 * T5 * ( T5_dT * T4 - T5 * T4_dT ) ; - } else if ( 2.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 2.0e0 + epsm10 ) { - T5 = 1.0 / sqrt( T4 ) ; - T6 = T5 / T4 ; - T5_dT = - 0.5e0 / ( T4 * sqrt(T4)) * T4_dT ; - T6_dT = ( T5_dT * T4 - T5 * T4_dT ) / T4 / T4 ; - } else { - T6 = Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV_bb - 1.0e0 ) ) ; - T5 = T4 * T6 ; - T6_dT =( - 1.0e0 / model->HSMHV_bb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV_bb - 2.0e0 ) ) * T4_dT ; - T5_dT = T4_dT * T6 + T4 * T6_dT ; - } + T5_dT = - 0.5e0 / ( T4 * sqrt(T4)) * T4_dT ; + T6_dT = ( T5_dT * T4 - T5 * T4_dT ) / T4 / T4 ; + } else { + T6 = Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV_bb - 1.0e0 ) ) ; + T5 = T4 * T6 ; + T6_dT =( - 1.0e0 / model->HSMHV_bb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV_bb - 2.0e0 ) ) * T4_dT ; + T5_dT = T4_dT * T6 + T4 * T6_dT ; + } - T7 = Muun / Vmax * T6 * T3 ; + 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 ; - Mu_dT = Muun_dT * T5 + Muun * T5_dT ; + 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 ; + Mu_dT = Muun_dT * T5 + Muun * T5_dT ; /* end_of_mobility : */ - /*-----------------------------------------------------------* - * Ids: channel current. - *-----------------*/ - betaWL = here->HSMHV_weff_nf * beta_inv / Lch ; - T1 = - betaWL / Lch ; - betaWL_dVbs = T1 * Lch_dVbs ; - betaWL_dVds = T1 * Lch_dVds ; - betaWL_dVgs = T1 * Lch_dVgs ; - betaWL_dT = here->HSMHV_weff_nf * ( beta_inv_dT * Lch - beta_inv * Lch_dT ) / ( Lch * Lch ) ; + /*-----------------------------------------------------------* + * Ids: channel current. + *-----------------*/ + betaWL = here->HSMHV_weff_nf * beta_inv / Lch ; + T1 = - betaWL / Lch ; + betaWL_dVbs = T1 * Lch_dVbs ; + betaWL_dVds = T1 * Lch_dVds ; + betaWL_dVgs = T1 * Lch_dVgs ; + betaWL_dT = here->HSMHV_weff_nf * ( beta_inv_dT * Lch - beta_inv * Lch_dT ) / ( Lch * Lch ) ; - Ids0 = betaWL * Idd * Mu ; - T1 = betaWL * Idd ; - T2 = Idd * Mu ; - T3 = Mu * betaWL ; - Ids0_dVbs = T3 * Idd_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ; - Ids0_dVds = T3 * Idd_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ; - Ids0_dVgs = T3 * Idd_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ; - Ids0_dT = T3 * Idd_dT + T1 * Mu_dT + T2 * betaWL_dT ; + Ids0 = betaWL * Idd * Mu ; + T1 = betaWL * Idd ; + T2 = Idd * Mu ; + T3 = Mu * betaWL ; + Ids0_dVbs = T3 * Idd_dVbs + T1 * Mu_dVbs + T2 * betaWL_dVbs ; + Ids0_dVds = T3 * Idd_dVds + T1 * Mu_dVds + T2 * betaWL_dVds ; + Ids0_dVgs = T3 * Idd_dVgs + T1 * Mu_dVgs + T2 * betaWL_dVgs ; + Ids0_dT = T3 * Idd_dT + T1 * Mu_dT + T2 * betaWL_dT ; - /* note: rpock procedure was removed. */ - if( flg_rsrd == 2 || flg_rsrd == 3 ){ - if( model->HSMHV_rd20 > 0.0 ){ - T4 = here->HSMHV_rd23 ; - T1 = pParam->HSMHV_rd24 * ( Vgse - model->HSMHV_rd25 ) ; - T1_dVg = pParam->HSMHV_rd24 ; - - Fn_SL( T2 , T1 , T4 , delta_rd , T0 ) ; + /*-----------------------------------------------------------* + * Adding parasitic components to the channel current. + *-----------------*/ + if( model->HSMHV_ptl != 0 ){ + T1 = 0.5 * ( Vds - Pds ) ; + Fn_SymAdd( T6 , T1 , 0.01 , T2 ) ; + T2 *= 0.5 ; + T6_dVb = T2 * ( - Pds_dVbs ) ; + T6_dVd = T2 * ( 1.0 - Pds_dVds ) ; + T6_dVg = T2 * ( - Pds_dVgs ) ; + T6_dT = T2 * ( - Pds_dT ) ; + + T1 = 1.1 - ( Ps0 + T6 ); + T1_dVb = - ( Ps0_dVbs + T6_dVb ); + T1_dVd = - ( Ps0_dVds + T6_dVd ); + T1_dVg = - ( Ps0_dVgs + T6_dVg ); + T1_dT = - ( Ps0_dT + T6_dT ); + + Fn_SZ( T2 , T1 , 0.05 , T0 ) ; + T2 += small ; + T2_dVb = T1_dVb * T0 ; + T2_dVd = T1_dVd * T0 ; T2_dVg = T1_dVg * T0 ; - T3 = T4 * ( model->HSMHV_rd20 + 1.0 ) ; - Fn_SU( T7 , T2 , T3 , delta_rd , T0 ) ; - T7_dVg = T2_dVg * T0 ; + T2_dT = T1_dT * T0 ; + + T0 = beta * here->HSMHV_ptl0 ; + T0_dT = beta_dT * here->HSMHV_ptl0 ; + T3 = Cox * T0 ; + T3_dVb = Cox_dVb * T0 ; + T3_dVd = Cox_dVd * T0 ; + T3_dVg = Cox_dVg * T0 ; + T3_dT = Cox_dT * T0 + Cox * T0_dT ; + T0 = pow( T2 , model->HSMHV_ptp ) ; + T9 = T3 * T0 ; + T9_dVb = T3 * model->HSMHV_ptp * T0 / T2 * T2_dVb + T3_dVb * T0 ; + T9_dVd = T3 * model->HSMHV_ptp * T0 / T2 * T2_dVd + T3_dVd * T0 ; + T9_dVg = T3 * model->HSMHV_ptp * T0 / T2 * T2_dVg + T3_dVg * T0 ; + T9_dT = T3 * model->HSMHV_ptp * T0 / T2 * T2_dT + T3_dT * T0 ; + + + T4 = 1.0 + Vdsz * model->HSMHV_pt2 ; + T4_dVb = Vdsz_dVbs * model->HSMHV_pt2 ; + T4_dVd = Vdsz_dVds * model->HSMHV_pt2 ; + T4_dVg = 0.0 ; + T4_dT = Vdsz_dT * model->HSMHV_pt2 ; + + T0 = here->HSMHV_pt40 ; + T5 = Ps0 + T6 - Vbsz ; + T5_dVb = Ps0_dVbs + T6_dVb - Vbsz_dVbs ; + T5_dVd = Ps0_dVds + T6_dVd - Vbsz_dVds ; + T5_dVg = Ps0_dVgs + T6_dVg ; + T5_dT = Ps0_dT + T6_dT - Vbsz_dT ; + T4 += Vdsz * T0 * T5 ; + T4_dVb += Vdsz * T0 * T5_dVb + Vdsz_dVbs * T0 * T5 ; + T4_dVd += Vdsz * T0 * T5_dVd + Vdsz_dVds * T0 * T5 ; + T4_dVg += Vdsz * T0 * T5_dVg ; + T4_dT += Vdsz * T0 * T5_dT + Vdsz_dT * T0 * T5 ; + + 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_dT = T9_dT * T4 + T9 * T4_dT ; + T9 = T6 ; }else{ - T7 = here->HSMHV_rd23; - T7_dVg = 0.0e0 ; + T9 = 0.0 ; + T9_dVb = 0.0 ; + T9_dVd = 0.0 ; + T9_dVg = 0.0 ; + T9_dT = 0.0 ; } - /* after testing we can remove Vdse_eff_dVbs, Vdse_eff_dVds, Vdse_eff_dVgs + + if( model->HSMHV_gdl != 0 ){ + T1 = beta * here->HSMHV_gdl0 ; + T1_dT = beta_dT * here->HSMHV_gdl0 ; + T2 = Cox * T1 ; + T2_dVb = Cox_dVb * T1 ; + T2_dVd = Cox_dVd * T1 ; + T2_dVg = Cox_dVg * T1 ; + T2_dT = Cox_dT * T1 + Cox * T1_dT ; + T8 = T2 * Vdsz ; + T8_dVb = T2_dVb * Vdsz + T2 * Vdsz_dVbs ; + T8_dVd = T2_dVd * Vdsz + T2 * Vdsz_dVds ; + T8_dVg = T2_dVg * Vdsz ; + T8_dT = T2_dT * Vdsz + T2 * Vdsz_dT ; + }else{ + T8 = 0.0 ; + T8_dVb = 0.0 ; + T8_dVd = 0.0 ; + T8_dVg = 0.0 ; + T8_dT = 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 ) ; + Idd1_dT = Pds_dT * ( T9 + T8 ) + Pds * ( T9_dT + T8_dT ) ; + + 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 ; + Ids0_dT += T3 * Idd1_dT + T1 * Mu_dT + T2 * betaWL_dT ; + } + /* note: rpock procedure was removed. */ + if( flg_rsrd == 2 || flg_rsrd == 3 ){ + if( model->HSMHV_rd20 > 0.0 ){ + T4 = here->HSMHV_rd23 ; + T1 = pParam->HSMHV_rd24 * ( Vgse - model->HSMHV_rd25 ) ; + T1_dVg = pParam->HSMHV_rd24 ; + + Fn_SL( T2 , T1 , T4 , delta_rd , T0 ) ; + T2_dVg = T1_dVg * T0 ; + T3 = T4 * ( model->HSMHV_rd20 + 1.0 ) ; + Fn_SU( T7 , T2 , T3 , delta_rd , T0 ) ; + T7_dVg = T2_dVg * T0 ; + + }else{ + T7 = here->HSMHV_rd23; + T7_dVg = 0.0e0 ; + } + + /* after testing we can remove Vdse_eff_dVbs, Vdse_eff_dVds, Vdse_eff_dVgs and Vdse_eff_dVbse, Vdse_eff_dVgse */ - if (Vdse >= 0.0) { - Vdse_eff = Vdse ; - /* Vdse_eff_dVbs = 0.0 ; */ - /* Vdse_eff_dVds = 0.0 ; */ - /* Vdse_eff_dVgs = 0.0 ; */ - /* Vdse_eff_dVbse = 0.0 ; */ - Vdse_eff_dVdse = 1.0 ; - /* Vdse_eff_dVgse = 0.0 ; */ - } else { - Vdse_eff = 0.0 ; - /* Vdse_eff_dVbs = 0.0 ; */ - /* Vdse_eff_dVds = 0.0 ; */ - /* Vdse_eff_dVgs = 0.0 ; */ - /* Vdse_eff_dVbse = 0.0 ; */ - Vdse_eff_dVdse = 0.0 ; - /* Vdse_eff_dVgse = 0.0 ; */ - } + if (Vdse >= 0.0) { + Vdse_eff = Vdse ; + /* Vdse_eff_dVbs = 0.0 ; */ + /* Vdse_eff_dVds = 0.0 ; */ + /* Vdse_eff_dVgs = 0.0 ; */ + /* Vdse_eff_dVbse = 0.0 ; */ + Vdse_eff_dVdse = 1.0 ; + /* Vdse_eff_dVgse = 0.0 ; */ + } else { + Vdse_eff = 0.0 ; + /* Vdse_eff_dVbs = 0.0 ; */ + /* Vdse_eff_dVds = 0.0 ; */ + /* Vdse_eff_dVgs = 0.0 ; */ + /* Vdse_eff_dVbse = 0.0 ; */ + Vdse_eff_dVdse = 0.0 ; + /* Vdse_eff_dVgse = 0.0 ; */ + } - /* smoothing of Ra for Vdse_eff close to zero */ - /* ... smoothing parameter is Ra_N */ - if (Vdse_eff < Ra_N * small2) { - Ra_alpha = pow( Ra_N+1.0 , model->HSMHV_rd21-1.0 ) - * (Ra_N+1.0-0.5*model->HSMHV_rd21*Ra_N) - * pow( small2,model->HSMHV_rd21 ); - Ra_beta = 0.5*model->HSMHV_rd21 - * pow( Ra_N+1.0 , model->HSMHV_rd21-1.0 ) / Ra_N - * pow( small2, model->HSMHV_rd21-2.0 ); - T1 = Ra_alpha + Ra_beta*Vdse_eff*Vdse_eff; - T1_dVdse_eff = 2.0 * Ra_beta * Vdse_eff; + /* smoothing of Ra for Vdse_eff close to zero */ + /* ... smoothing parameter is Ra_N */ + if (Vdse_eff < Ra_N * small2) { + Ra_alpha = pow( Ra_N+1.0 , model->HSMHV_rd21-1.0 ) + * (Ra_N+1.0-0.5*model->HSMHV_rd21*Ra_N) + * pow( small2,model->HSMHV_rd21 ); + Ra_beta = 0.5*model->HSMHV_rd21 + * pow( Ra_N+1.0 , model->HSMHV_rd21-1.0 ) / Ra_N + * pow( small2, model->HSMHV_rd21-2.0 ); + T1 = Ra_alpha + Ra_beta*Vdse_eff*Vdse_eff; + T1_dVdse_eff = 2.0 * Ra_beta * Vdse_eff; + } else { + T1 = pow( Vdse_eff + small2 , model->HSMHV_rd21 ) ; + T1_dVdse_eff = model->HSMHV_rd21 * pow( Vdse_eff + small2 , model->HSMHV_rd21 - 1.0 ) ; + } + + T9 = pow( Vdse_eff + small2 , model->HSMHV_rd22d ) ; + T9_dVdse_eff = model->HSMHV_rd22d * pow( Vdse_eff + small2 , model->HSMHV_rd22d - 1.0 ) ; + + Ra = ( T7 * T1 + Vbse * pParam->HSMHV_rd22 * T9 ) / here->HSMHV_weff_nf ; + Ra_dVdse_eff = ( T7 * T1_dVdse_eff + Vbse * pParam->HSMHV_rd22 * T9_dVdse_eff ) / here->HSMHV_weff_nf ; + Ra_dVbs = Ra_dVdse_eff * Vdse_eff_dVbs ; + Ra_dVds = Ra_dVdse_eff * Vdse_eff_dVds ; + Ra_dVgs = Ra_dVdse_eff * Vdse_eff_dVgs + T7_dVg * T1 / here->HSMHV_weff_nf ; + Ra_dVbse = Ra_dVdse_eff * Vdse_eff_dVbse + pParam->HSMHV_rd22 * T9 / here->HSMHV_weff_nf ; + Ra_dVdse = Ra_dVdse_eff * Vdse_eff_dVdse ; + Ra_dVgse = Ra_dVdse_eff * Vdse_eff_dVgse ; + + T0 = Ra * Ids0 ; + T0_dVb = Ra_dVbs * Ids0 + Ra * Ids0_dVbs ; + T0_dVd = Ra_dVds * Ids0 + Ra * Ids0_dVds ; + T0_dVg = Ra_dVgs * Ids0 + Ra * Ids0_dVgs ; + T0_dT = Ra * Ids0_dT ; + + T1 = Vds + small2 ; + T2 = 1.0 / T1 ; + T3 = 1.0 + T0 * T2 ; + T3_dVb = T0_dVb * T2 ; + T3_dVd = ( T0_dVd * T1 - T0 ) * T2 * T2 ; + T3_dVg = T0_dVg * T2 ; + T3_dT = T0_dT * 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 ; + Ids_dT = ( Ids0_dT * T3 - Ids0 * T3_dT ) * T5 ; + Ids_dRa = - Ids * Ids / ( Vds + small ) ; + } else { - T1 = pow( Vdse_eff + small2 , model->HSMHV_rd21 ) ; - T1_dVdse_eff = model->HSMHV_rd21 * pow( Vdse_eff + small2 , model->HSMHV_rd21 - 1.0 ) ; + Ids = Ids0 ; + Ids_dVbs = Ids0_dVbs ; + Ids_dVds = Ids0_dVds ; + Ids_dVgs = Ids0_dVgs ; + Ids_dT = Ids0_dT ; + Ra = 0.0 ; + Ra_dVbs = Ra_dVds = Ra_dVgs = 0.0 ; + Ra_dVbse = Ra_dVdse = Ra_dVgse = 0.0 ; + Ids_dRa = 0.0 ; } - - T9 = pow( Vdse_eff + small2 , model->HSMHV_rd22d ) ; - T9_dVdse_eff = model->HSMHV_rd22d * pow( Vdse_eff + small2 , model->HSMHV_rd22d - 1.0 ) ; - - Ra = ( T7 * T1 + Vbse * pParam->HSMHV_rd22 * T9 ) / here->HSMHV_weff_nf ; - Ra_dVdse_eff = ( T7 * T1_dVdse_eff + Vbse * pParam->HSMHV_rd22 * T9_dVdse_eff ) / here->HSMHV_weff_nf ; - Ra_dVbs = Ra_dVdse_eff * Vdse_eff_dVbs ; - Ra_dVds = Ra_dVdse_eff * Vdse_eff_dVds ; - Ra_dVgs = Ra_dVdse_eff * Vdse_eff_dVgs + T7_dVg * T1 / here->HSMHV_weff_nf ; - Ra_dVbse = Ra_dVdse_eff * Vdse_eff_dVbse + pParam->HSMHV_rd22 * T9 / here->HSMHV_weff_nf ; - Ra_dVdse = Ra_dVdse_eff * Vdse_eff_dVdse ; - Ra_dVgse = Ra_dVdse_eff * Vdse_eff_dVgse ; - - T0 = Ra * Ids0 ; - T0_dVb = Ra_dVbs * Ids0 + Ra * Ids0_dVbs ; - T0_dVd = Ra_dVds * Ids0 + Ra * Ids0_dVds ; - T0_dVg = Ra_dVgs * Ids0 + Ra * Ids0_dVgs ; - T0_dT = Ra * Ids0_dT ; - - T1 = Vds + small2 ; - T2 = 1.0 / T1 ; - T3 = 1.0 + T0 * T2 ; - T3_dVb = T0_dVb * T2 ; - T3_dVd = ( T0_dVd * T1 - T0 ) * T2 * T2 ; - T3_dVg = T0_dVg * T2 ; - T3_dT = T0_dT * 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 ; - Ids_dT = ( Ids0_dT * T3 - Ids0 * T3_dT ) * T5 ; - Ids_dRa = - Ids * Ids / ( Vds + small ) ; - - } else { - Ids = Ids0 ; - Ids_dVbs = Ids0_dVbs ; - Ids_dVds = Ids0_dVds ; - Ids_dVgs = Ids0_dVgs ; - Ids_dT = Ids0_dT ; - Ra = 0.0 ; - Ra_dVbs = Ra_dVds = Ra_dVgs = 0.0 ; - Ra_dVbse = Ra_dVdse = Ra_dVgse = 0.0 ; - Ids_dRa = 0.0 ; - } - /* just for testing -- can be removed */ - /* if (!(ckt->CKTmode & MODEINITPRED)) - printf("rrb %e %e %e %e %e %e\n",ckt->CKTtime,here->HSMHV_mode*Vdse,Ra,Ra_dVdse, + /* just for testing -- can be removed */ + /* if (!(ckt->CKTmode & MODEINITPRED)) + printf("rrb %e %e %e %e %e %e\n",ckt->CKTtime,here->HSMHV_mode*Vdse,Ra,Ra_dVdse, Vdse_eff,Vdse_eff_dVdse) ; */ - /* if ( Pds < ps_conv ) { */ - if ( Pds < 0.0 ) { - Ids_dVbs = 0.0 ; - Ids_dVgs = 0.0 ; - Ids_dT = 0.0 ; - } + /* if ( Pds < ps_conv ) { */ + if ( Pds < 0.0 ) { + Ids_dVbs = 0.0 ; + Ids_dVgs = 0.0 ; + Ids_dT = 0.0 ; + } - Ids += Gdsmin * Vds ; - Ids_dVds += Gdsmin ; + Ids += Gdsmin * Vds ; + Ids_dVds += Gdsmin ; - /*-----------------------------------------------------------* - * STI - *-----------------*/ - if ( model->HSMHV_coisti != 0 ) { - /*---------------------------------------------------* - * dVthSCSTI : Short-channel effect induced by Vds (STI). - *-----------------*/ - T1 = C_ESI * Cox_inv ; - T2 = here->HSMHV_wdpl ; - T3 = here->HSMHV_lgatesm - model->HSMHV_parl2 ; - T4 = 1.0 / (T3 * T3) ; - T5 = 2.0 * (model->HSMHV_vbi - Pb20b) * T1 * T2 * T4 ; + /*-----------------------------------------------------------* + * STI + *-----------------*/ + if ( model->HSMHV_coisti != 0 ) { + /*---------------------------------------------------* + * dVthSCSTI : Short-channel effect induced by Vds (STI). + *-----------------*/ + T1 = C_ESI * Cox_inv ; + T2 = here->HSMHV_wdpl ; + T3 = here->HSMHV_lgatesm - model->HSMHV_parl2 ; + T4 = 1.0 / (T3 * T3) ; + T5 = 2.0 * (model->HSMHV_vbi - Pb20b) * T1 * T2 * T4 ; - dVth0 = T5 * sqrt_Pbsum ; - T6 = T5 * 0.5 / sqrt_Pbsum ; - T7 = 2.0 * (model->HSMHV_vbi - Pb20b) * C_ESI * T2 * T4 * sqrt_Pbsum ; - T8 = - 2.0 * 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 ; - dVth0_dT = T6 * Pbsum_dT + T8 * Pb20b_dT ; + dVth0 = T5 * sqrt_Pbsum ; + T6 = T5 * 0.5 / sqrt_Pbsum ; + T7 = 2.0 * (model->HSMHV_vbi - Pb20b) * C_ESI * T2 * T4 * sqrt_Pbsum ; + T8 = - 2.0 * 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 ; + dVth0_dT = T6 * Pbsum_dT + T8 * Pb20b_dT ; - T4 = pParam->HSMHV_scsti1 ; - T6 = pParam->HSMHV_scsti2 ; - T1 = T4 + T6 * Vdsz ; - dVthSCSTI = dVth0 * T1 ; - dVthSCSTI_dVb = dVth0_dVb * T1 + dVth0 * T6 * Vdsz_dVbs ; - dVthSCSTI_dVd = dVth0_dVd * T1 + dVth0 * T6 * Vdsz_dVds ; - dVthSCSTI_dVg = dVth0_dVg * T1 ; - dVthSCSTI_dT = dVth0_dT * T1 + dVth0 * T6 * Vdsz_dT ; + T4 = pParam->HSMHV_scsti1 ; + T6 = pParam->HSMHV_scsti2 ; + T1 = T4 + T6 * Vdsz ; + dVthSCSTI = dVth0 * T1 ; + dVthSCSTI_dVb = dVth0_dVb * T1 + dVth0 * T6 * Vdsz_dVbs ; + dVthSCSTI_dVd = dVth0_dVd * T1 + dVth0 * T6 * Vdsz_dVds ; + dVthSCSTI_dVg = dVth0_dVg * T1 ; + dVthSCSTI_dT = dVth0_dT * T1 + dVth0 * T6 * Vdsz_dT ; - T1 = pParam->HSMHV_vthsti - model->HSMHV_vdsti * Vds ; - T1_dVd = - model->HSMHV_vdsti ; + T1 = pParam->HSMHV_vthsti - model->HSMHV_vdsti * Vds ; + T1_dVd = - model->HSMHV_vdsti ; - Vgssti = Vgsz - Vfb + T1 + dVthSCSTI ; - Vgssti_dVbs = Vgsz_dVbs + dVthSCSTI_dVb ; - Vgssti_dVds = Vgsz_dVds + T1_dVd + dVthSCSTI_dVd ; - Vgssti_dVgs = Vgsz_dVgs + dVthSCSTI_dVg ; - Vgssti_dT = Vgsz_dT + dVthSCSTI_dT ; + Vgssti = Vgsz - Vfb + T1 + dVthSCSTI ; + Vgssti_dVbs = Vgsz_dVbs + dVthSCSTI_dVb ; + Vgssti_dVds = Vgsz_dVds + T1_dVd + dVthSCSTI_dVd ; + Vgssti_dVgs = Vgsz_dVgs + dVthSCSTI_dVg ; + Vgssti_dT = Vgsz_dT + dVthSCSTI_dT ; - costi0 = here->HSMHV_costi0 ; - costi1 = here->HSMHV_costi1 ; + costi0 = here->HSMHV_costi0 ; + costi1 = here->HSMHV_costi1 ; - costi3 = here->HSMHV_costi0_p2 * Cox_inv * Cox_inv ; - T1 = 2.0 * here->HSMHV_costi0_p2 * Cox_inv ; - costi3_dVb = T1 * Cox_inv_dVb ; - costi3_dVd = T1 * Cox_inv_dVd ; - costi3_dVg = T1 * Cox_inv_dVg ; - costi3_dT = 2 * here->HSMHV_costi0 * here->HSMHV_costi00 * 0.5 / sqrt(here->HSMHV_beta_inv) * beta_inv_dT * Cox_inv * Cox_inv ; - T2 = 1.0 / costi3 ; - costi3_dVb_c3 = costi3_dVb * T2 ; - costi3_dVd_c3 = costi3_dVd * T2 ; - costi3_dVg_c3 = costi3_dVg * T2 ; -/* costi3_dT_c3 = costi3_dT * T2 ;*/ + costi3 = here->HSMHV_costi0_p2 * Cox_inv * Cox_inv ; + T1 = 2.0 * here->HSMHV_costi0_p2 * Cox_inv ; + costi3_dVb = T1 * Cox_inv_dVb ; + costi3_dVd = T1 * Cox_inv_dVd ; + costi3_dVg = T1 * Cox_inv_dVg ; + costi3_dT = 2 * here->HSMHV_costi0 * here->HSMHV_costi00 * 0.5 / sqrt(here->HSMHV_beta_inv) * beta_inv_dT * Cox_inv * Cox_inv ; + T2 = 1.0 / costi3 ; + costi3_dVb_c3 = costi3_dVb * T2 ; + costi3_dVd_c3 = costi3_dVd * T2 ; + costi3_dVg_c3 = costi3_dVg * T2 ; + costi3_dT_c3 = costi3_dT * T2 ; - costi4 = costi3 * beta * 0.5 ; - costi4_dT = ( costi3_dT * beta + costi3 * beta_dT ) * 0.5 ; - costi5 = costi4 * beta * 2.0 ; - costi5_dT = ( costi4_dT * beta + costi4 * beta_dT ) * 2.0 ; + costi4 = costi3 * beta * 0.5 ; + costi4_dT = ( costi3_dT * beta + costi3 * beta_dT ) * 0.5 ; + costi5 = costi4 * beta * 2.0 ; + costi5_dT = ( costi4_dT * beta + costi4 * beta_dT ) * 2.0 ; - T11 = beta * 0.25 ; - T11_dT = beta_dT * 0.25 ; - T10 = beta_inv - costi3 * T11 + Vfb - pParam->HSMHV_vthsti - dVthSCSTI + small ; - T10_dVb = - T11 * costi3_dVb - dVthSCSTI_dVb ; - T10_dVd = - T11 * costi3_dVd - dVthSCSTI_dVd ; - T10_dVg = - T11 * costi3_dVg - dVthSCSTI_dVg ; - T10_dT = beta_inv_dT - ( costi3_dT * T11 + costi3 * T11_dT ) - dVthSCSTI_dT ; + T11 = beta * 0.25 ; + T11_dT = beta_dT * 0.25 ; + T10 = beta_inv - costi3 * T11 + Vfb - pParam->HSMHV_vthsti - dVthSCSTI + small ; + T10_dVb = - T11 * costi3_dVb - dVthSCSTI_dVb ; + T10_dVd = - T11 * costi3_dVd - dVthSCSTI_dVd ; + T10_dVg = - T11 * costi3_dVg - dVthSCSTI_dVg ; + T10_dT = beta_inv_dT - ( costi3_dT * T11 + costi3 * T11_dT ) - dVthSCSTI_dT ; - T1 = Vgsz - T10 - psisti_dlt ; - T1_dVb = Vgsz_dVbs - T10_dVb ; - T1_dVd = Vgsz_dVds - T10_dVd ; - T1_dVg = Vgsz_dVgs - T10_dVg ; - T1_dT = - T10_dT ; - T0 = Fn_Sgn(T10) ; - T2 = sqrt (T1 * T1 + T0 * 4.0 * T10 * psisti_dlt) ; - T3 = T10 + 0.5 * (T1 + T2) - Vfb + pParam->HSMHV_vthsti + dVthSCSTI - Vbsz ; - T3_dVb = T10_dVb + 0.5 * (T1_dVb + (T1 * T1_dVb + T0 * 2.0 * T10_dVb * psisti_dlt) / T2) - + dVthSCSTI_dVb - Vbsz_dVbs ; - T3_dVd = T10_dVd + 0.5 * (T1_dVd + (T1 * T1_dVd + T0 * 2.0 * T10_dVd * psisti_dlt) / T2) - + dVthSCSTI_dVd - Vbsz_dVds ; - T3_dVg = T10_dVg + 0.5 * (T1_dVg + (T1 * T1_dVg + T0 * 2.0 * T10_dVg * psisti_dlt) / T2) - + dVthSCSTI_dVg ; - T3_dT = T10_dT + 0.5 * (T1_dT + (T1 * T1_dT + T0 * 2.0 * T10_dT * psisti_dlt) / T2) - + dVthSCSTI_dT - Vbsz_dT ; + T1 = Vgsz - T10 - psisti_dlt ; + T1_dVb = Vgsz_dVbs - T10_dVb ; + T1_dVd = Vgsz_dVds - T10_dVd ; + T1_dVg = Vgsz_dVgs - T10_dVg ; + T1_dT = Vgsz_dT - T10_dT ; + T0 = Fn_Sgn(T10) ; + T2 = sqrt (T1 * T1 + T0 * 4.0 * T10 * psisti_dlt) ; + T3 = T10 + 0.5 * (T1 + T2) - Vfb + pParam->HSMHV_vthsti + dVthSCSTI - Vbsz ; + T3_dVb = T10_dVb + 0.5 * (T1_dVb + (T1 * T1_dVb + T0 * 2.0 * T10_dVb * psisti_dlt) / T2) + + dVthSCSTI_dVb - Vbsz_dVbs ; + T3_dVd = T10_dVd + 0.5 * (T1_dVd + (T1 * T1_dVd + T0 * 2.0 * T10_dVd * psisti_dlt) / T2) + + dVthSCSTI_dVd - Vbsz_dVds ; + T3_dVg = T10_dVg + 0.5 * (T1_dVg + (T1 * T1_dVg + T0 * 2.0 * T10_dVg * psisti_dlt) / T2) + + dVthSCSTI_dVg ; + T3_dT = T10_dT + 0.5 * (T1_dT + (T1 * T1_dT + T0 * 2.0 * T10_dT * psisti_dlt) / T2) + + dVthSCSTI_dT - Vbsz_dT ; - T4 = beta * T3 - 1.0 ; - T4_dT = beta_dT * T3 + beta * T3_dT ; - T5 = 4.0 / costi5 ; - T5_dT = - 4.0 / ( costi5 * costi5 ) * costi5_dT ; - T1 = 1.0 + T4 * T5 ; - T6 = beta * T5 ; - T7 = T4 * T5 ; - T1_dVb = (T6 * T3_dVb - T7 * costi3_dVb_c3) ; - T1_dVd = (T6 * T3_dVd - T7 * costi3_dVd_c3) ; - T1_dVg = (T6 * T3_dVg - T7 * costi3_dVg_c3) ; - T1_dT = T4_dT * T5 + T4 * T5_dT ; - Fn_SZ( T1 , T1, 1.0e-2, T2) ; - T1_dVb *= T2 ; - T1_dVd *= T2 ; - T1_dVg *= T2 ; - T1_dT *= T2 ; - costi6 = sqrt(T1) ; - costi6_dT = 0.5 / sqrt(T1) * T1_dT ; - T0 = costi4 * (1.0 - costi6) ; - T0_dT = costi4_dT * (1.0 - costi6) + costi4 * ( - costi6_dT ) ; - Psasti = Vgssti + T0 ; - T2 = 0.5 * costi4 / costi6 ; - Psasti_dVbs = Vgssti_dVbs + costi3_dVb_c3 * T0 - T2 * T1_dVb ; - Psasti_dVds = Vgssti_dVds + costi3_dVd_c3 * T0 - T2 * T1_dVd ; - Psasti_dVgs = Vgssti_dVgs + costi3_dVg_c3 * T0 - T2 * T1_dVg ; - Psasti_dT = Vgssti_dT + T0_dT ; + T4 = beta * T3 - 1.0 ; + T4_dT = beta_dT * T3 + beta * T3_dT ; + T5 = 4.0 / costi5 ; + T5_dT = - 4.0 / ( costi5 * costi5 ) * costi5_dT ; + T1 = 1.0 + T4 * T5 ; + T6 = beta * T5 ; + T7 = T4 * T5 ; + T1_dVb = (T6 * T3_dVb - T7 * costi3_dVb_c3) ; + T1_dVd = (T6 * T3_dVd - T7 * costi3_dVd_c3) ; + T1_dVg = (T6 * T3_dVg - T7 * costi3_dVg_c3) ; + T1_dT = T4_dT * T5 + T4 * T5_dT ; + Fn_SZ( T1 , T1, 1.0e-2, T2) ; + T1 += small ; + T1_dVb *= T2 ; + T1_dVd *= T2 ; + T1_dVg *= T2 ; + T1_dT *= T2 ; + costi6 = sqrt(T1) ; + costi6_dT = 0.5 / sqrt(T1) * T1_dT ; + T0 = costi4 * (1.0 - costi6) ; + T0_dT = costi4_dT * (1.0 - costi6) + costi4 * ( - costi6_dT ) ; + Psasti = Vgssti + T0 ; + T2 = 0.5 * costi4 / costi6 ; + Psasti_dVbs = Vgssti_dVbs + costi3_dVb_c3 * T0 - T2 * T1_dVb ; + Psasti_dVds = Vgssti_dVds + costi3_dVd_c3 * T0 - T2 * T1_dVd ; + Psasti_dVgs = Vgssti_dVgs + costi3_dVg_c3 * T0 - T2 * T1_dVg ; + Psasti_dT = Vgssti_dT + T0_dT ; - T0 = 1.0 / (beta + 2.0 / (Vgssti + small)) ; - T0_dT = - 1.0 / ((beta + 2.0 / (Vgssti + small)) * (beta + 2.0 / (Vgssti + small))) * ( beta_dT - 2 / ((Vgssti + small) * (Vgssti + small)) * Vgssti_dT ); - Psbsti = log (1.0 / costi1 / costi3 * (Vgssti * Vgssti)) * T0 ; - T1 = 1 / costi1 / costi3 * (Vgssti * Vgssti) ; + T0 = 1.0 / (beta + 2.0 / (Vgssti + small)) ; + T0_dT = - 1.0 / ((beta + 2.0 / (Vgssti + small)) * (beta + 2.0 / (Vgssti + small))) * ( beta_dT - 2 / ((Vgssti + small) * (Vgssti + small)) * Vgssti_dT ); + Psbsti = log (1.0 / costi1 / costi3 * (Vgssti * Vgssti)) * T0 ; + T1 = 1 / costi1 / costi3 * (Vgssti * Vgssti) ; - costi1_dT = 2 * here->HSMHV_nin * Nin_dT * here->HSMHV_nsti_p2 ; + costi1_dT = 2 * here->HSMHV_nin * Nin_dT * here->HSMHV_nsti_p2 ; - T1_dT = ( - 1 / costi1 / costi1 * costi1_dT / costi3 - 1 / costi3 / costi3 * costi3_dT / costi1 ) * Vgssti * Vgssti + 1 / costi1 / costi3 * 2 * Vgssti * Vgssti_dT ; - T2 = 2.0 * T0 / (Vgssti + small) ; - T3 = Psbsti / (Vgssti + small) ; - Psbsti_dVbs = T2 * (Vgssti_dVbs - 0.5 * costi3_dVb_c3 * Vgssti + T1_dT = ( - 1 / costi1 / costi1 * costi1_dT / costi3 - 1 / costi3 / costi3 * costi3_dT / costi1 ) * Vgssti * Vgssti + 1 / costi1 / costi3 * 2 * Vgssti * Vgssti_dT ; + T2 = 2.0 * T0 / (Vgssti + small) ; + T3 = Psbsti / (Vgssti + small) ; + Psbsti_dVbs = T2 * (Vgssti_dVbs - 0.5 * costi3_dVb_c3 * Vgssti + T3 * Vgssti_dVbs ) ; - Psbsti_dVds = T2 * (Vgssti_dVds - 0.5 * costi3_dVd_c3 * Vgssti + Psbsti_dVds = T2 * (Vgssti_dVds - 0.5 * costi3_dVd_c3 * Vgssti + T3 * Vgssti_dVds ) ; - Psbsti_dVgs = T2 * (Vgssti_dVgs - 0.5 * costi3_dVg_c3 * Vgssti + Psbsti_dVgs = T2 * (Vgssti_dVgs - 0.5 * costi3_dVg_c3 * Vgssti + T3 * Vgssti_dVgs ) ; - Psbsti_dT = 1 / T1 * T1_dT * T0 + log( T1 ) * T0_dT ; + Psbsti_dT = 1 / T1 * T1_dT * T0 + log( T1 ) * T0_dT ; - Psab = Psbsti - Psasti - sti2_dlt ; - Psab_dVbs = Psbsti_dVbs - Psasti_dVbs ; - Psab_dVds = Psbsti_dVds - Psasti_dVds ; - Psab_dVgs = Psbsti_dVgs - Psasti_dVgs ; - Psab_dT = Psbsti_dT - Psasti_dT ; - T0 = sqrt (Psab * Psab + 4.0 * sti2_dlt * Psbsti) ; - Psti = Psbsti - 0.5 * (Psab + T0) ; - T1 = 1.0 / T0 ; - Psti_dVbs = Psbsti_dVbs - - 0.5 * ( Psab_dVbs + Psab = Psbsti - Psasti - sti2_dlt ; + Psab_dVbs = Psbsti_dVbs - Psasti_dVbs ; + Psab_dVds = Psbsti_dVds - Psasti_dVds ; + Psab_dVgs = Psbsti_dVgs - Psasti_dVgs ; + Psab_dT = Psbsti_dT - Psasti_dT ; + T0 = sqrt (Psab * Psab + 4.0 * sti2_dlt * Psbsti) ; + Psti = Psbsti - 0.5 * (Psab + T0) ; + T1 = 1.0 / T0 ; + Psti_dVbs = Psbsti_dVbs + - 0.5 * ( Psab_dVbs + ( Psab * Psab_dVbs + 2.0 * sti2_dlt * Psbsti_dVbs ) * T1 ) ; - Psti_dVds = Psbsti_dVds - - 0.5 * ( Psab_dVds + Psti_dVds = Psbsti_dVds + - 0.5 * ( Psab_dVds + ( Psab * Psab_dVds + 2.0 * sti2_dlt * Psbsti_dVds ) * T1 ) ; - Psti_dVgs = Psbsti_dVgs - - 0.5 * ( Psab_dVgs + Psti_dVgs = Psbsti_dVgs + - 0.5 * ( Psab_dVgs + ( Psab * Psab_dVgs + 2.0 * sti2_dlt * Psbsti_dVgs ) * T1 ) ; - Psti_dT = Psbsti_dT - - 0.5 * ( Psab_dT + Psti_dT = Psbsti_dT + - 0.5 * ( Psab_dT + ( Psab * Psab_dT + 2.0 * sti2_dlt * Psbsti_dT ) * T1 ) ; - T0 = costi1 * exp (beta * Psti) ; - T0_dT = costi1_dT * exp(beta * Psti) + costi1 * exp(beta * Psti) * ( beta_dT * Psti + beta * Psti_dT ) ; - T1 = beta * (Psti - Vbsz) - 1.0 + T0 ; - T1_dVb = beta * ((Psti_dVbs - Vbsz_dVbs) + T0 * Psti_dVbs) ; - T1_dVd = beta * ((Psti_dVds - Vbsz_dVds) + T0 * Psti_dVds) ; - T1_dVg = beta * (Psti_dVgs + T0 * Psti_dVgs) ; - T1_dT = beta_dT * (Psti - Vbsz) + beta * (Psti_dT - Vbsz_dT) + T0_dT ; - Fn_SZ ( T1 , T1, 1.0e-2, T0) ; - T1 += epsm10 ; - T1_dVb *= T0 ; - T1_dVd *= T0 ; - T1_dVg *= T0 ; - T1_dT *= T0 ; - sq1sti = sqrt (T1); - T2 = 0.5 / sq1sti ; - sq1sti_dVbs = T2 * T1_dVb ; - sq1sti_dVds = T2 * T1_dVd ; - sq1sti_dVgs = T2 * T1_dVg ; - sq1sti_dT = T2 * T1_dT ; + T0 = costi1 * exp (beta * Psti) ; + T0_dT = costi1_dT * exp(beta * Psti) + costi1 * exp(beta * Psti) * ( beta_dT * Psti + beta * Psti_dT ) ; + T1 = beta * (Psti - Vbsz) - 1.0 + T0 ; + T1_dVb = beta * ((Psti_dVbs - Vbsz_dVbs) + T0 * Psti_dVbs) ; + T1_dVd = beta * ((Psti_dVds - Vbsz_dVds) + T0 * Psti_dVds) ; + T1_dVg = beta * (Psti_dVgs + T0 * Psti_dVgs) ; + T1_dT = beta_dT * (Psti - Vbsz) + beta * (Psti_dT - Vbsz_dT) + T0_dT ; + Fn_SZ ( T1 , T1, 1.0e-2, T0) ; + T1 += small ; + T1_dVb *= T0 ; + T1_dVd *= T0 ; + T1_dVg *= T0 ; + T1_dT *= T0 ; + sq1sti = sqrt (T1); + T2 = 0.5 / sq1sti ; + sq1sti_dVbs = T2 * T1_dVb ; + sq1sti_dVds = T2 * T1_dVd ; + sq1sti_dVgs = T2 * T1_dVg ; + sq1sti_dT = T2 * T1_dT ; - T1 = beta * (Psti - Vbsz) - 1.0; - T1_dVb = beta * (Psti_dVbs - Vbsz_dVbs) ; - T1_dVd = beta * (Psti_dVds - Vbsz_dVds) ; - T1_dVg = beta * Psti_dVgs ; - T1_dT = beta_dT * ( Psti - Vbsz ) + beta * (Psti_dT - Vbsz_dT) ; - Fn_SZ( T1 , T1, 1.0e-2, T0) ; - T1 += epsm10 ; - T1_dVb *= T0 ; - T1_dVd *= T0 ; - T1_dVg *= T0 ; - T1_dT *= T0 ; - sq2sti = sqrt (T1); - T2 = 0.5 / sq2sti ; - sq2sti_dVbs = T2 * T1_dVb ; - sq2sti_dVds = T2 * T1_dVd ; - sq2sti_dVgs = T2 * T1_dVg ; - sq2sti_dT = T2 * T1_dT ; + T1 = beta * (Psti - Vbsz) - 1.0; + T1_dVb = beta * (Psti_dVbs - Vbsz_dVbs) ; + T1_dVd = beta * (Psti_dVds - Vbsz_dVds) ; + T1_dVg = beta * Psti_dVgs ; + T1_dT = beta_dT * ( Psti - Vbsz ) + beta * (Psti_dT - Vbsz_dT) ; + Fn_SZ( T1 , T1, 1.0e-2, T0) ; + T1 += small ; + T1_dVb *= T0 ; + T1_dVd *= T0 ; + T1_dVg *= T0 ; + T1_dT *= T0 ; + sq2sti = sqrt (T1); + T2 = 0.5 / sq2sti ; + sq2sti_dVbs = T2 * T1_dVb ; + sq2sti_dVds = T2 * T1_dVd ; + sq2sti_dVgs = T2 * T1_dVg ; + sq2sti_dT = T2 * T1_dT ; - Qn0sti = costi0 * (sq1sti - sq2sti) ; - Qn0sti_dVbs = costi0 * (sq1sti_dVbs - sq2sti_dVbs) ; - Qn0sti_dVds = costi0 * (sq1sti_dVds - sq2sti_dVds) ; - Qn0sti_dVgs = costi0 * (sq1sti_dVgs - sq2sti_dVgs) ; - Qn0sti_dT = costi0 * (sq1sti_dT - sq2sti_dT) + here->HSMHV_costi00 * 0.5 / sqrt( here->HSMHV_beta_inv ) * beta_inv_dT * (sq1sti - sq2sti) ; + Qn0sti = costi0 * (sq1sti - sq2sti) ; + Qn0sti_dVbs = costi0 * (sq1sti_dVbs - sq2sti_dVbs) ; + Qn0sti_dVds = costi0 * (sq1sti_dVds - sq2sti_dVds) ; + Qn0sti_dVgs = costi0 * (sq1sti_dVgs - sq2sti_dVgs) ; + Qn0sti_dT = costi0 * (sq1sti_dT - sq2sti_dT) + here->HSMHV_costi00 * 0.5 / sqrt( here->HSMHV_beta_inv ) * beta_inv_dT * (sq1sti - sq2sti) ; - /* T1: Vdsatsti */ - T1 = Psasti - Psti ; - T1_dVb = Psasti_dVbs - Psti_dVbs ; - T1_dVd = Psasti_dVds - Psti_dVds ; - T1_dVg = Psasti_dVgs - Psti_dVgs ; - T1_dT = Psasti_dT - Psti_dT ; + /* T1: Vdsatsti */ + T1 = Psasti - Psti ; + T1_dVb = Psasti_dVbs - Psti_dVbs ; + T1_dVd = Psasti_dVds - Psti_dVds ; + T1_dVg = Psasti_dVgs - Psti_dVgs ; + T1_dT = Psasti_dT - Psti_dT ; - Fn_SZ( T1 , T1 , 1.0e-1 , T2 ) ; - T1_dVb *= T2 ; - T1_dVd *= T2 ; - T1_dVg *= T2 ; - T1_dT *= T2 ; + Fn_SZ( T1 , T1 , 1.0e-1 , T2 ) ; + T1 += small ; + T1_dVb *= T2 ; + T1_dVd *= T2 ; + T1_dVg *= T2 ; + T1_dT *= T2 ; - TX = Vds / T1 ; - T2 = 1.0 / ( T1 * T1 ) ; - TX_dVbs = T2 * ( - Vds * T1_dVb ) ; - TX_dVds = T2 * ( T1 - Vds * T1_dVd ) ; - TX_dVgs = T2 * ( - Vds * T1_dVg ) ; - TX_dT = T2 * ( - Vds * T1_dT ) ; + TX = Vds / T1 ; + T2 = 1.0 / ( T1 * T1 ) ; + TX_dVbs = T2 * ( - Vds * T1_dVb ) ; + TX_dVds = T2 * ( T1 - Vds * T1_dVd ) ; + TX_dVgs = T2 * ( - Vds * T1_dVg ) ; + TX_dT = T2 * ( - Vds * T1_dT ) ; - Fn_CP( TY , TX , 1.0 , 4 , T2 ) ; - TY_dVbs = T2 * TX_dVbs ; - TY_dVds = T2 * TX_dVds ; - TY_dVgs = T2 * TX_dVgs ; - TY_dT = T2 * TX_dT ; + Fn_CP( TY , TX , 1.0 , 4 , T2 ) ; + TY_dVbs = T2 * TX_dVbs ; + TY_dVds = T2 * TX_dVds ; + TY_dVgs = T2 * TX_dVgs ; + TY_dT = T2 * TX_dT ; - costi7 = 2.0 * here->HSMHV_wsti * here->HSMHV_nf * beta_inv ; - costi7_dT = 2.0 * here->HSMHV_wsti * here->HSMHV_nf * beta_inv_dT ; - T1 = Lch ; - Idssti = costi7 * Mu * Qn0sti * TY / T1 ; - T3 = 1.0 / T1 ; - T4 = Mu * Qn0sti * TY / T1 / T1 ; - T5 = Mu * Qn0sti ; - Idssti_dVbs = costi7 * (((Mu_dVbs * Qn0sti + Mu * Qn0sti_dVbs) * TY + costi7 = 2.0 * here->HSMHV_wsti * here->HSMHV_nf * beta_inv ; + costi7_dT = 2.0 * here->HSMHV_wsti * here->HSMHV_nf * beta_inv_dT ; + T1 = Lch ; + Idssti = costi7 * Mu * Qn0sti * TY / T1 ; + T3 = 1.0 / T1 ; + T4 = Mu * Qn0sti * TY / T1 / T1 ; + T5 = Mu * Qn0sti ; + Idssti_dVbs = costi7 * (((Mu_dVbs * Qn0sti + Mu * Qn0sti_dVbs) * TY + T5 * TY_dVbs ) * T3 - Lch_dVbs * T4 ) ; - Idssti_dVds = costi7 * (((Mu_dVds * Qn0sti + Mu * Qn0sti_dVds) * TY + Idssti_dVds = costi7 * (((Mu_dVds * Qn0sti + Mu * Qn0sti_dVds) * TY + T5 * TY_dVds ) * T3 - Lch_dVds * T4 ) ; - Idssti_dVgs = costi7 * (((Mu_dVgs * Qn0sti + Mu * Qn0sti_dVgs) * TY + Idssti_dVgs = costi7 * (((Mu_dVgs * Qn0sti + Mu * Qn0sti_dVgs) * TY + T5 * TY_dVgs ) * T3 - Lch_dVgs * T4 ) ; - Idssti_dT = costi7 * (((Mu_dT * Qn0sti + Mu * Qn0sti_dT) * TY + Idssti_dT = costi7 * (((Mu_dT * Qn0sti + Mu * Qn0sti_dT) * TY + T5 * TY_dT ) * T3 - Lch_dT * T4 ) + costi7_dT * Mu * Qn0sti * TY / T1 ; - Ids = Ids + Idssti ; - Ids_dVbs = Ids_dVbs + Idssti_dVbs ; - Ids_dVds = Ids_dVds + Idssti_dVds ; - Ids_dVgs = Ids_dVgs + Idssti_dVgs ; - Ids_dT = Ids_dT + Idssti_dT ; + Ids = Ids + Idssti ; + Ids_dVbs = Ids_dVbs + Idssti_dVbs ; + Ids_dVds = Ids_dVds + Idssti_dVds ; + Ids_dVgs = Ids_dVgs + Idssti_dVgs ; + Ids_dT = Ids_dT + Idssti_dT ; - } + } + /*----------------------------------------------------------* + * induced gate noise. ( Part 1/3 ) + *----------------------*/ + if ( model->HSMHV_coign != 0 && model->HSMHV_cothrml != 0 && model->HSMHV_codep==0 ) { + kusai00 = VgVt * VgVt ; + kusaidd = 2.0e0 * beta_inv * Cox_inv * Idd ; + kusaiL = kusai00 - kusaidd ; + Fn_SZ( kusai00 , kusai00 , 1.0e-3 , T0 ) ; + kusai00 += small ; + Fn_SZ( kusaiL , kusaiL , 1.0e-3 , T0 ) ; + kusaiL += small ; + kusai00L = kusai00 - kusaiL ; + if ( Qn0 < epsm10 || kusai00L < epsm10 ) flg_ign = 0 ; + else flg_ign = 1 ; + } + /*-----------------------------------------------------------* + * End of PART-1. (label) + *-----------------*/ + end_of_part_1: - /*----------------------------------------------------------* - * induced gate noise. ( Part 1/3 ) - *----------------------*/ - if ( model->HSMHV_coign != 0 && model->HSMHV_cothrml != 0 ) { - kusai00 = VgVt * VgVt ; - kusaidd = 2.0e0 * beta_inv * Cox_inv * Idd ; - kusaiL = kusai00 - kusaidd ; - Fn_SZ( kusai00 , kusai00 , 1.0e-3 , T0 ) ; - Fn_SZ( kusaiL , kusaiL , 1.0e-3 , T0 ) ; - kusai00L = kusai00 - kusaiL ; - if ( Qn0 < epsm10 || kusai00L < epsm10 ) flg_ign = 0 ; - else flg_ign = 1 ; - } + + /*-----------------------------------------------------------* + * Implicit quantities related to Alpha. + *-----------------*/ + if ( flg_noqi == 0 && VgVt > VgVt_small ) { + Delta = fac1 * beta / ( 2 * Xi0p12 ) ; + Pslsat = VgVt / ( 1.0 + Delta ) + Ps0 ; + } else { + Pslsat = 0.0 ; + } + Vdsat = Pslsat - Pb2 ; + if ( Vdsat < 0.0 ) { + Vdsat = 0.0 ; + } + + // Qiu for noise calc. + Qiu_noi = Qiu ; - /*-----------------------------------------------------------* - * End of PART-1. (label) - *-----------------*/ - end_of_part_1: - - /*----------------------------------------------------------* - * Evaluate integrated charges in unit [C]. - *----------------------*/ + } // end of normal mode MOSFET + + /*----------------------------------------------------------* + * Evaluate integrated charges in unit [C]. + *----------------------*/ T1 = - here->HSMHV_weffcv_nf * Leff ; @@ -4278,19 +4354,22 @@ start_of_mobility: Qb_dVds = T1 * Qbu_dVds ; Qb_dVgs = T1 * Qbu_dVgs ; Qb_dT = T1 * Qbu_dT ; - + Qi = T1 * Qiu ; Qi_dVbs = T1 * Qiu_dVbs ; Qi_dVds = T1 * Qiu_dVds ; Qi_dVgs = T1 * Qiu_dVgs ; Qi_dT = T1 * Qiu_dT ; - + Qd = Qi * Qdrat ; Qd_dVbs = Qi_dVbs * Qdrat + Qi * Qdrat_dVbs ; Qd_dVds = Qi_dVds * Qdrat + Qi * Qdrat_dVds ; Qd_dVgs = Qi_dVgs * Qdrat + Qi * Qdrat_dVgs ; Qd_dT = Qi_dT * Qdrat + Qi * Qdrat_dT ; + // Qiu for noise calc. + Qi_noi = T1*Qiu_noi ; + /*-----------------------------------------------------------* * Modified potential for symmetry. @@ -4319,6 +4398,14 @@ start_of_mobility: Ps0z_dT = Ps0_dT + Pzadd_dT ; + /*-----------------------------------------------------------* + * Channel leakage current. + *-----------------*/ + + Ids += Weff/Leff * model->HSMHV_gdsleak * Vds ; + Ids_dVds += Weff/Leff * model->HSMHV_gdsleak ; + + /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * PART-2: Substrate / gate / leak currents *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ @@ -4327,7 +4414,7 @@ start_of_mobility: * Isub : substrate current induced by impact ionization. *-----------------*/ - if ( flg_noqi == 1 || model->HSMHV_coisub == 0 ) { + if ( model->HSMHV_coisub == 0 ) { /* Accumulation zone or nonconductive case, in which Ids==0. */ Isub = 0.0e0 ; Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ; @@ -4349,7 +4436,7 @@ start_of_mobility: T3 = T8 / T7 ; T9 = 2.0 / T8 ; - T4 = 1.0e0 + T9 * T7 ; + T4 = T9 * T7 ; T2 = here->HSMHV_xvbs ; T5 = T1 - beta_inv - T2 * Vbsz ; @@ -4358,7 +4445,7 @@ start_of_mobility: T5_dVb = T1_dVb - T2 * Vbsz_dVbs; T5_dT = - beta_inv_dT + T1_dT - T2 * Vbsz_dT ; - T6 = T4 * T5 ; + T6 = 1.0 + T4 * T5 ; T6_dVd = T4 * T5_dVd ; T6_dVg = T4 * T5_dVg ; T6_dVb = T4 * T5_dVb ; @@ -4430,17 +4517,19 @@ start_of_mobility: *-----------------*/ T8 = here->HSMHV_subld1 ; if ( T8 != 0.0 ) { - T0 = ( Vdse + Ps0 - Psdl ) ; - T0_dVb = Ps0_dVbs - Psdl_dVbs ; - T0_dVd = Ps0_dVds - Psdl_dVds ; - T0_dVg = Ps0_dVgs - Psdl_dVgs ; - T0_dT = Ps0_dT - Psdl_dT ; + T0 = Vddp ; + T0_dVb = 0.0e0 ; + T0_dVd = 0.0e0 ; + T0_dVg = 0.0e0 ; + T0_dT = 0.0e0 ; + T0_dVddp = 1.0e0 ; Fn_SZ( T0, T0, 1e-6, T1 ) ; T0_dVb *= T1 ; T0_dVd *= T1 ; T0_dVg *= T1 ; T0_dT *= T1 ; + T0_dVddp *= T1 ; T1 = sqrt( VgVt + small ) ; T3 = 1.0 / ( 2.0 * T1 ) ; @@ -4449,29 +4538,61 @@ start_of_mobility: T1_dVg = VgVt_dVgs * T3 ; T1_dT = VgVt_dT * T3 ; + T4 = T0 - model->HSMHV_xpvdth * ( 1.0 + model->HSMHV_xpvdthg * Vgs ) ; + T4_dVb = T0_dVb ; + T4_dVd = T0_dVd ; + T4_dVg = T0_dVg - model->HSMHV_xpvdth * model->HSMHV_xpvdthg ; + T4_dT = T0_dT ; + T4_dVddp = T0_dVddp ; + + Fn_SZ( T4, T4, 1.0e-2, T9 ) ; + T4 += small ; + T4_dVb *= T9 ; + T4_dVd *= T9 ; + T4_dVg *= T9 ; + T4_dT *= T9 ; + T4_dVddp *= T9 ; + + T10 = here->HSMHV_xpdv * model->HSMHV_xldld * exp( - 1.0e0 / T4 ) ; + T11 = T10 * ( 1.0 + 1.0 / T4 ) ; + T3 = T4 * T10 ; + T3_dVb = T4_dVb * T11 ; + T3_dVd = T4_dVd * T11 ; + T3_dVg = T4_dVg * T11 ; + T3_dT = T4_dT * T11 ; + T3_dVddp = T4_dVddp * T11 ; + + T0 = T0 - T3 ; + T0_dVb = T0_dVb - T3_dVb ; + T0_dVd = T0_dVd - T3_dVd ; + T0_dVg = T0_dVg - T3_dVg ; + T0_dT = T0_dT - T3_dT ; + T0_dVddp = T0_dVddp - T3_dVddp ; + + Fn_SZ( T0, T0, 1.0e-2 , T9 ) ; + T0 += small; + T0_dVb *= T9 ; + T0_dVd *= T9 ; + T0_dVg *= T9 ; + T0_dT *= T9 ; + T0_dVddp *= T9 ; + T4 = 1.0 / ( T0 * T1 ) ; - T7 = Ldrift * hereMKS->HSMHV_subld2 ; + T7 = Ldrift0 * modelMKS->HSMHV_subld2 ; T2= exp( - T7 * T4 ); T6 = T7 * T2 * T4 * T4 ; T2_dVb = ( T0_dVb * T1 + T0 * T1_dVb ) * T6 ; T2_dVd = ( T0_dVd * T1 + T0 * T1_dVd ) * T6 ; T2_dVg = ( T0_dVg * T1 + T0 * T1_dVg ) * T6 ; T2_dT = ( T0_dT * T1 + T0 * T1_dT ) * T6 ; - T2_dVdse = T1 * T6 ; + T2_dVddp = T0_dVddp * T1 * T6 ; - T5 = T8 * Ids * T0 * T2 ; - T5_dVb = T8 * ( Ids_dVbs * T0 * T2 + Ids * T0_dVb * T2 + Ids * T0 * T2_dVb ) ; - T5_dVd = T8 * ( Ids_dVds * T0 * T2 + Ids * T0_dVd * T2 + Ids * T0 * T2_dVd ) ; - T5_dVg = T8 * ( Ids_dVgs * T0 * T2 + Ids * T0_dVg * T2 + Ids * T0 * T2_dVg ) ; - T5_dT = T8 * ( Ids_dT * T0 * T2 + Ids * T0_dT * T2 + Ids * T0 * T2_dT ) ; - T5_dVdse = T8 * ( Ids_dRa * Ra_dVdse * T0 * T2 + Ids * T2 + Ids * T0 * T2_dVdse ) ; - - Isub += T5 ; - Isub_dVgs += T5_dVg ; - Isub_dVds += T5_dVd ; - Isub_dVbs += T5_dVb ; - Isub_dT += T5_dT ; - Isub_dVdse += T5_dVdse ; + IsubLD = T8 * Ids * T0 * T2 ; + IsubLD_dVbs = T8 * ( Ids_dVbs * T0 * T2 + Ids * T0_dVb * T2 + Ids * T0 * T2_dVb ) ; + IsubLD_dVds = T8 * ( Ids_dVds * T0 * T2 + Ids * T0_dVd * T2 + Ids * T0 * T2_dVd ) ; + IsubLD_dVgs = T8 * ( Ids_dVgs * T0 * T2 + Ids * T0_dVg * T2 + Ids * T0 * T2_dVg ) ; + IsubLD_dT = T8 * ( Ids_dT * T0 * T2 + Ids * T0_dT * T2 + Ids * T0 * T2_dT ) ; + IsubLD_dVddp = T8 * Ids * (T0_dVddp * T2 + T0 * T2_dVddp ) ; } } @@ -4480,15 +4601,17 @@ start_of_mobility: /*---------------------------------------------------* * Impact-Ionization Induced Bulk Potential Change (IBPC) *-----------------*/ - if ( flg_noqi == 0 && Isub > 0e0 && pParam->HSMHV_ibpc1 != 0e0 ) { + if ( (Isub + IsubLD) > 0e0 && here->HSMHV_ibpc1 != 0e0 && model->HSMHV_codep==0 ) { /* delta Vbs */ T0 = 1e0 + pParam->HSMHV_ibpc2 * dVth ; - dVbsIBPC = pParam->HSMHV_ibpc1 * T0 * Isub ; - dVbsIBPC_dVbs = pParam->HSMHV_ibpc1 * ( pParam->HSMHV_ibpc2 * dVth_dVb * Isub + T0 * Isub_dVbs ) ; - dVbsIBPC_dVds = pParam->HSMHV_ibpc1 * ( pParam->HSMHV_ibpc2 * dVth_dVd * Isub + T0 * Isub_dVds ) ; - dVbsIBPC_dVgs = pParam->HSMHV_ibpc1 * ( pParam->HSMHV_ibpc2 * dVth_dVg * Isub + T0 * Isub_dVgs ) ; - dVbsIBPC_dT = pParam->HSMHV_ibpc1 * ( pParam->HSMHV_ibpc2 * dVth_dT * Isub + T0 * Isub_dT ) ; + T1 = Isub + IsubLD ; + dVbsIBPC = here->HSMHV_ibpc1 * T0 * T1 ; + dVbsIBPC_dVbs = here->HSMHV_ibpc1 * ( pParam->HSMHV_ibpc2 * dVth_dVb * T1 + T0 * ( Isub_dVbs + IsubLD_dVbs ) ) ; + dVbsIBPC_dVds = here->HSMHV_ibpc1 * ( pParam->HSMHV_ibpc2 * dVth_dVd * T1 + T0 * ( Isub_dVds + IsubLD_dVds ) ) ; + dVbsIBPC_dVgs = here->HSMHV_ibpc1 * ( pParam->HSMHV_ibpc2 * dVth_dVg * T1 + T0 * ( Isub_dVgs + IsubLD_dVgs ) ) ; + dVbsIBPC_dT = here->HSMHV_ibpc1 * ( pParam->HSMHV_ibpc2 * dVth_dT * T1 + T0 * ( Isub_dT + IsubLD_dT ) ) ; + dVbsIBPC_dVddp = here->HSMHV_ibpc1 * T0 * IsubLD_dVddp ; /* dG3 & dG4 */ T10 = 1e0 / Xi0 ; @@ -4499,6 +4622,7 @@ start_of_mobility: T1_dVd = beta * ( dVbsIBPC_dVds * Xi0 - dVbsIBPC * Xi0_dVds ) * T11 ; T1_dVg = beta * ( dVbsIBPC_dVgs * Xi0 - dVbsIBPC * Xi0_dVgs ) * T11 ; T1_dT = beta_dT * dVbsIBPC * T10 + beta * dVbsIBPC_dT * T10 + beta * dVbsIBPC * T10_dT ; + T1_dVddp = beta * dVbsIBPC_dVddp * T10 ; T10 = 1e0 / Xil ; @@ -4509,6 +4633,7 @@ start_of_mobility: T2_dVd = beta * ( dVbsIBPC_dVds * Xil - dVbsIBPC * Xil_dVds ) * T11 ; T2_dVg = beta * ( dVbsIBPC_dVgs * Xil - dVbsIBPC * Xil_dVgs ) * T11 ; T2_dT = beta_dT * dVbsIBPC * T10 + beta * dVbsIBPC_dT * T10 + beta * dVbsIBPC * T10_dT ; + T2_dVddp = beta * dVbsIBPC_dVddp * T10 ; dG3 = cnst0 * ( Xilp32 * T2 - Xi0p32 * T1 ) ; @@ -4517,6 +4642,7 @@ start_of_mobility: dG3_dVgs = cnst0 * ( Xilp32_dVgs * T2 + Xilp32 * T2_dVg - Xi0p32_dVgs * T1 - Xi0p32 * T1_dVg ) ; dG3_dT = cnst0 * ( Xilp32_dT * T2 + Xilp32 * T2_dT - Xi0p32_dT * T1 - Xi0p32 * T1_dT ) + cnst0_dT * ( Xilp32 * T2 - Xi0p32 * T1 ) ; + dG3_dVddp = cnst0 * ( Xilp32 * T2_dVddp - Xi0p32 * T1_dVddp ) ; dG4 = cnst0 * 0.5 * ( - Xilp12 * T2 + Xi0p12 * T1 ) ; dG4_dVbs = cnst0 * 0.5 * ( - Xilp12_dVbs * T2 - Xilp12 * T2_dVb + Xi0p12_dVbs * T1 + Xi0p12 * T1_dVb ) ; @@ -4524,6 +4650,7 @@ start_of_mobility: dG4_dVgs = cnst0 * 0.5 * ( - Xilp12_dVgs * T2 - Xilp12 * T2_dVg + Xi0p12_dVgs * T1 + Xi0p12 * T1_dVg ) ; dG4_dT = cnst0 * 0.5 * ( - Xilp12_dT * T2 - Xilp12 * T2_dT + Xi0p12_dT * T1 + Xi0p12 * T1_dT ) + cnst0_dT *0.5 * ( - Xilp12 * T2 + Xi0p12 * T1 ) ; + dG4_dVddp = cnst0 * 0.5 * ( - Xilp12 * T2_dVddp + Xi0p12 * T1_dVddp ) ; /* Add IBPC current into Ids */ dIdd = dG3 + dG4 ; @@ -4531,13 +4658,14 @@ start_of_mobility: dIdd_dVds = dG3_dVds + dG4_dVds ; dIdd_dVgs = dG3_dVgs + dG4_dVgs ; dIdd_dT = dG3_dT + dG4_dT ; + dIdd_dVddp = dG3_dVddp + dG4_dVddp ; IdsIBPC = betaWL * dIdd * Mu ; IdsIBPC_dVbs = betaWL * ( Mu * dIdd_dVbs + dIdd * Mu_dVbs ) + betaWL_dVbs * Mu * dIdd ; IdsIBPC_dVds = betaWL * ( Mu * dIdd_dVds + dIdd * Mu_dVds ) + betaWL_dVds * Mu * dIdd ; IdsIBPC_dVgs = betaWL * ( Mu * dIdd_dVgs + dIdd * Mu_dVgs ) + betaWL_dVgs * Mu * dIdd ; IdsIBPC_dT = betaWL * ( Mu * dIdd_dT + dIdd * Mu_dT ) + betaWL_dT * Mu * dIdd ; - + IdsIBPC_dVddp = betaWL * dIdd_dVddp * Mu ; } /* End if (IBPC) */ @@ -4750,7 +4878,7 @@ start_of_mobility: ) / Tox0 ; T2_dVb = - ( pParam->HSMHV_fvbs * Vbsz_dVbs -Vgsz_dVbs + dVthSC_dVb + dVthLP_dVb ) / Tox0 ; - T2_dT = - ( pParam->HSMHV_fvbs * Vbsz_dT -Vgsz_dT + dVthSC_dT + dVthLP_dT + T2_dT = - ( pParam->HSMHV_fvbs * Vbsz_dT -Vgsz_dT + dVthSC_dT + dVthLP_dT ) / Tox0 ; T0 = T2 * T2 ; @@ -5049,7 +5177,7 @@ start_of_mobility: Vgbgmt_dVbs = -1.0 ; Vgbgmt_dVds = 0.0 ; Vgbgmt_dVgs = 1.0 ; - Vxbgmt = - Vbs ; + Vxbgmt = - Vbs + epsm10 ; Vxbgmt_dVbs = -1.0 ; Vxbgmt_dVds = 0.0 ; Vxbgmt_dVgs = 0.0 ; @@ -5057,30 +5185,51 @@ start_of_mobility: Nover_func = Novers ; cnst0over_func = ModeNML * here->HSMHV_cnst0overs + ModeRVS * here->HSMHV_cnst0over ; cnst0over_func_dT = ModeNML * cnst0overs_dT + ModeRVS * cnst0over_dT ; -/* ps0ldinib_func = ModeNML * here->HSMHV_ps0ldinibs + ModeRVS * here->HSMHV_ps0ldinib ;*/ -/* ps0ldinib_func_dT = ModeNML * ps0ldinibs_dT + ModeRVS * ps0ldinib_dT ;*/ + #include "hsmhveval_qover.h" + + if (here->HSMHV_mode != HiSIM_NORMAL_MODE) { + here->HSMHV_Ps0LD = Ps0LD ; + here->HSMHV_Ps0LD_dVds = - Ps0LD_dVds - Ps0LD_dVgs - Ps0LD_dVbs; + here->HSMHV_Ps0LD_dVgs = Ps0LD_dVgs ; + here->HSMHV_Ps0LD_dVbs = Ps0LD_dVbs ; + here->HSMHV_Ps0LD_dTi = Ps0LD_dT ; + here->HSMHV_QbuLD = QbuLD ; + here->HSMHV_QbuLD_dVds = - QbuLD_dVds - QbuLD_dVgs - QbuLD_dVbs; + here->HSMHV_QbuLD_dVgs = QbuLD_dVgs ; + here->HSMHV_QbuLD_dVbs = QbuLD_dVbs ; + here->HSMHV_QbuLD_dTi = QbuLD_dT ; + QosAD = - model->HSMHV_qovadd * ( Vds - Pds ) ; + T3 = model->HSMHV_qovadd ; + QosAD_dVgs = T3 * Pds_dVgs ; + QosAD_dVds = T3 * (Pds_dVds - 1.0) ; + QosAD_dVbs = T3 * Pds_dVbs ; + QosAD_dT = T3 * Pds_dT ; + }else{ + QosAD = QosAD_dVgs = QosAD_dVds = QosAD_dVbs = QosAD_dT = 0.0 ; + } + T4 = here->HSMHV_weffcv_nf * Lovers * ( 1 - CVDSOVER ) ; - Qovs = T4 * QsuLD ; - Qovs_dVds = T4 * QsuLD_dVds ; - Qovs_dVgs = T4 * QsuLD_dVgs ; - Qovs_dVbs = T4 * QsuLD_dVbs ; - Qovs_dT = T4 * QsuLD_dT ; + Qovs = T4 * ( QsuLD + QosAD ) ; + Qovs_dVbs = T4 * ( QsuLD_dVbs + QosAD_dVbs ) ; + Qovs_dVds = T4 * ( QsuLD_dVds + QosAD_dVds ) ; + Qovs_dVgs = T4 * ( QsuLD_dVgs + QosAD_dVgs ) ; + Qovs_dT = T4 * ( QsuLD_dT + QosAD_dT ) ; -/* QisLD = T4 * QiuLD ;*/ + QisLD = T4 * QiuLD ; QisLD_dVbs = T4 * QiuLD_dVbs ; QisLD_dVds = T4 * QiuLD_dVds ; QisLD_dVgs = T4 * QiuLD_dVgs ; - QisLD_dT = T4 * QiuLD_dT ; + QisLD_dT = T4 * QiuLD_dT ; + + QbsLD = T4 * ( QbuLD + QosAD ) ; + QbsLD_dVbs = T4 * ( QbuLD_dVbs + QosAD_dVbs ) ; + QbsLD_dVds = T4 * ( QbuLD_dVds + QosAD_dVds ) ; + QbsLD_dVgs = T4 * ( QbuLD_dVgs + QosAD_dVgs ) ; + QbsLD_dT = T4 * ( QbuLD_dT + QosAD_dT ) ; - QbsLD = T4 * QbuLD ; -/* QbsLD_dVbs = T4 * QbuLD_dVbs ; - QbsLD_dVds = T4 * QbuLD_dVds ; - QbsLD_dVgs = T4 * QbuLD_dVgs ; - QbsLD_dT = T4 * QbuLD_dT ; -*/ if ( CVDSOVER != 0.0 ) { /* Qovsext begin */ @@ -5088,11 +5237,11 @@ start_of_mobility: Vgbgmt_dVbs = -1.0 ; Vgbgmt_dVds = 0.0 ; Vgbgmt_dVgs = 1.0 ; - Vxbgmt = - Vbse ; + Vxbgmt = - Vbse + epsm10 ; Vxbgmt_dVbs = -1.0 ; Vxbgmt_dVds = 0.0 ; Vxbgmt_dVgs = 0.0 ; - + #include "hsmhveval_qover.h" T4 = here->HSMHV_weffcv_nf * Lovers * CVDSOVER ; @@ -5101,19 +5250,19 @@ start_of_mobility: Qovsext_dVgse = T4 * QsuLD_dVgs ; Qovsext_dVbse = T4 * QsuLD_dVbs ; Qovsext_dT = T4 * QsuLD_dT ; - -/* QisLDext = T4 * QiuLD ;*/ + + QisLDext = T4 * QiuLD ; QisLDext_dVbse = T4 * QiuLD_dVbs ; QisLDext_dVdse = T4 * QiuLD_dVds ; QisLDext_dVgse = T4 * QiuLD_dVgs ; QisLDext_dT = T4 * QiuLD_dT ; QbsLDext = T4 * QbuLD ; -/* QbsLDext_dVbse = T4 * QbuLD_dVbs ; + QbsLDext_dVbse = T4 * QbuLD_dVbs ; QbsLDext_dVdse = T4 * QbuLD_dVds ; QbsLDext_dVgse = T4 * QbuLD_dVgs ; QbsLDext_dT = T4 * QbuLD_dT ; -*/ + } /* Qovsext end */ } @@ -5183,7 +5332,7 @@ start_of_mobility: Vgbgmt_dVbs = -1.0 ; Vgbgmt_dVds = 0.0 ; Vgbgmt_dVgs = 1.0 ; - Vxbgmt = Vds - Vbs ; + Vxbgmt = Vds - Vbs + epsm10 ; Vxbgmt_dVbs = -1.0 ; Vxbgmt_dVds = 1.0 ; Vxbgmt_dVgs = 0.0 ; @@ -5191,28 +5340,50 @@ start_of_mobility: Nover_func = Noverd ; cnst0over_func = ModeNML * here->HSMHV_cnst0over + ModeRVS * here->HSMHV_cnst0overs ; cnst0over_func_dT = ModeNML * cnst0over_dT + ModeRVS * cnst0overs_dT ; -/* ps0ldinib_func = ModeNML * here->HSMHV_ps0ldinib + ModeRVS * here->HSMHV_ps0ldinibs ;*/ -/* ps0ldinib_func_dT = ModeNML * ps0ldinib_dT + ModeRVS * ps0ldinibs_dT ;*/ + #include "hsmhveval_qover.h" + + if (here->HSMHV_mode == HiSIM_NORMAL_MODE) { + here->HSMHV_Ps0LD = Ps0LD ; + here->HSMHV_Ps0LD_dVds = Ps0LD_dVds ; + here->HSMHV_Ps0LD_dVgs = Ps0LD_dVgs ; + here->HSMHV_Ps0LD_dVbs = Ps0LD_dVbs ; + here->HSMHV_Ps0LD_dTi = Ps0LD_dT ; + here->HSMHV_QbuLD = QbuLD ; + here->HSMHV_QbuLD_dVds = QbuLD_dVds ; + here->HSMHV_QbuLD_dVgs = QbuLD_dVgs ; + here->HSMHV_QbuLD_dVbs = QbuLD_dVbs ; + here->HSMHV_QbuLD_dTi = QbuLD_dT ; + QodAD = model->HSMHV_qovadd * ( Vds - Pds ) ; + T3 = - model->HSMHV_qovadd ; + QodAD_dVgs = T3 * Pds_dVgs ; + QodAD_dVds = T3 * (Pds_dVds - 1.0) ; + QodAD_dVbs = T3 * Pds_dVbs ; + QodAD_dT = T3 * Pds_dT ; + }else{ + QodAD = QodAD_dVgs = QodAD_dVds = QodAD_dVbs = QodAD_dT = 0.0 ; + } + T4 = here->HSMHV_weffcv_nf * Loverd * ( 1 - CVDSOVER ) ; - Qovd = T4 * QsuLD ; - Qovd_dVds = T4 * QsuLD_dVds ; - Qovd_dVgs = T4 * QsuLD_dVgs ; - Qovd_dVbs = T4 * QsuLD_dVbs ; - Qovd_dT = T4 * QsuLD_dT ; - -/* QidLD = T4 * QiuLD ;*/ + + Qovd = T4 * ( QsuLD + QodAD ) ; + Qovd_dVbs = T4 * ( QsuLD_dVbs + QodAD_dVbs ) ; + Qovd_dVds = T4 * ( QsuLD_dVds + QodAD_dVds ) ; + Qovd_dVgs = T4 * ( QsuLD_dVgs + QodAD_dVgs ) ; + Qovd_dT = T4 * ( QsuLD_dT + QodAD_dT ) ; + + QidLD = T4 * QiuLD ; QidLD_dVbs = T4 * QiuLD_dVbs ; QidLD_dVds = T4 * QiuLD_dVds ; QidLD_dVgs = T4 * QiuLD_dVgs ; - QidLD_dT = T4 * QiuLD_dT ; + QidLD_dT = T4 * QiuLD_dT ; - QbdLD = T4 * QbuLD ; - QbdLD_dVbs = T4 * QbuLD_dVbs ; - QbdLD_dVds = T4 * QbuLD_dVds ; - QbdLD_dVgs = T4 * QbuLD_dVgs ; - QbdLD_dT = T4 * QbuLD_dT ; + QbdLD = T4 * ( QbuLD + QodAD ) ; + QbdLD_dVbs = T4 * ( QbuLD_dVbs + QodAD_dVbs ) ; + QbdLD_dVds = T4 * ( QbuLD_dVds + QodAD_dVds ) ; + QbdLD_dVgs = T4 * ( QbuLD_dVgs + QodAD_dVgs ) ; + QbdLD_dT = T4 * ( QbuLD_dT + QodAD_dT ) ; if ( CVDSOVER != 0.0 ) { /* Qovdext begin */ @@ -5220,7 +5391,7 @@ start_of_mobility: Vgbgmt_dVbs = -1.0 ; Vgbgmt_dVds = 0.0 ; Vgbgmt_dVgs = 1.0 ; - Vxbgmt = Vdse - Vbse ; + Vxbgmt = Vdse - Vbse + epsm10 ; Vxbgmt_dVbs = -1.0 ; Vxbgmt_dVds = 1.0 ; Vxbgmt_dVgs = 0.0 ; @@ -5233,8 +5404,8 @@ start_of_mobility: Qovdext_dVgse = T4 * QsuLD_dVgs ; Qovdext_dVbse = T4 * QsuLD_dVbs ; Qovdext_dT = T4 * QsuLD_dT ; - -/* QidLDext = T4 * QiuLD ;*/ + + QidLDext = T4 * QiuLD ; QidLDext_dVbse = T4 * QiuLD_dVbs ; QidLDext_dVdse = T4 * QiuLD_dVds ; QidLDext_dVgse = T4 * QiuLD_dVgs ; @@ -5327,410 +5498,8 @@ start_of_mobility: * PART-4: Substrate-source/drain junction diode. *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - /*-----------------------------------------------------------* - * Cbsj, Cbdj: node-base S/D biases. - *-----------------*/ - - T10 = model->HSMHV_cvb * here->HSMHV_jd_nvtm_inv ; - T11 = model->HSMHV_cvbk * here->HSMHV_jd_nvtm_inv ; - - T9 = model->HSMHV_cisb * here->HSMHV_exptemp ; - T0 = here->HSMHV_isbd2 * T9 ; - - T2 = exp (- vbd_jct * T10 ); - T2_dVb = - T2 * T10 ; - - T3 = exp (- vbd_jct * T11 ); - T3_dVb = - T3 * T11 ; - - /* self heating */ - T10_dT = model->HSMHV_cvb * beta_dT / pParam->HSMHV_nj ; - T11_dT = model->HSMHV_cvbk * beta_dT / pParam->HSMHV_nj ; - T9_dT = model->HSMHV_cisb * exptemp_dT ; - T0_dT = here->HSMHV_isbd2 * T9_dT + isbd2_dT * T9 ; - T2_dT = -vbd_jct * T10 * T2 * beta_dT * beta_inv ; - T3_dT = -vbd_jct * T11 * T3 * beta_dT * beta_inv ; - - - /* ibd */ - if ( vbd_jct < here->HSMHV_vbdt ) { - TX = vbd_jct * here->HSMHV_jd_nvtm_inv ; - - - if ( TX < - EXP_THR ) { - T1 = 0.0 ; - T1_dVb = 0.0 ; - T1_dT = 0.0 ; - } else { - T1 = exp ( TX ) ; - T1_dVb = T1 * here->HSMHV_jd_nvtm_inv ; - T1_dT = T1 * TX * beta_dT * beta_inv ; - - } - - Ibd = here->HSMHV_isbd * (T1 - 1.0) - + T0 * (T2 - 1.0) - + pParam->HSMHV_cisbk * (T3 - 1.0); - Gbd = here->HSMHV_isbd * T1_dVb - + T0 * T2_dVb - + pParam->HSMHV_cisbk * T3_dVb ; - Ibd_dT = here->HSMHV_isbd * T1_dT + isbd_dT * ( T1 - 1.0 ) - + T0 * T2_dT + T0_dT * ( T2 - 1.0 ) - + pParam->HSMHV_cisbk * T3_dT ; - - } else { - T1 = here->HSMHV_jd_expcd ; - - T4 = here->HSMHV_isbd * here->HSMHV_jd_nvtm_inv * T1 ; - - Ibd = here->HSMHV_isbd * (T1 - 1.0) - + T4 * (vbd_jct - here->HSMHV_vbdt) - + T0 * (T2 - 1.0) - + pParam->HSMHV_cisbk * (T3 - 1.0) ; - Gbd = T4 - + T0 * T2_dVb - + pParam->HSMHV_cisbk * T3_dVb ; - - T1_dT = jd_expcd_dT ; - T4_dT = isbd_dT * here->HSMHV_jd_nvtm_inv * T1 - + here->HSMHV_isbd * jd_nvtm_inv_dT * T1 - + here->HSMHV_isbd * here->HSMHV_jd_nvtm_inv * T1_dT ; - Ibd_dT = isbd_dT * ( T1 - 1.0 ) + here->HSMHV_isbd * T1_dT - + T4_dT * ( vbd_jct - here->HSMHV_vbdt ) - T4 * vbdt_dT - + T0_dT * ( T2 - 1.0 ) + T0 * T2_dT - + pParam->HSMHV_cisbk * T3_dT ; - } - T12 = model->HSMHV_divx * here->HSMHV_isbd2 ; - Ibd += T12 * vbd_jct ; - Gbd += T12 ; - - T12_dT = model->HSMHV_divx * isbd2_dT ; - Ibd_dT += T12_dT * vbd_jct ; - - /* ibs */ - T0 = here->HSMHV_isbs2 * T9 ; - T0_dT = here->HSMHV_isbs2 * T9_dT + isbs2_dT * T9 ; - - TX = - vbs_jct * T10 ; - if ( TX < - EXP_THR ) { - T2 = 0.0 ; - T2_dVb = 0.0 ; - T2_dT = 0.0 ; - } else { - T2 = exp ( TX ); - T2_dVb = - T2 * T10 ; - T2_dT = T2 * TX * beta_dT * beta_inv ; - } - - TX = - vbs_jct * T11 ; - if ( TX < - EXP_THR ) { - T3 = 0.0 ; - T3_dVb = 0.0 ; - T3_dT = 0.0 ; - } else { - T3 = exp ( TX ); - T3_dVb = - T3 * T11 ; - T3_dT = T3 * TX * beta_dT * beta_inv ; - } - - if ( vbs_jct < here->HSMHV_vbst ) { - TX = vbs_jct * here->HSMHV_jd_nvtm_inv ; - if ( TX < - EXP_THR ) { - T1 = 0.0 ; - T1_dVb = 0.0 ; - T1_dT = 0.0 ; - } else { - T1 = exp ( TX ) ; - T1_dVb = T1 * here->HSMHV_jd_nvtm_inv ; - T1_dT = T1 * TX * beta_dT * beta_inv ; - } - Ibs = here->HSMHV_isbs * (T1 - 1.0) - + T0 * (T2 - 1.0) - + pParam->HSMHV_cisbk * (T3 - 1.0); - Gbs = here->HSMHV_isbs * T1_dVb - + T0 * T2_dVb - + pParam->HSMHV_cisbk * T3_dVb ; - Ibs_dT = here->HSMHV_isbs * T1_dT + isbs_dT * ( T1 - 1.0 ) - + T0 * T2_dT + T0_dT * ( T2 - 1.0 ) - + pParam->HSMHV_cisbk * T3_dT ; - } else { - T1 = here->HSMHV_jd_expcs ; - - T4 = here->HSMHV_isbs * here->HSMHV_jd_nvtm_inv * T1 ; - - Ibs = here->HSMHV_isbs * (T1 - 1.0) - + T4 * (vbs_jct - here->HSMHV_vbst) - + T0 * (T2 - 1.0) - + pParam->HSMHV_cisbk * (T3 - 1.0) ; - Gbs = T4 - + T0 * T2_dVb - + pParam->HSMHV_cisbk * T3_dVb ; - - T1_dT = jd_expcs_dT ; - T4_dT = isbs_dT * here->HSMHV_jd_nvtm_inv * T1 - + here->HSMHV_isbs * jd_nvtm_inv_dT * T1 - + here->HSMHV_isbs * here->HSMHV_jd_nvtm_inv * T1_dT ; - Ibs_dT = isbs_dT * ( T1 - 1.0 ) + here->HSMHV_isbs * T1_dT - + T4_dT * ( vbs_jct - here->HSMHV_vbst) - T4 * vbst_dT - + T0_dT * ( T2 - 1.0 ) + T0 * T2_dT - + pParam->HSMHV_cisbk * T3_dT ; - } - T12 = model->HSMHV_divx * here->HSMHV_isbs2 ; - Ibs += T12 * vbs_jct ; - Gbs += T12 ; - - T12_dT = model->HSMHV_divx * isbs2_dT ; - Ibs_dT += T12_dT * vbs_jct ; - - - /*-----------------------------------------------------------* - * Charges and Capacitances. - *-----------------*/ - /* charge storage elements - * bulk-drain and bulk-source depletion capacitances - * czbd : zero bias drain junction capacitance - * czbs : zero bias source junction capacitance - * czbdsw:zero bias drain junction sidewall capacitance - * czbssw:zero bias source junction sidewall capacitance - */ - tcjbd = model->HSMHV_tcjbd ; - tcjbs = model->HSMHV_tcjbs ; - tcjbdsw = model->HSMHV_tcjbdsw ; - tcjbssw = model->HSMHV_tcjbssw ; - tcjbdswg = model->HSMHV_tcjbdswg ; - tcjbsswg = model->HSMHV_tcjbsswg ; - - czbs = model->HSMHV_cj * here->HSMHV_as ; - czbs = czbs * ( 1.0 + tcjbs * ( TTEMP - model->HSMHV_ktnom )) ; - czbs_dT = ( model->HSMHV_cj * here->HSMHV_as ) * tcjbs ; - - czbd = model->HSMHV_cj * here->HSMHV_ad ; - czbd = czbd * ( 1.0 + tcjbd * ( TTEMP - model->HSMHV_ktnom )) ; - czbd_dT = ( model->HSMHV_cj * here->HSMHV_ad ) * tcjbd ; - - /* Source Bulk Junction */ - if (here->HSMHV_ps > here->HSMHV_weff_nf) { - czbssw = model->HSMHV_cjsw * ( here->HSMHV_ps - here->HSMHV_weff_nf ) ; - czbssw = czbssw * ( 1.0 + tcjbssw * ( TTEMP - model->HSMHV_ktnom )) ; - czbssw_dT = ( model->HSMHV_cjsw * ( here->HSMHV_ps - here->HSMHV_weff_nf )) * tcjbssw ; - - czbsswg = model->HSMHV_cjswg * here->HSMHV_weff_nf ; - czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSMHV_ktnom )) ; - czbsswg_dT = ( model->HSMHV_cjswg * here->HSMHV_weff_nf ) * tcjbsswg ; - -// if (vbs_jct == 0.0) { - if (0) { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = czbs + czbssw + czbsswg ; - } else if (vbs_jct < 0.0) { - if (czbs > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pb ; - if (model->HSMHV_mj == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mj ) ; - Qbs = model->HSMHV_pb * czbs * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Qbs_dT = model->HSMHV_pb * czbs_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Capbs = czbs * sarg ; - } else { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = 0.0 ; - } - if (czbssw > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pbsw ; - if (model->HSMHV_mjsw == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjsw ) ; - Qbs += model->HSMHV_pbsw * czbssw * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjsw) ; - Qbs_dT += model->HSMHV_pbsw * czbssw_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjsw) ; - Capbs += czbssw * sarg ; - } - if (czbsswg > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pbswg ; - if (model->HSMHV_mjswg == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjswg ) ; - Qbs += model->HSMHV_pbswg * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Qbs_dT += model->HSMHV_pbswg * czbsswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Capbs += czbsswg * sarg ; - } - } else { - T1 = czbs + czbssw + czbsswg ; - T1_dT = czbs_dT + czbssw_dT + czbsswg_dT ; - T2 = czbs * model->HSMHV_mj / model->HSMHV_pb - + czbssw * model->HSMHV_mjsw / model->HSMHV_pbsw - + czbsswg * model->HSMHV_mjswg / model->HSMHV_pbswg ; - T2_dT = czbs_dT * model->HSMHV_mj / model->HSMHV_pb - + czbssw_dT * model->HSMHV_mjsw / model->HSMHV_pbsw - + czbsswg_dT * model->HSMHV_mjswg / model->HSMHV_pbswg ; - Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ; - Qbs_dT = vbs_jct * (T1_dT + vbs_jct * 0.5 * T2_dT) ; - Capbs = T1 + vbs_jct * T2 ; - } - } else { - czbsswg = model->HSMHV_cjswg * here->HSMHV_ps ; - czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSMHV_ktnom )) ; - czbsswg_dT = ( model->HSMHV_cjswg * here->HSMHV_ps ) * tcjbsswg ; -// if (vbs_jct == 0.0) { - if (0) { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = czbs + czbsswg ; - } else if (vbs_jct < 0.0) { - if (czbs > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pb ; - if (model->HSMHV_mj == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mj ) ; - Qbs = model->HSMHV_pb * czbs * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Qbs_dT = model->HSMHV_pb * czbs_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Capbs = czbs * sarg ; - } else { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = 0.0 ; - } - if (czbsswg > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pbswg ; - if (model->HSMHV_mjswg == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjswg ) ; - Qbs += model->HSMHV_pbswg * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Qbs_dT += model->HSMHV_pbswg * czbsswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Capbs += czbsswg * sarg ; - } - } else { - T1 = czbs + czbsswg ; - T1_dT = czbs_dT + czbsswg_dT ; - T2 = czbs * model->HSMHV_mj / model->HSMHV_pb - + czbsswg * model->HSMHV_mjswg / model->HSMHV_pbswg ; - T2_dT = czbs_dT * model->HSMHV_mj / model->HSMHV_pb - + czbsswg_dT * model->HSMHV_mjswg / model->HSMHV_pbswg ; - Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ; - Qbs_dT = vbs_jct * (T1_dT + vbs_jct * 0.5 * T2_dT) ; - Capbs = T1 + vbs_jct * T2 ; - } - } - - /* Drain Bulk Junction */ - if (here->HSMHV_pd > here->HSMHV_weff_nf) { - - czbdsw = model->HSMHV_cjsw * ( here->HSMHV_pd - here->HSMHV_weff_nf ) ; - czbdsw = czbdsw * ( 1.0 + tcjbdsw * ( TTEMP - model->HSMHV_ktnom )) ; - czbdsw_dT = ( model->HSMHV_cjsw * ( here->HSMHV_pd - here->HSMHV_weff_nf )) * tcjbdsw ; - - czbdswg = model->HSMHV_cjswg * here->HSMHV_weff_nf ; - czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSMHV_ktnom )) ; - czbdswg_dT = ( model->HSMHV_cjswg * here->HSMHV_weff_nf ) * tcjbdswg ; -// if (vbd_jct == 0.0) { - if (0) { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = czbd + czbdsw + czbdswg ; - } else if (vbd_jct < 0.0) { - if (czbd > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pb ; - if (model->HSMHV_mj == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mj ) ; - Qbd = model->HSMHV_pb * czbd * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Qbd_dT = model->HSMHV_pb * czbd_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Capbd = czbd * sarg ; - } else { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = 0.0 ; - } - if (czbdsw > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pbsw ; - if (model->HSMHV_mjsw == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjsw ) ; - Qbd += model->HSMHV_pbsw * czbdsw * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjsw) ; - Qbd_dT += model->HSMHV_pbsw * czbdsw_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjsw) ; - Capbd += czbdsw * sarg ; - } - if (czbdswg > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pbswg ; - if (model->HSMHV_mjswg == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjswg ) ; - Qbd += model->HSMHV_pbswg * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Qbd_dT += model->HSMHV_pbswg * czbdswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Capbd += czbdswg * sarg ; + /* move to hsmhveval_dio.c */ - } - } else { - T1 = czbd + czbdsw + czbdswg ; - T1_dT = czbd_dT + czbdsw_dT + czbdswg_dT ; - T2 = czbd * model->HSMHV_mj / model->HSMHV_pb - + czbdsw * model->HSMHV_mjsw / model->HSMHV_pbsw - + czbdswg * model->HSMHV_mjswg / model->HSMHV_pbswg ; - T2_dT = czbd_dT * model->HSMHV_mj / model->HSMHV_pb - + czbdsw_dT * model->HSMHV_mjsw / model->HSMHV_pbsw - + czbdswg_dT * model->HSMHV_mjswg / model->HSMHV_pbswg ; - Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ; - Qbd_dT = vbd_jct * (T1_dT + vbd_jct * 0.5 * T2_dT) ; - Capbd = T1 + vbd_jct * T2 ; - } - - } else { - czbdswg = model->HSMHV_cjswg * here->HSMHV_pd ; - czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSMHV_ktnom )) ; - czbdswg_dT = ( model->HSMHV_cjswg * here->HSMHV_pd ) * tcjbdswg ; - -// if (vbd_jct == 0.0) { - if (0) { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = czbd + czbdswg ; - } else if (vbd_jct < 0.0) { - if (czbd > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pb ; - if (model->HSMHV_mj == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mj ) ; - Qbd = model->HSMHV_pb * czbd * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Qbd_dT = model->HSMHV_pb * czbd_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mj) ; - Capbd = czbd * sarg ; - } else { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = 0.0 ; - } - if (czbdswg > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pbswg ; - if (model->HSMHV_mjswg == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjswg ) ; - Qbd += model->HSMHV_pbswg * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Qbd_dT += model->HSMHV_pbswg * czbdswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswg) ; - Capbd += czbdswg * sarg ; - } - } else { - T1 = czbd + czbdswg ; - T1_dT = czbd_dT + czbdswg_dT ; - T2 = czbd * model->HSMHV_mj / model->HSMHV_pb - + czbdswg * model->HSMHV_mjswg / model->HSMHV_pbswg ; - T2_dT = czbd_dT * model->HSMHV_mj / model->HSMHV_pb - + czbdswg_dT * model->HSMHV_mjswg / model->HSMHV_pbswg ; - Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ; - Qbd_dT = vbd_jct * (T1_dT + vbd_jct * 0.5 * T2_dT) ; - Capbd = T1 + vbd_jct * T2 ; - } - } /*-----------------------------------------------------------* * End of PART-4. (label) @@ -5866,7 +5635,7 @@ start_of_mobility: T1 = Qn0 / C_QE ; T2 = ( Cox + Qn0 / ( Ps0 - Vbscl ) + Cit ) * beta_inv / C_QE ; - T3 = -2.0E0 * Qi / C_QE / Lch / here->HSMHV_weff_nf - T1 ; + T3 = -2.0E0 * Qi_noi / C_QE / Lch / here->HSMHV_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 ; @@ -5882,7 +5651,7 @@ start_of_mobility: /*-----------------------------------------------------------* * thermal noise. *-----------------*/ - if ( model->HSMHV_cothrml != 0 && !flg_noqi ) { + if ( model->HSMHV_cothrml != 0 && !flg_noqi && model->HSMHV_codep==0 ) { Eyd = ( Psdl - Ps0 ) / Lch + small ; T12 = Muun * Eyd / 1.0e7 ; @@ -5916,7 +5685,7 @@ start_of_mobility: /*----------------------------------------------------------* * induced gate noise. ( Part 2/3 ) *----------------------*/ - if ( model->HSMHV_coign != 0 && model->HSMHV_cothrml != 0 && flg_ign == 1 && !flg_noqi ) { + if ( model->HSMHV_coign != 0 && model->HSMHV_cothrml != 0 && flg_ign == 1 && !flg_noqi && model->HSMHV_codep==0) { sqrtkusaiL = sqrt( kusaiL ) ; T2 = VgVt + sqrtkusaiL ; T3 = kusai00 * kusai00 ; @@ -5946,43 +5715,7 @@ start_of_mobility: /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * PART-7: Evaluation of outputs. *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - /*-----------------------------------------------------------* - * Implicit quantities related to Alpha. - *-----------------*/ - if ( flg_noqi == 0 && VgVt > VgVt_small ) { - Delta = fac1 * beta / ( 2 * Xi0p12 ) ; - Pslsat = VgVt / ( 1.0 + Delta ) + Ps0 ; - } else { - Pslsat = 0.0 ; - } - Vdsat = Pslsat - Pb2 ; - if ( Vdsat < 0.0 ) { - Vdsat = 0.0 ; - } - - /*-----------------------------------------------------------* - * Evaluate the derivatives w.r.t. external biases. - * -> not to be done for the flat and Schur version! - *-----------------*/ - - Ids += IdsIBPC ; - Ids_dVbs += IdsIBPC_dVbs ; - Ids_dVds += IdsIBPC_dVds ; - Ids_dVgs += IdsIBPC_dVgs ; - Ids_dT += IdsIBPC_dT ; - - /*---------------------------------------------------* - * Derivatives of junction diode currents and charges. - * - NOTE: These quantities are regarded as functions of - * external biases. - * - NOTE: node-base S/D - *-----------------*/ - Gbse = Gbs ; - Gbde = Gbd ; - Capbse = Capbs ; - Capbde = Capbd ; - + /*---------------------------------------------------* * Extrapolate quantities if external biases are out of bounds. * -> not necessary here @@ -5996,7 +5729,7 @@ start_of_mobility: if ( flg_info >= 1 && (Ids_dVbs < 0.0 || T1 < 0.0 || Ids_dVgs < 0.0) ) { - printf( "*** warning(HiSIM_HV): Negative Conductance\n" ) ; + printf( "*** warning(HiSIM_HV(%s)): Negative Conductance\n", model->HSMHVmodName ) ; printf( " type = %d mode = %d\n" , model->HSMHV_type , here->HSMHV_mode ) ; printf( " Vbs = %12.5e Vds = %12.5e Vgse= %12.5e\n" , Vbs , Vds , Vgs ) ; @@ -6020,6 +5753,13 @@ start_of_mobility: here->HSMHV_dIds_dVbsi = Mfactor * Ids_dVbs ; here->HSMHV_dIds_dTi = Mfactor * Ids_dT ; + here->HSMHV_idsibpc = Mfactor * IdsIBPC ; + here->HSMHV_dIdsIBPC_dVdsi = Mfactor * IdsIBPC_dVds ; + here->HSMHV_dIdsIBPC_dVgsi = Mfactor * IdsIBPC_dVgs ; + here->HSMHV_dIdsIBPC_dVbsi = Mfactor * IdsIBPC_dVbs ; + here->HSMHV_dIdsIBPC_dTi = Mfactor * IdsIBPC_dT ; + here->HSMHV_dIdsIBPC_dVddp = Mfactor * IdsIBPC_dVddp ; + /* -------------------------------------* * Intrinsic charges / capacitances. @@ -6229,7 +5969,13 @@ start_of_mobility: here->HSMHV_dIsub_dVgsi = Mfactor * Isub_dVgs ; here->HSMHV_dIsub_dVbsi = Mfactor * Isub_dVbs ; here->HSMHV_dIsub_dTi = Mfactor * Isub_dT ; - here->HSMHV_dIsub_dVdse = Mfactor * Isub_dVdse ; + + here->HSMHV_isubld = Mfactor * IsubLD ; + here->HSMHV_dIsubLD_dVdsi = Mfactor * IsubLD_dVds ; + here->HSMHV_dIsubLD_dVgsi = Mfactor * IsubLD_dVgs ; + here->HSMHV_dIsubLD_dVbsi = Mfactor * IsubLD_dVbs ; + here->HSMHV_dIsubLD_dTi = Mfactor * IsubLD_dT ; + here->HSMHV_dIsubLD_dVddp = Mfactor * IsubLD_dVddp ; here->HSMHV_igb = Mfactor * -Igb ; here->HSMHV_dIgb_dVdsi = - Mfactor * Igb_dVds ; @@ -6280,30 +6026,6 @@ start_of_mobility: - /*---------------------------------------------------* - * Junction diode. - *-----------------*/ - here->HSMHV_ibs = Mfactor * Ibs ; - here->HSMHV_ibd = Mfactor * Ibd ; - here->HSMHV_gbs = Mfactor * Gbse ; - here->HSMHV_gbd = Mfactor * Gbde ; - *(ckt->CKTstate0 + here->HSMHVqbs) = Mfactor * Qbs ; - *(ckt->CKTstate0 + here->HSMHVqbd) = Mfactor * Qbd ; - here->HSMHV_capbs = Mfactor * Capbse ; - here->HSMHV_capbd = Mfactor * Capbde ; - - here->HSMHV_gbdT = Mfactor * Ibd_dT ; - here->HSMHV_gbsT = Mfactor * Ibs_dT ; - here->HSMHV_gcbdT = Mfactor * Qbd_dT ; - here->HSMHV_gcbsT = Mfactor * Qbs_dT ; - - /*---------------------------------------------------* - * Add Gjmin (gmin). - *-----------------*/ - here->HSMHV_ibs += Mfactor * Gjmin * vbs_jct ; - here->HSMHV_ibd += Mfactor * Gjmin * vbd_jct ; - here->HSMHV_gbs += Mfactor * Gjmin ; - here->HSMHV_gbd += Mfactor * Gjmin ; /*-----------------------------------------------------------* * Warn floating-point exceptions. @@ -6315,9 +6037,9 @@ start_of_mobility: if ( ! finite (T1) ) { flg_err = 1 ; fprintf (stderr , - "*** warning(HiSIM_HV): FP-exception (PART-1)\n" ) ; + "*** warning(HiSIM_HV(%s)): FP-exception (PART-1)\n", model->HSMHVmodName ) ; if ( flg_info >= 1 ) { - printf ( "*** warning(HiSIM_HV): FP-exception\n") ; + printf ( "*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHVmodName) ; printf ( "Ids = %e\n" , here->HSMHV_ids ) ; printf ( "Gmbs = %e\n" , here->HSMHV_dIds_dVbsi ) ; printf ( "Gds = %e\n" , here->HSMHV_dIds_dVdsi ) ; @@ -6333,9 +6055,9 @@ start_of_mobility: if ( ! finite (T1) ) { flg_err = 1 ; fprintf (stderr , - "*** warning(HiSIM_HV): FP-exception (PART-2)\n") ; + "*** warning(HiSIM_HV(%s)): FP-exception (PART-2)\n", model->HSMHVmodName) ; if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM_HV): FP-exception\n") ; + printf ("*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHVmodName) ; } } @@ -6343,28 +6065,18 @@ start_of_mobility: if ( ! finite (T1) ) { flg_err = 1 ; fprintf(stderr , - "*** warning(HiSIM_HV): FP-exception (PART-3)\n") ; + "*** warning(HiSIM_HV(%s)): FP-exception (PART-3)\n", model->HSMHVmodName) ; if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM_HV): FP-exception\n") ; + printf ("*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHVmodName) ; } } - T1 = here->HSMHV_ibs + here->HSMHV_ibd + here->HSMHV_gbs + here->HSMHV_gbd ; - T1 = T1 + *(ckt->CKTstate0 + here->HSMHVqbs) + *(ckt->CKTstate0 + here->HSMHVqbd) + here->HSMHV_capbs + here->HSMHV_capbd ; - if ( ! finite (T1) ) { - flg_err = 1 ; - fprintf(stderr , - "*** warning(HiSIM_HV): FP-exception (PART-4)\n") ; - if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM_HV): FP-exception\n") ; - } - } /*-----------------------------------------------------------* * Exit for error case. *-----------------*/ if ( flg_err != 0 ) { - fprintf (stderr , "----- bias information (HiSIM_HV)\n" ) ; + fprintf (stderr , "----- bias information (HiSIM_HV)\n") ; fprintf (stderr , "name: %s\n" , here->HSMHVname ) ; fprintf (stderr , "states: %d\n" , here->HSMHVstates ) ; fprintf (stderr , "Vdse= %.3e Vgse=%.3e Vbse=%.3e\n" @@ -6394,7 +6106,7 @@ start_of_mobility: /*----------------------------------------------------------* * induced gate noise. ( Part 3/3 ) *----------------------*/ - if ( model->HSMHV_coign != 0 && model->HSMHV_cothrml != 0 && flg_ign == 1 && !flg_noqi ) { + if ( model->HSMHV_coign != 0 && model->HSMHV_cothrml != 0 && flg_ign == 1 && !flg_noqi && model->HSMHV_codep==0 ) { T0 = Cox_small * Cox * here->HSMHV_weff_nf * Leff ; T1 = -( here->HSMHV_dQg_dVdsi + here->HSMHV_dQg_dVgsi + here->HSMHV_dQg_dVbsi ) / Mfactor ; /* NQS case is not supported. */ if( - T1 > T0 ){ diff --git a/src/spicelib/devices/hisimhv1/hsmhveval_dep.h b/src/spicelib/devices/hisimhv1/hsmhveval_dep.h new file mode 100644 index 000000000..9dc1429f3 --- /dev/null +++ b/src/spicelib/devices/hisimhv1/hsmhveval_dep.h @@ -0,0 +1,2432 @@ +/*********************************************************************** + + HiSIM (Hiroshima University STARC IGFET Model) + Copyright (C) 2014 Hiroshima University & STARC + + MODEL NAME : HiSIM_HV + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 + FILE : hsmhveval_dep.h + + DATE : 2014.6.11 + + released by + Hiroshima University & + Semiconductor Technology Academic Research Center (STARC) +***********************************************************************/ + +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + +{ // Begin : hsmhveval_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, phi_s0_DEP_dT ; + double phi_sL_DEP_dVgs, phi_sL_DEP_dVbs, phi_sL_DEP_dVds, phi_sL_DEP_dT ; + 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, phi_jL_DEP_dT ; + + 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, Q_s0_dT, Q_sL_dT = 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, Q_sub0_dT, Q_subL_dT ; + double Qn_res0, Qn_res0_dVgs, Qn_res0_dVds, Qn_res0_dVbs, Qn_res0_dT ; + + + double y1, y2, dety ; + double y11, y12 ; + double y21, y22 ; + + double y1_dVgs, y1_dVds, y1_dVbs, y1_dT ; + double y2_dVgs, y2_dVds, y2_dVbs, y2_dT ; + + 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, W_b0_dT ; + + double W_res0 ; + double W_s0_dVgs, W_s0_dVds, W_s0_dVbs, W_s0_dT ; + + double phi_b0_DEP, Q_b0_dep, Q_sub0_dep ; + double phi_b0_DEP_dVgs, phi_b0_DEP_dVds, phi_b0_DEP_dVbs, phi_b0_DEP_dT ; + double phi_j0_DEP_dVgs, phi_j0_DEP_dVds, phi_j0_DEP_dVbs, phi_j0_DEP_dT ; + double Q_b0_dep_dVgs, Q_b0_dep_dVds, Q_b0_dep_dVbs, Q_b0_dep_dT ; + double Q_sub0_dep_dVgs, Q_sub0_dep_dVds, Q_sub0_dep_dVbs, Q_sub0_dep_dT ; + + double phi_bL_DEP, Q_bL_dep, Q_subL_dep ; + double phi_bL_DEP_dVgs, phi_bL_DEP_dVds, phi_bL_DEP_dVbs, phi_bL_DEP_dT ; + double Q_bL_dep_dVgs, Q_bL_dep_dVds, Q_bL_dep_dVbs, Q_bL_dep_dT ; + double Q_subL_dep_dVgs, Q_subL_dep_dVds, Q_subL_dep_dVbs, Q_subL_dep_dT ; + + double q_Ndepm_esi, Idd_drift,Idd_diffu ; + double Qn_bac0 ; + double Qn_bac0_dVgs, Qn_bac0_dVds, Qn_bac0_dVbs, Qn_bac0_dT ; + + double Mu_res, Mu_bac ; + double Mu_res_dVgs, Mu_res_dVds, Mu_res_dVbs, Mu_res_dT ; + double Mu_bac_dVgs, Mu_bac_dVds, Mu_bac_dVbs, Mu_bac_dT ; + + double Q_n0_cur, Q_nL_cur ; + double Q_n0_cur_dVgs, Q_n0_cur_dVds, Q_n0_cur_dVbs, Q_n0_cur_dT ; + double Q_nL_cur_dVgs, Q_nL_cur_dVds, Q_nL_cur_dVbs, Q_nL_cur_dT ; + + double Q_s0_dep, Q_sL_dep ; + double Q_s0_dep_dVgs, Q_s0_dep_dVds, Q_s0_dep_dVbs, Q_s0_dep_dT ; + double Q_sL_dep_dVgs, Q_sL_dep_dVds, Q_sL_dep_dVbs, Q_sL_dep_dT ; + + 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, Q_n0_dT ; + double Q_nL, Q_nL_dVgs, Q_nL_dVds, Q_nL_dVbs, Q_nL_dT ; + + 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_res_dT ; + double Ids_bac_dVgs, Ids_bac_dVds, Ids_bac_dVbs, Ids_bac_dT ; + double Edri_dVgs, Edri_dVds, Edri_dVbs, Edri_dT ; + + 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,Vgpp_dT ; + double Vdseff0, Vdseff0_dVgs, Vdseff0_dVds, Vdseff0_dVbs,Vdseff0_dT ; + double phib_ref_dVgs, phib_ref_dVds, phib_ref_dVbs,phib_ref_dT ; + + double Qn_delta, Qn_delta_dT ; + double Qn_drift, Qn_drift_dVgs, Qn_drift_dVds, Qn_drift_dVbs, Qn_drift_dT ; + + double Ey_suf, Ey_suf_dVgs, Ey_suf_dVds, Ey_suf_dVbs, Ey_suf_dT ; + + double DEPQFN3 = 0.3 ; + double DEPQFN_dlt = 2.0 ; + double Ps_delta = 0.06 ; + double Ps_delta0 = 0.10 ; + + // Constants + Vbi_DEP = here->HSMHV_Vbipn ; + q_Ndepm = C_QE * here->HSMHV_ndepm ; + Ndepm2 = here->HSMHV_ndepm * here->HSMHV_ndepm ; + q_Ndepm_esi = C_QE * here->HSMHV_ndepm * C_ESI ; + q_Nsub = C_QE * here->HSMHV_nsub ; + C_QE2 = C_QE * C_QE ; + C_ESI2 = C_ESI * C_ESI ; + Tn2 = model->HSMHV_tndep * model->HSMHV_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->HSMHV_ndepm / here->HSMHV_nsub ; + NdepmpNsub_inv1 = 1.0 / (1.0 + NdepmpNsub ) ; + ps_conv3 = ps_conv * 1000.0 ; + ps_conv23 = ps_conv2 * 1000.0 ; + + //---------------------------------------------------* + // depletion MOS mode + //------------------// + + /*---------------------------------------------------* + * initial potential phi_s0_DEP,phi_b0_DEP,phi_j0_DEP calculated. + *------------------*/ + + Vgp = Vgp + epsm10 * 1.0e7 ; + + + afact = Cox * Cox / here->HSMHV_cnst0 / here->HSMHV_cnst0 ; + afact2 = afact / here->HSMHV_nin / here->HSMHV_nin * Ndepm2 ; + W_bsub0 = sqrt(2.0e0 * C_ESI / C_QE * here->HSMHV_nsub / (here->HSMHV_nsub + + here->HSMHV_ndepm) / here->HSMHV_ndepm * ( - Vbscl + Vbi_DEP)) ; + + if( W_bsub0 > model->HSMHV_tndep ) { + + Vgp0 = 0.0; + + W_b0 = model->HSMHV_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->HSMHV_tndep , 1e-8, 2 , T0 ) + W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbscl + 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 + Vbscl - 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->HSMHV_tndep * NdepmpNsub ; + phi_j0_DEP = C_2ESIpq_Nsub_inv * W_sub0 * W_sub0 + Vbscl - 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 + Vbscl - 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->HSMHV_Pb2n + Vbscl)) ; + if ( T1 > 0.0 ) { + vthn = - here->HSMHV_Pb2n + Vbscl - sqrt(T1) / Cox ; + } else { + vthn = - here->HSMHV_Pb2n + Vbscl ; + } + + /* 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->HSMHV_tndep ) { + for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { + + y0 = W_s0 + W_b0 - model->HSMHV_tndep ; + + dydPsm = C_ESI / q_Ndepm / W_s0 + + C_ESI / q_Ndepm * ( 1.0 - (here->HSMHV_ndepm + / here->HSMHV_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 - Vbscl + Vbi_DEP) < epsm10 ) + phi_b0_DEP=Vbscl - 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 + + Vbscl - 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 * Vbscl) ; + 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->HSMHV_tndep ) { + for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) { + + y0 = W_s0 + W_b0 - model->HSMHV_tndep ; + dydPsm = C_ESI / q_Ndepm / W_s0 + + C_ESI / q_Ndepm * ( 1.0 - (here->HSMHV_ndepm / + here->HSMHV_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 - Vbscl + Vbi_DEP) < epsm10 ) + phi_b0_DEP=Vbscl - Vbi_DEP + epsm10 ; + + W_s0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_s0_DEP_ini) ) ; + phi_j0_DEP = ( NdepmpNsub * phi_b0_DEP + + Vbscl - 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 + Vbscl - 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->HSMHV_tndep, 1e-8, 2 , T8 ) + W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbscl + 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 * model->HSMHV_tndep + * Tn2 * model->HSMHV_tndep) / T10 ; + phib_ref_dPs = ( - 8.0 * phi_j0_DEP * C_ESI2 + 4.0 * C_ESI2 * phi_s0_DEP * 2.0 + + 4.0 * q_Ndepm_esi * Tn2) / T10 ; + phib_ref_dPd = (4.0 * phi_j0_DEP * C_ESI2 * 2.0 - 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->HSMHV_cnst0 * sqrt(T2 - 1.0 - T1 + 1e-15) ; + Q_s0_dPs = 0.5 * here->HSMHV_cnst0 * here->HSMHV_cnst0 / Q_s0 * (beta * T2 - beta ) ; + Q_s0_dPb = - Q_s0_dPs ; + } else { + T3 = exp( - beta * (phi_s0_DEP - Vbscl)) ; + T4 = exp( - beta * (phi_b0_DEP - Vbscl)) ; + Q_s0 = here->HSMHV_cnst0 * sqrt(T2 - 1.0 - T1 + 1e-15 + here->HSMHV_cnst1 * (T3 - T4) ) ; + T5 = 0.5 * here->HSMHV_cnst0 * here->HSMHV_cnst0 / Q_s0 ; + Q_s0_dPs = T5 * (beta * T2 - beta + here->HSMHV_cnst1 * ( - beta * T3) ) ; + Q_s0_dPb = T5 * ( - beta * T2 + beta + here->HSMHV_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_HV(%s)): Went Over Iteration Maximum(Ps0)\n",model->HSMHVmodName ) ; + 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 * Vbscl_dVbs ; + y1_dT = - (8.0 * phi_j0_DEP * C_ESI2 - 8.0 * C_ESI2 * phi_s0_DEP + + 4.0 * q_Ndepm_esi * Tn2) / T10 + * T9 * NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) ; + + Q_b0_dep_dVbs = - C_ESI / W_b0 * T7 * T8 * NdepmpNsub_inv1 * Vbscl_dVbs ; + Q_b0_dep_dT = - C_ESI / W_b0 * T7 * T8 * NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) ; + + Q_sub0_dep_dVbs = - C_ESI / W_sub0 * (NdepmpNsub_inv1 * Vbscl_dVbs - Vbscl_dVbs) ; + Q_sub0_dep_dT = - C_ESI / W_sub0 * (NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) - Vbscl_dT + Vbipn_dT) ; + + T1 = beta * (phi_s0_DEP - phi_b0_DEP) ; + T2 = exp(T1) ; + if( phi_s0_DEP >= phi_b0_DEP ) { + Q_s0_dVbs = 0.0 ; + Q_s0_dT = - cnst0_dT * sqrt(T2 - 1.0 - T1 + 1e-15) + - here->HSMHV_cnst0 / 2.0 / sqrt(T2 - 1.0 - T1 + 1e-15) * ((phi_s0_DEP - phi_b0_DEP) * T2 * beta_dT + - (phi_s0_DEP - phi_b0_DEP) * beta_dT) ; + } else { + T3 = exp( - beta * (phi_s0_DEP - Vbscl)) ; + T4 = exp( - beta * (phi_b0_DEP - Vbscl)) ; + T5 = sqrt(T2 - 1.0 - T1 + 1e-15 + here->HSMHV_cnst1 * (T3 - T4)) ; + Q_s0_dVbs = here->HSMHV_cnst0 / 2.0 / T5 * + (here->HSMHV_cnst1 * (beta * T3 * Vbscl_dVbs - beta * T4 * Vbscl_dVbs) ) ; + Q_s0_dT = cnst0_dT * T5 + + here->HSMHV_cnst0 / 2.0 / T5 * + ((phi_s0_DEP - phi_b0_DEP) * T2 * beta_dT - (phi_s0_DEP - phi_b0_DEP) * beta_dT + + cnst1_dT * (T3 - T4) + + here->HSMHV_cnst1 * ( - (phi_s0_DEP - Vbscl) * T3 * beta_dT + beta * T3 * Vbscl_dT + + (phi_b0_DEP - Vbscl) * T4 * beta_dT - beta * T4 * Vbscl_dT) ) ; + } + + 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 ; + y2_dT = Cox_dT * (Vgp - phi_s0_DEP) + Cox * Vgp_dT + Q_s0_dT + Q_b0_dep_dT + Q_sub0_dep_dT ; + + 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_s0_DEP_dT = - ( rev11 * y1_dT + rev12 * y2_dT ) ; + + 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 ) ; + phi_b0_DEP_dT = - ( rev21 * y1_dT + rev22 * y2_dT ) ; + + if( W_bsub0 > model->HSMHV_tndep && depmode !=2 ) { + Fn_SU_CP2(phi_b0_DEP , phi_b0_DEP , phi_s0_DEP , 0.02, 2 , T1, T2 ) + 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_b0_DEP_dT = phi_b0_DEP_dT * T1 + phi_s0_DEP_dT * T2 ; + } + + phi_j0_DEP = NdepmpNsub_inv1 * (NdepmpNsub * phi_b0_DEP + Vbscl - 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 * Vbscl_dVbs ; + phi_j0_DEP_dT = NdepmpNsub_inv1 * NdepmpNsub * phi_b0_DEP_dT + + NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) ; + + 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 * model->HSMHV_tndep + * Tn2 * model->HSMHV_tndep) / 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 ; + phib_ref_dT = ( 8.0 * phi_j0_DEP * phi_j0_DEP_dT * C_ESI2 - 8.0 * phi_j0_DEP_dT * C_ESI2 * phi_s0_DEP + - 8.0 * phi_j0_DEP * C_ESI2 * phi_s0_DEP_dT + 8.0 * C_ESI2 * phi_s0_DEP * phi_s0_DEP_dT + + 4.0 * phi_j0_DEP_dT * q_Ndepm_esi * Tn2 + + 4.0 * phi_s0_DEP_dT * 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) ; + T1_dT = beta * (phi_s0_DEP_dT - phi_b0_DEP_dT) + beta_dT * (phi_s0_DEP - phi_b0_DEP) ; + + T2 = exp(T1) ; + T2_dVgs = T1_dVgs * T2 ; + T2_dVds = T1_dVds * T2 ; + T2_dVbs = T1_dVbs * T2 ; + T2_dT = T1_dT * 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 ; + T3_dT = (T2_dT - T1_dT) / 2.0 / T3 ; + + Q_s0 = - here->HSMHV_cnst0 * T3 ; + + Q_s0_dep = 0.0 ; + Q_sub0 = 0.0 ; +/// Qg = Cox * (Vgp - phi_s0_DEP) ; + + W_b0 = sqrt(C_2ESIpq_Ndepm * (phi_b0_DEP - phi_j0_DEP) ) ; + Fn_SU_CP( T9 , W_b0 , model->HSMHV_tndep, 1e-8, 2 , T4 ) + + W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbscl + Vbi_DEP) ) ; + Q_b0_dep = T9 * q_Ndepm ; + Q_sub0_dep = - W_sub0 * q_Nsub ; + + /* derivative */ + Q_s0_dVgs = - here->HSMHV_cnst0 * T3_dVgs ; + Q_s0_dVds = - here->HSMHV_cnst0 * T3_dVds ; + Q_s0_dVbs = - here->HSMHV_cnst0 * T3_dVbs ; + Q_s0_dT = - cnst0_dT * T3 + - here->HSMHV_cnst0 * T3_dT ; + + Q_n0 = Q_s0 ; + Q_n0_dVgs = Q_s0_dVgs ; + Q_n0_dVds = Q_s0_dVds ; + Q_n0_dVbs = Q_s0_dVbs ; + Q_n0_dT = Q_s0_dT ; + + 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_b0_dep_dT = C_ESI / W_b0 * (phi_b0_DEP_dT - phi_j0_DEP_dT) * 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 - Vbscl_dVbs) ; + Q_sub0_dep_dT = - C_ESI / W_sub0 * (phi_j0_DEP_dT - Vbscl_dT + Vbipn_dT) ; + + Q_sub0_dVgs = 0.0 ; + Q_sub0_dVds = 0.0 ; + Q_sub0_dVbs = 0.0 ; + Q_sub0_dT = 0.0 ; + + Q_s0_dep_dVgs = 0.0 ; + Q_s0_dep_dVds = 0.0 ; + Q_s0_dep_dVbs = 0.0 ; + Q_s0_dep_dT = 0.0 ; + + } else { + + T3 = exp( - beta * (phi_s0_DEP - Vbscl)) ; + T4 = exp( - beta * (phi_b0_DEP - Vbscl)) ; + T5 = sqrt(T2 - 1.0 - T1 + here->HSMHV_cnst1 * (T3 - T4) + 1e-15) ; + Q_s0 = here->HSMHV_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 - Vbscl_dVbs) ; + T3_dT = - beta * T3 * (phi_s0_DEP_dT - Vbscl_dT) - (phi_s0_DEP - Vbscl) * T3 * beta_dT ; + + T4_dVgs = - beta * T4 * phi_b0_DEP_dVgs ; + T4_dVds = - beta * T4 * phi_b0_DEP_dVds ; + T4_dVbs = - beta * T4 * (phi_b0_DEP_dVbs - Vbscl_dVbs) ; + T4_dT = - beta * T4 * (phi_b0_DEP_dT - Vbscl_dT) - (phi_b0_DEP - Vbscl) * T4 * beta_dT ; + + T5_dVgs = (T2_dVgs - T1_dVgs + here->HSMHV_cnst1 * (T3_dVgs - T4_dVgs)) / 2.0 / T5 ; + T5_dVds = (T2_dVds - T1_dVds + here->HSMHV_cnst1 * (T3_dVds - T4_dVds)) / 2.0 / T5 ; + T5_dVbs = (T2_dVbs - T1_dVbs + here->HSMHV_cnst1 * (T3_dVbs - T4_dVbs)) / 2.0 / T5 ; + T5_dT = (T2_dT - T1_dT + here->HSMHV_cnst1 * (T3_dT - T4_dT) + cnst1_dT * (T3 - T4)) / 2.0 / T5 ; + + Q_s0_dVgs = here->HSMHV_cnst0 * T5_dVgs ; + Q_s0_dVds = here->HSMHV_cnst0 * T5_dVds ; + Q_s0_dVbs = here->HSMHV_cnst0 * T5_dVbs ; + Q_s0_dT = here->HSMHV_cnst0 * T5_dT + cnst0_dT * T5 ; + + if( W_bsub0 > model->HSMHV_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_sub0_dT = 0.0 ; + + Q_s0_dep_dVgs = 0.0 ; + Q_s0_dep_dVds = 0.0 ; + Q_s0_dep_dVbs = 0.0 ; + Q_s0_dep_dT = 0.0 ; + } else { + T3 = exp( - beta * (phi_s0_DEP - Vbscl)) ; + T4 = exp( - beta * (phi_b0_DEP - Vbscl)) ; + T5 = sqrt( - T1 + here->HSMHV_cnst1 * (T3 - T4)) ; + Q_sub0 = here->HSMHV_cnst0 * T5 - here->HSMHV_cnst0 * sqrt( - T1) ; + T6 = sqrt(T2 - 1.0e0 - T1 + 1e-15) ; + Q_s0_dep = here->HSMHV_cnst0 * T6 ; + + Q_sub0_dVgs = here->HSMHV_cnst0 / 2.0 / T5 * ( - beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs) + + here->HSMHV_cnst1 * ( - beta * T3 * phi_s0_DEP_dVgs + beta * T4 * phi_b0_DEP_dVgs)) + - here->HSMHV_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs)) ; + Q_sub0_dVds = here->HSMHV_cnst0 / 2.0 / T5 * ( - beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds) + + here->HSMHV_cnst1 * ( - beta * T3 * phi_s0_DEP_dVds + beta * T4 * phi_b0_DEP_dVds)) + - here->HSMHV_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds)) ; + Q_sub0_dVbs = here->HSMHV_cnst0 / 2.0 / T5 * ( - beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs) + + here->HSMHV_cnst1 * ( - beta * T3 * (phi_s0_DEP_dVbs - Vbscl_dVbs) + beta * T4 * (phi_b0_DEP_dVbs - Vbscl_dVbs))) + - here->HSMHV_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs)) ; + Q_sub0_dT = cnst0_dT * T5 - cnst0_dT * sqrt( - T1) + + here->HSMHV_cnst0 / 2.0 / T5 * ( - beta * (phi_s0_DEP_dT - phi_b0_DEP_dT) - beta_dT * (phi_s0_DEP - phi_b0_DEP) + + cnst1_dT * (T3 - T4) + + here->HSMHV_cnst1 * ( - beta * T3 * (phi_s0_DEP_dT - Vbscl_dT) - beta_dT * (phi_s0_DEP - Vbscl) * T3 + + beta * T4 * (phi_b0_DEP_dT - Vbscl_dT) + beta_dT * (phi_b0_DEP - Vbscl) * T4)) + - here->HSMHV_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_s0_DEP_dT - phi_b0_DEP_dT) - beta_dT * (phi_s0_DEP - phi_b0_DEP)) ; + + Q_s0_dep_dVgs = here->HSMHV_cnst0 / 2.0 / T6 * beta * (phi_s0_DEP_dVgs - phi_b0_DEP_dVgs) * (T2 - 1) ; + Q_s0_dep_dVds = here->HSMHV_cnst0 / 2.0 / T6 * beta * (phi_s0_DEP_dVds - phi_b0_DEP_dVds) * (T2 - 1) ; + Q_s0_dep_dVbs = here->HSMHV_cnst0 / 2.0 / T6 * beta * (phi_s0_DEP_dVbs - phi_b0_DEP_dVbs) * (T2 - 1) ; + Q_s0_dep_dT = cnst0_dT * T6 + + here->HSMHV_cnst0 / 2.0 / T6 * + (beta * (phi_s0_DEP_dT - phi_b0_DEP_dT) * (T2 - 1) + beta_dT * (phi_s0_DEP - phi_b0_DEP) * (T2 - 1)) ; + + } + + Q_n0 = 0.0 ; + Q_n0_dVgs = 0.0 ; + Q_n0_dVds = 0.0 ; + Q_n0_dVbs = 0.0 ; + Q_n0_dT = 0.0 ; + +/// Qg = Cox * (Vgp - phi_s0_DEP) ; + + 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->HSMHV_tndep, 1e-8, 2 , T3 ) + W_sub0 = sqrt(C_2ESIpq_Nsub * (phi_j0_DEP - Vbscl + 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_b0_dep_dT = C_ESI / W_b0 * (phi_b0_DEP_dT - phi_j0_DEP_dT) * 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 - Vbscl_dVbs) ; + Q_sub0_dep_dT = - C_ESI / W_sub0 * (phi_j0_DEP_dT - Vbscl_dT + Vbipn_dT) ; + + } + + 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->HSMHV_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 ; + W_b0_dT = C_ESI / q_Ndepm / W_b0 * (phi_b0_DEP_dT - phi_j0_DEP_dT) * T0 * T3 ; + + T1 = phi_b0_DEP - phi_s0_DEP ; + Fn_SL_CP( T2 , T1 , 0.0 , 0.05, 2 , T0 ) + 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 ; + W_s0_dT = C_ESI / q_Ndepm / W_s0 * (phi_b0_DEP_dT - phi_s0_DEP_dT) * T0 ; + + T1 = model->HSMHV_tndep - T9 - W_s0 ; + Fn_SL_CP( W_res0 , T1 , 1.0e-25 , 1.0e-18, 2 , T0 ) + + 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 ; + Qn_res0_dT = (W_s0_dT + W_b0_dT) * q_Ndepm * T0 ; + + if( W_bsub0 > model->HSMHV_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 ; + T3_dT = phi_s0_DEP_dT * 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 ; + T3_dT = phib_ref_dT * T0 ; + } + + T4 = exp(beta * (T3 - phi_b0_DEP_lim)) ; + T5 = - C_QE * here->HSMHV_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) ; + Qn_bac0_dT = T5 * ((beta * T4 * T3_dT + beta_dT * (T3 - phi_b0_DEP_lim) * T4) * T9 + + T4 * W_b0_dT) ; + + + 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 ; + T2_dT = phi_s0_DEP_dT * T0 ; + + T3 = exp(beta * (T2)) ; + T3_dVgs = beta * T3 * T2_dVgs ; + T3_dVds = beta * T3 * T2_dVds ; + T3_dVbs = beta * T3 * T2_dVbs ; + T3_dT = beta * T3 * T2_dT + T2 * T3 * beta_dT ; + + 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 ; + T4_dT = T3_dT - beta * T2_dT - beta_dT * T2 ; + + T5 = sqrt(T4) ; + Q_n0_cur = - here->HSMHV_cnst0 * T5 ; + Q_n0_cur_dVgs = - here->HSMHV_cnst0 / 2.0 / T5 * T4_dVgs ; + Q_n0_cur_dVds = - here->HSMHV_cnst0 / 2.0 / T5 * T4_dVds ; + Q_n0_cur_dVbs = - here->HSMHV_cnst0 / 2.0 / T5 * T4_dVbs ; + Q_n0_cur_dT = - here->HSMHV_cnst0 / 2.0 / T5 * T4_dT + - cnst0_dT * T5 ; + + T4 = exp(beta * Ps_delta0) - 1.0 - beta * Ps_delta0 ; + T4_dT = Ps_delta0 * exp(beta * Ps_delta0) * beta_dT - beta_dT * Ps_delta0 ; + T5 = sqrt(T4) ; + T5_dT = 0.5 / T5 * T4_dT ; + Qn_delta = here->HSMHV_cnst0 * T5 ; + + Qn_delta_dT = cnst0_dT * T5 + here->HSMHV_cnst0 * T5_dT ; + + + /*-----------------------------------------------------------* + * Start point of phi_sL_DEP(= phi_s0_DEP + Pds) calculation.(label) + *-----------------*/ + + /* Vdseff (begin) */ + Vdsorg = Vds ; + + if( Vds > 1e-3 ) { + + here->HSMHV_qnsub_esi = q_Ndepm_esi ; + T2 = here->HSMHV_qnsub_esi / ( Cox * Cox ) ; + T4 = - 2.0e0 * T2 / Cox ; + T2_dVb = T4 * Cox_dVb ; + T2_dVd = T4 * Cox_dVd ; + T2_dVg = T4 * Cox_dVg ; + T2_dT = T4 * Cox_dT ; + + T0 = Vgp + 2.0 - beta_inv - Vbsz ; + T0_dVg = Vgp_dVgs ; + T0_dVd = Vgp_dVds - Vbsz_dVds ; + T0_dVb = Vgp_dVbs - Vbsz_dVbs ; + T0_dT = Vgp_dT - beta_inv_dT - Vbsz_dT ; + + 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 ; + T4_dT = 2.0 / T2 * T0_dT - 2.0 / T2 / T2 * T0 * T2_dT ; + + 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_dT = T4_dT * 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 ; + T3_dT = 0.5 / T3 * T9_dT ; + + T10 = Vgp + 2.0 + 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 ; + T10_dT = Vgp_dT + T2_dT * ( 1.0e0 - T3 ) - T2 * T3_dT ; + + Fn_SL_CP( T10 , T10 , DEPQFN3, 0.2, 4 , T0 ) + T10 = T10 + epsm10 ; + T10_dVb *=T0 ; + T10_dVd *=T0 ; + T10_dVg *=T0 ; + T10_dT *= T0 ; + + T1 = Vds / T10 ; + T2 = Fn_Pow( T1 , here->HSMHV_ddlt - 1.0e0 ) ; + T7 = T2 * T1 ; + T0 = here->HSMHV_ddlt * T2 / ( T10 * T10 ) ; + T7_dVb = T0 * ( - Vds * T10_dVb ) ; + T7_dVd = T0 * ( T10 - Vds * T10_dVd ) ; + T7_dVg = T0 * ( - Vds * T10_dVg ) ; + T7_dT = T0 * ( - Vds * T10_dT ) ; + + T3 = 1.0 + T7 ; + T4 = Fn_Pow( T3 , 1.0 / here->HSMHV_ddlt - 1.0 ) ; + T6 = T4 * T3 ; + T0 = T4 / here->HSMHV_ddlt ; + T6_dVb = T0 * T7_dVb ; + T6_dVd = T0 * T7_dVd ; + T6_dVg = T0 * T7_dVg ; + T6_dT = T0 * T7_dT ; + + 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 ; + Vdseff0_dT = - Vds * T6_dT * 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 ; + Vgpp_dT = T0 * Vgp_dT ; + + T1 = Vgpp * 0.8 ; + T1_dVg = Vgpp_dVgs * 0.8 ; + T1_dVd = Vgpp_dVds * 0.8 ; + T1_dVb = Vgpp_dVbs * 0.8 ; + T1_dT = Vgpp_dT * 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 ; + Vdseff_dT = Vdseff0_dT * T3 + Vgpp_dT * T4 + T1_dT * T5 ; + + } else { + + Vdseff = Vds ; + Vdseff0_dVgs = 0.0 ; + Vdseff0_dVds = 1.0 ; + Vdseff0_dVbs = 0.0 ; + Vdseff0_dT = 0.0 ; + + Vdseff_dVgs = 0.0 ; + Vdseff_dVds = 1.0 ; + Vdseff_dVbs = 0.0 ; + Vdseff_dT = 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_sL_DEP_dT = phi_s0_DEP_dT ; + + 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_bL_DEP_dT = phi_b0_DEP_dT ; + + 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 ; + phi_jL_DEP_dT = phi_j0_DEP_dT ; + + Q_subL = Q_sub0 ; + Q_subL_dVgs = Q_sub0_dVgs ; + Q_subL_dVds = Q_sub0_dVds ; + Q_subL_dVbs = Q_sub0_dVbs ; + Q_subL_dT = Q_sub0_dT ; + + Q_nL = Q_n0 ; + Q_nL_dVgs = Q_n0_dVgs ; + Q_nL_dVds = Q_n0_dVds ; + Q_nL_dVbs = Q_n0_dVbs ; + Q_nL_dT = Q_n0_dT ; + + 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_bL_dep_dT = Q_b0_dep_dT ; + + 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_subL_dep_dT = Q_sub0_dep_dT ; + + 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_sL_dep_dT = Q_s0_dep_dT ; + + 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 ; + Q_nL_cur_dT = Q_n0_cur_dT ; + + } else { + + W_bsubL = sqrt(C_2ESIpq_Ndepm * here->HSMHV_nsub / (here->HSMHV_nsub + here->HSMHV_ndepm) * (Vds - Vbscl + Vbi_DEP)) ; + + /*---------------------------------------------------* + * region judgement + *------------------*/ + + /* fully depleted case */ + if( W_bsubL > model->HSMHV_tndep ) { + + Vgp0 = Vds ; + W_bL = model->HSMHV_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->HSMHV_tndep , 1e-8, 2 , T0 ) + W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbscl + 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 + Vbscl - 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->HSMHV_tndep * NdepmpNsub ; + phi_jL_DEP = C_2ESIpq_Nsub_inv * W_subL * W_subL + Vbscl - 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 + Vbscl - 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->HSMHV_Pb2n + Vbscl)) ; + if ( T1 > 0.0 ) { + vthn = - here->HSMHV_Pb2n + Vbscl - sqrt(T1) / Cox ; + } else { + vthn = - here->HSMHV_Pb2n + Vbscl ; + } + + /*---------------------------------------------------* + * 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->HSMHV_tndep ) { + for ( lp_s0 = 1 ; lp_s0 <= lp_se_max + 1 ; lp_s0 ++ ) { + + y0 = W_sL + W_bL - model->HSMHV_tndep ; + + dydPsm = C_ESI / q_Ndepm / W_sL + + C_ESI / q_Ndepm * ( 1.0 - (here->HSMHV_ndepm + / here->HSMHV_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 - Vbscl + Vbi_DEP) < epsm10 ) + phi_bL_DEP=Vbscl - 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 + + Vbscl - 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 + Vbscl - 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->HSMHV_tndep , 1e-8, 2 , T8 ) + W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbscl + 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 * model->HSMHV_tndep + * Tn2 * model->HSMHV_tndep) / T10 ; + phib_ref_dPs = ( - 8.0 * phi_jL_DEP * C_ESI2 + 4.0 * C_ESI2 * phi_sL_DEP * 2.0 + + 4.0 * q_Ndepm_esi * Tn2) / T10 ; + phib_ref_dPd = (4.0 * phi_jL_DEP * C_ESI2 * 2.0 - 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->HSMHV_cnst0 * sqrt(T2 - 1.0 - T1 + 1e-15) ; + Q_sL_dPs = 0.5 * here->HSMHV_cnst0 * here->HSMHV_cnst0 / Q_sL * (beta * T2 - beta) ; + Q_sL_dPb = - Q_sL_dPs ; + } else { + T3 = exp( - beta * (phi_sL_DEP - Vbscl)) ; + T4 = exp( - beta * (phi_bL_DEP - Vbscl)) ; + Q_sL = here->HSMHV_cnst0 * sqrt(T2 - 1.0 - T1 + here->HSMHV_cnst1 * (T3 - T4) + 1e-15) ; + T5 = 0.5 * here->HSMHV_cnst0 * here->HSMHV_cnst0 / Q_sL ; + Q_sL_dPs = T5 * (beta * T2 - beta + here->HSMHV_cnst1 * ( - beta * T3) ) ; + Q_sL_dPb = T5 * ( - beta * T2 + beta + here->HSMHV_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.5 ) { + phi_sL_DEP = phi_sL_DEP - 0.5 * Fn_Sgn( rev11 * y1 + rev12 * y2 ) ; + phi_bL_DEP = phi_bL_DEP - 0.5 * 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_HV(%s)): Went Over Iteration Maximum(Psl)\n",model->HSMHVmodName ) ; + 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 * Vbscl_dVbs - Vdseff_dVbs * T11 ; + y1_dT = - (8.0 * phi_jL_DEP * C_ESI2 - 8.0 * C_ESI2 * phi_sL_DEP + + 4.0 * q_Ndepm_esi * Tn2) / T10 + * T9 * NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) - Vdseff_dT * T11 ; + + Q_bL_dep_dVbs = - C_ESI / W_bL * T7 * T8 * NdepmpNsub_inv1 * Vbscl_dVbs ; + Q_bL_dep_dT = - C_ESI / W_bL * T7 * T8 * NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) ; + + Q_subL_dep_dVbs = - C_ESI / W_subL * (NdepmpNsub_inv1 * Vbscl_dVbs - Vbscl_dVbs) ; + Q_subL_dep_dT = - C_ESI / W_subL * (NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) - Vbscl_dT + Vbipn_dT) ; + + T1 = beta * (phi_sL_DEP - phi_bL_DEP) ; + T2 = exp(T1) ; + if( phi_sL_DEP >= phi_bL_DEP ) { + Q_sL_dVbs = 0.0 ; + Q_sL_dT = - cnst0_dT * sqrt(T2 - 1.0 - T1 + 1e-15) + - here->HSMHV_cnst0 / 2.0 / sqrt(T2 - 1.0 - T1 + 1e-15) * ((phi_sL_DEP - phi_bL_DEP) * T2 * beta_dT + - (phi_sL_DEP - phi_bL_DEP) * beta_dT) ; + } else { + T3 = exp( - beta * (phi_sL_DEP - Vbscl)) ; + T4 = exp( - beta * (phi_bL_DEP - Vbscl)) ; + T5 = sqrt(T2 - 1.0 - T1 + 1e-15 + here->HSMHV_cnst1 * (T3 - T4)) ; + Q_sL_dVbs = here->HSMHV_cnst0 / 2.0 / T5 * + (here->HSMHV_cnst1 * (beta * T3 * Vbscl_dVbs - beta * T4 * Vbscl_dVbs) ) ; + Q_sL_dT = cnst0_dT * T5 + + here->HSMHV_cnst0 / 2.0 / T5 * + ((phi_sL_DEP - phi_bL_DEP) * T2 * beta_dT - (phi_sL_DEP - phi_bL_DEP) * beta_dT + + cnst1_dT * (T3 - T4) + + here->HSMHV_cnst1 * ( - (phi_sL_DEP - Vbscl) * T3 * beta_dT + beta * T3 * Vbscl_dT + + (phi_bL_DEP - Vbscl) * T4 * beta_dT - beta * T4 * Vbscl_dT) ) ; + } + + 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 ; + y2_dT = Cox_dT * (Vgp - phi_sL_DEP) + Cox * Vgp_dT + Q_sL_dT + Q_bL_dep_dT + Q_subL_dep_dT ; + + 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_sL_DEP_dT = - ( rev11 * y1_dT + rev12 * y2_dT ) ; + + 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 ) ; + phi_bL_DEP_dT = - ( rev21 * y1_dT + rev22 * y2_dT ) ; + + if( W_bsubL > model->HSMHV_tndep && depmode !=2 ) { + Fn_SU_CP2(phi_bL_DEP , phi_bL_DEP , phi_sL_DEP , 0.02, 2 , T1, T2 ) + 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_bL_DEP_dT = phi_bL_DEP_dT * T1 + phi_sL_DEP_dT * T2 ; + } + + phi_jL_DEP = NdepmpNsub_inv1 * (NdepmpNsub * phi_bL_DEP + Vbscl - 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 * Vbscl_dVbs ; + phi_jL_DEP_dT = NdepmpNsub_inv1 * NdepmpNsub * phi_bL_DEP_dT + + NdepmpNsub_inv1 * (Vbscl_dT - Vbipn_dT) ; + + 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 * model->HSMHV_tndep + * Tn2 * model->HSMHV_tndep) / 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 ; + phib_ref_dT = ( 8.0 * phi_jL_DEP * phi_jL_DEP_dT * C_ESI2 - 8.0 * phi_jL_DEP_dT * C_ESI2 * phi_sL_DEP + - 8.0 * phi_jL_DEP * C_ESI2 * phi_sL_DEP_dT + 8.0 * C_ESI2 * phi_sL_DEP * phi_sL_DEP_dT + + 4.0 * phi_jL_DEP_dT * q_Ndepm_esi * Tn2 + + 4.0 * phi_sL_DEP_dT * 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) ; + T1_dT = beta * (phi_sL_DEP_dT - phi_bL_DEP_dT) + beta_dT * (phi_sL_DEP - phi_bL_DEP) ; + + T2 = exp(T1) ; + T2_dVgs = T1_dVgs * T2 ; + T2_dVds = T1_dVds * T2 ; + T2_dVbs = T1_dVbs * T2 ; + T2_dT = T1_dT * 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 ; + T3_dT = (T2_dT - T1_dT) / 2.0 / T3 ; + + Q_sL = - here->HSMHV_cnst0 * T3 ; + + Q_sL_dep = 0.0 ; + Q_subL = 0.0 ; +/// Qg = Cox * (Vgp - phi_sL_DEP) ; + + W_bL = sqrt(C_2ESIpq_Ndepm * (phi_bL_DEP - phi_jL_DEP) ) ; + Fn_SU_CP( T9 , W_bL , model->HSMHV_tndep, 1e-8, 2 , T4 ) + + W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbscl + Vbi_DEP) ) ; + Q_bL_dep = T9 * q_Ndepm ; + Q_subL_dep = - W_subL * q_Nsub ; + + /* derivative */ + Q_sL_dVgs = - here->HSMHV_cnst0 * T3_dVgs ; + Q_sL_dVds = - here->HSMHV_cnst0 * T3_dVds ; + Q_sL_dVbs = - here->HSMHV_cnst0 * T3_dVbs ; + Q_sL_dT = - cnst0_dT * T3 + - here->HSMHV_cnst0 * T3_dT ; + + Q_nL = Q_sL ; + Q_nL_dVgs = Q_sL_dVgs ; + Q_nL_dVds = Q_sL_dVds ; + Q_nL_dVbs = Q_sL_dVbs ; + Q_nL_dT = Q_sL_dT ; + + 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_bL_dep_dT = C_ESI / W_bL * (phi_bL_DEP_dT - phi_jL_DEP_dT) * 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 - Vbscl_dVbs) ; + Q_subL_dep_dT = - C_ESI / W_subL * (phi_jL_DEP_dT - Vbscl_dT + Vbipn_dT) ; + + Q_subL_dVgs = 0.0 ; + Q_subL_dVds = 0.0 ; + Q_subL_dVbs = 0.0 ; + Q_subL_dT = 0.0 ; + + Q_sL_dep_dVgs = 0.0 ; + Q_sL_dep_dVds = 0.0 ; + Q_sL_dep_dVbs = 0.0 ; + Q_sL_dep_dT = 0.0 ; + + } else { + + T3 = exp( - beta * (phi_sL_DEP - Vbscl)) ; + T4 = exp( - beta * (phi_bL_DEP - Vbscl)) ; + T5 = sqrt(T2 - 1.0 - T1 + here->HSMHV_cnst1 * (T3 - T4) + 1e-15) ; + Q_sL = here->HSMHV_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 - Vbscl_dVbs) ; + T3_dT = - beta * T3 * (phi_sL_DEP_dT - Vbscl_dT) - (phi_sL_DEP - Vbscl) * T3 * beta_dT ; + + T4_dVgs = - beta * T4 * phi_bL_DEP_dVgs ; + T4_dVds = - beta * T4 * phi_bL_DEP_dVds ; + T4_dVbs = - beta * T4 * (phi_bL_DEP_dVbs - Vbscl_dVbs) ; + T4_dT = - beta * T4 * (phi_bL_DEP_dT - Vbscl_dT) - (phi_bL_DEP - Vbscl) * T4 * beta_dT ; + + T5_dVgs = (T2_dVgs - T1_dVgs + here->HSMHV_cnst1 * (T3_dVgs - T4_dVgs)) / 2.0 / T5 ; + T5_dVds = (T2_dVds - T1_dVds + here->HSMHV_cnst1 * (T3_dVds - T4_dVds)) / 2.0 / T5 ; + T5_dVbs = (T2_dVbs - T1_dVbs + here->HSMHV_cnst1 * (T3_dVbs - T4_dVbs)) / 2.0 / T5 ; + T5_dT = (T2_dT - T1_dT + here->HSMHV_cnst1 * (T3_dT - T4_dT) + cnst1_dT * (T3 - T4)) / 2.0 / T5 ; + + Q_sL_dVgs = here->HSMHV_cnst0 * T5_dVgs ; + Q_sL_dVds = here->HSMHV_cnst0 * T5_dVds ; + Q_sL_dVbs = here->HSMHV_cnst0 * T5_dVbs ; + Q_sL_dT = here->HSMHV_cnst0 * T5_dT + cnst0_dT * T5 ; + + if( W_bsubL > model->HSMHV_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_subL_dT = 0.0 ; + + Q_sL_dep_dVgs = 0.0 ; + Q_sL_dep_dVds = 0.0 ; + Q_sL_dep_dVbs = 0.0 ; + Q_sL_dep_dT = 0.0 ; + + } else { + T3 = exp( - beta * (phi_sL_DEP - Vbscl)) ; + T4 = exp( - beta * (phi_bL_DEP - Vbscl)) ; + T5 = sqrt( - T1 + here->HSMHV_cnst1 * (T3 - T4)) ; + Q_subL = here->HSMHV_cnst0 * T5 - here->HSMHV_cnst0 * sqrt( - T1) ; + T6 = sqrt(T2 - 1.0e0 - T1 + 1e-15) ; + Q_sL_dep = here->HSMHV_cnst0 * T6 ; + + Q_subL_dVgs = here->HSMHV_cnst0 / 2.0 / T5 * ( - beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs) + + here->HSMHV_cnst1 * ( - beta * T3 * phi_sL_DEP_dVgs + beta * T4 * phi_bL_DEP_dVgs)) + - here->HSMHV_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs)) ; + Q_subL_dVds = here->HSMHV_cnst0 / 2.0 / T5 * ( - beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds) + + here->HSMHV_cnst1 * ( - beta * T3 * phi_sL_DEP_dVds + beta * T4 * phi_bL_DEP_dVds)) + - here->HSMHV_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds)) ; + Q_subL_dVbs = here->HSMHV_cnst0 / 2.0 / T5 * ( - beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs) + + here->HSMHV_cnst1 * ( - beta * T3 * (phi_sL_DEP_dVbs - Vbscl_dVbs) + beta * T4 * (phi_bL_DEP_dVbs - Vbscl_dVbs))) + - here->HSMHV_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs)) ; + Q_subL_dT = cnst0_dT * T5 - cnst0_dT * sqrt( - T1) + + here->HSMHV_cnst0 / 2.0 / T5 * ( - beta * (phi_sL_DEP_dT - phi_bL_DEP_dT) - beta_dT * (phi_sL_DEP - phi_bL_DEP) + + cnst1_dT * (T3 - T4) + + here->HSMHV_cnst1 * ( - beta * T3 * (phi_sL_DEP_dT - Vbscl_dT) - beta_dT * (phi_sL_DEP - Vbscl) * T3 + + beta * T4 * (phi_bL_DEP_dT - Vbscl_dT) + beta_dT * (phi_bL_DEP - Vbscl) * T4)) + - here->HSMHV_cnst0 / 2.0 / sqrt( - T1) * ( - beta * (phi_sL_DEP_dT - phi_bL_DEP_dT) - beta_dT * (phi_sL_DEP - phi_bL_DEP)) ; + + Q_sL_dep_dVgs = here->HSMHV_cnst0 / 2.0 / T6 * beta * (phi_sL_DEP_dVgs - phi_bL_DEP_dVgs) * (T2 - 1) ; + Q_sL_dep_dVds = here->HSMHV_cnst0 / 2.0 / T6 * beta * (phi_sL_DEP_dVds - phi_bL_DEP_dVds) * (T2 - 1) ; + Q_sL_dep_dVbs = here->HSMHV_cnst0 / 2.0 / T6 * beta * (phi_sL_DEP_dVbs - phi_bL_DEP_dVbs) * (T2 - 1) ; + Q_sL_dep_dT = cnst0_dT * T6 + + here->HSMHV_cnst0 / 2.0 / T6 * + (beta * (phi_sL_DEP_dT - phi_bL_DEP_dT) * (T2 - 1) + beta_dT * (phi_sL_DEP - phi_bL_DEP) * (T2 - 1)) ; + + } + + Q_nL = 0.0 ; + Q_nL_dVgs = 0.0 ; + Q_nL_dVds = 0.0 ; + Q_nL_dVbs = 0.0 ; + Q_nL_dT = 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->HSMHV_tndep, 1e-8, 2 , T3 ) + W_subL = sqrt(C_2ESIpq_Nsub * (phi_jL_DEP - Vbscl + 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_bL_dep_dT = C_ESI / W_bL * (phi_bL_DEP_dT - phi_jL_DEP_dT) * 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 - Vbscl_dVbs) ; + Q_subL_dep_dT = - C_ESI / W_subL * (phi_jL_DEP_dT - Vbscl_dT + Vbipn_dT) ; + + } + + + 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 ; + T2_dT = (phi_sL_DEP_dT - Vdseff_dT) * T0 ; + + T3 = exp(beta * (T2)) ; + T3_dVgs = beta * T3 * T2_dVgs ; + T3_dVds = beta * T3 * T2_dVds ; + T3_dVbs = beta * T3 * T2_dVbs ; + T3_dT = beta * T3 * T2_dT + T2 * T3 * beta_dT ; + + 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 ; + T4_dT = T3_dT - beta * T2_dT - beta_dT * T2 ; + + T5 = sqrt(T4) ; + Q_nL_cur = - here->HSMHV_cnst0 * T5 ; + Q_nL_cur_dVgs = - here->HSMHV_cnst0 / 2.0 / T5 * T4_dVgs ; + Q_nL_cur_dVds = - here->HSMHV_cnst0 / 2.0 / T5 * T4_dVds ; + Q_nL_cur_dVbs = - here->HSMHV_cnst0 / 2.0 / T5 * T4_dVbs ; + Q_nL_cur_dT = - here->HSMHV_cnst0 / 2.0 / T5 * T4_dT + - cnst0_dT * T5 ; + + } + + /*---------------------------------------------------* + * 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 ; + Pds_dT = phi_sL_DEP_dT - phi_s0_DEP_dT ; + + if( Pds < 0.0 ) { // take care of numerical noise // + Pds = 0.0 ; + Pds_dVgs = 0.0 ; + Pds_dVds = 0.0 ; + Pds_dVbs = 0.0 ; + Pds_dT = 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 ; + phi_sL_DEP_dT = phi_s0_DEP_dT ; + + Idd = 0.0 ; + Idd_dVgs = 0.0 ; + Idd_dVds = 0.0 ; + Idd_dVbs = 0.0 ; + Idd_dT = 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) ; + T1_dT = - (Q_s0_dT + Q_sL_dT) ; + + 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 ; + Qn_drift_dT = T1_dT * T3 + Qn_delta_dT * T5 ; + + 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 ) ; + Idd_dT = (beta_dT * Qn_drift + beta * Qn_drift_dT) / 2.0 * Pds + + beta * Qn_drift / 2.0 * Pds_dT - ( - Q_nL_cur_dT + Q_n0_cur_dT ) ; + + } + + + Qiu = - Q_n0_cur ; + Qiu_dVgs = - Q_n0_cur_dVgs ; + Qiu_dVds = - Q_n0_cur_dVds ; + Qiu_dVbs = - Q_n0_cur_dVbs ; + Qiu_dT = - Q_n0_cur_dT ; + + Lch = Leff ; + + /*-----------------------------------------------------------* + * Muun : universal mobility. (CGS unit) + *-----------------*/ + + T2 = here->HSMHV_ninv_o_esi ; + + T0 = here->HSMHV_ninvd ; + T4 = 1.0 + ( phi_sL_DEP - phi_s0_DEP ) * T0 ; + T4_dVb = ( phi_sL_DEP_dVbs - phi_s0_DEP_dVbs ) * T0 ; + T4_dVd = ( phi_sL_DEP_dVds - phi_s0_DEP_dVds ) * T0 ; + T4_dVg = ( phi_sL_DEP_dVgs - phi_s0_DEP_dVgs ) * T0 ; + T4_dT = ( phi_sL_DEP_dT - phi_s0_DEP_dT ) * T0 + ( phi_sL_DEP - phi_s0_DEP ) * ninvd_dT ; + + T5 = T2 * Qiu ; + T5_dVb = T2 * Qiu_dVbs ; + T5_dVd = T2 * Qiu_dVds ; + T5_dVg = T2 * Qiu_dVgs ; + T5_dT = T2 * Qiu_dT ; + + 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 ; + T3_dT = ( - T4_dT * T5 + T4 * T5_dT ) / T4 / T4 ; + + Eeff = T3 ; + Eeff_dVbs = T3_dVb ; + Eeff_dVds = T3_dVd ; + Eeff_dVgs = T3_dVg ; + Eeff_dT = T3_dT ; + + T5 = Fn_Pow( Eeff , model->HSMHV_mueph0 - 1.0e0 ) ; + T8 = T5 * Eeff ; + T7 = Fn_Pow( Eeff , here->HSMHV_muesr - 1.0e0 ) ; + T6 = T7 * Eeff ; + T8_dT = model->HSMHV_mueph0 * T5 * Eeff_dT ; + T6_dT = here->HSMHV_muesr * T7 * Eeff_dT ; + + T9 = C_QE * C_m2cm_p2 ; + Rns = Qiu / T9 ; + Rns_dT = Qiu_dT / T9 ; + + T1 = 1.0e0 / ( pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ) + + here->HSMHV_mphn0 * T8 + T6 / pParam->HSMHV_muesr1 ; + + + T1_dT = - 1.0e0 / ( pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ) + / ( pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ) + * pParam->HSMHV_muecb1 * Rns_dT / 1.0e11 + + here->HSMHV_mphn0 * T8_dT + mphn0_dT * T8 + T6_dT / pParam->HSMHV_muesr1 ; + + Muun = 1.0e0 / T1 ; + Muun_dT = - Muun / T1 * T1_dT ; + + T1 = 1.0e0 / ( T1 * T1 ) ; + T2 = pParam->HSMHV_muecb0 + pParam->HSMHV_muecb1 * Rns / 1.0e11 ; + T2 = 1.0e0 / ( T2 * T2 ) ; + T3 = here->HSMHV_mphn1 * T5 ; + T4 = here->HSMHV_muesr * T7 / pParam->HSMHV_muesr1 ; + T5 = - 1.0e-11 * pParam->HSMHV_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_dT /=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 ) ; + T2_dT = beta_dT * (Qiu + small) * Lch + beta * Qiu_dT * Lch ; + T1_dT = - T1 / T2 * T2_dT ; + + 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 ; + TY_dT = Idd_dT * T1 + Idd * T1_dT ; + + T2 = 0.2 * Vmax / Muun ; + T3 = - T2 / Muun ; + T2_dVb = T3 * Muun_dVbs ; + T2_dVd = T3 * Muun_dVds ; + T2_dVg = T3 * Muun_dVgs ; + T2_dT = 0.2 * ( Vmax_dT * Muun - Muun_dT * Vmax ) / ( Muun * Muun ) ; + + 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 ) ; + Ey_dT = T4 * ( TY * TY_dT + T2 * T2_dT ) ; + + 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 ; + Em_dT = Ey * Muun_dT + Ey_dT * Muun ; + + T1 = Em / Vmax ; + T1_dT = ( Em_dT * Vmax - Vmax_dT * Em ) / ( Vmax * Vmax ); + + Ey_suf = Ey ; + Ey_suf_dVgs = Ey_dVgs ; + Ey_suf_dVds = Ey_dVds ; + Ey_suf_dVbs = Ey_dVbs ; + Ey_suf_dT = Ey_dT ; + + /* note: model->HSMHV_bb = 2 (electron) ;1 (hole) */ + if ( 1.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 1.0e0 + epsm10 ) { + T3 = 1.0e0 ; + T3_dT = 0.0e0 ; + } else if ( 2.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 2.0e0 + epsm10 ) { + T3 = T1 ; + T3_dT = T1_dT ; + } else { + T3 = Fn_Pow( T1 , model->HSMHV_bb - 1.0e0 ) ; + T3_dT = ( model->HSMHV_bb - 1.0e0 ) * Fn_Pow( T1 , model->HSMHV_bb - 2.0e0 ) * T1_dT ; + } + T2 = T1 * T3 ; + T4 = 1.0e0 + T2 ; + T2_dT = T1 * T3_dT + T3 * T1_dT ; + T4_dT = T2_dT ; + + if ( 1.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 1.0e0 + epsm10 ) { + T5 = 1.0 / T4 ; + T6 = T5 / T4 ; + T5_dT = - T5 * T5 * T4_dT ; + T6_dT = T5 * T5 * ( T5_dT * T4 - T5 * T4_dT ) ; + } else if ( 2.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 2.0e0 + epsm10 ) { + T5 = 1.0 / sqrt( T4 ) ; + T6 = T5 / T4 ; + T5_dT = - 0.5e0 / ( T4 * sqrt(T4)) * T4_dT ; + T6_dT = ( T5_dT * T4 - T5 * T4_dT ) / T4 / T4 ; + } else { + T6 = Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV_bb - 1.0e0 ) ) ; + T5 = T4 * T6 ; + T6_dT =( - 1.0e0 / model->HSMHV_bb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / model->HSMHV_bb - 2.0e0 ) ) * T4_dT ; + T5_dT = T4_dT * T6 + T4 * T6_dT ; + } + + 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 ; + Mu_dT = Muun_dT * T5 + Muun * T5_dT ; + + //-----------------------------------------------------------* + //* resistor region current. (CGS unit) + //*-----------------// + + if( Vdsorg > 1e-3 ) { + + T2 = here->HSMHV_qnsub_esi / ( Cox * Cox ) ; + T4 = - 2.0e0 * T2 / Cox ; + T2_dVb = T4 * Cox_dVb ; + T2_dVd = T4 * Cox_dVd ; + T2_dVg = T4 * Cox_dVg ; + T2_dT = T4 * Cox_dT ; + + T0 = Vgp + model->HSMHV_depvdsef1 - beta_inv - Vbsz ; + T0_dVg = Vgp_dVgs ; + T0_dVd = Vgp_dVds - Vbsz_dVds ; + T0_dVb = Vgp_dVbs - Vbsz_dVbs ; + T0_dT = Vgp_dT - beta_inv_dT - Vbsz_dT ; + + 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 ; + T4_dT = 2.0 / T2 * T0_dT - 2.0 / T2 / T2 * T0 * T2_dT ; + + 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_dT = T4_dT * 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 ; + T3_dT = 0.5 / T3 * T9_dT ; + + T10 = Vgp + model->HSMHV_depvdsef1 + T2 * ( 1.0e0 - T3 ) ; + T10 = T10 * model->HSMHV_depvdsef2 ; + T10_dVb = (Vgp_dVbs + T2_dVb * ( 1.0e0 - T3 ) - T2 * T3_dVb) + * model->HSMHV_depvdsef2 ; + T10_dVd = (Vgp_dVds + T2_dVd * ( 1.0e0 - T3 ) - T2 * T3_dVd) + * model->HSMHV_depvdsef2 ; + T10_dVg = (Vgp_dVgs + T2_dVg * ( 1.0e0 - T3 ) - T2 * T3_dVg) + * model->HSMHV_depvdsef2 ; + T10_dT = (Vgp_dT + T2_dT * ( 1.0e0 - T3 ) - T2 * T3_dT) + * model->HSMHV_depvdsef2 ; + + Fn_SL_CP( T10 , T10 , model->HSMHV_depleak, 4.0, 4 , T0 ) + T10 = T10 + epsm10 ; + T10_dVb *=T0 ; + T10_dVd *=T0 ; + T10_dVg *=T0 ; + T10_dT *= T0 ; + + T1 = Vdsorg / T10 ; + T2 = Fn_Pow( T1 , here->HSMHV_ddlt - 1.0e0 ) ; + T7 = T2 * T1 ; + T0 = here->HSMHV_ddlt * T2 / ( T10 * T10 ) ; + T7_dVb = T0 * ( - Vdsorg * T10_dVb ) ; + T7_dVd = T0 * ( T10 - Vdsorg * T10_dVd ) ; + T7_dVg = T0 * ( - Vdsorg * T10_dVg ) ; + T7_dT = T0 * ( - Vdsorg * T10_dT ) ; + + T3 = 1.0 + T7 ; + T4 = Fn_Pow( T3 , 1.0 / here->HSMHV_ddlt - 1.0 ) ; + T6 = T4 * T3 ; + T0 = T4 / here->HSMHV_ddlt ; + T6_dVb = T0 * T7_dVb ; + T6_dVd = T0 * T7_dVd ; + T6_dVg = T0 * T7_dVg ; + T6_dT = T0 * T7_dT ; + + 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 ; + Vdseff0_dT = - Vdsorg * T6_dT * T0 ; + + } else { + + Vdseff0 = Vdsorg ; + Vdseff0_dVgs = 0.0 ; + Vdseff0_dVds = 1.0 ; + Vdseff0_dVbs = 0.0 ; + Vdseff0_dT = 0.0 ; + + } + + T0 = here->HSMHV_ninvd ; + T4 = 1.0 + ( phi_sL_DEP - phi_s0_DEP ) * T0 ; + T4_dVb = ( phi_sL_DEP_dVbs - phi_s0_DEP_dVbs ) * T0 ; + T4_dVd = ( phi_sL_DEP_dVds - phi_s0_DEP_dVds ) * T0 ; + T4_dVg = ( phi_sL_DEP_dVgs - phi_s0_DEP_dVgs ) * T0 ; + T4_dT = ( phi_sL_DEP_dT - phi_s0_DEP_dT ) * T0 + ( phi_sL_DEP - phi_s0_DEP ) * ninvd_dT ; + + Qiu = - Qn_res0 ; + Qiu_dVgs = - Qn_res0_dVgs ; + Qiu_dVds = - Qn_res0_dVds ; + Qiu_dVbs = - Qn_res0_dVbs ; + Qiu_dT = - Qn_res0_dT ; + + T5 = Qiu ; + T5_dVb = Qiu_dVbs ; + T5_dVd = Qiu_dVds ; + T5_dVg = Qiu_dVgs ; + T5_dT = Qiu_dT ; + + 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 ; + T3_dT = ( - T4_dT * T5 + T4 * T5_dT ) / T4 / T4 ; + + Eeff = T3 ; + Eeff_dVbs = T3_dVb ; + Eeff_dVds = T3_dVd ; + Eeff_dVgs = T3_dVg ; + Eeff_dT = T3_dT ; + + T5 = Fn_Pow( Eeff , model->HSMHV_depmueph0 - 1.0e0 ) ; + T8 = T5 * Eeff ; + T8_dT = model->HSMHV_mueph0 * T5 * Eeff_dT ; + + T9 = C_QE * C_m2cm_p2 ; + Rns = Qiu / T9 ; + Rns_dT = Qiu_dT / T9 ; + + T1 = 1.0e0 / ( model->HSMHV_depmue0 + model->HSMHV_depmue1 * Rns / 1.0e11 ) + + here->HSMHV_depmphn0 * T8 ; + + T1_dT = - 1.0e0 / ( model->HSMHV_depmue0 + model->HSMHV_depmue1 * Rns / 1.0e11 ) + / ( model->HSMHV_depmue0 + model->HSMHV_depmue1 * Rns / 1.0e11 ) + * model->HSMHV_depmue1 * Rns_dT / 1.0e11 + + here->HSMHV_depmphn0 * T8_dT + depmphn0_dT * T8 ; + + Muun = 1.0e0 / T1 ; + Muun_dT = - Muun / T1 * T1_dT ; + + T1 = 1.0e0 / ( T1 * T1 ) ; + T2 = model->HSMHV_depmue0 + model->HSMHV_depmue1 * Rns / 1.0e11 ; + T2 = 1.0e0 / ( T2 * T2 ) ; + T3 = here->HSMHV_depmphn1 * T5 ; + T5 = - 1.0e-11 * model->HSMHV_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_dT /=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 ; + Edri_dT = Vdseff0_dT / Lch ; + + T1 = Muun * Edri / here->HSMHV_depvmax ; + T1_dVgs = (Muun_dVgs * Edri + Muun * Edri_dVgs) / here->HSMHV_depvmax ; + T1_dVds = (Muun_dVds * Edri + Muun * Edri_dVds) / here->HSMHV_depvmax ; + T1_dVbs = (Muun_dVbs * Edri + Muun * Edri_dVbs) / here->HSMHV_depvmax ; + T1_dT = (Muun_dT * Edri + Muun * Edri_dT) / here->HSMHV_depvmax + - Muun * Edri / here->HSMHV_depvmax / here->HSMHV_depvmax * depVmax_dT ; + + T1 = T1 + small ; + T2 = Fn_Pow(T1,model->HSMHV_depbb) ; + T2_dVgs = model->HSMHV_depbb * T1_dVgs / T1 * T2 ; + T2_dVds = model->HSMHV_depbb * T1_dVds / T1 * T2 ; + T2_dVbs = model->HSMHV_depbb * T1_dVbs / T1 * T2 ; + T2_dT = model->HSMHV_depbb * T1_dT / T1 * T2 ; + + T3 = 1.0 + T2 ; + T4 = Fn_Pow(T3,1.0 / model->HSMHV_depbb) ; + T4_dVgs = 1.0 / model->HSMHV_depbb * T2_dVgs / T3 * T4 ; + T4_dVds = 1.0 / model->HSMHV_depbb * T2_dVds / T3 * T4 ; + T4_dVbs = 1.0 / model->HSMHV_depbb * T2_dVbs / T3 * T4 ; + T4_dT = 1.0 / model->HSMHV_depbb * T2_dT / 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 ; + Mu_res_dT = Muun_dT / T4 - Muun / T4 / T4 * T4_dT ; + + Ids_res = here->HSMHV_weff_nf * ( - Qn_res0) * Mu_res * Edri ; + Ids_res_dVgs = here->HSMHV_weff_nf * ( - Qn_res0_dVgs * Mu_res * Edri + - Qn_res0 * Mu_res_dVgs * Edri - Qn_res0 * Mu_res * Edri_dVgs) ; + Ids_res_dVds = here->HSMHV_weff_nf * ( - Qn_res0_dVds * Mu_res * Edri + - Qn_res0 * Mu_res_dVds * Edri - Qn_res0 * Mu_res * Edri_dVds) ; + Ids_res_dVbs = here->HSMHV_weff_nf * ( - Qn_res0_dVbs * Mu_res * Edri + - Qn_res0 * Mu_res_dVbs * Edri - Qn_res0 * Mu_res * Edri_dVbs) ; + Ids_res_dT = here->HSMHV_weff_nf * ( - Qn_res0_dT * Mu_res * Edri + - Qn_res0 * Mu_res_dT * Edri - Qn_res0 * Mu_res * Edri_dT ) ; + + //-----------------------------------------------------------* + //* back region universal mobility. (CGS unit) + //*-----------------// + + T0 = here->HSMHV_ninvd ; + T4 = 1.0 + ( phi_sL_DEP - phi_s0_DEP ) * T0 ; + T4_dVb = ( phi_sL_DEP_dVbs - phi_s0_DEP_dVbs ) * T0 ; + T4_dVd = ( phi_sL_DEP_dVds - phi_s0_DEP_dVds ) * T0 ; + T4_dVg = ( phi_sL_DEP_dVgs - phi_s0_DEP_dVgs ) * T0 ; + T4_dT = ( phi_sL_DEP_dT - phi_s0_DEP_dT ) * T0 + ( phi_sL_DEP - phi_s0_DEP ) * ninvd_dT ; + + Qiu = - Qn_bac0 ; + Qiu_dVgs = - Qn_bac0_dVgs ; + Qiu_dVds = - Qn_bac0_dVds ; + Qiu_dVbs = - Qn_bac0_dVbs ; + Qiu_dT = - Qn_bac0_dT ; + + T5 = Qiu ; + T5_dVb = Qiu_dVbs ; + T5_dVd = Qiu_dVds ; + T5_dVg = Qiu_dVgs ; + T5_dT = Qiu_dT ; + + 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 ; + T3_dT = ( - T4_dT * T5 + T4 * T5_dT ) / T4 / T4 ; + Eeff = T3 ; + Eeff_dVbs = T3_dVb ; + Eeff_dVds = T3_dVd ; + Eeff_dVgs = T3_dVg ; + Eeff_dT = T3_dT ; + + T5 = Fn_Pow( Eeff , model->HSMHV_depmueph0 - 1.0e0 ) ; + T8 = T5 * Eeff ; + T8_dT = model->HSMHV_mueph0 * T5 * Eeff_dT ; + + T9 = C_QE * C_m2cm_p2 ; + Rns = Qiu / T9 ; + Rns_dT = Qiu_dT / T9 ; + + T1 = 1.0e0 / ( model->HSMHV_depmueback0 + model->HSMHV_depmueback1 * Rns / 1.0e11 ) + + here->HSMHV_depmphn0 * T8 ; + + T1_dT = - 1.0e0 / ( model->HSMHV_depmueback0 + model->HSMHV_depmueback1 * Rns / 1.0e11 ) + / ( model->HSMHV_depmueback0 + model->HSMHV_depmueback1 * Rns / 1.0e11 ) + * model->HSMHV_depmueback1 * Rns_dT / 1.0e11 + + here->HSMHV_depmphn0 * T8_dT + depmphn0_dT * T8 ; + + Muun = 1.0e0 / T1 ; + Muun_dT = - Muun / T1 * T1_dT ; + + T1 = 1.0e0 / ( T1 * T1 ) ; + T2 = model->HSMHV_depmueback0 + model->HSMHV_depmueback1 * Rns / 1.0e11 ; + T2 = 1.0e0 / ( T2 * T2 ) ; + T3 = here->HSMHV_depmphn1 * T5 ; + T5 = - 1.0e-11 * model->HSMHV_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_dT /=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 ; + Edri_dT = Vdseff0_dT / Lch ; + + T1 = Muun * Edri / here->HSMHV_depvmax ; + T1_dVgs = (Muun_dVgs * Edri + Muun * Edri_dVgs) / here->HSMHV_depvmax ; + T1_dVds = (Muun_dVds * Edri + Muun * Edri_dVds) / here->HSMHV_depvmax ; + T1_dVbs = (Muun_dVbs * Edri + Muun * Edri_dVbs) / here->HSMHV_depvmax ; + T1_dT = (Muun_dT * Edri + Muun * Edri_dT) / here->HSMHV_depvmax + - Muun * Edri / here->HSMHV_depvmax / here->HSMHV_depvmax * depVmax_dT ; + + T1 = T1 + small ; + T2 = Fn_Pow(T1,model->HSMHV_depbb) ; + T2_dVgs = model->HSMHV_depbb * T1_dVgs / T1 * T2 ; + T2_dVds = model->HSMHV_depbb * T1_dVds / T1 * T2 ; + T2_dVbs = model->HSMHV_depbb * T1_dVbs / T1 * T2 ; + T2_dT = model->HSMHV_depbb * T1_dT / T1 * T2 ; + + T3 = 1.0 + T2 ; + T4 = Fn_Pow(T3,1.0 / model->HSMHV_depbb) ; + T4_dVgs = 1.0 / model->HSMHV_depbb * T2_dVgs / T3 * T4 ; + T4_dVds = 1.0 / model->HSMHV_depbb * T2_dVds / T3 * T4 ; + T4_dVbs = 1.0 / model->HSMHV_depbb * T2_dVbs / T3 * T4 ; + T4_dT = 1.0 / model->HSMHV_depbb * T2_dT / 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 ; + Mu_bac_dT = Muun_dT / T4 - Muun / T4 / T4 * T4_dT ; + + Ids_bac = here->HSMHV_weff_nf * ( - Qn_bac0) * Mu_bac * Edri ; + Ids_bac_dVgs = here->HSMHV_weff_nf * ( - Qn_bac0_dVgs * Mu_bac * Edri + - Qn_bac0 * Mu_bac_dVgs * Edri - Qn_bac0 * Mu_bac * Edri_dVgs) ; + Ids_bac_dVds = here->HSMHV_weff_nf * ( - Qn_bac0_dVds * Mu_bac * Edri + - Qn_bac0 * Mu_bac_dVds * Edri - Qn_bac0 * Mu_bac * Edri_dVds) ; + Ids_bac_dVbs = here->HSMHV_weff_nf * ( - Qn_bac0_dVbs * Mu_bac * Edri + - Qn_bac0 * Mu_bac_dVbs * Edri - Qn_bac0 * Mu_bac * Edri_dVbs) ; + Ids_bac_dT = here->HSMHV_weff_nf * ( - Qn_bac0_dT * Mu_bac * Edri + - Qn_bac0 * Mu_bac_dT * Edri - Qn_bac0 * Mu_bac * Edri_dT ) ; + + /*-----------------------------------------------------------* + * Ids: channel current. + *-----------------*/ + betaWL = here->HSMHV_weff_nf * beta_inv / Lch ; + T1 = - betaWL / Lch ; + betaWL_dT = here->HSMHV_weff_nf * beta_inv_dT / 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 ; + Ids0_dT = betaWL_dT * Idd * Mu + betaWL * ( Idd_dT * Mu + Idd * Mu_dT ) + + Ids_res_dT + Ids_bac_dT ; + + // Vdseff // + + Vds = Vdsorg; + + /*-----------------------------------------------------------* + * Adding parasitic components to the channel current. + *-----------------*/ + if( model->HSMHV_ptl != 0 ){ + T1 = 0.5 * ( Vds - Pds ) ; + Fn_SymAdd( T6 , T1 , 0.01 , T2 ) ; + T2 *=0.5 ; + T6_dVb = T2 * ( - Pds_dVbs ) ; + T6_dVd = T2 * ( 1.0 - Pds_dVds ) ; + T6_dVg = T2 * ( - Pds_dVgs ) ; + T6_dT = T2 * ( - Pds_dT ) ; + + 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 ); + T1_dT = - ( phi_s0_DEP_dT + T6_dT ); + + Fn_SZ( T2 , T1 , 0.05 , T0 ) ; + T2 +=small ; + T2_dVb = T1_dVb * T0 ; + T2_dVd = T1_dVd * T0 ; + T2_dVg = T1_dVg * T0 ; + T2_dT = T1_dT * T0 ; + + T0 = beta * here->HSMHV_ptl0 ; + T0_dT = beta_dT * here->HSMHV_ptl0 ; + T3 = Cox * T0 ; + T3_dVb = Cox_dVb * T0 ; + T3_dVd = Cox_dVd * T0 ; + T3_dVg = Cox_dVg * T0 ; + T3_dT = Cox_dT * T0 + Cox * T0_dT ; + T0 = pow( T2 , model->HSMHV_ptp ) ; + T9 = T3 * T0 ; + T9_dVb = T3 * model->HSMHV_ptp * T0 / T2 * T2_dVb + T3_dVb * T0 ; + T9_dVd = T3 * model->HSMHV_ptp * T0 / T2 * T2_dVd + T3_dVd * T0 ; + T9_dVg = T3 * model->HSMHV_ptp * T0 / T2 * T2_dVg + T3_dVg * T0 ; + T9_dT = T3 * model->HSMHV_ptp * T0 / T2 * T2_dT + T3_dT * T0 ; + + + T4 = 1.0 + Vdsz * model->HSMHV_pt2 ; + T4_dVb = Vdsz_dVbs * model->HSMHV_pt2 ; + T4_dVd = Vdsz_dVds * model->HSMHV_pt2 ; + T4_dVg = 0.0 ; + T4_dT = Vdsz_dT * model->HSMHV_pt2 ; + + T0 = here->HSMHV_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 ; + T5_dT = phi_s0_DEP_dT + T6_dT - Vbsz_dT ; + T4 +=Vdsz * T0 * T5 ; + T4_dVb +=Vdsz * T0 * T5_dVb + Vdsz_dVbs * T0 * T5 ; + T4_dVd +=Vdsz * T0 * T5_dVd + Vdsz_dVds * T0 * T5 ; + T4_dVg +=Vdsz * T0 * T5_dVg ; + T4_dT +=Vdsz * T0 * T5_dT + Vdsz_dT * T0 * T5 ; + 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_dT = T9_dT * T4 + T9 * T4_dT ; + T9 = T6 ; + + } else { + T9 = 0.0 ; + T9_dVb = 0.0 ; + T9_dVd = 0.0 ; + T9_dVg = 0.0 ; + T9_dT = 0.0 ; + } + + if( model->HSMHV_gdl != 0 ){ + T1 = beta * here->HSMHV_gdl0 ; + T1_dT = beta_dT * here->HSMHV_gdl0 ; + T2 = Cox * T1 ; + T2_dVb = Cox_dVb * T1 ; + T2_dVd = Cox_dVd * T1 ; + T2_dVg = Cox_dVg * T1 ; + T2_dT = Cox_dT * T1 + Cox * T1_dT ; + T8 = T2 * Vdsz ; + T8_dVb = T2_dVb * Vdsz + T2 * Vdsz_dVbs ; + T8_dVd = T2_dVd * Vdsz + T2 * Vdsz_dVds ; + T8_dVg = T2_dVg * Vdsz ; + T8_dT = T2_dT * Vdsz + T2 * Vdsz_dT ; + } else { + T8 = 0.0 ; + T8_dVb = 0.0 ; + T8_dVd = 0.0 ; + T8_dVg = 0.0 ; + T8_dT = 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 ) ; + Idd1_dT = Pds_dT * ( T9 + T8 ) + Pds * ( T9_dT + T8_dT ) ; + + 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 ; + Ids0_dT +=T3 * Idd1_dT + T1 * Mu_dT + T2 * betaWL_dT ; + } + + + /* note: rpock procedure was removed. */ + if( flg_rsrd == 2 || flg_rsrd == 3 ){ + if( model->HSMHV_rd20 > 0.0 ){ + T4 = here->HSMHV_rd23 ; + T1 = pParam->HSMHV_rd24 * ( Vgse-model->HSMHV_rd25 ) ; + T1_dVg = pParam->HSMHV_rd24 ; + + Fn_SL( T2 , T1 , T4 , delta_rd , T0 ) ; + T2_dVg = T1_dVg * T0 ; + T3 = T4 * ( model->HSMHV_rd20 + 1.0 ) ; + Fn_SU( T7 , T2 , T3 , delta_rd , T0 ) ; + T7_dVg = T2_dVg * T0 ; + + } else { + T7 = here->HSMHV_rd23; + T7_dVg = 0.0e0 ; + } + + /* after testing we can remove Vdse_eff_dVbs, Vdse_eff_dVds, Vdse_eff_dVgs + and Vdse_eff_dVbse, Vdse_eff_dVgse */ + if (Vdse >= 0.0) { + Vdse_eff = Vdse ; + /* Vdse_eff_dVbs = 0.0 ; */ + /* Vdse_eff_dVds = 0.0 ; */ + /* Vdse_eff_dVgs = 0.0 ; */ + /* Vdse_eff_dVbse = 0.0 ; */ + Vdse_eff_dVdse = 1.0 ; + /* Vdse_eff_dVgse = 0.0 ; */ + } else { + Vdse_eff = 0.0 ; + /* Vdse_eff_dVbs = 0.0 ; */ + /* Vdse_eff_dVds = 0.0 ; */ + /* Vdse_eff_dVgs = 0.0 ; */ + /* Vdse_eff_dVbse = 0.0 ; */ + Vdse_eff_dVdse = 0.0 ; + /* Vdse_eff_dVgse = 0.0 ; */ + } + /* smoothing of Ra for Vdse_eff close to zero */ + /* ... smoothing parameter is Ra_N */ + if (Vdse_eff < Ra_N * small2) { + Ra_alpha = pow( Ra_N + 1.0 , model->HSMHV_rd21 - 1.0 ) + * (Ra_N + 1.0 - 0.5 * model->HSMHV_rd21 * Ra_N) + * pow( small2,model->HSMHV_rd21 ); + Ra_beta = 0.5 * model->HSMHV_rd21 + * pow( Ra_N + 1.0 , model->HSMHV_rd21 - 1.0 ) / Ra_N + * pow( small2, model->HSMHV_rd21 - 2.0 ); + T1 = Ra_alpha + Ra_beta * Vdse_eff * Vdse_eff; + T1_dVdse_eff = 2.0 * Ra_beta * Vdse_eff; + } else { + T1 = pow( Vdse_eff + small2 , model->HSMHV_rd21 ) ; + T1_dVdse_eff = model->HSMHV_rd21 * pow( Vdse_eff + small2 , model->HSMHV_rd21 - 1.0 ) ; + } + + T9 = pow( Vdse_eff + small2 , model->HSMHV_rd22d ) ; + T9_dVdse_eff = model->HSMHV_rd22d * pow( Vdse_eff + small2 , model->HSMHV_rd22d - 1.0 ) ; + + Ra = ( T7 * T1 + Vbse * pParam->HSMHV_rd22 * T9 ) / here->HSMHV_weff_nf ; + Ra_dVdse_eff = ( T7 * T1_dVdse_eff + Vbse * pParam->HSMHV_rd22 * T9_dVdse_eff ) / here->HSMHV_weff_nf ; + Ra_dVbs = Ra_dVdse_eff * Vdse_eff_dVbs ; + Ra_dVds = Ra_dVdse_eff * Vdse_eff_dVds ; + Ra_dVgs = Ra_dVdse_eff * Vdse_eff_dVgs + T7_dVg * T1 / here->HSMHV_weff_nf ; + Ra_dVbse = Ra_dVdse_eff * Vdse_eff_dVbse+pParam->HSMHV_rd22 * T9 / here->HSMHV_weff_nf ; + Ra_dVdse = Ra_dVdse_eff * Vdse_eff_dVdse ; + Ra_dVgse = Ra_dVdse_eff * Vdse_eff_dVgse ; + T0 = Ra * Ids0 ; + T0_dVb = Ra_dVbs * Ids0 + Ra * Ids0_dVbs ; + T0_dVd = Ra_dVds * Ids0 + Ra * Ids0_dVds ; + T0_dVg = Ra_dVgs * Ids0 + Ra * Ids0_dVgs ; + T0_dT = Ra * Ids0_dT ; + + T1 = Vds + small2 ; + T2 = 1.0 / T1 ; + T3 = 1.0 + T0 * T2 ; + T3_dVb = T0_dVb * T2 ; + T3_dVd = ( T0_dVd * T1 - T0 ) * T2 * T2 ; + T3_dVg = T0_dVg * T2 ; + T3_dT = T0_dT * 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 ; + Ids_dT = ( Ids0_dT * T3 - Ids0 * T3_dT ) * T5 ; + Ids_dRa = - Ids * Ids / ( Vds + small ) ; + + } else { + Ids = Ids0 ; + Ids_dVbs = Ids0_dVbs ; + Ids_dVds = Ids0_dVds ; + Ids_dVgs = Ids0_dVgs ; + Ids_dT = Ids0_dT ; + Ra = 0.0 ; + Ra_dVbs = Ra_dVds = Ra_dVgs = 0.0 ; + Ra_dVbse = Ra_dVdse = Ra_dVgse = 0.0 ; + Ids_dRa = 0.0 ; + } + + /*---------------------------------------------------* + * 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 ) ; + Qbu_dT = - 0.5 * ( Q_sub0_dT + Q_subL_dT + Q_sub0_dep_dT + Q_subL_dep_dT ) ; + + 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 ) ; + Qiu_dT = - 0.5 * ( Q_n0_dT + Q_nL_dT + Q_s0_dep_dT + Q_sL_dep_dT + Q_b0_dep_dT + Q_bL_dep_dT ) ; + + Qdrat = 0.5; + Qdrat_dVgs = 0.0 ; + Qdrat_dVds = 0.0 ; + Qdrat_dVbs = 0.0 ; + Qdrat_dT = 0.0 ; + + /*-------------------------------------------------* + * set flg_noqi + *-----------------*/ + 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 ; + Qn0_dT = - Q_n0_dT ; + + Ey = Ey_suf ; + Ey_dVgs = Ey_suf_dVgs ; + Ey_dVds = Ey_suf_dVds ; + Ey_dVbs = Ey_suf_dVbs ; + Ey_dT = Ey_suf_dT ; + + if( Qn0 < small ){ + flg_noqi = 1 ; + } + + +} /* End of hsmhveval_dep */ + + diff --git a/src/spicelib/devices/hisimhv1/hsmhveval_dio.c b/src/spicelib/devices/hisimhv1/hsmhveval_dio.c new file mode 100644 index 000000000..329136444 --- /dev/null +++ b/src/spicelib/devices/hisimhv1/hsmhveval_dio.c @@ -0,0 +1,600 @@ +/*********************************************************************** + + HiSIM (Hiroshima University STARC IGFET Model) + Copyright (C) 2014 Hiroshima University & STARC + + MODEL NAME : HiSIM_HV + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 + FILE : hsmhveval_dio.c + + DATE : 2014.6.11 + + released by + Hiroshima University & + Semiconductor Technology Academic Research Center (STARC) +***********************************************************************/ + +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * Substrate-source/drain junction diode + *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + +/*===========================================================* +* Preamble +*=================*/ +/*---------------------------------------------------* +* Header files +*-----------------*/ +#include "ngspice/ngspice.h" + +/*-----------------------------------* +* HiSIM macros +*-----------------*/ +#include "hisimhv.h" +#include "hsmhvevalenv.h" + +/*===========================================================* +* Function HSMHVdio +*=================*/ +int HSMHVdio +( + double vbs_jct, + double vbd_jct, + double deltemp, + HSMHVinstance *here, + HSMHVmodel *model, + CKTcircuit *ckt + ) +{ + HSMHVbinningParam *pParam = &here->pParam ; + + /* junction currents */ + double Ibs =0.0, Gbs =0.0, Ibs_dT =0.0 ; + double Ibd =0.0, Gbd =0.0, Ibd_dT =0.0 ; + + /* junction capacitances */ + double Qbs =0.0, Capbs =0.0, Qbs_dT =0.0 ; + double Qbd =0.0, Capbd =0.0, Qbd_dT =0.0 ; + double czbd =0.0, czbd_dT=0.0 ; + double czbdsw =0.0, czbdsw_dT=0.0 ; + double czbdswg =0.0, czbdswg_dT=0.0 ; + double czbs =0.0, czbs_dT=0.0 ; + double czbssw =0.0, czbssw_dT=0.0 ; + double czbsswg =0.0, czbsswg_dT=0.0 ; + double arg =0.0, sarg =0.0 ; + + /* temperature-dependent variables for SHE model */ + double log_Tratio =0.0 ; + double TTEMP =0.0, TTEMP0 =0.0 ; + double beta =0.0, beta_dT =0.0 ; + double beta_inv =0.0, beta_inv_dT =0.0 ; + double Eg =0.0, Eg_dT =0.0 ; + double js =0.0, js_dT =0.0 ; + double jssw =0.0, jssw_dT =0.0 ; + double js2 =0.0, js2_dT =0.0 ; + double jssw2 =0.0, jssw2_dT =0.0 ; + + double isbd_dT =0.0, isbs_dT =0.0 ; + double isbd2_dT =0.0, isbs2_dT =0.0 ; + double vbdt_dT =0.0, vbst_dT = 0.0 ; + double jd_expcd_dT =0.0 , jd_expcs_dT =0.0 ; + double jd_nvtm_invd_dT =0.0 , jd_nvtm_invs_dT =0.0 ; + double exptempd_dT = 0.0 , exptemps_dT = 0.0 ; + double tcjbd =0.0, tcjbs =0.0, + tcjbdsw =0.0, tcjbssw =0.0, + tcjbdswg =0.0, tcjbsswg =0.0 ; + + /* options */ + double Mfactor = here->HSMHV_m; + + /* Internal flags --------------------*/ + int flg_err = 0; /* error level */ + int flg_info = model->HSMHV_info; + + /* temporary vars. & derivatives */ + double TX =0.0 ; + double T0 =0.0, T0_dT =0.0 ; + double T1 =0.0, T1_dVb =0.0, T1_dT =0.0 ; + double T2 =0.0, T2_dVb =0.0, T2_dT =0.0 ; + double T3 =0.0, T3_dVb =0.0, T3_dT =0.0 ; + double T4 =0.0, T4_dT =0.0 ; + double T9 =0.0, T9_dT =0.0 ; + double T10 =0.0, T10_dT =0.0 ; + double T12 =0.0, T12_dT =0.0 ; + + + /*================ Start of executable code.=================*/ + + /*-----------------------------------------------------------* + * Temperature dependent constants. + *-----------------*/ + if ( here->HSMHVtempNode > 0 && pParam->HSMHV_rth0 != 0.0 ) { + +#define HSMHVEVAL +#include "hsmhvtemp_eval_dio.h" + + } else { + TTEMP = ckt->CKTtemp; + if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; } + } + + + /*-----------------------------------------------------------* + * Cbsj, Cbdj: node-base S/D biases. + *-----------------*/ + + /* ibd */ + T10 = model->HSMHV_cvbd * here->HSMHV_jd_nvtm_invd ; + T10_dT = model->HSMHV_cvbd * beta_dT / pParam->HSMHV_njd ; + + T9 = model->HSMHV_cisbd * here->HSMHV_exptempd ; + T9_dT = model->HSMHV_cisbd * exptempd_dT ; + T0 = here->HSMHV_isbd2 * T9 ; + T0_dT = here->HSMHV_isbd2 * T9_dT + isbd2_dT * T9 ; + + TX = - vbd_jct * T10 ; + T2 = exp ( TX ); + T2_dVb = - T2 * T10 ; + T2_dT = T2 * TX * beta_dT * beta_inv ; + + T3 = T2 ; + T3_dVb = T2_dVb ; + T3_dT = T2_dT ; + + if ( vbd_jct < here->HSMHV_vbdt ) { + TX = vbd_jct * here->HSMHV_jd_nvtm_invd ; + + if ( TX < - 3*EXP_THR ) { + T1 = 0.0 ; + T1_dVb = 0.0 ; + T1_dT = 0.0 ; + } else { + T1 = exp ( TX ) ; + T1_dVb = T1 * here->HSMHV_jd_nvtm_invd ; + T1_dT = T1 * TX * beta_dT * beta_inv ; + } + + Ibd = here->HSMHV_isbd * (T1 - 1.0) + + T0 * (T2 - 1.0) + + pParam->HSMHV_cisbkd * (T3 - 1.0); + Gbd = here->HSMHV_isbd * T1_dVb + + T0 * T2_dVb + + pParam->HSMHV_cisbkd * T3_dVb ; + Ibd_dT = here->HSMHV_isbd * T1_dT + isbd_dT * ( T1 - 1.0 ) + + T0 * T2_dT + T0_dT * ( T2 - 1.0 ) + + pParam->HSMHV_cisbkd * T3_dT ; + + } else { + T1 = here->HSMHV_jd_expcd ; + + T4 = here->HSMHV_isbd * here->HSMHV_jd_nvtm_invd * T1 ; + + Ibd = here->HSMHV_isbd * (T1 - 1.0) + + T4 * (vbd_jct - here->HSMHV_vbdt) + + T0 * (T2 - 1.0) + + pParam->HSMHV_cisbkd * (T3 - 1.0) ; + Gbd = T4 + + T0 * T2_dVb + + pParam->HSMHV_cisbkd * T3_dVb ; + + T1_dT = jd_expcd_dT ; + T4_dT = isbd_dT * here->HSMHV_jd_nvtm_invd * T1 + + here->HSMHV_isbd * jd_nvtm_invd_dT * T1 + + here->HSMHV_isbd * here->HSMHV_jd_nvtm_invd * T1_dT ; + Ibd_dT = isbd_dT * ( T1 - 1.0 ) + here->HSMHV_isbd * T1_dT + + T4_dT * ( vbd_jct - here->HSMHV_vbdt ) - T4 * vbdt_dT + + T0_dT * ( T2 - 1.0 ) + T0 * T2_dT + + pParam->HSMHV_cisbkd * T3_dT ; + } + T12 = model->HSMHV_divxd * here->HSMHV_isbd2 ; + Ibd += T12 * vbd_jct ; + Gbd += T12 ; + + T12_dT = model->HSMHV_divxd * isbd2_dT ; + Ibd_dT += T12_dT * vbd_jct ; + + /* ibs */ + T10 = model->HSMHV_cvbs * here->HSMHV_jd_nvtm_invs ; + T10_dT = model->HSMHV_cvbs * beta_dT / pParam->HSMHV_njs ; + + T9 = model->HSMHV_cisbs * here->HSMHV_exptemps ; + T9_dT = model->HSMHV_cisbs * exptemps_dT ; + T0 = here->HSMHV_isbs2 * T9 ; + T0_dT = here->HSMHV_isbs2 * T9_dT + isbs2_dT * T9 ; + + TX = - vbs_jct * T10 ; + T2 = exp ( TX ); + T2_dVb = - T2 * T10 ; + T2_dT = T2 * TX * beta_dT * beta_inv ; + + T3 = T2 ; + T3_dVb = T2_dVb ; + T3_dT = T2_dT ; + + if ( vbs_jct < here->HSMHV_vbst ) { + TX = vbs_jct * here->HSMHV_jd_nvtm_invs ; + if ( TX < - 3*EXP_THR ) { + T1 = 0.0 ; + T1_dVb = 0.0 ; + T1_dT = 0.0 ; + } else { + T1 = exp ( TX ) ; + T1_dVb = T1 * here->HSMHV_jd_nvtm_invs ; + T1_dT = T1 * TX * beta_dT * beta_inv ; + } + Ibs = here->HSMHV_isbs * (T1 - 1.0) + + T0 * (T2 - 1.0) + + pParam->HSMHV_cisbks * (T3 - 1.0); + Gbs = here->HSMHV_isbs * T1_dVb + + T0 * T2_dVb + + pParam->HSMHV_cisbks * T3_dVb ; + Ibs_dT = here->HSMHV_isbs * T1_dT + isbs_dT * ( T1 - 1.0 ) + + T0 * T2_dT + T0_dT * ( T2 - 1.0 ) + + pParam->HSMHV_cisbks * T3_dT ; + } else { + T1 = here->HSMHV_jd_expcs ; + + T4 = here->HSMHV_isbs * here->HSMHV_jd_nvtm_invs * T1 ; + + Ibs = here->HSMHV_isbs * (T1 - 1.0) + + T4 * (vbs_jct - here->HSMHV_vbst) + + T0 * (T2 - 1.0) + + pParam->HSMHV_cisbks * (T3 - 1.0) ; + Gbs = T4 + + T0 * T2_dVb + + pParam->HSMHV_cisbks * T3_dVb ; + + T1_dT = jd_expcs_dT ; + T4_dT = isbs_dT * here->HSMHV_jd_nvtm_invs * T1 + + here->HSMHV_isbs * jd_nvtm_invs_dT * T1 + + here->HSMHV_isbs * here->HSMHV_jd_nvtm_invs * T1_dT ; + Ibs_dT = isbs_dT * ( T1 - 1.0 ) + here->HSMHV_isbs * T1_dT + + T4_dT * ( vbs_jct - here->HSMHV_vbst) - T4 * vbst_dT + + T0_dT * ( T2 - 1.0 ) + T0 * T2_dT + + pParam->HSMHV_cisbks * T3_dT ; + } + T12 = model->HSMHV_divxs * here->HSMHV_isbs2 ; + Ibs += T12 * vbs_jct ; + Gbs += T12 ; + + T12_dT = model->HSMHV_divxs * isbs2_dT ; + Ibs_dT += T12_dT * vbs_jct ; + + + /*-----------------------------------------------------------* + * Charges and Capacitances. + *-----------------*/ + /* charge storage elements + * bulk-drain and bulk-source depletion capacitances + * czbd : zero bias drain junction capacitance + * czbs : zero bias source junction capacitance + * czbdsw:zero bias drain junction sidewall capacitance + * czbssw:zero bias source junction sidewall capacitance + */ + + /* Source Bulk Junction */ + tcjbs = model->HSMHV_tcjbs ; + tcjbssw = model->HSMHV_tcjbssw ; + tcjbsswg = model->HSMHV_tcjbsswg ; + + czbs = model->HSMHV_cjs * here->HSMHV_as ; + czbs = czbs * ( 1.0 + tcjbs * ( TTEMP - model->HSMHV_ktnom )) ; + czbs_dT = ( model->HSMHV_cjs * here->HSMHV_as ) * tcjbs ; + + if (here->HSMHV_ps > here->HSMHV_weff_nf) { + czbssw = model->HSMHV_cjsws * ( here->HSMHV_ps - here->HSMHV_weff_nf ) ; + czbssw = czbssw * ( 1.0 + tcjbssw * ( TTEMP - model->HSMHV_ktnom )) ; + czbssw_dT = ( model->HSMHV_cjsws * ( here->HSMHV_ps - here->HSMHV_weff_nf )) * tcjbssw ; + + czbsswg = model->HSMHV_cjswgs * here->HSMHV_weff_nf ; + czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSMHV_ktnom )) ; + czbsswg_dT = ( model->HSMHV_cjswgs * here->HSMHV_weff_nf ) * tcjbsswg ; + +// if (vbs_jct == 0.0) { + if (0) { + Qbs = 0.0 ; + Qbs_dT = 0.0 ; + Capbs = czbs + czbssw + czbsswg ; + } else if (vbs_jct < 0.0) { + if (czbs > 0.0) { + arg = 1.0 - vbs_jct / model->HSMHV_pbs ; + if (model->HSMHV_mjs == 0.5) + sarg = 1.0 / sqrt(arg) ; + else + sarg = Fn_Pow( arg , -model->HSMHV_mjs ) ; + Qbs = model->HSMHV_pbs * czbs * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjs) ; + Qbs_dT = model->HSMHV_pbs * czbs_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjs) ; + Capbs = czbs * sarg ; + } else { + Qbs = 0.0 ; + Qbs_dT = 0.0 ; + Capbs = 0.0 ; + } + if (czbssw > 0.0) { + arg = 1.0 - vbs_jct / model->HSMHV_pbsws ; + if (model->HSMHV_mjsws == 0.5) + sarg = 1.0 / sqrt(arg) ; + else + sarg = Fn_Pow( arg , -model->HSMHV_mjsws ) ; + Qbs += model->HSMHV_pbsws * czbssw * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjsws) ; + Qbs_dT += model->HSMHV_pbsws * czbssw_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjsws) ; + Capbs += czbssw * sarg ; + } + if (czbsswg > 0.0) { + arg = 1.0 - vbs_jct / model->HSMHV_pbswgs ; + if (model->HSMHV_mjswgs == 0.5) + sarg = 1.0 / sqrt(arg) ; + else + sarg = Fn_Pow( arg , -model->HSMHV_mjswgs ) ; + Qbs += model->HSMHV_pbswgs * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgs) ; + Qbs_dT += model->HSMHV_pbswgs * czbsswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgs) ; + Capbs += czbsswg * sarg ; + } + } else { + T1 = czbs + czbssw + czbsswg ; + T1_dT = czbs_dT + czbssw_dT + czbsswg_dT ; + T2 = czbs * model->HSMHV_mjs / model->HSMHV_pbs + + czbssw * model->HSMHV_mjsws / model->HSMHV_pbsws + + czbsswg * model->HSMHV_mjswgs / model->HSMHV_pbswgs ; + T2_dT = czbs_dT * model->HSMHV_mjs / model->HSMHV_pbs + + czbssw_dT * model->HSMHV_mjsws / model->HSMHV_pbsws + + czbsswg_dT * model->HSMHV_mjswgs / model->HSMHV_pbswgs ; + Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ; + Qbs_dT = vbs_jct * (T1_dT + vbs_jct * 0.5 * T2_dT) ; + Capbs = T1 + vbs_jct * T2 ; + } + } else { + czbsswg = model->HSMHV_cjswgs * here->HSMHV_ps ; + czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSMHV_ktnom )) ; + czbsswg_dT = ( model->HSMHV_cjswgs * here->HSMHV_ps ) * tcjbsswg ; + +// if (vbs_jct == 0.0) { + if (0) { + Qbs = 0.0 ; + Qbs_dT = 0.0 ; + Capbs = czbs + czbsswg ; + } else if (vbs_jct < 0.0) { + if (czbs > 0.0) { + arg = 1.0 - vbs_jct / model->HSMHV_pbs ; + if (model->HSMHV_mjs == 0.5) + sarg = 1.0 / sqrt(arg) ; + else + sarg = Fn_Pow( arg , -model->HSMHV_mjs ) ; + Qbs = model->HSMHV_pbs * czbs * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjs) ; + Qbs_dT = model->HSMHV_pbs * czbs_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjs) ; + Capbs = czbs * sarg ; + } else { + Qbs = 0.0 ; + Qbs_dT = 0.0 ; + Capbs = 0.0 ; + } + if (czbsswg > 0.0) { + arg = 1.0 - vbs_jct / model->HSMHV_pbswgs ; + if (model->HSMHV_mjswgs == 0.5) + sarg = 1.0 / sqrt(arg) ; + else + sarg = Fn_Pow( arg , -model->HSMHV_mjswgs ) ; + Qbs += model->HSMHV_pbswgs * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgs) ; + Qbs_dT += model->HSMHV_pbswgs * czbsswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgs) ; + Capbs += czbsswg * sarg ; + } + } else { + T1 = czbs + czbsswg ; + T1_dT = czbs_dT + czbsswg_dT ; + T2 = czbs * model->HSMHV_mjs / model->HSMHV_pbs + + czbsswg * model->HSMHV_mjswgs / model->HSMHV_pbswgs ; + T2_dT = czbs_dT * model->HSMHV_mjs / model->HSMHV_pbs + + czbsswg_dT * model->HSMHV_mjswgs / model->HSMHV_pbswgs ; + Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ; + Qbs_dT = vbs_jct * (T1_dT + vbs_jct * 0.5 * T2_dT) ; + Capbs = T1 + vbs_jct * T2 ; + } + } + + /* Drain Bulk Junction */ + tcjbd = model->HSMHV_tcjbd ; + tcjbdsw = model->HSMHV_tcjbdsw ; + tcjbdswg = model->HSMHV_tcjbdswg ; + + czbd = model->HSMHV_cjd * here->HSMHV_ad ; + czbd = czbd * ( 1.0 + tcjbd * ( TTEMP - model->HSMHV_ktnom )) ; + czbd_dT = ( model->HSMHV_cjd * here->HSMHV_ad ) * tcjbd ; + + if (here->HSMHV_pd > here->HSMHV_weff_nf) { + + czbdsw = model->HSMHV_cjswd * ( here->HSMHV_pd - here->HSMHV_weff_nf ) ; + czbdsw = czbdsw * ( 1.0 + tcjbdsw * ( TTEMP - model->HSMHV_ktnom )) ; + czbdsw_dT = ( model->HSMHV_cjswd * ( here->HSMHV_pd - here->HSMHV_weff_nf )) * tcjbdsw ; + + czbdswg = model->HSMHV_cjswgd * here->HSMHV_weff_nf ; + czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSMHV_ktnom )) ; + czbdswg_dT = ( model->HSMHV_cjswgd * here->HSMHV_weff_nf ) * tcjbdswg ; + +// if (vbd_jct == 0.0) { + if (0) { + Qbd = 0.0 ; + Qbd_dT = 0.0 ; + Capbd = czbd + czbdsw + czbdswg ; + } else if (vbd_jct < 0.0) { + if (czbd > 0.0) { + arg = 1.0 - vbd_jct / model->HSMHV_pbd ; + if (model->HSMHV_mjd == 0.5) + sarg = 1.0 / sqrt(arg) ; + else + sarg = Fn_Pow( arg , -model->HSMHV_mjd ) ; + Qbd = model->HSMHV_pbd * czbd * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjd) ; + Qbd_dT = model->HSMHV_pbd * czbd_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjd) ; + Capbd = czbd * sarg ; + } else { + Qbd = 0.0 ; + Qbd_dT = 0.0 ; + Capbd = 0.0 ; + } + if (czbdsw > 0.0) { + arg = 1.0 - vbd_jct / model->HSMHV_pbswd ; + if (model->HSMHV_mjswd == 0.5) + sarg = 1.0 / sqrt(arg) ; + else + sarg = Fn_Pow( arg , -model->HSMHV_mjswd ) ; + Qbd += model->HSMHV_pbswd * czbdsw * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswd) ; + Qbd_dT += model->HSMHV_pbswd * czbdsw_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswd) ; + Capbd += czbdsw * sarg ; + } + if (czbdswg > 0.0) { + arg = 1.0 - vbd_jct / model->HSMHV_pbswgd ; + if (model->HSMHV_mjswgd == 0.5) + sarg = 1.0 / sqrt(arg) ; + else + sarg = Fn_Pow( arg , -model->HSMHV_mjswgd ) ; + Qbd += model->HSMHV_pbswgd * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgd) ; + Qbd_dT += model->HSMHV_pbswgd * czbdswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgd) ; + Capbd += czbdswg * sarg ; + + } + } else { + T1 = czbd + czbdsw + czbdswg ; + T1_dT = czbd_dT + czbdsw_dT + czbdswg_dT ; + T2 = czbd * model->HSMHV_mjd / model->HSMHV_pbd + + czbdsw * model->HSMHV_mjswd / model->HSMHV_pbswd + + czbdswg * model->HSMHV_mjswgd / model->HSMHV_pbswgd ; + T2_dT = czbd_dT * model->HSMHV_mjd / model->HSMHV_pbd + + czbdsw_dT * model->HSMHV_mjswd / model->HSMHV_pbswd + + czbdswg_dT * model->HSMHV_mjswgd / model->HSMHV_pbswgd ; + Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ; + Qbd_dT = vbd_jct * (T1_dT + vbd_jct * 0.5 * T2_dT) ; + Capbd = T1 + vbd_jct * T2 ; + } + + } else { + czbdswg = model->HSMHV_cjswgd * here->HSMHV_pd ; + czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSMHV_ktnom )) ; + czbdswg_dT = ( model->HSMHV_cjswgd * here->HSMHV_pd ) * tcjbdswg ; + +// if (vbd_jct == 0.0) { + if (0) { + Qbd = 0.0 ; + Qbd_dT = 0.0 ; + Capbd = czbd + czbdswg ; + } else if (vbd_jct < 0.0) { + if (czbd > 0.0) { + arg = 1.0 - vbd_jct / model->HSMHV_pbd ; + if (model->HSMHV_mjd == 0.5) + sarg = 1.0 / sqrt(arg) ; + else + sarg = Fn_Pow( arg , -model->HSMHV_mjd ) ; + Qbd = model->HSMHV_pbd * czbd * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjd) ; + Qbd_dT = model->HSMHV_pbd * czbd_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjd) ; + Capbd = czbd * sarg ; + } else { + Qbd = 0.0 ; + Qbd_dT = 0.0 ; + Capbd = 0.0 ; + } + if (czbdswg > 0.0) { + arg = 1.0 - vbd_jct / model->HSMHV_pbswgd ; + if (model->HSMHV_mjswgd == 0.5) + sarg = 1.0 / sqrt(arg) ; + else + sarg = Fn_Pow( arg , -model->HSMHV_mjswgd ) ; + Qbd += model->HSMHV_pbswgd * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgd) ; + Qbd_dT += model->HSMHV_pbswgd * czbdswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgd) ; + Capbd += czbdswg * sarg ; + } + } else { + T1 = czbd + czbdswg ; + T1_dT = czbd_dT + czbdswg_dT ; + T2 = czbd * model->HSMHV_mjd / model->HSMHV_pbd + + czbdswg * model->HSMHV_mjswgd / model->HSMHV_pbswgd ; + T2_dT = czbd_dT * model->HSMHV_mjd / model->HSMHV_pbd + + czbdswg_dT * model->HSMHV_mjswgd / model->HSMHV_pbswgd ; + Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ; + Qbd_dT = vbd_jct * (T1_dT + vbd_jct * 0.5 * T2_dT) ; + Capbd = T1 + vbd_jct * T2 ; + } + } + + + /*---------------------------------------------------* + * Junction diode. + *-----------------*/ + here->HSMHV_ibs = Mfactor * Ibs ; + here->HSMHV_ibd = Mfactor * Ibd ; + here->HSMHV_gbs = Mfactor * Gbs ; + here->HSMHV_gbd = Mfactor * Gbd ; + *(ckt->CKTstate0 + here->HSMHVqbs) = Mfactor * Qbs ; + *(ckt->CKTstate0 + here->HSMHVqbd) = Mfactor * Qbd ; + here->HSMHV_capbs = Mfactor * Capbs ; + here->HSMHV_capbd = Mfactor * Capbd ; + + here->HSMHV_gbdT = Mfactor * Ibd_dT ; + here->HSMHV_gbsT = Mfactor * Ibs_dT ; + here->HSMHV_gcbdT = Mfactor * Qbd_dT ; + here->HSMHV_gcbsT = Mfactor * Qbs_dT ; + + /*-----------------------------------------------------------* + * Warn floating-point exceptions. + * - Function finite() in libm is called. + *-----------------*/ + T1 = here->HSMHV_ibs + here->HSMHV_ibd + here->HSMHV_gbs + here->HSMHV_gbd; + T1 = T1 + *(ckt->CKTstate0 + here->HSMHVqbs) + + *(ckt->CKTstate0 + here->HSMHVqbd) + + here->HSMHV_capbs + + here->HSMHV_capbd; + if ( ! finite (T1) ) { + flg_err = 1 ; + fprintf(stderr , + "*** warning(HiSIM_HV(%s)): FP-exception (junction diode)\n",model->HSMHVmodName) ; + if ( flg_info >= 1 ) { + printf ("*** warning(HiSIM_HV(%s)): FP-exception\n",model->HSMHVmodName) ; + } + } + + /*-----------------------------------------------------------* + * End of HSMHVeval_dio + *-----------------*/ + + return ( HiSIM_OK ) ; + +} diff --git a/src/spicelib/devices/hisimhv1/hsmhveval_qover.h b/src/spicelib/devices/hisimhv1/hsmhveval_qover.h index 8b6f7ef64..80f25b69f 100644 --- a/src/spicelib/devices/hisimhv1/hsmhveval_qover.h +++ b/src/spicelib/devices/hisimhv1/hsmhveval_qover.h @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhveval_qover.h - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + /* Begin HSMHVevalQover */ /*---------------------------------------------------* @@ -61,7 +103,7 @@ /*-----------------------------------* * QsuLD: total charge = Accumulation | Depletion+inversion *-----------------*/ - if ( VgpLD < Vgb_fb_LD ){ + if ( VgpLD < Vgb_fb_LD ){ /*---------------------------* * Accumulation *-----------------*/ @@ -94,16 +136,23 @@ Ac3_dVgb = T1 * Ac31_dVgb ; Ac3_dT = T1 * Ac31_dT ; - Ac2 = sqrt( Ac4 + Ac3 ) ; - T1 = 0.5 / Ac2 ; - Ac2_dVxb = T1 * Ac3_dVxb ; - Ac2_dVgb = T1 * Ac3_dVgb ; - Ac2_dT = T1 * ( Ac4_dT + Ac3_dT ); + if ( Ac4 < Ac3*1.0e-8 ) { + Ac1 = 0.5*Ac4/Ac31 ; + Ac1_dVxb = - 0.5*Ac4/Ac3*Ac31_dVxb ; + Ac1_dVgb = - 0.5*Ac4/Ac3*Ac31_dVxb ; + Ac1_dT = 0.5*Ac4_dT/Ac31 - 0.5*Ac4/Ac3*Ac31_dT ; + } else { + Ac2 = sqrt( Ac4 + Ac3 ) ; + T1 = 0.5 / Ac2 ; + Ac2_dVxb = T1 * Ac3_dVxb ; + Ac2_dVgb = T1 * Ac3_dVgb ; + Ac2_dT = T1 * ( Ac4_dT + Ac3_dT ); - Ac1 = -7.0 * C_SQRT_2 + Ac2 + 9.0 * TY * ( TX - 2.0 ) ; - Ac1_dVxb = Ac2_dVxb + 9.0 * TY * TX_dVxb ; - Ac1_dVgb = Ac2_dVgb + 9.0 * TY * TX_dVgb ; - Ac1_dT = Ac2_dT + 9.0 * ( TY_dT * ( TX - 2.0 ) + TY * TX_dT ) ; + Ac1 = -Ac31 + Ac2 ; + Ac1_dVxb = Ac2_dVxb -Ac31_dVxb ; + Ac1_dVgb = Ac2_dVgb -Ac31_dVgb ; + Ac1_dT = Ac2_dT -Ac31_dT ; + } Acd = pow( Ac1 , C_1o3 ) ; T1 = C_1o3 / ( Acd * Acd ) ; @@ -271,14 +320,14 @@ VgpLD_shift_dVgb = VgpLD_dVgb; VgpLD_shift_dVxb = Vxbgmtcl_dVxbgmt; VgpLD_shift_dT = Vxbgmtcl_dT; - exp_bVbs = exp( beta * - Vxbgmtcl ) + small ; + exp_bVbs = exp( beta * - Vxbgmtcl ) + small; exp_bVbs_dVxb = - exp_bVbs * beta * Vxbgmtcl_dVxbgmt; exp_bVbs_dT = - exp_bVbs * (beta_dT*Vxbgmtcl + beta*Vxbgmtcl_dT); T0 = here->HSMHV_nin / Nover_func; T0_dT = Nin_dT / Nover_func; cnst1over = T0 * T0; cnst1over_dT = 2.0 * T0 * T0_dT; - gamma = cnst1over * exp_bVbs ; + gamma = cnst1over * exp_bVbs; gamma_dVxb = cnst1over * exp_bVbs_dVxb; gamma_dT = cnst1over_dT * exp_bVbs + cnst1over * exp_bVbs_dT; @@ -311,8 +360,8 @@ psi += beta*0.1 ; psi_dT += beta_dT*0.1 ; -/* psi_B = psi;*/ -/* arg_B = psi*psi/(gamma*T0);*/ + psi_B = psi; + arg_B = psi*psi/(gamma*T0); Chi_B = log(gamma*T0 + psi*psi) - log(cnst1over*T0) + beta*Vxbgmtcl; Chi_B_dVgb = 2.0*psi*psi_dVgb/ (gamma*T0 + psi*psi); Chi_B_dVxb = (gamma_dVxb*T0+2.0*psi*psi_dVxb)/(gamma*T0+psi*psi) @@ -321,10 +370,10 @@ - (cnst1over_dT*T0 + cnst1over*T0_dT)/(cnst1over*T0) + beta_dT*Vxbgmtcl + beta*Vxbgmtcl_dT; 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; Ps0_iniB_dT = Chi_B_dT/beta - Chi_B/(beta*beta)*beta_dT - Vxbgmtcl_dT; -*/ + /* construction of Ps0LD by taking Ps0_iniB as an upper limit of Ps0_iniA * @@ -473,7 +522,7 @@ *-----------------*/ if ( flg_conv == 0 ) { fprintf( stderr , - "*** warning(HiSIM_HV): Went Over Iteration Maximum (Ps0LD)\n" ) ; + "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Ps0LD)\n",model->HSMHVmodName ) ; fprintf( stderr , " -Vxbgmtcl = %e Vgbgmt = %e\n" , -Vxbgmtcl , Vgbgmt ) ; } @@ -577,7 +626,7 @@ fs01_dVgs = Ps0LD_dVgb * fs01_dPs0 ; fs01_dT = Ps0LD_dT * fs01_dPs0 + fs01_dT; 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 ; fs02_dT = Ps0LD_dT * fs02_dPs0 + fs02_dT; @@ -616,9 +665,9 @@ } /* end of Vgbgmt region blocks */ /* convert to source ref. */ -/* Ps0LD_dVbs = Ps0LD_dVxb * Vxbgmt_dVbs + Ps0LD_dVgb * Vgbgmt_dVbs ;*/ + Ps0LD_dVbs = Ps0LD_dVxb * Vxbgmt_dVbs + Ps0LD_dVgb * Vgbgmt_dVbs ; Ps0LD_dVds = Ps0LD_dVxb * Vxbgmt_dVds + Ps0LD_dVgb * Vgbgmt_dVds ; -/* Ps0LD_dVgs = Ps0LD_dVxb * Vxbgmt_dVgs + Ps0LD_dVgb * Vgbgmt_dVgs ;*/ + Ps0LD_dVgs = Ps0LD_dVxb * Vxbgmt_dVgs + Ps0LD_dVgb * Vgbgmt_dVgs ; QsuLD_dVbs = QsuLD_dVxb * Vxbgmt_dVbs + QsuLD_dVgb * Vgbgmt_dVbs ; QsuLD_dVds = QsuLD_dVxb * Vxbgmt_dVds + QsuLD_dVgb * Vgbgmt_dVds ; diff --git a/src/spicelib/devices/hisimhv1/hsmhveval_rdrift.c b/src/spicelib/devices/hisimhv1/hsmhveval_rdrift.c new file mode 100644 index 000000000..23edb6127 --- /dev/null +++ b/src/spicelib/devices/hisimhv1/hsmhveval_rdrift.c @@ -0,0 +1,656 @@ +/*********************************************************************** + + HiSIM (Hiroshima University STARC IGFET Model) + Copyright (C) 2014 Hiroshima University & STARC + + MODEL NAME : HiSIM_HV + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 + FILE : hsmhveval_rdrift.c + + DATE : 2014.6.11 + + released by + Hiroshima University & + Semiconductor Technology Academic Research Center (STARC) +***********************************************************************/ + +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + +/*===========================================================* +* Preamble. +*=================*/ +/*---------------------------------------------------* +* Header files. +*-----------------*/ +#include "ngspice/ngspice.h" +#ifdef __STDC__ +/* #include */ +#endif + +/*-----------------------------------* +* HiSIM macros +*-----------------*/ +#include "hisimhv.h" +#include "hsmhvevalenv.h" + +/* local variables used in macro functions */ +double TMF0 , TMF1 , TMF2 , TMF3 , TMF4 , TMF5 , TMF6 ; + +/*===========================================================* +* pow +*=================*/ +#ifdef POW_TO_EXP_AND_LOG +#define Fn_Pow( x , y ) exp( y * log( x ) ) +#else +#define Fn_Pow( x , y ) pow( x , y ) +#endif + +/*===========================================================* +* Macro Functions for ceiling/flooring/symmetrization. +*=================*/ +/*---------------------------------------------------* +* smoothUpper: ceiling. +* y = xmax - 0.5 ( arg + sqrt( arg^2 + 4 xmax delta ) ) +* arg = xmax - x - delta +*-----------------*/ + +#define Fn_SU( y , x , xmax , delta , dx ) { \ + TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ + TMF2 = 4.0 * ( xmax ) * ( delta) ; \ + TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ + TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ + dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ + y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ + } + +#define Fn_SU2( y , x , xmax , delta , dy_dx , dy_dxmax ) { \ + TMF1 = ( xmax ) - ( x ) - ( delta ) ; \ + TMF2 = 4.0 * ( xmax ) * ( delta) ; \ + TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ + TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ + dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ + dy_dxmax = 0.5 * ( 1.0 - ( TMF1 + 2.0 * delta ) / TMF2 ) ; \ + y = ( xmax ) - 0.5 * ( TMF1 + TMF2 ) ; \ + } + +/*---------------------------------------------------* +* smoothLower: flooring. +* y = xmin + 0.5 ( arg + sqrt( arg^2 + 4 xmin delta ) ) +* arg = x - xmin - delta +*-----------------*/ + +#define Fn_SL( y , x , xmin , delta , dx ) { \ + TMF1 = ( x ) - ( xmin ) - ( delta ) ; \ + TMF2 = 4.0 * ( xmin ) * ( delta ) ; \ + TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ + TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ + dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ + y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \ + } + +#define Fn_SL2( y , x , xmin , delta , dy_dx, dy_dxmin ) { \ + TMF1 = ( x ) - ( xmin ) - ( delta ) ; \ + TMF2 = 4.0 * ( xmin ) * ( delta ) ; \ + TMF2 = TMF2 > 0.0 ? TMF2 : - ( TMF2 ) ; \ + TMF2 = sqrt ( TMF1 * TMF1 + TMF2 ) ; \ + dy_dx = 0.5 * ( 1.0 + TMF1 / TMF2 ) ; \ + dy_dxmin = 0.5 * ( 1.0 - ( TMF1 - 2.0 * delta ) / TMF2 ) ; \ + y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \ + } + +/*---------------------------------------------------* +* smoothZero: flooring to zero. +* y = 0.5 ( x + sqrt( x^2 + 4 delta^2 ) ) +*-----------------*/ + +#define Fn_SZ( y , x , delta , dx ) { \ + TMF2 = sqrt ( ( x ) * ( x ) + 4.0 * ( delta ) * ( delta ) ) ; \ + dx = 0.5 * ( 1.0 + ( x ) / TMF2 ) ; \ + y = 0.5 * ( ( x ) + TMF2 ) ; \ + if( y < 0.0 ) { y=0.0; dx=0.0; } \ + } + +/*---------------------------------------------------* +* SymAdd: evaluate additional term for symmetry. +*-----------------*/ + +#define Fn_SymAdd( y , x , add0 , dx ) \ +{ \ + if( ( x ) < 1e6 ) { \ + TMF1 = 2.0 * ( x ) / ( add0 ) ; \ + TMF2 = 1.0 + TMF1 * ( (1.0/2) + TMF1 * ( (1.0/6) \ + + TMF1 * ( (1.0/24) + TMF1 * ( (1.0/120) \ + + TMF1 * ( (1.0/720) + TMF1 * (1.0/5040) ) ) ) ) ) ; \ + TMF3 = (1.0/2) + TMF1 * ( (1.0/3) \ + + TMF1 * ( (1.0/8) + TMF1 * ( (1.0/30) \ + + TMF1 * ( (1.0/144) + TMF1 * (1.0/840) ) ) ) ) ; \ + y = add0 / TMF2 ; \ + dx = - 2.0 * TMF3 / ( TMF2 * TMF2 ) ; \ + } else { y=0.0; dx=0.9; } \ +} + +#define Fn_CP( y , x , xmax , pw , dx ) { \ + double x2 = (x) * (x) ; \ + double xmax2 = (xmax) * (xmax) ; \ + double xp = 1.0 , xmp = 1.0 ; \ + int m =0, mm =0; \ + double arg =0.0, dnm =0.0; \ + for ( m = 0 ; m < pw ; m ++ ) { xp *= x2 ; xmp *= xmax2 ; } \ + arg = xp + xmp ; \ + dnm = arg ; \ + if ( pw == 1 || pw == 2 || pw == 4 || pw == 8 ) { \ + if ( pw == 1 ) { mm = 1 ; \ + } else if ( pw == 2 ) { mm = 2 ; \ + } else if ( pw == 4 ) { mm = 3 ; \ + } else if ( pw == 8 ) { mm = 4 ; } \ + for ( m = 0 ; m < mm ; m ++ ) { dnm = sqrt( dnm ) ; } \ + } else { dnm = Fn_Pow( dnm , 1.0 / ( 2.0 * pw ) ) ; } \ + dnm = 1.0 / dnm ; \ + y = (x) * (xmax) * dnm ; \ + dx = (xmax) * xmp * dnm / arg ; \ +} + +#define Fn_SU_CP( y , x , xmax , delta , pw , dx ) { \ + if(x > xmax - delta && delta >= 0.0) { \ + TMF1 = x - xmax + delta ; \ + Fn_CP( TMF0 , TMF1 , delta , pw , dx ) \ + y = xmax - delta + TMF0 ; \ + dx = dx ; \ + } else { \ + y = x ; \ + dx = 1.0 ; \ + } \ +} + +/*===========================================================* +* Function hsmhvrdrift. +*=================*/ + +int HSMHVrdrift +( + double Vddp, + double Vds, + double Vbs, + double Vsubs, /* substrate-source voltage */ + double deltemp, + HSMHVinstance *here, + HSMHVmodel *model, + CKTcircuit *ckt +) +{ + HSMHVbinningParam *pParam = &here->pParam ; + HSMHVmodelMKSParam *modelMKS = &model->modelMKS ; + + const double small = 1.0e-50 ; + + double Mfactor =0.0, WeffLD_nf =0.0 ; + double Ldrift =0.0, Xldld =0.0 ; + double Nover =0.0 ; + + /* temporary vars. & derivatives*/ + double T0 =0.0, T0_dVb =0.0, T0_dVd =0.0, T0_dVg =0.0, T0_dT =0.0 ; + double T1 =0.0, T1_dVd =0.0, T1_dT =0.0, T1_dVddp =0.0 ; + double T2 =0.0, T2_dVb =0.0, T2_dVd =0.0, T2_dT =0.0, T2_dVddp =0.0 ; + double T3 =0.0, T3_dT =0.0, T3_dVddp =0.0 ; + double T4 =0.0, T4_dT =0.0, T4_dVddp =0.0 ; + double T5 =0.0, T5_dT =0.0, T5_dVddp =0.0 ; + double T6 =0.0, T6_dT =0.0, T6_dVddp =0.0 ; + double T9 =0.0 ; + + /* bias-dependent Rd, Rs */ + + double Edri =0.0, Edri_dVddp =0.0 ; + double Vdri =0.0, Vdri_dVddp =0.0, Vdri_dT =0.0 ; + double Vmax =0.0, Vmax_dT =0.0 ; + double Mu0 =0.0, Mu0_dT =0.0 ; + double Cx =0.0, Cx_dT =0.0 ; + double Car =0.0, Car_dT =0.0 ; + double Mu =0.0, Mu_dVddp = 0.0, Mu_dT =0.0 ; + double Xov =0.0, Xov_dVds =0.0, Xov_dVgs =0.0, Xov_dVbs =0.0, Xov_dT =0.0 ; + double Carr =0.0, Carr_dVds=0.0, Carr_dVgs=0.0, Carr_dVbs=0.0, Carr_dVddp =0.0, Carr_dT =0.0 ; + + double GD =0.0, GD_dVddp =0.0, GD_dVgse =0.0, GD_dT =0.0, GD_dVds =0.0, GD_dVgs =0.0, GD_dVbs =0.0 ; + double Rd =0.0, Rd_dVddp =0.0, Rd_dVdse =0.0, Rd_dVgse =0.0, Rd_dVbse =0.0, Rd_dT =0.0, Rd_dVds =0.0, Rd_dVgs =0.0, Rd_dVbs =0.0 ; + double Vddpz=0.0, Vddpz_dVddp=0.0, Vzadd =0.0, Vzadd_dVddp=0.0 ; + + /* temperature-dependent variables for SHE model */ + double TTEMP =0.0, TTEMP0 =0.0 ; + + /* Wdepl and Wjunc */ + double Wdepl, Wdepl_dVd, Wdepl_dVg, Wdepl_dVb, Wdepl_dT; + double Wjunc0, Wjunc0_dVd, Wjunc0_dVb; + double Wrdrdjunc, Wjunc, Wjunc_dVd, Wjunc_dVb; + + const double Res_min = 1.0e-4 ; + const double epsm10 = 10.0e0 * C_EPS_M ; + const double ps_conv = 1.0e-12 ; + + double Rdrbb_dT =0.0 ; + + double Wdep = 0.0, Wdep_dVdserev = 0.0, Wdep_dVsubsrev = 0.0 ; + double T1_dVdserev = 0.0, T1_dVsubsrev = 0.0, T6_dVdserev = 0.0, T6_dVsubsrev = 0.0 ; + double Rd_dVsubs=0.0 ; + +#define C_sub_delta 0.1 /* CHECK! */ +#define C_sub_delta2 1.0e-9 /* CHECK! */ + + NG_IGNORE(Vsubs); + + /*================ Start of executable code.=================*/ + + /*-----------------------------------------------------------* + * Temperature dependent constants. + *-----------------*/ + if ( here->HSMHVtempNode > 0 && pParam->HSMHV_rth0 != 0.0 ) { + +#define HSMHVEVAL +#include "hsmhvtemp_eval_rdri.h" + + } else { + if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; } + Mu0_dT = 0.0 ; + Vmax_dT = 0.0 ; + Cx_dT = 0.0 ; + Car_dT = 0.0 ; + Rdrbb_dT = 0.0 ; + } + + Mfactor = here->HSMHV_m ; + WeffLD_nf = here->HSMHV_weff_ld * here->HSMHV_nf ; + Ldrift = here->HSMHV_ldrift1 + here->HSMHV_ldrift2 ; + Xldld = model->HSMHV_xldld + small ; + Nover = pParam->HSMHV_nover ; + + + Mu0 = here->HSMHV_rdrmue * here->HSMHV_rdrmuel ; + Mu0_dT = Mu0_dT * here->HSMHV_rdrmuel ; + Vmax = here->HSMHV_rdrvmax * here->HSMHV_rdrvmaxw * here->HSMHV_rdrvmaxl + small ; + Vmax_dT = Vmax_dT * here->HSMHV_rdrvmaxw * here->HSMHV_rdrvmaxl ; + Cx = here->HSMHV_rdrcx * here->HSMHV_rdrcxw ; + Cx_dT = Cx_dT * here->HSMHV_rdrcxw ; + Car = here->HSMHV_rdrcar ; + + //-----------------------------------------------------------* + // Modified bias introduced to realize symmetry at Vddp=0. + //-----------------// + if(Vddp < 0) { + Fn_SymAdd( Vzadd , -Vddp / 2 , model->HSMHV_vzadd0 , T2 ) ; + Vzadd_dVddp = - T2 / 2.0 ; + if( Vzadd < ps_conv ) { + Vzadd = ps_conv ; + Vzadd_dVddp = 0.0 ; + } + Vddpz = Vddp - 2 * Vzadd ; + Vddpz_dVddp = 1.0 - 2 * Vzadd_dVddp ; + } else { + Fn_SymAdd( Vzadd , Vddp / 2 , model->HSMHV_vzadd0 , T2 ) ; + Vzadd_dVddp = T2 / 2.0 ; + if( Vzadd < ps_conv ) { + Vzadd = ps_conv ; + Vzadd_dVddp = 0.0 ; + } + Vddpz = Vddp + 2 * Vzadd ; + Vddpz_dVddp = 1.0 + 2 * Vzadd_dVddp ; + } + + Edri = Vddpz / Ldrift ; + Edri_dVddp = Vddpz_dVddp / Ldrift ; + + Vdri = Mu0 * Edri ; + Vdri_dVddp = Mu0 * Edri_dVddp ; + Vdri_dT = Mu0_dT * Edri ; + + /*-----------------------------------------------------------* + * Mu : mobility + *-----------------*/ + if ( Vddp >= 0 ) { + T1 = Vdri / Vmax ; + T1_dVddp = Vdri_dVddp / Vmax ; + T1_dT = ( Vdri_dT * Vmax - Vdri * Vmax_dT ) / ( Vmax * Vmax ); + } else { + T1 = - Vdri / Vmax ; + T1_dVddp = - Vdri_dVddp / Vmax ; + T1_dT = - ( Vdri_dT * Vmax - Vdri * Vmax_dT ) / ( Vmax * Vmax ); + } + + if( model->HSMHV_rdrbbtmp == 0.0 ) { + if( T1 == 0.0 ) { + T2 = 0.0 ; T2_dT = 0.0 ; T2_dVddp = 0.0 ; + T4 = 1.0 ; T4_dT = 0.0 ; T4_dVddp = 0.0 ; + }else { + if ( 1.0e0 - epsm10 <= here->HSMHV_rdrbb && here->HSMHV_rdrbb <= 1.0e0 + epsm10 ) { + T3 = 1.0e0 ; + T3_dT = 0.0e0 ; + T3_dVddp = 0.0e0 ; + } else if ( 2.0e0 - epsm10 <= here->HSMHV_rdrbb && here->HSMHV_rdrbb <= 2.0e0 + epsm10 ) { + T3 = T1 ; + T3_dT = T1_dT ; + T3_dVddp = T1_dVddp ; + } else { + T3 = Fn_Pow( T1 , here->HSMHV_rdrbb - 1.0e0 ) ; + T3_dT = ( here->HSMHV_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV_rdrbb - 2.0e0 ) * T1_dT ; + T3_dVddp = ( here->HSMHV_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV_rdrbb - 2.0e0 ) * T1_dVddp ; + } + T2 = T1 * T3 ; + T2_dT = T1 * T3_dT + T3 * T1_dT ; + T2_dVddp = T1 * T3_dVddp + T3 * T1_dVddp ; + T4 = 1.0e0 + T2 ; + T4_dT = T2_dT ; + T4_dVddp = T2_dVddp ; + } + + if ( 1.0e0 - epsm10 <= here->HSMHV_rdrbb && here->HSMHV_rdrbb <= 1.0e0 + epsm10 ) { + T5 = 1.0 / T4 ; + T5_dT = - T5 * T5 * T4_dT ; + T5_dVddp = - T5 * T5 * T4_dVddp ; + } else if ( 2.0e0 - epsm10 <= here->HSMHV_rdrbb && here->HSMHV_rdrbb <= 2.0e0 + epsm10 ) { + T5 = 1.0 / sqrt( T4 ) ; + T5_dT = - 0.5e0 / ( T4 * sqrt(T4) ) * T4_dT ; + T5_dVddp = - 0.5e0 / ( T4 * sqrt(T4) ) * T4_dVddp; + } else { + T6 = Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV_rdrbb - 1.0e0 ) ) ; + T5 = T4 * T6 ; + T6_dT = ( - 1.0e0 / here->HSMHV_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV_rdrbb - 2.0e0 ) ) * T4_dT ; + T6_dVddp = ( - 1.0e0 / here->HSMHV_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV_rdrbb - 2.0e0 ) ) * T4_dVddp ; + T5_dT = T4_dT * T6 + T4 * T6_dT ; + T5_dVddp = T4_dVddp * T6 + T4 * T6_dVddp ; + } + + } else { + if( T1 == 0.0 ) { + T2 = 0.0 ; T2_dT = 0.0 ; T2_dVddp = 0.0 ; + T4 = 1.0 ; T4_dT = 0.0 ; T4_dVddp = 0.0 ; + }else { + T3 = Fn_Pow( T1 , here->HSMHV_rdrbb - 1.0e0 ) ; + T3_dT = ( here->HSMHV_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV_rdrbb - 2.0e0 ) * T1_dT + T3*log(T1)*Rdrbb_dT ; + T3_dVddp = ( here->HSMHV_rdrbb - 1.0e0 )* Fn_Pow( T1 , here->HSMHV_rdrbb - 2.0e0 ) * T1_dVddp ; + T2 = T1 * T3 ; + T2_dT = T1 * T3_dT + T3 * T1_dT ; + T2_dVddp = T1 * T3_dVddp + T3 * T1_dVddp ; + T4 = 1.0e0 + T2 ; + T4_dT = T2_dT ; + T4_dVddp = T2_dVddp ; + } + T6 = Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV_rdrbb - 1.0e0 ) ) ; + T5 = T4 * T6 ; + T6_dT = ( - 1.0e0 / here->HSMHV_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV_rdrbb - 2.0e0 ) ) * T4_dT +T6*log(T4)/here->HSMHV_rdrbb/here->HSMHV_rdrbb*Rdrbb_dT ; + T6_dVddp = ( - 1.0e0 / here->HSMHV_rdrbb - 1.0e0 ) * Fn_Pow( T4 , ( - 1.0e0 / here->HSMHV_rdrbb - 2.0e0 ) ) * T4_dVddp ; + T5_dT = T4_dT * T6 + T4 * T6_dT ; + T5_dVddp = T4_dVddp * T6 + T4 * T6_dVddp ; + } + + Mu = Mu0 * T5 ; + Mu_dVddp = Mu0 * T5_dVddp ; + Mu_dT = Mu0_dT * T5 + Mu0 * T5_dT ; + + /*-----------------------------------------------------------* + * Carr : carrier density + *-----------------*/ + + T4 = 1.0e0 + T1 ; + T4_dVddp = T1_dVddp ; + T4_dT = T1_dT ; + + T5 = 1.0 / T4 ; + T5_dVddp = - T5 * T5 * T4_dVddp ; + T5_dT = - T5 * T5 * T4_dT ; + + Carr = Nover * ( 1.0 + Car * ( 1.0 - T5 ) * Vddpz / ( Ldrift - model->HSMHV_rdrdl2 ) ) ; + Carr_dVddp = Nover * Car * ( - T5_dVddp * Vddpz + ( 1.0 - T5 ) * Vddpz_dVddp ) / ( Ldrift - model->HSMHV_rdrdl2 ) ; + Carr_dT = Nover * ( Car_dT * ( 1.0 - T5 ) + Car * ( - T5_dT ) ) * Vddpz / ( Ldrift - model->HSMHV_rdrdl2 ) ; + + Carr += - here->HSMHV_QbuLD / C_QE * model->HSMHV_rdrqover; + Carr_dVds = - here->HSMHV_QbuLD_dVds / C_QE * model->HSMHV_rdrqover; + Carr_dVgs = - here->HSMHV_QbuLD_dVgs / C_QE * model->HSMHV_rdrqover; + Carr_dVbs = - here->HSMHV_QbuLD_dVbs / C_QE * model->HSMHV_rdrqover; + Carr_dT += - here->HSMHV_QbuLD_dTi / C_QE * model->HSMHV_rdrqover; + + /*-----------------------------------------------------------* + * Xov : depth of the current flow + *-----------------*/ + T0 = -here->HSMHV_Ps0LD ; + T0_dVd = -here->HSMHV_Ps0LD_dVds ; + T0_dVg = -here->HSMHV_Ps0LD_dVgs ; + T0_dVb = -here->HSMHV_Ps0LD_dVbs ; + T0_dT = -here->HSMHV_Ps0LD_dTi ; + + Fn_SZ( T0 , T0 , 1.0e-2 , T9 ) ; + T0 += epsm10 ; + T0_dVd *= T9 ; + T0_dVg *= T9 ; + T0_dVb *= T9 ; + T0_dT *= T9 ; + + Wdepl = sqrt ( here->HSMHV_kdep * T0 ) ; + Wdepl_dVd = here->HSMHV_kdep / ( 2.0 * Wdepl ) * T0_dVd ; + Wdepl_dVg = here->HSMHV_kdep / ( 2.0 * Wdepl ) * T0_dVg ; + Wdepl_dVb = here->HSMHV_kdep / ( 2.0 * Wdepl ) * T0_dVb ; + Wdepl_dT = here->HSMHV_kdep / ( 2.0 * Wdepl ) * T0_dT ; + + T2 = Vds - Vbs + model->HSMHV_vbi ; + T2_dVd = 1.0 ; + T2_dVb = -1.0 ; + + Fn_SZ( T2 , T2 , 1.0e-2 , T9 ) ; + T2 += epsm10 ; + T2_dVd *= T9 ; + T2_dVb *= T9 ; + + Wjunc0 = sqrt ( here->HSMHV_kjunc * T2 ) ; + Wjunc0_dVd = here->HSMHV_kjunc / ( 2.0 * Wjunc0 ) * T2_dVd ; + Wjunc0_dVb = here->HSMHV_kjunc / ( 2.0 * Wjunc0 ) * T2_dVb ; + Fn_SU( Wjunc, Wjunc0, Xldld, 10e-3*Xldld, T0 ); + Wjunc_dVd = Wjunc0_dVd * T0; + Wjunc_dVb = Wjunc0_dVb * T0; +// Wrdrdjunc = model->HSMHV_rdrdjunc + small ; + Wrdrdjunc = model->HSMHV_rdrdjunc + epsm10 ; + + + Xov = here->HSMHV_Xmax - Cx * ( here->HSMHV_Xmax + / Wrdrdjunc * Wdepl + here->HSMHV_Xmax / Xldld * Wjunc ) ; + Xov_dVds = - Cx * here->HSMHV_Xmax / Wrdrdjunc * Wdepl_dVd + - Cx * here->HSMHV_Xmax / Xldld * Wjunc_dVd ; + Xov_dVgs = - Cx * here->HSMHV_Xmax / Wrdrdjunc * Wdepl_dVg ; + Xov_dVbs = - Cx * here->HSMHV_Xmax / Wrdrdjunc * Wdepl_dVb + - Cx * here->HSMHV_Xmax / Xldld * Wjunc_dVb ; + Xov_dT = - Cx_dT * ( here->HSMHV_Xmax + / Wrdrdjunc * Wdepl + here->HSMHV_Xmax / Xldld * Wjunc ) + - Cx * here->HSMHV_Xmax / Wrdrdjunc * Wdepl_dT ; + + Fn_SZ( Xov , Xov , (1.0 - here->HSMHV_rdrcx) * here->HSMHV_Xmax / 100 , T9 ) ; + + Xov_dVds *= T9 ; + Xov_dVgs *= T9 ; + Xov_dVbs *= T9 ; + Xov_dT *= T9 ; + + /*-----------------------------------------------------------* + * Rd : drift resistance + *-----------------*/ + T0 = C_QE / ( Ldrift + model->HSMHV_rdrdl1 ); + T1 = T0; + T1_dVd = 0.0 ; + + GD = T1 * Xov * Mu * Carr ; + GD_dVddp = T1 * Xov * Mu_dVddp * Carr + + T1 * Xov * Mu * Carr_dVddp ; + GD_dVgse = 0.0 ; + GD_dT = T1 * Xov * Mu_dT * Carr + + T1 * Xov_dT * Mu * Carr + + T1 * Xov * Mu * Carr_dT ; + GD_dVds = T1 * Mu * (Xov_dVds * Carr + Xov * Carr_dVds) + + T1_dVd * Mu * Xov * Carr; + GD_dVgs = T1 * Mu * (Xov_dVgs * Carr + Xov * Carr_dVgs); + GD_dVbs = T1 * Mu * (Xov_dVbs * Carr + Xov * Carr_dVbs); + + if ( GD <= 0 ) { +// GD = small ; + GD = epsm10 ; + GD_dVddp = 0.0 ; + GD_dVgse = 0.0 ; + GD_dT = 0.0 ; + GD_dVds = 0.0 ; + GD_dVgs = 0.0 ; + GD_dVbs = 0.0 ; + } + + Rd = 1 / GD ; + Rd_dVddp = - GD_dVddp * Rd * Rd ; + Rd_dVgse = - GD_dVgse * Rd * Rd ; + Rd_dT = - GD_dT * Rd * Rd ; + Rd_dVds = - GD_dVds * Rd * Rd ; + Rd_dVgs = - GD_dVgs * Rd * Rd ; + Rd_dVbs = - GD_dVbs * Rd * Rd ; + + /* Weff dependence of the resistances */ + Rd = Rd / WeffLD_nf ; + + Fn_SU_CP( Rd, Rd, 1e6, 1e3, 2, T0 ) ; + + Rd_dVddp = Rd_dVddp*T0/WeffLD_nf ; + Rd_dVgse = Rd_dVgse*T0/WeffLD_nf ; + Rd_dT = Rd_dT*T0/WeffLD_nf ; + Rd_dVds = Rd_dVds*T0/WeffLD_nf ; + Rd_dVgs = Rd_dVgs*T0/WeffLD_nf ; + Rd_dVbs = Rd_dVbs*T0/WeffLD_nf ; + + if ( here->HSMHVsubNode >= 0 && + ( pParam->HSMHV_nover * ( modelMKS->HSMHV_nsubsub + pParam->HSMHV_nover ) ) > 0 ) { + /* external substrate node exists && LDMOS case: */ + /* Substrate Effect */ + T0 = model->HSMHV_vbisub - model->HSMHV_rdvdsub * here->HSMHV_Vdserevz - model->HSMHV_rdvsub * here->HSMHV_Vsubsrev ; + + Fn_SZ( T1, T0, 10.0, T2 ) ; + T1 += epsm10 ; + + T1_dVdserev = - model->HSMHV_rdvdsub * here->HSMHV_Vdserevz_dVd * T2 ; + T1_dVsubsrev = - model->HSMHV_rdvsub * T2 ; + + T0 = modelMKS->HSMHV_nsubsub / ( pParam->HSMHV_nover * ( modelMKS->HSMHV_nsubsub + pParam->HSMHV_nover ) ) ; + + T4 = 2 * C_ESI / C_QE * T0 ; + Wdep = sqrt ( T4 * T1 ) + small ; + + Wdep_dVdserev = 0.5 * T4 * T1_dVdserev / Wdep ; + Wdep_dVsubsrev = 0.5 * T4 * T1_dVsubsrev / Wdep ; + + Fn_SU( Wdep, Wdep, model->HSMHV_ddrift, C_sub_delta * model->HSMHV_ddrift, T0 ) ; + Wdep_dVdserev *= T0 ; + Wdep_dVsubsrev *= T0 ; + + T0 = model->HSMHV_ddrift - Wdep ; + Fn_SZ( T0, T0, C_sub_delta2, T2 ) ; + T0 += epsm10; + + T6 = (here->HSMHV_ldrift1 + here->HSMHV_ldrift2 ) / T0 ; + T6_dVdserev = T2 * Wdep_dVdserev * T6 / T0 ; + T6_dVsubsrev = T2 * Wdep_dVsubsrev * T6 / T0 ; + + T0 = Rd ; + Rd = T0 * T6 ; + Rd_dVddp = Rd_dVddp * T6 ; + Rd_dVgse = Rd_dVgse * T6 ; + Rd_dVdse = T0 * T6_dVdserev ; + Rd_dVbse = Rd_dVgse * T6 ; + + Rd_dVds = Rd_dVds * T6 ; + Rd_dVgs = Rd_dVgs * T6 ; + Rd_dVbs = Rd_dVbs * T6 ; + Rd_dVsubs = T0 * T6_dVsubsrev ; + Rd_dT = Rd_dT * T6 ; + + } + + + /* Sheet resistances are added. */ + Rd += here->HSMHV_rd0 ; + + /* Re-stamps for hsmhvnoi.c */ + /* Please see hsmhvnoi.c */ + if ( Rd > Res_min && model->HSMHV_cothrml ) + here->HSMHVdrainConductance = Mfactor / Rd ; + else here->HSMHVdrainConductance = 0.0 ; + if ( here->HSMHV_Rs > Res_min && model->HSMHV_cothrml ) + here->HSMHVsourceConductance = Mfactor / here->HSMHV_rs0 ; + else here->HSMHVsourceConductance = 0.0 ; + + /* Clamping to Res_min */ + here->HSMHV_Rs = here->HSMHV_rs0 / Mfactor ; + if(here->HSMHV_Rs < Res_min) { here->HSMHV_Rs = Res_min ; } + here->HSMHV_dRs_dVdse = 0.0 ; + here->HSMHV_dRs_dVgse = 0.0 ; + here->HSMHV_dRs_dVbse = 0.0 ; + here->HSMHV_dRs_dVsubs = 0.0 ; + here->HSMHV_dRs_dTi = 0.0 ; + + + /* Clamping to Res_min */ + here->HSMHV_Rd = Rd / Mfactor ; + if(here->HSMHV_Rd < Res_min) { + here->HSMHV_Rd = Res_min ; + here->HSMHV_dRd_dVddp = 0.0 ; + here->HSMHV_dRd_dVdse = 0.0 ; + here->HSMHV_dRd_dVgse = 0.0 ; + here->HSMHV_dRd_dVbse = 0.0 ; + here->HSMHV_dRd_dVsubs = 0.0 ; + here->HSMHV_dRd_dTi = 0.0 ; + here->HSMHV_dRd_dVds = 0.0 ; + here->HSMHV_dRd_dVgs = 0.0 ; + here->HSMHV_dRd_dVbs = 0.0 ; + } else { + here->HSMHV_dRd_dVddp = Rd_dVddp / Mfactor ; + here->HSMHV_dRd_dVdse = Rd_dVdse / Mfactor ; + here->HSMHV_dRd_dVgse = Rd_dVgse / Mfactor ; + here->HSMHV_dRd_dVbse = Rd_dVbse / Mfactor ; + here->HSMHV_dRd_dVsubs= Rd_dVsubs / Mfactor ; + here->HSMHV_dRd_dTi = Rd_dT / Mfactor ; + here->HSMHV_dRd_dVds = Rd_dVds / Mfactor ; + here->HSMHV_dRd_dVgs = Rd_dVgs / Mfactor ; + here->HSMHV_dRd_dVbs = Rd_dVbs / Mfactor ; + } + + + return ( HiSIM_OK ) ; + +} diff --git a/src/spicelib/devices/hisimhv1/hsmhvevalenv.h b/src/spicelib/devices/hisimhv1/hsmhvevalenv.h index 5dd2ef485..3dfec731d 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvevalenv.h +++ b/src/spicelib/devices/hisimhv1/hsmhvevalenv.h @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvevalenv.h - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #ifndef HSMHV_EVAL_ENV_H #define HSMHV_EVAL_ENV_H @@ -88,4 +130,13 @@ #define Fn_Min(x,y) ( (x) <= (y) ? (x) : (y) ) /* min[x,y] */ #define Fn_Sgn(x) ( (x) >= 0 ? (1) : (-1) ) /* sign[x] */ +/*===========================================================* +* pow +*=================*/ +#ifdef POW_TO_EXP_AND_LOG +#define Fn_Pow( x , y ) exp( (y) * log( x ) ) +#else +#define Fn_Pow( x , y ) pow( x , y ) +#endif + #endif /* HSMHV_EVAL_ENV_H */ diff --git a/src/spicelib/devices/hisimhv1/hsmhvext.h b/src/spicelib/devices/hisimhv1/hsmhvext.h index 7ba0be7ba..72971ccad 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvext.h +++ b/src/spicelib/devices/hisimhv1/hsmhvext.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_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvext.h - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & diff --git a/src/spicelib/devices/hisimhv1/hsmhvgetic.c b/src/spicelib/devices/hisimhv1/hsmhvgetic.c index 68b751e46..678450b20 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvgetic.c +++ b/src/spicelib/devices/hisimhv1/hsmhvgetic.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvgetic.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/cktdefs.h" #include "hsmhvdef.h" diff --git a/src/spicelib/devices/hisimhv1/hsmhvitf.h b/src/spicelib/devices/hisimhv1/hsmhvitf.h index 27a3cad2a..8173e6a58 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvitf.h +++ b/src/spicelib/devices/hisimhv1/hsmhvitf.h @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvitf - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #ifndef DEV_HISIMHV #define DEV_HISIMHV diff --git a/src/spicelib/devices/hisimhv1/hsmhvld.c b/src/spicelib/devices/hisimhv1/hsmhvld.c index 5aff325ef..acd1e0350 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvld.c +++ b/src/spicelib/devices/hisimhv1/hsmhvld.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvld.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "hisimhv.h" #include "ngspice/trandefs.h" @@ -163,7 +205,7 @@ static void ShowPhysVals int HSMHVload( GENmodel *inModel, - register CKTcircuit *ckt) + CKTcircuit *ckt) /* actually load the current value into the * sparse matrix previously provided */ @@ -171,8 +213,8 @@ int HSMHVload( register HSMHVmodel *model = (HSMHVmodel*)inModel; register HSMHVinstance *here; HSMHVbinningParam *pParam; -/* HSMHVmodelMKSParam *modelMKS ;*/ -/* HSMHVhereMKSParam *hereMKS ;*/ + HSMHVmodelMKSParam *modelMKS ; + HSMHVhereMKSParam *hereMKS ; @@ -206,12 +248,17 @@ int HSMHVload( double Igb=0.0, dIgb_dVd=0.0, dIgb_dVg=0.0, dIgb_dVb=0.0, dIgb_dVs=0.0, dIgb_dT=0.0 ; double Isub=0.0, dIsub_dVds=0.0, dIsub_dVgs=0.0, dIsub_dVbs=0.0, dIsub_dT=0.0 ; double Isubs=0.0, dIsubs_dVds=0.0, dIsubs_dVgs=0.0, dIsubs_dVbs=0.0, dIsubs_dT=0.0 ; - double dIsub_dVdse=0.0, dIsubs_dVdse=0.0 ; + double IsubLD=0.0, dIsubLD_dVds=0.0, dIsubLD_dVgs=0.0, dIsubLD_dVbs=0.0, dIsubLD_dT=0.0 ; + double IsubLDs=0.0, dIsubLDs_dVds=0.0, dIsubLDs_dVgs=0.0, dIsubLDs_dVbs=0.0, dIsubLDs_dT=0.0 ; + double dIsubLD_dVddp=0.0, dIsubLDs_dVddp=0.0 ; + double IdsIBPC=0.0, dIdsIBPC_dVds=0.0, dIdsIBPC_dVgs=0.0, dIdsIBPC_dVbs=0.0, dIdsIBPC_dT=0.0 ; + double IdsIBPCs=0.0, dIdsIBPCs_dVds=0.0, dIdsIBPCs_dVgs=0.0, dIdsIBPCs_dVbs=0.0, dIdsIBPCs_dT=0.0 ; + double dIdsIBPC_dVddp=0.0, dIdsIBPCs_dVddp=0.0 ; double Igidl=0.0, dIgidl_dVds=0.0, dIgidl_dVgs=0.0, dIgidl_dVbs=0.0, dIgidl_dT=0.0 ; double Igisl=0.0, dIgisl_dVds=0.0, dIgisl_dVgs=0.0, dIgisl_dVbs=0.0, dIgisl_dT=0.0 ; double Ibd=0.0, Gbd=0.0, Gbdt=0.0 ; double Ibs=0.0, Gbs=0.0, Gbst=0.0 ; - double Iddp=0.0, dIddp_dVddp=0.0, dIddp_dVdse=0.0, dIddp_dVgse=0.0, dIddp_dVbse=0.0, dIddp_dVsubs=0.0, dIddp_dT =0.0 ; + double Iddp=0.0, dIddp_dVddp=0.0, dIddp_dVdse=0.0, dIddp_dVgse=0.0, dIddp_dVbse=0.0, dIddp_dVsubs=0.0, dIddp_dT =0.0 , dIddp_dVds =0.0, dIddp_dVgs =0.0, dIddp_dVbs =0.0 ; double Issp=0.0, dIssp_dVssp=0.0, dIssp_dVdse=0.0, dIssp_dVgse=0.0, dIssp_dVbse=0.0, dIssp_dVsubs=0.0, dIssp_dT =0.0 ; double Iggp=0.0, dIggp_dVggp =0.0 ; double Ibpb=0.0, dIbpb_dVbpb =0.0 ; @@ -228,10 +275,10 @@ int HSMHVload( double i_d=0.0, i_dP=0.0, i_g=0.0, i_gP=0.0, i_s=0.0, i_sP=0.0, i_bP=0.0, i_b=0.0, i_db=0.0, i_sb=0.0, i_t=0.0 ; /* resistances and conductances */ - double Rd=0.0, dRd_dVdse=0.0, dRd_dVgse=0.0, dRd_dVbse=0.0, dRd_dVsubs=0.0, dRd_dT=0.0 ; + double Rd=0.0, dRd_dVdse=0.0, dRd_dVgse=0.0, dRd_dVbse=0.0, dRd_dVsubs=0.0, dRd_dT=0.0, dRd_dVddp=0.0, dRd_dVds=0.0, dRd_dVgs=0.0, dRd_dVbs=0.0 ; double Rs=0.0, dRs_dVdse=0.0, dRs_dVgse=0.0, dRs_dVbse=0.0, dRs_dVsubs=0.0, dRs_dT=0.0 ; - double GD=0.0, GD_dVds=0.0, GD_dVgs=0.0, GD_dVbs=0.0, GD_dVsubs=0.0, GD_dT=0.0 ; + double GD=0.0, GD_dVds=0.0, GD_dVgs=0.0, GD_dVbs=0.0, GD_dVsubs=0.0, GD_dT=0.0, GD_dVddp=0.0, GD_dVdse=0.0, GD_dVgse=0.0, GD_dVbse=0.0 ; double GS=0.0, GS_dVds=0.0, GS_dVgs=0.0, GS_dVbs=0.0, GS_dVsubs=0.0, GS_dT=0.0 ; double Gth=0.0 ; double GG=0.0, GRBPD=0.0, GRBPS=0.0, GRBPB=0.0; @@ -249,8 +296,9 @@ int HSMHVload( double Qdext=0.0, dQdext_dVdse=0.0, dQdext_dVgse=0.0, dQdext_dVbse=0.0, dQdext_dT=0.0 ; double Qgext=0.0, dQgext_dVdse=0.0, dQgext_dVgse=0.0, dQgext_dVbse=0.0, dQgext_dT=0.0 ; - double /*Qsext=0.0,*/ dQsext_dVdse=0.0, dQsext_dVgse=0.0, dQsext_dVbse=0.0, dQsext_dT=0.0 ; + double Qsext=0.0, dQsext_dVdse=0.0, dQsext_dVgse=0.0, dQsext_dVbse=0.0, dQsext_dT=0.0 ; double Qbext=0.0, dQbext_dVdse=0.0, dQbext_dVgse=0.0, dQbext_dVbse=0.0, dQbext_dT=0.0 ; + /* 5th substrate node */ int flg_subNode = 0 ; @@ -258,7 +306,6 @@ int HSMHVload( double Veffpower=0.0, dVeffpower_dVds=0.0, dVeffpower_dVdse =0.0 ; double P=0.0, dP_dVds=0.0, dP_dVgs=0.0, dP_dVbs=0.0, dP_dT =0.0, dP_dVdse=0.0, dP_dVgse=0.0, dP_dVbse =0.0 ; - int flg_tempNode = 0 ; double T0 , T1 , T2 ; #define SHE_MAX_dlt 0.1 @@ -363,12 +410,12 @@ int HSMHVload( for ( ; model != NULL; model = model->HSMHVnextModel ) { /* loop through all the instances of the model */ -/* modelMKS = &model->modelMKS ;*/ + modelMKS = &model->modelMKS ; for (here = model->HSMHVinstances; here != NULL ; here = here->HSMHVnextInstance) { -/* hereMKS = &here->hereMKS ;*/ + hereMKS = &here->hereMKS ; pParam = &here->pParam ; showPhysVal = 0; Check=1; @@ -378,7 +425,6 @@ int HSMHVload( noncon_old = ckt->CKTnoncon; flg_nqs = model->HSMHV_conqs ; flg_subNode = here->HSMHVsubNode ; /* if flg_subNode > 0, external(/internal) substrate node exists */ - flg_tempNode = here->HSMHVtempNode ; /* if flg_tempNode > 0, external/internal temperature node exists */ #ifdef DEBUG_HISIMHVLD_VX printf("mode = %x\n", ckt->CKTmode); @@ -397,7 +443,7 @@ int HSMHVload( vdbd = *(ckt->CKTstate0 + here->HSMHVvdbd); vsbs = *(ckt->CKTstate0 + here->HSMHVvsbs); if (flg_subNode > 0) vsubs = *(ckt->CKTstate0 + here->HSMHVvsubs); - if( flg_tempNode > 0 ){ + if( here->HSMHV_coselfheat > 0 ){ deltemp = *(ckt->CKTstate0 + here->HSMHVdeltemp); } vdse = *(ckt->CKTstate0 + here->HSMHVvdse) ; @@ -423,7 +469,7 @@ int HSMHVload( vdbd = *(ckt->CKTstate1 + here->HSMHVvdbd); vsbs = *(ckt->CKTstate1 + here->HSMHVvsbs); if (flg_subNode > 0) vsubs = *(ckt->CKTstate1 + here->HSMHVvsubs); - if( flg_tempNode > 0 ){ + if( here->HSMHV_coselfheat > 0 ){ deltemp = *(ckt->CKTstate1 + here->HSMHVdeltemp); } vdse = *(ckt->CKTstate1 + here->HSMHVvdse) ; @@ -451,7 +497,7 @@ int HSMHVload( vds = 0.1; } if (flg_subNode > 0) vsubs = 0.0; - if( flg_tempNode > 0 ) deltemp=0.0; + if( here->HSMHV_coselfheat > 0 ) deltemp=0.0; vdse = vds ; vgse = vgs ; Qi_nqs = Qb_nqs = 0.0 ; @@ -460,7 +506,7 @@ int HSMHVload( here->HSMHV_off ) { vbs = vgs = vds = 0.0; vges = 0.0; vdbd = vsbs = 0.0; if (flg_subNode > 0) vsubs = 0.0; - if( flg_tempNode > 0 ) deltemp=0.0; + if( here->HSMHV_coselfheat > 0 ) deltemp=0.0; vdse = vds ; vgse = vgs ; Qi_nqs = Qb_nqs = 0.0 ; @@ -511,7 +557,7 @@ int HSMHVload( vsubs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVvsubs)) - ( xfact * (*(ckt->CKTstate2 + here->HSMHVvsubs))); } - if( flg_tempNode > 0 ){ + if( here->HSMHV_coselfheat > 0 ){ deltemp = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVdeltemp)) - ( xfact * (*(ckt->CKTstate2 + here->HSMHVdeltemp))); @@ -571,7 +617,7 @@ int HSMHVload( * (*(ckt->CKTrhsOld + here->HSMHVsubNode) - *(ckt->CKTrhsOld + here->HSMHVsNode)); } - if( flg_tempNode > 0 ){ + if( here->HSMHV_coselfheat > 0 ){ deltemp = *(ckt->CKTrhsOld + here->HSMHVtempNode); } vbse = model->HSMHV_type * @@ -608,7 +654,7 @@ int HSMHVload( #ifndef NOBYPASS /* start of bypass section ... no bypass in case of selfheating */ - if ( !(ckt->CKTmode & MODEINITPRED) && ckt->CKTbypass && !model->HSMHV_coselfheat) { + if ( !(ckt->CKTmode & MODEINITPRED) && ckt->CKTbypass && !here->HSMHV_coselfheat) { delvds = vds - *(ckt->CKTstate0 + here->HSMHVvds) ; delvgs = vgs - *(ckt->CKTstate0 + here->HSMHVvgs) ; delvbs = vbs - *(ckt->CKTstate0 + here->HSMHVvbs) ; @@ -648,7 +694,7 @@ int HSMHVload( gds = here->HSMHV_dIds_dVdsi ; gm = here->HSMHV_dIds_dVgsi ; gmbs = here->HSMHV_dIds_dVbsi ; - gmT = (flg_tempNode > 0) ? here->HSMHV_dIds_dTi : 0.0 ; + gmT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIds_dTi : 0.0 ; gmbs_ext = here->HSMHV_dIds_dVbse; gds_ext = here->HSMHV_dIds_dVdse ; gm_ext = here->HSMHV_dIds_dVgse; @@ -656,51 +702,73 @@ int HSMHVload( dIsub_dVds = here->HSMHV_dIsub_dVdsi ; dIsub_dVgs = here->HSMHV_dIsub_dVgsi ; dIsub_dVbs = here->HSMHV_dIsub_dVbsi ; - dIsub_dT = (flg_tempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; - dIsub_dVdse = here->HSMHV_dIsub_dVdse ; + dIsub_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; Isubs = 0.0 ; dIsubs_dVds = 0.0 ; dIsubs_dVgs = 0.0 ; dIsubs_dVbs = 0.0 ; dIsubs_dT = 0.0 ; - dIsubs_dVdse = 0.0 ; + IsubLD = here->HSMHV_isubld ; + dIsubLD_dVds = here->HSMHV_dIsubLD_dVdsi ; + dIsubLD_dVgs = here->HSMHV_dIsubLD_dVgsi ; + dIsubLD_dVbs = here->HSMHV_dIsubLD_dVbsi ; + dIsubLD_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIsubLD_dTi : 0.0 ; + dIsubLD_dVddp = here->HSMHV_dIsubLD_dVddp ; + IsubLDs = 0.0 ; + dIsubLDs_dVds = 0.0 ; + dIsubLDs_dVgs = 0.0 ; + dIsubLDs_dVbs = 0.0 ; + dIsubLDs_dT = 0.0 ; + dIsubLDs_dVddp = 0.0 ; + IdsIBPC = here->HSMHV_idsibpc ; + dIdsIBPC_dVds = here->HSMHV_dIdsIBPC_dVdsi ; + dIdsIBPC_dVgs = here->HSMHV_dIdsIBPC_dVgsi ; + dIdsIBPC_dVbs = here->HSMHV_dIdsIBPC_dVbsi ; + dIdsIBPC_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIdsIBPC_dTi : 0.0 ; + dIdsIBPC_dVddp = here->HSMHV_dIdsIBPC_dVddp ; + IdsIBPCs = 0.0 ; + dIdsIBPCs_dVds = 0.0 ; + dIdsIBPCs_dVgs = 0.0 ; + dIdsIBPCs_dVbs = 0.0 ; + dIdsIBPCs_dT = 0.0 ; + dIdsIBPCs_dVddp = 0.0 ; Igidl = here->HSMHV_igidl ; dIgidl_dVds = here->HSMHV_dIgidl_dVdsi ; dIgidl_dVgs = here->HSMHV_dIgidl_dVgsi ; dIgidl_dVbs = here->HSMHV_dIgidl_dVbsi ; - dIgidl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; + dIgidl_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; Igisl = here->HSMHV_igisl ; dIgisl_dVds = here->HSMHV_dIgisl_dVdsi ; dIgisl_dVgs = here->HSMHV_dIgisl_dVgsi ; dIgisl_dVbs = here->HSMHV_dIgisl_dVbsi ; - dIgisl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; + dIgisl_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; Igd = here->HSMHV_igd ; dIgd_dVd = here->HSMHV_dIgd_dVdsi ; dIgd_dVg = here->HSMHV_dIgd_dVgsi ; dIgd_dVb = here->HSMHV_dIgd_dVbsi ; - dIgd_dT = (flg_tempNode > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; + dIgd_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; Igs = here->HSMHV_igs ; dIgs_dVd = here->HSMHV_dIgs_dVdsi ; dIgs_dVg = here->HSMHV_dIgs_dVgsi ; dIgs_dVb = here->HSMHV_dIgs_dVbsi ; - dIgs_dT = (flg_tempNode > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; + dIgs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; Igb = here->HSMHV_igb ; dIgb_dVd = here->HSMHV_dIgb_dVdsi ; dIgb_dVg = here->HSMHV_dIgb_dVgsi ; dIgb_dVb = here->HSMHV_dIgb_dVbsi ; - dIgb_dT = (flg_tempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; + dIgb_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; Ibd = here->HSMHV_ibd ; Gbd = here->HSMHV_gbd ; - Gbdt = (flg_tempNode > 0) ? here->HSMHV_gbdT : 0.0 ; + Gbdt = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbdT : 0.0 ; Ibs = here->HSMHV_ibs ; Gbs = here->HSMHV_gbs ; - Gbst = (flg_tempNode > 0) ? here->HSMHV_gbsT : 0.0 ; + Gbst = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbsT : 0.0 ; } else { /* reverse mode */ Ids = - here->HSMHV_ids ; gds = + (here->HSMHV_dIds_dVdsi + here->HSMHV_dIds_dVgsi + here->HSMHV_dIds_dVbsi) ; gm = - here->HSMHV_dIds_dVgsi ; gmbs = - here->HSMHV_dIds_dVbsi ; - gmT = (flg_tempNode > 0) ? - here->HSMHV_dIds_dTi : 0.0 ; + gmT = (here->HSMHV_coselfheat > 0) ? - here->HSMHV_dIds_dTi : 0.0 ; gds_ext = + (here->HSMHV_dIds_dVdse + here->HSMHV_dIds_dVgse + here->HSMHV_dIds_dVbse) ; gm_ext = - here->HSMHV_dIds_dVgse; gmbs_ext = - here->HSMHV_dIds_dVbse; @@ -709,51 +777,72 @@ int HSMHVload( dIsub_dVgs = 0.0 ; dIsub_dVbs = 0.0 ; dIsub_dT = 0.0 ; - dIsub_dVdse = 0.0 ; Isubs = here->HSMHV_isub ; dIsubs_dVds = - (here->HSMHV_dIsub_dVdsi + here->HSMHV_dIsub_dVgsi + here->HSMHV_dIsub_dVbsi) ; dIsubs_dVgs = here->HSMHV_dIsub_dVgsi ; dIsubs_dVbs = here->HSMHV_dIsub_dVbsi ; - dIsubs_dT = (flg_tempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; - dIsubs_dVdse = - here->HSMHV_dIsub_dVdse ; /* = - (dIsub_dVdse + dIsub_dVbse + dIsub_dVgse) */ + dIsubs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; + IsubLD = 0.0 ; + dIsubLD_dVds = 0.0 ; + dIsubLD_dVgs = 0.0 ; + dIsubLD_dVbs = 0.0 ; + dIsubLD_dT = 0.0 ; + dIsubLD_dVddp = 0.0 ; + IsubLDs = here->HSMHV_isubld ; + dIsubLDs_dVds = - (here->HSMHV_dIsubLD_dVdsi + here->HSMHV_dIsubLD_dVgsi + here->HSMHV_dIsubLD_dVbsi) ; + dIsubLDs_dVgs = here->HSMHV_dIsubLD_dVgsi ; + dIsubLDs_dVbs = here->HSMHV_dIsubLD_dVbsi ; + dIsubLDs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIsubLD_dTi : 0.0 ; + dIsubLDs_dVddp = - here->HSMHV_dIsubLD_dVddp ; + IdsIBPC = 0.0 ; + dIdsIBPC_dVds = 0.0 ; + dIdsIBPC_dVgs = 0.0 ; + dIdsIBPC_dVbs = 0.0 ; + dIdsIBPC_dT = 0.0 ; + dIdsIBPC_dVddp = 0.0 ; + IdsIBPCs = here->HSMHV_idsibpc ; + dIdsIBPCs_dVds = - (here->HSMHV_dIdsIBPC_dVdsi + here->HSMHV_dIdsIBPC_dVgsi + here->HSMHV_dIdsIBPC_dVbsi) ; + dIdsIBPCs_dVgs = here->HSMHV_dIdsIBPC_dVgsi ; + dIdsIBPCs_dVbs = here->HSMHV_dIdsIBPC_dVbsi ; + dIdsIBPCs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIdsIBPC_dTi : 0.0 ; + dIdsIBPCs_dVddp = - here->HSMHV_dIdsIBPC_dVddp ; Igidl = here->HSMHV_igisl ; dIgidl_dVds = - (here->HSMHV_dIgisl_dVdsi + here->HSMHV_dIgisl_dVgsi + here->HSMHV_dIgisl_dVbsi) ; dIgidl_dVgs = here->HSMHV_dIgisl_dVgsi ; dIgidl_dVbs = here->HSMHV_dIgisl_dVbsi ; - dIgidl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; + dIgidl_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; Igisl = here->HSMHV_igidl ; dIgisl_dVds = - (here->HSMHV_dIgidl_dVdsi + here->HSMHV_dIgidl_dVgsi + here->HSMHV_dIgidl_dVbsi) ; dIgisl_dVgs = here->HSMHV_dIgidl_dVgsi ; dIgisl_dVbs = here->HSMHV_dIgidl_dVbsi ; - dIgisl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; + dIgisl_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; Igd = here->HSMHV_igd ; dIgd_dVd = - (here->HSMHV_dIgs_dVdsi + here->HSMHV_dIgs_dVgsi + here->HSMHV_dIgs_dVbsi) ; dIgd_dVg = here->HSMHV_dIgs_dVgsi ; dIgd_dVb = here->HSMHV_dIgs_dVbsi ; - dIgd_dT = (flg_tempNode > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; + dIgd_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; Igs = here->HSMHV_igs ; dIgs_dVd = - (here->HSMHV_dIgd_dVdsi + here->HSMHV_dIgd_dVgsi + here->HSMHV_dIgd_dVbsi) ; dIgs_dVg = here->HSMHV_dIgd_dVgsi ; dIgs_dVb = here->HSMHV_dIgd_dVbsi ; - dIgs_dT = (flg_tempNode > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; + dIgs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; Igb = here->HSMHV_igb ; dIgb_dVd = - (here->HSMHV_dIgb_dVdsi + here->HSMHV_dIgb_dVgsi + here->HSMHV_dIgb_dVbsi) ; dIgb_dVg = here->HSMHV_dIgb_dVgsi ; dIgb_dVb = here->HSMHV_dIgb_dVbsi ; - dIgb_dT = (flg_tempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; + dIgb_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; Ibd = here->HSMHV_ibd ; Gbd = here->HSMHV_gbd ; - Gbdt = (flg_tempNode > 0) ? here->HSMHV_gbdT : 0.0 ; + Gbdt = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbdT : 0.0 ; Ibs = here->HSMHV_ibs ; Gbs = here->HSMHV_gbs ; - Gbst = (flg_tempNode > 0) ? here->HSMHV_gbsT : 0.0 ; + Gbst = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbsT : 0.0 ; } /* end of reverse mode */ /* for bypass control, only nonlinear static currents are considered: */ i_dP = Ids + Isub + Igidl - Igd ; i_dP_hat = i_dP + gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp + dIsub_dVgs *delvgs + dIsub_dVds *delvds + dIsub_dVbs *delvbs + dIsub_dT *deldeltemp - + dIsub_dVdse*delvdse + dIgidl_dVgs*delvgs + dIgidl_dVds*delvds + dIgidl_dVbs*delvbs + dIgidl_dT*deldeltemp -(dIgd_dVg *delvgs + dIgd_dVd *delvds + dIgd_dVb *delvbs + dIgd_dT *deldeltemp) + gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse ; @@ -766,7 +855,6 @@ int HSMHVload( i_sP =-Ids + Isubs + Igisl - Igs ; i_sP_hat = i_sP -(gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp) + dIsubs_dVgs*delvgs + dIsubs_dVds*delvds + dIsubs_dVbs*delvbs + dIsubs_dT*deldeltemp - + dIsubs_dVdse*delvdse + dIgisl_dVgs*delvgs + dIgisl_dVds*delvds + dIgisl_dVbs*delvbs + dIgisl_dT*deldeltemp -(dIgs_dVg *delvgs + dIgs_dVd *delvds + dIgs_dVb *delvbs + dIgs_dT *deldeltemp) -(gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse) ; @@ -910,7 +998,7 @@ int HSMHVload( } } - if( flg_tempNode > 0 ){ + if( here->HSMHV_coselfheat > 0 ){ /* Logarithmic damping of deltemp beyond LIM_TOL */ deltemp_old = *(ckt->CKTstate0 + here->HSMHVdeltemp); if (deltemp > deltemp_old + LIM_TOL) @@ -937,6 +1025,9 @@ int HSMHVload( vbd_jct = vdbd; /* linear branch voltages */ + if ( (ckt->CKTmode & MODEINITJCT) && !here->HSMHV_off ) { + vddp = vggp = vssp = vbpdb = vbpb = vbpsb = 0.0; + } else { vddp = model->HSMHV_type * (*(ckt->CKTrhsOld+here->HSMHVdNode) - *(ckt->CKTrhsOld+here->HSMHVdNodePrime)); @@ -961,6 +1052,7 @@ int HSMHVload( vbpsb = model->HSMHV_type * (*(ckt->CKTrhsOld+here->HSMHVbNodePrime) - *(ckt->CKTrhsOld+here->HSMHVsbNode)); + } #ifdef DEBUG_HISIMHVLD_VX @@ -1016,7 +1108,7 @@ int HSMHVload( printf( "cothrml = %s\n", (model->HSMHV_cothrml) ? "true" : "false" ) ; printf( "coign = %s\n" , (model->HSMHV_coign) ? "true" : "false" ) ; printf( "cosym = %s\n" , (model->HSMHV_cosym) ? "true" : "false" ) ; - printf( "coselfheat = %s\n" , (model->HSMHV_coselfheat) ? "true" : "false" ) ; + printf( "coselfheat = %s\n" , (here->HSMHV_coselfheat) ? "true" : "false" ) ; } /* print inputs ------------AA */ @@ -1030,9 +1122,14 @@ int HSMHVload( #endif /* call model evaluation */ - if ( HSMHVevaluate(ivdse,ivgse,ivbse,ivds, ivgs, ivbs, vbs_jct, vbd_jct, vsubs, deltemp, here, model, ckt) == HiSIM_ERROR ) + if ( HSMHVevaluate(ivdse,ivgse,ivbse,ivds, ivgs, ivbs, vbs_jct, vbd_jct, vsubs, vddp, deltemp, here, model, ckt) == HiSIM_ERROR ) return (HiSIM_ERROR); - + if ( here->HSMHV_cordrift == 1 ) { + if ( HSMHVrdrift(vddp, vds, vbs, vsubs, deltemp, here, model, ckt) == HiSIM_ERROR ) + return (HiSIM_ERROR); + } + if ( HSMHVdio(vbs_jct, vbd_jct, deltemp, here, model, ckt) == HiSIM_ERROR ) + return (HiSIM_ERROR); #ifdef DEBUG_HISIMHVCGG printf("HSMHV_ids %e ", here->HSMHV_ids ) ; @@ -1046,22 +1143,26 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ /* (could be shifted a bit forward ...) */ if ( here->HSMHV_mode > 0 ) { /* forward mode */ Rd = here->HSMHV_Rd ; + dRd_dVddp = here->HSMHV_dRd_dVddp ; dRd_dVdse = here->HSMHV_dRd_dVdse ; dRd_dVgse = here->HSMHV_dRd_dVgse ; dRd_dVbse = here->HSMHV_dRd_dVbse ; dRd_dVsubs = (flg_subNode > 0) ? here->HSMHV_dRd_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */ - dRd_dT = (flg_tempNode > 0) ? here->HSMHV_dRd_dTi : 0.0 ; + dRd_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dRd_dTi : 0.0 ; + dRd_dVds = here->HSMHV_dRd_dVds ; + dRd_dVgs = here->HSMHV_dRd_dVgs ; + dRd_dVbs = here->HSMHV_dRd_dVbs ; Rs = here->HSMHV_Rs ; dRs_dVdse = here->HSMHV_dRs_dVdse ; dRs_dVgse = here->HSMHV_dRs_dVgse ; dRs_dVbse = here->HSMHV_dRs_dVbse ; dRs_dVsubs = (flg_subNode > 0) ? here->HSMHV_dRs_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */ - dRs_dT = (flg_tempNode > 0) ? here->HSMHV_dRs_dTi : 0.0 ; + dRs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dRs_dTi : 0.0 ; Ids = here->HSMHV_ids ; gds = here->HSMHV_dIds_dVdsi ; gm = here->HSMHV_dIds_dVgsi ; gmbs = here->HSMHV_dIds_dVbsi ; - gmT = (flg_tempNode > 0) ? here->HSMHV_dIds_dTi : 0.0 ; + gmT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIds_dTi : 0.0 ; gmbs_ext = here->HSMHV_dIds_dVbse ; gds_ext = here->HSMHV_dIds_dVdse ; gm_ext = here->HSMHV_dIds_dVgse ; @@ -1070,32 +1171,32 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ dQd_dVds = here->HSMHV_dQdi_dVdsi ; dQd_dVgs = here->HSMHV_dQdi_dVgsi ; dQd_dVbs = here->HSMHV_dQdi_dVbsi ; - dQd_dT = (flg_tempNode > 0) ? here->HSMHV_dQdi_dTi : 0.0 ; + dQd_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQdi_dTi : 0.0 ; Qg = here->HSMHV_qg ; dQg_dVds = here->HSMHV_dQg_dVdsi ; dQg_dVgs = here->HSMHV_dQg_dVgsi ; dQg_dVbs = here->HSMHV_dQg_dVbsi ; - dQg_dT = (flg_tempNode > 0) ? here->HSMHV_dQg_dTi : 0.0 ; + dQg_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQg_dTi : 0.0 ; Qs = here->HSMHV_qs ; dQs_dVds = here->HSMHV_dQsi_dVdsi ; dQs_dVgs = here->HSMHV_dQsi_dVgsi ; dQs_dVbs = here->HSMHV_dQsi_dVbsi ; - dQs_dT = (flg_tempNode > 0) ? here->HSMHV_dQsi_dTi : 0.0 ; + dQs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQsi_dTi : 0.0 ; Qb = - (here->HSMHV_qg + here->HSMHV_qd + here->HSMHV_qs) ; dQb_dVds = here->HSMHV_dQb_dVdsi ; dQb_dVgs = here->HSMHV_dQb_dVgsi ; dQb_dVbs = here->HSMHV_dQb_dVbsi ; - dQb_dT = (flg_tempNode > 0) ? here->HSMHV_dQb_dTi : 0.0 ; + dQb_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQb_dTi : 0.0 ; Qfd = here->HSMHV_qdp ; dQfd_dVdse = here->HSMHV_dqdp_dVdse ; dQfd_dVgse = here->HSMHV_dqdp_dVgse ; dQfd_dVbse = here->HSMHV_dqdp_dVbse ; - dQfd_dT = (flg_tempNode > 0) ? here->HSMHV_dqdp_dTi : 0.0 ; + dQfd_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dqdp_dTi : 0.0 ; Qfs = here->HSMHV_qsp ; dQfs_dVdse = here->HSMHV_dqsp_dVdse ; dQfs_dVgse = here->HSMHV_dqsp_dVgse ; dQfs_dVbse = here->HSMHV_dqsp_dVbse ; - dQfs_dT = (flg_tempNode > 0) ? here->HSMHV_dqsp_dTi : 0.0 ; + dQfs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dqsp_dTi : 0.0 ; Qdext = here->HSMHV_qdext ; dQdext_dVdse = here->HSMHV_dQdext_dVdse ; @@ -1107,7 +1208,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ dQgext_dVgse = here->HSMHV_dQgext_dVgse ; dQgext_dVbse = here->HSMHV_dQgext_dVbse ; dQgext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQgext_dTi : 0.0 ; -/* Qsext = here->HSMHV_qsext ;*/ + Qsext = here->HSMHV_qsext ; dQsext_dVdse = here->HSMHV_dQsext_dVdse ; dQsext_dVgse = here->HSMHV_dQsext_dVgse ; dQsext_dVbse = here->HSMHV_dQsext_dVbse ; @@ -1121,60 +1222,82 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ dIsub_dVds = here->HSMHV_dIsub_dVdsi ; dIsub_dVgs = here->HSMHV_dIsub_dVgsi ; dIsub_dVbs = here->HSMHV_dIsub_dVbsi ; - dIsub_dT = (flg_tempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; - dIsub_dVdse = here->HSMHV_dIsub_dVdse ; + dIsub_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; Isubs = 0.0 ; dIsubs_dVds = 0.0 ; dIsubs_dVgs = 0.0 ; dIsubs_dVbs = 0.0 ; dIsubs_dT = 0.0 ; - dIsubs_dVdse = 0.0 ; + IsubLD = here->HSMHV_isubld ; + dIsubLD_dVds = here->HSMHV_dIsubLD_dVdsi ; + dIsubLD_dVgs = here->HSMHV_dIsubLD_dVgsi ; + dIsubLD_dVbs = here->HSMHV_dIsubLD_dVbsi ; + dIsubLD_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIsubLD_dTi : 0.0 ; + dIsubLD_dVddp = here->HSMHV_dIsubLD_dVddp ; + IsubLDs = 0.0 ; + dIsubLDs_dVds = 0.0 ; + dIsubLDs_dVgs = 0.0 ; + dIsubLDs_dVbs = 0.0 ; + dIsubLDs_dT = 0.0 ; + dIsubLDs_dVddp = 0.0 ; + IdsIBPC = here->HSMHV_idsibpc ; + dIdsIBPC_dVds = here->HSMHV_dIdsIBPC_dVdsi ; + dIdsIBPC_dVgs = here->HSMHV_dIdsIBPC_dVgsi ; + dIdsIBPC_dVbs = here->HSMHV_dIdsIBPC_dVbsi ; + dIdsIBPC_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIdsIBPC_dTi : 0.0 ; + dIdsIBPC_dVddp = here->HSMHV_dIdsIBPC_dVddp ; + IdsIBPCs = 0.0 ; + dIdsIBPCs_dVds = 0.0 ; + dIdsIBPCs_dVgs = 0.0 ; + dIdsIBPCs_dVbs = 0.0 ; + dIdsIBPCs_dT = 0.0 ; + dIdsIBPCs_dVddp = 0.0 ; Igidl = here->HSMHV_igidl ; dIgidl_dVds = here->HSMHV_dIgidl_dVdsi ; dIgidl_dVgs = here->HSMHV_dIgidl_dVgsi ; dIgidl_dVbs = here->HSMHV_dIgidl_dVbsi ; - dIgidl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; + dIgidl_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; Igisl = here->HSMHV_igisl ; dIgisl_dVds = here->HSMHV_dIgisl_dVdsi ; dIgisl_dVgs = here->HSMHV_dIgisl_dVgsi ; dIgisl_dVbs = here->HSMHV_dIgisl_dVbsi ; - dIgisl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; + dIgisl_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; Igd = here->HSMHV_igd ; dIgd_dVd = here->HSMHV_dIgd_dVdsi ; dIgd_dVg = here->HSMHV_dIgd_dVgsi ; dIgd_dVb = here->HSMHV_dIgd_dVbsi ; - dIgd_dT = (flg_tempNode > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; + dIgd_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; Igs = here->HSMHV_igs ; dIgs_dVd = here->HSMHV_dIgs_dVdsi ; dIgs_dVg = here->HSMHV_dIgs_dVgsi ; dIgs_dVb = here->HSMHV_dIgs_dVbsi ; - dIgs_dT = (flg_tempNode > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; + dIgs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; Igb = here->HSMHV_igb ; dIgb_dVd = here->HSMHV_dIgb_dVdsi ; dIgb_dVg = here->HSMHV_dIgb_dVgsi ; dIgb_dVb = here->HSMHV_dIgb_dVbsi ; - dIgb_dT = (flg_tempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; + dIgb_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; /*---------------------------------------------------* * Junction diode. *-----------------*/ Ibd = here->HSMHV_ibd ; Gbd = here->HSMHV_gbd ; - Gbdt = (flg_tempNode > 0) ? here->HSMHV_gbdT : 0.0 ; + Gbdt = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbdT : 0.0 ; /* Qbd = here->HSMHV_qbd ; */ Qbd = *(ckt->CKTstate0 + here->HSMHVqbd) ; Cbd = here->HSMHV_capbd ; - Cbdt = (flg_tempNode > 0) ? here->HSMHV_gcbdT : 0.0 ; + Cbdt = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gcbdT : 0.0 ; Ibs = here->HSMHV_ibs ; Gbs = here->HSMHV_gbs ; - Gbst = (flg_tempNode > 0) ? here->HSMHV_gbsT : 0.0 ; + Gbst = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbsT : 0.0 ; /* Qbs = here->HSMHV_qbs ; */ Qbs = *(ckt->CKTstate0 + here->HSMHVqbs) ; Cbs = here->HSMHV_capbs ; - Cbst = (flg_tempNode > 0) ? here->HSMHV_gcbsT : 0.0 ; + Cbst = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gcbsT : 0.0 ; if (flg_nqs) { tau = here->HSMHV_tau ; @@ -1208,22 +1331,26 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ /* note: here->HSMHV_Rd and here->HSMHV_Rs are already subjected to mode handling, while the following derivatives here->HSMHV_Rd_dVdse, ... are not! */ Rd = here->HSMHV_Rd ; + dRd_dVddp = here->HSMHV_dRd_dVddp ; dRd_dVdse = here->HSMHV_dRd_dVdse ; dRd_dVgse = here->HSMHV_dRd_dVgse ; dRd_dVbse = here->HSMHV_dRd_dVbse ; dRd_dVsubs= (flg_subNode > 0) ? here->HSMHV_dRd_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */ - dRd_dT = (flg_tempNode > 0) ? here->HSMHV_dRd_dTi : 0.0 ; + dRd_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dRd_dTi : 0.0 ; + dRd_dVds = here->HSMHV_dRd_dVds ; + dRd_dVgs = here->HSMHV_dRd_dVgs ; + dRd_dVbs = here->HSMHV_dRd_dVbs ; Rs = here->HSMHV_Rs ; dRs_dVdse = here->HSMHV_dRs_dVdse ; dRs_dVgse = here->HSMHV_dRs_dVgse ; dRs_dVbse = here->HSMHV_dRs_dVbse ; dRs_dVsubs= (flg_subNode > 0) ? here->HSMHV_dRs_dVsubs : 0.0 ; /* derivative w.r.t. Vsubs */ - dRs_dT = (flg_tempNode > 0) ? here->HSMHV_dRs_dTi : 0.0 ; + dRs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dRs_dTi : 0.0 ; Ids = - here->HSMHV_ids ; gds = + (here->HSMHV_dIds_dVdsi + here->HSMHV_dIds_dVgsi + here->HSMHV_dIds_dVbsi) ; gm = - here->HSMHV_dIds_dVgsi ; gmbs = - here->HSMHV_dIds_dVbsi ; - gmT = (flg_tempNode > 0) ? - here->HSMHV_dIds_dTi : 0.0 ; + gmT = (here->HSMHV_coselfheat > 0) ? - here->HSMHV_dIds_dTi : 0.0 ; gds_ext = + (here->HSMHV_dIds_dVdse + here->HSMHV_dIds_dVgse + here->HSMHV_dIds_dVbse) ; gm_ext = - here->HSMHV_dIds_dVgse; gmbs_ext = - here->HSMHV_dIds_dVbse; @@ -1232,32 +1359,32 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ dQd_dVds = - (here->HSMHV_dQsi_dVdsi + here->HSMHV_dQsi_dVgsi + here->HSMHV_dQsi_dVbsi) ; dQd_dVgs = here->HSMHV_dQsi_dVgsi ; dQd_dVbs = here->HSMHV_dQsi_dVbsi ; - dQd_dT = (flg_tempNode > 0) ? here->HSMHV_dQsi_dTi : 0.0 ; + dQd_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQsi_dTi : 0.0 ; Qg = here->HSMHV_qg ; dQg_dVds = - (here->HSMHV_dQg_dVdsi + here->HSMHV_dQg_dVgsi + here->HSMHV_dQg_dVbsi) ; dQg_dVgs = here->HSMHV_dQg_dVgsi ; dQg_dVbs = here->HSMHV_dQg_dVbsi ; - dQg_dT = (flg_tempNode > 0) ? here->HSMHV_dQg_dTi : 0.0 ; + dQg_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQg_dTi : 0.0 ; Qs = here->HSMHV_qd ; dQs_dVds = - (here->HSMHV_dQdi_dVdsi + here->HSMHV_dQdi_dVgsi + here->HSMHV_dQdi_dVbsi) ; dQs_dVgs = here->HSMHV_dQdi_dVgsi ; dQs_dVbs = here->HSMHV_dQdi_dVbsi ; - dQs_dT = (flg_tempNode > 0) ? here->HSMHV_dQdi_dTi : 0.0 ; + dQs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQdi_dTi : 0.0 ; Qb = - (here->HSMHV_qg + here->HSMHV_qd + here->HSMHV_qs) ; dQb_dVds = - (here->HSMHV_dQb_dVdsi + here->HSMHV_dQb_dVgsi + here->HSMHV_dQb_dVbsi) ; dQb_dVgs = here->HSMHV_dQb_dVgsi ; dQb_dVbs = here->HSMHV_dQb_dVbsi ; - dQb_dT = (flg_tempNode > 0) ? here->HSMHV_dQb_dTi : 0.0 ; + dQb_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQb_dTi : 0.0 ; Qfd = here->HSMHV_qsp ; dQfd_dVdse = - (here->HSMHV_dqsp_dVdse + here->HSMHV_dqsp_dVgse + here->HSMHV_dqsp_dVbse) ; dQfd_dVgse = here->HSMHV_dqsp_dVgse ; dQfd_dVbse = here->HSMHV_dqsp_dVbse ; - dQfd_dT = (flg_tempNode > 0) ? here->HSMHV_dqsp_dTi : 0.0 ; + dQfd_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dqsp_dTi : 0.0 ; Qfs = here->HSMHV_qdp ; dQfs_dVdse = - (here->HSMHV_dqdp_dVdse + here->HSMHV_dqdp_dVgse + here->HSMHV_dqdp_dVbse) ; dQfs_dVgse = here->HSMHV_dqdp_dVgse ; dQfs_dVbse = here->HSMHV_dqdp_dVbse ; - dQfs_dT = (flg_tempNode > 0) ? here->HSMHV_dqdp_dTi : 0.0 ; + dQfs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dqdp_dTi : 0.0 ; Qdext = here->HSMHV_qsext ; dQdext_dVdse = - (here->HSMHV_dQsext_dVdse + here->HSMHV_dQsext_dVgse + here->HSMHV_dQsext_dVbse); @@ -1269,7 +1396,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ dQgext_dVgse = here->HSMHV_dQgext_dVgse ; dQgext_dVbse = here->HSMHV_dQgext_dVbse ; dQgext_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQgext_dTi : 0.0 ; -/* Qsext = here->HSMHV_qdext ;*/ + Qsext = here->HSMHV_qdext ; dQsext_dVdse = - (here->HSMHV_dQdext_dVdse + here->HSMHV_dQdext_dVgse + here->HSMHV_dQdext_dVbse); dQsext_dVgse = here->HSMHV_dQdext_dVgse ; dQsext_dVbse = here->HSMHV_dQdext_dVbse ; @@ -1284,61 +1411,83 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ dIsub_dVgs = 0.0 ; dIsub_dVbs = 0.0 ; dIsub_dT = 0.0 ; - dIsub_dVdse = 0.0 ; Isubs = here->HSMHV_isub ; dIsubs_dVds = - (here->HSMHV_dIsub_dVdsi + here->HSMHV_dIsub_dVgsi + here->HSMHV_dIsub_dVbsi) ; dIsubs_dVgs = here->HSMHV_dIsub_dVgsi ; dIsubs_dVbs = here->HSMHV_dIsub_dVbsi ; - dIsubs_dT = (flg_tempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; - dIsubs_dVdse = - here->HSMHV_dIsub_dVdse ; /* = - (dIsub_dVdse + dIsub_dVbse + dIsub_dVgse) */ + dIsubs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; + IsubLD = 0.0 ; + dIsubLD_dVds = 0.0 ; + dIsubLD_dVgs = 0.0 ; + dIsubLD_dVbs = 0.0 ; + dIsubLD_dT = 0.0 ; + dIsubLD_dVddp = 0.0 ; + IsubLDs = here->HSMHV_isubld ; + dIsubLDs_dVds = - (here->HSMHV_dIsubLD_dVdsi + here->HSMHV_dIsubLD_dVgsi + here->HSMHV_dIsubLD_dVbsi) ; + dIsubLDs_dVgs = here->HSMHV_dIsubLD_dVgsi ; + dIsubLDs_dVbs = here->HSMHV_dIsubLD_dVbsi ; + dIsubLDs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIsubLD_dTi : 0.0 ; + dIsubLDs_dVddp = - here->HSMHV_dIsubLD_dVddp ; + IdsIBPC = 0.0 ; + dIdsIBPC_dVds = 0.0 ; + dIdsIBPC_dVgs = 0.0 ; + dIdsIBPC_dVbs = 0.0 ; + dIdsIBPC_dT = 0.0 ; + dIdsIBPC_dVddp = 0.0 ; + IdsIBPCs = here->HSMHV_idsibpc ; + dIdsIBPCs_dVds = - (here->HSMHV_dIdsIBPC_dVdsi + here->HSMHV_dIdsIBPC_dVgsi + here->HSMHV_dIdsIBPC_dVbsi) ; + dIdsIBPCs_dVgs = here->HSMHV_dIdsIBPC_dVgsi ; + dIdsIBPCs_dVbs = here->HSMHV_dIdsIBPC_dVbsi ; + dIdsIBPCs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIdsIBPC_dTi : 0.0 ; + dIdsIBPCs_dVddp = - here->HSMHV_dIdsIBPC_dVddp ; Igidl = here->HSMHV_igisl ; dIgidl_dVds = - (here->HSMHV_dIgisl_dVdsi + here->HSMHV_dIgisl_dVgsi + here->HSMHV_dIgisl_dVbsi) ; dIgidl_dVgs = here->HSMHV_dIgisl_dVgsi ; dIgidl_dVbs = here->HSMHV_dIgisl_dVbsi ; - dIgidl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; + dIgidl_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; Igisl = here->HSMHV_igidl ; dIgisl_dVds = - (here->HSMHV_dIgidl_dVdsi + here->HSMHV_dIgidl_dVgsi + here->HSMHV_dIgidl_dVbsi) ; dIgisl_dVgs = here->HSMHV_dIgidl_dVgsi ; dIgisl_dVbs = here->HSMHV_dIgidl_dVbsi ; - dIgisl_dT = (flg_tempNode > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; + dIgisl_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; /* note: here->HSMHV_igd and here->HSMHV_igs are already subjected to mode handling, while the following derivatives here->HSMHV_dIgd_dVdsi, ... are not! */ Igd = here->HSMHV_igd ; dIgd_dVd = - (here->HSMHV_dIgs_dVdsi + here->HSMHV_dIgs_dVgsi + here->HSMHV_dIgs_dVbsi) ; dIgd_dVg = here->HSMHV_dIgs_dVgsi ; dIgd_dVb = here->HSMHV_dIgs_dVbsi ; - dIgd_dT = (flg_tempNode > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; + dIgd_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; Igs = here->HSMHV_igs ; dIgs_dVd = - (here->HSMHV_dIgd_dVdsi + here->HSMHV_dIgd_dVgsi + here->HSMHV_dIgd_dVbsi) ; dIgs_dVg = here->HSMHV_dIgd_dVgsi ; dIgs_dVb = here->HSMHV_dIgd_dVbsi ; - dIgs_dT = (flg_tempNode > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; + dIgs_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; Igb = here->HSMHV_igb ; dIgb_dVd = - (here->HSMHV_dIgb_dVdsi + here->HSMHV_dIgb_dVgsi + here->HSMHV_dIgb_dVbsi) ; dIgb_dVg = here->HSMHV_dIgb_dVgsi ; dIgb_dVb = here->HSMHV_dIgb_dVbsi ; - dIgb_dT = (flg_tempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; + dIgb_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; /*---------------------------------------------------* * Junction diode. *-----------------*/ Ibd = here->HSMHV_ibd ; Gbd = here->HSMHV_gbd ; - Gbdt = (flg_tempNode > 0) ? here->HSMHV_gbdT : 0.0 ; + Gbdt = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbdT : 0.0 ; /* Qbd = here->HSMHV_qbd ; */ Qbd = *(ckt->CKTstate0 + here->HSMHVqbd) ; Cbd = here->HSMHV_capbd ; - Cbdt = (flg_tempNode > 0) ? here->HSMHV_gcbdT : 0.0 ; + Cbdt = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gcbdT : 0.0 ; Ibs = here->HSMHV_ibs ; Gbs = here->HSMHV_gbs ; - Gbst = (flg_tempNode > 0) ? here->HSMHV_gbsT : 0.0 ; + Gbst = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbsT : 0.0 ; /* Qbs = here->HSMHV_qbs ; */ Qbs = *(ckt->CKTstate0 + here->HSMHVqbs) ; Cbs = here->HSMHV_capbs ; - Cbst = (flg_tempNode > 0) ? here->HSMHV_gcbsT : 0.0 ; + Cbst = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gcbsT : 0.0 ; if (flg_nqs) { tau = here->HSMHV_tau ; @@ -1369,7 +1518,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ } } /* end of reverse mode */ - if (flg_tempNode > 0) { + if (here->HSMHV_coselfheat > 0) { if (pParam->HSMHV_rth > C_RTH_MIN) { Gth = 1.0/pParam->HSMHV_rth ; } else { @@ -1493,21 +1642,29 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ /*---------------------------------------------------* * External Resistances *-----------------*/ - if(model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3 ) { + if(model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3 || model->HSMHV_cordrift == 1 ) { if(Rd > 0){ GD = 1.0/Rd; - GD_dVgs = - dRd_dVgse /Rd/Rd; - GD_dVds = - dRd_dVdse /Rd/Rd; - GD_dVbs = - dRd_dVbse /Rd/Rd; + GD_dVgs = - dRd_dVgs /Rd/Rd; + GD_dVds = - dRd_dVds /Rd/Rd; + GD_dVddp = - dRd_dVddp /Rd/Rd; + GD_dVbs = - dRd_dVbs /Rd/Rd; GD_dVsubs = - dRd_dVsubs /Rd/Rd; - GD_dT = - dRd_dT /Rd/Rd; + GD_dT = - dRd_dT /Rd/Rd; + GD_dVgse = - dRd_dVgse /Rd/Rd; + GD_dVdse = - dRd_dVdse /Rd/Rd; + GD_dVbse = - dRd_dVbse /Rd/Rd; }else{ GD=0.0; GD_dVgs=0.0; GD_dVds=0.0; + GD_dVddp = 0.0; GD_dVbs=0.0; GD_dVsubs=0.0; GD_dT =0.0; + GD_dVgse =0.0; + GD_dVdse =0.0; + GD_dVbse =0.0; } if(Rs > 0){ GS = 1.0/Rs; @@ -1525,13 +1682,16 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ GS_dT =0.0; } } - Iddp = GD * vddp; - dIddp_dVddp = GD; - dIddp_dVdse = GD_dVds * vddp; - dIddp_dVgse = GD_dVgs * vddp; - dIddp_dVbse = GD_dVbs * vddp; + Iddp = GD * vddp; + dIddp_dVddp = GD_dVddp * vddp + GD ; + dIddp_dVdse = GD_dVdse * vddp; + dIddp_dVgse = GD_dVgse * vddp; + dIddp_dVbse = GD_dVbse * vddp; dIddp_dVsubs= GD_dVsubs * vddp; - dIddp_dT = GD_dT * vddp; + dIddp_dT = GD_dT * vddp; + dIddp_dVds = GD_dVds * vddp; + dIddp_dVgs = GD_dVgs * vddp; + dIddp_dVbs = GD_dVbs * vddp; Issp = GS * vssp; dIssp_dVssp = GS; @@ -1651,7 +1811,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ x[subNode] = model->HSMHV_type *( *(ckt->CKTrhsOld+here->HSMHVsubNode)); /* previous vsub */ else x[subNode] = 0.0; - if (flg_tempNode > 0) + if (here->HSMHV_coselfheat > 0) x[tempNode] = *(ckt->CKTrhsOld+here->HSMHVtempNode); else x[tempNode] = 0.0; @@ -1673,6 +1833,10 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ Ids += gm *delvgs + gds *delvds + gmbs *delvbs + gmT *deldeltemp ; Isub += dIsub_dVgs *delvgs + dIsub_dVds *delvds + dIsub_dVbs *delvbs + dIsub_dT *deldeltemp ; Isubs+= dIsubs_dVgs*delvgs + dIsubs_dVds*delvds + dIsubs_dVbs*delvbs + dIsubs_dT*deldeltemp ; + IsubLD += dIsubLD_dVgs *delvgs + dIsubLD_dVds *delvds + dIsubLD_dVbs *delvbs + dIsubLD_dT *deldeltemp ; + IsubLDs+= dIsubLDs_dVgs*delvgs + dIsubLDs_dVds*delvds + dIsubLDs_dVbs*delvbs + dIsubLDs_dT*deldeltemp ; + IdsIBPC += dIdsIBPC_dVgs *delvgs + dIdsIBPC_dVds *delvds + dIdsIBPC_dVbs *delvbs + dIdsIBPC_dT *deldeltemp ; + IdsIBPCs+= dIdsIBPCs_dVgs*delvgs + dIdsIBPCs_dVds*delvds + dIdsIBPCs_dVbs*delvbs + dIdsIBPCs_dT*deldeltemp ; Igd += dIgd_dVg *delvgs + dIgd_dVd *delvds + dIgd_dVb *delvbs + dIgd_dT *deldeltemp ; Igs += dIgs_dVg *delvgs + dIgs_dVd *delvds + dIgs_dVb *delvbs + dIgs_dT *deldeltemp ; Igb += dIgb_dVg *delvgs + dIgb_dVd *delvds + dIgb_dVb *delvbs + dIgb_dT *deldeltemp ; @@ -1692,8 +1856,6 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ if (delvgse || delvdse || delvbse ) { Ids += gm_ext *delvgse + gds_ext *delvdse + gmbs_ext *delvbse ; - Isub += dIsub_dVdse*delvdse ; - Isubs+= dIsubs_dVdse*delvdse ; P += dP_dVgse *delvgse + dP_dVdse *delvdse + dP_dVbse *delvbse ; Iddp += dIddp_dVgse*delvgse + dIddp_dVdse*delvdse + dIddp_dVbse*delvbse ; Issp += dIssp_dVgse*delvgse + dIssp_dVdse*delvdse + dIssp_dVbse*delvbse ; @@ -1723,6 +1885,25 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ delvddp = (x[dNode] - x[dNodePrime]) - vddp ; if (delvddp) { Iddp += dIddp_dVddp * delvddp ; + IsubLD += dIsubLD_dVddp * delvddp ; + IsubLDs += dIsubLDs_dVddp * delvddp ; + IdsIBPC += dIdsIBPC_dVddp * delvddp ; + IdsIBPCs+= dIdsIBPCs_dVddp * delvddp ; + } + + delvds = (x[dNodePrime] - x[sNodePrime]) - vds ; + if (delvds) { + Iddp += dIddp_dVds * delvds ; + } + + delvgs = (x[gNodePrime] - x[sNodePrime]) - vgs ; + if (delvgs) { + Iddp += dIddp_dVgs * delvgs ; + } + + delvbs = (x[bNodePrime] - x[sNodePrime]) - vbs ; + if (delvbs) { + Iddp += dIddp_dVbs * delvbs ; } delvssp = (x[sNode] - x[sNodePrime]) - vssp ; @@ -1767,7 +1948,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ /* drain node */ - i_d = Iddp - Ibd ; + i_d = Iddp - Ibd + IsubLD + IdsIBPC - IdsIBPCs ; /* intrinsic drain node */ i_dP = -Iddp + Ids + Isub + Igidl - Igd ; /* gate node */ @@ -1775,11 +1956,11 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ /* intrinsic gate node */ i_gP = - Iggp + Igd + Igs + Igb ; /* source node */ - i_s = Issp - Ibs ; + i_s = Issp - Ibs + IsubLDs - IdsIBPC + IdsIBPCs ; /* intrinsic source node */ i_sP = - Issp - Ids + Isubs + Igisl - Igs ; /* intrinsic bulk node */ - i_bP = - Isub - Isubs - Igidl -Igb - Igisl + Ibpdb + Ibpb + Ibpsb ; + i_bP = - Isub - Isubs - IsubLD - IsubLDs- Igidl -Igb - Igisl + Ibpdb + Ibpb + Ibpsb ; /* base node */ i_b = - Ibpb ; /* drain bulk node */ @@ -1787,7 +1968,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ /* source bulk node */ i_sb = Ibs - Ibpsb ; /* temp node */ - if (flg_tempNode > 0){ + if (here->HSMHV_coselfheat > 0){ i_t = Ith - P ; } else { i_t = 0.0; @@ -1807,30 +1988,31 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ } /* drain node */ - ydc_d[dNode] = dIddp_dVddp + dIddp_dVdse + Gbd ; - ydc_d[dNodePrime] = -dIddp_dVddp ; + ydc_d[dNode] = dIddp_dVddp + dIddp_dVdse + Gbd + dIsubLD_dVddp + dIdsIBPC_dVddp - dIdsIBPCs_dVddp ; + ydc_d[dNodePrime] = -dIddp_dVddp + dIddp_dVds + dIsubLD_dVds + dIdsIBPC_dVds - dIdsIBPCs_dVds - dIsubLD_dVddp - dIdsIBPC_dVddp + dIdsIBPCs_dVddp ; /* ydc_d[gNode] = 0.0 ; */ - ydc_d[gNodePrime] = dIddp_dVgse ; + ydc_d[gNodePrime] = dIddp_dVgse + dIddp_dVgs + dIsubLD_dVgs + dIdsIBPC_dVgs - dIdsIBPCs_dVgs ; ydc_d[sNode] = - ( dIddp_dVdse + dIddp_dVgse + dIddp_dVbse ) - dIddp_dVsubs ; - /* ydc_d[sNodePrime] = 0.0 ; */ - ydc_d[bNodePrime] = dIddp_dVbse ; + ydc_d[sNodePrime] = - dIsubLD_dVds - dIsubLD_dVgs - dIsubLD_dVbs - dIdsIBPC_dVds - dIdsIBPC_dVgs - dIdsIBPC_dVbs - (- dIdsIBPCs_dVds - dIdsIBPCs_dVgs - dIdsIBPCs_dVbs ) - ( dIddp_dVds + dIddp_dVgs + dIddp_dVbs ) ; + ydc_d[bNodePrime] = dIddp_dVbse + dIddp_dVbs + dIsubLD_dVbs + dIdsIBPC_dVbs - dIdsIBPCs_dVbs ; /* ydc_d[bNode] = 0.0 ; */ ydc_d[dbNode] = - Gbd ; /* ydc_d[sbNode] = 0.0 ; */ ydc_d[subNode] = dIddp_dVsubs ; - ydc_d[tempNode] = dIddp_dT - Gbdt ; + ydc_d[tempNode] = dIddp_dT - Gbdt + dIsubLD_dT + dIdsIBPC_dT - dIdsIBPCs_dT ; /* intrinsic drain node */ - ydc_dP[dNode] = - (dIddp_dVddp + dIddp_dVdse) + gds_ext + dIsub_dVdse ; - ydc_dP[dNodePrime] = dIddp_dVddp + gds + dIsub_dVds + dIgidl_dVds - dIgd_dVd ; + ydc_dP[dNode] = - (dIddp_dVddp + dIddp_dVdse) + gds_ext ; + ydc_dP[dNodePrime] = dIddp_dVddp - dIddp_dVds + gds + dIsub_dVds + dIgidl_dVds - dIgd_dVd ; /* ydc_dP[gNode] = 0.0; */ - ydc_dP[gNodePrime] = -dIddp_dVgse + gm_ext + ydc_dP[gNodePrime] = -dIddp_dVgse - dIddp_dVgs + gm_ext + gm + dIsub_dVgs + dIgidl_dVgs - dIgd_dVg ; - ydc_dP[sNode] = dIddp_dVdse + dIddp_dVgse + dIddp_dVbse + dIddp_dVsubs + (-gds_ext -gm_ext -gmbs_ext) - dIsub_dVdse; + ydc_dP[sNode] = dIddp_dVdse + dIddp_dVgse + dIddp_dVbse + dIddp_dVsubs + (-gds_ext -gm_ext -gmbs_ext); ydc_dP[sNodePrime] = -( gds + dIsub_dVds + dIgidl_dVds ) - ( gm + dIsub_dVgs + dIgidl_dVgs ) - - ( gmbs + dIsub_dVbs + dIgidl_dVbs ) - dIgd_dVs ; - ydc_dP[bNodePrime] = - dIddp_dVbse + gmbs_ext + - ( gmbs + dIsub_dVbs + dIgidl_dVbs ) - dIgd_dVs + + ( dIddp_dVds + dIddp_dVgs + dIddp_dVbs ) ; + ydc_dP[bNodePrime] = - dIddp_dVbse - dIddp_dVbs + gmbs_ext + gmbs + dIsub_dVbs + dIgidl_dVbs - dIgd_dVb; /* ydc_dP[bNode] = 0.0; */ /* ydc_dP[dbNode] = 0.0 ; */ @@ -1866,26 +2048,26 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ ydc_gP[tempNode] = dIgd_dT + dIgs_dT + dIgb_dT ; /* source node */ - ydc_s[dNode] = dIssp_dVdse; - /* ydc_s[dNodePrime] = 0.0 */ + ydc_s[dNode] = dIssp_dVdse + dIsubLDs_dVddp - dIdsIBPC_dVddp + dIdsIBPCs_dVddp ; + ydc_s[dNodePrime] = dIsubLDs_dVds - dIdsIBPC_dVds + dIdsIBPCs_dVds - dIsubLDs_dVddp + dIdsIBPC_dVddp - dIdsIBPCs_dVddp ; /* ydc_s[gNode] = 0.0 */ - ydc_s[gNodePrime] = dIssp_dVgse; - ydc_s[sNode] = dIssp_dVssp - ( dIssp_dVgse + dIssp_dVdse + dIssp_dVbse ) - dIssp_dVsubs + Gbs; - ydc_s[sNodePrime] = - dIssp_dVssp; - ydc_s[bNodePrime] = dIssp_dVbse ; + ydc_s[gNodePrime] = dIssp_dVgse + dIsubLDs_dVgs - dIdsIBPC_dVgs + dIdsIBPCs_dVgs ; + ydc_s[sNode] = dIssp_dVssp - ( dIssp_dVgse + dIssp_dVdse + dIssp_dVbse ) - dIssp_dVsubs + Gbs ; + ydc_s[sNodePrime] = - dIssp_dVssp - dIsubLDs_dVds - dIsubLDs_dVgs - dIsubLDs_dVbs - (- dIdsIBPC_dVds - dIdsIBPC_dVgs - dIdsIBPC_dVbs ) - dIdsIBPCs_dVds - dIdsIBPCs_dVgs - dIdsIBPCs_dVbs ; + ydc_s[bNodePrime] = dIssp_dVbse + dIsubLDs_dVbs - dIdsIBPC_dVbs + dIdsIBPCs_dVbs ; /* ydc_s[bNode] = 0.0 */ /* ydc_s[dbNode] = 0.0 */ ydc_s[sbNode] = - Gbs ; ydc_s[subNode] = dIssp_dVsubs; - ydc_s[tempNode] = dIssp_dT - Gbst; + ydc_s[tempNode] = dIssp_dT - Gbst + dIsubLDs_dT - dIdsIBPC_dT + dIdsIBPCs_dT ; /* intrinsic source node */ - ydc_sP[dNode] = - dIssp_dVdse -gds_ext + dIsubs_dVdse ; + ydc_sP[dNode] = - dIssp_dVdse -gds_ext ; ydc_sP[dNodePrime] = - gds + dIsubs_dVds + dIgisl_dVds - dIgs_dVd ; /* ydc_sP[gNode] = 0.0 ; */ ydc_sP[gNodePrime] = -dIssp_dVgse -gm_ext - gm + dIsubs_dVgs + dIgisl_dVgs - dIgs_dVg ; - ydc_sP[sNode] = - dIssp_dVssp - ( - dIssp_dVdse - dIssp_dVgse - dIssp_dVbse ) + dIssp_dVsubs +(gds_ext + gm_ext + gmbs_ext) - dIsubs_dVdse; + ydc_sP[sNode] = - dIssp_dVssp - ( - dIssp_dVdse - dIssp_dVgse - dIssp_dVbse ) + dIssp_dVsubs +(gds_ext + gm_ext + gmbs_ext); ydc_sP[sNodePrime] = dIssp_dVssp - ( - gds + dIsubs_dVds + dIgisl_dVds ) - ( - gm + dIsubs_dVgs + dIgisl_dVgs ) - ( - gmbs + dIsubs_dVbs + dIgisl_dVbs ) - dIgs_dVs ; @@ -1899,19 +2081,19 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ - gmT + dIsubs_dT + dIgisl_dT - dIgs_dT; /* intrinsic bulk node */ - ydc_bP[dNode] = - dIsub_dVdse - dIsubs_dVdse ; - ydc_bP[dNodePrime] = - dIsub_dVds - dIsubs_dVds - dIgidl_dVds - dIgb_dVd - dIgisl_dVds ; + ydc_bP[dNode] = - dIsubLD_dVddp - dIsubLDs_dVddp ; + ydc_bP[dNodePrime] = - dIsub_dVds - dIsubs_dVds - dIsubLD_dVds - dIsubLDs_dVds - dIgidl_dVds - dIgb_dVd - dIgisl_dVds - ( - dIsubLD_dVddp - dIsubLDs_dVddp ) ; /* ydc_bP[gNode] = 0.0 ; */ - ydc_bP[gNodePrime] = - dIsub_dVgs - dIsubs_dVgs - dIgidl_dVgs - dIgb_dVg - dIgisl_dVgs ; - ydc_bP[sNode] = dIsub_dVdse + dIsubs_dVdse; - ydc_bP[sNodePrime] = - ( - dIsub_dVds - dIsubs_dVds - dIgidl_dVds - dIgisl_dVds ) - - ( - dIsub_dVgs - dIsubs_dVgs - dIgidl_dVgs - dIgisl_dVgs ) - - ( - dIsub_dVbs - dIsubs_dVbs - dIgidl_dVbs - dIgisl_dVbs ) - dIgb_dVs ; - ydc_bP[bNodePrime] = - dIsub_dVbs - dIsubs_dVbs - dIgidl_dVbs - dIgb_dVb - dIgisl_dVbs + dIbpdb_dVbpdb + dIbpb_dVbpb + dIbpsb_dVbpsb ; + ydc_bP[gNodePrime] = - dIsub_dVgs - dIsubs_dVgs - dIsubLD_dVgs - dIsubLDs_dVgs - dIgidl_dVgs - dIgb_dVg - dIgisl_dVgs ; + /* ydc_bP[sNode] = 0.0 ;*/ + ydc_bP[sNodePrime] = - ( - dIsub_dVds - dIsubs_dVds - dIsubLD_dVds - dIsubLDs_dVds - dIgidl_dVds - dIgisl_dVds ) + - ( - dIsub_dVgs - dIsubs_dVgs - dIsubLD_dVgs - dIsubLDs_dVgs - dIgidl_dVgs - dIgisl_dVgs ) + - ( - dIsub_dVbs - dIsubs_dVbs - dIsubLD_dVbs - dIsubLDs_dVbs - dIgidl_dVbs - dIgisl_dVbs ) - dIgb_dVs ; + ydc_bP[bNodePrime] = - dIsub_dVbs - dIsubs_dVbs - dIsubLD_dVbs - dIsubLDs_dVbs - dIgidl_dVbs - dIgb_dVb - dIgisl_dVbs + dIbpdb_dVbpdb + dIbpb_dVbpb + dIbpsb_dVbpsb ; ydc_bP[bNode] = - dIbpb_dVbpb ; ydc_bP[dbNode] = - dIbpdb_dVbpdb ; ydc_bP[sbNode] = - dIbpsb_dVbpsb ; - ydc_bP[tempNode] = - dIsub_dT - dIsubs_dT - dIgidl_dT - dIgb_dT - dIgisl_dT ; + ydc_bP[tempNode] = - dIsub_dT - dIsubs_dT - dIsubLD_dT - dIsubLDs_dT - dIgidl_dT - dIgb_dT - dIgisl_dT ; /* bulk node */ /* ydc_b[dNode] = 0.0 ; */ @@ -2466,7 +2648,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ *(ckt->CKTrhs + here->HSMHVbNode) -= model->HSMHV_type * cur_b; *(ckt->CKTrhs + here->HSMHVdbNode) -= model->HSMHV_type * cur_db; *(ckt->CKTrhs + here->HSMHVsbNode) -= model->HSMHV_type * cur_sb; - if( flg_tempNode > 0) { + if( here->HSMHV_coselfheat > 0) { *(ckt->CKTrhs + here->HSMHVtempNode) -= cur_t; /* temp node independent of model type! */ } if (flg_nqs) { @@ -2488,7 +2670,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ if (flg_subNode > 0) { *(here->HSMHVDsubPtr) += ydc_d[subNode]; } - if( flg_tempNode > 0) { + if( here->HSMHV_coselfheat > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVDtempPtr) += model->HSMHV_type * (ydc_d[tempNode] + ag0*ydyn_d[tempNode]); } @@ -2503,7 +2685,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ if (flg_subNode > 0) { *(here->HSMHVDPsubPtr) += ydc_dP[subNode]; } - if( flg_tempNode > 0) { + if( here->HSMHV_coselfheat > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVDPtempPtr) += model->HSMHV_type * (ydc_dP[tempNode] + ag0*ydyn_dP[tempNode]); } @@ -2523,7 +2705,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ *(here->HSMHVGPsPtr) += ydc_gP[sNode] + ag0*ydyn_gP[sNode]; *(here->HSMHVGPspPtr) += ydc_gP[sNodePrime] + ag0*ydyn_gP[sNodePrime]; *(here->HSMHVGPbpPtr) += ydc_gP[bNodePrime] + ag0*ydyn_gP[bNodePrime]; - if( flg_tempNode > 0) { + if( here->HSMHV_coselfheat > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVGPtempPtr) += model->HSMHV_type * (ydc_gP[tempNode] + ag0*ydyn_gP[tempNode]); } @@ -2543,7 +2725,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ if (flg_subNode > 0) { *(here->HSMHVSsubPtr) += ydc_s[subNode]; } - if( flg_tempNode > 0) { + if( here->HSMHV_coselfheat > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVStempPtr) += model->HSMHV_type * (ydc_s[tempNode]+ ag0*ydyn_s[tempNode]); } @@ -2558,7 +2740,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ if (flg_subNode > 0) { *(here->HSMHVSPsubPtr) += ydc_sP[subNode]; } - if( flg_tempNode > 0) { + if( here->HSMHV_coselfheat > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVSPtempPtr) += model->HSMHV_type * (ydc_sP[tempNode] + ag0*ydyn_sP[tempNode]); } @@ -2576,7 +2758,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ *(here->HSMHVBPbPtr) += ydc_bP[bNode] + ag0*ydyn_bP[bNode]; *(here->HSMHVBPdbPtr) += ydc_bP[dbNode] + ag0*ydyn_bP[dbNode]; *(here->HSMHVBPsbPtr) += ydc_bP[sbNode] + ag0*ydyn_bP[sbNode]; - if( flg_tempNode > 0) { + if( here->HSMHV_coselfheat > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVBPtempPtr) += model->HSMHV_type * (ydc_bP[tempNode] + ag0*ydyn_bP[tempNode]); } @@ -2592,7 +2774,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ *(here->HSMHVDBdPtr) += ydc_db[dNode] + ag0*ydyn_db[dNode]; *(here->HSMHVDBbpPtr) += ydc_db[bNodePrime] + ag0*ydyn_db[bNodePrime]; *(here->HSMHVDBdbPtr) += ydc_db[dbNode] + ag0*ydyn_db[dbNode]; - if( flg_tempNode > 0) { + if( here->HSMHV_coselfheat > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVDBtempPtr) += model->HSMHV_type * (ydc_db[tempNode] + ag0*ydyn_db[tempNode]); } @@ -2601,13 +2783,13 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ *(here->HSMHVSBsPtr) += ydc_sb[sNode] + ag0*ydyn_sb[sNode]; *(here->HSMHVSBbpPtr) += ydc_sb[bNodePrime] + ag0*ydyn_sb[bNodePrime]; *(here->HSMHVSBsbPtr) += ydc_sb[sbNode] + ag0*ydyn_sb[sbNode]; - if( flg_tempNode > 0) { + if( here->HSMHV_coselfheat > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVSBtempPtr) += model->HSMHV_type * (ydc_sb[tempNode] + ag0*ydyn_sb[tempNode]); } /*temp*/ - if( flg_tempNode > 0) { + if( here->HSMHV_coselfheat > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVTempdPtr) += model->HSMHV_type * (ydc_t[dNode] + ag0*ydyn_t[dNode] ); *(here->HSMHVTempdpPtr) += model->HSMHV_type * (ydc_t[dNodePrime] + ag0*ydyn_t[dNodePrime]); @@ -2627,7 +2809,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ *(here->HSMHVQIspPtr) += model->HSMHV_type * (ydc_qi[sNodePrime] + ag0*ydyn_qi[sNodePrime]); *(here->HSMHVQIbpPtr) += model->HSMHV_type * (ydc_qi[bNodePrime] + ag0*ydyn_qi[bNodePrime]); *(here->HSMHVQIqiPtr) += (ydc_qi[qiNode] + ag0*ydyn_qi[qiNode]); - if ( flg_tempNode > 0 ) { /* self heating */ + if ( here->HSMHV_coselfheat > 0 ) { /* self heating */ *(here->HSMHVQItempPtr) += (ydc_qi[tempNode] + ag0*ydyn_qi[tempNode]); } @@ -2637,7 +2819,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ *(here->HSMHVQBspPtr) += model->HSMHV_type * (ydc_qb[sNodePrime] + ag0*ydyn_qb[sNodePrime]); *(here->HSMHVQBbpPtr) += model->HSMHV_type * (ydc_qb[bNodePrime] + ag0*ydyn_qb[bNodePrime]); *(here->HSMHVQBqbPtr) += (ydc_qb[qbNode] + ag0*ydyn_qb[qbNode]); - if ( flg_tempNode > 0 ) { /* self heating */ + if ( here->HSMHV_coselfheat > 0 ) { /* self heating */ *(here->HSMHVQBtempPtr) += (ydc_qb[tempNode] + ag0*ydyn_qb[tempNode]); } } @@ -2648,8 +2830,8 @@ line1000: if (ckt->CKTnoncon != noncon_old) { ckt->CKTtroubleElt = (GENinstance *) here; } - - + + } /* End of MOSFET Instance */ } /* End of Model Instance */ diff --git a/src/spicelib/devices/hisimhv1/hsmhvld_info_eval.h b/src/spicelib/devices/hisimhv1/hsmhvld_info_eval.h index ba9a5c3e8..6375bfc5f 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvld_info_eval.h +++ b/src/spicelib/devices/hisimhv1/hsmhvld_info_eval.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_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.10 FILE : hsmhvld_info_eval.h - DATE : 2013.04.30 + DATE : 2014.6.11 recent changes: - 2009.01.09 some bugfixes @@ -17,6 +17,48 @@ Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + /* print all outputs ------------VV */ if ( model->HSMHV_info >= 4 ) { here->HSMHV_csdo = - (here->HSMHV_cddo + here->HSMHV_cgdo + here->HSMHV_cbdo) ; diff --git a/src/spicelib/devices/hisimhv1/hsmhvmask.c b/src/spicelib/devices/hisimhv1/hsmhvmask.c index e959c9222..71d7a6e7b 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvmask.c +++ b/src/spicelib/devices/hisimhv1/hsmhvmask.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvmask.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/ifsim.h" #include "ngspice/cktdefs.h" @@ -124,6 +166,18 @@ int HSMHVmAsk( case HSMHV_MOD_COLDRIFT: value->iValue = model->HSMHV_coldrift; return(OK); + case HSMHV_MOD_CORDRIFT: + value->iValue = model->HSMHV_cordrift; + return(OK); + case HSMHV_MOD_COERRREP: + value->iValue = model->HSMHV_coerrrep; + return(OK); + case HSMHV_MOD_CODEP: + value->iValue = model->HSMHV_codep; + return(OK); + case HSMHV_MOD_CODDLT: + value->iValue = model->HSMHV_coddlt; + return(OK); case HSMHV_MOD_VMAX: value->rValue = model->HSMHV_vmax; return(OK); @@ -193,9 +247,24 @@ int HSMHVmAsk( case HSMHV_MOD_SUBLD1: value->rValue = model->HSMHV_subld1; return(OK); + case HSMHV_MOD_SUBLD1L: + value->rValue = model->HSMHV_subld1l; + return(OK); + case HSMHV_MOD_SUBLD1LP: + value->rValue = model->HSMHV_subld1lp; + return(OK); case HSMHV_MOD_SUBLD2: value->rValue = model->HSMHV_subld2; return(OK); + case HSMHV_MOD_XPDV: + value->rValue = model->HSMHV_xpdv; + return(OK); + case HSMHV_MOD_XPVDTH: + value->rValue = model->HSMHV_xpvdth; + return(OK); + case HSMHV_MOD_XPVDTHG: + value->rValue = model->HSMHV_xpvdthg; + return(OK); case HSMHV_MOD_DDLTMAX: /* Vdseff */ value->rValue = model->HSMHV_ddltmax; return(OK); @@ -334,9 +403,6 @@ int HSMHVmAsk( case HSMHV_MOD_PGD2: value->rValue = model->HSMHV_pgd2; return(OK); - case HSMHV_MOD_PGD3: - value->rValue = model->HSMHV_pgd3; - return(OK); case HSMHV_MOD_PGD4: value->rValue = model->HSMHV_pgd4; return(OK); @@ -748,9 +814,6 @@ int HSMHVmAsk( case HSMHV_MOD_KAPPA: value->rValue = model->HSMHV_kappa; return(OK); - case HSMHV_MOD_PTHROU: - value->rValue = model->HSMHV_pthrou; - return(OK); case HSMHV_MOD_VDIFFJ: value->rValue = model->HSMHV_vdiffj; return(OK); @@ -798,12 +861,47 @@ int HSMHVmAsk( case HSMHV_MOD_IBPC1: value->rValue = model->HSMHV_ibpc1; return(OK); + case HSMHV_MOD_IBPC1L: + value->rValue = model->HSMHV_ibpc1l; + return(OK); + case HSMHV_MOD_IBPC1LP: + value->rValue = model->HSMHV_ibpc1lp; + return(OK); case HSMHV_MOD_IBPC2: value->rValue = model->HSMHV_ibpc2; return(OK); case HSMHV_MOD_MPHDFM: value->rValue = model->HSMHV_mphdfm; return(OK); + + case HSMHV_MOD_PTL: + value->rValue = model->HSMHV_ptl; + return(OK); + case HSMHV_MOD_PTP: + value->rValue = model->HSMHV_ptp; + return(OK); + case HSMHV_MOD_PT2: + value->rValue = model->HSMHV_pt2; + return(OK); + case HSMHV_MOD_PTLP: + value->rValue = model->HSMHV_ptlp; + return(OK); + case HSMHV_MOD_GDL: + value->rValue = model->HSMHV_gdl; + return(OK); + case HSMHV_MOD_GDLP: + value->rValue = model->HSMHV_gdlp; + return(OK); + + case HSMHV_MOD_GDLD: + value->rValue = model->HSMHV_gdld; + return(OK); + case HSMHV_MOD_PT4: + value->rValue = model->HSMHV_pt4; + return(OK); + case HSMHV_MOD_PT4P: + value->rValue = model->HSMHV_pt4p; + return(OK); case HSMHV_MOD_RDVG11: value->rValue = model->HSMHV_rdvg11; return(OK); @@ -870,12 +968,6 @@ int HSMHVmAsk( case HSMHV_MOD_RD20: value->rValue = model->HSMHV_rd20; return(OK); - case HSMHV_MOD_QOVSM: - value->rValue = model->HSMHV_qovsm; - return(OK); - case HSMHV_MOD_LDRIFT: - value->rValue = model->HSMHV_ldrift; - return(OK); case HSMHV_MOD_RD21: value->rValue = model->HSMHV_rd21; return(OK); @@ -894,9 +986,6 @@ int HSMHVmAsk( case HSMHV_MOD_RD25: value->rValue = model->HSMHV_rd25; return(OK); - case HSMHV_MOD_RD26: - value->rValue = model->HSMHV_rd26; - return(OK); case HSMHV_MOD_RDVDL: value->rValue = model->HSMHV_rdvdl; return(OK); @@ -992,9 +1081,262 @@ int HSMHVmAsk( case HSMHV_MOD_NSUBSUB: value->rValue = model->HSMHV_nsubsub; return(OK); + + case HSMHV_MOD_RDRMUE: + value->rValue = model->HSMHV_rdrmue; + return(OK); + case HSMHV_MOD_RDRVMAX: + value->rValue = model->HSMHV_rdrvmax; + return(OK); + case HSMHV_MOD_RDRMUETMP: + value->rValue = model->HSMHV_rdrmuetmp; + return(OK); + case HSMHV_MOD_RDRVTMP: + value->rValue = model->HSMHV_rdrvtmp; + return(OK); + case HSMHV_MOD_NDEPM: + value->rValue = model->HSMHV_ndepm; + return(OK); + case HSMHV_MOD_TNDEP: + value->rValue = model->HSMHV_tndep; + return(OK); + case HSMHV_MOD_DEPMUE0: + value->rValue = model->HSMHV_depmue0; + return(OK); + case HSMHV_MOD_DEPMUE1: + value->rValue = model->HSMHV_depmue1; + return(OK); + case HSMHV_MOD_DEPMUEBACK0: + value->rValue = model->HSMHV_depmueback0; + return(OK); + case HSMHV_MOD_DEPMUEBACK1: + value->rValue = model->HSMHV_depmueback1; + return(OK); + case HSMHV_MOD_DEPLEAK: + value->rValue = model->HSMHV_depleak; + return(OK); + case HSMHV_MOD_DEPETA: + value->rValue = model->HSMHV_depeta; + return(OK); + case HSMHV_MOD_DEPVMAX: + value->rValue = model->HSMHV_depvmax; + return(OK); + case HSMHV_MOD_DEPVDSEF1: + value->rValue = model->HSMHV_depvdsef1; + return(OK); + case HSMHV_MOD_DEPVDSEF2: + value->rValue = model->HSMHV_depvdsef2; + return(OK); + case HSMHV_MOD_DEPMUEPH0: + value->rValue = model->HSMHV_depmueph0; + return(OK); + case HSMHV_MOD_DEPMUEPH1: + value->rValue = model->HSMHV_depmueph1; + return(OK); + case HSMHV_MOD_DEPBB: + value->rValue = model->HSMHV_depbb; + return(OK); + case HSMHV_MOD_DEPVTMP: + value->rValue = model->HSMHV_depvtmp; + return(OK); + case HSMHV_MOD_DEPMUETMP: + value->rValue = model->HSMHV_depmuetmp; + return(OK); + + case HSMHV_MOD_ISBREAK: + value->rValue = model->HSMHV_isbreak; + return(OK); + case HSMHV_MOD_RWELL: + value->rValue = model->HSMHV_rwell; + return(OK); + + +/* case HSMHV_MOD_RDRVMAXT1: */ +/* value->rValue = model->HSMHV_rdrvmaxt1; */ +/* return(OK); */ +/* case HSMHV_MOD_RDRVMAXT2: */ +/* value->rValue = model->HSMHV_rdrvmaxt2; */ +/* return(OK); */ + case HSMHV_MOD_RDRDJUNC: + value->rValue = model->HSMHV_rdrdjunc; + return(OK); + case HSMHV_MOD_RDRCX: + value->rValue = model->HSMHV_rdrcx; + return(OK); + case HSMHV_MOD_RDRCAR: + value->rValue = model->HSMHV_rdrcar; + return(OK); + case HSMHV_MOD_RDRDL1: + value->rValue = model->HSMHV_rdrdl1; + return(OK); + case HSMHV_MOD_RDRDL2: + value->rValue = model->HSMHV_rdrdl2; + return(OK); + case HSMHV_MOD_RDRVMAXW: + value->rValue = model->HSMHV_rdrvmaxw; + return(OK); + case HSMHV_MOD_RDRVMAXWP: + value->rValue = model->HSMHV_rdrvmaxwp; + return(OK); + case HSMHV_MOD_RDRVMAXL: + value->rValue = model->HSMHV_rdrvmaxl; + return(OK); + case HSMHV_MOD_RDRVMAXLP: + value->rValue = model->HSMHV_rdrvmaxlp; + return(OK); + case HSMHV_MOD_RDRMUEL: + value->rValue = model->HSMHV_rdrmuel; + return(OK); + case HSMHV_MOD_RDRMUELP: + value->rValue = model->HSMHV_rdrmuelp; + return(OK); + case HSMHV_MOD_RDRQOVER: + value->rValue = model->HSMHV_rdrqover; + return(OK); + case HSMHV_MOD_QOVADD: + value->rValue = model->HSMHV_qovadd; + return(OK); + case HSMHV_MOD_JS0D: + value->rValue = model->HSMHV_js0d; + return(OK); + case HSMHV_MOD_JS0SWD: + value->rValue = model->HSMHV_js0swd; + return(OK); + case HSMHV_MOD_NJD: + value->rValue = model->HSMHV_njd; + return(OK); + case HSMHV_MOD_NJSWD: + value->rValue = model->HSMHV_njswd; + return(OK); + case HSMHV_MOD_XTID: + value->rValue = model->HSMHV_xtid; + return(OK); + case HSMHV_MOD_CJD: + value->rValue = model->HSMHV_cjd; + return(OK); + case HSMHV_MOD_CJSWD: + value->rValue = model->HSMHV_cjswd; + return(OK); + case HSMHV_MOD_CJSWGD: + value->rValue = model->HSMHV_cjswgd; + return(OK); + case HSMHV_MOD_MJD: + value->rValue = model->HSMHV_mjd; + return(OK); + case HSMHV_MOD_MJSWD: + value->rValue = model->HSMHV_mjswd; + return(OK); + case HSMHV_MOD_MJSWGD: + value->rValue = model->HSMHV_mjswgd; + return(OK); + case HSMHV_MOD_PBD: + value->rValue = model->HSMHV_pbd; + return(OK); + case HSMHV_MOD_PBSWD: + value->rValue = model->HSMHV_pbswd; + return(OK); + case HSMHV_MOD_PBSWDG: + value->rValue = model->HSMHV_pbswgd; + return(OK); + case HSMHV_MOD_XTI2D: + value->rValue = model->HSMHV_xti2d; + return(OK); + case HSMHV_MOD_CISBD: + value->rValue = model->HSMHV_cisbd; + return(OK); + case HSMHV_MOD_CVBD: + value->rValue = model->HSMHV_cvbd; + return(OK); + case HSMHV_MOD_CTEMPD: + value->rValue = model->HSMHV_ctempd; + return(OK); + case HSMHV_MOD_CISBKD: + value->rValue = model->HSMHV_cisbkd; + return(OK); + case HSMHV_MOD_DIVXD: + value->rValue = model->HSMHV_divxd; + return(OK); + case HSMHV_MOD_VDIFFJD: + value->rValue = model->HSMHV_vdiffjd; + return(OK); + case HSMHV_MOD_JS0S: + value->rValue = model->HSMHV_js0s; + return(OK); + case HSMHV_MOD_JS0SWS: + value->rValue = model->HSMHV_js0sws; + return(OK); + case HSMHV_MOD_NJS: + value->rValue = model->HSMHV_njs; + return(OK); + case HSMHV_MOD_NJSWS: + value->rValue = model->HSMHV_njsws; + return(OK); + case HSMHV_MOD_XTIS: + value->rValue = model->HSMHV_xtis; + return(OK); + case HSMHV_MOD_CJS: + value->rValue = model->HSMHV_cjs; + return(OK); + case HSMHV_MOD_CJSSW: + value->rValue = model->HSMHV_cjsws; + return(OK); + case HSMHV_MOD_CJSWGS: + value->rValue = model->HSMHV_cjswgs; + return(OK); + case HSMHV_MOD_MJS: + value->rValue = model->HSMHV_mjs; + return(OK); + case HSMHV_MOD_MJSWS: + value->rValue = model->HSMHV_mjsws; + return(OK); + case HSMHV_MOD_MJSWGS: + value->rValue = model->HSMHV_mjswgs; + return(OK); + case HSMHV_MOD_PBS: + value->rValue = model->HSMHV_pbs; + return(OK); + case HSMHV_MOD_PBSWS: + value->rValue = model->HSMHV_pbsws; + return(OK); + case HSMHV_MOD_PBSWSG: + value->rValue = model->HSMHV_pbswgs; + return(OK); + case HSMHV_MOD_XTI2S: + value->rValue = model->HSMHV_xti2s; + return(OK); + case HSMHV_MOD_CISBS: + value->rValue = model->HSMHV_cisbs; + return(OK); + case HSMHV_MOD_CVBS: + value->rValue = model->HSMHV_cvbs; + return(OK); + case HSMHV_MOD_CTEMPS: + value->rValue = model->HSMHV_ctemps; + return(OK); + case HSMHV_MOD_CISBKS: + value->rValue = model->HSMHV_cisbks; + return(OK); + case HSMHV_MOD_DIVXS: + value->rValue = model->HSMHV_divxs; + return(OK); + case HSMHV_MOD_VDIFFJS: + value->rValue = model->HSMHV_vdiffjs; + return(OK); case HSMHV_MOD_SHEMAX: value->rValue = model->HSMHV_shemax; return(OK); + case HSMHV_MOD_VGSMIN: + value->rValue = model->HSMHV_vgsmin; + return(OK); + case HSMHV_MOD_GDSLEAK: + value->rValue = model->HSMHV_gdsleak; + return(OK); + case HSMHV_MOD_RDRBB: + value->rValue = model->HSMHV_rdrbb; + return(OK); + case HSMHV_MOD_RDRBBTMP: + value->rValue = model->HSMHV_rdrbbtmp; + return(OK); /* binning parameters */ case HSMHV_MOD_LMIN: @@ -1071,9 +1413,6 @@ int HSMHVmAsk( case HSMHV_MOD_LPGD1: value->rValue = model->HSMHV_lpgd1; return(OK); - case HSMHV_MOD_LPGD3: - value->rValue = model->HSMHV_lpgd3; - return(OK); case HSMHV_MOD_LNDEP: value->rValue = model->HSMHV_lndep; return(OK); @@ -1227,9 +1566,6 @@ int HSMHVmAsk( case HSMHV_MOD_LNFALP: value->rValue = model->HSMHV_lnfalp; return(OK); - case HSMHV_MOD_LPTHROU: - value->rValue = model->HSMHV_lpthrou; - return(OK); case HSMHV_MOD_LVDIFFJ: value->rValue = model->HSMHV_lvdiffj; return(OK); @@ -1293,6 +1629,36 @@ int HSMHVmAsk( case HSMHV_MOD_LVOVER: value->rValue = model->HSMHV_lvover; return(OK); + case HSMHV_MOD_LJS0D: + value->rValue = model->HSMHV_ljs0d; + return(OK); + case HSMHV_MOD_LJS0SWD: + value->rValue = model->HSMHV_ljs0swd; + return(OK); + case HSMHV_MOD_LNJD: + value->rValue = model->HSMHV_lnjd; + return(OK); + case HSMHV_MOD_LCISBKD: + value->rValue = model->HSMHV_lcisbkd; + return(OK); + case HSMHV_MOD_LVDIFFJD: + value->rValue = model->HSMHV_lvdiffjd; + return(OK); + case HSMHV_MOD_LJS0S: + value->rValue = model->HSMHV_ljs0s; + return(OK); + case HSMHV_MOD_LJS0SWS: + value->rValue = model->HSMHV_ljs0sws; + return(OK); + case HSMHV_MOD_LNJS: + value->rValue = model->HSMHV_lnjs; + return(OK); + case HSMHV_MOD_LCISBKS: + value->rValue = model->HSMHV_lcisbks; + return(OK); + case HSMHV_MOD_LVDIFFJS: + value->rValue = model->HSMHV_lvdiffjs; + return(OK); /* Width dependence */ case HSMHV_MOD_WVMAX: @@ -1349,9 +1715,6 @@ int HSMHVmAsk( case HSMHV_MOD_WPGD1: value->rValue = model->HSMHV_wpgd1; return(OK); - case HSMHV_MOD_WPGD3: - value->rValue = model->HSMHV_wpgd3; - return(OK); case HSMHV_MOD_WNDEP: value->rValue = model->HSMHV_wndep; return(OK); @@ -1505,9 +1868,6 @@ int HSMHVmAsk( case HSMHV_MOD_WNFALP: value->rValue = model->HSMHV_wnfalp; return(OK); - case HSMHV_MOD_WPTHROU: - value->rValue = model->HSMHV_wpthrou; - return(OK); case HSMHV_MOD_WVDIFFJ: value->rValue = model->HSMHV_wvdiffj; return(OK); @@ -1571,6 +1931,36 @@ int HSMHVmAsk( case HSMHV_MOD_WVOVER: value->rValue = model->HSMHV_wvover; return(OK); + case HSMHV_MOD_WJS0D: + value->rValue = model->HSMHV_wjs0d; + return(OK); + case HSMHV_MOD_WJS0SWD: + value->rValue = model->HSMHV_wjs0swd; + return(OK); + case HSMHV_MOD_WNJD: + value->rValue = model->HSMHV_wnjd; + return(OK); + case HSMHV_MOD_WCISBKD: + value->rValue = model->HSMHV_wcisbkd; + return(OK); + case HSMHV_MOD_WVDIFFJD: + value->rValue = model->HSMHV_wvdiffjd; + return(OK); + case HSMHV_MOD_WJS0S: + value->rValue = model->HSMHV_wjs0s; + return(OK); + case HSMHV_MOD_WJS0SWS: + value->rValue = model->HSMHV_wjs0sws; + return(OK); + case HSMHV_MOD_WNJS: + value->rValue = model->HSMHV_wnjs; + return(OK); + case HSMHV_MOD_WCISBKS: + value->rValue = model->HSMHV_wcisbks; + return(OK); + case HSMHV_MOD_WVDIFFJS: + value->rValue = model->HSMHV_wvdiffjs; + return(OK); /* Cross-term dependence */ case HSMHV_MOD_PVMAX: @@ -1627,9 +2017,6 @@ int HSMHVmAsk( case HSMHV_MOD_PPGD1: value->rValue = model->HSMHV_ppgd1; return(OK); - case HSMHV_MOD_PPGD3: - value->rValue = model->HSMHV_ppgd3; - return(OK); case HSMHV_MOD_PNDEP: value->rValue = model->HSMHV_pndep; return(OK); @@ -1783,9 +2170,6 @@ int HSMHVmAsk( case HSMHV_MOD_PNFALP: value->rValue = model->HSMHV_pnfalp; return(OK); - case HSMHV_MOD_PPTHROU: - value->rValue = model->HSMHV_ppthrou; - return(OK); case HSMHV_MOD_PVDIFFJ: value->rValue = model->HSMHV_pvdiffj; return(OK); @@ -1849,6 +2233,36 @@ int HSMHVmAsk( case HSMHV_MOD_PVOVER: value->rValue = model->HSMHV_pvover; return(OK); + case HSMHV_MOD_PJS0D: + value->rValue = model->HSMHV_pjs0d; + return(OK); + case HSMHV_MOD_PJS0SWD: + value->rValue = model->HSMHV_pjs0swd; + return(OK); + case HSMHV_MOD_PNJD: + value->rValue = model->HSMHV_pnjd; + return(OK); + case HSMHV_MOD_PCISBKD: + value->rValue = model->HSMHV_pcisbkd; + return(OK); + case HSMHV_MOD_PVDIFFJD: + value->rValue = model->HSMHV_pvdiffjd; + return(OK); + case HSMHV_MOD_PJS0S: + value->rValue = model->HSMHV_pjs0s; + return(OK); + case HSMHV_MOD_PJS0SWS: + value->rValue = model->HSMHV_pjs0sws; + return(OK); + case HSMHV_MOD_PNJS: + value->rValue = model->HSMHV_pnjs; + return(OK); + case HSMHV_MOD_PCISBKS: + value->rValue = model->HSMHV_pcisbks; + return(OK); + case HSMHV_MOD_PVDIFFJS: + value->rValue = model->HSMHV_pvdiffjs; + return(OK); case HSMHV_MOD_VGS_MAX: value->rValue = model->HSMHVvgsMax; diff --git a/src/spicelib/devices/hisimhv1/hsmhvmdel.c b/src/spicelib/devices/hisimhv1/hsmhvmdel.c index f5c76db70..2734adb3e 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvmdel.c +++ b/src/spicelib/devices/hisimhv1/hsmhvmdel.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvmdel.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "hsmhvdef.h" #include "ngspice/sperror.h" diff --git a/src/spicelib/devices/hisimhv1/hsmhvmpar.c b/src/spicelib/devices/hisimhv1/hsmhvmpar.c index 3258c7ab2..4e0de4a09 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvmpar.c +++ b/src/spicelib/devices/hisimhv1/hsmhvmpar.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvmpar.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "hsmhvdef.h" #include "ngspice/ifsim.h" @@ -152,6 +194,22 @@ int HSMHVmParam( mod->HSMHV_coldrift = value->iValue; mod->HSMHV_coldrift_Given = TRUE; break; + case HSMHV_MOD_CORDRIFT: + mod->HSMHV_cordrift = value->iValue; + mod->HSMHV_cordrift_Given = TRUE; + break; + case HSMHV_MOD_COERRREP: + mod->HSMHV_coerrrep = value->iValue; + mod->HSMHV_coerrrep_Given = TRUE; + break; + case HSMHV_MOD_CODEP: + mod->HSMHV_codep = value->iValue; + mod->HSMHV_codep_Given = TRUE; + break; + case HSMHV_MOD_CODDLT: + mod->HSMHV_coddlt = value->iValue; + mod->HSMHV_coddlt_Given = TRUE; + break; case HSMHV_MOD_VMAX: mod->HSMHV_vmax = value->rValue; mod->HSMHV_vmax_Given = TRUE; @@ -244,10 +302,30 @@ int HSMHVmParam( mod->HSMHV_subld1 = value->rValue; mod->HSMHV_subld1_Given = TRUE; break; + case HSMHV_MOD_SUBLD1L: + mod->HSMHV_subld1l = value->rValue; + mod->HSMHV_subld1l_Given = TRUE; + break; + case HSMHV_MOD_SUBLD1LP: + mod->HSMHV_subld1lp = value->rValue; + mod->HSMHV_subld1lp_Given = TRUE; + break; case HSMHV_MOD_SUBLD2: mod->HSMHV_subld2 = value->rValue; mod->HSMHV_subld2_Given = TRUE; break; + case HSMHV_MOD_XPDV: + mod->HSMHV_xpdv = value->rValue; + mod->HSMHV_xpdv_Given = TRUE; + break; + case HSMHV_MOD_XPVDTH: + mod->HSMHV_xpvdth = value->rValue; + mod->HSMHV_xpvdth_Given = TRUE; + break; + case HSMHV_MOD_XPVDTHG: + mod->HSMHV_xpvdthg = value->rValue; + mod->HSMHV_xpvdthg_Given = TRUE; + break; case HSMHV_MOD_DDLTMAX: /* Vdseff */ mod->HSMHV_ddltmax = value->rValue; mod->HSMHV_ddltmax_Given = TRUE; @@ -432,10 +510,6 @@ int HSMHVmParam( mod->HSMHV_pgd2 = value->rValue; mod->HSMHV_pgd2_Given = TRUE; break; - case HSMHV_MOD_PGD3: - mod->HSMHV_pgd3 = value->rValue; - mod->HSMHV_pgd3_Given = TRUE; - break; case HSMHV_MOD_PGD4: mod->HSMHV_pgd4 = value->rValue; mod->HSMHV_pgd4_Given = TRUE; @@ -984,10 +1058,6 @@ int HSMHVmParam( mod->HSMHV_kappa = value->rValue; mod->HSMHV_kappa_Given = TRUE; break; - case HSMHV_MOD_PTHROU: - mod->HSMHV_pthrou = value->rValue; - mod->HSMHV_pthrou_Given = TRUE; - break; case HSMHV_MOD_VDIFFJ: mod->HSMHV_vdiffj = value->rValue; mod->HSMHV_vdiffj_Given = TRUE; @@ -1044,6 +1114,14 @@ int HSMHVmParam( mod->HSMHV_ibpc1 = value->rValue; mod->HSMHV_ibpc1_Given = TRUE; break; + case HSMHV_MOD_IBPC1L: + mod->HSMHV_ibpc1l = value->rValue; + mod->HSMHV_ibpc1l_Given = TRUE; + break; + case HSMHV_MOD_IBPC1LP: + mod->HSMHV_ibpc1lp = value->rValue; + mod->HSMHV_ibpc1lp_Given = TRUE; + break; case HSMHV_MOD_IBPC2: mod->HSMHV_ibpc2 = value->rValue; mod->HSMHV_ibpc2_Given = TRUE; @@ -1052,6 +1130,44 @@ int HSMHVmParam( mod->HSMHV_mphdfm = value->rValue; mod->HSMHV_mphdfm_Given = TRUE; break; + + case HSMHV_MOD_PTL: + mod->HSMHV_ptl = value->rValue; + mod->HSMHV_ptl_Given = TRUE; + break; + case HSMHV_MOD_PTP: + mod->HSMHV_ptp = value->rValue; + mod->HSMHV_ptp_Given = TRUE; + break; + case HSMHV_MOD_PT2: + mod->HSMHV_pt2 = value->rValue; + mod->HSMHV_pt2_Given = TRUE; + break; + case HSMHV_MOD_PTLP: + mod->HSMHV_ptlp = value->rValue; + mod->HSMHV_ptlp_Given = TRUE; + break; + case HSMHV_MOD_GDL: + mod->HSMHV_gdl = value->rValue; + mod->HSMHV_gdl_Given = TRUE; + break; + case HSMHV_MOD_GDLP: + mod->HSMHV_gdlp = value->rValue; + mod->HSMHV_gdlp_Given = TRUE; + break; + + case HSMHV_MOD_GDLD: + mod->HSMHV_gdld = value->rValue; + mod->HSMHV_gdld_Given = TRUE; + break; + case HSMHV_MOD_PT4: + mod->HSMHV_pt4 = value->rValue; + mod->HSMHV_pt4_Given = TRUE; + break; + case HSMHV_MOD_PT4P: + mod->HSMHV_pt4p = value->rValue; + mod->HSMHV_pt4p_Given = TRUE; + break; case HSMHV_MOD_RDVG11: mod->HSMHV_rdvg11 = value->rValue; mod->HSMHV_rdvg11_Given = TRUE; @@ -1064,14 +1180,6 @@ int HSMHVmParam( mod->HSMHV_rd20 = value->rValue; mod->HSMHV_rd20_Given = TRUE; break; - case HSMHV_MOD_QOVSM: - mod->HSMHV_qovsm = value->rValue; - mod->HSMHV_qovsm_Given = TRUE; - break; - case HSMHV_MOD_LDRIFT: - mod->HSMHV_ldrift = value->rValue; - mod->HSMHV_ldrift_Given = TRUE; - break; case HSMHV_MOD_RD21: mod->HSMHV_rd21 = value->rValue; mod->HSMHV_rd21_Given = TRUE; @@ -1096,10 +1204,6 @@ int HSMHVmParam( mod->HSMHV_rd25 = value->rValue; mod->HSMHV_rd25_Given = TRUE; break; - case HSMHV_MOD_RD26: - mod->HSMHV_rd26 = value->rValue; - mod->HSMHV_rd26_Given = TRUE; - break; case HSMHV_MOD_RDVDL: mod->HSMHV_rdvdl = value->rValue; mod->HSMHV_rdvdl_Given = TRUE; @@ -1300,11 +1404,263 @@ int HSMHVmParam( mod->HSMHV_nsubsub = value->rValue; mod->HSMHV_nsubsub_Given = TRUE; break; + + case HSMHV_MOD_RDRMUE: + mod->HSMHV_rdrmue = value->rValue; + mod->HSMHV_rdrmue_Given = TRUE; + break; + case HSMHV_MOD_RDRVMAX: + mod->HSMHV_rdrvmax = value->rValue; + mod->HSMHV_rdrvmax_Given = TRUE; + break; + case HSMHV_MOD_RDRMUETMP: + mod->HSMHV_rdrmuetmp = value->rValue; + mod->HSMHV_rdrmuetmp_Given = TRUE; + break; + case HSMHV_MOD_RDRVTMP: + mod->HSMHV_rdrvtmp = value->rValue; + mod->HSMHV_rdrvtmp_Given = TRUE; + break; + case HSMHV_MOD_RDRDJUNC: + mod->HSMHV_rdrdjunc = value->rValue; + mod->HSMHV_rdrdjunc_Given = TRUE; + break; + case HSMHV_MOD_RDRCX: + mod->HSMHV_rdrcx = value->rValue; + mod->HSMHV_rdrcx_Given = TRUE; + break; + case HSMHV_MOD_RDRCAR: + mod->HSMHV_rdrcar = value->rValue; + mod->HSMHV_rdrcar_Given = TRUE; + break; + case HSMHV_MOD_RDRDL1: + mod->HSMHV_rdrdl1 = value->rValue; + mod->HSMHV_rdrdl1_Given = TRUE; + break; + case HSMHV_MOD_RDRDL2: + mod->HSMHV_rdrdl2 = value->rValue; + mod->HSMHV_rdrdl2_Given = TRUE; + break; + case HSMHV_MOD_RDRVMAXW: + mod->HSMHV_rdrvmaxw = value->rValue; + mod->HSMHV_rdrvmaxw_Given = TRUE; + break; + case HSMHV_MOD_RDRVMAXWP: + mod->HSMHV_rdrvmaxwp = value->rValue; + mod->HSMHV_rdrvmaxwp_Given = TRUE; + break; + case HSMHV_MOD_RDRVMAXL: + mod->HSMHV_rdrvmaxl = value->rValue; + mod->HSMHV_rdrvmaxl_Given = TRUE; + break; + case HSMHV_MOD_RDRVMAXLP: + mod->HSMHV_rdrvmaxlp = value->rValue; + mod->HSMHV_rdrvmaxlp_Given = TRUE; + break; + case HSMHV_MOD_RDRMUEL: + mod->HSMHV_rdrmuel = value->rValue; + mod->HSMHV_rdrmuel_Given = TRUE; + break; + case HSMHV_MOD_RDRMUELP: + mod->HSMHV_rdrmuelp = value->rValue; + mod->HSMHV_rdrmuelp_Given = TRUE; + break; + case HSMHV_MOD_RDRQOVER: + mod->HSMHV_rdrqover = value->rValue; + mod->HSMHV_rdrqover_Given = TRUE; + break; + case HSMHV_MOD_QOVADD: + mod->HSMHV_qovadd = value->rValue; + mod->HSMHV_qovadd_Given = TRUE; + break; + case HSMHV_MOD_JS0D: + mod->HSMHV_js0d = value->rValue; + mod->HSMHV_js0d_Given = TRUE; + break; + case HSMHV_MOD_JS0SWD: + mod->HSMHV_js0swd = value->rValue; + mod->HSMHV_js0swd_Given = TRUE; + break; + case HSMHV_MOD_NJD: + mod->HSMHV_njd = value->rValue; + mod->HSMHV_njd_Given = TRUE; + break; + case HSMHV_MOD_NJSWD: + mod->HSMHV_njswd = value->rValue; + mod->HSMHV_njswd_Given = TRUE; + break; + case HSMHV_MOD_XTID: + mod->HSMHV_xtid = value->rValue; + mod->HSMHV_xtid_Given = TRUE; + break; + case HSMHV_MOD_CJD: + mod->HSMHV_cjd = value->rValue; + mod->HSMHV_cjd_Given = TRUE; + break; + case HSMHV_MOD_CJSWD: + mod->HSMHV_cjswd = value->rValue; + mod->HSMHV_cjswd_Given = TRUE; + break; + case HSMHV_MOD_CJSWGD: + mod->HSMHV_cjswgd = value->rValue; + mod->HSMHV_cjswgd_Given = TRUE; + break; + case HSMHV_MOD_MJD: + mod->HSMHV_mjd = value->rValue; + mod->HSMHV_mjd_Given = TRUE; + break; + case HSMHV_MOD_MJSWD: + mod->HSMHV_mjswd = value->rValue; + mod->HSMHV_mjswd_Given = TRUE; + break; + case HSMHV_MOD_MJSWGD: + mod->HSMHV_mjswgd = value->rValue; + mod->HSMHV_mjswgd_Given = TRUE; + break; + case HSMHV_MOD_PBD: + mod->HSMHV_pbd = value->rValue; + mod->HSMHV_pbd_Given = TRUE; + break; + case HSMHV_MOD_PBSWD: + mod->HSMHV_pbswd = value->rValue; + mod->HSMHV_pbswd_Given = TRUE; + break; + case HSMHV_MOD_PBSWDG: + mod->HSMHV_pbswgd = value->rValue; + mod->HSMHV_pbswgd_Given = TRUE; + break; + case HSMHV_MOD_XTI2D: + mod->HSMHV_xti2d = value->rValue; + mod->HSMHV_xti2d_Given = TRUE; + break; + case HSMHV_MOD_CISBD: + mod->HSMHV_cisbd = value->rValue; + mod->HSMHV_cisbd_Given = TRUE; + break; + case HSMHV_MOD_CVBD: + mod->HSMHV_cvbd = value->rValue; + mod->HSMHV_cvbd_Given = TRUE; + break; + case HSMHV_MOD_CTEMPD: + mod->HSMHV_ctempd = value->rValue; + mod->HSMHV_ctempd_Given = TRUE; + break; + case HSMHV_MOD_CISBKD: + mod->HSMHV_cisbkd = value->rValue; + mod->HSMHV_cisbkd_Given = TRUE; + break; + case HSMHV_MOD_DIVXD: + mod->HSMHV_divxd = value->rValue; + mod->HSMHV_divxd_Given = TRUE; + break; + case HSMHV_MOD_VDIFFJD: + mod->HSMHV_vdiffjd = value->rValue; + mod->HSMHV_vdiffjd_Given = TRUE; + break; + case HSMHV_MOD_JS0S: + mod->HSMHV_js0s = value->rValue; + mod->HSMHV_js0s_Given = TRUE; + break; + case HSMHV_MOD_JS0SWS: + mod->HSMHV_js0sws = value->rValue; + mod->HSMHV_js0sws_Given = TRUE; + break; + case HSMHV_MOD_NJS: + mod->HSMHV_njs = value->rValue; + mod->HSMHV_njs_Given = TRUE; + break; + case HSMHV_MOD_NJSWS: + mod->HSMHV_njsws = value->rValue; + mod->HSMHV_njsws_Given = TRUE; + break; + case HSMHV_MOD_XTIS: + mod->HSMHV_xtis = value->rValue; + mod->HSMHV_xtis_Given = TRUE; + break; + case HSMHV_MOD_CJS: + mod->HSMHV_cjs = value->rValue; + mod->HSMHV_cjs_Given = TRUE; + break; + case HSMHV_MOD_CJSSW: + mod->HSMHV_cjsws = value->rValue; + mod->HSMHV_cjsws_Given = TRUE; + break; + case HSMHV_MOD_CJSWGS: + mod->HSMHV_cjswgs = value->rValue; + mod->HSMHV_cjswgs_Given = TRUE; + break; + case HSMHV_MOD_MJS: + mod->HSMHV_mjs = value->rValue; + mod->HSMHV_mjs_Given = TRUE; + break; + case HSMHV_MOD_MJSWS: + mod->HSMHV_mjsws = value->rValue; + mod->HSMHV_mjsws_Given = TRUE; + break; + case HSMHV_MOD_MJSWGS: + mod->HSMHV_mjswgs = value->rValue; + mod->HSMHV_mjswgs_Given = TRUE; + break; + case HSMHV_MOD_PBS: + mod->HSMHV_pbs = value->rValue; + mod->HSMHV_pbs_Given = TRUE; + break; + case HSMHV_MOD_PBSWS: + mod->HSMHV_pbsws = value->rValue; + mod->HSMHV_pbsws_Given = TRUE; + break; + case HSMHV_MOD_PBSWSG: + mod->HSMHV_pbswgs = value->rValue; + mod->HSMHV_pbswgs_Given = TRUE; + break; + case HSMHV_MOD_XTI2S: + mod->HSMHV_xti2s = value->rValue; + mod->HSMHV_xti2s_Given = TRUE; + break; + case HSMHV_MOD_CISBS: + mod->HSMHV_cisbs = value->rValue; + mod->HSMHV_cisbs_Given = TRUE; + break; + case HSMHV_MOD_CVBS: + mod->HSMHV_cvbs = value->rValue; + mod->HSMHV_cvbs_Given = TRUE; + break; + case HSMHV_MOD_CTEMPS: + mod->HSMHV_ctemps = value->rValue; + mod->HSMHV_ctemps_Given = TRUE; + break; + case HSMHV_MOD_CISBKS: + mod->HSMHV_cisbks = value->rValue; + mod->HSMHV_cisbks_Given = TRUE; + break; + case HSMHV_MOD_DIVXS: + mod->HSMHV_divxs = value->rValue; + mod->HSMHV_divxs_Given = TRUE; + break; + case HSMHV_MOD_VDIFFJS: + mod->HSMHV_vdiffjs = value->rValue; + mod->HSMHV_vdiffjs_Given = TRUE; + break; case HSMHV_MOD_SHEMAX: mod->HSMHV_shemax = value->rValue; mod->HSMHV_shemax_Given = TRUE; break; - + case HSMHV_MOD_VGSMIN: + mod->HSMHV_vgsmin = value->rValue; + mod->HSMHV_vgsmin_Given = TRUE; + break; + case HSMHV_MOD_GDSLEAK: + mod->HSMHV_gdsleak = value->rValue; + mod->HSMHV_gdsleak_Given = TRUE; + break; + case HSMHV_MOD_RDRBB: + mod->HSMHV_rdrbb = value->rValue; + mod->HSMHV_rdrbb_Given = TRUE; + break; + case HSMHV_MOD_RDRBBTMP: + mod->HSMHV_rdrbbtmp = value->rValue; + mod->HSMHV_rdrbbtmp_Given = TRUE; + break; /* binning parameters */ @@ -1406,10 +1762,6 @@ int HSMHVmParam( mod->HSMHV_lpgd1 = value->rValue; mod->HSMHV_lpgd1_Given = TRUE; break; - case HSMHV_MOD_LPGD3: - mod->HSMHV_lpgd3 = value->rValue; - mod->HSMHV_lpgd3_Given = TRUE; - break; case HSMHV_MOD_LNDEP: mod->HSMHV_lndep = value->rValue; mod->HSMHV_lndep_Given = TRUE; @@ -1614,10 +1966,6 @@ int HSMHVmParam( mod->HSMHV_lnfalp = value->rValue; mod->HSMHV_lnfalp_Given = TRUE; break; - case HSMHV_MOD_LPTHROU: - mod->HSMHV_lpthrou = value->rValue; - mod->HSMHV_lpthrou_Given = TRUE; - break; case HSMHV_MOD_LVDIFFJ: mod->HSMHV_lvdiffj = value->rValue; mod->HSMHV_lvdiffj_Given = TRUE; @@ -1703,6 +2051,46 @@ int HSMHVmParam( mod->HSMHV_lvover = value->rValue; mod->HSMHV_lvover_Given = TRUE; break; + case HSMHV_MOD_LJS0D: + mod->HSMHV_ljs0d = value->rValue; + mod->HSMHV_ljs0d_Given = TRUE; + break; + case HSMHV_MOD_LJS0SWD: + mod->HSMHV_ljs0swd = value->rValue; + mod->HSMHV_ljs0swd_Given = TRUE; + break; + case HSMHV_MOD_LNJD: + mod->HSMHV_lnjd = value->rValue; + mod->HSMHV_lnjd_Given = TRUE; + break; + case HSMHV_MOD_LCISBKD: + mod->HSMHV_lcisbkd = value->rValue; + mod->HSMHV_lcisbkd_Given = TRUE; + break; + case HSMHV_MOD_LVDIFFJD: + mod->HSMHV_lvdiffjd = value->rValue; + mod->HSMHV_lvdiffjd_Given = TRUE; + break; + case HSMHV_MOD_LJS0S: + mod->HSMHV_ljs0s = value->rValue; + mod->HSMHV_ljs0s_Given = TRUE; + break; + case HSMHV_MOD_LJS0SWS: + mod->HSMHV_ljs0sws = value->rValue; + mod->HSMHV_ljs0sws_Given = TRUE; + break; + case HSMHV_MOD_LNJS: + mod->HSMHV_lnjs = value->rValue; + mod->HSMHV_lnjs_Given = TRUE; + break; + case HSMHV_MOD_LCISBKS: + mod->HSMHV_lcisbks = value->rValue; + mod->HSMHV_lcisbks_Given = TRUE; + break; + case HSMHV_MOD_LVDIFFJS: + mod->HSMHV_lvdiffjs = value->rValue; + mod->HSMHV_lvdiffjs_Given = TRUE; + break; /* Width dependence */ case HSMHV_MOD_WVMAX: @@ -1777,10 +2165,6 @@ int HSMHVmParam( mod->HSMHV_wpgd1 = value->rValue; mod->HSMHV_wpgd1_Given = TRUE; break; - case HSMHV_MOD_WPGD3: - mod->HSMHV_wpgd3 = value->rValue; - mod->HSMHV_wpgd3_Given = TRUE; - break; case HSMHV_MOD_WNDEP: mod->HSMHV_wndep = value->rValue; mod->HSMHV_wndep_Given = TRUE; @@ -1985,10 +2369,6 @@ int HSMHVmParam( mod->HSMHV_wnfalp = value->rValue; mod->HSMHV_wnfalp_Given = TRUE; break; - case HSMHV_MOD_WPTHROU: - mod->HSMHV_wpthrou = value->rValue; - mod->HSMHV_wpthrou_Given = TRUE; - break; case HSMHV_MOD_WVDIFFJ: mod->HSMHV_wvdiffj = value->rValue; mod->HSMHV_wvdiffj_Given = TRUE; @@ -2074,6 +2454,46 @@ int HSMHVmParam( mod->HSMHV_wvover = value->rValue; mod->HSMHV_wvover_Given = TRUE; break; + case HSMHV_MOD_WJS0D: + mod->HSMHV_wjs0d = value->rValue; + mod->HSMHV_wjs0d_Given = TRUE; + break; + case HSMHV_MOD_WJS0SWD: + mod->HSMHV_wjs0swd = value->rValue; + mod->HSMHV_wjs0swd_Given = TRUE; + break; + case HSMHV_MOD_WNJD: + mod->HSMHV_wnjd = value->rValue; + mod->HSMHV_wnjd_Given = TRUE; + break; + case HSMHV_MOD_WCISBKD: + mod->HSMHV_wcisbkd = value->rValue; + mod->HSMHV_wcisbkd_Given = TRUE; + break; + case HSMHV_MOD_WVDIFFJD: + mod->HSMHV_wvdiffjd = value->rValue; + mod->HSMHV_wvdiffjd_Given = TRUE; + break; + case HSMHV_MOD_WJS0S: + mod->HSMHV_wjs0s = value->rValue; + mod->HSMHV_wjs0s_Given = TRUE; + break; + case HSMHV_MOD_WJS0SWS: + mod->HSMHV_wjs0sws = value->rValue; + mod->HSMHV_wjs0sws_Given = TRUE; + break; + case HSMHV_MOD_WNJS: + mod->HSMHV_wnjs = value->rValue; + mod->HSMHV_wnjs_Given = TRUE; + break; + case HSMHV_MOD_WCISBKS: + mod->HSMHV_wcisbks = value->rValue; + mod->HSMHV_wcisbks_Given = TRUE; + break; + case HSMHV_MOD_WVDIFFJS: + mod->HSMHV_wvdiffjs = value->rValue; + mod->HSMHV_wvdiffjs_Given = TRUE; + break; /* Cross-term dependence */ case HSMHV_MOD_PVMAX: @@ -2148,10 +2568,6 @@ int HSMHVmParam( mod->HSMHV_ppgd1 = value->rValue; mod->HSMHV_ppgd1_Given = TRUE; break; - case HSMHV_MOD_PPGD3: - mod->HSMHV_ppgd3 = value->rValue; - mod->HSMHV_ppgd3_Given = TRUE; - break; case HSMHV_MOD_PNDEP: mod->HSMHV_pndep = value->rValue; mod->HSMHV_pndep_Given = TRUE; @@ -2356,10 +2772,6 @@ int HSMHVmParam( mod->HSMHV_pnfalp = value->rValue; mod->HSMHV_pnfalp_Given = TRUE; break; - case HSMHV_MOD_PPTHROU: - mod->HSMHV_ppthrou = value->rValue; - mod->HSMHV_ppthrou_Given = TRUE; - break; case HSMHV_MOD_PVDIFFJ: mod->HSMHV_pvdiffj = value->rValue; mod->HSMHV_pvdiffj_Given = TRUE; @@ -2446,6 +2858,119 @@ int HSMHVmParam( mod->HSMHV_pvover_Given = TRUE; break; + case HSMHV_MOD_PJS0D: + mod->HSMHV_pjs0d = value->rValue; + mod->HSMHV_pjs0d_Given = TRUE; + break; + case HSMHV_MOD_PJS0SWD: + mod->HSMHV_pjs0swd = value->rValue; + mod->HSMHV_pjs0swd_Given = TRUE; + break; + case HSMHV_MOD_PNJD: + mod->HSMHV_pnjd = value->rValue; + mod->HSMHV_pnjd_Given = TRUE; + break; + case HSMHV_MOD_PCISBKD: + mod->HSMHV_pcisbkd = value->rValue; + mod->HSMHV_pcisbkd_Given = TRUE; + break; + case HSMHV_MOD_PVDIFFJD: + mod->HSMHV_pvdiffjd = value->rValue; + mod->HSMHV_pvdiffjd_Given = TRUE; + break; + case HSMHV_MOD_PJS0S: + mod->HSMHV_pjs0s = value->rValue; + mod->HSMHV_pjs0s_Given = TRUE; + break; + case HSMHV_MOD_PJS0SWS: + mod->HSMHV_pjs0sws = value->rValue; + mod->HSMHV_pjs0sws_Given = TRUE; + break; + case HSMHV_MOD_PNJS: + mod->HSMHV_pnjs = value->rValue; + mod->HSMHV_pnjs_Given = TRUE; + break; + case HSMHV_MOD_PCISBKS: + mod->HSMHV_pcisbks = value->rValue; + mod->HSMHV_pcisbks_Given = TRUE; + break; + case HSMHV_MOD_PVDIFFJS: + mod->HSMHV_pvdiffjs = value->rValue; + mod->HSMHV_pvdiffjs_Given = TRUE; + break; + case HSMHV_MOD_NDEPM: + mod->HSMHV_ndepm = value->rValue; + mod->HSMHV_ndepm_Given = TRUE; + break; + case HSMHV_MOD_TNDEP: + mod->HSMHV_tndep = value->rValue; + mod->HSMHV_tndep_Given = TRUE; + break; + case HSMHV_MOD_DEPMUE0: + mod->HSMHV_depmue0 = value->rValue; + mod->HSMHV_depmue0_Given = TRUE; + break; + case HSMHV_MOD_DEPMUE1: + mod->HSMHV_depmue1 = value->rValue; + mod->HSMHV_depmue1_Given = TRUE; + break; + case HSMHV_MOD_DEPMUEBACK0: + mod->HSMHV_depmueback0 = value->rValue; + mod->HSMHV_depmueback0_Given = TRUE; + break; + case HSMHV_MOD_DEPMUEBACK1: + mod->HSMHV_depmueback1 = value->rValue; + mod->HSMHV_depmueback1_Given = TRUE; + break; + case HSMHV_MOD_DEPLEAK: + mod->HSMHV_depleak = value->rValue; + mod->HSMHV_depleak_Given = TRUE; + break; + case HSMHV_MOD_DEPETA: + mod->HSMHV_depeta = value->rValue; + mod->HSMHV_depeta_Given = TRUE; + break; + case HSMHV_MOD_DEPVMAX: + mod->HSMHV_depvmax = value->rValue; + mod->HSMHV_depvmax_Given = TRUE; + break; + case HSMHV_MOD_DEPVDSEF1: + mod->HSMHV_depvdsef1 = value->rValue; + mod->HSMHV_depvdsef1_Given = TRUE; + break; + case HSMHV_MOD_DEPVDSEF2: + mod->HSMHV_depvdsef2 = value->rValue; + mod->HSMHV_depvdsef2_Given = TRUE; + break; + case HSMHV_MOD_DEPMUEPH0: + mod->HSMHV_depmueph0 = value->rValue; + mod->HSMHV_depmueph0_Given = TRUE; + break; + case HSMHV_MOD_DEPMUEPH1: + mod->HSMHV_depmueph1 = value->rValue; + mod->HSMHV_depmueph1_Given = TRUE; + break; + case HSMHV_MOD_DEPBB: + mod->HSMHV_depbb = value->rValue; + mod->HSMHV_depbb_Given = TRUE; + break; + case HSMHV_MOD_DEPVTMP: + mod->HSMHV_depvtmp = value->rValue; + mod->HSMHV_depvtmp_Given = TRUE; + break; + case HSMHV_MOD_DEPMUETMP: + mod->HSMHV_depmuetmp = value->rValue; + mod->HSMHV_depmuetmp_Given = TRUE; + break; + case HSMHV_MOD_ISBREAK: + mod->HSMHV_isbreak = value->rValue; + mod->HSMHV_isbreak_Given = TRUE; + break; + case HSMHV_MOD_RWELL: + mod->HSMHV_rwell = value->rValue; + mod->HSMHV_rwell_Given = TRUE; + break; + case HSMHV_MOD_VGS_MAX: mod->HSMHVvgsMax = value->rValue; mod->HSMHVvgsMaxGiven = TRUE; diff --git a/src/spicelib/devices/hisimhv1/hsmhvnoi.c b/src/spicelib/devices/hisimhv1/hsmhvnoi.c index 86789e4bb..091f1a654 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvnoi.c +++ b/src/spicelib/devices/hisimhv1/hsmhvnoi.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvnoi.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "hsmhvdef.h" #include "ngspice/cktdefs.h" @@ -34,6 +76,9 @@ * all of the MOSFET's is summed with the variable "OnDens". */ +extern void NevalSrc(); +extern double Nintegrate(); + int HSMHVnoise ( int mode, int operation, GENmodel *inModel, @@ -78,8 +123,10 @@ int HSMHVnoise ( case N_DENS: for ( i = 0; i < HSMHVNSRCS; i++ ) { (void) sprintf(name, "onoise.%s%s", - here->HSMHVname, HSMHVnNames[i]); - data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); + (char *)here->HSMHVname, HSMHVnNames[i]); + data->namelist = + (IFuid *) trealloc((char *) data->namelist, + (data->numPlots + 1) * sizeof(IFuid)); if (!data->namelist) return(E_NOMEM); (*(SPfrontEnd->IFnewUid)) @@ -90,8 +137,10 @@ int HSMHVnoise ( case INT_NOIZ: for ( i = 0; i < HSMHVNSRCS; i++ ) { (void) sprintf(name, "onoise_total.%s%s", - here->HSMHVname, HSMHVnNames[i]); - data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); + (char *)here->HSMHVname, HSMHVnNames[i]); + data->namelist = + (IFuid *) trealloc((char *) data->namelist, + (data->numPlots + 1) * sizeof(IFuid)); if (!data->namelist) return(E_NOMEM); (*(SPfrontEnd->IFnewUid)) @@ -99,8 +148,10 @@ int HSMHVnoise ( (IFuid) NULL, name, UID_OTHER, NULL); (void) sprintf(name, "inoise_total.%s%s", - here->HSMHVname, HSMHVnNames[i]); - data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); + (char *)here->HSMHVname, HSMHVnNames[i]); + data->namelist = + (IFuid *) trealloc((char *) data->namelist, + (data->numPlots + 1) * sizeof(IFuid)); if (!data->namelist) return(E_NOMEM); (*(SPfrontEnd->IFnewUid)) @@ -121,7 +172,7 @@ int HSMHVnoise ( TTEMP = TTEMP + *(ckt->CKTstate0 + here->HSMHVdeltemp) ; /* rs/rd thermal noise */ - if ( model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3 ) { + if ( model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3 || model->HSMHV_cordrift == 1 ) { NevalSrc(&noizDens[HSMHVRDNOIZ], (double*) NULL, ckt, N_GAIN, here->HSMHVdNodePrime, here->HSMHVdNode, diff --git a/src/spicelib/devices/hisimhv1/hsmhvpar.c b/src/spicelib/devices/hisimhv1/hsmhvpar.c index 24388523d..be3ba8c01 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvpar.c +++ b/src/spicelib/devices/hisimhv1/hsmhvpar.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvpar.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/ifsim.h" #include "hsmhvdef.h" diff --git a/src/spicelib/devices/hisimhv1/hsmhvpzld.c b/src/spicelib/devices/hisimhv1/hsmhvpzld.c index b657da4df..764f0d133 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvpzld.c +++ b/src/spicelib/devices/hisimhv1/hsmhvpzld.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvpzld.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/cktdefs.h" #include "ngspice/complex.h" @@ -24,11 +66,11 @@ int HSMHVpzLoad( GENmodel *inModel, - register CKTcircuit *ckt, - register SPcomplex *s) + CKTcircuit *ckt, + SPcomplex *s) { - register HSMHVmodel *model = (HSMHVmodel*)inModel; - register HSMHVinstance *here; + HSMHVmodel *model = (HSMHVmodel*)inModel; + HSMHVinstance *here; int flg_nqs =0 ; NG_IGNORE(ckt); diff --git a/src/spicelib/devices/hisimhv1/hsmhvset.c b/src/spicelib/devices/hisimhv1/hsmhvset.c index 830554a73..85dd0186a 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvset.c +++ b/src/spicelib/devices/hisimhv1/hsmhvset.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvset.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/smpdefs.h" #include "ngspice/cktdefs.h" @@ -32,28 +74,45 @@ + model->HSMHV_l##param / Lbin + model->HSMHV_w##param / Wbin \ + model->HSMHV_p##param / LWbin ; -#define RANGECHECK(param, min, max, pname) \ - if ( (param) < (min) || (param) > (max) ) { \ - printf("warning(HiSIMHV): The model/instance parameter %s (= %e) must be in the range [%e , %e].\n", \ - (pname), (param), (double) (min), (double) (max) ); \ +#define RANGECHECK(param, min, max, pname) \ + if ( model->HSMHV_coerrrep && ((param) < (min) || (param) > (max)) ) { \ + printf("warning(HiSIM_HV(%s)): (%s = %g) range [%g , %g].\n", model->HSMHVmodName,\ + (pname), (param), (min*1.0), (max*1.0) ); \ } -#define MINCHECK(param, min, pname) \ - if ( (param) < (min) ) { \ - printf("warning(HiSIMHV): The model/instance parameter %s (= %e) must be greater than %e.\n", \ - (pname), (param), (min) ); \ +#define RANGERESET(param, min, max, pname) \ + if ( model->HSMHV_coerrrep && ((param) > (max)) ) { \ + printf("reset(HiSIM_HV(%s)): (%s = %g to %g) range [%g , %g].\n", model->HSMHVmodName,\ + (pname), (param), (max*1.0), (min*1.0), (max*1.0) ); \ + } \ + if ( model->HSMHV_coerrrep && ((param) < (min)) ) { \ + printf("reset(HiSIM_HV(%s)): (%s = %g to %g) range [%g , %g].\n",model->HSMHVmodName, \ + (pname), (param), (min*1.0), (min*1.0), (max*1.0) ); \ + } \ + if ( (param) < (min) ) { param = (min); } \ + if ( (param) > (max) ) { param = (max); } +#define MINCHECK(param, min, pname) \ + if ( model->HSMHV_coerrrep && ((param) < (min)) ) { \ + printf("warning(HiSIM_HV(%s)): (%s = %g) range [%g , %g].\n",model->HSMHVmodName, \ + (pname), (param), (min*1.0), (min*1.0) ); \ } +#define MINRESET(param, min, pname) \ + if ( model->HSMHV_coerrrep && ((param) < (min)) ) { \ + printf("reset(HiSIM_HV(%s)): (%s = %g to %g) range [%g , %g].\n",model->HSMHVmodName, \ + (pname), (param), (min*1.0), (min*1.0), (min*1.0) ); \ + } \ + if ( (param) < (min) ) { param = (min); } int HSMHVsetup( - register SMPmatrix *matrix, - register GENmodel *inModel, - register CKTcircuit *ckt, + SMPmatrix *matrix, + GENmodel *inModel, + CKTcircuit *ckt, int *states) /* load the HSMHV device structure with those pointers needed later * for fast matrix loading */ { - register HSMHVmodel *model = (HSMHVmodel*)inModel; - register HSMHVinstance *here; + HSMHVmodel *model = (HSMHVmodel*)inModel; + HSMHVinstance *here; int error=0 ; CKTnode *tmp; double T2, Rd, Rs ; @@ -63,6 +122,7 @@ int HSMHVsetup( double LG=0.0, WG =0.0, Lgate =0.0, Wgate =0.0 ; double Lbin=0.0, Wbin=0.0, LWbin =0.0; /* binning */ + /* loop through all the HSMHV device models */ for ( ;model != NULL ;model = model->HSMHVnextModel ) { /* Default value Processing for HVMOS Models */ @@ -74,17 +134,23 @@ int HSMHVsetup( model->HSMHV_noise = 1; if ( !model->HSMHV_version_Given) { - model->HSMHV_version = "1.24" ; - printf(" 1.24 is selected for VERSION. (default) \n"); + model->HSMHV_version = "2.20" ; + printf("HiSIM_HV(%s): 2.20 is selected for VERSION. (default) \n",model->HSMHVmodName); + model->HSMHV_subversion = 2 ; } else { - if (strcmp(model->HSMHV_version,"1.24") != 0 ) { - model->HSMHV_version = "1.24" ; - printf(" 1.24 is only available for VERSION. \n"); - printf(" 1.24 is selected for VERSION. (default) \n"); + if (strcmp(model->HSMHV_version,"2.20") == 0 ) { + printf("HiSIM_HV(%s): 2.20 is selected for VERSION. (default) \n",model->HSMHVmodName); + model->HSMHV_subversion = 2 ; + } else if (strcmp(model->HSMHV_version,"2.2") == 0 ) { + printf("HiSIM_HV(%s): 2.20 is selected for VERSION. (default) \n",model->HSMHVmodName); + model->HSMHV_subversion = 2 ; } else { - printf(" %s is selected for VERSION \n", model->HSMHV_version); + printf("warning(HiSIM_HV(%s)): invalid version %s is specified, reseted 2.20 \n", + model->HSMHVmodName,model->HSMHV_version); + model->HSMHV_subversion = 2 ; } } + if ( !model->HSMHV_corsrd_Given ) model->HSMHV_corsrd = 3 ; if ( !model->HSMHV_corg_Given ) model->HSMHV_corg = 0 ; @@ -106,14 +172,34 @@ int HSMHVsetup( if ( !model->HSMHV_corbnet_Given ) model->HSMHV_corbnet = 0 ; else if ( model->HSMHV_corbnet != 0 && model->HSMHV_corbnet != 1 ) { model->HSMHV_corbnet = 0; - printf("warning(HiSIMHV): CORBNET has been set to its default value: %d.\n", model->HSMHV_corbnet); + printf("warning(HiSIM_HV(%s)): CORBNET has been set to its default value: %d.\n", + model->HSMHVmodName,model->HSMHV_corbnet); } if ( !model->HSMHV_coselfheat_Given ) model->HSMHV_coselfheat = 0 ; /* Self-heating model */ if ( !model->HSMHV_cosubnode_Given ) model->HSMHV_cosubnode = 0 ; if ( !model->HSMHV_cosym_Given ) model->HSMHV_cosym = 0 ; /* Symmetry model for HV */ if ( !model->HSMHV_cotemp_Given ) model->HSMHV_cotemp = 0 ; - if ( !model->HSMHV_coldrift_Given ) model->HSMHV_coldrift = 0 ; + if ( !model->HSMHV_cordrift_Given ) model->HSMHV_cordrift = 1 ; + model->HSMHV_coldrift = 1 ; + if ( model->HSMHV_coldrift_Given ) { + fprintf(stderr,"warning(HiSIM_HV(%s)): COLDRIFT has been inactivated ( Ldrift = LDRIFT1 + LDRIFT2 ).\n",model->HSMHVmodName); + } + if ( !model->HSMHV_coerrrep_Given ) model->HSMHV_coerrrep = 1 ; + if ( !model->HSMHV_codep_Given ) model->HSMHV_codep = 0 ; + if ( model->HSMHV_codep_Given ) { + if( model->HSMHV_codep != 0 && model->HSMHV_codep != 1 ) { + printf("warning(HiSIM_HV(%s)): Invalid model parameter CODEP (= %d) was specified, resetted to 0.\n",model->HSMHVmodName,model->HSMHV_codep); + model->HSMHV_codep = 0 ; + } + } + if ( !model->HSMHV_coddlt_Given ) model->HSMHV_coddlt = 1 ; + if ( model->HSMHV_coddlt_Given ) { + if( model->HSMHV_coddlt != 0 && model->HSMHV_coddlt != 1 ) { + printf("warning(HiSIM_HV(%s)): Invalid model parameter CODDLT (= %d) was specified, resetted to 1.\n",model->HSMHVmodName,model->HSMHV_coddlt); + model->HSMHV_coddlt = 1 ; + } + } if ( !model->HSMHV_vmax_Given ) model->HSMHV_vmax = 1.0e7 ; if ( !model->HSMHV_vmaxt1_Given ) model->HSMHV_vmaxt1 = 0.0 ; @@ -121,14 +207,15 @@ int HSMHVsetup( if ( !model->HSMHV_bgtmp1_Given ) model->HSMHV_bgtmp1 = 90.25e-6 ; if ( !model->HSMHV_bgtmp2_Given ) model->HSMHV_bgtmp2 = 1.0e-7 ; if ( !model->HSMHV_eg0_Given ) model->HSMHV_eg0 = 1.1785e0 ; - if ( !model->HSMHV_tox_Given ) model->HSMHV_tox = 30e-9 ; - if ( !model->HSMHV_xld_Given ) model->HSMHV_xld = 0.0 ; - if ( !model->HSMHV_lovers_Given ) model->HSMHV_lovers = 30e-9 ; - if ( model->HSMHV_lover_Given ) model->HSMHV_lovers = model->HSMHV_lover ; + if ( !model->HSMHV_tox_Given ) model->HSMHV_tox = 7e-9 ; + if ( !model->HSMHV_xld_Given ) model->HSMHV_xld = 0 ; + if ( !model->HSMHV_lover_Given ) model->HSMHV_lover = 30e-9 ; +// if ( !model->HSMHV_lovers_Given ) model->HSMHV_lovers = 30e-9 ; +// if ( model->HSMHV_lover_Given ) model->HSMHV_lovers = model->HSMHV_lover ; if ( !model->HSMHV_rdov11_Given ) model->HSMHV_rdov11 = 0.0 ; if ( !model->HSMHV_rdov12_Given ) model->HSMHV_rdov12 = 1.0 ; if ( !model->HSMHV_rdov13_Given ) model->HSMHV_rdov13 = 1.0 ; - if ( !model->HSMHV_rdslp1_Given ) model->HSMHV_rdslp1 = 1.0 ; + if ( !model->HSMHV_rdslp1_Given ) model->HSMHV_rdslp1 = 0.0 ; if ( !model->HSMHV_rdict1_Given ) model->HSMHV_rdict1 = 1.0 ; if ( !model->HSMHV_rdslp2_Given ) model->HSMHV_rdslp2 = 1.0 ; if ( !model->HSMHV_rdict2_Given ) model->HSMHV_rdict2 = 0.0 ; @@ -138,13 +225,18 @@ int HSMHVsetup( if ( !model->HSMHV_ldrift1s_Given ) model->HSMHV_ldrift1s = 0.0 ; if ( !model->HSMHV_ldrift2s_Given ) model->HSMHV_ldrift2s = 1.0e-6 ; if ( !model->HSMHV_subld1_Given ) model->HSMHV_subld1 = 0.0 ; + if ( !model->HSMHV_subld1l_Given ) model->HSMHV_subld1l = 0.0 ; + if ( !model->HSMHV_subld1lp_Given ) model->HSMHV_subld1lp = 1.0 ; if ( !model->HSMHV_subld2_Given ) model->HSMHV_subld2 = 0.0 ; - if ( !model->HSMHV_ddltmax_Given ) model->HSMHV_ddltmax = 10.0 ; /* Vdseff */ + if ( !model->HSMHV_xpdv_Given ) model->HSMHV_xpdv = 0.0 ; + if ( !model->HSMHV_xpvdth_Given ) model->HSMHV_xpvdth = 0.0 ; + if ( !model->HSMHV_xpvdthg_Given ) model->HSMHV_xpvdthg = 0.0 ; + if ( !model->HSMHV_ddltmax_Given ) model->HSMHV_ddltmax = 10 ; /* Vdseff */ if ( !model->HSMHV_ddltslp_Given ) model->HSMHV_ddltslp = 0.0 ; /* Vdseff */ if ( !model->HSMHV_ddltict_Given ) model->HSMHV_ddltict = 10.0 ; /* Vdseff */ if ( !model->HSMHV_vfbover_Given ) model->HSMHV_vfbover = -0.5 ; - if ( !model->HSMHV_nover_Given ) model->HSMHV_nover = 3.0e16 ; - if ( !model->HSMHV_novers_Given ) model->HSMHV_novers = 0.0 ; + if ( !model->HSMHV_nover_Given ) model->HSMHV_nover = 3e16 ; + if ( !model->HSMHV_novers_Given ) model->HSMHV_novers = 1e17 ; if ( !model->HSMHV_xwd_Given ) model->HSMHV_xwd = 0.0 ; if ( !model->HSMHV_xwdc_Given ) model->HSMHV_xwdc = model->HSMHV_xwd ; @@ -168,29 +260,28 @@ int HSMHVsetup( if ( !model->HSMHV_xqy_Given ) model->HSMHV_xqy = 0.0 ; if ( !model->HSMHV_xqy1_Given ) model->HSMHV_xqy1 = 0.0 ; - if ( !model->HSMHV_xqy2_Given ) model->HSMHV_xqy2 = 0.0 ; + if ( !model->HSMHV_xqy2_Given ) model->HSMHV_xqy2 = 2.0 ; if ( !model->HSMHV_rs_Given ) model->HSMHV_rs = 0.0 ; - if ( !model->HSMHV_rd_Given ) model->HSMHV_rd = 5.0e-3 ; + if ( !model->HSMHV_rd_Given ) model->HSMHV_rd = 0.0 ; if ( !model->HSMHV_vfbc_Given ) model->HSMHV_vfbc = -1.0 ; if ( !model->HSMHV_vbi_Given ) model->HSMHV_vbi = 1.1 ; - if ( !model->HSMHV_nsubc_Given ) model->HSMHV_nsubc = 5.0e17 ; + if ( !model->HSMHV_nsubc_Given ) model->HSMHV_nsubc = 3.0e17 ; if ( !model->HSMHV_parl2_Given ) model->HSMHV_parl2 = 10.0e-9 ; - if ( !model->HSMHV_lp_Given ) model->HSMHV_lp = 0.0 ; + if ( !model->HSMHV_lp_Given ) model->HSMHV_lp = 15e-9 ; if ( !model->HSMHV_nsubp_Given ) model->HSMHV_nsubp = 1.0e18 ; - + if ( !model->HSMHV_nsubp0_Given ) model->HSMHV_nsubp0 = 0.0 ; if ( !model->HSMHV_nsubwp_Given ) model->HSMHV_nsubwp = 1.0 ; - if ( !model->HSMHV_scp1_Given ) model->HSMHV_scp1 = 1.0 ; + if ( !model->HSMHV_scp1_Given ) model->HSMHV_scp1 = 0.0 ; if ( !model->HSMHV_scp2_Given ) model->HSMHV_scp2 = 0.0 ; if ( !model->HSMHV_scp3_Given ) model->HSMHV_scp3 = 0.0 ; - if ( !model->HSMHV_sc1_Given ) model->HSMHV_sc1 = 1.0 ; + if ( !model->HSMHV_sc1_Given ) model->HSMHV_sc1 = 0.0 ; if ( !model->HSMHV_sc2_Given ) model->HSMHV_sc2 = 0.0 ; if ( !model->HSMHV_sc3_Given ) model->HSMHV_sc3 = 0.0 ; if ( !model->HSMHV_sc4_Given ) model->HSMHV_sc4 = 0.0 ; if ( !model->HSMHV_pgd1_Given ) model->HSMHV_pgd1 = 0.0 ; if ( !model->HSMHV_pgd2_Given ) model->HSMHV_pgd2 = 1.0 ; - if ( !model->HSMHV_pgd3_Given ) model->HSMHV_pgd3 = 0.8 ; if ( !model->HSMHV_pgd4_Given ) model->HSMHV_pgd4 = 0.0 ; if ( !model->HSMHV_ndep_Given ) model->HSMHV_ndep = 1.0 ; @@ -201,7 +292,7 @@ int HSMHVsetup( if ( !model->HSMHV_muecb1_Given ) model->HSMHV_muecb1 = 100.0 ; if ( !model->HSMHV_mueph0_Given ) model->HSMHV_mueph0 = 300.0e-3 ; if ( !model->HSMHV_mueph1_Given ) { - if (model->HSMHV_type == NMOS) model->HSMHV_mueph1 = 25.0e3 ; + if (model->HSMHV_type == NMOS) model->HSMHV_mueph1 = 20.0e3 ; else model->HSMHV_mueph1 = 9.0e3 ; } if ( !model->HSMHV_muephw_Given ) model->HSMHV_muephw = 0.0 ; @@ -216,7 +307,7 @@ int HSMHVsetup( if ( !model->HSMHV_wvth0_Given ) model->HSMHV_wvth0 = 0.0 ; if ( !model->HSMHV_muesr0_Given ) model->HSMHV_muesr0 = 2.0 ; - if ( !model->HSMHV_muesr1_Given ) model->HSMHV_muesr1 = 1.0e16 ; + if ( !model->HSMHV_muesr1_Given ) model->HSMHV_muesr1 = 6.0e14 ; if ( !model->HSMHV_muesrl_Given ) model->HSMHV_muesrl = 0.0 ; if ( !model->HSMHV_muesrw_Given ) model->HSMHV_muesrw = 0.0 ; if ( !model->HSMHV_mueswp_Given ) model->HSMHV_mueswp = 1.0 ; @@ -229,8 +320,8 @@ int HSMHVsetup( else model->HSMHV_bb = 1.0 ; } - if ( !model->HSMHV_sub1_Given ) model->HSMHV_sub1 = 10.0 ; - if ( !model->HSMHV_sub2_Given ) model->HSMHV_sub2 = 25.0 ; + if ( !model->HSMHV_sub1_Given ) model->HSMHV_sub1 = 10 ; + if ( !model->HSMHV_sub2_Given ) model->HSMHV_sub2 = 25 ; if ( !model->HSMHV_svgs_Given ) model->HSMHV_svgs = 0.8e0 ; if ( !model->HSMHV_svbs_Given ) model->HSMHV_svbs = 0.5e0 ; if ( !model->HSMHV_svbsl_Given ) model->HSMHV_svbsl = 0e0 ; @@ -252,7 +343,7 @@ int HSMHVsetup( if ( !model->HSMHV_slglp_Given ) model->HSMHV_slglp = 1.0 ; if ( !model->HSMHV_sub1lp_Given ) model->HSMHV_sub1lp = 1.0 ; - if ( !model->HSMHV_nsti_Given ) model->HSMHV_nsti = 1.0e17 ; + if ( !model->HSMHV_nsti_Given ) model->HSMHV_nsti = 5.0e17 ; if ( !model->HSMHV_wsti_Given ) model->HSMHV_wsti = 0.0 ; if ( !model->HSMHV_wstil_Given ) model->HSMHV_wstil = 0.0 ; if ( !model->HSMHV_wstilp_Given ) model->HSMHV_wstilp = 1.0 ; @@ -270,7 +361,7 @@ int HSMHVsetup( if ( !model->HSMHV_nsubpsti3_Given ) model->HSMHV_nsubpsti3 = 1.0 ; if ( !model->HSMHV_lpext_Given ) model->HSMHV_lpext = 1.0e-50 ; - if ( !model->HSMHV_npext_Given ) model->HSMHV_npext = 1.0e17 ; + if ( !model->HSMHV_npext_Given ) model->HSMHV_npext = 5.0e17 ; if ( !model->HSMHV_scp21_Given ) model->HSMHV_scp21 = 0.0 ; if ( !model->HSMHV_scp22_Given ) model->HSMHV_scp22 = 0.0 ; if ( !model->HSMHV_bs1_Given ) model->HSMHV_bs1 = 0.0 ; @@ -297,10 +388,9 @@ int HSMHVsetup( if ( !model->HSMHV_cvb_Given ) model->HSMHV_cvb = 0.0e0 ; if ( !model->HSMHV_ctemp_Given ) model->HSMHV_ctemp = 0.0e0 ; if ( !model->HSMHV_cisbk_Given ) model->HSMHV_cisbk = 0.0e0 ; - if ( !model->HSMHV_cvbk_Given ) model->HSMHV_cvbk = 0.0e0 ; if ( !model->HSMHV_divx_Given ) model->HSMHV_divx = 0.0e0 ; - if ( !model->HSMHV_clm1_Given ) model->HSMHV_clm1 = 0.7 ; + if ( !model->HSMHV_clm1_Given ) model->HSMHV_clm1 = 50e-3 ; if ( !model->HSMHV_clm2_Given ) model->HSMHV_clm2 = 2.0 ; if ( !model->HSMHV_clm3_Given ) model->HSMHV_clm3 = 1.0 ; if ( !model->HSMHV_clm5_Given ) model->HSMHV_clm5 = 1.0 ; @@ -311,7 +401,7 @@ int HSMHVsetup( if ( !model->HSMHV_nsubcw_Given ) model->HSMHV_nsubcw = 0.0 ; if ( !model->HSMHV_nsubcwp_Given ) model->HSMHV_nsubcwp = 1.0 ; if ( !model->HSMHV_qme1_Given ) model->HSMHV_qme1 = 0.0 ; - if ( !model->HSMHV_qme2_Given ) model->HSMHV_qme2 = 0.0 ; + if ( !model->HSMHV_qme2_Given ) model->HSMHV_qme2 = 2.0 ; if ( !model->HSMHV_qme3_Given ) model->HSMHV_qme3 = 0.0 ; if ( !model->HSMHV_vovers_Given ) model->HSMHV_vovers = 0.0 ; @@ -333,8 +423,8 @@ int HSMHVsetup( if ( !model->HSMHV_glpart1_Given ) model->HSMHV_glpart1 = 0.5 ; if ( !model->HSMHV_glksd1_Given ) model->HSMHV_glksd1 = 1.0e-15 ; - if ( !model->HSMHV_glksd2_Given ) model->HSMHV_glksd2 = 5e6 ; - if ( !model->HSMHV_glksd3_Given ) model->HSMHV_glksd3 = -5e6 ; + if ( !model->HSMHV_glksd2_Given ) model->HSMHV_glksd2 = 1e3 ; + if ( !model->HSMHV_glksd3_Given ) model->HSMHV_glksd3 = -1e3 ; if ( !model->HSMHV_glkb1_Given ) model->HSMHV_glkb1 = 5e-16 ; if ( !model->HSMHV_glkb2_Given ) model->HSMHV_glkb2 = 1e0 ; if ( !model->HSMHV_glkb3_Given ) model->HSMHV_glkb3 = 0e0 ; @@ -352,7 +442,6 @@ int HSMHVsetup( if ( !model->HSMHV_cgso_Given ) model->HSMHV_cgso = 0.0 ; if ( !model->HSMHV_cgdo_Given ) model->HSMHV_cgdo = 0.0 ; - if ( !model->HSMHV_pthrou_Given ) model->HSMHV_pthrou = 0.0 ; if ( !model->HSMHV_vdiffj_Given ) model->HSMHV_vdiffj = 0.6e-3 ; if ( !model->HSMHV_dly1_Given ) model->HSMHV_dly1 = 100.0e-12 ; @@ -367,14 +456,26 @@ int HSMHVsetup( if ( !model->HSMHV_rbpb_Given ) model->HSMHV_rbpb = 50.0e0 ; if ( !model->HSMHV_rbpd_Given ) model->HSMHV_rbpd = 50.0e0 ; if ( !model->HSMHV_rbps_Given ) model->HSMHV_rbps = 50.0e0 ; - if ( !model->HSMHV_rbdb_Given ) model->HSMHV_rbdb = 50.0e0 ; - if ( !model->HSMHV_rbsb_Given ) model->HSMHV_rbsb = 50.0e0 ; + if ( !model->HSMHV_rbdb_Given ) model->HSMHV_rbdb = 50.0e0 ; /* not used in this version */ + if ( !model->HSMHV_rbsb_Given ) model->HSMHV_rbsb = 50.0e0 ; /* not used in this version */ if ( !model->HSMHV_ibpc1_Given ) model->HSMHV_ibpc1 = 0.0 ; + if ( !model->HSMHV_ibpc1l_Given ) model->HSMHV_ibpc1l = 0.0 ; + if ( !model->HSMHV_ibpc1lp_Given ) model->HSMHV_ibpc1lp = -1.0 ; if ( !model->HSMHV_ibpc2_Given ) model->HSMHV_ibpc2 = 0.0 ; if ( !model->HSMHV_mphdfm_Given ) model->HSMHV_mphdfm = -0.3 ; + if ( !model->HSMHV_ptl_Given ) model->HSMHV_ptl = 0.0 ; + if ( !model->HSMHV_ptp_Given ) model->HSMHV_ptp = 3.5 ; + if ( !model->HSMHV_pt2_Given ) model->HSMHV_pt2 = 0.0 ; + if ( !model->HSMHV_ptlp_Given ) model->HSMHV_ptlp = 1.0 ; + if ( !model->HSMHV_gdl_Given ) model->HSMHV_gdl = 0.0 ; + if ( !model->HSMHV_gdlp_Given ) model->HSMHV_gdlp = 0.0 ; + + if ( !model->HSMHV_gdld_Given ) model->HSMHV_gdld = 0.0 ; + if ( !model->HSMHV_pt4_Given ) model->HSMHV_pt4 = 0.0 ; + if ( !model->HSMHV_pt4p_Given ) model->HSMHV_pt4p = 1.0 ; if ( !model->HSMHV_rdvg11_Given ) model->HSMHV_rdvg11 = 0.0 ; if ( !model->HSMHV_rdvg12_Given ) model->HSMHV_rdvg12 = 100.0 ; if ( !model->HSMHV_rth0_Given ) model->HSMHV_rth0 = 0.1 ; /* Self-heating model */ @@ -394,7 +495,6 @@ int HSMHVsetup( if ( !model->HSMHV_xldld_Given ) model->HSMHV_xldld = 1.0e-6 ; if ( !model->HSMHV_xwdld_Given ) model->HSMHV_xwdld = model->HSMHV_xwd ; if ( !model->HSMHV_rdvd_Given ) model->HSMHV_rdvd = 7.0e-2 ; - if ( !model->HSMHV_qovsm_Given ) model->HSMHV_qovsm = 0.2 ; if ( !model->HSMHV_rd20_Given ) model->HSMHV_rd20 = 0.0 ; if ( !model->HSMHV_rd21_Given ) model->HSMHV_rd21 = 1.0 ; @@ -438,12 +538,106 @@ int HSMHVsetup( if ( !model->HSMHV_prattemp1_Given ) model->HSMHV_prattemp1 = 0.0 ; if ( !model->HSMHV_prattemp2_Given ) model->HSMHV_prattemp2 = 0.0 ; - if ( !model->HSMHV_rdvsub_Given ) model->HSMHV_rdvsub = 1.0 ; /* [-] substrate effect */ - if ( !model->HSMHV_rdvdsub_Given ) model->HSMHV_rdvdsub = 0.3 ; /* [-] substrate effect */ - if ( !model->HSMHV_ddrift_Given ) model->HSMHV_ddrift = 1.0e-6 ; /* [m] substrate effect */ - if ( !model->HSMHV_vbisub_Given ) model->HSMHV_vbisub = 0.7 ; /* [V] substrate effect */ - if ( !model->HSMHV_nsubsub_Given ) model->HSMHV_nsubsub = 1.0e15 ; /* [cm^-3] substrate effect */ + if ( !model->HSMHV_rdvsub_Given ) model->HSMHV_rdvsub = 1.0 ; /* [-] substrate effect */ + if ( !model->HSMHV_rdvdsub_Given ) model->HSMHV_rdvdsub = 0.3 ; /* [-] substrate effect */ + if ( !model->HSMHV_ddrift_Given ) model->HSMHV_ddrift = 1.0e-6 ; /* [m] substrate effect */ + if ( !model->HSMHV_vbisub_Given ) model->HSMHV_vbisub = 0.7 ; /* [V] substrate effect */ + if ( !model->HSMHV_nsubsub_Given ) model->HSMHV_nsubsub = 1.0e15 ; /* [cm^-3] substrate effect */ + + if ( !model->HSMHV_rdrmue_Given ) model->HSMHV_rdrmue = 1.0e3 ; + if ( !model->HSMHV_rdrvmax_Given ) model->HSMHV_rdrvmax = 3.0e7 ; + if ( !model->HSMHV_rdrmuetmp_Given ) model->HSMHV_rdrmuetmp = 0.0 ; + + if ( !model->HSMHV_ndepm_Given ) model->HSMHV_ndepm = 1e17 ; + if ( !model->HSMHV_tndep_Given ) model->HSMHV_tndep = 0.2e-6 ; + if ( !model->HSMHV_depmue0_Given ) model->HSMHV_depmue0 = 1.0e3 ; + if ( !model->HSMHV_depmue1_Given ) model->HSMHV_depmue1 = 0.0 ; + if ( !model->HSMHV_depmueback0_Given ) model->HSMHV_depmueback0 = 1.0e2 ; + if ( !model->HSMHV_depmueback1_Given ) model->HSMHV_depmueback1 = 0.0 ; + if ( !model->HSMHV_depleak_Given ) model->HSMHV_depleak = 0.5 ; + if ( !model->HSMHV_depeta_Given ) model->HSMHV_depeta = 0.0 ; + if ( !model->HSMHV_depvmax_Given ) model->HSMHV_depvmax = 3.0e7 ; + if ( !model->HSMHV_depvdsef1_Given ) model->HSMHV_depvdsef1 = 2.0 ; + if ( !model->HSMHV_depvdsef2_Given ) model->HSMHV_depvdsef2 = 0.5 ; + if ( !model->HSMHV_depmueph0_Given ) model->HSMHV_depmueph0 = 0.3 ; + if ( !model->HSMHV_depmueph1_Given ) model->HSMHV_depmueph1 = 5.0e3 ; + if ( !model->HSMHV_depbb_Given ) model->HSMHV_depbb = 1.0 ; + if ( !model->HSMHV_depvtmp_Given ) model->HSMHV_depvtmp = 0.0 ; + if ( !model->HSMHV_depmuetmp_Given ) model->HSMHV_depmuetmp = 1.5 ; + + if ( model->HSMHV_codep ) { + if ( !model->HSMHV_copprv_Given ) model->HSMHV_copprv = 0 ; + if ( !model->HSMHV_vfbc_Given ) model->HSMHV_vfbc = -0.2 ; + if ( !model->HSMHV_nsubc_Given ) model->HSMHV_nsubc = 5.0e16 ; + if ( !model->HSMHV_lp_Given ) model->HSMHV_lp = 0.0 ; + if ( !model->HSMHV_nsubp_Given ) model->HSMHV_nsubp = 1.0e17 ; + if ( !model->HSMHV_muesr1_Given ) model->HSMHV_muesr1 = 5.0e15 ; + } + + if ( !model->HSMHV_isbreak_Given ) model->HSMHV_isbreak = 1.0e-12 ; + if ( !model->HSMHV_rwell_Given ) model->HSMHV_rwell = 1.0e3 ; + + if ( !model->HSMHV_rdrvtmp_Given ) model->HSMHV_rdrvtmp = 0.0 ; + if ( !model->HSMHV_rdrdjunc_Given ) model->HSMHV_rdrdjunc = 1.0e-6 ; + if ( !model->HSMHV_rdrcx_Given ) model->HSMHV_rdrcx = 0.0 ; + if ( !model->HSMHV_rdrcar_Given ) model->HSMHV_rdrcar = 1.0e-8 ; + if ( !model->HSMHV_rdrdl1_Given ) model->HSMHV_rdrdl1 = 0.0 ; + if ( !model->HSMHV_rdrdl2_Given ) model->HSMHV_rdrdl2 = 0.0 ; + if ( !model->HSMHV_rdrvmaxw_Given ) model->HSMHV_rdrvmaxw = 0.0 ; + if ( !model->HSMHV_rdrvmaxwp_Given ) model->HSMHV_rdrvmaxwp = 1.0 ; + if ( !model->HSMHV_rdrvmaxl_Given ) model->HSMHV_rdrvmaxl = 0.0 ; + if ( !model->HSMHV_rdrvmaxlp_Given ) model->HSMHV_rdrvmaxlp = 1.0 ; + if ( !model->HSMHV_rdrmuel_Given ) model->HSMHV_rdrmuel = 0.0 ; + if ( !model->HSMHV_rdrmuelp_Given ) model->HSMHV_rdrmuelp = 1.0 ; + if ( !model->HSMHV_rdrqover_Given ) model->HSMHV_rdrqover = 1E5 ; + if ( !model->HSMHV_qovadd_Given ) model->HSMHV_qovadd = 0.0 ; + if ( !model->HSMHV_js0d_Given ) model->HSMHV_js0d = model->HSMHV_js0 ; + if ( !model->HSMHV_js0swd_Given ) model->HSMHV_js0swd = model->HSMHV_js0sw ; + if ( !model->HSMHV_njd_Given ) model->HSMHV_njd = model->HSMHV_nj ; + if ( !model->HSMHV_njswd_Given ) model->HSMHV_njswd = model->HSMHV_njsw ; + if ( !model->HSMHV_xtid_Given ) model->HSMHV_xtid = model->HSMHV_xti ; + if ( !model->HSMHV_cjd_Given ) model->HSMHV_cjd = model->HSMHV_cj ; + if ( !model->HSMHV_cjswd_Given ) model->HSMHV_cjswd = model->HSMHV_cjsw ; + if ( !model->HSMHV_cjswgd_Given ) model->HSMHV_cjswgd = model->HSMHV_cjswg ; + if ( !model->HSMHV_mjd_Given ) model->HSMHV_mjd = model->HSMHV_mj ; + if ( !model->HSMHV_mjswd_Given ) model->HSMHV_mjswd = model->HSMHV_mjsw ; + if ( !model->HSMHV_mjswgd_Given ) model->HSMHV_mjswgd = model->HSMHV_mjswg ; + if ( !model->HSMHV_pbd_Given ) model->HSMHV_pbd = model->HSMHV_pb ; + if ( !model->HSMHV_pbswd_Given ) model->HSMHV_pbswd = model->HSMHV_pbsw ; + if ( !model->HSMHV_pbswgd_Given ) model->HSMHV_pbswgd = model->HSMHV_pbswg ; + if ( !model->HSMHV_xti2d_Given ) model->HSMHV_xti2d = model->HSMHV_xti2 ; + if ( !model->HSMHV_cisbd_Given ) model->HSMHV_cisbd = model->HSMHV_cisb ; + if ( !model->HSMHV_cvbd_Given ) model->HSMHV_cvbd = model->HSMHV_cvb ; + if ( !model->HSMHV_ctempd_Given ) model->HSMHV_ctempd = model->HSMHV_ctemp ; + if ( !model->HSMHV_cisbkd_Given ) model->HSMHV_cisbkd = model->HSMHV_cisbk ; + if ( !model->HSMHV_divxd_Given ) model->HSMHV_divxd = model->HSMHV_divx ; + if ( !model->HSMHV_vdiffjd_Given ) model->HSMHV_vdiffjd = model->HSMHV_vdiffj ; + if ( !model->HSMHV_js0s_Given ) model->HSMHV_js0s = model->HSMHV_js0d ; + if ( !model->HSMHV_js0sws_Given ) model->HSMHV_js0sws = model->HSMHV_js0swd ; + if ( !model->HSMHV_njs_Given ) model->HSMHV_njs = model->HSMHV_njd ; + if ( !model->HSMHV_njsws_Given ) model->HSMHV_njsws = model->HSMHV_njswd ; + if ( !model->HSMHV_xtis_Given ) model->HSMHV_xtis = model->HSMHV_xtid ; + if ( !model->HSMHV_cjs_Given ) model->HSMHV_cjs = model->HSMHV_cjd ; + if ( !model->HSMHV_cjsws_Given ) model->HSMHV_cjsws = model->HSMHV_cjswd ; + if ( !model->HSMHV_cjswgs_Given ) model->HSMHV_cjswgs = model->HSMHV_cjswgd ; + if ( !model->HSMHV_mjs_Given ) model->HSMHV_mjs = model->HSMHV_mjd ; + if ( !model->HSMHV_mjsws_Given ) model->HSMHV_mjsws = model->HSMHV_mjswd ; + if ( !model->HSMHV_mjswgs_Given ) model->HSMHV_mjswgs = model->HSMHV_mjswgd ; + if ( !model->HSMHV_pbs_Given ) model->HSMHV_pbs = model->HSMHV_pbd ; + if ( !model->HSMHV_pbsws_Given ) model->HSMHV_pbsws = model->HSMHV_pbswd ; + if ( !model->HSMHV_pbswgs_Given ) model->HSMHV_pbswgs = model->HSMHV_pbswgd ; + if ( !model->HSMHV_xti2s_Given ) model->HSMHV_xti2s = model->HSMHV_xti2d ; + if ( !model->HSMHV_cisbs_Given ) model->HSMHV_cisbs = model->HSMHV_cisbd ; + if ( !model->HSMHV_cvbs_Given ) model->HSMHV_cvbs = model->HSMHV_cvbd ; + if ( !model->HSMHV_ctemps_Given ) model->HSMHV_ctemps = model->HSMHV_ctempd ; + if ( !model->HSMHV_cisbks_Given ) model->HSMHV_cisbks = model->HSMHV_cisbkd ; + if ( !model->HSMHV_divxs_Given ) model->HSMHV_divxs = model->HSMHV_divxd ; + if ( !model->HSMHV_vdiffjs_Given ) model->HSMHV_vdiffjs = model->HSMHV_vdiffjd ; if ( !model->HSMHV_shemax_Given ) model->HSMHV_shemax = 500 ; + if ( !model->HSMHV_vgsmin_Given ) model->HSMHV_vgsmin = -100 * model->HSMHV_type ; + if ( !model->HSMHV_gdsleak_Given ) model->HSMHV_gdsleak = 0.0 ; + if ( !model->HSMHV_rdrbb_Given ) model->HSMHV_rdrbb = 1 ; + if ( !model->HSMHV_rdrbbtmp_Given ) model->HSMHV_rdrbbtmp = 0 ; /* binning parameters */ if ( !model->HSMHV_lmin_Given ) model->HSMHV_lmin = 0.0 ; @@ -472,7 +666,6 @@ int HSMHVsetup( if ( !model->HSMHV_lsc2_Given ) model->HSMHV_lsc2 = 0.0 ; if ( !model->HSMHV_lsc3_Given ) model->HSMHV_lsc3 = 0.0 ; if ( !model->HSMHV_lpgd1_Given ) model->HSMHV_lpgd1 = 0.0 ; - if ( !model->HSMHV_lpgd3_Given ) model->HSMHV_lpgd3 = 0.0 ; if ( !model->HSMHV_lndep_Given ) model->HSMHV_lndep = 0.0 ; if ( !model->HSMHV_lninv_Given ) model->HSMHV_lninv = 0.0 ; if ( !model->HSMHV_lmuecb0_Given ) model->HSMHV_lmuecb0 = 0.0 ; @@ -524,7 +717,6 @@ int HSMHVsetup( if ( !model->HSMHV_lglkb2_Given ) model->HSMHV_lglkb2 = 0.0 ; if ( !model->HSMHV_lnftrp_Given ) model->HSMHV_lnftrp = 0.0 ; if ( !model->HSMHV_lnfalp_Given ) model->HSMHV_lnfalp = 0.0 ; - if ( !model->HSMHV_lpthrou_Given ) model->HSMHV_lpthrou = 0.0 ; if ( !model->HSMHV_lvdiffj_Given ) model->HSMHV_lvdiffj = 0.0 ; if ( !model->HSMHV_libpc1_Given ) model->HSMHV_libpc1 = 0.0 ; if ( !model->HSMHV_libpc2_Given ) model->HSMHV_libpc2 = 0.0 ; @@ -546,6 +738,16 @@ int HSMHVsetup( if ( !model->HSMHV_lrs_Given ) model->HSMHV_lrs = 0.0 ; if ( !model->HSMHV_lrth0_Given ) model->HSMHV_lrth0 = 0.0 ; if ( !model->HSMHV_lvover_Given ) model->HSMHV_lvover = 0.0 ; + if ( !model->HSMHV_ljs0d_Given ) model->HSMHV_ljs0d = model->HSMHV_ljs0 ; + if ( !model->HSMHV_ljs0swd_Given ) model->HSMHV_ljs0swd = model->HSMHV_ljs0sw ; + if ( !model->HSMHV_lnjd_Given ) model->HSMHV_lnjd = model->HSMHV_lnj ; + if ( !model->HSMHV_lcisbkd_Given ) model->HSMHV_lcisbkd = model->HSMHV_lcisbk ; + if ( !model->HSMHV_lvdiffjd_Given ) model->HSMHV_lvdiffjd = model->HSMHV_lvdiffj ; + if ( !model->HSMHV_ljs0s_Given ) model->HSMHV_ljs0s = model->HSMHV_ljs0d ; + if ( !model->HSMHV_ljs0sws_Given ) model->HSMHV_ljs0sws = model->HSMHV_ljs0swd ; + if ( !model->HSMHV_lnjs_Given ) model->HSMHV_lnjs = model->HSMHV_lnjd ; + if ( !model->HSMHV_lcisbks_Given ) model->HSMHV_lcisbks = model->HSMHV_lcisbkd ; + if ( !model->HSMHV_lvdiffjs_Given ) model->HSMHV_lvdiffjs = model->HSMHV_lvdiffjd ; /* Width dependence */ if ( !model->HSMHV_wvmax_Given ) model->HSMHV_wvmax = 0.0 ; @@ -566,7 +768,6 @@ int HSMHVsetup( if ( !model->HSMHV_wsc2_Given ) model->HSMHV_wsc2 = 0.0 ; if ( !model->HSMHV_wsc3_Given ) model->HSMHV_wsc3 = 0.0 ; if ( !model->HSMHV_wpgd1_Given ) model->HSMHV_wpgd1 = 0.0 ; - if ( !model->HSMHV_wpgd3_Given ) model->HSMHV_wpgd3 = 0.0 ; if ( !model->HSMHV_wndep_Given ) model->HSMHV_wndep = 0.0 ; if ( !model->HSMHV_wninv_Given ) model->HSMHV_wninv = 0.0 ; if ( !model->HSMHV_wmuecb0_Given ) model->HSMHV_wmuecb0 = 0.0 ; @@ -618,7 +819,6 @@ int HSMHVsetup( if ( !model->HSMHV_wglkb2_Given ) model->HSMHV_wglkb2 = 0.0 ; if ( !model->HSMHV_wnftrp_Given ) model->HSMHV_wnftrp = 0.0 ; if ( !model->HSMHV_wnfalp_Given ) model->HSMHV_wnfalp = 0.0 ; - if ( !model->HSMHV_wpthrou_Given ) model->HSMHV_wpthrou = 0.0 ; if ( !model->HSMHV_wvdiffj_Given ) model->HSMHV_wvdiffj = 0.0 ; if ( !model->HSMHV_wibpc1_Given ) model->HSMHV_wibpc1 = 0.0 ; if ( !model->HSMHV_wibpc2_Given ) model->HSMHV_wibpc2 = 0.0 ; @@ -640,6 +840,16 @@ int HSMHVsetup( if ( !model->HSMHV_wrs_Given ) model->HSMHV_wrs = 0.0 ; if ( !model->HSMHV_wrth0_Given ) model->HSMHV_wrth0 = 0.0 ; if ( !model->HSMHV_wvover_Given ) model->HSMHV_wvover = 0.0 ; + if ( !model->HSMHV_wjs0d_Given ) model->HSMHV_wjs0d = model->HSMHV_wjs0 ; + if ( !model->HSMHV_wjs0swd_Given ) model->HSMHV_wjs0swd = model->HSMHV_wjs0sw ; + if ( !model->HSMHV_wnjd_Given ) model->HSMHV_wnjd = model->HSMHV_wnj ; + if ( !model->HSMHV_wcisbkd_Given ) model->HSMHV_wcisbkd = model->HSMHV_wcisbk ; + if ( !model->HSMHV_wvdiffjd_Given ) model->HSMHV_wvdiffjd = model->HSMHV_wvdiffj ; + if ( !model->HSMHV_wjs0s_Given ) model->HSMHV_wjs0s = model->HSMHV_wjs0d ; + if ( !model->HSMHV_wjs0sws_Given ) model->HSMHV_wjs0sws = model->HSMHV_wjs0swd ; + if ( !model->HSMHV_wnjs_Given ) model->HSMHV_wnjs = model->HSMHV_wnjd ; + if ( !model->HSMHV_wcisbks_Given ) model->HSMHV_wcisbks = model->HSMHV_wcisbkd ; + if ( !model->HSMHV_wvdiffjs_Given ) model->HSMHV_wvdiffjs = model->HSMHV_wvdiffjd ; /* Cross-term dependence */ if ( !model->HSMHV_pvmax_Given ) model->HSMHV_pvmax = 0.0 ; @@ -660,7 +870,6 @@ int HSMHVsetup( if ( !model->HSMHV_psc2_Given ) model->HSMHV_psc2 = 0.0 ; if ( !model->HSMHV_psc3_Given ) model->HSMHV_psc3 = 0.0 ; if ( !model->HSMHV_ppgd1_Given ) model->HSMHV_ppgd1 = 0.0 ; - if ( !model->HSMHV_ppgd3_Given ) model->HSMHV_ppgd3 = 0.0 ; if ( !model->HSMHV_pndep_Given ) model->HSMHV_pndep = 0.0 ; if ( !model->HSMHV_pninv_Given ) model->HSMHV_pninv = 0.0 ; if ( !model->HSMHV_pmuecb0_Given ) model->HSMHV_pmuecb0 = 0.0 ; @@ -712,7 +921,6 @@ int HSMHVsetup( if ( !model->HSMHV_pglkb2_Given ) model->HSMHV_pglkb2 = 0.0 ; if ( !model->HSMHV_pnftrp_Given ) model->HSMHV_pnftrp = 0.0 ; if ( !model->HSMHV_pnfalp_Given ) model->HSMHV_pnfalp = 0.0 ; - if ( !model->HSMHV_ppthrou_Given ) model->HSMHV_ppthrou = 0.0 ; if ( !model->HSMHV_pvdiffj_Given ) model->HSMHV_pvdiffj = 0.0 ; if ( !model->HSMHV_pibpc1_Given ) model->HSMHV_pibpc1 = 0.0 ; if ( !model->HSMHV_pibpc2_Given ) model->HSMHV_pibpc2 = 0.0 ; @@ -734,8 +942,17 @@ int HSMHVsetup( if ( !model->HSMHV_prs_Given ) model->HSMHV_prs = 0.0 ; if ( !model->HSMHV_prth0_Given ) model->HSMHV_prth0 = 0.0 ; if ( !model->HSMHV_pvover_Given ) model->HSMHV_pvover = 0.0 ; + if ( !model->HSMHV_pjs0d_Given ) model->HSMHV_pjs0d = model->HSMHV_pjs0 ; + if ( !model->HSMHV_pjs0swd_Given ) model->HSMHV_pjs0swd = model->HSMHV_pjs0sw ; + if ( !model->HSMHV_pnjd_Given ) model->HSMHV_pnjd = model->HSMHV_pnj ; + if ( !model->HSMHV_pcisbkd_Given ) model->HSMHV_pcisbkd = model->HSMHV_pcisbk ; + if ( !model->HSMHV_pvdiffjd_Given ) model->HSMHV_pvdiffjd = model->HSMHV_pvdiffj ; + if ( !model->HSMHV_pjs0s_Given ) model->HSMHV_pjs0s = model->HSMHV_pjs0d ; + if ( !model->HSMHV_pjs0sws_Given ) model->HSMHV_pjs0sws = model->HSMHV_pjs0swd ; + if ( !model->HSMHV_pnjs_Given ) model->HSMHV_pnjs = model->HSMHV_pnjd ; + if ( !model->HSMHV_pcisbks_Given ) model->HSMHV_pcisbks = model->HSMHV_pcisbkd ; + if ( !model->HSMHV_pvdiffjs_Given ) model->HSMHV_pvdiffjs = model->HSMHV_pvdiffjd ; - if ( model->HSMHV_rd26_Given ) model->HSMHV_qovsm = model->HSMHV_rd26 ; if ( model->HSMHV_ldrift_Given ) model->HSMHV_ldrift2 = model->HSMHV_ldrift ; if (!model->HSMHVvgsMaxGiven) model->HSMHVvgsMax = 1e99; @@ -757,8 +974,8 @@ int HSMHVsetup( /* { model->HSMHV_xld = model->HSMHV_xldld ; } */ if(!model->HSMHV_lover_Given ) { model->HSMHV_lover = model->HSMHV_loverld ; } - if(!model->HSMHV_lovers_Given ) - { model->HSMHV_lovers = model->HSMHV_loverld ; } +// if(!model->HSMHV_lovers_Given ) +// { model->HSMHV_lovers = model->HSMHV_loverld ; } if(!model->HSMHV_ldrift1s_Given ) { model->HSMHV_ldrift1s = model->HSMHV_ldrift1 ; } if(!model->HSMHV_ldrift2s_Given ) @@ -766,11 +983,13 @@ int HSMHVsetup( if(!model->HSMHV_cgso_Given ) { model->HSMHV_cgso = model->HSMHV_cgdo ; model->HSMHV_cgso_Given = model->HSMHV_cgdo_Given ; } } + if ( !model->HSMHV_lovers_Given ) model->HSMHV_lovers = model->HSMHV_lover ; - if ( model->HSMHV_xqy > 0.0 && model->HSMHV_xqy < 1.0e-9 ) { - fprintf ( stderr , "*** warning(HiSIMHV): XQY (%e[m]) is too small -> reset to 1nm.\n" , model->HSMHV_xqy ) ; - model->HSMHV_xqy = 1e-9 ; + if ( model->HSMHV_cvbk_Given ) { + fprintf(stderr,"warning(HiSIM_HV(%s)): CVBK has been inactivated by CVB.\n",model->HSMHVmodName); } + if ( model->HSMHV_cordrift ) { model->HSMHV_corsrd = 0 ; } + modelMKS = &model->modelMKS ; @@ -813,7 +1032,7 @@ int HSMHVsetup( here->HSMHV_corbnet = model->HSMHV_corbnet ; else if ( here->HSMHV_corbnet != 0 && here->HSMHV_corbnet != 1 ) { here->HSMHV_corbnet = model->HSMHV_corbnet ; - printf("warning(HiSIMHV): CORBNET has been set to its default value: %d.\n", here->HSMHV_corbnet); + printf("warning(HiSIM_HV(%s)): CORBNET has been set to its default value: %d.\n", model->HSMHVmodName,here->HSMHV_corbnet); } if ( !here->HSMHV_rbdb_Given) here->HSMHV_rbdb = model->HSMHV_rbdb; /* not used in this version */ if ( !here->HSMHV_rbsb_Given) here->HSMHV_rbsb = model->HSMHV_rbsb; /* not used in this version */ @@ -825,14 +1044,18 @@ int HSMHVsetup( here->HSMHV_corg = model->HSMHV_corg ; else if ( here->HSMHV_corg != 0 && here->HSMHV_corg != 1 ) { here->HSMHV_corg = model->HSMHV_corg ; - printf("warning(HiSIMHV): CORG has been set to its default value: %d.\n", here->HSMHV_corg); + printf("warning(HiSIM_HV(%s)): CORG has been set to its default value: %d.\n", model->HSMHVmodName,here->HSMHV_corg); } if ( !here->HSMHV_m_Given ) here->HSMHV_m = 1.0 ; - if ( !here->HSMHV_subld1_Given ) here->HSMHV_subld1 = model->HSMHV_subld1 ; - if ( !here->HSMHV_subld2_Given ) here->HSMHV_subld2 = model->HSMHV_subld2 ; + if ( here->HSMHV_subld1_Given ) { + printf("warning(HiSIM_HV(%s)): SUBLD1 has been inactived in instance param.\n",model->HSMHVmodName); + } + if ( here->HSMHV_subld2_Given ) { + printf("warning(HiSIM_HV(%s)): SUBLD2 has been inactived in instance param.\n",model->HSMHVmodName); + } if ( !here->HSMHV_lovers_Given ) here->HSMHV_lovers = model->HSMHV_lovers ; - if ( here->HSMHV_lover_Given ) here->HSMHV_lovers = here->HSMHV_lover ; + if ( !here->HSMHV_lover_Given ) here->HSMHV_lover = model->HSMHV_lover ; if ( !here->HSMHV_loverld_Given ) here->HSMHV_loverld = model->HSMHV_loverld ; if ( !here->HSMHV_ldrift1_Given ) here->HSMHV_ldrift1 = model->HSMHV_ldrift1 ; if ( !here->HSMHV_ldrift2_Given ) here->HSMHV_ldrift2 = model->HSMHV_ldrift2 ; @@ -840,24 +1063,22 @@ int HSMHVsetup( if ( !here->HSMHV_ldrift2s_Given ) here->HSMHV_ldrift2s = model->HSMHV_ldrift2s ; if ( model->HSMHV_cosym ) { - if ( !here->HSMHV_lovers_Given && !model->HSMHV_lovers_Given ) here->HSMHV_lovers = here->HSMHV_loverld ; - here->HSMHV_lover = here->HSMHV_lovers ; +// here->HSMHV_lover = here->HSMHV_lovers ; + if ( !here->HSMHV_lover_Given && !model->HSMHV_lover_Given ) here->HSMHV_lover = here->HSMHV_loverld ; + if ( !here->HSMHV_lovers_Given && !model->HSMHV_lovers_Given ) here->HSMHV_lovers = here->HSMHV_lover ; if ( !here->HSMHV_ldrift1s_Given && !model->HSMHV_ldrift1s_Given ) here->HSMHV_ldrift1s = here->HSMHV_ldrift1 ; if ( !here->HSMHV_ldrift2s_Given && !model->HSMHV_ldrift2s_Given ) here->HSMHV_ldrift2s = here->HSMHV_ldrift2 ; } - - /* process drain series resistance */ /* rough check if Rd != 0 * **** don't forget to change if Rd processing is changed *******/ T2 = ( here->HSMHV_ldrift1 * model->HSMHV_rdslp1 * C_m2um + model->HSMHV_rdict1 ) * ( here->HSMHV_ldrift2 * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ; Rd = model->HSMHV_rsh * here->HSMHV_nrd * here->HSMHV_nf + (model->HSMHV_rd + model->HSMHV_rdvd) * T2 ; - if ( (model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3) - && Rd > 0.0 ) { - if(here->HSMHVdNodePrime <= 0) { - model->HSMHV_rd = ( model->HSMHV_rd == 0.0 ) ? 1e-50 : model->HSMHV_rd ; + if ( ( ( ( model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3 ) && Rd > 0.0 ) + || model->HSMHV_cordrift == 1 ) ) { + if( here->HSMHVdNodePrime <= 0) { error = CKTmkVolt(ckt, &tmp, here->HSMHVname, "drain"); if (error) return(error); here->HSMHVdNodePrime = tmp->number; @@ -869,12 +1090,14 @@ int HSMHVsetup( /* process source series resistance */ /* rough check if Rs != 0 * ***** don't forget to change if Rs processing is changed *******/ + if(model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3) { T2 = ( here->HSMHV_ldrift1s * model->HSMHV_rdslp1 * C_m2um + model->HSMHV_rdict1 ) * ( here->HSMHV_ldrift2s * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ; + }else{ T2 = 0.0; } Rs = model->HSMHV_rsh * here->HSMHV_nrs * here->HSMHV_nf + model->HSMHV_rs * T2 ; - if ( (model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3) + if ( (model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3 || model->HSMHV_cordrift == 1) && Rs > 0.0 ) { - if(here->HSMHVsNodePrime == 0) { + if( here->HSMHVsNodePrime == 0) { error = CKTmkVolt(ckt, &tmp, here->HSMHVname, "source"); if (error) return(error); here->HSMHVsNodePrime = tmp->number; @@ -886,7 +1109,7 @@ int HSMHVsetup( /* process gate resistance */ if ( (here->HSMHV_corg == 1 && model->HSMHV_rshg > 0.0) ) { - if(here->HSMHVgNodePrime == 0) { + if (here->HSMHVgNodePrime == 0) { error = CKTmkVolt(ckt, &tmp, here->HSMHVname, "gate"); if (error) return(error); here->HSMHVgNodePrime = tmp->number; @@ -918,21 +1141,21 @@ int HSMHVsetup( if ( here->HSMHV_cosubnode == 0 && here->HSMHVsubNode >= 0 ) { if ( here->HSMHVtempNode >= 0 ) { - /* FATAL Error when 6th node is defined and COSUBNODE=0 */ - SPfrontEnd->IFerrorf - ( - ERR_FATAL, - "HiSIM_HV: MOSFET(%s) MODEL(%s): 6th node is defined and COSUBNODE=0", - here->HSMHVname, model->HSMHVmodName + /* FATAL Error when 6th node is defined and COSUBNODE=0 */ + IFuid namarr[2]; + namarr[0] = here->HSMHVname; + namarr[1] = model->HSMHVmodName; + (*(SPfrontEnd->IFerror)) + ( + ERR_FATAL, + "HiSIM_HV: MOSFET(%s) MODEL(%s): 6th node is defined and COSUBNODE=0", + namarr ); return (E_BADPARM); } else { - /* 5th node is switched to tempNode, if COSUBNODE=0 and 5 external nodes are assigned. */ - if ( here->HSMHVsubNode > 0 ) { - here->HSMHVtempNode = here->HSMHVsubNode ; - here->HSMHVsubNode = -1 ; - } + here->HSMHVtempNode = here->HSMHVsubNode ; + here->HSMHVsubNode = -1 ; } } @@ -959,9 +1182,9 @@ int HSMHVsetup( /* 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(HSMHVDPbpPtr, HSMHVdNodePrime, HSMHVbNodePrime); TSTALLOC(HSMHVSPbpPtr, HSMHVsNodePrime, HSMHVbNodePrime); @@ -1039,7 +1262,7 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL TSTALLOC(HSMHVSsubPtr, HSMHVsNode, HSMHVsubNode); TSTALLOC(HSMHVSPsubPtr, HSMHVsNodePrime, HSMHVsubNode); } - if ( here->HSMHV_coselfheat > 0 ) { /* self heating */ + if ( here->HSMHVtempNode > 0 ) { /* self heating */ TSTALLOC(HSMHVTemptempPtr, HSMHVtempNode, HSMHVtempNode); TSTALLOC(HSMHVTempdPtr, HSMHVtempNode, HSMHVdNode); TSTALLOC(HSMHVTempdpPtr, HSMHVtempNode, HSMHVdNodePrime); @@ -1048,7 +1271,7 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL TSTALLOC(HSMHVDPtempPtr, HSMHVdNodePrime, HSMHVtempNode); TSTALLOC(HSMHVSPtempPtr, HSMHVsNodePrime, HSMHVtempNode); - TSTALLOC(HSMHVTempgpPtr, HSMHVtempNode, HSMHVgNodePrime); + TSTALLOC(HSMHVTempgpPtr, HSMHVtempNode, HSMHVgNodePrime) TSTALLOC(HSMHVTempbpPtr, HSMHVtempNode, HSMHVbNodePrime); TSTALLOC(HSMHVGPtempPtr, HSMHVgNodePrime, HSMHVtempNode); @@ -1075,15 +1298,12 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL TSTALLOC(HSMHVQBspPtr, HSMHVqbNode, HSMHVsNodePrime); TSTALLOC(HSMHVQBbpPtr, HSMHVqbNode, HSMHVbNodePrime); TSTALLOC(HSMHVQBqbPtr, HSMHVqbNode, HSMHVqbNode); - if ( here->HSMHV_coselfheat > 0 ) { /* self heating */ + if ( here->HSMHVtempNode > 0 ) { /* self heating */ TSTALLOC(HSMHVQItempPtr, HSMHVqiNode, HSMHVtempNode); TSTALLOC(HSMHVQBtempPtr, HSMHVqbNode, HSMHVtempNode); } } - - - /*-----------------------------------------------------------* * Range check of instance parameters *-----------------*/ @@ -1101,6 +1321,16 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL LWbin = Lbin * Wbin ; BINNING(vmax) + BINNING(js0d); + BINNING(js0swd); + BINNING(njd); + BINNING(cisbkd); + BINNING(vdiffjd); + BINNING(js0s); + BINNING(js0sws); + BINNING(njs); + BINNING(cisbks); + BINNING(vdiffjs); BINNING(bgtmp1) BINNING(bgtmp2) BINNING(eg0) @@ -1118,7 +1348,6 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL BINNING(sc2) BINNING(sc3) BINNING(pgd1) - BINNING(pgd3) BINNING(ndep) BINNING(ninv) BINNING(muecb0) @@ -1150,10 +1379,6 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL BINNING(nsubpsti3) BINNING(cgso) BINNING(cgdo) - BINNING(js0) - BINNING(js0sw) - BINNING(nj) - BINNING(cisbk) BINNING(clm1) BINNING(clm2) BINNING(clm3) @@ -1170,8 +1395,6 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL BINNING(glkb2) BINNING(nftrp) BINNING(nfalp) - BINNING(pthrou) - BINNING(vdiffj) BINNING(ibpc1) BINNING(ibpc2) BINNING(cgbo) @@ -1200,18 +1423,21 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL RANGECHECK(pParam->HSMHV_bgtmp1, 50.0e-6, 1.0e-3, "BGTMP1") ; RANGECHECK(pParam->HSMHV_bgtmp2, -1.0e-6, 1.0e-6, "BGTMP2") ; RANGECHECK(pParam->HSMHV_eg0, 1.0, 1.3, "EG0") ; - RANGECHECK(pParam->HSMHV_vfbover, -1.0, 1.0, "VFBOVER") ; - RANGECHECK(pParam->HSMHV_vfbc, -1.2, -0.8, "VFBC") ; + RANGECHECK(pParam->HSMHV_vfbover, -1.2, 1.0, "VFBOVER") ; + if( model->HSMHV_codep == 0 ) { + RANGECHECK(pParam->HSMHV_vfbc, -1.2, 0.0, "VFBC") ; + } else { + RANGECHECK(pParam->HSMHV_vfbc, -1.2, 0.8, "VFBC") ; + } RANGECHECK(pParam->HSMHV_nsubc, 1.0e16, 1.0e19, "NSUBC") ; RANGECHECK(pParam->HSMHV_nsubp, 1.0e16, 1.0e19, "NSUBP") ; - RANGECHECK(pParam->HSMHV_scp1, 0.0, 20.0, "SCP1") ; - RANGECHECK(pParam->HSMHV_scp2, 0.0, 2.0, "SCP2") ; + RANGECHECK(pParam->HSMHV_scp1, 0.0, 10.0, "SCP1") ; + RANGECHECK(pParam->HSMHV_scp2, 0.0, 1.0, "SCP2") ; RANGECHECK(pParam->HSMHV_scp3, 0.0, 200e-9, "SCP3") ; - RANGECHECK(pParam->HSMHV_sc1, 0.0, 20.0, "SC1") ; - RANGECHECK(pParam->HSMHV_sc2, 0.0, 2.0, "SC2") ; - RANGECHECK(pParam->HSMHV_sc3, 0.0, 200e-9, "SC3") ; - RANGECHECK(pParam->HSMHV_pgd1, 0.0, 50.0e-3, "PGD1") ; - RANGECHECK(pParam->HSMHV_pgd3, 0.0, 1.2, "PGD3") ; + RANGECHECK(pParam->HSMHV_sc1, 0.0, 10.0, "SC1") ; + RANGECHECK(pParam->HSMHV_sc2, 0.0, 1.0, "SC2") ; + RANGECHECK(pParam->HSMHV_sc3, 0.0, 20e-6, "SC3") ; + RANGECHECK(pParam->HSMHV_pgd1, 0.0, 30.0e-3, "PGD1") ; RANGECHECK(pParam->HSMHV_ndep, 0.0, 1.0, "NDEP") ; RANGECHECK(pParam->HSMHV_ninv, 0.0, 1.0, "NINV") ; RANGECHECK(pParam->HSMHV_muecb0, 100.0, 100.0e3, "MUECB0") ; @@ -1219,22 +1445,18 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL RANGECHECK(pParam->HSMHV_mueph1, 2.0e3, 30.0e3, "MUEPH1") ; RANGECHECK(pParam->HSMHV_vtmp, -2.0, 1.0, "VTMP") ; RANGECHECK(pParam->HSMHV_muesr1, 1.0e14, 1.0e16, "MUESR1") ; - RANGECHECK(pParam->HSMHV_muetmp, 0.5, 2.0, "MUETMP") ; - RANGECHECK(pParam->HSMHV_clm1, 0.01, 1.0, "CLM1") ; + RANGECHECK(pParam->HSMHV_muetmp, 0.5, 2.5, "MUETMP") ; + RANGECHECK(pParam->HSMHV_clm1, 0.01, 1.0, "CLM1") ; RANGECHECK(pParam->HSMHV_clm2, 1.0, 4.0, "CLM2") ; RANGECHECK(pParam->HSMHV_clm3, 0.5, 5.0, "CLM3") ; RANGECHECK(pParam->HSMHV_wfc, -5.0e-15, 1.0e-6, "WFC") ; - RANGECHECK(pParam->HSMHV_cgso, 0.0, 100e-9 * 100*C_VAC*model->HSMHV_kappa/model->HSMHV_tox*C_m2cm, "CGSO") ; - RANGECHECK(pParam->HSMHV_cgdo, 0.0, 100e-9 * 100*C_VAC*model->HSMHV_kappa/model->HSMHV_tox*C_m2cm, "CGDO") ; - RANGECHECK(pParam->HSMHV_pthrou, 0.0, 50.0e-3, "PTHROU") ; + RANGECHECK(pParam->HSMHV_cgso, 0.0, 100e-9 * C_VAC*model->HSMHV_kappa/model->HSMHV_tox, "CGSO") ; + RANGECHECK(pParam->HSMHV_cgdo, 0.0, 100e-9 * C_VAC*model->HSMHV_kappa/model->HSMHV_tox, "CGDO") ; RANGECHECK(pParam->HSMHV_ibpc1, 0.0, 1.0e12, "IBPC1") ; RANGECHECK(pParam->HSMHV_ibpc2, 0.0, 1.0e12, "IBPC2") ; RANGECHECK(pParam->HSMHV_cvdsover, 0.0, 1.0, "CVDSOVER") ; RANGECHECK(pParam->HSMHV_nsti, 1.0e16, 1.0e19, "NSTI") ; - if ( pParam->HSMHV_cgbo < 0.0 ) { - printf("warning(HiSIMHV): %s = %e\n", "CGBO", pParam->HSMHV_cgbo ); - printf("warning(HiSIMHV): The model parameter %s must not be less than %s.\n", "CGBO", "0.0" ); - } + MINCHECK( pParam->HSMHV_cgbo, 0.0, "CGBO") ; RANGECHECK(pParam->HSMHV_npext, 1.0e16, 1.0e18, "NPEXT") ; RANGECHECK(pParam->HSMHV_rd, 0.0, 100.0e-3, "RD") ; RANGECHECK(pParam->HSMHV_rd22, -5.0, 0.0, "RD22") ; @@ -1250,6 +1472,16 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL RANGECHECK(pParam->HSMHV_rth0, 0.0, 10.0, "RTH0") ; RANGECHECK(pParam->HSMHV_vover, 0.0, 4.0, "VOVER") ; + if ( model->HSMHV_xpdv * model->HSMHV_xldld > 1 ) { + here->HSMHV_xpdv = 1/model->HSMHV_xldld ; + }else { here->HSMHV_xpdv = model->HSMHV_xpdv; } + + here->HSMHV_cordrift = model->HSMHV_cordrift ; + if ( model->HSMHV_cordrift && pParam->HSMHV_nover == 0.0 ) { + fprintf(stderr,"warning(HiSIM_HV(%s)): CORDRIFT has been inactivated when NOVER = 0.0.\n",model->HSMHVmodName); + here->HSMHV_cordrift = 0 ; + } + /*-----------------------------------------------------------* * Change unit into MKS for instance parameters. *-----------------*/ @@ -1285,12 +1517,8 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL pParam->HSMHV_rd24 = pParam->HSMHV_rd24 / C_m2cm ; pParam->HSMHV_rdvd = pParam->HSMHV_rdvd / C_m2cm ; pParam->HSMHV_rth0 = pParam->HSMHV_rth0 / C_m2cm ; -// hereMKS->HSMHV_muecb0 = pParam->HSMHV_muecb0 * C_m2cm_p2 ; -// hereMKS->HSMHV_muecb1 = pParam->HSMHV_muecb1 * C_m2cm_p2 ; -// hereMKS->HSMHV_muesr1 = pParam->HSMHV_muesr1 * C_m2cm_p2 ; -// hereMKS->HSMHV_mueph1 = pParam->HSMHV_mueph1 * C_m2cm_p2 ; - pParam->HSMHV_vfbover = - pParam->HSMHV_vfbover ; /* For Backward compatibility */ + pParam->HSMHV_vfbover = -pParam->HSMHV_vfbover ; /* for Backword Compitibility */ } /* instance */ @@ -1299,17 +1527,19 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL /*-----------------------------------------------------------* * Range check of model parameters *-----------------*/ - RANGECHECK(model->HSMHV_shemax , 300, 600, "SHEMAX"); - if ( model->HSMHV_tox <= 0 ) { - printf("warning(HiSIMHV): TOX = %e\n ", model->HSMHV_tox); - printf("warning(HiSIMHV): The model parameter TOX must be positive.\n"); + RANGECHECK(model->HSMHV_shemax , 300, 600, "SHEMAX"); + RANGECHECK(model->HSMHV_cvbd , -0.1, 0.2, "CVBD"); + RANGECHECK(model->HSMHV_cvbs , -0.1, 0.2, "CVBS"); + if ( model->HSMHV_tox <= 0 && model->HSMHV_coerrrep ) { + printf("warning(HiSIM_HV(%s)): TOX = %e\n ", model->HSMHVmodName,model->HSMHV_tox); + printf("warning(HiSIM_HV(%s)): The model parameter TOX must be positive.\n",model->HSMHVmodName); } RANGECHECK(model->HSMHV_xld, 0.0, 50.0e-9, "XLD") ; - RANGECHECK(model->HSMHV_xwd, -10.0e-9, 100.0e-9, "XWD") ; + RANGECHECK(model->HSMHV_xwd, -100.0e-9, 300.0e-9, "XWD") ; RANGECHECK(model->HSMHV_xwdc, -10.0e-9, 100.0e-9, "XWDC") ; - RANGECHECK(model->HSMHV_rsh, 0.0, 500, "RSH") ; + RANGECHECK(model->HSMHV_rsh, 0.0, 500.0, "RSH") ; RANGECHECK(model->HSMHV_rshg, 0.0, 100.0, "RSHG") ; - if(model->HSMHV_xqy != 0.0) { MINCHECK (model->HSMHV_xqy, 10.0e-9, "XQY") ; } + if(model->HSMHV_xqy != 0.0) RANGECHECK(model->HSMHV_xqy, 10.0e-9, 50.0e-9, "XQY") ; MINCHECK (model->HSMHV_xqy1, 0.0, "XQY1") ; MINCHECK (model->HSMHV_xqy2, 0.0, "XQY2") ; RANGECHECK(model->HSMHV_vbi, 1.0, 1.2, "VBI") ; @@ -1320,22 +1550,29 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL RANGECHECK(model->HSMHV_mueph0, 0.25, 0.35, "MUEPH0") ; RANGECHECK(model->HSMHV_muesr0, 1.8, 2.2, "MUESR0") ; RANGECHECK(model->HSMHV_lpext, 1.0e-50, 10.0e-6, "LPEXT") ; + MINCHECK (model->HSMHV_sc4, 0.0, "SC4") ; RANGECHECK(model->HSMHV_scp21, 0.0, 5.0, "SCP21") ; - RANGECHECK(model->HSMHV_scp22, 0.0, 0.0, "SCP22") ; + RANGERESET(model->HSMHV_scp22, 0.0, 0.0, "SCP22") ; RANGECHECK(model->HSMHV_bs1, 0.0, 50.0e-3, "BS1") ; RANGECHECK(model->HSMHV_bs2, 0.5, 1.0, "BS2") ; - RANGECHECK(model->HSMHV_clm5, 0.0, 2.0, "CLM5") ; - RANGECHECK(model->HSMHV_clm6, 0.0, 20.0, "CLM6") ; + MINCHECK (model->HSMHV_ptl, 0.0, "PTL") ; + RANGECHECK(model->HSMHV_ptp, 3.0, 4.0, "PTP") ; + MINCHECK (model->HSMHV_pt2, 0.0, "PT2") ; + MINCHECK (model->HSMHV_pt4, 0.0, "PT4") ; + MINCHECK (model->HSMHV_pt4p, 0.0, "PT4P") ; + RANGECHECK(model->HSMHV_gdl, 0.0, 220e-9, "GDL") ; MINCHECK (model->HSMHV_ninvd, 0.0, "NINVD") ; MINCHECK (model->HSMHV_ninvdw, 0.0, "NINVDW") ; MINCHECK (model->HSMHV_ninvdwp, 0.0, "NINVDWP") ; MINCHECK (model->HSMHV_ninvdt1, 0.0, "NINVDT1") ; MINCHECK (model->HSMHV_ninvdt2, 0.0, "NINVDT2") ; + RANGECHECK(model->HSMHV_clm5, 0.0, 2.0, "CLM5") ; + RANGECHECK(model->HSMHV_clm6, 0.0, 20.0, "CLM6") ; RANGECHECK(model->HSMHV_sub2l, 0.0, 1.0, "SUB2L") ; RANGECHECK(model->HSMHV_voverp, 0.0, 2.0, "VOVERP") ; - RANGECHECK(model->HSMHV_qme1, 0.0, 300.0e-9, "QME1") ; - RANGECHECK(model->HSMHV_qme2, 0.0, 0.0, "QME2") ; - RANGECHECK(model->HSMHV_qme3, 0.0,800.0e-12, "QME3") ; + RANGECHECK(model->HSMHV_qme1, 0.0, 1e-9, "QME1") ; + RANGECHECK(model->HSMHV_qme2, 1.0, 3.0, "QME2") ; + RANGECHECK(model->HSMHV_qme3, 0.0, 500e-12, "QME3") ; RANGECHECK(model->HSMHV_glpart1, 0.0, 1.0, "GLPART1") ; RANGECHECK(model->HSMHV_tnom, 22.0, 32.0, "TNOM") ; RANGECHECK(model->HSMHV_ddltmax, 1.0, 10.0, "DDLTMAX") ; @@ -1343,12 +1580,11 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL RANGECHECK(model->HSMHV_ddltslp, 0.0, 20.0, "DDLTSLP") ; RANGECHECK(model->HSMHV_mphdfm, -3.0, 3.0, "MPHDFM") ; RANGECHECK(model->HSMHV_cvb, -0.1, 0.2, "CVB") ; - RANGECHECK(model->HSMHV_cvbk, -0.1, 0.2, "CVBK") ; RANGECHECK(model->HSMHV_rd20, 0.0, 30.0, "RD20") ; RANGECHECK(model->HSMHV_rd21, 0.0, 1.0, "RD21") ; RANGECHECK(model->HSMHV_rd22d, 0.0, 2.0, "RD22D") ; MINCHECK( model->HSMHV_rd25, 0.0, "RD25") ; - RANGECHECK(model->HSMHV_rdtemp1, -1e-3, 1e-2, "RDTEMP1") ; + RANGECHECK(model->HSMHV_rdtemp1, -1e-3, 2e-2, "RDTEMP1") ; RANGECHECK(model->HSMHV_rdtemp2, -1e-5, 1e-5, "RDTEMP2") ; RANGECHECK(model->HSMHV_rdvdtemp1,-1e-3, 1e-2, "RDVDTEMP1") ; RANGECHECK(model->HSMHV_rdvdtemp2,-1e-5, 1e-5, "RDVDTEMP2") ; @@ -1361,7 +1597,7 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL RANGECHECK(model->HSMHV_powrat, 0.0, 1.0, "POWRAT") ; RANGECHECK(model->HSMHV_prattemp1, -1.0, 1.0, "PRATTEMP1") ; RANGECHECK(model->HSMHV_prattemp2, -1.0, 1.0, "PRATTEMP2") ; - MINCHECK( model->HSMHV_xldld, 0.0, "XLDLD") ; + MINRESET ( model->HSMHV_xldld, 0.0, "XLDLD") ; MINCHECK( model->HSMHV_loverld, 0.0, "LOVERLD") ; MINCHECK( model->HSMHV_lovers, 0.0, "LOVERS") ; MINCHECK( model->HSMHV_lover, 0.0, "LOVER") ; @@ -1369,7 +1605,7 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL MINCHECK( model->HSMHV_ldrift1s, 0.0, "LDRIFT1S") ; MINCHECK( model->HSMHV_ldrift2, 0.0, "LDRIFT2") ; MINCHECK( model->HSMHV_ldrift2s, 0.0, "LDRIFT2S") ; - MINCHECK( model->HSMHV_ldrift, 0.0, "LDRIFT") ; +// MINCHECK( model->HSMHV_ldrift, 0.0, "LDRIFT") ; RANGECHECK(model->HSMHV_rds, -100, 100, "RDS") ; RANGECHECK(model->HSMHV_rdsp, -10, 10, "RDSP") ; RANGECHECK(model->HSMHV_rdvdl, -100, 100, "RDVDL") ; @@ -1384,6 +1620,47 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL RANGECHECK(model->HSMHV_rdov12, 0.0, 2.0, "RDOV12") ; RANGECHECK(model->HSMHV_rdslp2, -10.0, 10.0, "RDSLP2") ; RANGECHECK(model->HSMHV_rdict2, -10.0, 10.0, "RDICT2") ; + RANGECHECK(model->HSMHV_rdrvmax, 1e6, 100e6, "RDRVMAX" ) ; + RANGECHECK(model->HSMHV_rdrmue, 1e2, 3e3, "RDRMUE" ) ; + RANGECHECK(model->HSMHV_rdrqover, 0.0, 1e7, "RDRDQOVER" ) ; + RANGERESET(model->HSMHV_rdrcx, 0.0, 1.0, "RDRCX" ) ; + RANGECHECK(model->HSMHV_rdrcar, 0.0, 50e-9, "RDRCAR" ) ; + RANGECHECK(model->HSMHV_rdrmuetmp, 0.0, 2.0, "RDRMUETMP" ) ; + RANGECHECK(model->HSMHV_rdrvtmp, -2.0, 1.0, "RDRVTMP" ) ; + MINCHECK( model->HSMHV_xpdv, 0.0, "XPDV" ) ; + MINCHECK( model->HSMHV_xpvdth, 0.0, "XPVDTH" ) ; + RANGECHECK(model->HSMHV_xpvdthg, -1.0, 1.0, "XPVDTHG" ) ; + MINCHECK( model->HSMHV_ibpc1l, 0.0, "IBPC1L" ) ; + RANGERESET(model->HSMHV_ndepm, 5e15, 2e17, "NDEPM" ) ; + RANGERESET(model->HSMHV_tndep, 1e-7, 1e-6, "TNDEP" ) ; + RANGERESET(model->HSMHV_depmue0, 1, 1e5, "DEPMUE0" ) ; + RANGECHECK(model->HSMHV_depmueback0, 1, 1e5, "DEPMUEBACK0" ) ; + RANGECHECK(model->HSMHV_depvdsef2, 0.1, 4.0, "DEPVDSEF2" ) ; + RANGECHECK(model->HSMHV_depmueph1, 1, 1e5, "DEPMUEPH1" ) ; + RANGECHECK(model->HSMHV_depleak, 0.0, 5.0, "DEPLEAK" ) ; + + if( model->HSMHV_codep == 1 && model->HSMHV_coerrrep ) { + if( model->HSMHV_copprv == 1 ) { + printf("warning(HiSIM_HV(%s)): COPPRV is not supported yet in Depletion mode mode, resetted to 0.\n",model->HSMHVmodName); + } + if( model->HSMHV_coisti == 1 ) { + printf("warning(HiSIM_HV(%s)): STI leak model is not supported yet in Depletion mode model, skipped\n",model->HSMHVmodName); + } + if( model->HSMHV_cothrml == 1 ) { + printf("warning(HiSIM_HV(%s)): Thermal noise model is not supported yet in Depletion mode model, skipped\n",model->HSMHVmodName); + } + if( model->HSMHV_coign == 1 ) { + printf("warning(HiSIM_HV(%s)): Induced gate noise model is not supported yet in Depletion mode model, skipped\n",model->HSMHVmodName); + } + } + if( model->HSMHV_codep && model->HSMHV_copprv == 1 ) { model->HSMHV_copprv = 0 ; } + + if ( model->HSMHV_xpdv * model->HSMHV_xldld > 1 && model->HSMHV_coerrrep ) { + printf("warning(HiSIM_HV(%s)): The model parameter XPDV (= %e) must be smaller than 1/XLDLD (= %e).\n", + model->HSMHVmodName,model->HSMHV_xpdv, 1/model->HSMHV_xldld ); + printf("warning(HiSIM_HV(%s)): The model parameter XPDV (= %e) has been changed to %e.\n", + model->HSMHVmodName,model->HSMHV_xpdv, 1/model->HSMHV_xldld ); + } /*-----------------------------------------------------------* @@ -1426,10 +1703,10 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL modelMKS->HSMHV_ovslp = model->HSMHV_ovslp / C_m2cm ; modelMKS->HSMHV_dly3 = model->HSMHV_dly3 / C_m2cm_p2 ; modelMKS->HSMHV_cth0 = model->HSMHV_cth0 * C_m2cm ; -// modelMKS->HSMHV_muecb0 = model->HSMHV_muecb0 * C_cm2m_p2 ; -// modelMKS->HSMHV_muecb1 = model->HSMHV_muecb1 * C_cm2m_p2 ; -// modelMKS->HSMHV_muesr1 = model->HSMHV_muesr1 * C_cm2m_p2 ; -// modelMKS->HSMHV_mueph1 = model->HSMHV_mueph1 * C_cm2m_p2 ; + modelMKS->HSMHV_rdrmue = model->HSMHV_rdrmue / C_m2cm_p2 ; + modelMKS->HSMHV_rdrvmax = model->HSMHV_rdrvmax / C_m2cm ; + modelMKS->HSMHV_ndepm = model->HSMHV_ndepm / C_cm2m_p3 ; + modelMKS->HSMHV_depvmax = model->HSMHV_depvmax / C_m2cm ; /*-----------------------------------------------------------* @@ -1440,18 +1717,9 @@ do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NUL } /* model */ - /* Reset ckt->CKTbypass to 0 */ - if( ckt->CKTbypass == 1 ) { - fprintf( stderr, "\nwarning(HiSIMHV): The BYPASS option is reset to 0 for reliable simulation.\n"); - ckt->CKTbypass = 0 ; - } - /* check ckt->CKTintegrateMethod */ - if( ckt->CKTintegrateMethod == TRAPEZOIDAL ) { /* TRAPEZODAL:1 GEAR:2 */ - fprintf( stderr, "\nwarning(HiSIMHV): Recommend the Gear method for reliable simulation with '.options METHOD=GEAR'.\n"); - } return(OK); -} +} int HSMHVunsetup( diff --git a/src/spicelib/devices/hisimhv1/hsmhvtemp.c b/src/spicelib/devices/hisimhv1/hsmhvtemp.c index 894e40863..9654c464a 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvtemp.c +++ b/src/spicelib/devices/hisimhv1/hsmhvtemp.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvtemp.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/smpdefs.h" #include "ngspice/cktdefs.h" @@ -27,7 +69,7 @@ #define RANGECHECK(param, min, max, pname) \ if ( (param) < (min) || (param) > (max) ) { \ - printf("warning(HiSIMHV): The model/instance parameter %s (= %e) must be in the range [%e , %e].\n", \ + printf("warning(HiSIM_HV(%s)): The model/instance parameter %s (= %e) must be in the range [%e , %e].\n", model->HSMHVmodName,\ (pname), (param), (min), (max) ); \ } @@ -49,11 +91,6 @@ y = ( xmin ) + 0.5 * ( TMF1 + TMF2 ) ; \ } -#ifdef POW_TO_EXP_AND_LOG -#define Fn_Pow( x , y ) exp( y * log( x ) ) -#else -#define Fn_Pow( x , y ) pow( x , y ) -#endif #define C_m2cm (1.0e2) @@ -61,8 +98,8 @@ int HSMHVtemp( GENmodel *inModel, CKTcircuit *ckt) { - register HSMHVmodel *model = (HSMHVmodel *)inModel ; - register HSMHVinstance *here ; + HSMHVmodel *model = (HSMHVmodel *)inModel ; + HSMHVinstance *here ; HSMHVbinningParam *pParam ; HSMHVmodelMKSParam *modelMKS ; HSMHVhereMKSParam *hereMKS ; @@ -73,10 +110,12 @@ int HSMHVtemp( double T0, T1, T2, T3, T4, T5, T6, T7 ; /* temperature-dependent variables */ double Eg =0.0, TTEMP0=0.0, TTEMP=0.0, beta=0.0, Nin=0.0 ; - double /*Tdiff0 = 0.0, Tdiff0_2 = 0.0,*/ Tdiff = 0.0, Tdiff_2 = 0.0 ; + double Tdiff0 = 0.0, Tdiff0_2 = 0.0, Tdiff = 0.0, Tdiff_2 = 0.0; double js=0.0, jssw=0.0, js2=0.0, jssw2 =0.0 ; int i=0 ; double TMF1 , TMF2 ; + double GDLD =0.0 ; + double log_Tratio =0.0 ; const double small = 1.0e-50 ; const double dlt_rd23 = 1.0e-6 / C_m2cm ; const double large_arg = 80 ; @@ -107,6 +146,7 @@ int HSMHVtemp( LG = Lgate * C_m2um ; here->HSMHV_wg = WG = Wgate * C_m2um ; WL = WG * LG ; + GDLD = model->HSMHV_gdld * C_m2um ; /* Band gap */ @@ -157,7 +197,7 @@ int HSMHVtemp( /* DFM */ if ( model->HSMHV_codfm == 1 && here->HSMHV_nsubcdfm_Given ) { - RANGECHECK(hereMKS->HSMHV_nsubcdfm, 1.0e16, 1.0e19, "NSUBCDFM") ; + RANGECHECK(here->HSMHV_nsubcdfm, 1.0e16, 1.0e19, "NSUBCDFM") ; here->HSMHV_mueph1 *= model->HSMHV_mphdfm * ( log(hereMKS->HSMHV_nsubcdfm) - log(here->HSMHV_nsubc) ) + 1.0 ; here->HSMHV_nsubp += hereMKS->HSMHV_nsubcdfm - here->HSMHV_nsubc ; @@ -206,11 +246,15 @@ int HSMHVtemp( Leff = Lgate - ( dL + dLLD ) ; if ( Leff <= 0.0 ) { - SPfrontEnd->IFerrorf + IFuid namarr[2]; + namarr[0] = here->HSMHVname; + namarr[1] = model->HSMHVmodName; + (*(SPfrontEnd->IFerror)) ( ERR_FATAL, "HiSIM_HV: MOSFET(%s) MODEL(%s): effective channel length is negative or 0", - model->HSMHVmodName, here->HSMHVname); + namarr + ); return (E_BADPARM); } here->HSMHV_leff = Leff ; @@ -228,11 +272,15 @@ int HSMHVtemp( here->HSMHV_weff_ld = Wgate - 2.0e0 * dWLD ; here->HSMHV_weff_cv = Wgate - 2.0e0 * dWCV ; if ( Weff <= 0.0 ) { - SPfrontEnd->IFerrorf + IFuid namarr[2]; + namarr[0] = here->HSMHVname; + namarr[1] = model->HSMHVmodName; + (*(SPfrontEnd->IFerror)) ( ERR_FATAL, "HiSIM_HV: MOSFET(%s) MODEL(%s): effective channel width is negative or 0", - model->HSMHVmodName, here->HSMHVname); + namarr + ); return (E_BADPARM); } here->HSMHV_weff_nf = Weff * here->HSMHV_nf ; @@ -283,6 +331,9 @@ int HSMHVtemp( here->HSMHV_ptovr0 = 0.0e0 ; } + /* depletion MOS (temperature-independent part) */ + here->HSMHV_ndepm = modelMKS->HSMHV_ndepm ; + /* costi0 and costi1 for STI transistor model (temperature-independent part) */ here->HSMHV_costi00 = sqrt (2.0 * C_QE * pParam->HSMHV_nsti * C_ESI ) ; here->HSMHV_nsti_p2 = 1.0 / ( pParam->HSMHV_nsti * pParam->HSMHV_nsti ) ; @@ -297,14 +348,10 @@ int HSMHVtemp( /* @300K, w/o pocket */ here->HSMHV_pb2c = 2.0e0 / C_b300 * log (here->HSMHV_nsubc / C_Nin0) ; - /* constant for Poly depletion */ here->HSMHV_cnstpgd = pow ( 1e0 + 1e0 / LG , model->HSMHV_pgd4 ) * pParam->HSMHV_pgd1 ; - - - /* Gate resistance */ if ( here->HSMHV_corg == 1 ) { T1 = here->HSMHV_xgw + Weff / (3.0e0 * here->HSMHV_ngcon); @@ -313,7 +360,7 @@ int HSMHVtemp( if (here->HSMHV_grg > 1.0e-3) here->HSMHV_grg = here->HSMHV_m / here->HSMHV_grg; else { here->HSMHV_grg = here->HSMHV_m * 1.0e3; - printf("warning(HiSIM_HV): The gate conductance reset to 1.0e3 mho.\n"); + printf("warning(HiSIM_HV(%s)): The gate conductance reset to 1.0e3 mho.\n",model->HSMHVmodName); } } @@ -350,6 +397,15 @@ int HSMHVtemp( here->HSMHV_rs0 = 0.0 ; } + here->HSMHV_Xmax = sqrt ( model->HSMHV_rdrdjunc * model->HSMHV_rdrdjunc + model->HSMHV_xldld * model->HSMHV_xldld ) ; + if(pParam->HSMHV_nover != 0.0) { + here->HSMHV_kdep = 2.0 * C_ESI / ( C_QE * pParam->HSMHV_nover ) ; + here->HSMHV_kjunc = 2.0 * C_ESI / C_QE * here->HSMHV_nsubc / ( pParam->HSMHV_nover + here->HSMHV_nsubc ) / pParam->HSMHV_nover ; + } + here->HSMHV_rdrcxw = 1.0e0 ; + here->HSMHV_rdrvmaxw = 1.0e0 + (model->HSMHV_rdrvmaxw / pow( WG, model->HSMHV_rdrvmaxwp)) ; + here->HSMHV_rdrvmaxl = 1.0e0 + (model->HSMHV_rdrvmaxl / pow( LG, model->HSMHV_rdrvmaxlp)) ; + here->HSMHV_rdrmuel = 1.0e0 + (model->HSMHV_rdrmuel / pow( LG, model->HSMHV_rdrmuelp )) ; /* Body resistance */ if ( here->HSMHV_corbnet == 1 ) { @@ -364,9 +420,16 @@ int HSMHVtemp( } /* Vdseff */ - T1 = model->HSMHV_ddltslp * LG + model->HSMHV_ddltict ; - if ( T1 < 0.0 ) { T1 = 0.0 ; } - here->HSMHV_ddlt = T1 * model->HSMHV_ddltmax / ( T1 + model->HSMHV_ddltmax ) + 1.0 ; + if( model->HSMHV_coddlt == 0) { + T1 = model->HSMHV_ddltslp * LG + model->HSMHV_ddltict ; + if ( T1 < 0.0 ) { T1 = 0.0 ; } + here->HSMHV_ddlt = T1 * model->HSMHV_ddltmax / ( T1 + model->HSMHV_ddltmax ) + 1.0 ; + } else { + T1 = model->HSMHV_ddltslp * LG ; + if ( T1 < 0.0 ) { T1 = 0.0 ; } + here->HSMHV_ddlt = T1 * model->HSMHV_ddltmax / ( T1 + model->HSMHV_ddltmax ) + model->HSMHV_ddltict + small ; + } + /* Isub */ T2 = pow( Weff , model->HSMHV_svgswp ) ; @@ -389,6 +452,13 @@ int HSMHVtemp( here->HSMHV_xsub2 = pParam->HSMHV_sub2 * ( 1.0 + modelMKS->HSMHV_sub2l / here->HSMHV_lgate ) ; + here->HSMHV_subld1 = model->HSMHV_subld1 + * ( 1.0 + model->HSMHV_subld1l / pow( LG , model->HSMHV_subld1lp ) ) ; + + /* IBPC */ + here->HSMHV_ibpc1 = pParam->HSMHV_ibpc1 + * ( 1.0 + model->HSMHV_ibpc1l / pow( LG , model->HSMHV_ibpc1lp ) ) ; + /* Fringing capacitance */ here->HSMHV_cfrng = C_EOX / ( C_Pi / 2.0e0 ) * here->HSMHV_weff_nf * log( 1.0e0 + model->HSMHV_tpoly / model->HSMHV_tox ) ; @@ -397,6 +467,11 @@ int HSMHVtemp( here->HSMHV_cqyb0 = C_m2um * here->HSMHV_weff_nf * model->HSMHV_xqy1 / pow( LG , model->HSMHV_xqy2 ) ; + /* Parasitic component of the channel current */ + here->HSMHV_ptl0 = model->HSMHV_ptl * pow( LG , - model->HSMHV_ptlp ) ; + here->HSMHV_pt40 = model->HSMHV_pt4 * pow( LG , - model->HSMHV_pt4p ) ; + here->HSMHV_gdl0 = model->HSMHV_gdl * pow( LG + GDLD , - model->HSMHV_gdlp ) ; + /* Self heating */ pParam->HSMHV_rth = pParam->HSMHV_rth0 / ( here->HSMHV_m * here->HSMHV_weff_nf ) * ( 1.0 + model->HSMHV_rth0w / pow( WG , model->HSMHV_rth0wp ) ); @@ -414,6 +489,8 @@ int HSMHVtemp( if ( here->HSMHVtempNode < 0 || pParam->HSMHV_rth0 == 0.0 ) { #include "hsmhvtemp_eval.h" +#include "hsmhvtemp_eval_rdri.h" +#include "hsmhvtemp_eval_dio.h" } /* end of if ( here->HSMHVtempNode < 0 || pParam->HSMHV_rth0 == 0.0 ) */ diff --git a/src/spicelib/devices/hisimhv1/hsmhvtemp_eval.h b/src/spicelib/devices/hisimhv1/hsmhvtemp_eval.h index cccc90fc0..f4375968b 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvtemp_eval.h +++ b/src/spicelib/devices/hisimhv1/hsmhvtemp_eval.h @@ -1,19 +1,61 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvtemp_eval.h - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #define C_rdtemp_min 5.0e-3 #define C_rdtemp_dlt 1.0e-2 @@ -24,16 +66,15 @@ /* Self heating */ TTEMP = TTEMP + deltemp ; #endif -/*Tdiff0 = TTEMP0 - model->HSMHV_ktnom ;*/ -/*Tdiff0_2 = TTEMP0 * TTEMP0 - model->HSMHV_ktnom * model->HSMHV_ktnom ;*/ +Tdiff0 = TTEMP0 - model->HSMHV_ktnom ; +Tdiff0_2 = TTEMP0 * TTEMP0 - model->HSMHV_ktnom * model->HSMHV_ktnom ; Tdiff = TTEMP - model->HSMHV_ktnom ; Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; + here->HSMHV_Tratio = TTEMP / model->HSMHV_ktnom ; /* Band gap */ - T1 = TTEMP - model->HSMHV_ktnom ; - T2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; - here->HSMHV_eg = Eg = here->HSMHV_egtnom - pParam->HSMHV_bgtmp1 * T1 - - pParam->HSMHV_bgtmp2 * T2 ; + here->HSMHV_eg = Eg = here->HSMHV_egtnom - pParam->HSMHV_bgtmp1 * Tdiff + - pParam->HSMHV_bgtmp2 * Tdiff_2 ; here->HSMHV_sqrt_eg = sqrt( Eg ) ; #ifdef HSMHVEVAL Eg_dT = -pParam->HSMHV_bgtmp1 - 2.0e0 * TTEMP * pParam->HSMHV_bgtmp2 ; @@ -59,26 +100,53 @@ Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; #endif /* Intrinsic carrier concentration */ - here->HSMHV_nin = Nin = C_Nin0 * Fn_Pow (TTEMP / model->HSMHV_ktnom, 1.5e0) + here->HSMHV_nin = Nin = C_Nin0 * Fn_Pow (here->HSMHV_Tratio, 1.5e0) * exp (- Eg / 2.0e0 * beta + here->HSMHV_egtnom / 2.0e0 * here->HSMHV_betatnom) ; #ifdef HSMHVEVAL Nin_dT = C_Nin0 * exp (- Eg / 2.0e0 * beta + here->HSMHV_egtnom / 2.0e0 * here->HSMHV_betatnom) - * 1.5e0 * Fn_Pow ( TTEMP / model->HSMHV_ktnom , 0.5e0 ) / model->HSMHV_ktnom - + C_Nin0 * Fn_Pow (TTEMP / model->HSMHV_ktnom, 1.5e0) + * 1.5e0 * Fn_Pow ( here->HSMHV_Tratio , 0.5e0 ) / model->HSMHV_ktnom + + C_Nin0 * Fn_Pow (here->HSMHV_Tratio, 1.5e0) * exp (- Eg / 2.0e0 * beta + here->HSMHV_egtnom / 2.0e0 * here->HSMHV_betatnom) * ( - Eg / 2.0e0 * beta_dT - beta / 2.0e0 * Eg_dT ); #endif /* Phonon Scattering (temperature-dependent part) */ - T1 = Fn_Pow (TTEMP / model->HSMHV_ktnom, pParam->HSMHV_muetmp) ; + T1 = Fn_Pow (here->HSMHV_Tratio, pParam->HSMHV_muetmp) ; here->HSMHV_mphn0 = T1 / here->HSMHV_mueph ; here->HSMHV_mphn1 = here->HSMHV_mphn0 * model->HSMHV_mueph0 ; #ifdef HSMHVEVAL - T1_dT = pParam->HSMHV_muetmp * Fn_Pow(TTEMP / model->HSMHV_ktnom, pParam->HSMHV_muetmp - 1.0 ) + T1_dT = pParam->HSMHV_muetmp * Fn_Pow(here->HSMHV_Tratio, pParam->HSMHV_muetmp - 1.0 ) / model->HSMHV_ktnom ; mphn0_dT = T1_dT / here->HSMHV_mueph ; #endif + if( model->HSMHV_codep == 1 ) { + /* depletion MOS parameter (temperature-dependent part) */ + here->HSMHV_Pb2n = 2.0/beta*log(here->HSMHV_ndepm/Nin) ; + here->HSMHV_Vbipn = 1.0/beta*log(here->HSMHV_ndepm*here->HSMHV_nsub/Nin/Nin) ; + here->HSMHV_cnst0 = sqrt ( 2.0 * C_ESI * C_QE * here->HSMHV_ndepm / beta ) ; + here->HSMHV_cnst1 = Nin*Nin/here->HSMHV_ndepm/here->HSMHV_ndepm ; + T1 = Fn_Pow (here->HSMHV_Tratio, model->HSMHV_depmuetmp) ; + here->HSMHV_depmphn0 = T1 / model->HSMHV_depmueph1 ; + here->HSMHV_depmphn1 = here->HSMHV_depmphn0 * model->HSMHV_depmueph0 ; + + T0 = 1.8 + 0.4 * here->HSMHV_Tratio + 0.1 * here->HSMHV_Tratio * here->HSMHV_Tratio - model->HSMHV_depvtmp * ( 1.0 - here->HSMHV_Tratio ) ; + here->HSMHV_depvmax = modelMKS->HSMHV_depvmax / T0 ; + +#ifdef HSMHVEVAL + Pb2n_dT = -here->HSMHV_Pb2n/beta*beta_dT-2.0/beta/Nin*Nin_dT ; + Vbipn_dT = -here->HSMHV_Vbipn/beta*beta_dT-2/beta/Nin*Nin_dT ; + cnst0_dT = 0.5e0 / here->HSMHV_cnst0 * 2.0 * C_ESI * C_QE * here->HSMHV_ndepm * beta_inv_dT ; + cnst1_dT = 2.0e0 * Nin * Nin_dT / here->HSMHV_ndepm / here->HSMHV_ndepm ; + T1_dT = model->HSMHV_depmuetmp * Fn_Pow(here->HSMHV_Tratio, model->HSMHV_depmuetmp - 1.0 ) + / model->HSMHV_ktnom ; + depmphn0_dT = T1_dT / model->HSMHV_depmueph1 ; + T0_dT = 1 / model->HSMHV_ktnom * ( 0.4 + 0.2 * here->HSMHV_Tratio + model->HSMHV_depvtmp ) ; + depVmax_dT = - modelMKS->HSMHV_depvmax / ( T0 * T0 ) * T0_dT ; + +#endif + } + /* Pocket Overlap (temperature-dependent part) */ here->HSMHV_ptovr = here->HSMHV_ptovr0 / beta ; #ifdef HSMHVEVAL @@ -87,16 +155,14 @@ Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; /* Velocity Temperature Dependence */ T1 = TTEMP / model->HSMHV_ktnom ; - T3 = TTEMP0 - model->HSMHV_ktnom ; - T4 = TTEMP0 * TTEMP0 - model->HSMHV_ktnom * model->HSMHV_ktnom ; T0 = 1.8 + 0.4 * T1 + 0.1 * T1 * T1 - pParam->HSMHV_vtmp * (1.0 - T1) ; if ( model->HSMHV_cotemp != 2 ) { /* without deltemp (COTEMP=0,1,3) */ here->HSMHV_vmax = here->HSMHV_vmax0 * pParam->HSMHV_vmax / T0 - * ( 1.0 + model->HSMHV_vmaxt1 * T3 + model->HSMHV_vmaxt2 * T4 ) ; + * ( 1.0 + model->HSMHV_vmaxt1 * Tdiff0 + model->HSMHV_vmaxt2 * Tdiff0_2 ) ; #ifdef HSMHVEVAL Vmax_dT=-here->HSMHV_vmax0 * pParam->HSMHV_vmax - / ( T0 * T0 ) * ( 1.0 + model->HSMHV_vmaxt1 * T3 + model->HSMHV_vmaxt2 * T4 ) + / ( T0 * T0 ) * ( 1.0 + model->HSMHV_vmaxt1 * Tdiff0 + model->HSMHV_vmaxt2 * Tdiff0_2 ) * 1/model->HSMHV_ktnom * (0.4 + 0.2 * T1 + pParam->HSMHV_vtmp) ; #endif } else { /* with deltemp (COTEMP=2) */ @@ -113,7 +179,7 @@ Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; #endif } if ( model->HSMHV_cotemp != 2 ) { /* without deltemp (COTEMP=0,1,3) */ - here->HSMHV_ninvd = here->HSMHV_ninvd0 * ( 1.0 + model->HSMHV_ninvdt1 * T3 + model->HSMHV_ninvdt2 * T4 ) ; + here->HSMHV_ninvd = here->HSMHV_ninvd0 * ( 1.0 + model->HSMHV_ninvdt1 * Tdiff0 + model->HSMHV_ninvdt2 * Tdiff0_2 ) ; #ifdef HSMHVEVAL ninvd_dT = 0.0 ; #endif @@ -126,11 +192,11 @@ Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; } /* Temperature Dependence of RTH0 */ - pParam->HSMHV_rth = ( pParam->HSMHV_rth0 + model->HSMHV_rthtemp1 * T3 + model->HSMHV_rthtemp2 * T4 ) * here->HSMHV_rthtemp0 ; + pParam->HSMHV_rth = ( pParam->HSMHV_rth0 + model->HSMHV_rthtemp1 * Tdiff0 + model->HSMHV_rthtemp2 * Tdiff0_2 ) * here->HSMHV_rthtemp0 ; /* Temperature Dependence of POWRAT */ - T2 = pParam->HSMHV_powrat + model->HSMHV_prattemp1 * T3 + model->HSMHV_prattemp2 * T4 ; + T2 = pParam->HSMHV_powrat + model->HSMHV_prattemp1 * Tdiff0 + model->HSMHV_prattemp2 * Tdiff0_2 ; Fn_SL( T2 , T2 , 0 , 0.05 , T0 ); Fn_SU( here->HSMHV_powratio , T2 , 1 , 0.05 , T0 ); @@ -147,52 +213,53 @@ Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; here->HSMHV_wdpl = sqrt ( T1 / here->HSMHV_nsub ) ; here->HSMHV_wdplp = sqrt( T1 / ( here->HSMHV_nsubp ) ) ; - /* Coefficient of the F function for bulk charge */ - here->HSMHV_cnst0 = sqrt ( 2.0 * C_ESI * C_QE * here->HSMHV_nsub / beta ) ; + + if( model->HSMHV_codep == 0 ) { + /* Coefficient of the F function for bulk charge */ + here->HSMHV_cnst0 = sqrt ( 2.0 * C_ESI * C_QE * here->HSMHV_nsub / beta ) ; - /* cnst1: n_{p0} / p_{p0} */ - T1 = Nin / here->HSMHV_nsub ; - here->HSMHV_cnst1 = T1 * T1 ; + /* cnst1: n_{p0} / p_{p0} */ + T1 = Nin / here->HSMHV_nsub ; + here->HSMHV_cnst1 = T1 * T1 ; #ifdef HSMHVEVAL - cnst0_dT = 0.5e0 / here->HSMHV_cnst0 * 2.0 * C_ESI * C_QE * here->HSMHV_nsub * beta_inv_dT ; - cnst1_dT = 2.0e0 * Nin * Nin_dT / here->HSMHV_nsub / here->HSMHV_nsub ; + cnst0_dT = 0.5e0 / here->HSMHV_cnst0 * 2.0 * C_ESI * C_QE * here->HSMHV_nsub * beta_inv_dT ; + cnst1_dT = 2.0e0 * Nin * Nin_dT / here->HSMHV_nsub / here->HSMHV_nsub ; #endif + } + - if ( pParam->HSMHV_nover != 0.0 ) { - here->HSMHV_cnst0over = here->HSMHV_cnst0 * sqrt( pParam->HSMHV_nover / here->HSMHV_nsub ) ; + if( model->HSMHV_codep == 0 ) { + + if ( pParam->HSMHV_nover != 0.0 ) { + here->HSMHV_cnst0over = here->HSMHV_cnst0 * sqrt( pParam->HSMHV_nover / here->HSMHV_nsub ) ; #ifdef HSMHVEVAL - cnst0over_dT = cnst0_dT * sqrt( pParam->HSMHV_nover / here->HSMHV_nsub ) ; + cnst0over_dT = cnst0_dT * sqrt( pParam->HSMHV_nover / here->HSMHV_nsub ) ; #endif - /* ps0ldinib : Ps0_iniB for Ps0LD */ - T1 = here->HSMHV_cnst0over * model->HSMHV_tox / here->HSMHV_cecox ; - T2 = pParam->HSMHV_nover / Nin ; - here->HSMHV_ps0ldinib = T2 * T2 / ( T1 * T1 ); + } + if ( pParam->HSMHV_novers != 0.0 ) { + here->HSMHV_cnst0overs = here->HSMHV_cnst0 * sqrt( pParam->HSMHV_novers / here->HSMHV_nsub ) ; #ifdef HSMHVEVAL - T1_dT = cnst0over_dT * model->HSMHV_tox / here->HSMHV_cecox ; - T2_dT = - Nin_dT * T2 / Nin; - ps0ldinib_dT = 2.0 * here->HSMHV_ps0ldinib * ( T2_dT * T1 - T2 * T1_dT ) / ( T1 * T2 ); + cnst0overs_dT = cnst0_dT * sqrt( pParam->HSMHV_novers / here->HSMHV_nsub ) ; #endif - } - if ( pParam->HSMHV_novers != 0.0 ) { - here->HSMHV_cnst0overs = here->HSMHV_cnst0 * sqrt( pParam->HSMHV_novers / here->HSMHV_nsub ) ; + } + } else { + if ( pParam->HSMHV_nover != 0.0 ) { + here->HSMHV_cnst0over = here->HSMHV_cnst0 * sqrt( pParam->HSMHV_nover / here->HSMHV_ndepm ) ; #ifdef HSMHVEVAL - cnst0overs_dT = cnst0_dT * sqrt( pParam->HSMHV_novers / here->HSMHV_nsub ) ; + cnst0over_dT = cnst0_dT * sqrt( pParam->HSMHV_nover / here->HSMHV_ndepm ) ; #endif - /* ps0ldinib : Ps0_iniB for Ps0LD */ - T1 = here->HSMHV_cnst0overs * model->HSMHV_tox / here->HSMHV_cecox ; - T2 = pParam->HSMHV_novers / Nin ; - here->HSMHV_ps0ldinibs = T2 * T2 / ( T1 * T1 ); + } + if ( pParam->HSMHV_novers != 0.0 ) { + here->HSMHV_cnst0overs = here->HSMHV_cnst0 * sqrt( pParam->HSMHV_novers / here->HSMHV_ndepm ) ; #ifdef HSMHVEVAL - T1_dT = cnst0overs_dT * model->HSMHV_tox / here->HSMHV_cecox ; - T2_dT = - Nin_dT * T2 / Nin; - ps0ldinibs_dT = 2.0 * here->HSMHV_ps0ldinibs * ( T2_dT * T1 - T2 * T1_dT ) / ( T1 * T2 ); + cnst0overs_dT = cnst0_dT * sqrt( pParam->HSMHV_novers / here->HSMHV_ndepm ) ; #endif - } + } + + } + /* temperature-dependent resistance model */ - T3 = model->HSMHV_ktnom ; - T1 = TTEMP0 - T3 ; - T4 = TTEMP0 * TTEMP0 - T3 * T3 ; /* drain side */ if ( pParam->HSMHV_rd > 0.0 ) { T2 = here->HSMHV_rdtemp0 @@ -200,7 +267,7 @@ Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; * ( here->HSMHV_ldrift2 * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ; if ( model->HSMHV_cotemp == 1 ) { /* without deltemp (COTEMP=1) */ - here->HSMHV_rd = ( pParam->HSMHV_rd + T1 * modelMKS->HSMHV_rdtemp1 + modelMKS->HSMHV_rdtemp2 * T4 ) * T2 ; + here->HSMHV_rd = ( pParam->HSMHV_rd + modelMKS->HSMHV_rdtemp1 * Tdiff0 + modelMKS->HSMHV_rdtemp2 * Tdiff0_2 ) * T2 ; Fn_SL( here->HSMHV_rd, here->HSMHV_rd, C_rdtemp_min * pParam->HSMHV_rd, C_rdtemp_dlt * pParam->HSMHV_rd, T0 ); #ifdef HSMHVEVAL Rd0_dT = 0.0 ; @@ -223,7 +290,7 @@ Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; * ( here->HSMHV_ldrift2s * model->HSMHV_rdslp2 * C_m2um + model->HSMHV_rdict2 ) ; if ( model->HSMHV_cotemp == 1 ) { /* without deltemp (COTEMP=1) */ - here->HSMHV_rs = ( pParam->HSMHV_rs + T1 * modelMKS->HSMHV_rdtemp1 + modelMKS->HSMHV_rdtemp2 * T4 ) * T2 ; + here->HSMHV_rs = ( pParam->HSMHV_rs + modelMKS->HSMHV_rdtemp1 * Tdiff0 + modelMKS->HSMHV_rdtemp2 * Tdiff0_2 ) * T2 ; Fn_SL( here->HSMHV_rs, here->HSMHV_rs, C_rdtemp_min * pParam->HSMHV_rs, C_rdtemp_dlt * pParam->HSMHV_rs, T0 ); #ifdef HSMHVEVAL Rs0_dT = 0.0 ; @@ -250,10 +317,8 @@ Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; Fn_SU( T7 , T5 , T4 * ( model->HSMHV_rdov11 + 1.0) , 50.0e-6 , T6 ) ; Fn_SL( T2 , T7 + T1 * T4 , 0, 50.0e-6 , T6 ) ; - T3 = model->HSMHV_ktnom ; - T1 = TTEMP0 - T3 ; if ( model->HSMHV_cotemp == 0 || model->HSMHV_cotemp == 1 ) { /* without deltemp (COTEMP=0,1) */ - here->HSMHV_rdvd = ( pParam->HSMHV_rdvd + T1 * modelMKS->HSMHV_rdvdtemp1 + modelMKS->HSMHV_rdvdtemp2 * ( TTEMP0 * TTEMP0 - T3 * T3 ) ) * T2 ; + here->HSMHV_rdvd = ( pParam->HSMHV_rdvd + modelMKS->HSMHV_rdvdtemp1 * Tdiff0 + modelMKS->HSMHV_rdvdtemp2 * Tdiff0_2 ) * T2 ; Fn_SL( here->HSMHV_rdvd, here->HSMHV_rdvd, C_rdtemp_min * pParam->HSMHV_rdvd, C_rdtemp_dlt * pParam->HSMHV_rdvd, T0 ); #ifdef HSMHVEVAL Rdvd_dT = 0.0 ; @@ -276,10 +341,8 @@ Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; Fn_SU( T7 , T5 , T4 * ( model->HSMHV_rdov11 + 1.0) , 50.0e-6 , T6 ) ; Fn_SL( T2 , T7 + T1 * T4 , 0, 50.0e-6 , T6 ) ; - T3 = model->HSMHV_ktnom ; - T1 = TTEMP0 - T3 ; if ( model->HSMHV_cotemp == 0 || model->HSMHV_cotemp == 1 ) { /* without deltemp (COTEMP=0,1) */ - here->HSMHV_rsvd = ( pParam->HSMHV_rdvd + T1 * modelMKS->HSMHV_rdvdtemp1 + modelMKS->HSMHV_rdvdtemp2 * ( TTEMP0 * TTEMP0 - T3 * T3 ) ) * T2 ; + here->HSMHV_rsvd = ( pParam->HSMHV_rdvd + modelMKS->HSMHV_rdvdtemp1 * Tdiff0 + modelMKS->HSMHV_rdvdtemp2 * Tdiff0_2 ) * T2 ; Fn_SL( here->HSMHV_rsvd, here->HSMHV_rsvd, C_rdtemp_min * pParam->HSMHV_rdvd, C_rdtemp_dlt * pParam->HSMHV_rdvd, T0 ); #ifdef HSMHVEVAL Rsvd_dT = 0.0 ; @@ -296,83 +359,8 @@ Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; here->HSMHV_rsvd = 0.0 ; } - /* for substrate-source/drain junction diode. */ - js = pParam->HSMHV_js0 - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xti * log (TTEMP / model->HSMHV_ktnom)) / pParam->HSMHV_nj) ; - jssw = pParam->HSMHV_js0sw - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xti * log (TTEMP / model->HSMHV_ktnom)) / model->HSMHV_njsw) ; - - js2 = pParam->HSMHV_js0 - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xti2 * log (TTEMP / model->HSMHV_ktnom)) / pParam->HSMHV_nj) ; - jssw2 = pParam->HSMHV_js0sw - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xti2 * log (TTEMP / model->HSMHV_ktnom)) / model->HSMHV_njsw) ; -#ifdef HSMHVEVAL - T0 = - Eg * beta_dT - Eg_dT * beta ; /* Self heating */ - T1 = T0 + model->HSMHV_xti / TTEMP ; /* Self heating */ - T2 = T0 + model->HSMHV_xti2 / TTEMP ; /* Self heating */ - - js_dT = js * T1 / pParam->HSMHV_nj; /* Self heating */ - jssw_dT = jssw * T1/ model->HSMHV_njsw ; /* Self heating */ - js2_dT = js2 * T2 / pParam->HSMHV_nj; /* Self heating */ - jssw2_dT = jssw2 * T2 / model->HSMHV_njsw; /* Self heating */ -#endif - here->HSMHV_isbd = here->HSMHV_ad * js + here->HSMHV_pd * jssw ; - here->HSMHV_isbd2 = here->HSMHV_ad * js2 + here->HSMHV_pd * jssw2 ; - here->HSMHV_isbs = here->HSMHV_as * js + here->HSMHV_ps * jssw ; - here->HSMHV_isbs2 = here->HSMHV_as * js2 + here->HSMHV_ps * jssw2 ; - -#ifdef HSMHVEVAL - isbd_dT = here->HSMHV_ad * js_dT + here->HSMHV_pd * jssw_dT ; /* Self heating */ - isbd2_dT = here->HSMHV_ad * js2_dT + here->HSMHV_pd * jssw2_dT ; /* Self heating */ - isbs_dT = here->HSMHV_as * js_dT + here->HSMHV_ps * jssw_dT ; /* Self heating */ - isbs2_dT = here->HSMHV_as * js2_dT + here->HSMHV_ps * jssw2_dT ; /* Self heating */ -#endif - - T1 = TTEMP / model->HSMHV_ktnom ; - T0 = T1 * T1 ; - T2 = here->HSMHV_isbd + small ; - T3 = here->HSMHV_isbs + small ; -#ifdef HSMHVEVAL - T1_dT = 1.0 / model->HSMHV_ktnom ; /* Self heating */ - T0_dT = 2.0 * T1 * T1_dT ; /* Self heating */ - T2_dT = isbd_dT ; /* Self heating */ - T3_dT = isbs_dT ; /* Self heating */ -#endif - - here->HSMHV_vbdt = pParam->HSMHV_nj / beta - * log ( pParam->HSMHV_vdiffj * T0 / T2 + 1.0 ) ; - here->HSMHV_vbst = pParam->HSMHV_nj / beta - * log ( pParam->HSMHV_vdiffj * T0 / T3 + 1.0 ) ; - - here->HSMHV_exptemp = exp (( T1 - 1.0 ) * model->HSMHV_ctemp ) ; - -#ifdef HSMHVEVAL - vbdt_dT = - beta_dT / beta * here->HSMHV_vbdt - + pParam->HSMHV_nj / beta * pParam->HSMHV_vdiffj / ( pParam->HSMHV_vdiffj * T0 / T2 + 1.0 ) - * ( T0_dT / T2 - T0 / T2 / T2 * T2_dT ) ; /* Self heating */ - vbst_dT = - beta_dT / beta * here->HSMHV_vbst - + pParam->HSMHV_nj / beta * pParam->HSMHV_vdiffj / ( pParam->HSMHV_vdiffj * T0 / T3 + 1.0 ) - * ( T0_dT / T3 - T0 / T3 / T3 * T3_dT ) ; /* Self heating */ -#endif - - here->HSMHV_jd_nvtm_inv = 1.0 / ( pParam->HSMHV_nj / beta ) ; - here->HSMHV_jd_expcd = exp (here->HSMHV_vbdt * here->HSMHV_jd_nvtm_inv ) ; - here->HSMHV_jd_expcs = exp (here->HSMHV_vbst * here->HSMHV_jd_nvtm_inv ) ; - -#ifdef HSMHVEVAL - exptemp_dT = model->HSMHV_ctemp / model->HSMHV_ktnom * here->HSMHV_exptemp ; /* Self heating */ - jd_nvtm_inv_dT = beta_dT / pParam->HSMHV_nj ; /* Self heating */ - jd_expcd_dT = here->HSMHV_jd_expcd - * ( vbdt_dT * here->HSMHV_jd_nvtm_inv + here->HSMHV_vbdt * jd_nvtm_inv_dT ) ; /* Self heating */ - jd_expcs_dT = here->HSMHV_jd_expcs - * ( vbst_dT * here->HSMHV_jd_nvtm_inv + here->HSMHV_vbst * jd_nvtm_inv_dT ) ; /* Self heating */ -#endif /* costi0 and costi1 for STI transistor model (temperature-dependent part) */ here->HSMHV_costi0 = here->HSMHV_costi00 * sqrt(here->HSMHV_beta_inv) ; diff --git a/src/spicelib/devices/hisimhv1/hsmhvtemp_eval_dio.h b/src/spicelib/devices/hisimhv1/hsmhvtemp_eval_dio.h new file mode 100644 index 000000000..1bc034af4 --- /dev/null +++ b/src/spicelib/devices/hisimhv1/hsmhvtemp_eval_dio.h @@ -0,0 +1,223 @@ +/*********************************************************************** + + HiSIM (Hiroshima University STARC IGFET Model) + Copyright (C) 2014 Hiroshima University & STARC + + MODEL NAME : HiSIM_HV + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 + FILE : hsmhvtemp_eval_dio.h + + DATE : 2014.6.11 + + released by + Hiroshima University & + Semiconductor Technology Academic Research Center (STARC) +***********************************************************************/ + +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + +#define small 1.0e-50 + + TTEMP = ckt->CKTtemp; + if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; } + TTEMP0 = TTEMP ; +#ifdef HSMHVEVAL + /* Self heating */ + TTEMP = TTEMP + deltemp ; +#endif + + + /* Band gap */ + T1 = TTEMP - model->HSMHV_ktnom ; + T2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; + Eg = here->HSMHV_egtnom - pParam->HSMHV_bgtmp1 * T1 + - pParam->HSMHV_bgtmp2 * T2 ; +#ifdef HSMHVEVAL + Eg_dT = -pParam->HSMHV_bgtmp1 - 2.0e0 * TTEMP * pParam->HSMHV_bgtmp2 ; +#endif + + + /* Inverse of the thermal voltage */ + here->HSMHV_beta = beta = C_QE / (C_KB * TTEMP) ; + here->HSMHV_beta_inv = 1.0 / beta ; + here->HSMHV_beta2 = beta * beta ; + here->HSMHV_betatnom = C_QE / (C_KB * model->HSMHV_ktnom) ; +#ifdef HSMHVEVAL + beta_dT=-C_QE/(C_KB*TTEMP*TTEMP); + beta_inv_dT = C_KB / C_QE ; +#endif + + + log_Tratio = log (here->HSMHV_Tratio) ; + /* for substrate-drain junction diode. */ + js = pParam->HSMHV_js0d + * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta + + model->HSMHV_xtid * log_Tratio) / pParam->HSMHV_njd) ; + jssw = pParam->HSMHV_js0swd + * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta + + model->HSMHV_xtid * log_Tratio) / model->HSMHV_njswd) ; + + js2 = pParam->HSMHV_js0d + * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta + + model->HSMHV_xti2d * log_Tratio) / pParam->HSMHV_njd) ; + jssw2 = pParam->HSMHV_js0swd + * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta + + model->HSMHV_xti2d * log_Tratio) / model->HSMHV_njswd) ; + +#ifdef HSMHVEVAL + T0 = - Eg * beta_dT - Eg_dT * beta ; /* Self heating */ + T1 = T0 + model->HSMHV_xtid / TTEMP ; /* Self heating */ + T2 = T0 + model->HSMHV_xti2d / TTEMP ; /* Self heating */ + + js_dT = js * T1 / pParam->HSMHV_njd; /* Self heating */ + jssw_dT = jssw * T1/ model->HSMHV_njswd ; /* Self heating */ + js2_dT = js2 * T2 / pParam->HSMHV_njd; /* Self heating */ + jssw2_dT = jssw2 * T2 / model->HSMHV_njswd; /* Self heating */ +#endif + + here->HSMHV_isbd = here->HSMHV_ad * js + here->HSMHV_pd * jssw ; + here->HSMHV_isbd2 = here->HSMHV_ad * js2 + here->HSMHV_pd * jssw2 ; + +#ifdef HSMHVEVAL + isbd_dT = here->HSMHV_ad * js_dT + here->HSMHV_pd * jssw_dT ; /* Self heating */ + isbd2_dT = here->HSMHV_ad * js2_dT + here->HSMHV_pd * jssw2_dT ; /* Self heating */ +#endif + + + T0 = here->HSMHV_Tratio * here->HSMHV_Tratio ; + T2 = here->HSMHV_isbd + small ; +#ifdef HSMHVEVAL + T1_dT = 1.0 / model->HSMHV_ktnom ; /* Self heating */ + T0_dT = 2.0 * here->HSMHV_Tratio * T1_dT ; /* Self heating */ + T2_dT = isbd_dT ; /* Self heating */ +#endif + + here->HSMHV_vbdt = pParam->HSMHV_njd / beta + * log ( pParam->HSMHV_vdiffjd * T0 / T2 + 1.0 ) ; + + here->HSMHV_exptempd = exp (( here->HSMHV_Tratio - 1.0 ) * model->HSMHV_ctempd ) ; + +#ifdef HSMHVEVAL + vbdt_dT = - beta_dT / beta * here->HSMHV_vbdt + + pParam->HSMHV_njd / beta * pParam->HSMHV_vdiffjd / ( pParam->HSMHV_vdiffjd * T0 / T2 + 1.0 ) + * ( T0_dT / T2 - T0 / T2 / T2 * T2_dT ) ; /* Self heating */ +#endif + + here->HSMHV_jd_nvtm_invd = 1.0 / ( pParam->HSMHV_njd / beta ) ; + here->HSMHV_jd_expcd = exp (here->HSMHV_vbdt * here->HSMHV_jd_nvtm_invd ) ; + +#ifdef HSMHVEVAL + exptempd_dT = model->HSMHV_ctempd / model->HSMHV_ktnom * here->HSMHV_exptempd ; /* Self heating */ + jd_nvtm_invd_dT = beta_dT / pParam->HSMHV_njd ; /* Self heating */ + jd_expcd_dT = here->HSMHV_jd_expcd + * ( vbdt_dT * here->HSMHV_jd_nvtm_invd + here->HSMHV_vbdt * jd_nvtm_invd_dT ) ; /* Self heating */ +#endif + + + /* for substrate-source junction diode. */ + js = pParam->HSMHV_js0s + * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta + + model->HSMHV_xtis * log_Tratio) / pParam->HSMHV_njs) ; + jssw = pParam->HSMHV_js0sws + * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta + + model->HSMHV_xtis * log_Tratio) / model->HSMHV_njsws) ; + + js2 = pParam->HSMHV_js0s + * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta + + model->HSMHV_xti2s * log_Tratio) / pParam->HSMHV_njs) ; + jssw2 = pParam->HSMHV_js0sws + * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta + + model->HSMHV_xti2s * log_Tratio) / model->HSMHV_njsws) ; + +#ifdef HSMHVEVAL + T0 = - Eg * beta_dT - Eg_dT * beta ; /* Self heating */ + T1 = T0 + model->HSMHV_xtis / TTEMP ; /* Self heating */ + T2 = T0 + model->HSMHV_xti2s / TTEMP ; /* Self heating */ + + js_dT = js * T1 / pParam->HSMHV_njs; /* Self heating */ + jssw_dT = jssw * T1/ model->HSMHV_njsws ; /* Self heating */ + js2_dT = js2 * T2 / pParam->HSMHV_njs; /* Self heating */ + jssw2_dT = jssw2 * T2 / model->HSMHV_njsws; /* Self heating */ +#endif + + here->HSMHV_isbs = here->HSMHV_as * js + here->HSMHV_ps * jssw ; + here->HSMHV_isbs2 = here->HSMHV_as * js2 + here->HSMHV_ps * jssw2 ; + +#ifdef HSMHVEVAL + isbs_dT = here->HSMHV_as * js_dT + here->HSMHV_ps * jssw_dT ; /* Self heating */ + isbs2_dT = here->HSMHV_as * js2_dT + here->HSMHV_ps * jssw2_dT ; /* Self heating */ +#endif + + + T0 = here->HSMHV_Tratio * here->HSMHV_Tratio ; + T3 = here->HSMHV_isbs + small ; +#ifdef HSMHVEVAL + T1_dT = 1.0 / model->HSMHV_ktnom ; /* Self heating */ + T0_dT = 2.0 * here->HSMHV_Tratio * T1_dT ; /* Self heating */ + T3_dT = isbs_dT ; /* Self heating */ +#endif + + here->HSMHV_vbst = pParam->HSMHV_njs / beta + * log ( pParam->HSMHV_vdiffjs * T0 / T3 + 1.0 ) ; + + here->HSMHV_exptemps = exp (( here->HSMHV_Tratio - 1.0 ) * model->HSMHV_ctemps ) ; + +#ifdef HSMHVEVAL + vbst_dT = - beta_dT / beta * here->HSMHV_vbst + + pParam->HSMHV_njs / beta * pParam->HSMHV_vdiffjs / ( pParam->HSMHV_vdiffjs * T0 / T3 + 1.0 ) + * ( T0_dT / T3 - T0 / T3 / T3 * T3_dT ) ; /* Self heating */ +#endif + + here->HSMHV_jd_nvtm_invs = 1.0 / ( pParam->HSMHV_njs / beta ) ; + here->HSMHV_jd_expcs = exp (here->HSMHV_vbst * here->HSMHV_jd_nvtm_invs ) ; + +#ifdef HSMHVEVAL + exptemps_dT = model->HSMHV_ctemps / model->HSMHV_ktnom * here->HSMHV_exptemps ; /* Self heating */ + jd_nvtm_invs_dT = beta_dT / pParam->HSMHV_njs ; /* Self heating */ + jd_expcs_dT = here->HSMHV_jd_expcs + * ( vbst_dT * here->HSMHV_jd_nvtm_invs + here->HSMHV_vbst * jd_nvtm_invs_dT ) ; /* Self heating */ +#endif + + +/* end of HSMHVtemp_eval_dio.h */ diff --git a/src/spicelib/devices/hisimhv1/hsmhvtemp_eval_rdri.h b/src/spicelib/devices/hisimhv1/hsmhvtemp_eval_rdri.h new file mode 100644 index 000000000..fd7072c06 --- /dev/null +++ b/src/spicelib/devices/hisimhv1/hsmhvtemp_eval_rdri.h @@ -0,0 +1,103 @@ +/*********************************************************************** + + HiSIM (Hiroshima University STARC IGFET Model) + Copyright (C) 2014 Hiroshima University & STARC + + MODEL NAME : HiSIM_HV + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 + FILE : hsmhvtemp_eval_rdri.h + + DATE : 2014.6.11 + + released by + Hiroshima University & + Semiconductor Technology Academic Research Center (STARC) +***********************************************************************/ + +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + + TTEMP = ckt->CKTtemp; + if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; } + TTEMP0 = TTEMP ; +#ifdef HSMHVEVAL + /* Self heating */ + TTEMP = TTEMP + deltemp ; +#endif + + + /* Phonon Scattering (temperature-dependent part) */ + T1 = Fn_Pow ( here->HSMHV_Tratio, model->HSMHV_rdrmuetmp ) ; + here->HSMHV_rdrmue = modelMKS->HSMHV_rdrmue / T1 ; +#ifdef HSMHVEVAL + T1_dT = model->HSMHV_rdrmuetmp * Fn_Pow( here->HSMHV_Tratio, model->HSMHV_rdrmuetmp - 1.0 ) + / model->HSMHV_ktnom ; + Mu0_dT = - modelMKS->HSMHV_rdrmue / ( T1 * T1 ) * T1_dT ; +#endif + + + /* Velocity Temperature Dependence */ + T0 = 1.8 + 0.4 * here->HSMHV_Tratio + 0.1 * here->HSMHV_Tratio * here->HSMHV_Tratio - model->HSMHV_rdrvtmp * ( 1.0 - here->HSMHV_Tratio ) ; +#ifdef HSMHVEVAL + T0_dT = 1 / model->HSMHV_ktnom * ( 0.4 + 0.2 * here->HSMHV_Tratio + model->HSMHV_rdrvtmp ) ; +#endif + here->HSMHV_rdrvmax = modelMKS->HSMHV_rdrvmax / T0 ; +#ifdef HSMHVEVAL + Vmax_dT = - modelMKS->HSMHV_rdrvmax / ( T0 * T0 ) * T0_dT ; +#endif + + + here->HSMHV_rdrcx = model->HSMHV_rdrcx ; + here->HSMHV_rdrcar = model->HSMHV_rdrcar ; +#ifdef HSMHVEVAL + Cx_dT = 0.0 ; + Car_dT = 0.0 ; +#endif + + //Toshiba model // + here->HSMHV_rdrbb = model->HSMHV_rdrbb+model->HSMHV_rdrbbtmp*(TTEMP-model->HSMHV_ktnom) ; +#ifdef HSMHVEVAL + Rdrbb_dT = model->HSMHV_rdrbbtmp ; +#endif + +/* end of HSMHVtemp_eval_rdri.h */ diff --git a/src/spicelib/devices/hisimhv1/hsmhvtrunc.c b/src/spicelib/devices/hisimhv1/hsmhvtrunc.c index cadfc00d3..882784d30 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvtrunc.c +++ b/src/spicelib/devices/hisimhv1/hsmhvtrunc.c @@ -1,20 +1,62 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2012 Hiroshima University & STARC + Copyright (C) 2014 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) - Model Parameter VERSION : 1.23 + ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) + Model Parameter 'VERSION' : 2.20 FILE : hsmhvtrunc.c - DATE : 2013.04.30 + DATE : 2014.6.11 released by Hiroshima University & Semiconductor Technology Academic Research Center (STARC) ***********************************************************************/ +/********************************************************************** + +The following source code, and all copyrights, trade secrets or other +intellectual property rights in and to the source code in its entirety, +is owned by the Hiroshima University and the STARC organization. + +All users need to follow the "HISIM_HV Distribution Statement and +Copyright Notice" attached to HiSIM_HV model. + +-----HISIM_HV Distribution Statement and Copyright Notice-------------- + +Software is distributed as is, completely without warranty or service +support. Hiroshima University or STARC and its employees are not liable +for the condition or performance of the software. + +Hiroshima University and STARC own the copyright and grant users a perpetual, +irrevocable, worldwide, non-exclusive, royalty-free license with respect +to the software as set forth below. + +Hiroshima University and STARC hereby disclaims all implied warranties. + +Hiroshima University and STARC grant the users the right to modify, copy, +and redistribute the software and documentation, both within the user's +organization and externally, subject to the following restrictions + +1. The users agree not to charge for Hiroshima University and STARC code +itself but may charge for additions, extensions, or support. + +2. In any product based on the software, the users agree to acknowledge +Hiroshima University and STARC that developed the software. This +acknowledgment shall appear in the product documentation. + +3. The users agree to reproduce any copyright notice which appears on +the software on any copy or modification of such made available +to others." + +Toshimasa Asahara, President, Hiroshima University +Mitiko Miura-Mattausch, Professor, Hiroshima University +Katsuhiro Shimohigashi, President&CEO, STARC +June 2008 (revised October 2011) +*************************************************************************/ + #include "ngspice/ngspice.h" #include "ngspice/cktdefs.h" #include "hsmhvdef.h" @@ -25,10 +67,9 @@ int HSMHVtrunc( GENmodel *inModel, register CKTcircuit *ckt, double *timeStep) - { - register HSMHVmodel *model = (HSMHVmodel*)inModel; - register HSMHVinstance *here; + HSMHVmodel *model = (HSMHVmodel*)inModel; + HSMHVinstance *here; #ifdef STEPDEBUG double debugtemp=0.0 ; #endif /* STEPDEBUG */ diff --git a/visualc/vngspice_fftw_vc10.vcxproj b/visualc/vngspice_fftw_vc10.vcxproj index 33d65ccb8..ee4d960df 100644 --- a/visualc/vngspice_fftw_vc10.vcxproj +++ b/visualc/vngspice_fftw_vc10.vcxproj @@ -944,6 +944,9 @@ + + + @@ -1756,6 +1759,8 @@ + +