diff --git a/src/spicelib/devices/hisimhv1/Makefile.am b/src/spicelib/devices/hisimhv1/Makefile.am index 37713c676..44b121f18 100644 --- a/src/spicelib/devices/hisimhv1/Makefile.am +++ b/src/spicelib/devices/hisimhv1/Makefile.am @@ -11,10 +11,7 @@ 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 \ @@ -33,8 +30,6 @@ 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 e4de570ba..8a4ce50b8 100644 --- a/src/spicelib/devices/hisimhv1/hisimhv.h +++ b/src/spicelib/devices/hisimhv1/hisimhv.h @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hisimhv.h - DATE : 2014.6.11 + DATE : 2013.04.30 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" @@ -110,31 +68,10 @@ 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 3d1640e95..f94803ab8 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) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhv.c - DATE : 2014.6.11 + DATE : 2013.04.30 released by @@ -16,48 +16,6 @@ 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" @@ -106,8 +64,6 @@ 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 */ @@ -168,15 +124,11 @@ 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]"), @@ -205,12 +157,7 @@ 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 */ @@ -257,7 +204,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 [-]"), @@ -355,7 +302,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, "Inactived by CVB "), + IOP("cvbk", HSMHV_MOD_CVBK, IF_REAL, "Bias dependence coefficient of cisb [-]"), IOP("divx", HSMHV_MOD_DIVX, IF_REAL, " [1/V]"), IOP("clm1", HSMHV_MOD_CLM1, IF_REAL, "Parameter for CLM [-]"), @@ -403,7 +350,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 [-]"), @@ -421,23 +368,10 @@ 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---*/ @@ -466,6 +400,7 @@ 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, ""), @@ -476,8 +411,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 */ @@ -493,95 +428,7 @@ 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"), @@ -598,7 +445,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 side"), + IOP("lnovers", HSMHV_MOD_LNOVERS, IF_REAL, "Length dependence of nover on source size"), 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"), @@ -610,7 +457,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"), @@ -662,7 +509,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"), @@ -684,16 +531,6 @@ 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"), @@ -702,7 +539,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 side"), + IOP("wnovers", HSMHV_MOD_WNOVERS, IF_REAL, "Width dependence of novers on source size"), 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"), @@ -714,7 +551,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"), @@ -766,7 +603,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"), @@ -788,16 +625,6 @@ 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"), @@ -806,7 +633,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 side"), + IOP("pnovers", HSMHV_MOD_PNOVERS, IF_REAL, "Cross-term dependence of nover on source size"), 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"), @@ -818,7 +645,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"), @@ -870,7 +697,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"), @@ -892,16 +719,6 @@ 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 0e08ab46d..9f2fcd180 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvacld.c +++ b/src/spicelib/devices/hisimhv1/hsmhvacld.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvacld.c - DATE : 2014.6.11 + DATE : 2013.04.30 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 a28c8b7a8..a40082d6c 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvask.c +++ b/src/spicelib/devices/hisimhv1/hsmhvask.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvask.c - DATE : 2014.6.11 + DATE : 2013.04.30 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" @@ -247,12 +205,6 @@ 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 5205dd3ee..430d53b5b 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvcvtest.c +++ b/src/spicelib/devices/hisimhv1/hsmhvcvtest.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvcvtest.c - DATE : 2014.6.11 + DATE : 2013.04.30 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 fce3ed686..c1e2e0343 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvdef.h +++ b/src/spicelib/devices/hisimhv1/hsmhvdef.h @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvdef - DATE : 2014.6.11 + DATE : 2013.04.30 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 @@ -90,6 +48,10 @@ 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 ; @@ -112,11 +74,6 @@ 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 ; @@ -140,7 +97,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 ; @@ -192,6 +149,7 @@ typedef struct sHSMHVbinningParam { double HSMHV_glkb2 ; double HSMHV_nftrp ; double HSMHV_nfalp ; + double HSMHV_pthrou ; double HSMHV_vdiffj ; double HSMHV_ibpc1 ; double HSMHV_ibpc2 ; @@ -216,16 +174,6 @@ 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 ; @@ -235,6 +183,10 @@ 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 ; @@ -417,12 +369,8 @@ 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 ; @@ -450,18 +398,7 @@ typedef struct sHSMHVinstance { double HSMHV_dIsub_dVgsi ; double HSMHV_dIsub_dVbsi ; double HSMHV_dIsub_dTi ; - 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 ; + double HSMHV_dIsub_dVdse ; /* gidl and gisl current */ double HSMHV_igidl; /* gate induced drain leakage */ /* double HSMHV_gigidlgs; not used */ @@ -625,10 +562,6 @@ 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 ; @@ -641,9 +574,7 @@ 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 */ @@ -671,6 +602,7 @@ 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 */ @@ -690,13 +622,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 ; @@ -715,58 +647,16 @@ typedef struct sHSMHVinstance { double HSMHV_costi0 ; double HSMHV_costi0_p2 ; double HSMHV_costi1 ; - double HSMHV_ptl0; - double HSMHV_pt40; - double HSMHV_gdl0; + double HSMHV_ps0ldinib ; + double HSMHV_ps0ldinibs ; 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 */ @@ -1025,6 +915,9 @@ 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 */ @@ -1056,10 +949,7 @@ 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 ; @@ -1086,12 +976,7 @@ 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 ; @@ -1143,7 +1028,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 ; @@ -1286,6 +1171,7 @@ 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 ; @@ -1303,23 +1189,15 @@ 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 ; @@ -1327,6 +1205,7 @@ 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 ; @@ -1375,94 +1254,7 @@ 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 ; @@ -1491,7 +1283,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 ; @@ -1543,6 +1335,7 @@ 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 ; @@ -1564,16 +1357,6 @@ 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 ; @@ -1594,7 +1377,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 ; @@ -1646,6 +1429,7 @@ 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 ; @@ -1667,16 +1451,6 @@ 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 ; @@ -1697,7 +1471,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 ; @@ -1749,6 +1523,7 @@ 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 ; @@ -1770,30 +1545,13 @@ 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; @@ -1834,11 +1592,8 @@ 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; @@ -1865,12 +1620,7 @@ 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; @@ -1910,27 +1660,6 @@ 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; @@ -1942,6 +1671,7 @@ 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; @@ -2092,23 +1822,11 @@ 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; @@ -2117,6 +1835,7 @@ 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; @@ -2174,78 +1893,7 @@ 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; @@ -2274,6 +1922,7 @@ 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; @@ -2325,6 +1974,7 @@ 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; @@ -2346,16 +1996,6 @@ 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; @@ -2376,6 +2016,7 @@ 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; @@ -2427,6 +2068,7 @@ 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; @@ -2448,16 +2090,6 @@ 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; @@ -2478,6 +2110,7 @@ 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; @@ -2529,6 +2162,7 @@ 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; @@ -2550,23 +2184,13 @@ 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; @@ -2608,10 +2232,6 @@ 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 @@ -2687,12 +2307,7 @@ 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 */ @@ -2794,35 +2409,17 @@ 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 not used */ +/* #define HSMHV_MOD_TPOLYLD 477 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 +#define HSMHV_MOD_PGD3 189 #define HSMHV_MOD_PGD4 190 #define HSMHV_MOD_CLM1 191 #define HSMHV_MOD_CLM2 192 @@ -2884,7 +2481,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 @@ -2919,21 +2516,8 @@ 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 @@ -2953,8 +2537,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 @@ -2962,6 +2546,7 @@ 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 @@ -2988,77 +2573,7 @@ typedef struct sHSMHVmodel { /* model structure for a resistor */ #define HSMHV_MOD_CVDSOVER 480 - -#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 +#define HSMHV_MOD_SHEMAX 100 /* binning parameters */ #define HSMHV_MOD_LMIN 1000 @@ -3087,7 +2602,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 @@ -3139,7 +2654,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 @@ -3161,16 +2676,6 @@ 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 @@ -3191,7 +2696,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 @@ -3243,7 +2748,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 @@ -3265,16 +2770,6 @@ 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 @@ -3295,7 +2790,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 @@ -3347,7 +2842,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 @@ -3369,16 +2864,6 @@ 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 @@ -3442,8 +2927,6 @@ 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 2a720e701..8e838fc58 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvdel.c +++ b/src/spicelib/devices/hisimhv1/hsmhvdel.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvdel.c - DATE : 2014.6.11 + DATE : 2013.04.30 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 016ac8adf..d31b06616 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvdest.c +++ b/src/spicelib/devices/hisimhv1/hsmhvdest.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvdest.c - DATE : 2014.6.11 + DATE : 2013.04.30 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 5a2798fa3..d083ff320 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) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhveval.c - DATE : 2014.6.11 + DATE : 2013.04.30 released by Hiroshima University & @@ -25,36 +25,61 @@ 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. + +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. + +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. + +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. + +"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." + +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. -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) +June. 2008 (revised in June 2011) *************************************************************************/ /********************************************************************* @@ -135,8 +160,15 @@ June 2008 (revised October 2011) #define C_gidl_delta 0.5 /* local variables used in macro functions */ -double TMF0 , TMF1 , TMF2 , TMF3 , TMF4 , TMF5 , TMF6 ; -double TCF0 , TCF1 , TCF2 , TCF3 , TCF4 , TCF5 ; +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 /*===========================================================* * Exp() for PGD. @@ -256,115 +288,6 @@ double TCF0 , TCF1 , TCF2 , TCF3 , TCF4 , TCF5 ; 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. *-----------------*/ @@ -434,8 +357,6 @@ double TCF0 , TCF1 , TCF2 , TCF3 , TCF4 , TCF5 ; dx = - 2.0 * TMF3 / ( TMF2 * TMF2 ) ; \ } - - /*===========================================================* * Function hsmhvevaluate. *=================*/ @@ -450,7 +371,6 @@ int HSMHVevaluate double vbs_jct, double vbd_jct, double Vsubs, /* substrate-source voltage */ - double Vddp, /* drain-drainPrime voltage */ double deltemp, HSMHVinstance *here, HSMHVmodel *model, @@ -459,7 +379,7 @@ int HSMHVevaluate { HSMHVbinningParam *pParam = &here->pParam ; HSMHVmodelMKSParam *modelMKS = &model->modelMKS ; -/* HSMHVhereMKSParam *hereMKS = &here->hereMKS ;*/ + HSMHVhereMKSParam *hereMKS = &here->hereMKS ; /*-----------------------------------* * Constants for Smoothing functions *---------------*/ @@ -471,11 +391,12 @@ 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 psia2_dlt = 5.0e-3 ;*/ + const double psia_dlt = 1.0e-3 ; + const double psia2_dlt = 5.0e-3 ; const double psisti_dlt = 5.0e-3 ; /*---------------------------------------------------* @@ -484,12 +405,8 @@ 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 **/ @@ -517,7 +434,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-25 ; + const double small = 1.0e-50 ; const double small2= 1e-12 ; /* for Ra(Vdse) dependence */ const double c_exp_2 = 7.38905609893065 ; const double large_arg = 80 ; // log(1.0e100) ; @@ -525,6 +442,7 @@ 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 */ @@ -547,7 +465,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 ; @@ -574,10 +492,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 , 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 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 betaWL =0.0, betaWL_dVbs =0.0, betaWL_dVds =0.0, betaWL_dVgs =0.0, betaWL_dT =0.0 ; @@ -594,6 +512,9 @@ 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 */ @@ -621,7 +542,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 ; @@ -643,7 +564,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 ; + double Leff =0.0, Weff =0.0, WeffLD_nf =0.0, Ldrift =0.0 ; double Ldrift0 =0.0 ; double q_Nsub =0.0 ; /* PART-1 */ @@ -662,8 +583,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 */ @@ -698,6 +619,8 @@ 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; @@ -730,7 +653,6 @@ 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 ; @@ -751,8 +673,7 @@ 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 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 Ps0_min =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 ; @@ -764,8 +685,7 @@ 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 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 Isub_dVdse = 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 ; @@ -787,7 +707,20 @@ 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 ; @@ -826,14 +759,13 @@ 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; + double T12 =0.0, T12_dT =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 ; @@ -847,13 +779,12 @@ 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 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 QbsLD =0.0;/*, QbsLD_dVbs =0.0, QbsLD_dVds =0.0, QbsLD_dVgs =0.0, QbsLD_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 */ @@ -883,7 +814,7 @@ int HSMHVevaluate double Ra_alpha, Ra_beta ; /* modified external biases for symmetry */ - double Vzadd_ext_dVd = 0.0 ; + double /*Vzadd_ext = 0.0,*/ 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 ; @@ -902,39 +833,43 @@ 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 cnst0over_dT =0.0 ; - double cnst0overs_dT =0.0 ; + double ps0ldinib_dT =0.0, cnst0over_dT =0.0 ; + double ps0ldinibs_dT =0.0, 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, IdsIBPC_dVddp =0.0 ; + double IdsIBPC =0.0, IdsIBPC_dVbs =0.0, IdsIBPC_dVds =0.0, IdsIBPC_dVgs =0.0, IdsIBPC_dT =0.0 ; /* Qover */ int flg_ovzone = 0 ; - double VgpLD =0.0, VgpLD_dVgb =0.0 ; - double Vgb_fb_LD =0.0 ; + double VgpLD =0.0, VgpLD_dVgb =0.0 ; + double /*VthLD =0.0,*/ 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 ; @@ -945,20 +880,21 @@ 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_dVds =0.0, Ps0LD_dVgs =0.0, Ps0LD_dVbs =0.0 ; + double /*Ps0LD_dVbs =0.0,*/ Ps0LD_dVds =0.0; /*Ps0LD_dVgs =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 ; @@ -969,21 +905,28 @@ 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 ; - - 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 ; - + double Chi_B, Chi_B_dVgb, Chi_B_dVxb, Chi_B_dT;/*, Chi_B_dpsi , Chi_B_dgamma ;*/ + + /* 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.=================*/ @@ -999,7 +942,7 @@ int HSMHVevaluate T1 = Vdse + Vgse + Vbse + Vds + Vgs + Vbs + vbd_jct + vbs_jct ; if ( ! finite (T1) ) { fprintf (stderr , - "*** warning(HiSIM_HV(%s)): Unacceptable Bias(es).\n",model->HSMHVmodName ) ; + "*** warning(HiSIM_HV): Unacceptable Bias(es).\n" ) ; fprintf (stderr , "----- bias information (HiSIM_HV)\n" ) ; fprintf (stderr , "name: %s\n" , here->HSMHVname ) ; fprintf (stderr , "states: %d\n" , here->HSMHVstates ) ; @@ -1049,14 +992,6 @@ 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 */ @@ -1073,6 +1008,8 @@ 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 ; @@ -1080,9 +1017,8 @@ int HSMHVevaluate /* Surface impurity profile */ q_Nsub = here->HSMHV_qnsub ; - /* satulation Velocity */ + /* Velocity Temperature Dependence */ Vmax = here->HSMHV_vmax ; - /* 2 phi_B */ Pb2 = here->HSMHV_pb2 ; @@ -1103,9 +1039,6 @@ 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). *-----------------*/ @@ -1113,7 +1046,6 @@ 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 ; @@ -1197,38 +1129,6 @@ 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 ) { @@ -1237,7 +1137,6 @@ 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 */ @@ -1257,6 +1156,7 @@ 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. @@ -1274,6 +1174,7 @@ 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: */ @@ -1311,7 +1212,6 @@ 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 ; @@ -1339,8 +1239,14 @@ int HSMHVevaluate /* ... Vdse dependence */ T0 = VdseModeNML * here->HSMHV_rsvd + VdseModeRVS * here->HSMHV_rdvd ; T0_dT = VdseModeNML * Rsvd_dT + VdseModeRVS * Rdvd_dT ; - T4 = T4 + T0 * ( 2.0 * model->HSMHV_vzadd0 ) ; - T4_dT = T4_dT + T0_dT * ( 2.0 * model->HSMHV_vzadd0 ) ; +/* 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 ) ; +/* } */ /* ... Vgse dependence */ T10 = model->HSMHV_rdvg12 + small ; @@ -1367,7 +1273,6 @@ 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 ; @@ -1391,8 +1296,6 @@ 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 ; @@ -1408,7 +1311,6 @@ 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 ; @@ -1473,15 +1375,17 @@ int HSMHVevaluate /* Re-stamps for hsmhvnoi.c */ /* Please see hsmhvnoi.c */ T0 = VdseModeNML * Rd + VdseModeRVS * Rs ; /* mode-dependent --> geometrical */ - if ( T0 > Res_min && model->HSMHV_cothrml != 0 ) here->HSMHVdrainConductance = Mfactor / T0 ; + if ( T0 > 0.0 && model->HSMHV_cothrml != 0 ) here->HSMHVdrainConductance = Mfactor / T0 ; else here->HSMHVdrainConductance = 0.0 ; T0 = VdseModeNML * Rs + VdseModeRVS * Rd ; /* mode-dependent --> geometrical */ - if ( T0 > Res_min && model->HSMHV_cothrml != 0 ) here->HSMHVsourceConductance = Mfactor / T0 ; + if ( T0 > 0.0 && 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 ; @@ -1584,7 +1488,6 @@ 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 ; @@ -1625,19 +1528,16 @@ 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 ; @@ -1648,42 +1548,27 @@ int HSMHVevaluate } else { - 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) ; + 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) ; T2 = T2 + small ; - 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 ; + 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 ; 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 ; @@ -1749,11 +1634,94 @@ int HSMHVevaluate Vthp_dVg = Qb0_dVg * Cox_inv + Qb0 * Cox_inv_dVg ; Vthp_dT = Qb0_dT * Cox_inv + Qb0 * Cox_inv_dT + ptovr_dT ; - Pb20b = Pb20 ; - Pb20b_dVb = 0.0 ; - Pb20b_dVd = 0.0 ; - Pb20b_dVg = 0.0 ; - Pb20b_dT = 0.0 ; + 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 ; T0 = 0.95 ; T1 = T0 * Pb20b - Vbsz2 - 1.0e-3 ; @@ -1780,12 +1748,6 @@ 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 ) ; /*-------------------------------------------* @@ -1856,10 +1818,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 @@ -1895,7 +1857,6 @@ 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 ; @@ -1920,7 +1881,6 @@ 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 ; @@ -1954,10 +1914,9 @@ int HSMHVevaluate dVth_dT = dVthSC_dT + dVthLP_dT + dVthW_dT ; /*---------------------------------------------------* - * Vth : Threshold voltagei for OP. + * Vth : Threshold voltage. *-----------------*/ - T2 = sqrt( here->HSMHV_2qnsub_esi * (Pb2-Vbsz) ) ; - Vth = Pb2 + Vfb + T2 * Cox0_inv - dVth ; + Vth = Vthq - dVth ; /*-----------------------------------------------------------* * Constants in the equation of Ps0 . @@ -1967,62 +1926,117 @@ 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 ; - - if ( here->HSMHV_flg_pgd == 1 ) { - - T7 = Vgsz ; - T7_dVb = Vgsz_dVbs ; - T7_dVd = Vgsz_dVds ; - T7_dVg = Vgsz_dVgs ; - T7_dT = Vgsz_dT ; - - 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 ; - + dPpg_dT = 0.0 ; + } else { + T7 = Vgs ; + T7_dVd = 0.0 ; + T7_dVg = 1.0 ; + + T8 = Vds ; + T8_dVd = 1.0 ; + + T0 = here->HSMHV_cnstpgd ; + + 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 ; + + 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. @@ -2032,713 +2046,658 @@ 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 ) { - - /*---------------------------------------------------* - * depletion mode MOSFET - *------------------*/ - -#include "hsmhveval_dep.h" - - } else { - + /*---------------------------------------------------* - * normal mode MOSFET - *------------------*/ + * Vfbsft : Vfb shift (trial for Vbscl >> 0) + *-----------------*/ + Vfbsft = 0.0 ; + Vfbsft_dVbs = 0.0 ; + Vfbsft_dVds = 0.0 ; + Vfbsft_dVgs = 0.0 ; + + 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 ; + + /* Vgp assuming Qn0=0 */ + T3 = T2 * Cox_inv + T1 ; + T3_dT = T2_dT * Cox_inv + T1_dT ; + + /* 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 ; + + /* 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 ) { + /*-----------------------------------------------------------* + * Accumulation zone. (zone-A) + * - evaluate basic characteristics and exit from this part. + *-----------------*/ + if ( Vgs < Vgs_fb ) { - flg_zone = -1 ; + 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; - - - 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 ; + /*---------------------------------------------------* + * 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 = 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 ); + + 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 ; - - 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 ; - - 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 ) ; + 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 ) ; + + + 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 ; + + 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 ; - - 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 ; + 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 ; + + 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_dVb = Psa_dVbs - Vbscl_dVbs ; - T1_dVd = Psa_dVds ; - T1_dVg = Psa_dVgs ; - T1_dT = Psa_dT - Vbscl_dT ; - - 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 ; + 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 ) ) ; - 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; + T3_dT = 1.0 / T3 * T2 * T2_dT ; + + T9 = T2 / T3 / Ps0_min ; + T3_dVb = T9 * ( Psa_dVbs - Vbscl_dVbs ) ; + T3_dVd = T9 * ( Psa_dVds ) ; + T3_dVg = T9 * ( Psa_dVgs ) ; + + 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 ; - **/ - Pds = 0.0 ; - Pds_dVbs = 0.0 ; - Pds_dVds = 0.0 ; - Pds_dVgs = 0.0 ; - Pds_dT = 0.0 ; + 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 ; + **/ - 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 ; - - 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 ; - - Lred = 0.0e0 ; - Lred_dVbs = 0.0e0 ; - Lred_dVds = 0.0e0 ; - Lred_dVgs = 0.0e0 ; - Lred_dT = 0.0e0 ; + 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 ; + + 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 ; + + 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 ; + + VgVt = 0.0 ; + + flg_noqi = 1 ; - Ids = 0.0e0 ; - Ids_dVbs = 0.0e0 ; - Ids_dVds = 0.0e0 ; - Ids_dVgs = 0.0e0 ; - Ids_dT = 0.0e0 ; + goto end_of_part_1 ; + } - VgVt = 0.0 ; - - flg_noqi = 1 ; + + /*-----------------------------------------------------------* + * Initial guess for Ps0. + *-----------------*/ - goto end_of_part_1 ; - } - - /*-----------------------------------------------------------* - * 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 ) ) ; - - /* use analytical value in subthreshold region. */ - if ( Vgs < ( Vfb + Vth ) * 0.5 ) { - flg_pprv = 0 ; - } + /*---------------------------------------------------* + * 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 ; + } - 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 ; - } - 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 ; - } + } else { + TX_dVgs = 0.0 ; } + T2 = ( dVbs * dVbs ) / 2 * TX_dVbs + + ( dVds * dVds ) / 2 * TX_dVds + + ( dVgs * dVgs ) / 2 * TX_dVgs ; - T1 = Ps0_ini - Ps0 ; - if ( T1 < - dP_max || T1 > dP_max ) { - flg_pprv = 0 ; /* flag changes to analytical */ + if ( fabs( T2 ) < fabs( 0.5 * T1 ) ) { + Ps0_ini += T2 ; } else { - Ps0_iniA = Fn_Max( Ps0_ini , Ps0_iniA ) ; + flg_pprv = 1 ; } - } /* end of (flg_pprv >=1) if-block */ + } - if ( flg_pprv == 0 ) { + 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 */ - /*---------------------------------------------------* - * Analytical initial guess. - *-----------------*/ - /*-------------------------------------------* - * Common part. - *-----------------*/ - Chi = beta * ( Ps0_iniA - Vbscl ) ; + if ( flg_pprv == 0 ) { + + /*---------------------------------------------------* + * 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) ; - } - } + Fn_SU( Ps0_ini , Ps0_iniA, Ps0_iniB, c_ps0ini_2, T1) ; + } + } - TX = Vbscl + ps_conv / 2 ; - if ( Ps0_ini < TX ) Ps0_ini = TX ; - + TX = Vbscl + ps_conv / 2 ; + if ( Ps0_ini < TX ) Ps0_ini = TX ; - /*---------------------------------------------------* - * Assign initial guess. - *-----------------*/ - Ps0 = Ps0_ini ; - Psl_lim = Ps0_iniA ; + /*---------------------------------------------------* + * 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 ; + /*---------------------------------------------------* + * 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 ++ ) { + flg_conv = 0 ; + for ( lp_s0 = 1 ; lp_s0 <= lp_s0_max + 1 ; lp_s0 ++ ) { - Chi = beta * ( Ps0 - Vbscl ) ; + 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 ) ) ; + 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 ) ) ) ; + 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 ) ; + 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 ) ; + } 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 ; + Ps0 = Ps0 + dPs0 ; -// TX = Vbscl + ps_conv / 2 ; -// if ( Ps0 < TX ) Ps0 = TX ; + 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 ; - } + /*-------------------------------------------* + * 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 , + } /* 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): Went Over Iteration Maximum (Ps0)\n" ) ; + 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 (Ps0)\n", model->HSMHVmodName ) ; - } - } + if ( flg_info >= 2 ) { + printf( "*** warning(HiSIM_HV): Went Over Iteration Maximum (Ps0)\n" ) ; + } + } - /*---------------------------------------------------* - * 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 ; + /* 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 ; } 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 ; - } 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 ) ; + 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 ) ; + } - 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 ) ; + 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 ; - if ( Chi < znbd5 ) { + Chi_dT = beta_dT *( Ps0 - Vbscl ) + beta * ( Ps0_dT - Vbscl_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 ; - - 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 ; - - 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 ; + 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 ; + + 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 ; + + 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 { + /*-------------------------------------------* + * 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 ; + /*-----------------------------------* + * 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 ; - - 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 ) ; + 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 ) ; - } /* 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 ; - - /*-----------------------------------------------------------* - * 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 ; - - 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 + 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 ) ; - + * - 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 ; - /*-----------------------------------------------------------* - * 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; - - 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 ; + /*-----------------------------------------------------------* + * Qb0 : Qb at source side. + * Qn0 : Qi at source side. + *-----------------*/ - /** (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 */ - } + 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 ; - /*---------------------------------------------------* - * 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 ; + T2 = 1.0 / ( fs01 + epsm10 ) ; + + 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 ) ; + - /*-----------------------------------------------------------* - * 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 ; + /*-----------------------------------------------------------* + * 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; Qbu = Qb0 ; Qbu_dVbs = Qb0_dVb ; @@ -2746,1606 +2705,1571 @@ 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.0e0 ; + Lred_dVbs = 0.0e0 ; + Lred_dVds = 0.0e0 ; + Lred_dVgs = 0.0e0 ; + Lred_dT = 0.0e0 ; - Lred = 0.0 ; - Lred_dVbs = 0.0 ; - Lred_dVds = 0.0 ; - Lred_dVgs = 0.0 ; - Lred_dT = 0.0 ; + /** (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 ; + 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 ; - Ids = 0.0e0 ; - Ids_dVbs = 0.0e0 ; - Ids_dVds = 0.0e0 ; - Ids_dVgs = 0.0e0 ; - Ids_dT = 0.0e0 ; + 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 ; - } + 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 ; + + /*-----------------------------------------------------------* + * 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 ; - } + /*---------------------------------------------------* + * 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. - *-----------------*/ + /*-----------------------------------------------------------* + * 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 ; + T1 = Pds_dVbs * dVbs + Pds_dVds * dVds + Pds_dVgs * dVgs ; + Pds_ini = Pds + T1 ; - /* self heating */ + /* 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 ) + 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 ) + } 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 ; - } + } 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 */ + T1 = Pds_ini - Pds ; + if ( T1 < - dP_max || T1 > dP_max ) flg_pprv = 0 ; /* flag changes */ - } /* end of (flg_pprv>=1) if-block */ + } /* end of (flg_pprv>=1) if-block */ - if ( flg_pprv == 0 ) { - /*---------------------------------------------------* - * Analytical initial guess. - *-----------------*/ - Pds_max = Fn_Max( Psl_lim - Ps0 , 0.0e0 ) ; + 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 ) ; - } + 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 ; + 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 ; + /*---------------------------------------------------* + * 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 ; + /*---------------------------------------------------* + * 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 Psl calculation. (label) + *-----------------*/ start_of_loopl: - for ( lp_sl = 1 ; lp_sl <= lp_sl_max + 1 ; lp_sl ++ ) { + for ( lp_sl = 1 ; lp_sl <= lp_sl_max + 1 ; lp_sl ++ ) { - Chi = beta * ( Psl - Vbscl ) ; + Chi = beta * ( Psl - Vbscl ) ; - if ( Chi < znbd5 ) { - /*-------------------------------------------* - * zone-D2. (Psl) - * - Qb0 is approximated to 5-degree polynomial. - *-----------------*/ + 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 ) ; + 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 ) ; - } + } 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 ; + Fsl = Vgp - Psl - fac1 * fsl2 ; + Fsl_dPsl = - 1.0e0 - fac1 * fsl2_dPsl ; - if ( flg_conv == 1 ) break ; + if ( flg_conv == 1 ) break ; - dPsl = - Fsl / Fsl_dPsl ; + 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 ; + /*-------------------------------------------* + * 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 ; + } + TX = Vbscl + ps_conv / 2 ; + if ( Psl < TX ) Psl = TX ; - /*-------------------------------------------* - * 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 , + /*-------------------------------------------* + * 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(%s)): Went Over Iteration Maximum (Psl)\n", model->HSMHVmodName ) ; - } + 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 ; + /*---------------------------------------------------* + * 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 + 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 ; - } + 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 ; + 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 ; + 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 ; + 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 ; + 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) - *-----------------*/ + } 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 ; + 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 ; - - } + 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 ; + /*---------------------------------------------------* + * Assign Pds. + *-----------------*/ + Pds = Psl - Ps0 ; - /* if ( Pds < ps_conv ) { */ - if ( Pds < 0.0 ) { /* take care of numerical noise */ - Pds = 0.0 ; - 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 ; + 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 ; - } + /* 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; + /* 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 ; + /*-----------------------------------------------------------* + * 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 ; + /* 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 ; + /*---------------------------------------------------* + * 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 ; + /*-----------------------------------------------------------* + * 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 ; } - /*-----------------------------------------------------------* - * 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 ; + } 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 ; + } - 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 ; - } + /* 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 ; - } 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 ; - } + /*---------------------------------------------------* + * 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 ; - /* 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 ) ; - - - /*---------------------------------------------------* - * 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 ) + 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 ) + 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 ) ; - - 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 ; + 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 ; - /*-----------------------------------------------------------* - * 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. - *-----------------*/ - - 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 ; + /*-----------------------------------------------------------* + * 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 ; - 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. - *-----------------*/ - - 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 ( Qiu < 0.0 ) { - Qiu = 0.0 ; - Qiu_dVbs = 0.0 ; - Qiu_dVds = 0.0 ; - Qiu_dVgs = 0.0 ; - Qiu_dT = 0.0 ; - } + /*-----------------------------------------------------------* + * Interpolate charges and CLM for zone-D2. + *-----------------*/ - 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 ; + 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 ( 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 ; - /* 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(%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 ; - } + 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 ; + } - /*-----------------------------------------------------------* - * Muun : universal mobility. (CGS unit) - *-----------------*/ - - 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 ; + /*-----------------------------------------------------------* + * Muun : universal mobility. (CGS unit) + *-----------------*/ + + 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 ; - 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 ; - - 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 + 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 ; + + 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 + 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 ; - - - 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 ; - - 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 ; + /*-----------------------------------------------------------* + * 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 ; + + 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 ); - - /* 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 ) ; + 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 ; + + if ( 1.0e0 - epsm10 <= model->HSMHV_bb && model->HSMHV_bb <= 1.0e0 + epsm10 ) { + T5 = 1.0 / 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 = - 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 ; + 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 ) ; - - 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 ; - - /*-----------------------------------------------------------* - * 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 ; + /*-----------------------------------------------------------* + * 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 ; + + /* 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 ; - 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{ - T9 = 0.0 ; - T9_dVb = 0.0 ; - T9_dVd = 0.0 ; - T9_dVg = 0.0 ; - T9_dT = 0.0 ; - } - + T3 = T4 * ( model->HSMHV_rd20 + 1.0 ) ; + Fn_SU( T7 , T2 , T3 , delta_rd , T0 ) ; + T7_dVg = T2_dVg * T0 ; - 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 ; + T7 = here->HSMHV_rd23; + T7_dVg = 0.0e0 ; } - 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 + /* 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; - } 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 ) ; - + /* 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 { - 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 ; + T1 = pow( Vdse_eff + small2 , model->HSMHV_rd21 ) ; + T1_dVdse_eff = model->HSMHV_rd21 * pow( Vdse_eff + small2 , model->HSMHV_rd21 - 1.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, + + 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, 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 ; - - 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 ; - - 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 ; + 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 ; + + 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 ; - 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 ; - - 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 ; - - 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 += 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) ; - - 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 + 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 ;*/ + + 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 ; + + 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 ; + + 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 ; + + 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 ; + + 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 += 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 += 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) ; - - /* 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 += 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 ) ; - - 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 + 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 ; + + 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 ; + + 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 ; + + Fn_SZ( T1 , T1 , 1.0e-1 , T2 ) ; + 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 ) ; + + 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 + 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: - - /*-----------------------------------------------------------* - * 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 ; + /*----------------------------------------------------------* + * 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 ; + } - } // end of normal mode MOSFET - - /*----------------------------------------------------------* - * Evaluate integrated charges in unit [C]. - *----------------------*/ + /*-----------------------------------------------------------* + * End of PART-1. (label) + *-----------------*/ + end_of_part_1: + + /*----------------------------------------------------------* + * Evaluate integrated charges in unit [C]. + *----------------------*/ T1 = - here->HSMHV_weffcv_nf * Leff ; @@ -4354,22 +4278,19 @@ 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. @@ -4398,14 +4319,6 @@ 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 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ @@ -4414,7 +4327,7 @@ start_of_mobility: * Isub : substrate current induced by impact ionization. *-----------------*/ - if ( model->HSMHV_coisub == 0 ) { + if ( flg_noqi == 1 || model->HSMHV_coisub == 0 ) { /* Accumulation zone or nonconductive case, in which Ids==0. */ Isub = 0.0e0 ; Isub_dVbs = Isub_dVds = Isub_dVgs = 0.0e0 ; @@ -4436,7 +4349,7 @@ start_of_mobility: T3 = T8 / T7 ; T9 = 2.0 / T8 ; - T4 = T9 * T7 ; + T4 = 1.0e0 + T9 * T7 ; T2 = here->HSMHV_xvbs ; T5 = T1 - beta_inv - T2 * Vbsz ; @@ -4445,7 +4358,7 @@ start_of_mobility: T5_dVb = T1_dVb - T2 * Vbsz_dVbs; T5_dT = - beta_inv_dT + T1_dT - T2 * Vbsz_dT ; - T6 = 1.0 + T4 * T5 ; + T6 = T4 * T5 ; T6_dVd = T4 * T5_dVd ; T6_dVg = T4 * T5_dVg ; T6_dVb = T4 * T5_dVb ; @@ -4517,19 +4430,17 @@ start_of_mobility: *-----------------*/ T8 = here->HSMHV_subld1 ; if ( T8 != 0.0 ) { - T0 = Vddp ; - T0_dVb = 0.0e0 ; - T0_dVd = 0.0e0 ; - T0_dVg = 0.0e0 ; - T0_dT = 0.0e0 ; - T0_dVddp = 1.0e0 ; + 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 ; 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 ) ; @@ -4538,61 +4449,29 @@ 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 = Ldrift0 * modelMKS->HSMHV_subld2 ; + T7 = Ldrift * hereMKS->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_dVddp = T0_dVddp * T1 * T6 ; - - 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 ) ; + T2_dVdse = 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 ; } } @@ -4601,17 +4480,15 @@ start_of_mobility: /*---------------------------------------------------* * Impact-Ionization Induced Bulk Potential Change (IBPC) *-----------------*/ - if ( (Isub + IsubLD) > 0e0 && here->HSMHV_ibpc1 != 0e0 && model->HSMHV_codep==0 ) { + if ( flg_noqi == 0 && Isub > 0e0 && pParam->HSMHV_ibpc1 != 0e0 ) { /* delta Vbs */ T0 = 1e0 + pParam->HSMHV_ibpc2 * dVth ; - 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 ; + 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 ) ; /* dG3 & dG4 */ T10 = 1e0 / Xi0 ; @@ -4622,7 +4499,6 @@ 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 ; @@ -4633,7 +4509,6 @@ 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 ) ; @@ -4642,7 +4517,6 @@ 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 ) ; @@ -4650,7 +4524,6 @@ 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 ; @@ -4658,14 +4531,13 @@ 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) */ @@ -4878,7 +4750,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 ; @@ -5177,7 +5049,7 @@ start_of_mobility: Vgbgmt_dVbs = -1.0 ; Vgbgmt_dVds = 0.0 ; Vgbgmt_dVgs = 1.0 ; - Vxbgmt = - Vbs + epsm10 ; + Vxbgmt = - Vbs ; Vxbgmt_dVbs = -1.0 ; Vxbgmt_dVds = 0.0 ; Vxbgmt_dVgs = 0.0 ; @@ -5185,51 +5057,30 @@ 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 + 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 ) ; + Qovs = T4 * QsuLD ; + Qovs_dVds = T4 * QsuLD_dVds ; + Qovs_dVgs = T4 * QsuLD_dVgs ; + Qovs_dVbs = T4 * QsuLD_dVbs ; + Qovs_dT = T4 * QsuLD_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 ; - - 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 ) ; + QisLD_dT = T4 * QiuLD_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 */ @@ -5237,11 +5088,11 @@ start_of_mobility: Vgbgmt_dVbs = -1.0 ; Vgbgmt_dVds = 0.0 ; Vgbgmt_dVgs = 1.0 ; - Vxbgmt = - Vbse + epsm10 ; + Vxbgmt = - Vbse ; Vxbgmt_dVbs = -1.0 ; Vxbgmt_dVds = 0.0 ; Vxbgmt_dVgs = 0.0 ; - + #include "hsmhveval_qover.h" T4 = here->HSMHV_weffcv_nf * Lovers * CVDSOVER ; @@ -5250,19 +5101,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 */ } @@ -5332,7 +5183,7 @@ start_of_mobility: Vgbgmt_dVbs = -1.0 ; Vgbgmt_dVds = 0.0 ; Vgbgmt_dVgs = 1.0 ; - Vxbgmt = Vds - Vbs + epsm10 ; + Vxbgmt = Vds - Vbs ; Vxbgmt_dVbs = -1.0 ; Vxbgmt_dVds = 1.0 ; Vxbgmt_dVgs = 0.0 ; @@ -5340,50 +5191,28 @@ 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 + 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 ; + 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 ;*/ 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 + 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 ) ; + QbdLD = T4 * QbuLD ; + QbdLD_dVbs = T4 * QbuLD_dVbs ; + QbdLD_dVds = T4 * QbuLD_dVds ; + QbdLD_dVgs = T4 * QbuLD_dVgs ; + QbdLD_dT = T4 * QbuLD_dT ; if ( CVDSOVER != 0.0 ) { /* Qovdext begin */ @@ -5391,7 +5220,7 @@ start_of_mobility: Vgbgmt_dVbs = -1.0 ; Vgbgmt_dVds = 0.0 ; Vgbgmt_dVgs = 1.0 ; - Vxbgmt = Vdse - Vbse + epsm10 ; + Vxbgmt = Vdse - Vbse ; Vxbgmt_dVbs = -1.0 ; Vxbgmt_dVds = 1.0 ; Vxbgmt_dVgs = 0.0 ; @@ -5404,8 +5233,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 ; @@ -5498,8 +5327,410 @@ start_of_mobility: * PART-4: Substrate-source/drain junction diode. *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - /* move to hsmhveval_dio.c */ + + /*-----------------------------------------------------------* + * 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 ; + } + } 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) @@ -5635,7 +5866,7 @@ start_of_mobility: T1 = Qn0 / C_QE ; T2 = ( Cox + Qn0 / ( Ps0 - Vbscl ) + Cit ) * beta_inv / C_QE ; - T3 = -2.0E0 * Qi_noi / C_QE / Lch / here->HSMHV_weff_nf - T1 ; + T3 = -2.0E0 * Qi / 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 ; @@ -5651,7 +5882,7 @@ start_of_mobility: /*-----------------------------------------------------------* * thermal noise. *-----------------*/ - if ( model->HSMHV_cothrml != 0 && !flg_noqi && model->HSMHV_codep==0 ) { + if ( model->HSMHV_cothrml != 0 && !flg_noqi ) { Eyd = ( Psdl - Ps0 ) / Lch + small ; T12 = Muun * Eyd / 1.0e7 ; @@ -5685,7 +5916,7 @@ start_of_mobility: /*----------------------------------------------------------* * induced gate noise. ( Part 2/3 ) *----------------------*/ - if ( model->HSMHV_coign != 0 && model->HSMHV_cothrml != 0 && flg_ign == 1 && !flg_noqi && model->HSMHV_codep==0) { + if ( model->HSMHV_coign != 0 && model->HSMHV_cothrml != 0 && flg_ign == 1 && !flg_noqi ) { sqrtkusaiL = sqrt( kusaiL ) ; T2 = VgVt + sqrtkusaiL ; T3 = kusai00 * kusai00 ; @@ -5715,7 +5946,43 @@ 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 @@ -5729,7 +5996,7 @@ start_of_mobility: if ( flg_info >= 1 && (Ids_dVbs < 0.0 || T1 < 0.0 || Ids_dVgs < 0.0) ) { - printf( "*** warning(HiSIM_HV(%s)): Negative Conductance\n", model->HSMHVmodName ) ; + printf( "*** warning(HiSIM_HV): Negative Conductance\n" ) ; 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 ) ; @@ -5753,13 +6020,6 @@ 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. @@ -5969,13 +6229,7 @@ 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_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_dIsub_dVdse = Mfactor * Isub_dVdse ; here->HSMHV_igb = Mfactor * -Igb ; here->HSMHV_dIgb_dVdsi = - Mfactor * Igb_dVds ; @@ -6026,6 +6280,30 @@ 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. @@ -6037,9 +6315,9 @@ start_of_mobility: if ( ! finite (T1) ) { flg_err = 1 ; fprintf (stderr , - "*** warning(HiSIM_HV(%s)): FP-exception (PART-1)\n", model->HSMHVmodName ) ; + "*** warning(HiSIM_HV): FP-exception (PART-1)\n" ) ; if ( flg_info >= 1 ) { - printf ( "*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHVmodName) ; + printf ( "*** warning(HiSIM_HV): FP-exception\n") ; printf ( "Ids = %e\n" , here->HSMHV_ids ) ; printf ( "Gmbs = %e\n" , here->HSMHV_dIds_dVbsi ) ; printf ( "Gds = %e\n" , here->HSMHV_dIds_dVdsi ) ; @@ -6055,9 +6333,9 @@ start_of_mobility: if ( ! finite (T1) ) { flg_err = 1 ; fprintf (stderr , - "*** warning(HiSIM_HV(%s)): FP-exception (PART-2)\n", model->HSMHVmodName) ; + "*** warning(HiSIM_HV): FP-exception (PART-2)\n") ; if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHVmodName) ; + printf ("*** warning(HiSIM_HV): FP-exception\n") ; } } @@ -6065,18 +6343,28 @@ start_of_mobility: if ( ! finite (T1) ) { flg_err = 1 ; fprintf(stderr , - "*** warning(HiSIM_HV(%s)): FP-exception (PART-3)\n", model->HSMHVmodName) ; + "*** warning(HiSIM_HV): FP-exception (PART-3)\n") ; if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM_HV(%s)): FP-exception\n", model->HSMHVmodName) ; + printf ("*** warning(HiSIM_HV): FP-exception\n") ; } } + 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" @@ -6106,7 +6394,7 @@ start_of_mobility: /*----------------------------------------------------------* * induced gate noise. ( Part 3/3 ) *----------------------*/ - if ( model->HSMHV_coign != 0 && model->HSMHV_cothrml != 0 && flg_ign == 1 && !flg_noqi && model->HSMHV_codep==0 ) { + if ( model->HSMHV_coign != 0 && model->HSMHV_cothrml != 0 && flg_ign == 1 && !flg_noqi ) { 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 deleted file mode 100644 index 9dc1429f3..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhveval_dep.h +++ /dev/null @@ -1,2432 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhveval_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 deleted file mode 100644 index 329136444..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhveval_dio.c +++ /dev/null @@ -1,600 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhveval_dio.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * Substrate-source/drain junction diode - *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - -/*===========================================================* -* Preamble -*=================*/ -/*---------------------------------------------------* -* Header files -*-----------------*/ -#include "ngspice/ngspice.h" - -/*-----------------------------------* -* HiSIM macros -*-----------------*/ -#include "hisimhv.h" -#include "hsmhvevalenv.h" - -/*===========================================================* -* Function HSMHVdio -*=================*/ -int HSMHVdio -( - double vbs_jct, - double vbd_jct, - double deltemp, - HSMHVinstance *here, - HSMHVmodel *model, - CKTcircuit *ckt - ) -{ - HSMHVbinningParam *pParam = &here->pParam ; - - /* junction currents */ - double Ibs =0.0, Gbs =0.0, Ibs_dT =0.0 ; - double Ibd =0.0, Gbd =0.0, Ibd_dT =0.0 ; - - /* junction capacitances */ - double Qbs =0.0, Capbs =0.0, Qbs_dT =0.0 ; - double Qbd =0.0, Capbd =0.0, Qbd_dT =0.0 ; - double czbd =0.0, czbd_dT=0.0 ; - double czbdsw =0.0, czbdsw_dT=0.0 ; - double czbdswg =0.0, czbdswg_dT=0.0 ; - double czbs =0.0, czbs_dT=0.0 ; - double czbssw =0.0, czbssw_dT=0.0 ; - double czbsswg =0.0, czbsswg_dT=0.0 ; - double arg =0.0, sarg =0.0 ; - - /* temperature-dependent variables for SHE model */ - double log_Tratio =0.0 ; - double TTEMP =0.0, TTEMP0 =0.0 ; - double beta =0.0, beta_dT =0.0 ; - double beta_inv =0.0, beta_inv_dT =0.0 ; - double Eg =0.0, Eg_dT =0.0 ; - double js =0.0, js_dT =0.0 ; - double jssw =0.0, jssw_dT =0.0 ; - double js2 =0.0, js2_dT =0.0 ; - double jssw2 =0.0, jssw2_dT =0.0 ; - - double isbd_dT =0.0, isbs_dT =0.0 ; - double isbd2_dT =0.0, isbs2_dT =0.0 ; - double vbdt_dT =0.0, vbst_dT = 0.0 ; - double jd_expcd_dT =0.0 , jd_expcs_dT =0.0 ; - double jd_nvtm_invd_dT =0.0 , jd_nvtm_invs_dT =0.0 ; - double exptempd_dT = 0.0 , exptemps_dT = 0.0 ; - double tcjbd =0.0, tcjbs =0.0, - tcjbdsw =0.0, tcjbssw =0.0, - tcjbdswg =0.0, tcjbsswg =0.0 ; - - /* options */ - double Mfactor = here->HSMHV_m; - - /* Internal flags --------------------*/ - int flg_err = 0; /* error level */ - int flg_info = model->HSMHV_info; - - /* temporary vars. & derivatives */ - double TX =0.0 ; - double T0 =0.0, T0_dT =0.0 ; - double T1 =0.0, T1_dVb =0.0, T1_dT =0.0 ; - double T2 =0.0, T2_dVb =0.0, T2_dT =0.0 ; - double T3 =0.0, T3_dVb =0.0, T3_dT =0.0 ; - double T4 =0.0, T4_dT =0.0 ; - double T9 =0.0, T9_dT =0.0 ; - double T10 =0.0, T10_dT =0.0 ; - double T12 =0.0, T12_dT =0.0 ; - - - /*================ Start of executable code.=================*/ - - /*-----------------------------------------------------------* - * Temperature dependent constants. - *-----------------*/ - if ( here->HSMHVtempNode > 0 && pParam->HSMHV_rth0 != 0.0 ) { - -#define HSMHVEVAL -#include "hsmhvtemp_eval_dio.h" - - } else { - TTEMP = ckt->CKTtemp; - if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; } - } - - - /*-----------------------------------------------------------* - * Cbsj, Cbdj: node-base S/D biases. - *-----------------*/ - - /* ibd */ - T10 = model->HSMHV_cvbd * here->HSMHV_jd_nvtm_invd ; - T10_dT = model->HSMHV_cvbd * beta_dT / pParam->HSMHV_njd ; - - T9 = model->HSMHV_cisbd * here->HSMHV_exptempd ; - T9_dT = model->HSMHV_cisbd * exptempd_dT ; - T0 = here->HSMHV_isbd2 * T9 ; - T0_dT = here->HSMHV_isbd2 * T9_dT + isbd2_dT * T9 ; - - TX = - vbd_jct * T10 ; - T2 = exp ( TX ); - T2_dVb = - T2 * T10 ; - T2_dT = T2 * TX * beta_dT * beta_inv ; - - T3 = T2 ; - T3_dVb = T2_dVb ; - T3_dT = T2_dT ; - - if ( vbd_jct < here->HSMHV_vbdt ) { - TX = vbd_jct * here->HSMHV_jd_nvtm_invd ; - - if ( TX < - 3*EXP_THR ) { - T1 = 0.0 ; - T1_dVb = 0.0 ; - T1_dT = 0.0 ; - } else { - T1 = exp ( TX ) ; - T1_dVb = T1 * here->HSMHV_jd_nvtm_invd ; - T1_dT = T1 * TX * beta_dT * beta_inv ; - } - - Ibd = here->HSMHV_isbd * (T1 - 1.0) - + T0 * (T2 - 1.0) - + pParam->HSMHV_cisbkd * (T3 - 1.0); - Gbd = here->HSMHV_isbd * T1_dVb - + T0 * T2_dVb - + pParam->HSMHV_cisbkd * T3_dVb ; - Ibd_dT = here->HSMHV_isbd * T1_dT + isbd_dT * ( T1 - 1.0 ) - + T0 * T2_dT + T0_dT * ( T2 - 1.0 ) - + pParam->HSMHV_cisbkd * T3_dT ; - - } else { - T1 = here->HSMHV_jd_expcd ; - - T4 = here->HSMHV_isbd * here->HSMHV_jd_nvtm_invd * T1 ; - - Ibd = here->HSMHV_isbd * (T1 - 1.0) - + T4 * (vbd_jct - here->HSMHV_vbdt) - + T0 * (T2 - 1.0) - + pParam->HSMHV_cisbkd * (T3 - 1.0) ; - Gbd = T4 - + T0 * T2_dVb - + pParam->HSMHV_cisbkd * T3_dVb ; - - T1_dT = jd_expcd_dT ; - T4_dT = isbd_dT * here->HSMHV_jd_nvtm_invd * T1 - + here->HSMHV_isbd * jd_nvtm_invd_dT * T1 - + here->HSMHV_isbd * here->HSMHV_jd_nvtm_invd * T1_dT ; - Ibd_dT = isbd_dT * ( T1 - 1.0 ) + here->HSMHV_isbd * T1_dT - + T4_dT * ( vbd_jct - here->HSMHV_vbdt ) - T4 * vbdt_dT - + T0_dT * ( T2 - 1.0 ) + T0 * T2_dT - + pParam->HSMHV_cisbkd * T3_dT ; - } - T12 = model->HSMHV_divxd * here->HSMHV_isbd2 ; - Ibd += T12 * vbd_jct ; - Gbd += T12 ; - - T12_dT = model->HSMHV_divxd * isbd2_dT ; - Ibd_dT += T12_dT * vbd_jct ; - - /* ibs */ - T10 = model->HSMHV_cvbs * here->HSMHV_jd_nvtm_invs ; - T10_dT = model->HSMHV_cvbs * beta_dT / pParam->HSMHV_njs ; - - T9 = model->HSMHV_cisbs * here->HSMHV_exptemps ; - T9_dT = model->HSMHV_cisbs * exptemps_dT ; - T0 = here->HSMHV_isbs2 * T9 ; - T0_dT = here->HSMHV_isbs2 * T9_dT + isbs2_dT * T9 ; - - TX = - vbs_jct * T10 ; - T2 = exp ( TX ); - T2_dVb = - T2 * T10 ; - T2_dT = T2 * TX * beta_dT * beta_inv ; - - T3 = T2 ; - T3_dVb = T2_dVb ; - T3_dT = T2_dT ; - - if ( vbs_jct < here->HSMHV_vbst ) { - TX = vbs_jct * here->HSMHV_jd_nvtm_invs ; - if ( TX < - 3*EXP_THR ) { - T1 = 0.0 ; - T1_dVb = 0.0 ; - T1_dT = 0.0 ; - } else { - T1 = exp ( TX ) ; - T1_dVb = T1 * here->HSMHV_jd_nvtm_invs ; - T1_dT = T1 * TX * beta_dT * beta_inv ; - } - Ibs = here->HSMHV_isbs * (T1 - 1.0) - + T0 * (T2 - 1.0) - + pParam->HSMHV_cisbks * (T3 - 1.0); - Gbs = here->HSMHV_isbs * T1_dVb - + T0 * T2_dVb - + pParam->HSMHV_cisbks * T3_dVb ; - Ibs_dT = here->HSMHV_isbs * T1_dT + isbs_dT * ( T1 - 1.0 ) - + T0 * T2_dT + T0_dT * ( T2 - 1.0 ) - + pParam->HSMHV_cisbks * T3_dT ; - } else { - T1 = here->HSMHV_jd_expcs ; - - T4 = here->HSMHV_isbs * here->HSMHV_jd_nvtm_invs * T1 ; - - Ibs = here->HSMHV_isbs * (T1 - 1.0) - + T4 * (vbs_jct - here->HSMHV_vbst) - + T0 * (T2 - 1.0) - + pParam->HSMHV_cisbks * (T3 - 1.0) ; - Gbs = T4 - + T0 * T2_dVb - + pParam->HSMHV_cisbks * T3_dVb ; - - T1_dT = jd_expcs_dT ; - T4_dT = isbs_dT * here->HSMHV_jd_nvtm_invs * T1 - + here->HSMHV_isbs * jd_nvtm_invs_dT * T1 - + here->HSMHV_isbs * here->HSMHV_jd_nvtm_invs * T1_dT ; - Ibs_dT = isbs_dT * ( T1 - 1.0 ) + here->HSMHV_isbs * T1_dT - + T4_dT * ( vbs_jct - here->HSMHV_vbst) - T4 * vbst_dT - + T0_dT * ( T2 - 1.0 ) + T0 * T2_dT - + pParam->HSMHV_cisbks * T3_dT ; - } - T12 = model->HSMHV_divxs * here->HSMHV_isbs2 ; - Ibs += T12 * vbs_jct ; - Gbs += T12 ; - - T12_dT = model->HSMHV_divxs * isbs2_dT ; - Ibs_dT += T12_dT * vbs_jct ; - - - /*-----------------------------------------------------------* - * Charges and Capacitances. - *-----------------*/ - /* charge storage elements - * bulk-drain and bulk-source depletion capacitances - * czbd : zero bias drain junction capacitance - * czbs : zero bias source junction capacitance - * czbdsw:zero bias drain junction sidewall capacitance - * czbssw:zero bias source junction sidewall capacitance - */ - - /* Source Bulk Junction */ - tcjbs = model->HSMHV_tcjbs ; - tcjbssw = model->HSMHV_tcjbssw ; - tcjbsswg = model->HSMHV_tcjbsswg ; - - czbs = model->HSMHV_cjs * here->HSMHV_as ; - czbs = czbs * ( 1.0 + tcjbs * ( TTEMP - model->HSMHV_ktnom )) ; - czbs_dT = ( model->HSMHV_cjs * here->HSMHV_as ) * tcjbs ; - - if (here->HSMHV_ps > here->HSMHV_weff_nf) { - czbssw = model->HSMHV_cjsws * ( here->HSMHV_ps - here->HSMHV_weff_nf ) ; - czbssw = czbssw * ( 1.0 + tcjbssw * ( TTEMP - model->HSMHV_ktnom )) ; - czbssw_dT = ( model->HSMHV_cjsws * ( here->HSMHV_ps - here->HSMHV_weff_nf )) * tcjbssw ; - - czbsswg = model->HSMHV_cjswgs * here->HSMHV_weff_nf ; - czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSMHV_ktnom )) ; - czbsswg_dT = ( model->HSMHV_cjswgs * here->HSMHV_weff_nf ) * tcjbsswg ; - -// if (vbs_jct == 0.0) { - if (0) { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = czbs + czbssw + czbsswg ; - } else if (vbs_jct < 0.0) { - if (czbs > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pbs ; - if (model->HSMHV_mjs == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjs ) ; - Qbs = model->HSMHV_pbs * czbs * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjs) ; - Qbs_dT = model->HSMHV_pbs * czbs_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjs) ; - Capbs = czbs * sarg ; - } else { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = 0.0 ; - } - if (czbssw > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pbsws ; - if (model->HSMHV_mjsws == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjsws ) ; - Qbs += model->HSMHV_pbsws * czbssw * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjsws) ; - Qbs_dT += model->HSMHV_pbsws * czbssw_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjsws) ; - Capbs += czbssw * sarg ; - } - if (czbsswg > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pbswgs ; - if (model->HSMHV_mjswgs == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjswgs ) ; - Qbs += model->HSMHV_pbswgs * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgs) ; - Qbs_dT += model->HSMHV_pbswgs * czbsswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgs) ; - Capbs += czbsswg * sarg ; - } - } else { - T1 = czbs + czbssw + czbsswg ; - T1_dT = czbs_dT + czbssw_dT + czbsswg_dT ; - T2 = czbs * model->HSMHV_mjs / model->HSMHV_pbs - + czbssw * model->HSMHV_mjsws / model->HSMHV_pbsws - + czbsswg * model->HSMHV_mjswgs / model->HSMHV_pbswgs ; - T2_dT = czbs_dT * model->HSMHV_mjs / model->HSMHV_pbs - + czbssw_dT * model->HSMHV_mjsws / model->HSMHV_pbsws - + czbsswg_dT * model->HSMHV_mjswgs / model->HSMHV_pbswgs ; - Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ; - Qbs_dT = vbs_jct * (T1_dT + vbs_jct * 0.5 * T2_dT) ; - Capbs = T1 + vbs_jct * T2 ; - } - } else { - czbsswg = model->HSMHV_cjswgs * here->HSMHV_ps ; - czbsswg = czbsswg * ( 1.0 + tcjbsswg * ( TTEMP - model->HSMHV_ktnom )) ; - czbsswg_dT = ( model->HSMHV_cjswgs * here->HSMHV_ps ) * tcjbsswg ; - -// if (vbs_jct == 0.0) { - if (0) { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = czbs + czbsswg ; - } else if (vbs_jct < 0.0) { - if (czbs > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pbs ; - if (model->HSMHV_mjs == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjs ) ; - Qbs = model->HSMHV_pbs * czbs * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjs) ; - Qbs_dT = model->HSMHV_pbs * czbs_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjs) ; - Capbs = czbs * sarg ; - } else { - Qbs = 0.0 ; - Qbs_dT = 0.0 ; - Capbs = 0.0 ; - } - if (czbsswg > 0.0) { - arg = 1.0 - vbs_jct / model->HSMHV_pbswgs ; - if (model->HSMHV_mjswgs == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjswgs ) ; - Qbs += model->HSMHV_pbswgs * czbsswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgs) ; - Qbs_dT += model->HSMHV_pbswgs * czbsswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgs) ; - Capbs += czbsswg * sarg ; - } - } else { - T1 = czbs + czbsswg ; - T1_dT = czbs_dT + czbsswg_dT ; - T2 = czbs * model->HSMHV_mjs / model->HSMHV_pbs - + czbsswg * model->HSMHV_mjswgs / model->HSMHV_pbswgs ; - T2_dT = czbs_dT * model->HSMHV_mjs / model->HSMHV_pbs - + czbsswg_dT * model->HSMHV_mjswgs / model->HSMHV_pbswgs ; - Qbs = vbs_jct * (T1 + vbs_jct * 0.5 * T2) ; - Qbs_dT = vbs_jct * (T1_dT + vbs_jct * 0.5 * T2_dT) ; - Capbs = T1 + vbs_jct * T2 ; - } - } - - /* Drain Bulk Junction */ - tcjbd = model->HSMHV_tcjbd ; - tcjbdsw = model->HSMHV_tcjbdsw ; - tcjbdswg = model->HSMHV_tcjbdswg ; - - czbd = model->HSMHV_cjd * here->HSMHV_ad ; - czbd = czbd * ( 1.0 + tcjbd * ( TTEMP - model->HSMHV_ktnom )) ; - czbd_dT = ( model->HSMHV_cjd * here->HSMHV_ad ) * tcjbd ; - - if (here->HSMHV_pd > here->HSMHV_weff_nf) { - - czbdsw = model->HSMHV_cjswd * ( here->HSMHV_pd - here->HSMHV_weff_nf ) ; - czbdsw = czbdsw * ( 1.0 + tcjbdsw * ( TTEMP - model->HSMHV_ktnom )) ; - czbdsw_dT = ( model->HSMHV_cjswd * ( here->HSMHV_pd - here->HSMHV_weff_nf )) * tcjbdsw ; - - czbdswg = model->HSMHV_cjswgd * here->HSMHV_weff_nf ; - czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSMHV_ktnom )) ; - czbdswg_dT = ( model->HSMHV_cjswgd * here->HSMHV_weff_nf ) * tcjbdswg ; - -// if (vbd_jct == 0.0) { - if (0) { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = czbd + czbdsw + czbdswg ; - } else if (vbd_jct < 0.0) { - if (czbd > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pbd ; - if (model->HSMHV_mjd == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjd ) ; - Qbd = model->HSMHV_pbd * czbd * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjd) ; - Qbd_dT = model->HSMHV_pbd * czbd_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjd) ; - Capbd = czbd * sarg ; - } else { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = 0.0 ; - } - if (czbdsw > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pbswd ; - if (model->HSMHV_mjswd == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjswd ) ; - Qbd += model->HSMHV_pbswd * czbdsw * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswd) ; - Qbd_dT += model->HSMHV_pbswd * czbdsw_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswd) ; - Capbd += czbdsw * sarg ; - } - if (czbdswg > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pbswgd ; - if (model->HSMHV_mjswgd == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjswgd ) ; - Qbd += model->HSMHV_pbswgd * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgd) ; - Qbd_dT += model->HSMHV_pbswgd * czbdswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgd) ; - Capbd += czbdswg * sarg ; - - } - } else { - T1 = czbd + czbdsw + czbdswg ; - T1_dT = czbd_dT + czbdsw_dT + czbdswg_dT ; - T2 = czbd * model->HSMHV_mjd / model->HSMHV_pbd - + czbdsw * model->HSMHV_mjswd / model->HSMHV_pbswd - + czbdswg * model->HSMHV_mjswgd / model->HSMHV_pbswgd ; - T2_dT = czbd_dT * model->HSMHV_mjd / model->HSMHV_pbd - + czbdsw_dT * model->HSMHV_mjswd / model->HSMHV_pbswd - + czbdswg_dT * model->HSMHV_mjswgd / model->HSMHV_pbswgd ; - Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ; - Qbd_dT = vbd_jct * (T1_dT + vbd_jct * 0.5 * T2_dT) ; - Capbd = T1 + vbd_jct * T2 ; - } - - } else { - czbdswg = model->HSMHV_cjswgd * here->HSMHV_pd ; - czbdswg = czbdswg * ( 1.0 + tcjbdswg * ( TTEMP - model->HSMHV_ktnom )) ; - czbdswg_dT = ( model->HSMHV_cjswgd * here->HSMHV_pd ) * tcjbdswg ; - -// if (vbd_jct == 0.0) { - if (0) { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = czbd + czbdswg ; - } else if (vbd_jct < 0.0) { - if (czbd > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pbd ; - if (model->HSMHV_mjd == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjd ) ; - Qbd = model->HSMHV_pbd * czbd * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjd) ; - Qbd_dT = model->HSMHV_pbd * czbd_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjd) ; - Capbd = czbd * sarg ; - } else { - Qbd = 0.0 ; - Qbd_dT = 0.0 ; - Capbd = 0.0 ; - } - if (czbdswg > 0.0) { - arg = 1.0 - vbd_jct / model->HSMHV_pbswgd ; - if (model->HSMHV_mjswgd == 0.5) - sarg = 1.0 / sqrt(arg) ; - else - sarg = Fn_Pow( arg , -model->HSMHV_mjswgd ) ; - Qbd += model->HSMHV_pbswgd * czbdswg * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgd) ; - Qbd_dT += model->HSMHV_pbswgd * czbdswg_dT * (1.0 - arg * sarg) / (1.0 - model->HSMHV_mjswgd) ; - Capbd += czbdswg * sarg ; - } - } else { - T1 = czbd + czbdswg ; - T1_dT = czbd_dT + czbdswg_dT ; - T2 = czbd * model->HSMHV_mjd / model->HSMHV_pbd - + czbdswg * model->HSMHV_mjswgd / model->HSMHV_pbswgd ; - T2_dT = czbd_dT * model->HSMHV_mjd / model->HSMHV_pbd - + czbdswg_dT * model->HSMHV_mjswgd / model->HSMHV_pbswgd ; - Qbd = vbd_jct * (T1 + vbd_jct * 0.5 * T2) ; - Qbd_dT = vbd_jct * (T1_dT + vbd_jct * 0.5 * T2_dT) ; - Capbd = T1 + vbd_jct * T2 ; - } - } - - - /*---------------------------------------------------* - * Junction diode. - *-----------------*/ - here->HSMHV_ibs = Mfactor * Ibs ; - here->HSMHV_ibd = Mfactor * Ibd ; - here->HSMHV_gbs = Mfactor * Gbs ; - here->HSMHV_gbd = Mfactor * Gbd ; - *(ckt->CKTstate0 + here->HSMHVqbs) = Mfactor * Qbs ; - *(ckt->CKTstate0 + here->HSMHVqbd) = Mfactor * Qbd ; - here->HSMHV_capbs = Mfactor * Capbs ; - here->HSMHV_capbd = Mfactor * Capbd ; - - here->HSMHV_gbdT = Mfactor * Ibd_dT ; - here->HSMHV_gbsT = Mfactor * Ibs_dT ; - here->HSMHV_gcbdT = Mfactor * Qbd_dT ; - here->HSMHV_gcbsT = Mfactor * Qbs_dT ; - - /*-----------------------------------------------------------* - * Warn floating-point exceptions. - * - Function finite() in libm is called. - *-----------------*/ - T1 = here->HSMHV_ibs + here->HSMHV_ibd + here->HSMHV_gbs + here->HSMHV_gbd; - T1 = T1 + *(ckt->CKTstate0 + here->HSMHVqbs) - + *(ckt->CKTstate0 + here->HSMHVqbd) - + here->HSMHV_capbs - + here->HSMHV_capbd; - if ( ! finite (T1) ) { - flg_err = 1 ; - fprintf(stderr , - "*** warning(HiSIM_HV(%s)): FP-exception (junction diode)\n",model->HSMHVmodName) ; - if ( flg_info >= 1 ) { - printf ("*** warning(HiSIM_HV(%s)): FP-exception\n",model->HSMHVmodName) ; - } - } - - /*-----------------------------------------------------------* - * End of HSMHVeval_dio - *-----------------*/ - - return ( HiSIM_OK ) ; - -} diff --git a/src/spicelib/devices/hisimhv1/hsmhveval_qover.h b/src/spicelib/devices/hisimhv1/hsmhveval_qover.h index 80f25b69f..8b6f7ef64 100644 --- a/src/spicelib/devices/hisimhv1/hsmhveval_qover.h +++ b/src/spicelib/devices/hisimhv1/hsmhveval_qover.h @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhveval_qover.h - DATE : 2014.6.11 + DATE : 2013.04.30 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 */ /*---------------------------------------------------* @@ -103,7 +61,7 @@ June 2008 (revised October 2011) /*-----------------------------------* * QsuLD: total charge = Accumulation | Depletion+inversion *-----------------*/ - if ( VgpLD < Vgb_fb_LD ){ + if ( VgpLD < Vgb_fb_LD ){ /*---------------------------* * Accumulation *-----------------*/ @@ -136,23 +94,16 @@ June 2008 (revised October 2011) Ac3_dVgb = T1 * Ac31_dVgb ; Ac3_dT = T1 * Ac31_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 ); + 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 = -Ac31 + Ac2 ; - Ac1_dVxb = Ac2_dVxb -Ac31_dVxb ; - Ac1_dVgb = Ac2_dVgb -Ac31_dVgb ; - Ac1_dT = Ac2_dT -Ac31_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 ) ; Acd = pow( Ac1 , C_1o3 ) ; T1 = C_1o3 / ( Acd * Acd ) ; @@ -320,14 +271,14 @@ June 2008 (revised October 2011) 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; @@ -360,8 +311,8 @@ June 2008 (revised October 2011) 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) @@ -370,10 +321,10 @@ June 2008 (revised October 2011) - (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 * @@ -522,7 +473,7 @@ June 2008 (revised October 2011) *-----------------*/ if ( flg_conv == 0 ) { fprintf( stderr , - "*** warning(HiSIM_HV(%s)): Went Over Iteration Maximum (Ps0LD)\n",model->HSMHVmodName ) ; + "*** warning(HiSIM_HV): Went Over Iteration Maximum (Ps0LD)\n" ) ; fprintf( stderr , " -Vxbgmtcl = %e Vgbgmt = %e\n" , -Vxbgmtcl , Vgbgmt ) ; } @@ -626,7 +577,7 @@ June 2008 (revised October 2011) 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; @@ -665,9 +616,9 @@ June 2008 (revised October 2011) } /* 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 deleted file mode 100644 index 23edb6127..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhveval_rdrift.c +++ /dev/null @@ -1,656 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhveval_rdrift.c - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -/*===========================================================* -* Preamble. -*=================*/ -/*---------------------------------------------------* -* Header files. -*-----------------*/ -#include "ngspice/ngspice.h" -#ifdef __STDC__ -/* #include */ -#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 3dfec731d..5dd2ef485 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvevalenv.h +++ b/src/spicelib/devices/hisimhv1/hsmhvevalenv.h @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvevalenv.h - DATE : 2014.6.11 + DATE : 2013.04.30 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 @@ -130,13 +88,4 @@ June 2008 (revised October 2011) #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 72971ccad..7ba0be7ba 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) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvext.h - DATE : 2014.6.11 + DATE : 2013.04.30 released by Hiroshima University & diff --git a/src/spicelib/devices/hisimhv1/hsmhvgetic.c b/src/spicelib/devices/hisimhv1/hsmhvgetic.c index 678450b20..68b751e46 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvgetic.c +++ b/src/spicelib/devices/hisimhv1/hsmhvgetic.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvgetic.c - DATE : 2014.6.11 + DATE : 2013.04.30 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 8173e6a58..27a3cad2a 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvitf.h +++ b/src/spicelib/devices/hisimhv1/hsmhvitf.h @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvitf - DATE : 2014.6.11 + DATE : 2013.04.30 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 acd1e0350..5aff325ef 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvld.c +++ b/src/spicelib/devices/hisimhv1/hsmhvld.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvld.c - DATE : 2014.6.11 + DATE : 2013.04.30 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" @@ -205,7 +163,7 @@ static void ShowPhysVals int HSMHVload( GENmodel *inModel, - CKTcircuit *ckt) + register CKTcircuit *ckt) /* actually load the current value into the * sparse matrix previously provided */ @@ -213,8 +171,8 @@ int HSMHVload( register HSMHVmodel *model = (HSMHVmodel*)inModel; register HSMHVinstance *here; HSMHVbinningParam *pParam; - HSMHVmodelMKSParam *modelMKS ; - HSMHVhereMKSParam *hereMKS ; +/* HSMHVmodelMKSParam *modelMKS ;*/ +/* HSMHVhereMKSParam *hereMKS ;*/ @@ -248,17 +206,12 @@ 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 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 dIsub_dVdse=0.0, dIsubs_dVdse=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 , dIddp_dVds =0.0, dIddp_dVgs =0.0, dIddp_dVbs =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 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 ; @@ -275,10 +228,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, dRd_dVddp=0.0, dRd_dVds=0.0, dRd_dVgs=0.0, dRd_dVbs=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 ; 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, GD_dVddp=0.0, GD_dVdse=0.0, GD_dVgse=0.0, GD_dVbse=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 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; @@ -296,9 +249,8 @@ 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 ; @@ -306,6 +258,7 @@ 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 @@ -410,12 +363,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; @@ -425,6 +378,7 @@ 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); @@ -443,7 +397,7 @@ int HSMHVload( vdbd = *(ckt->CKTstate0 + here->HSMHVvdbd); vsbs = *(ckt->CKTstate0 + here->HSMHVvsbs); if (flg_subNode > 0) vsubs = *(ckt->CKTstate0 + here->HSMHVvsubs); - if( here->HSMHV_coselfheat > 0 ){ + if( flg_tempNode > 0 ){ deltemp = *(ckt->CKTstate0 + here->HSMHVdeltemp); } vdse = *(ckt->CKTstate0 + here->HSMHVvdse) ; @@ -469,7 +423,7 @@ int HSMHVload( vdbd = *(ckt->CKTstate1 + here->HSMHVvdbd); vsbs = *(ckt->CKTstate1 + here->HSMHVvsbs); if (flg_subNode > 0) vsubs = *(ckt->CKTstate1 + here->HSMHVvsubs); - if( here->HSMHV_coselfheat > 0 ){ + if( flg_tempNode > 0 ){ deltemp = *(ckt->CKTstate1 + here->HSMHVdeltemp); } vdse = *(ckt->CKTstate1 + here->HSMHVvdse) ; @@ -497,7 +451,7 @@ int HSMHVload( vds = 0.1; } if (flg_subNode > 0) vsubs = 0.0; - if( here->HSMHV_coselfheat > 0 ) deltemp=0.0; + if( flg_tempNode > 0 ) deltemp=0.0; vdse = vds ; vgse = vgs ; Qi_nqs = Qb_nqs = 0.0 ; @@ -506,7 +460,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( here->HSMHV_coselfheat > 0 ) deltemp=0.0; + if( flg_tempNode > 0 ) deltemp=0.0; vdse = vds ; vgse = vgs ; Qi_nqs = Qb_nqs = 0.0 ; @@ -557,7 +511,7 @@ int HSMHVload( vsubs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVvsubs)) - ( xfact * (*(ckt->CKTstate2 + here->HSMHVvsubs))); } - if( here->HSMHV_coselfheat > 0 ){ + if( flg_tempNode > 0 ){ deltemp = (1.0 + xfact)* (*(ckt->CKTstate1 + here->HSMHVdeltemp)) - ( xfact * (*(ckt->CKTstate2 + here->HSMHVdeltemp))); @@ -617,7 +571,7 @@ int HSMHVload( * (*(ckt->CKTrhsOld + here->HSMHVsubNode) - *(ckt->CKTrhsOld + here->HSMHVsNode)); } - if( here->HSMHV_coselfheat > 0 ){ + if( flg_tempNode > 0 ){ deltemp = *(ckt->CKTrhsOld + here->HSMHVtempNode); } vbse = model->HSMHV_type * @@ -654,7 +608,7 @@ int HSMHVload( #ifndef NOBYPASS /* start of bypass section ... no bypass in case of selfheating */ - if ( !(ckt->CKTmode & MODEINITPRED) && ckt->CKTbypass && !here->HSMHV_coselfheat) { + if ( !(ckt->CKTmode & MODEINITPRED) && ckt->CKTbypass && !model->HSMHV_coselfheat) { delvds = vds - *(ckt->CKTstate0 + here->HSMHVvds) ; delvgs = vgs - *(ckt->CKTstate0 + here->HSMHVvgs) ; delvbs = vbs - *(ckt->CKTstate0 + here->HSMHVvbs) ; @@ -694,7 +648,7 @@ int HSMHVload( gds = here->HSMHV_dIds_dVdsi ; gm = here->HSMHV_dIds_dVgsi ; gmbs = here->HSMHV_dIds_dVbsi ; - gmT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIds_dTi : 0.0 ; + gmT = (flg_tempNode > 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; @@ -702,73 +656,51 @@ int HSMHVload( dIsub_dVds = here->HSMHV_dIsub_dVdsi ; dIsub_dVgs = here->HSMHV_dIsub_dVgsi ; dIsub_dVbs = here->HSMHV_dIsub_dVbsi ; - dIsub_dT = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; + dIsub_dT = (flg_tempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; + dIsub_dVdse = here->HSMHV_dIsub_dVdse ; Isubs = 0.0 ; dIsubs_dVds = 0.0 ; dIsubs_dVgs = 0.0 ; dIsubs_dVbs = 0.0 ; dIsubs_dT = 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 ; + dIsubs_dVdse = 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; + dIgidl_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; + dIgisl_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; + dIgd_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; + dIgs_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; + dIgb_dT = (flg_tempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; Ibd = here->HSMHV_ibd ; Gbd = here->HSMHV_gbd ; - Gbdt = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbdT : 0.0 ; + Gbdt = (flg_tempNode > 0) ? here->HSMHV_gbdT : 0.0 ; Ibs = here->HSMHV_ibs ; Gbs = here->HSMHV_gbs ; - Gbst = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbsT : 0.0 ; + Gbst = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? - here->HSMHV_dIds_dTi : 0.0 ; + gmT = (flg_tempNode > 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; @@ -777,72 +709,51 @@ 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 = (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 ; + dIsubs_dT = (flg_tempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; + dIsubs_dVdse = - here->HSMHV_dIsub_dVdse ; /* = - (dIsub_dVdse + dIsub_dVbse + dIsub_dVgse) */ 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; + dIgidl_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; + dIgisl_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; + dIgd_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; + dIgs_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; + dIgb_dT = (flg_tempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; Ibd = here->HSMHV_ibd ; Gbd = here->HSMHV_gbd ; - Gbdt = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbdT : 0.0 ; + Gbdt = (flg_tempNode > 0) ? here->HSMHV_gbdT : 0.0 ; Ibs = here->HSMHV_ibs ; Gbs = here->HSMHV_gbs ; - Gbst = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbsT : 0.0 ; + Gbst = (flg_tempNode > 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 ; @@ -855,6 +766,7 @@ 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) ; @@ -998,7 +910,7 @@ int HSMHVload( } } - if( here->HSMHV_coselfheat > 0 ){ + if( flg_tempNode > 0 ){ /* Logarithmic damping of deltemp beyond LIM_TOL */ deltemp_old = *(ckt->CKTstate0 + here->HSMHVdeltemp); if (deltemp > deltemp_old + LIM_TOL) @@ -1025,9 +937,6 @@ 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)); @@ -1052,7 +961,6 @@ int HSMHVload( vbpsb = model->HSMHV_type * (*(ckt->CKTrhsOld+here->HSMHVbNodePrime) - *(ckt->CKTrhsOld+here->HSMHVsbNode)); - } #ifdef DEBUG_HISIMHVLD_VX @@ -1108,7 +1016,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" , (here->HSMHV_coselfheat) ? "true" : "false" ) ; + printf( "coselfheat = %s\n" , (model->HSMHV_coselfheat) ? "true" : "false" ) ; } /* print inputs ------------AA */ @@ -1122,14 +1030,9 @@ int HSMHVload( #endif /* call model evaluation */ - if ( HSMHVevaluate(ivdse,ivgse,ivbse,ivds, ivgs, ivbs, vbs_jct, vbd_jct, vsubs, vddp, deltemp, here, model, ckt) == HiSIM_ERROR ) + if ( HSMHVevaluate(ivdse,ivgse,ivbse,ivds, ivgs, ivbs, vbs_jct, vbd_jct, vsubs, 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 ) ; @@ -1143,26 +1046,22 @@ 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 = (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 ; + dRd_dT = (flg_tempNode > 0) ? here->HSMHV_dRd_dTi : 0.0 ; 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dRs_dTi : 0.0 ; + dRs_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIds_dTi : 0.0 ; + gmT = (flg_tempNode > 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 ; @@ -1171,32 +1070,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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQdi_dTi : 0.0 ; + dQd_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQg_dTi : 0.0 ; + dQg_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQsi_dTi : 0.0 ; + dQs_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQb_dTi : 0.0 ; + dQb_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dqdp_dTi : 0.0 ; + dQfd_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dqsp_dTi : 0.0 ; + dQfs_dT = (flg_tempNode > 0) ? here->HSMHV_dqsp_dTi : 0.0 ; Qdext = here->HSMHV_qdext ; dQdext_dVdse = here->HSMHV_dQdext_dVdse ; @@ -1208,7 +1107,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 ; @@ -1222,82 +1121,60 @@ 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; + dIsub_dT = (flg_tempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; + dIsub_dVdse = here->HSMHV_dIsub_dVdse ; Isubs = 0.0 ; dIsubs_dVds = 0.0 ; dIsubs_dVgs = 0.0 ; dIsubs_dVbs = 0.0 ; dIsubs_dT = 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 ; + dIsubs_dVdse = 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; + dIgidl_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; + dIgisl_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; + dIgd_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; + dIgs_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; + dIgb_dT = (flg_tempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; /*---------------------------------------------------* * Junction diode. *-----------------*/ Ibd = here->HSMHV_ibd ; Gbd = here->HSMHV_gbd ; - Gbdt = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbdT : 0.0 ; + Gbdt = (flg_tempNode > 0) ? here->HSMHV_gbdT : 0.0 ; /* Qbd = here->HSMHV_qbd ; */ Qbd = *(ckt->CKTstate0 + here->HSMHVqbd) ; Cbd = here->HSMHV_capbd ; - Cbdt = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gcbdT : 0.0 ; + Cbdt = (flg_tempNode > 0) ? here->HSMHV_gcbdT : 0.0 ; Ibs = here->HSMHV_ibs ; Gbs = here->HSMHV_gbs ; - Gbst = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbsT : 0.0 ; + Gbst = (flg_tempNode > 0) ? here->HSMHV_gbsT : 0.0 ; /* Qbs = here->HSMHV_qbs ; */ Qbs = *(ckt->CKTstate0 + here->HSMHVqbs) ; Cbs = here->HSMHV_capbs ; - Cbst = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gcbsT : 0.0 ; + Cbst = (flg_tempNode > 0) ? here->HSMHV_gcbsT : 0.0 ; if (flg_nqs) { tau = here->HSMHV_tau ; @@ -1331,26 +1208,22 @@ 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 = (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 ; + dRd_dT = (flg_tempNode > 0) ? here->HSMHV_dRd_dTi : 0.0 ; 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dRs_dTi : 0.0 ; + dRs_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? - here->HSMHV_dIds_dTi : 0.0 ; + gmT = (flg_tempNode > 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; @@ -1359,32 +1232,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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQsi_dTi : 0.0 ; + dQd_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQg_dTi : 0.0 ; + dQg_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQdi_dTi : 0.0 ; + dQs_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dQb_dTi : 0.0 ; + dQb_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dqsp_dTi : 0.0 ; + dQfd_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dqdp_dTi : 0.0 ; + dQfs_dT = (flg_tempNode > 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); @@ -1396,7 +1269,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 ; @@ -1411,83 +1284,61 @@ 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 = (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 ; + dIsubs_dT = (flg_tempNode > 0) ? here->HSMHV_dIsub_dTi : 0.0 ; + dIsubs_dVdse = - here->HSMHV_dIsub_dVdse ; /* = - (dIsub_dVdse + dIsub_dVbse + dIsub_dVgse) */ 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgisl_dTi : 0.0 ; + dIgidl_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgidl_dTi : 0.0 ; + dIgisl_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgs_dTi : 0.0 ; + dIgd_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgd_dTi : 0.0 ; + dIgs_dT = (flg_tempNode > 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 = (here->HSMHV_coselfheat > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; + dIgb_dT = (flg_tempNode > 0) ? here->HSMHV_dIgb_dTi : 0.0 ; /*---------------------------------------------------* * Junction diode. *-----------------*/ Ibd = here->HSMHV_ibd ; Gbd = here->HSMHV_gbd ; - Gbdt = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbdT : 0.0 ; + Gbdt = (flg_tempNode > 0) ? here->HSMHV_gbdT : 0.0 ; /* Qbd = here->HSMHV_qbd ; */ Qbd = *(ckt->CKTstate0 + here->HSMHVqbd) ; Cbd = here->HSMHV_capbd ; - Cbdt = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gcbdT : 0.0 ; + Cbdt = (flg_tempNode > 0) ? here->HSMHV_gcbdT : 0.0 ; Ibs = here->HSMHV_ibs ; Gbs = here->HSMHV_gbs ; - Gbst = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gbsT : 0.0 ; + Gbst = (flg_tempNode > 0) ? here->HSMHV_gbsT : 0.0 ; /* Qbs = here->HSMHV_qbs ; */ Qbs = *(ckt->CKTstate0 + here->HSMHVqbs) ; Cbs = here->HSMHV_capbs ; - Cbst = (here->HSMHV_coselfheat > 0) ? here->HSMHV_gcbsT : 0.0 ; + Cbst = (flg_tempNode > 0) ? here->HSMHV_gcbsT : 0.0 ; if (flg_nqs) { tau = here->HSMHV_tau ; @@ -1518,7 +1369,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ } } /* end of reverse mode */ - if (here->HSMHV_coselfheat > 0) { + if (flg_tempNode > 0) { if (pParam->HSMHV_rth > C_RTH_MIN) { Gth = 1.0/pParam->HSMHV_rth ; } else { @@ -1642,29 +1493,21 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ /*---------------------------------------------------* * External Resistances *-----------------*/ - if(model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3 || model->HSMHV_cordrift == 1 ) { + if(model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3 ) { if(Rd > 0){ GD = 1.0/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_dVgs = - dRd_dVgse /Rd/Rd; + GD_dVds = - dRd_dVdse /Rd/Rd; + GD_dVbs = - dRd_dVbse /Rd/Rd; GD_dVsubs = - dRd_dVsubs /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; + GD_dT = - dRd_dT /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; @@ -1682,16 +1525,13 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ GS_dT =0.0; } } - Iddp = GD * vddp; - dIddp_dVddp = GD_dVddp * vddp + GD ; - dIddp_dVdse = GD_dVdse * vddp; - dIddp_dVgse = GD_dVgse * vddp; - dIddp_dVbse = GD_dVbse * vddp; + Iddp = GD * vddp; + dIddp_dVddp = GD; + dIddp_dVdse = GD_dVds * vddp; + dIddp_dVgse = GD_dVgs * vddp; + dIddp_dVbse = GD_dVbs * vddp; dIddp_dVsubs= GD_dVsubs * vddp; - dIddp_dT = GD_dT * vddp; - dIddp_dVds = GD_dVds * vddp; - dIddp_dVgs = GD_dVgs * vddp; - dIddp_dVbs = GD_dVbs * vddp; + dIddp_dT = GD_dT * vddp; Issp = GS * vssp; dIssp_dVssp = GS; @@ -1811,7 +1651,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 (here->HSMHV_coselfheat > 0) + if (flg_tempNode > 0) x[tempNode] = *(ckt->CKTrhsOld+here->HSMHVtempNode); else x[tempNode] = 0.0; @@ -1833,10 +1673,6 @@ 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 ; @@ -1856,6 +1692,8 @@ 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 ; @@ -1885,25 +1723,6 @@ 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 ; @@ -1948,7 +1767,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ /* drain node */ - i_d = Iddp - Ibd + IsubLD + IdsIBPC - IdsIBPCs ; + i_d = Iddp - Ibd ; /* intrinsic drain node */ i_dP = -Iddp + Ids + Isub + Igidl - Igd ; /* gate node */ @@ -1956,11 +1775,11 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ /* intrinsic gate node */ i_gP = - Iggp + Igd + Igs + Igb ; /* source node */ - i_s = Issp - Ibs + IsubLDs - IdsIBPC + IdsIBPCs ; + i_s = Issp - Ibs ; /* intrinsic source node */ i_sP = - Issp - Ids + Isubs + Igisl - Igs ; /* intrinsic bulk node */ - i_bP = - Isub - Isubs - IsubLD - IsubLDs- Igidl -Igb - Igisl + Ibpdb + Ibpb + Ibpsb ; + i_bP = - Isub - Isubs - Igidl -Igb - Igisl + Ibpdb + Ibpb + Ibpsb ; /* base node */ i_b = - Ibpb ; /* drain bulk node */ @@ -1968,7 +1787,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ /* source bulk node */ i_sb = Ibs - Ibpsb ; /* temp node */ - if (here->HSMHV_coselfheat > 0){ + if (flg_tempNode > 0){ i_t = Ith - P ; } else { i_t = 0.0; @@ -1988,31 +1807,30 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ } /* drain node */ - 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[dNode] = dIddp_dVddp + dIddp_dVdse + Gbd ; + ydc_d[dNodePrime] = -dIddp_dVddp ; /* ydc_d[gNode] = 0.0 ; */ - ydc_d[gNodePrime] = dIddp_dVgse + dIddp_dVgs + dIsubLD_dVgs + dIdsIBPC_dVgs - dIdsIBPCs_dVgs ; + ydc_d[gNodePrime] = dIddp_dVgse ; ydc_d[sNode] = - ( dIddp_dVdse + dIddp_dVgse + dIddp_dVbse ) - dIddp_dVsubs ; - 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[sNodePrime] = 0.0 ; */ + ydc_d[bNodePrime] = dIddp_dVbse ; /* 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 + dIsubLD_dT + dIdsIBPC_dT - dIdsIBPCs_dT ; + ydc_d[tempNode] = dIddp_dT - Gbdt ; /* intrinsic drain node */ - 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[dNode] = - (dIddp_dVddp + dIddp_dVdse) + gds_ext + dIsub_dVdse ; + ydc_dP[dNodePrime] = dIddp_dVddp + gds + dIsub_dVds + dIgidl_dVds - dIgd_dVd ; /* ydc_dP[gNode] = 0.0; */ - ydc_dP[gNodePrime] = -dIddp_dVgse - dIddp_dVgs + gm_ext + ydc_dP[gNodePrime] = -dIddp_dVgse + 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); + ydc_dP[sNode] = dIddp_dVdse + dIddp_dVgse + dIddp_dVbse + dIddp_dVsubs + (-gds_ext -gm_ext -gmbs_ext) - dIsub_dVdse; ydc_dP[sNodePrime] = -( gds + dIsub_dVds + dIgidl_dVds ) - ( gm + dIsub_dVgs + dIgidl_dVgs ) - - ( 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_dVs ; + ydc_dP[bNodePrime] = - dIddp_dVbse + gmbs_ext + gmbs + dIsub_dVbs + dIgidl_dVbs - dIgd_dVb; /* ydc_dP[bNode] = 0.0; */ /* ydc_dP[dbNode] = 0.0 ; */ @@ -2048,26 +1866,26 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ ydc_gP[tempNode] = dIgd_dT + dIgs_dT + dIgb_dT ; /* source node */ - 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[dNode] = dIssp_dVdse; + /* ydc_s[dNodePrime] = 0.0 */ /* ydc_s[gNode] = 0.0 */ - 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[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[bNode] = 0.0 */ /* ydc_s[dbNode] = 0.0 */ ydc_s[sbNode] = - Gbs ; ydc_s[subNode] = dIssp_dVsubs; - ydc_s[tempNode] = dIssp_dT - Gbst + dIsubLDs_dT - dIdsIBPC_dT + dIdsIBPCs_dT ; + ydc_s[tempNode] = dIssp_dT - Gbst; /* intrinsic source node */ - ydc_sP[dNode] = - dIssp_dVdse -gds_ext ; + ydc_sP[dNode] = - dIssp_dVdse -gds_ext + dIsubs_dVdse ; 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); + ydc_sP[sNode] = - dIssp_dVssp - ( - dIssp_dVdse - dIssp_dVgse - dIssp_dVbse ) + dIssp_dVsubs +(gds_ext + gm_ext + gmbs_ext) - dIsubs_dVdse; ydc_sP[sNodePrime] = dIssp_dVssp - ( - gds + dIsubs_dVds + dIgisl_dVds ) - ( - gm + dIsubs_dVgs + dIgisl_dVgs ) - ( - gmbs + dIsubs_dVbs + dIgisl_dVbs ) - dIgs_dVs ; @@ -2081,19 +1899,19 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ - gmT + dIsubs_dT + dIgisl_dT - dIgs_dT; /* intrinsic bulk node */ - 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[dNode] = - dIsub_dVdse - dIsubs_dVdse ; + ydc_bP[dNodePrime] = - dIsub_dVds - dIsubs_dVds - dIgidl_dVds - dIgb_dVd - dIgisl_dVds ; /* ydc_bP[gNode] = 0.0 ; */ - 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[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[bNode] = - dIbpb_dVbpb ; ydc_bP[dbNode] = - dIbpdb_dVbpdb ; ydc_bP[sbNode] = - dIbpsb_dVbpsb ; - ydc_bP[tempNode] = - dIsub_dT - dIsubs_dT - dIsubLD_dT - dIsubLDs_dT - dIgidl_dT - dIgb_dT - dIgisl_dT ; + ydc_bP[tempNode] = - dIsub_dT - dIsubs_dT - dIgidl_dT - dIgb_dT - dIgisl_dT ; /* bulk node */ /* ydc_b[dNode] = 0.0 ; */ @@ -2648,7 +2466,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( here->HSMHV_coselfheat > 0) { + if( flg_tempNode > 0) { *(ckt->CKTrhs + here->HSMHVtempNode) -= cur_t; /* temp node independent of model type! */ } if (flg_nqs) { @@ -2670,7 +2488,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ if (flg_subNode > 0) { *(here->HSMHVDsubPtr) += ydc_d[subNode]; } - if( here->HSMHV_coselfheat > 0) { + if( flg_tempNode > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVDtempPtr) += model->HSMHV_type * (ydc_d[tempNode] + ag0*ydyn_d[tempNode]); } @@ -2685,7 +2503,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ if (flg_subNode > 0) { *(here->HSMHVDPsubPtr) += ydc_dP[subNode]; } - if( here->HSMHV_coselfheat > 0) { + if( flg_tempNode > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVDPtempPtr) += model->HSMHV_type * (ydc_dP[tempNode] + ag0*ydyn_dP[tempNode]); } @@ -2705,7 +2523,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( here->HSMHV_coselfheat > 0) { + if( flg_tempNode > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVGPtempPtr) += model->HSMHV_type * (ydc_gP[tempNode] + ag0*ydyn_gP[tempNode]); } @@ -2725,7 +2543,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ if (flg_subNode > 0) { *(here->HSMHVSsubPtr) += ydc_s[subNode]; } - if( here->HSMHV_coselfheat > 0) { + if( flg_tempNode > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVStempPtr) += model->HSMHV_type * (ydc_s[tempNode]+ ag0*ydyn_s[tempNode]); } @@ -2740,7 +2558,7 @@ line755: /* standard entry if HSMHVevaluate is bypassed */ if (flg_subNode > 0) { *(here->HSMHVSPsubPtr) += ydc_sP[subNode]; } - if( here->HSMHV_coselfheat > 0) { + if( flg_tempNode > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVSPtempPtr) += model->HSMHV_type * (ydc_sP[tempNode] + ag0*ydyn_sP[tempNode]); } @@ -2758,7 +2576,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( here->HSMHV_coselfheat > 0) { + if( flg_tempNode > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVBPtempPtr) += model->HSMHV_type * (ydc_bP[tempNode] + ag0*ydyn_bP[tempNode]); } @@ -2774,7 +2592,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( here->HSMHV_coselfheat > 0) { + if( flg_tempNode > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVDBtempPtr) += model->HSMHV_type * (ydc_db[tempNode] + ag0*ydyn_db[tempNode]); } @@ -2783,13 +2601,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( here->HSMHV_coselfheat > 0) { + if( flg_tempNode > 0) { /* temp entries in matrix dependent on model type */ *(here->HSMHVSBtempPtr) += model->HSMHV_type * (ydc_sb[tempNode] + ag0*ydyn_sb[tempNode]); } /*temp*/ - if( here->HSMHV_coselfheat > 0) { + if( flg_tempNode > 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]); @@ -2809,7 +2627,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 ( here->HSMHV_coselfheat > 0 ) { /* self heating */ + if ( flg_tempNode > 0 ) { /* self heating */ *(here->HSMHVQItempPtr) += (ydc_qi[tempNode] + ag0*ydyn_qi[tempNode]); } @@ -2819,7 +2637,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 ( here->HSMHV_coselfheat > 0 ) { /* self heating */ + if ( flg_tempNode > 0 ) { /* self heating */ *(here->HSMHVQBtempPtr) += (ydc_qb[tempNode] + ag0*ydyn_qb[tempNode]); } } @@ -2830,8 +2648,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 6375bfc5f..ba9a5c3e8 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) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.10 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvld_info_eval.h - DATE : 2014.6.11 + DATE : 2013.04.30 recent changes: - 2009.01.09 some bugfixes @@ -17,48 +17,6 @@ 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 71d7a6e7b..e959c9222 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvmask.c +++ b/src/spicelib/devices/hisimhv1/hsmhvmask.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvmask.c - DATE : 2014.6.11 + DATE : 2013.04.30 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" @@ -166,18 +124,6 @@ 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); @@ -247,24 +193,9 @@ 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); @@ -403,6 +334,9 @@ 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); @@ -814,6 +748,9 @@ 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); @@ -861,47 +798,12 @@ 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); @@ -968,6 +870,12 @@ 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); @@ -986,6 +894,9 @@ 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); @@ -1081,262 +992,9 @@ 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: @@ -1413,6 +1071,9 @@ 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); @@ -1566,6 +1227,9 @@ 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); @@ -1629,36 +1293,6 @@ 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: @@ -1715,6 +1349,9 @@ 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); @@ -1868,6 +1505,9 @@ 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); @@ -1931,36 +1571,6 @@ 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: @@ -2017,6 +1627,9 @@ 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); @@ -2170,6 +1783,9 @@ 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); @@ -2233,36 +1849,6 @@ 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 2734adb3e..f5c76db70 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvmdel.c +++ b/src/spicelib/devices/hisimhv1/hsmhvmdel.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvmdel.c - DATE : 2014.6.11 + DATE : 2013.04.30 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 4e0de4a09..3258c7ab2 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvmpar.c +++ b/src/spicelib/devices/hisimhv1/hsmhvmpar.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvmpar.c - DATE : 2014.6.11 + DATE : 2013.04.30 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" @@ -194,22 +152,6 @@ 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; @@ -302,30 +244,10 @@ 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; @@ -510,6 +432,10 @@ 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; @@ -1058,6 +984,10 @@ 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; @@ -1114,14 +1044,6 @@ 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; @@ -1130,44 +1052,6 @@ 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; @@ -1180,6 +1064,14 @@ 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; @@ -1204,6 +1096,10 @@ 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; @@ -1404,263 +1300,11 @@ 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 */ @@ -1762,6 +1406,10 @@ 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; @@ -1966,6 +1614,10 @@ 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; @@ -2051,46 +1703,6 @@ 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: @@ -2165,6 +1777,10 @@ 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; @@ -2369,6 +1985,10 @@ 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; @@ -2454,46 +2074,6 @@ 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: @@ -2568,6 +2148,10 @@ 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; @@ -2772,6 +2356,10 @@ 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; @@ -2858,119 +2446,6 @@ 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 091f1a654..86789e4bb 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvnoi.c +++ b/src/spicelib/devices/hisimhv1/hsmhvnoi.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvnoi.c - DATE : 2014.6.11 + DATE : 2013.04.30 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" @@ -76,9 +34,6 @@ June 2008 (revised October 2011) * 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, @@ -123,10 +78,8 @@ int HSMHVnoise ( case N_DENS: for ( i = 0; i < HSMHVNSRCS; i++ ) { (void) sprintf(name, "onoise.%s%s", - (char *)here->HSMHVname, HSMHVnNames[i]); - data->namelist = - (IFuid *) trealloc((char *) data->namelist, - (data->numPlots + 1) * sizeof(IFuid)); + here->HSMHVname, HSMHVnNames[i]); + data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); if (!data->namelist) return(E_NOMEM); (*(SPfrontEnd->IFnewUid)) @@ -137,10 +90,8 @@ int HSMHVnoise ( case INT_NOIZ: for ( i = 0; i < HSMHVNSRCS; i++ ) { (void) sprintf(name, "onoise_total.%s%s", - (char *)here->HSMHVname, HSMHVnNames[i]); - data->namelist = - (IFuid *) trealloc((char *) data->namelist, - (data->numPlots + 1) * sizeof(IFuid)); + here->HSMHVname, HSMHVnNames[i]); + data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); if (!data->namelist) return(E_NOMEM); (*(SPfrontEnd->IFnewUid)) @@ -148,10 +99,8 @@ int HSMHVnoise ( (IFuid) NULL, name, UID_OTHER, NULL); (void) sprintf(name, "inoise_total.%s%s", - (char *)here->HSMHVname, HSMHVnNames[i]); - data->namelist = - (IFuid *) trealloc((char *) data->namelist, - (data->numPlots + 1) * sizeof(IFuid)); + here->HSMHVname, HSMHVnNames[i]); + data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1); if (!data->namelist) return(E_NOMEM); (*(SPfrontEnd->IFnewUid)) @@ -172,7 +121,7 @@ int HSMHVnoise ( TTEMP = TTEMP + *(ckt->CKTstate0 + here->HSMHVdeltemp) ; /* rs/rd thermal noise */ - if ( model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3 || model->HSMHV_cordrift == 1 ) { + if ( model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3 ) { 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 be3ba8c01..24388523d 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvpar.c +++ b/src/spicelib/devices/hisimhv1/hsmhvpar.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvpar.c - DATE : 2014.6.11 + DATE : 2013.04.30 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 764f0d133..b657da4df 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvpzld.c +++ b/src/spicelib/devices/hisimhv1/hsmhvpzld.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvpzld.c - DATE : 2014.6.11 + DATE : 2013.04.30 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" @@ -66,11 +24,11 @@ June 2008 (revised October 2011) int HSMHVpzLoad( GENmodel *inModel, - CKTcircuit *ckt, - SPcomplex *s) + register CKTcircuit *ckt, + register SPcomplex *s) { - HSMHVmodel *model = (HSMHVmodel*)inModel; - HSMHVinstance *here; + register HSMHVmodel *model = (HSMHVmodel*)inModel; + register 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 85dd0186a..830554a73 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvset.c +++ b/src/spicelib/devices/hisimhv1/hsmhvset.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvset.c - DATE : 2014.6.11 + DATE : 2013.04.30 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" @@ -74,45 +32,28 @@ June 2008 (revised October 2011) + model->HSMHV_l##param / Lbin + model->HSMHV_w##param / Wbin \ + model->HSMHV_p##param / LWbin ; -#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 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 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 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 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( - SMPmatrix *matrix, - GENmodel *inModel, - CKTcircuit *ckt, + register SMPmatrix *matrix, + register GENmodel *inModel, + register CKTcircuit *ckt, int *states) /* load the HSMHV device structure with those pointers needed later * for fast matrix loading */ { - HSMHVmodel *model = (HSMHVmodel*)inModel; - HSMHVinstance *here; + register HSMHVmodel *model = (HSMHVmodel*)inModel; + register HSMHVinstance *here; int error=0 ; CKTnode *tmp; double T2, Rd, Rs ; @@ -122,7 +63,6 @@ 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 */ @@ -134,23 +74,17 @@ int HSMHVsetup( model->HSMHV_noise = 1; if ( !model->HSMHV_version_Given) { - model->HSMHV_version = "2.20" ; - printf("HiSIM_HV(%s): 2.20 is selected for VERSION. (default) \n",model->HSMHVmodName); - model->HSMHV_subversion = 2 ; + model->HSMHV_version = "1.24" ; + printf(" 1.24 is selected for VERSION. (default) \n"); } else { - 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 ; + 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"); } else { - printf("warning(HiSIM_HV(%s)): invalid version %s is specified, reseted 2.20 \n", - model->HSMHVmodName,model->HSMHV_version); - model->HSMHV_subversion = 2 ; + printf(" %s is selected for VERSION \n", model->HSMHV_version); } } - if ( !model->HSMHV_corsrd_Given ) model->HSMHV_corsrd = 3 ; if ( !model->HSMHV_corg_Given ) model->HSMHV_corg = 0 ; @@ -172,34 +106,14 @@ 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(HiSIM_HV(%s)): CORBNET has been set to its default value: %d.\n", - model->HSMHVmodName,model->HSMHV_corbnet); + printf("warning(HiSIMHV): CORBNET has been set to its default value: %d.\n", 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_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_coldrift_Given ) model->HSMHV_coldrift = 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 ; @@ -207,15 +121,14 @@ 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 = 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_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_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 = 0.0 ; + if ( !model->HSMHV_rdslp1_Given ) model->HSMHV_rdslp1 = 1.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 ; @@ -225,18 +138,13 @@ 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_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_ddltmax_Given ) model->HSMHV_ddltmax = 10.0 ; /* 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 = 3e16 ; - if ( !model->HSMHV_novers_Given ) model->HSMHV_novers = 1e17 ; + if ( !model->HSMHV_nover_Given ) model->HSMHV_nover = 3.0e16 ; + if ( !model->HSMHV_novers_Given ) model->HSMHV_novers = 0.0 ; if ( !model->HSMHV_xwd_Given ) model->HSMHV_xwd = 0.0 ; if ( !model->HSMHV_xwdc_Given ) model->HSMHV_xwdc = model->HSMHV_xwd ; @@ -260,28 +168,29 @@ 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 = 2.0 ; + if ( !model->HSMHV_xqy2_Given ) model->HSMHV_xqy2 = 0.0 ; if ( !model->HSMHV_rs_Given ) model->HSMHV_rs = 0.0 ; - if ( !model->HSMHV_rd_Given ) model->HSMHV_rd = 0.0 ; + if ( !model->HSMHV_rd_Given ) model->HSMHV_rd = 5.0e-3 ; 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 = 3.0e17 ; + if ( !model->HSMHV_nsubc_Given ) model->HSMHV_nsubc = 5.0e17 ; if ( !model->HSMHV_parl2_Given ) model->HSMHV_parl2 = 10.0e-9 ; - if ( !model->HSMHV_lp_Given ) model->HSMHV_lp = 15e-9 ; + if ( !model->HSMHV_lp_Given ) model->HSMHV_lp = 0.0 ; 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 = 0.0 ; + if ( !model->HSMHV_scp1_Given ) model->HSMHV_scp1 = 1.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 = 0.0 ; + if ( !model->HSMHV_sc1_Given ) model->HSMHV_sc1 = 1.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 ; @@ -292,7 +201,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 = 20.0e3 ; + if (model->HSMHV_type == NMOS) model->HSMHV_mueph1 = 25.0e3 ; else model->HSMHV_mueph1 = 9.0e3 ; } if ( !model->HSMHV_muephw_Given ) model->HSMHV_muephw = 0.0 ; @@ -307,7 +216,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 = 6.0e14 ; + if ( !model->HSMHV_muesr1_Given ) model->HSMHV_muesr1 = 1.0e16 ; 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 ; @@ -320,8 +229,8 @@ int HSMHVsetup( else model->HSMHV_bb = 1.0 ; } - if ( !model->HSMHV_sub1_Given ) model->HSMHV_sub1 = 10 ; - if ( !model->HSMHV_sub2_Given ) model->HSMHV_sub2 = 25 ; + if ( !model->HSMHV_sub1_Given ) model->HSMHV_sub1 = 10.0 ; + if ( !model->HSMHV_sub2_Given ) model->HSMHV_sub2 = 25.0 ; 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 ; @@ -343,7 +252,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 = 5.0e17 ; + if ( !model->HSMHV_nsti_Given ) model->HSMHV_nsti = 1.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 ; @@ -361,7 +270,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 = 5.0e17 ; + if ( !model->HSMHV_npext_Given ) model->HSMHV_npext = 1.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 ; @@ -388,9 +297,10 @@ 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 = 50e-3 ; + if ( !model->HSMHV_clm1_Given ) model->HSMHV_clm1 = 0.7 ; 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 ; @@ -401,7 +311,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 = 2.0 ; + if ( !model->HSMHV_qme2_Given ) model->HSMHV_qme2 = 0.0 ; if ( !model->HSMHV_qme3_Given ) model->HSMHV_qme3 = 0.0 ; if ( !model->HSMHV_vovers_Given ) model->HSMHV_vovers = 0.0 ; @@ -423,8 +333,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 = 1e3 ; - if ( !model->HSMHV_glksd3_Given ) model->HSMHV_glksd3 = -1e3 ; + if ( !model->HSMHV_glksd2_Given ) model->HSMHV_glksd2 = 5e6 ; + if ( !model->HSMHV_glksd3_Given ) model->HSMHV_glksd3 = -5e6 ; 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 ; @@ -442,6 +352,7 @@ 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 ; @@ -456,26 +367,14 @@ 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 ; /* not used in this version */ - if ( !model->HSMHV_rbsb_Given ) model->HSMHV_rbsb = 50.0e0 ; /* not used in this version */ + if ( !model->HSMHV_rbdb_Given ) model->HSMHV_rbdb = 50.0e0 ; + if ( !model->HSMHV_rbsb_Given ) model->HSMHV_rbsb = 50.0e0 ; 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 */ @@ -495,6 +394,7 @@ 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 ; @@ -538,106 +438,12 @@ 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_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_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_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 ; @@ -666,6 +472,7 @@ 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 ; @@ -717,6 +524,7 @@ 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 ; @@ -738,16 +546,6 @@ 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 ; @@ -768,6 +566,7 @@ 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 ; @@ -819,6 +618,7 @@ 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 ; @@ -840,16 +640,6 @@ 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 ; @@ -870,6 +660,7 @@ 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 ; @@ -921,6 +712,7 @@ 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 ; @@ -942,17 +734,8 @@ 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; @@ -974,8 +757,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 ) @@ -983,13 +766,11 @@ 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_cvbk_Given ) { - fprintf(stderr,"warning(HiSIM_HV(%s)): CVBK has been inactivated by CVB.\n",model->HSMHVmodName); + 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_cordrift ) { model->HSMHV_corsrd = 0 ; } - modelMKS = &model->modelMKS ; @@ -1032,7 +813,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(HiSIM_HV(%s)): CORBNET has been set to its default value: %d.\n", model->HSMHVmodName,here->HSMHV_corbnet); + printf("warning(HiSIMHV): CORBNET has been set to its default value: %d.\n", 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 */ @@ -1044,18 +825,14 @@ 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(HiSIM_HV(%s)): CORG has been set to its default value: %d.\n", model->HSMHVmodName,here->HSMHV_corg); + printf("warning(HiSIMHV): CORG has been set to its default value: %d.\n", here->HSMHV_corg); } if ( !here->HSMHV_m_Given ) here->HSMHV_m = 1.0 ; - 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_subld1_Given ) here->HSMHV_subld1 = model->HSMHV_subld1 ; + if ( !here->HSMHV_subld2_Given ) here->HSMHV_subld2 = model->HSMHV_subld2 ; if ( !here->HSMHV_lovers_Given ) here->HSMHV_lovers = model->HSMHV_lovers ; - if ( !here->HSMHV_lover_Given ) here->HSMHV_lover = model->HSMHV_lover ; + if ( here->HSMHV_lover_Given ) here->HSMHV_lovers = here->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 ; @@ -1063,22 +840,24 @@ int HSMHVsetup( if ( !here->HSMHV_ldrift2s_Given ) here->HSMHV_ldrift2s = model->HSMHV_ldrift2s ; if ( model->HSMHV_cosym ) { -// 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_lovers_Given && !model->HSMHV_lovers_Given ) here->HSMHV_lovers = here->HSMHV_loverld ; + here->HSMHV_lover = here->HSMHV_lovers ; 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 ) - || model->HSMHV_cordrift == 1 ) ) { - if( here->HSMHVdNodePrime <= 0) { + 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 ; error = CKTmkVolt(ckt, &tmp, here->HSMHVname, "drain"); if (error) return(error); here->HSMHVdNodePrime = tmp->number; @@ -1090,14 +869,12 @@ 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 || model->HSMHV_cordrift == 1) + if ( (model->HSMHV_corsrd == 1 || model->HSMHV_corsrd == 3) && 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; @@ -1109,7 +886,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; @@ -1141,21 +918,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 */ - 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 + /* 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 ); return (E_BADPARM); } else { + /* 5th node is switched to tempNode, if COSUBNODE=0 and 5 external nodes are assigned. */ - here->HSMHVtempNode = here->HSMHVsubNode ; - here->HSMHVsubNode = -1 ; + if ( here->HSMHVsubNode > 0 ) { + here->HSMHVtempNode = here->HSMHVsubNode ; + here->HSMHVsubNode = -1 ; + } } } @@ -1182,9 +959,9 @@ int HSMHVsetup( /* macro to make elements with built in test for out of memory */ #define TSTALLOC(ptr,first,second) \ -if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ +do { if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(E_NOMEM);\ -} +} } while(0) TSTALLOC(HSMHVDPbpPtr, HSMHVdNodePrime, HSMHVbNodePrime); TSTALLOC(HSMHVSPbpPtr, HSMHVsNodePrime, HSMHVbNodePrime); @@ -1262,7 +1039,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ TSTALLOC(HSMHVSsubPtr, HSMHVsNode, HSMHVsubNode); TSTALLOC(HSMHVSPsubPtr, HSMHVsNodePrime, HSMHVsubNode); } - if ( here->HSMHVtempNode > 0 ) { /* self heating */ + if ( here->HSMHV_coselfheat > 0 ) { /* self heating */ TSTALLOC(HSMHVTemptempPtr, HSMHVtempNode, HSMHVtempNode); TSTALLOC(HSMHVTempdPtr, HSMHVtempNode, HSMHVdNode); TSTALLOC(HSMHVTempdpPtr, HSMHVtempNode, HSMHVdNodePrime); @@ -1271,7 +1048,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ TSTALLOC(HSMHVDPtempPtr, HSMHVdNodePrime, HSMHVtempNode); TSTALLOC(HSMHVSPtempPtr, HSMHVsNodePrime, HSMHVtempNode); - TSTALLOC(HSMHVTempgpPtr, HSMHVtempNode, HSMHVgNodePrime) + TSTALLOC(HSMHVTempgpPtr, HSMHVtempNode, HSMHVgNodePrime); TSTALLOC(HSMHVTempbpPtr, HSMHVtempNode, HSMHVbNodePrime); TSTALLOC(HSMHVGPtempPtr, HSMHVgNodePrime, HSMHVtempNode); @@ -1298,12 +1075,15 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ TSTALLOC(HSMHVQBspPtr, HSMHVqbNode, HSMHVsNodePrime); TSTALLOC(HSMHVQBbpPtr, HSMHVqbNode, HSMHVbNodePrime); TSTALLOC(HSMHVQBqbPtr, HSMHVqbNode, HSMHVqbNode); - if ( here->HSMHVtempNode > 0 ) { /* self heating */ + if ( here->HSMHV_coselfheat > 0 ) { /* self heating */ TSTALLOC(HSMHVQItempPtr, HSMHVqiNode, HSMHVtempNode); TSTALLOC(HSMHVQBtempPtr, HSMHVqbNode, HSMHVtempNode); } } + + + /*-----------------------------------------------------------* * Range check of instance parameters *-----------------*/ @@ -1321,16 +1101,6 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ 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) @@ -1348,6 +1118,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ BINNING(sc2) BINNING(sc3) BINNING(pgd1) + BINNING(pgd3) BINNING(ndep) BINNING(ninv) BINNING(muecb0) @@ -1379,6 +1150,10 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ BINNING(nsubpsti3) BINNING(cgso) BINNING(cgdo) + BINNING(js0) + BINNING(js0sw) + BINNING(nj) + BINNING(cisbk) BINNING(clm1) BINNING(clm2) BINNING(clm3) @@ -1395,6 +1170,8 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ BINNING(glkb2) BINNING(nftrp) BINNING(nfalp) + BINNING(pthrou) + BINNING(vdiffj) BINNING(ibpc1) BINNING(ibpc2) BINNING(cgbo) @@ -1423,21 +1200,18 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ 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.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_vfbover, -1.0, 1.0, "VFBOVER") ; + 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, 10.0, "SCP1") ; - RANGECHECK(pParam->HSMHV_scp2, 0.0, 1.0, "SCP2") ; + RANGECHECK(pParam->HSMHV_scp1, 0.0, 20.0, "SCP1") ; + RANGECHECK(pParam->HSMHV_scp2, 0.0, 2.0, "SCP2") ; RANGECHECK(pParam->HSMHV_scp3, 0.0, 200e-9, "SCP3") ; - 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_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_ndep, 0.0, 1.0, "NDEP") ; RANGECHECK(pParam->HSMHV_ninv, 0.0, 1.0, "NINV") ; RANGECHECK(pParam->HSMHV_muecb0, 100.0, 100.0e3, "MUECB0") ; @@ -1445,18 +1219,22 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ 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.5, "MUETMP") ; - RANGECHECK(pParam->HSMHV_clm1, 0.01, 1.0, "CLM1") ; + RANGECHECK(pParam->HSMHV_muetmp, 0.5, 2.0, "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 * 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_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_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") ; - MINCHECK( pParam->HSMHV_cgbo, 0.0, "CGBO") ; + 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" ); + } 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") ; @@ -1472,16 +1250,6 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ 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. *-----------------*/ @@ -1517,8 +1285,12 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ 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 Backword Compitibility */ + pParam->HSMHV_vfbover = - pParam->HSMHV_vfbover ; /* For Backward compatibility */ } /* instance */ @@ -1527,19 +1299,17 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ /*-----------------------------------------------------------* * Range check of model parameters *-----------------*/ - 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_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_xld, 0.0, 50.0e-9, "XLD") ; - RANGECHECK(model->HSMHV_xwd, -100.0e-9, 300.0e-9, "XWD") ; + RANGECHECK(model->HSMHV_xwd, -10.0e-9, 100.0e-9, "XWD") ; RANGECHECK(model->HSMHV_xwdc, -10.0e-9, 100.0e-9, "XWDC") ; - RANGECHECK(model->HSMHV_rsh, 0.0, 500.0, "RSH") ; + RANGECHECK(model->HSMHV_rsh, 0.0, 500, "RSH") ; RANGECHECK(model->HSMHV_rshg, 0.0, 100.0, "RSHG") ; - if(model->HSMHV_xqy != 0.0) RANGECHECK(model->HSMHV_xqy, 10.0e-9, 50.0e-9, "XQY") ; + if(model->HSMHV_xqy != 0.0) { MINCHECK (model->HSMHV_xqy, 10.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") ; @@ -1550,29 +1320,22 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ 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") ; - RANGERESET(model->HSMHV_scp22, 0.0, 0.0, "SCP22") ; + RANGECHECK(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") ; - 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") ; + RANGECHECK(model->HSMHV_clm5, 0.0, 2.0, "CLM5") ; + RANGECHECK(model->HSMHV_clm6, 0.0, 20.0, "CLM6") ; 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, 1e-9, "QME1") ; - RANGECHECK(model->HSMHV_qme2, 1.0, 3.0, "QME2") ; - RANGECHECK(model->HSMHV_qme3, 0.0, 500e-12, "QME3") ; + 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_glpart1, 0.0, 1.0, "GLPART1") ; RANGECHECK(model->HSMHV_tnom, 22.0, 32.0, "TNOM") ; RANGECHECK(model->HSMHV_ddltmax, 1.0, 10.0, "DDLTMAX") ; @@ -1580,11 +1343,12 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ 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, 2e-2, "RDTEMP1") ; + RANGECHECK(model->HSMHV_rdtemp1, -1e-3, 1e-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") ; @@ -1597,7 +1361,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ 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") ; - MINRESET ( model->HSMHV_xldld, 0.0, "XLDLD") ; + MINCHECK( 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") ; @@ -1605,7 +1369,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ 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") ; @@ -1620,47 +1384,6 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ 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 ); - } /*-----------------------------------------------------------* @@ -1703,10 +1426,10 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ 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_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 ; +// 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 ; /*-----------------------------------------------------------* @@ -1717,9 +1440,18 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ } /* 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 9654c464a..894e40863 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvtemp.c +++ b/src/spicelib/devices/hisimhv1/hsmhvtemp.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvtemp.c - DATE : 2014.6.11 + DATE : 2013.04.30 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" @@ -69,7 +27,7 @@ June 2008 (revised October 2011) #define RANGECHECK(param, min, max, pname) \ if ( (param) < (min) || (param) > (max) ) { \ - printf("warning(HiSIM_HV(%s)): The model/instance parameter %s (= %e) must be in the range [%e , %e].\n", model->HSMHVmodName,\ + printf("warning(HiSIMHV): The model/instance parameter %s (= %e) must be in the range [%e , %e].\n", \ (pname), (param), (min), (max) ); \ } @@ -91,6 +49,11 @@ June 2008 (revised October 2011) 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) @@ -98,8 +61,8 @@ int HSMHVtemp( GENmodel *inModel, CKTcircuit *ckt) { - HSMHVmodel *model = (HSMHVmodel *)inModel ; - HSMHVinstance *here ; + register HSMHVmodel *model = (HSMHVmodel *)inModel ; + register HSMHVinstance *here ; HSMHVbinningParam *pParam ; HSMHVmodelMKSParam *modelMKS ; HSMHVhereMKSParam *hereMKS ; @@ -110,12 +73,10 @@ 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 ; @@ -146,7 +107,6 @@ int HSMHVtemp( LG = Lgate * C_m2um ; here->HSMHV_wg = WG = Wgate * C_m2um ; WL = WG * LG ; - GDLD = model->HSMHV_gdld * C_m2um ; /* Band gap */ @@ -197,7 +157,7 @@ int HSMHVtemp( /* DFM */ if ( model->HSMHV_codfm == 1 && here->HSMHV_nsubcdfm_Given ) { - RANGECHECK(here->HSMHV_nsubcdfm, 1.0e16, 1.0e19, "NSUBCDFM") ; + RANGECHECK(hereMKS->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 ; @@ -246,15 +206,11 @@ int HSMHVtemp( Leff = Lgate - ( dL + dLLD ) ; if ( Leff <= 0.0 ) { - IFuid namarr[2]; - namarr[0] = here->HSMHVname; - namarr[1] = model->HSMHVmodName; - (*(SPfrontEnd->IFerror)) + SPfrontEnd->IFerrorf ( ERR_FATAL, "HiSIM_HV: MOSFET(%s) MODEL(%s): effective channel length is negative or 0", - namarr - ); + model->HSMHVmodName, here->HSMHVname); return (E_BADPARM); } here->HSMHV_leff = Leff ; @@ -272,15 +228,11 @@ int HSMHVtemp( here->HSMHV_weff_ld = Wgate - 2.0e0 * dWLD ; here->HSMHV_weff_cv = Wgate - 2.0e0 * dWCV ; if ( Weff <= 0.0 ) { - IFuid namarr[2]; - namarr[0] = here->HSMHVname; - namarr[1] = model->HSMHVmodName; - (*(SPfrontEnd->IFerror)) + SPfrontEnd->IFerrorf ( ERR_FATAL, "HiSIM_HV: MOSFET(%s) MODEL(%s): effective channel width is negative or 0", - namarr - ); + model->HSMHVmodName, here->HSMHVname); return (E_BADPARM); } here->HSMHV_weff_nf = Weff * here->HSMHV_nf ; @@ -331,9 +283,6 @@ 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 ) ; @@ -348,10 +297,14 @@ 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); @@ -360,7 +313,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(%s)): The gate conductance reset to 1.0e3 mho.\n",model->HSMHVmodName); + printf("warning(HiSIM_HV): The gate conductance reset to 1.0e3 mho.\n"); } } @@ -397,15 +350,6 @@ 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 ) { @@ -420,16 +364,9 @@ int HSMHVtemp( } /* Vdseff */ - 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 ; - } - + 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 ; /* Isub */ T2 = pow( Weff , model->HSMHV_svgswp ) ; @@ -452,13 +389,6 @@ 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 ) ; @@ -467,11 +397,6 @@ 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 ) ); @@ -489,8 +414,6 @@ 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 f4375968b..cccc90fc0 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvtemp_eval.h +++ b/src/spicelib/devices/hisimhv1/hsmhvtemp_eval.h @@ -1,61 +1,19 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvtemp_eval.h - DATE : 2014.6.11 + DATE : 2013.04.30 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 @@ -66,15 +24,16 @@ June 2008 (revised October 2011) /* 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 */ - here->HSMHV_eg = Eg = here->HSMHV_egtnom - pParam->HSMHV_bgtmp1 * Tdiff - - pParam->HSMHV_bgtmp2 * Tdiff_2 ; + 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_sqrt_eg = sqrt( Eg ) ; #ifdef HSMHVEVAL Eg_dT = -pParam->HSMHV_bgtmp1 - 2.0e0 * TTEMP * pParam->HSMHV_bgtmp2 ; @@ -100,53 +59,26 @@ Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; #endif /* Intrinsic carrier concentration */ - here->HSMHV_nin = Nin = C_Nin0 * Fn_Pow (here->HSMHV_Tratio, 1.5e0) + here->HSMHV_nin = Nin = C_Nin0 * Fn_Pow (TTEMP / model->HSMHV_ktnom, 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 ( here->HSMHV_Tratio , 0.5e0 ) / model->HSMHV_ktnom - + C_Nin0 * Fn_Pow (here->HSMHV_Tratio, 1.5e0) + * 1.5e0 * Fn_Pow ( TTEMP / model->HSMHV_ktnom , 0.5e0 ) / model->HSMHV_ktnom + + C_Nin0 * Fn_Pow (TTEMP / model->HSMHV_ktnom, 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 (here->HSMHV_Tratio, pParam->HSMHV_muetmp) ; + T1 = Fn_Pow (TTEMP / model->HSMHV_ktnom, 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(here->HSMHV_Tratio, pParam->HSMHV_muetmp - 1.0 ) + T1_dT = pParam->HSMHV_muetmp * Fn_Pow(TTEMP / model->HSMHV_ktnom, 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 @@ -155,14 +87,16 @@ 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 * Tdiff0 + model->HSMHV_vmaxt2 * Tdiff0_2 ) ; + * ( 1.0 + model->HSMHV_vmaxt1 * T3 + model->HSMHV_vmaxt2 * T4 ) ; #ifdef HSMHVEVAL Vmax_dT=-here->HSMHV_vmax0 * pParam->HSMHV_vmax - / ( T0 * T0 ) * ( 1.0 + model->HSMHV_vmaxt1 * Tdiff0 + model->HSMHV_vmaxt2 * Tdiff0_2 ) + / ( T0 * T0 ) * ( 1.0 + model->HSMHV_vmaxt1 * T3 + model->HSMHV_vmaxt2 * T4 ) * 1/model->HSMHV_ktnom * (0.4 + 0.2 * T1 + pParam->HSMHV_vtmp) ; #endif } else { /* with deltemp (COTEMP=2) */ @@ -179,7 +113,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 * Tdiff0 + model->HSMHV_ninvdt2 * Tdiff0_2 ) ; + here->HSMHV_ninvd = here->HSMHV_ninvd0 * ( 1.0 + model->HSMHV_ninvdt1 * T3 + model->HSMHV_ninvdt2 * T4 ) ; #ifdef HSMHVEVAL ninvd_dT = 0.0 ; #endif @@ -192,11 +126,11 @@ Tdiff_2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; } /* Temperature Dependence of RTH0 */ - pParam->HSMHV_rth = ( pParam->HSMHV_rth0 + model->HSMHV_rthtemp1 * Tdiff0 + model->HSMHV_rthtemp2 * Tdiff0_2 ) * here->HSMHV_rthtemp0 ; + pParam->HSMHV_rth = ( pParam->HSMHV_rth0 + model->HSMHV_rthtemp1 * T3 + model->HSMHV_rthtemp2 * T4 ) * here->HSMHV_rthtemp0 ; /* Temperature Dependence of POWRAT */ - T2 = pParam->HSMHV_powrat + model->HSMHV_prattemp1 * Tdiff0 + model->HSMHV_prattemp2 * Tdiff0_2 ; + T2 = pParam->HSMHV_powrat + model->HSMHV_prattemp1 * T3 + model->HSMHV_prattemp2 * T4 ; Fn_SL( T2 , T2 , 0 , 0.05 , T0 ); Fn_SU( here->HSMHV_powratio , T2 , 1 , 0.05 , T0 ); @@ -213,53 +147,52 @@ 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 ) ) ; - - 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 ) ; + /* 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( model->HSMHV_codep == 0 ) { - if ( pParam->HSMHV_nover != 0.0 ) { - here->HSMHV_cnst0over = here->HSMHV_cnst0 * sqrt( pParam->HSMHV_nover / here->HSMHV_nsub ) ; + 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 - } - if ( pParam->HSMHV_novers != 0.0 ) { - here->HSMHV_cnst0overs = here->HSMHV_cnst0 * sqrt( pParam->HSMHV_novers / here->HSMHV_nsub ) ; + /* 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 ); #ifdef HSMHVEVAL - cnst0overs_dT = cnst0_dT * sqrt( pParam->HSMHV_novers / here->HSMHV_nsub ) ; + 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 ); #endif - } - } else { - if ( pParam->HSMHV_nover != 0.0 ) { - here->HSMHV_cnst0over = here->HSMHV_cnst0 * sqrt( pParam->HSMHV_nover / here->HSMHV_ndepm ) ; + } + if ( pParam->HSMHV_novers != 0.0 ) { + here->HSMHV_cnst0overs = here->HSMHV_cnst0 * sqrt( pParam->HSMHV_novers / here->HSMHV_nsub ) ; #ifdef HSMHVEVAL - cnst0over_dT = cnst0_dT * sqrt( pParam->HSMHV_nover / here->HSMHV_ndepm ) ; + 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_ndepm ) ; + /* 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 ); #ifdef HSMHVEVAL - cnst0overs_dT = cnst0_dT * sqrt( pParam->HSMHV_novers / here->HSMHV_ndepm ) ; + 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 ); #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 @@ -267,7 +200,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 + modelMKS->HSMHV_rdtemp1 * Tdiff0 + modelMKS->HSMHV_rdtemp2 * Tdiff0_2 ) * T2 ; + here->HSMHV_rd = ( pParam->HSMHV_rd + T1 * modelMKS->HSMHV_rdtemp1 + modelMKS->HSMHV_rdtemp2 * T4 ) * 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 ; @@ -290,7 +223,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 + modelMKS->HSMHV_rdtemp1 * Tdiff0 + modelMKS->HSMHV_rdtemp2 * Tdiff0_2 ) * T2 ; + here->HSMHV_rs = ( pParam->HSMHV_rs + T1 * modelMKS->HSMHV_rdtemp1 + modelMKS->HSMHV_rdtemp2 * T4 ) * 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 ; @@ -317,8 +250,10 @@ 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 + modelMKS->HSMHV_rdvdtemp1 * Tdiff0 + modelMKS->HSMHV_rdvdtemp2 * Tdiff0_2 ) * T2 ; + here->HSMHV_rdvd = ( pParam->HSMHV_rdvd + T1 * modelMKS->HSMHV_rdvdtemp1 + modelMKS->HSMHV_rdvdtemp2 * ( TTEMP0 * TTEMP0 - T3 * T3 ) ) * 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 ; @@ -341,8 +276,10 @@ 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 + modelMKS->HSMHV_rdvdtemp1 * Tdiff0 + modelMKS->HSMHV_rdvdtemp2 * Tdiff0_2 ) * T2 ; + here->HSMHV_rsvd = ( pParam->HSMHV_rdvd + T1 * modelMKS->HSMHV_rdvdtemp1 + modelMKS->HSMHV_rdvdtemp2 * ( TTEMP0 * TTEMP0 - T3 * T3 ) ) * 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 ; @@ -359,8 +296,83 @@ 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 deleted file mode 100644 index 1bc034af4..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvtemp_eval_dio.h +++ /dev/null @@ -1,223 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvtemp_eval_dio.h - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - -#define small 1.0e-50 - - TTEMP = ckt->CKTtemp; - if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; } - TTEMP0 = TTEMP ; -#ifdef HSMHVEVAL - /* Self heating */ - TTEMP = TTEMP + deltemp ; -#endif - - - /* Band gap */ - T1 = TTEMP - model->HSMHV_ktnom ; - T2 = TTEMP * TTEMP - model->HSMHV_ktnom * model->HSMHV_ktnom ; - Eg = here->HSMHV_egtnom - pParam->HSMHV_bgtmp1 * T1 - - pParam->HSMHV_bgtmp2 * T2 ; -#ifdef HSMHVEVAL - Eg_dT = -pParam->HSMHV_bgtmp1 - 2.0e0 * TTEMP * pParam->HSMHV_bgtmp2 ; -#endif - - - /* Inverse of the thermal voltage */ - here->HSMHV_beta = beta = C_QE / (C_KB * TTEMP) ; - here->HSMHV_beta_inv = 1.0 / beta ; - here->HSMHV_beta2 = beta * beta ; - here->HSMHV_betatnom = C_QE / (C_KB * model->HSMHV_ktnom) ; -#ifdef HSMHVEVAL - beta_dT=-C_QE/(C_KB*TTEMP*TTEMP); - beta_inv_dT = C_KB / C_QE ; -#endif - - - log_Tratio = log (here->HSMHV_Tratio) ; - /* for substrate-drain junction diode. */ - js = pParam->HSMHV_js0d - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xtid * log_Tratio) / pParam->HSMHV_njd) ; - jssw = pParam->HSMHV_js0swd - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xtid * log_Tratio) / model->HSMHV_njswd) ; - - js2 = pParam->HSMHV_js0d - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xti2d * log_Tratio) / pParam->HSMHV_njd) ; - jssw2 = pParam->HSMHV_js0swd - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xti2d * log_Tratio) / model->HSMHV_njswd) ; - -#ifdef HSMHVEVAL - T0 = - Eg * beta_dT - Eg_dT * beta ; /* Self heating */ - T1 = T0 + model->HSMHV_xtid / TTEMP ; /* Self heating */ - T2 = T0 + model->HSMHV_xti2d / TTEMP ; /* Self heating */ - - js_dT = js * T1 / pParam->HSMHV_njd; /* Self heating */ - jssw_dT = jssw * T1/ model->HSMHV_njswd ; /* Self heating */ - js2_dT = js2 * T2 / pParam->HSMHV_njd; /* Self heating */ - jssw2_dT = jssw2 * T2 / model->HSMHV_njswd; /* Self heating */ -#endif - - here->HSMHV_isbd = here->HSMHV_ad * js + here->HSMHV_pd * jssw ; - here->HSMHV_isbd2 = here->HSMHV_ad * js2 + here->HSMHV_pd * jssw2 ; - -#ifdef HSMHVEVAL - isbd_dT = here->HSMHV_ad * js_dT + here->HSMHV_pd * jssw_dT ; /* Self heating */ - isbd2_dT = here->HSMHV_ad * js2_dT + here->HSMHV_pd * jssw2_dT ; /* Self heating */ -#endif - - - T0 = here->HSMHV_Tratio * here->HSMHV_Tratio ; - T2 = here->HSMHV_isbd + small ; -#ifdef HSMHVEVAL - T1_dT = 1.0 / model->HSMHV_ktnom ; /* Self heating */ - T0_dT = 2.0 * here->HSMHV_Tratio * T1_dT ; /* Self heating */ - T2_dT = isbd_dT ; /* Self heating */ -#endif - - here->HSMHV_vbdt = pParam->HSMHV_njd / beta - * log ( pParam->HSMHV_vdiffjd * T0 / T2 + 1.0 ) ; - - here->HSMHV_exptempd = exp (( here->HSMHV_Tratio - 1.0 ) * model->HSMHV_ctempd ) ; - -#ifdef HSMHVEVAL - vbdt_dT = - beta_dT / beta * here->HSMHV_vbdt - + pParam->HSMHV_njd / beta * pParam->HSMHV_vdiffjd / ( pParam->HSMHV_vdiffjd * T0 / T2 + 1.0 ) - * ( T0_dT / T2 - T0 / T2 / T2 * T2_dT ) ; /* Self heating */ -#endif - - here->HSMHV_jd_nvtm_invd = 1.0 / ( pParam->HSMHV_njd / beta ) ; - here->HSMHV_jd_expcd = exp (here->HSMHV_vbdt * here->HSMHV_jd_nvtm_invd ) ; - -#ifdef HSMHVEVAL - exptempd_dT = model->HSMHV_ctempd / model->HSMHV_ktnom * here->HSMHV_exptempd ; /* Self heating */ - jd_nvtm_invd_dT = beta_dT / pParam->HSMHV_njd ; /* Self heating */ - jd_expcd_dT = here->HSMHV_jd_expcd - * ( vbdt_dT * here->HSMHV_jd_nvtm_invd + here->HSMHV_vbdt * jd_nvtm_invd_dT ) ; /* Self heating */ -#endif - - - /* for substrate-source junction diode. */ - js = pParam->HSMHV_js0s - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xtis * log_Tratio) / pParam->HSMHV_njs) ; - jssw = pParam->HSMHV_js0sws - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xtis * log_Tratio) / model->HSMHV_njsws) ; - - js2 = pParam->HSMHV_js0s - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xti2s * log_Tratio) / pParam->HSMHV_njs) ; - jssw2 = pParam->HSMHV_js0sws - * exp ((here->HSMHV_egtnom * here->HSMHV_betatnom - Eg * beta - + model->HSMHV_xti2s * log_Tratio) / model->HSMHV_njsws) ; - -#ifdef HSMHVEVAL - T0 = - Eg * beta_dT - Eg_dT * beta ; /* Self heating */ - T1 = T0 + model->HSMHV_xtis / TTEMP ; /* Self heating */ - T2 = T0 + model->HSMHV_xti2s / TTEMP ; /* Self heating */ - - js_dT = js * T1 / pParam->HSMHV_njs; /* Self heating */ - jssw_dT = jssw * T1/ model->HSMHV_njsws ; /* Self heating */ - js2_dT = js2 * T2 / pParam->HSMHV_njs; /* Self heating */ - jssw2_dT = jssw2 * T2 / model->HSMHV_njsws; /* Self heating */ -#endif - - here->HSMHV_isbs = here->HSMHV_as * js + here->HSMHV_ps * jssw ; - here->HSMHV_isbs2 = here->HSMHV_as * js2 + here->HSMHV_ps * jssw2 ; - -#ifdef HSMHVEVAL - isbs_dT = here->HSMHV_as * js_dT + here->HSMHV_ps * jssw_dT ; /* Self heating */ - isbs2_dT = here->HSMHV_as * js2_dT + here->HSMHV_ps * jssw2_dT ; /* Self heating */ -#endif - - - T0 = here->HSMHV_Tratio * here->HSMHV_Tratio ; - T3 = here->HSMHV_isbs + small ; -#ifdef HSMHVEVAL - T1_dT = 1.0 / model->HSMHV_ktnom ; /* Self heating */ - T0_dT = 2.0 * here->HSMHV_Tratio * T1_dT ; /* Self heating */ - T3_dT = isbs_dT ; /* Self heating */ -#endif - - here->HSMHV_vbst = pParam->HSMHV_njs / beta - * log ( pParam->HSMHV_vdiffjs * T0 / T3 + 1.0 ) ; - - here->HSMHV_exptemps = exp (( here->HSMHV_Tratio - 1.0 ) * model->HSMHV_ctemps ) ; - -#ifdef HSMHVEVAL - vbst_dT = - beta_dT / beta * here->HSMHV_vbst - + pParam->HSMHV_njs / beta * pParam->HSMHV_vdiffjs / ( pParam->HSMHV_vdiffjs * T0 / T3 + 1.0 ) - * ( T0_dT / T3 - T0 / T3 / T3 * T3_dT ) ; /* Self heating */ -#endif - - here->HSMHV_jd_nvtm_invs = 1.0 / ( pParam->HSMHV_njs / beta ) ; - here->HSMHV_jd_expcs = exp (here->HSMHV_vbst * here->HSMHV_jd_nvtm_invs ) ; - -#ifdef HSMHVEVAL - exptemps_dT = model->HSMHV_ctemps / model->HSMHV_ktnom * here->HSMHV_exptemps ; /* Self heating */ - jd_nvtm_invs_dT = beta_dT / pParam->HSMHV_njs ; /* Self heating */ - jd_expcs_dT = here->HSMHV_jd_expcs - * ( vbst_dT * here->HSMHV_jd_nvtm_invs + here->HSMHV_vbst * jd_nvtm_invs_dT ) ; /* Self heating */ -#endif - - -/* end of HSMHVtemp_eval_dio.h */ diff --git a/src/spicelib/devices/hisimhv1/hsmhvtemp_eval_rdri.h b/src/spicelib/devices/hisimhv1/hsmhvtemp_eval_rdri.h deleted file mode 100644 index fd7072c06..000000000 --- a/src/spicelib/devices/hisimhv1/hsmhvtemp_eval_rdri.h +++ /dev/null @@ -1,103 +0,0 @@ -/*********************************************************************** - - HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC - - MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 - FILE : hsmhvtemp_eval_rdri.h - - DATE : 2014.6.11 - - released by - Hiroshima University & - Semiconductor Technology Academic Research Center (STARC) -***********************************************************************/ - -/********************************************************************** - -The following source code, and all copyrights, trade secrets or other -intellectual property rights in and to the source code in its entirety, -is owned by the Hiroshima University and the STARC organization. - -All users need to follow the "HISIM_HV Distribution Statement and -Copyright Notice" attached to HiSIM_HV model. - ------HISIM_HV Distribution Statement and Copyright Notice-------------- - -Software is distributed as is, completely without warranty or service -support. Hiroshima University or STARC and its employees are not liable -for the condition or performance of the software. - -Hiroshima University and STARC own the copyright and grant users a perpetual, -irrevocable, worldwide, non-exclusive, royalty-free license with respect -to the software as set forth below. - -Hiroshima University and STARC hereby disclaims all implied warranties. - -Hiroshima University and STARC grant the users the right to modify, copy, -and redistribute the software and documentation, both within the user's -organization and externally, subject to the following restrictions - -1. The users agree not to charge for Hiroshima University and STARC code -itself but may charge for additions, extensions, or support. - -2. In any product based on the software, the users agree to acknowledge -Hiroshima University and STARC that developed the software. This -acknowledgment shall appear in the product documentation. - -3. The users agree to reproduce any copyright notice which appears on -the software on any copy or modification of such made available -to others." - -Toshimasa Asahara, President, Hiroshima University -Mitiko Miura-Mattausch, Professor, Hiroshima University -Katsuhiro Shimohigashi, President&CEO, STARC -June 2008 (revised October 2011) -*************************************************************************/ - - TTEMP = ckt->CKTtemp; - if ( here->HSMHV_dtemp_Given ) { TTEMP = TTEMP + here->HSMHV_dtemp ; } - TTEMP0 = TTEMP ; -#ifdef HSMHVEVAL - /* Self heating */ - TTEMP = TTEMP + deltemp ; -#endif - - - /* Phonon Scattering (temperature-dependent part) */ - T1 = Fn_Pow ( here->HSMHV_Tratio, model->HSMHV_rdrmuetmp ) ; - here->HSMHV_rdrmue = modelMKS->HSMHV_rdrmue / T1 ; -#ifdef HSMHVEVAL - T1_dT = model->HSMHV_rdrmuetmp * Fn_Pow( here->HSMHV_Tratio, model->HSMHV_rdrmuetmp - 1.0 ) - / model->HSMHV_ktnom ; - Mu0_dT = - modelMKS->HSMHV_rdrmue / ( T1 * T1 ) * T1_dT ; -#endif - - - /* Velocity Temperature Dependence */ - T0 = 1.8 + 0.4 * here->HSMHV_Tratio + 0.1 * here->HSMHV_Tratio * here->HSMHV_Tratio - model->HSMHV_rdrvtmp * ( 1.0 - here->HSMHV_Tratio ) ; -#ifdef HSMHVEVAL - T0_dT = 1 / model->HSMHV_ktnom * ( 0.4 + 0.2 * here->HSMHV_Tratio + model->HSMHV_rdrvtmp ) ; -#endif - here->HSMHV_rdrvmax = modelMKS->HSMHV_rdrvmax / T0 ; -#ifdef HSMHVEVAL - Vmax_dT = - modelMKS->HSMHV_rdrvmax / ( T0 * T0 ) * T0_dT ; -#endif - - - here->HSMHV_rdrcx = model->HSMHV_rdrcx ; - here->HSMHV_rdrcar = model->HSMHV_rdrcar ; -#ifdef HSMHVEVAL - Cx_dT = 0.0 ; - Car_dT = 0.0 ; -#endif - - //Toshiba model // - here->HSMHV_rdrbb = model->HSMHV_rdrbb+model->HSMHV_rdrbbtmp*(TTEMP-model->HSMHV_ktnom) ; -#ifdef HSMHVEVAL - Rdrbb_dT = model->HSMHV_rdrbbtmp ; -#endif - -/* end of HSMHVtemp_eval_rdri.h */ diff --git a/src/spicelib/devices/hisimhv1/hsmhvtrunc.c b/src/spicelib/devices/hisimhv1/hsmhvtrunc.c index 882784d30..cadfc00d3 100644 --- a/src/spicelib/devices/hisimhv1/hsmhvtrunc.c +++ b/src/spicelib/devices/hisimhv1/hsmhvtrunc.c @@ -1,62 +1,20 @@ /*********************************************************************** HiSIM (Hiroshima University STARC IGFET Model) - Copyright (C) 2014 Hiroshima University & STARC + Copyright (C) 2012 Hiroshima University & STARC MODEL NAME : HiSIM_HV - ( VERSION : 2 SUBVERSION : 2 REVISION : 0 ) - Model Parameter 'VERSION' : 2.20 + ( VERSION : 1 SUBVERSION : 2 REVISION : 4 ) + Model Parameter VERSION : 1.23 FILE : hsmhvtrunc.c - DATE : 2014.6.11 + DATE : 2013.04.30 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" @@ -67,9 +25,10 @@ int HSMHVtrunc( GENmodel *inModel, register CKTcircuit *ckt, double *timeStep) + { - HSMHVmodel *model = (HSMHVmodel*)inModel; - HSMHVinstance *here; + register HSMHVmodel *model = (HSMHVmodel*)inModel; + register 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 ee4d960df..33d65ccb8 100644 --- a/visualc/vngspice_fftw_vc10.vcxproj +++ b/visualc/vngspice_fftw_vc10.vcxproj @@ -944,9 +944,6 @@ - - - @@ -1759,8 +1756,6 @@ - -