diff --git a/src/spicelib/devices/bsim3soi/b4soi.c b/src/spicelib/devices/bsim3soi/b4soi.c index 6d2d321c1..760dd6fb5 100644 --- a/src/spicelib/devices/bsim3soi/b4soi.c +++ b/src/spicelib/devices/bsim3soi/b4soi.c @@ -1,4 +1,6 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ + +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,9 +11,10 @@ * File: b4soi.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ - #include "ngspice.h" #include "devdefs.h" #include "b4soidef.h" @@ -76,7 +79,7 @@ OP( "debug3", B4SOI_DEBUG3, IF_REAL, "DebugOut3"), #endif IOP( "bjtoff", B4SOI_BJTOFF, IF_INTEGER, "BJT on/off flag"), -IOP( "debug", B4SOI_DEBUG, IF_INTEGER, "BJT on/off flag"), +IOP( "debug", B4SOI_DEBUG, IF_INTEGER, "DEBUG on/off flag"), IOP( "rth0", B4SOI_RTH0, IF_REAL, "Instance Thermal Resistance"), IOP( "cth0", B4SOI_CTH0, IF_REAL, "Instance Thermal Capacitance"), IOP( "nrb", B4SOI_NRB, IF_REAL, "Number of squares in body"), @@ -226,7 +229,7 @@ IOP( "pdiblcb", B4SOI_MOD_PDIBLB, IF_REAL, "Body-effect on drain-induced barrier IOP( "pvag", B4SOI_MOD_PVAG, IF_REAL, "Gate dependence of output resistance parameter"), IOP( "shmod", B4SOI_MOD_SHMOD, IF_INTEGER, "Self heating mode selector"), -IOP( "ddmod", B4SOI_MOD_DDMOD, IF_INTEGER, "Dynamic depletion mode selector"), +/* IOP( "ddmod", B4SOI_MOD_DDMOD, IF_INTEGER, "Dynamic depletion mode selector"), */ /*v4.2 soiMod = 1 now has the functionality */ IOP( "tbox", B4SOI_MOD_TBOX, IF_REAL, "Back gate oxide thickness in meters"), IOP( "tsi", B4SOI_MOD_TSI, IF_REAL, "Silicon-on-insulator thickness in meters"), IOP( "etsi", B4SOI_MOD_ETSI, IF_REAL, "Effective Silicon-on-insulator thickness in meters"), @@ -621,7 +624,10 @@ IOP( "lu0", B4SOI_MOD_LU0, IF_REAL, "Length dependence of u0"), IOP( "leu", B4SOI_MOD_LEU, IF_REAL, " Length dependence of eu"), IOP( "lua", B4SOI_MOD_LUA, IF_REAL, "Length dependence of ua"), IOP( "lub", B4SOI_MOD_LUB, IF_REAL, "Length dependence of ub"), -IOP( "luc", B4SOI_MOD_LUC, IF_REAL, "Length dependence of uc"), +IOP( "luc", B4SOI_MOD_LUC, IF_REAL, "Length dependence of uc"), +IOP( "lud", B4SOI_MOD_LUD, IF_REAL, "Length dependence of ud"), /* Bug fix # 32 Jul 09 */ +IOP( "lud1", B4SOI_MOD_LUD1, IF_REAL, "Length dependence of ud1"), + /* Bug fix # 32 Jul 09 */ IOP( "lucste", B4SOI_MOD_LUCSTE, IF_REAL, "Length dependence of ucste"), IOP( "lucs", B4SOI_MOD_LUCS, IF_REAL, "Length dependence of lucs"), IOP( "lvsat", B4SOI_MOD_LVSAT, IF_REAL, "Length dependence of vsat"), @@ -659,6 +665,11 @@ IOP( "lpvag", B4SOI_MOD_LPVAG, IF_REAL, "Length dependence of pvag"), IOP( "ldelta", B4SOI_MOD_LDELTA, IF_REAL, "Length dependence of delta"), IOP( "lalpha0", B4SOI_MOD_LALPHA0, IF_REAL, "Length dependence of alpha0"), IOP( "lfbjtii", B4SOI_MOD_LFBJTII, IF_REAL, "Length dependence of fbjtii"), +IOP( "labjtii", B4SOI_MOD_LABJTII, IF_REAL, "Length dependence of abjtii"), /*Bug fix # 32 Jul 09*/ +IOP( "lcbjtii", B4SOI_MOD_LCBJTII, IF_REAL, "Length dependence of cbjtii"), /*Bug fix # 32 Jul 09*/ +IOP( "lebjtii", B4SOI_MOD_LEBJTII, IF_REAL, "Length dependence of ebjtii"), /*Bug fix # 32 Jul 09*/ +IOP( "lmbjtii", B4SOI_MOD_LMBJTII, IF_REAL, "Length dependence of mbjtii"), /*Bug fix # 32 Jul 09*/ +IOP( "lvbci", B4SOI_MOD_LVBCI, IF_REAL, "Length dependence of vbci"), /*Bug fix # 32 Jul 09*/ IOP( "lbeta0", B4SOI_MOD_LBETA0, IF_REAL, "Length dependence of beta0"), IOP( "lbeta1", B4SOI_MOD_LBETA1, IF_REAL, "Length dependence of beta1"), IOP( "lbeta2", B4SOI_MOD_LBETA2, IF_REAL, "Length dependence of beta2"), @@ -713,7 +724,7 @@ IOP( "lvsdfb", B4SOI_MOD_LVSDFB, IF_REAL, "Length dependence of vsdfb"), IOP( "lvsdth", B4SOI_MOD_LVSDTH, IF_REAL, "Length dependence of vsdth"), IOP( "ldelvt", B4SOI_MOD_LDELVT, IF_REAL, "Length dependence of delvt"), IOP( "lacde", B4SOI_MOD_LACDE, IF_REAL, "Length dependence of acde"), -IOP( "lmoin", B4SOI_MOD_LMOIN, IF_REAL, "Length dependence of amoin"), +IOP( "lmoin", B4SOI_MOD_LMOIN, IF_REAL, "Length dependence of moin"), IOP( "lnoff", B4SOI_MOD_LNOFF, IF_REAL, "Length dependence of noff"), /* v3.2 */ /* v3.1 added for RF */ @@ -764,7 +775,6 @@ IOP( "wcigsd", B4SOI_MOD_WCIGSD, IF_REAL, "Width dependence of cigsd"), IOP( "wnigc", B4SOI_MOD_WNIGC, IF_REAL, "Width dependence of nigc"), IOP( "wpigcd", B4SOI_MOD_WPIGCD, IF_REAL, "Width dependence for pigcd"), IOP( "wpoxedge", B4SOI_MOD_WPOXEDGE, IF_REAL, "Width dependence for poxedge"), - IOP( "wnch", B4SOI_MOD_WNPEAK, IF_REAL, "Width dependence of nch"), IOP( "wnsub", B4SOI_MOD_WNSUB, IF_REAL, "Width dependence of nsub"), IOP( "wngate", B4SOI_MOD_WNGATE, IF_REAL, "Width dependence of ngate"), @@ -792,6 +802,8 @@ IOP( "weu", B4SOI_MOD_WEU, IF_REAL, "Width dependence of eu"), IOP( "wua", B4SOI_MOD_WUA, IF_REAL, "Width dependence of ua"), IOP( "wub", B4SOI_MOD_WUB, IF_REAL, "Width dependence of ub"), IOP( "wuc", B4SOI_MOD_WUC, IF_REAL, "Width dependence of uc"), +IOP( "wud", B4SOI_MOD_WUD, IF_REAL, "Width dependence of ud"), /* Bug fix # 32 Jul 09 */ +IOP( "wud1", B4SOI_MOD_WUD1, IF_REAL, "Width dependence of ud1"), /* Bug fix # 32 Jul 09 */ IOP( "wucste", B4SOI_MOD_WUCSTE, IF_REAL, "Width dependence of ucste"), IOP( "wucs", B4SOI_MOD_WUCS, IF_REAL, "Width dependence of ucs"), IOP( "wvsat", B4SOI_MOD_WVSAT, IF_REAL, "Width dependence of vsat"), @@ -829,6 +841,11 @@ IOP( "wpvag", B4SOI_MOD_WPVAG, IF_REAL, "Width dependence of pvag"), IOP( "wdelta", B4SOI_MOD_WDELTA, IF_REAL, "Width dependence of delta"), IOP( "walpha0", B4SOI_MOD_WALPHA0, IF_REAL, "Width dependence of alpha0"), IOP( "wfbjtii", B4SOI_MOD_WFBJTII, IF_REAL, "Width dependence of fbjtii"), +IOP( "wabjtii", B4SOI_MOD_WABJTII, IF_REAL, "Width dependence of abjtii"), /*Bug fix # 32 Jul 09 */ +IOP( "wcbjtii", B4SOI_MOD_WCBJTII, IF_REAL, "Width dependence of cbjtii"), /*Bug fix # 32 Jul 09 */ +IOP( "webjtii", B4SOI_MOD_WEBJTII, IF_REAL, "Width dependence of ebjtii"), /*Bug fix # 32 Jul 09 */ +IOP( "wmbjtii", B4SOI_MOD_WMBJTII, IF_REAL, "Width dependence of mbjtii"), /*Bug fix # 32 Jul 09 */ +IOP( "wvbci", B4SOI_MOD_WVBCI, IF_REAL, "Width dependence of vbci"), /*Bug fix # 32 Jul 09*/ IOP( "wbeta0", B4SOI_MOD_WBETA0, IF_REAL, "Width dependence of beta0"), IOP( "wbeta1", B4SOI_MOD_WBETA1, IF_REAL, "Width dependence of beta1"), IOP( "wbeta2", B4SOI_MOD_WBETA2, IF_REAL, "Width dependence of beta2"), @@ -883,12 +900,13 @@ IOP( "wvsdfb", B4SOI_MOD_WVSDFB, IF_REAL, "Width dependence of vsdfb"), IOP( "wvsdth", B4SOI_MOD_WVSDTH, IF_REAL, "Width dependence of vsdth"), IOP( "wdelvt", B4SOI_MOD_WDELVT, IF_REAL, "Width dependence of delvt"), IOP( "wacde", B4SOI_MOD_WACDE, IF_REAL, "Width dependence of acde"), -IOP( "wmoin", B4SOI_MOD_WMOIN, IF_REAL, "Width dependence of amoin"), +IOP( "wmoin", B4SOI_MOD_WMOIN, IF_REAL, "Width dependence of moin"), IOP( "wnoff", B4SOI_MOD_WNOFF, IF_REAL, "Width dependence of noff"), /* v3.2 */ /* v3.1 added for RF */ IOP("wxrcrg1", B4SOI_MOD_WXRCRG1, IF_REAL, "Width dependence of xrcrg1"), -IOP("Wxrcrg2", B4SOI_MOD_WXRCRG2, IF_REAL, "Width dependence of xrcrg2"), +/* IOP("Wxrcrg2", B4SOI_MOD_WXRCRG2, IF_REAL, "Width dependence of xrcrg2") *//*Bug fix # 32 Jul 09 */ +IOP("wxrcrg2", B4SOI_MOD_WXRCRG2, IF_REAL, "Width dependence of xrcrg2"), /* added for RF model end*/ @@ -963,6 +981,8 @@ IOP( "peu", B4SOI_MOD_PEU, IF_REAL, "Cross-term dependence of eu"), IOP( "pua", B4SOI_MOD_PUA, IF_REAL, "Cross-term dependence of ua"), IOP( "pub", B4SOI_MOD_PUB, IF_REAL, "Cross-term dependence of ub"), IOP( "puc", B4SOI_MOD_PUC, IF_REAL, "Cross-term dependence of uc"), +IOP( "pud", B4SOI_MOD_PUD, IF_REAL, "Cross-term dependence of ud"), /*Bug fix # 32 Jul 09 */ +IOP( "pud1", B4SOI_MOD_PUD1, IF_REAL, "Cross-term dependence of ud1"), /*Bug fix # 32 Jul 09 */ IOP( "pucste", B4SOI_MOD_PUCSTE, IF_REAL, "Cross-term dependence of ucste"), IOP( "pucs", B4SOI_MOD_PUCS, IF_REAL, "Cross-term dependence of ucs"), IOP( "pvsat", B4SOI_MOD_PVSAT, IF_REAL, "Cross-term dependence of vsat"), @@ -1000,6 +1020,11 @@ IOP( "ppvag", B4SOI_MOD_PPVAG, IF_REAL, "Cross-term dependence of pvag"), IOP( "pdelta", B4SOI_MOD_PDELTA, IF_REAL, "Cross-term dependence of delta"), IOP( "palpha0", B4SOI_MOD_PALPHA0, IF_REAL, "Cross-term dependence of alpha0"), IOP( "pfbjtii", B4SOI_MOD_PFBJTII, IF_REAL, "Cross-term dependence of fbjtii"), +IOP( "pabjtii", B4SOI_MOD_PABJTII, IF_REAL, "Cross-term dependence of abjtii"), /* Bug fix # 32 Jul 09 */ +IOP( "pcbjtii", B4SOI_MOD_PCBJTII, IF_REAL, "Cross-term dependence of cbjtii"), /* Bug fix # 32 Jul 09 */ +IOP( "pebjtii", B4SOI_MOD_PEBJTII, IF_REAL, "Cross-term dependence of ebjtii"), /* Bug fix # 32 Jul 09 */ +IOP( "pmbjtii", B4SOI_MOD_PMBJTII, IF_REAL, "Cross-term dependence of mbjtii"), /* Bug fix # 32 Jul 09 */ +IOP( "pvbci", B4SOI_MOD_PVBCI, IF_REAL, "Cross-term dependence of vbci"), /* Bug fix # 32 Jul 09 */ IOP( "pbeta0", B4SOI_MOD_PBETA0, IF_REAL, "Cross-term dependence of beta0"), IOP( "pbeta1", B4SOI_MOD_PBETA1, IF_REAL, "Cross-term dependence of beta1"), IOP( "pbeta2", B4SOI_MOD_PBETA2, IF_REAL, "Cross-term dependence of beta2"), @@ -1054,7 +1079,7 @@ IOP( "pvsdfb", B4SOI_MOD_PVSDFB, IF_REAL, "Cross-term dependence of vsdfb"), IOP( "pvsdth", B4SOI_MOD_PVSDTH, IF_REAL, "Cross-term dependence of vsdth"), IOP( "pdelvt", B4SOI_MOD_PDELVT, IF_REAL, "Cross-term dependence of delvt"), IOP( "pacde", B4SOI_MOD_PACDE, IF_REAL, "Cross-term dependence of acde"), -IOP( "pmoin", B4SOI_MOD_PMOIN, IF_REAL, "Cross-term dependence of amoin"), +IOP( "pmoin", B4SOI_MOD_PMOIN, IF_REAL, "Cross-term dependence of moin"), IOP( "pnoff", B4SOI_MOD_PNOFF, IF_REAL, "Cross-term dependence of noff"), /* v3.2 */ /* v3.1 added for RF */ @@ -1083,7 +1108,7 @@ char *B4SOInames[] = { "Gate", "Source", "Backgate", - "Body_ext", + "", "Body", "Temp", "Charge", diff --git a/src/spicelib/devices/bsim3soi/b4soiacld.c b/src/spicelib/devices/bsim3soi/b4soiacld.c index fa512d91b..860004eb3 100644 --- a/src/spicelib/devices/bsim3soi/b4soiacld.c +++ b/src/spicelib/devices/bsim3soi/b4soiacld.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soiacld.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" diff --git a/src/spicelib/devices/bsim3soi/b4soiask.c b/src/spicelib/devices/bsim3soi/b4soiask.c index ab705b8c4..e47f27010 100644 --- a/src/spicelib/devices/bsim3soi/b4soiask.c +++ b/src/spicelib/devices/bsim3soi/b4soiask.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soiask.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" @@ -180,7 +183,7 @@ B4SOIinstance *here = (B4SOIinstance*)inst; case B4SOI_AGBCP: value->rValue = here->B4SOIagbcp; return(OK); - case B4SOI_AGBCP2: + case B4SOI_AGBCP2: value->rValue = here->B4SOIagbcp2; return(OK); /* v4.1 for BC improvement */ case B4SOI_AGBCPD: /* v4.0 */ @@ -280,7 +283,7 @@ B4SOIinstance *here = (B4SOIinstance*)inst; case B4SOI_IGIDL: value->rValue = here->B4SOIigidl; return(OK); - case B4SOI_IGISL: + case B4SOI_IGISL: value->rValue = here->B4SOIigisl; return(OK); case B4SOI_IGS: diff --git a/src/spicelib/devices/bsim3soi/b4soicheck.c b/src/spicelib/devices/bsim3soi/b4soicheck.c index 3573927c3..6de54cd25 100644 --- a/src/spicelib/devices/bsim3soi/b4soicheck.c +++ b/src/spicelib/devices/bsim3soi/b4soicheck.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soicheck.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" @@ -29,7 +32,7 @@ CKTcircuit *ckt) struct b4soiSizeDependParam *pParam; int Fatal_Flag = 0; FILE *fplog; - + if ((fplog = fopen("b4soiv1check.log", "w")) != NULL) { pParam = here->pParam; fprintf(fplog, "B4SOIV3 Parameter Check\n"); @@ -45,7 +48,7 @@ FILE *fplog; } if((here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && - ((here->B4SOInf == 1.0) || ((here->B4SOInf > 1.0) && + ((here->B4SOInf == 1.0) || ((here->B4SOInf > 1.0) && (here->B4SOIsd > 0.0))) ) { if (model->B4SOIsaref <= 0.0) { fprintf(fplog, "Fatal: SAref = %g is not positive.\n", @@ -175,23 +178,23 @@ FILE *fplog; if (pParam->B4SOIdvt1 < 0.0) { fprintf(fplog, "Fatal: Dvt1 = %g is negative.\n", - pParam->B4SOIdvt1); - printf("Fatal: Dvt1 = %g is negative.\n", pParam->B4SOIdvt1); + pParam->B4SOIdvt1); + printf("Fatal: Dvt1 = %g is negative.\n", pParam->B4SOIdvt1); Fatal_Flag = 1; } - + if (pParam->B4SOIdvt1w < 0.0) { fprintf(fplog, "Fatal: Dvt1w = %g is negative.\n", pParam->B4SOIdvt1w); printf("Fatal: Dvt1w = %g is negative.\n", pParam->B4SOIdvt1w); Fatal_Flag = 1; } - + if (pParam->B4SOIw0 == -pParam->B4SOIweff) { fprintf(fplog, "Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); printf("Fatal: (W0 + Weff) = 0 cauing divided-by-zero.\n"); Fatal_Flag = 1; - } + } if (pParam->B4SOIdsub < 0.0) { fprintf(fplog, "Fatal: Dsub = %g is negative.\n", pParam->B4SOIdsub); @@ -202,21 +205,21 @@ FILE *fplog; { fprintf(fplog, "Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); printf("Fatal: (B1 + Weff) = 0 causing divided-by-zero.\n"); Fatal_Flag = 1; - } + } if (pParam->B4SOIu0temp <= 0.0) { fprintf(fplog, "Fatal: u0 at current temperature = %g is not positive.\n", pParam->B4SOIu0temp); printf("Fatal: u0 at current temperature = %g is not positive.\n", pParam->B4SOIu0temp); Fatal_Flag = 1; } - -/* Check delta parameter */ + +/* Check delta parameter */ if (pParam->B4SOIdelta < 0.0) { fprintf(fplog, "Fatal: Delta = %g is less than zero.\n", pParam->B4SOIdelta); printf("Fatal: Delta = %g is less than zero.\n", pParam->B4SOIdelta); Fatal_Flag = 1; - } + } if (pParam->B4SOIvsattemp <= 0.0) { fprintf(fplog, "Fatal: Vsat at current temperature = %g is not positive.\n", pParam->B4SOIvsattemp); @@ -243,7 +246,7 @@ FILE *fplog; here->B4SOIdrainPerimeter); printf("Warning: Pd = %g is less than W.\n", here->B4SOIdrainPerimeter); - here->B4SOIdrainPerimeter =pParam->B4SOIweff; + here->B4SOIdrainPerimeter =pParam->B4SOIweff; } } if ( model->B4SOIunitLengthGateSidewallJctCapS > 0.0) /* v4.0 */ @@ -261,7 +264,7 @@ FILE *fplog; { fprintf(fplog, "Fatal: Clc = %g is negative.\n", pParam->B4SOIclc); printf("Fatal: Clc = %g is negative.\n", pParam->B4SOIclc); Fatal_Flag = 1; - } + } /* v3.2 */ @@ -279,8 +282,8 @@ FILE *fplog; /* added for stress */ /* Check stress effect parameters */ - if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && - ((here->B4SOInf == 1.0) || ((here->B4SOInf > 1.0) && + if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && + ((here->B4SOInf == 1.0) || ((here->B4SOInf > 1.0) && (here->B4SOIsd > 0.0))) ) { if (model->B4SOIlodk2 <= 0.0) { fprintf(fplog, "Warning: LODK2 = %g is not positive.\n",model->B4SOIlodk2); @@ -328,38 +331,77 @@ FILE *fplog; pParam->B4SOIacde); } } -/* v2.2.3 */ - + +/* v4.2 always perform Fatal checks */ + if (pParam->B4SOInigc <= 0.0) + { fprintf(fplog, "Fatal: nigc = %g is non-positive.\n", + pParam->B4SOInigc); + printf("Fatal: nigc = %g is non-positive.\n", pParam->B4SOInigc); + Fatal_Flag = 1; + } + if (pParam->B4SOIpoxedge <= 0.0) + { fprintf(fplog, "Fatal: poxedge = %g is non-positive.\n", + pParam->B4SOIpoxedge); + printf("Fatal: poxedge = %g is non-positive.\n", pParam->B4SOIpoxedge); + Fatal_Flag = 1; + } + if (pParam->B4SOIpigcd <= 0.0) + { fprintf(fplog, "Fatal: pigcd = %g is non-positive.\n", + pParam->B4SOIpigcd); + printf("Fatal: pigcd = %g is non-positive.\n", pParam->B4SOIpigcd); + Fatal_Flag = 1; + } + + if (model->B4SOItoxref < 0.0) + { fprintf(fplog, "Warning: TOXREF = %g is negative.\n", + model->B4SOItoxref); + printf("Warning: Toxref = %g is negative.\n", model->B4SOItoxref); + Fatal_Flag = 1; + } + + if (model->B4SOItoxqm <= 0.0) + { fprintf(fplog, "Fatal: Toxqm = %g is not positive.\n", + model->B4SOItoxqm); + printf("Fatal: Toxqm = %g is not positive.\n", model->B4SOItoxqm); + Fatal_Flag = 1; + } + + if (model->B4SOIdeltavox <= 0.0) + { fprintf(fplog, "Fatal: Deltavox = %g is not positive.\n", + model->B4SOIdeltavox); + printf("Fatal: Deltavox = %g is not positive.\n", model->B4SOIdeltavox); + } + if (model->B4SOIparamChk ==1) { -/* Check L and W parameters */ +/* Check L and W parameters */ if (pParam->B4SOIleff <= 5.0e-8) { fprintf(fplog, "Warning: Leff = %g may be too small.\n", pParam->B4SOIleff); printf("Warning: Leff = %g may be too small.\n", pParam->B4SOIleff); - } + } if (pParam->B4SOIleffCV <= 5.0e-8) { fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n", pParam->B4SOIleffCV); printf("Warning: Leff for CV = %g may be too small.\n", pParam->B4SOIleffCV); - } + } if (pParam->B4SOIweff <= 1.0e-7) { fprintf(fplog, "Warning: Weff = %g may be too small.\n", pParam->B4SOIweff); printf("Warning: Weff = %g may be too small.\n", pParam->B4SOIweff); - } + } if (pParam->B4SOIweffCV <= 1.0e-7) { fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n", pParam->B4SOIweffCV); printf("Warning: Weff for CV = %g may be too small.\n", pParam->B4SOIweffCV); - } + } /* Check threshold voltage parameters */ if (pParam->B4SOIlpe0 < 0.0) @@ -399,18 +441,33 @@ FILE *fplog; printf("Warning: Ngate = %g is less than 1.E18cm^-3.\n", pParam->B4SOIngate); } - + if (pParam->B4SOIdvt0 < 0.0) { fprintf(fplog, "Warning: Dvt0 = %g is negative.\n", - pParam->B4SOIdvt0); - printf("Warning: Dvt0 = %g is negative.\n", pParam->B4SOIdvt0); + pParam->B4SOIdvt0); + printf("Warning: Dvt0 = %g is negative.\n", pParam->B4SOIdvt0); } - + if (fabs(1.0e-6 / (pParam->B4SOIw0 + pParam->B4SOIweff)) > 10.0) { fprintf(fplog, "Warning: (W0 + Weff) may be too small.\n"); printf("Warning: (W0 + Weff) may be too small.\n"); } - +/* Check Nsd, Ngate and Npeak parameters*/ /* Bug Fix # 22 Jul09*/ +if (model->B4SOInsd > 1.0e23) + { fprintf(fplog, "Warning: Nsd = %g is too large, should be specified in cm^-3.\n", + model->B4SOInsd); + printf("Warning: Nsd = %g is too large, should be specified in cm^-3.\n", model->B4SOInsd); + } +if (model->B4SOIngate > 1.0e23) + { fprintf(fplog, "Warning: Ngate = %g is too large, should be specified in cm^-3.\n", + model->B4SOIngate); + printf("Warning: Ngate = %g is too large, should be specified in cm^-3.\n", model->B4SOIngate); + } +if (model->B4SOInpeak > 1.0e20) + { fprintf(fplog, "Warning: Npeak = %g is too large, should be less than 1.0e20, specified in cm^-3.\n", + model->B4SOInpeak); + printf("Warning: Npeak = %g is too large, should be less than 1.0e20, specified in cm^-3.\n", model->B4SOInpeak); + } /* Check subthreshold parameters */ if (pParam->B4SOInfactor < 0.0) { fprintf(fplog, "Warning: Nfactor = %g is negative.\n", @@ -430,15 +487,15 @@ FILE *fplog; /* Check DIBL parameters */ if (pParam->B4SOIeta0 < 0.0) { fprintf(fplog, "Warning: Eta0 = %g is negative.\n", - pParam->B4SOIeta0); - printf("Warning: Eta0 = %g is negative.\n", pParam->B4SOIeta0); + pParam->B4SOIeta0); + printf("Warning: Eta0 = %g is negative.\n", pParam->B4SOIeta0); } - -/* Check Abulk parameters */ + +/* Check Abulk parameters */ if (fabs(1.0e-6 / (pParam->B4SOIb1 + pParam->B4SOIweff)) > 10.0) { fprintf(fplog, "Warning: (B1 + Weff) may be too small.\n"); printf("Warning: (B1 + Weff) may be too small.\n"); - } + } /* Check Saturation parameters */ if (pParam->B4SOIa2 < 0.01) @@ -492,12 +549,12 @@ FILE *fplog; { fprintf(fplog, "Warning: cgdo = %g is negative. Set to zero.\n", model->B4SOIcgdo); printf("Warning: cgdo = %g is negative. Set to zero.\n", model->B4SOIcgdo); model->B4SOIcgdo = 0.0; - } + } if (model->B4SOIcgso < 0.0) { fprintf(fplog, "Warning: cgso = %g is negative. Set to zero.\n", model->B4SOIcgso); printf("Warning: cgso = %g is negative. Set to zero.\n", model->B4SOIcgso); model->B4SOIcgso = 0.0; - } + } if (model->B4SOIcgeo < 0.0) { fprintf(fplog, "Warning: cgeo = %g is negative. Set to zero.\n", model->B4SOIcgeo); printf("Warning: cgeo = %g is negative. Set to zero.\n", model->B4SOIcgeo); @@ -506,32 +563,32 @@ FILE *fplog; if (model->B4SOIntun < 0.0) { fprintf(fplog, "Warning: Ntuns = %g is negative.\n", - model->B4SOIntun); - printf("Warning: Ntuns = %g is negative.\n", model->B4SOIntun); + model->B4SOIntun); + printf("Warning: Ntuns = %g is negative.\n", model->B4SOIntun); } if (model->B4SOIntund < 0.0) { fprintf(fplog, "Warning: Ntund = %g is negative.\n", - model->B4SOIntund); - printf("Warning: Ntund = %g is negative.\n", model->B4SOIntund); + model->B4SOIntund); + printf("Warning: Ntund = %g is negative.\n", model->B4SOIntund); } if (model->B4SOIndiode < 0.0) { fprintf(fplog, "Warning: Ndiode = %g is negative.\n", - model->B4SOIndiode); + model->B4SOIndiode); printf("Warning: Ndiode = %g is negative.\n", model->B4SOIndiode); } if (model->B4SOIndioded < 0.0) { fprintf(fplog, "Warning: Ndioded = %g is negative.\n", - model->B4SOIndioded); + model->B4SOIndioded); printf("Warning: Ndioded = %g is negative.\n", model->B4SOIndioded); } if (model->B4SOIisbjt < 0.0) { fprintf(fplog, "Warning: Isbjt = %g is negative.\n", - model->B4SOIisbjt); - printf("Warning: Isbjt = %g is negative.\n", model->B4SOIisbjt); + model->B4SOIisbjt); + printf("Warning: Isbjt = %g is negative.\n", model->B4SOIisbjt); } if (model->B4SOIidbjt < 0.0) { fprintf(fplog, "Warning: Idbjt = %g is negative.\n", @@ -541,8 +598,8 @@ FILE *fplog; if (model->B4SOIisdif < 0.0) { fprintf(fplog, "Warning: Isdif = %g is negative.\n", - model->B4SOIisdif); - printf("Warning: Isdif = %g is negative.\n", model->B4SOIisdif); + model->B4SOIisdif); + printf("Warning: Isdif = %g is negative.\n", model->B4SOIisdif); } if (model->B4SOIiddif < 0.0) { fprintf(fplog, "Warning: Iddif = %g is negative.\n", @@ -552,8 +609,8 @@ FILE *fplog; if (model->B4SOIisrec < 0.0) { fprintf(fplog, "Warning: Isrec = %g is negative.\n", - model->B4SOIisrec); - printf("Warning: Isrec = %g is negative.\n", model->B4SOIisrec); + model->B4SOIisrec); + printf("Warning: Isrec = %g is negative.\n", model->B4SOIisrec); } if (model->B4SOIidrec < 0.0) { fprintf(fplog, "Warning: Idrec = %g is negative.\n", @@ -563,8 +620,8 @@ FILE *fplog; if (model->B4SOIistun < 0.0) { fprintf(fplog, "Warning: Istun = %g is negative.\n", - model->B4SOIistun); - printf("Warning: Istun = %g is negative.\n", model->B4SOIistun); + model->B4SOIistun); + printf("Warning: Istun = %g is negative.\n", model->B4SOIistun); } if (model->B4SOIidtun < 0.0) { fprintf(fplog, "Warning: Idtun = %g is negative.\n", @@ -574,74 +631,53 @@ FILE *fplog; if (model->B4SOItt < 0.0) { fprintf(fplog, "Warning: Tt = %g is negative.\n", - model->B4SOItt); - printf("Warning: Tt = %g is negative.\n", model->B4SOItt); + model->B4SOItt); + printf("Warning: Tt = %g is negative.\n", model->B4SOItt); } if (model->B4SOIcsdmin < 0.0) { fprintf(fplog, "Warning: Csdmin = %g is negative.\n", - model->B4SOIcsdmin); - printf("Warning: Csdmin = %g is negative.\n", model->B4SOIcsdmin); + model->B4SOIcsdmin); + printf("Warning: Csdmin = %g is negative.\n", model->B4SOIcsdmin); } if (model->B4SOIcsdesw < 0.0) { fprintf(fplog, "Warning: Csdesw = %g is negative.\n", - model->B4SOIcsdesw); - printf("Warning: Csdesw = %g is negative.\n", model->B4SOIcsdesw); + model->B4SOIcsdesw); + printf("Warning: Csdesw = %g is negative.\n", model->B4SOIcsdesw); } if (model->B4SOIasd < 0.0) { fprintf(fplog, "Warning: Asd = %g should be within (0, 1).\n", - model->B4SOIasd); - printf("Warning: Asd = %g should be within (0, 1).\n", model->B4SOIasd); + model->B4SOIasd); + printf("Warning: Asd = %g should be within (0, 1).\n", model->B4SOIasd); } if (model->B4SOIrth0 < 0.0) { fprintf(fplog, "Warning: Rth0 = %g is negative.\n", - model->B4SOIrth0); - printf("Warning: Rth0 = %g is negative.\n", model->B4SOIrth0); + model->B4SOIrth0); + printf("Warning: Rth0 = %g is negative.\n", model->B4SOIrth0); } if (model->B4SOIcth0 < 0.0) { fprintf(fplog, "Warning: Cth0 = %g is negative.\n", - model->B4SOIcth0); - printf("Warning: Cth0 = %g is negative.\n", model->B4SOIcth0); + model->B4SOIcth0); + printf("Warning: Cth0 = %g is negative.\n", model->B4SOIcth0); } if (model->B4SOIrbody < 0.0) { fprintf(fplog, "Warning: Rbody = %g is negative.\n", - model->B4SOIrbody); - printf("Warning: Rbody = %g is negative.\n", model->B4SOIrbody); + model->B4SOIrbody); + printf("Warning: Rbody = %g is negative.\n", model->B4SOIrbody); } if (model->B4SOIrbsh < 0.0) { fprintf(fplog, "Warning: Rbsh = %g is negative.\n", - model->B4SOIrbsh); - printf("Warning: Rbsh = %g is negative.\n", model->B4SOIrbsh); + model->B4SOIrbsh); + printf("Warning: Rbsh = %g is negative.\n", model->B4SOIrbsh); } -/* v3.0 */ - if (pParam->B4SOInigc <= 0.0) - { fprintf(fplog, "Fatal: nigc = %g is non-positive.\n", - pParam->B4SOInigc); - printf("Fatal: nigc = %g is non-positive.\n", pParam->B4SOInigc); - Fatal_Flag = 1; - } - if (pParam->B4SOIpoxedge <= 0.0) - { fprintf(fplog, "Fatal: poxedge = %g is non-positive.\n", - pParam->B4SOIpoxedge); - printf("Fatal: poxedge = %g is non-positive.\n", pParam->B4SOIpoxedge); - Fatal_Flag = 1; - } - if (pParam->B4SOIpigcd <= 0.0) - { fprintf(fplog, "Fatal: pigcd = %g is non-positive.\n", - pParam->B4SOIpigcd); - printf("Fatal: pigcd = %g is non-positive.\n", pParam->B4SOIpigcd); - Fatal_Flag = 1; - } - - /* v2.2 release */ if (model->B4SOIwth0 < 0.0) { fprintf(fplog, "Warning: WTH0 = %g is negative.\n", @@ -658,12 +694,6 @@ FILE *fplog; model->B4SOIntox); printf("Warning: Ntox = %g is negative.\n", model->B4SOIntox); } - if (model->B4SOItoxref < 0.0) - { fprintf(fplog, "Warning: TOXREF = %g is negative.\n", - model->B4SOItoxref); - printf("Warning: Toxref = %g is negative.\n", model->B4SOItoxref); - Fatal_Flag = 1; - } if (model->B4SOIebg < 0.0) { fprintf(fplog, "Warning: EBG = %g is negative.\n", model->B4SOIebg); @@ -709,26 +739,14 @@ FILE *fplog; model->B4SOIvgb2); printf("Warning: Vgb2 = %g is negative.\n", model->B4SOIvgb2); } - if (model->B4SOItoxqm <= 0.0) - { fprintf(fplog, "Fatal: Toxqm = %g is not positive.\n", - model->B4SOItoxqm); - printf("Fatal: Toxqm = %g is not positive.\n", model->B4SOItoxqm); - Fatal_Flag = 1; - } if (model->B4SOIvoxh < 0.0) { fprintf(fplog, "Warning: Voxh = %g is negative.\n", model->B4SOIvoxh); printf("Warning: Voxh = %g is negative.\n", model->B4SOIvoxh); } - if (model->B4SOIdeltavox <= 0.0) - { fprintf(fplog, "Fatal: Deltavox = %g is not positive.\n", - model->B4SOIdeltavox); - printf("Fatal: Deltavox = %g is not positive.\n", model->B4SOIdeltavox); - } - /* v2.0 release */ - if (model->B4SOIk1w1 < 0.0) + if (model->B4SOIk1w1 < 0.0) { fprintf(fplog, "Warning: K1W1 = %g is negative.\n", model->B4SOIk1w1); printf("Warning: K1w1 = %g is negative.\n", model->B4SOIk1w1); @@ -779,7 +797,7 @@ FILE *fplog; printf("Warning: Sii1 = %g is negative.\n", model->B4SOIsii1); } if (model->B4SOIsii2 < 0.0) - { fprintf(fplog, "Warning: SII2 = %g is negative.\n", + { fprintf(fplog, "Warning: SII2 = %g is negative.\n", model->B4SOIsii2); printf("Warning: Sii2 = %g is negative.\n", model->B4SOIsii1); } @@ -843,7 +861,7 @@ FILE *fplog; model->B4SOIrbsh); printf("Warning: Rbsh = %g is negative.\n", model->B4SOIrbsh); } - if (pParam->B4SOIntrecf < 0.0) + /* if (pParam->B4SOIntrecf < 0.0) { fprintf(fplog, "Warning: NTRECF = %g is negative.\n", pParam->B4SOIntrecf); printf("Warning: Ntrecf = %g is negative.\n", pParam->B4SOIntrecf); @@ -852,7 +870,7 @@ FILE *fplog; { fprintf(fplog, "Warning: NTRECR = %g is negative.\n", pParam->B4SOIntrecr); printf("Warning: Ntrecr = %g is negative.\n", pParam->B4SOIntrecr); - } + } v4.2 bugfix: QA Test uses negative temp co-efficients*/ /* v3.0 bug fix */ /* @@ -863,7 +881,7 @@ FILE *fplog; } */ - if (model->B4SOItcjswg < 0.0) +/* if (model->B4SOItcjswg < 0.0) { fprintf(fplog, "Warning: TCJSWGS = %g is negative.\n", model->B4SOItcjswg); printf("Warning: Tcjswg = %g is negative.\n", model->B4SOItcjswg); @@ -882,7 +900,7 @@ FILE *fplog; { fprintf(fplog, "Warning: TPBSWGD = %g is negative.\n", model->B4SOItpbswgd); printf("Warning: Tpbswgd = %g is negative.\n", model->B4SOItpbswgd); - } + } v4.2 bugfix: QA Test uses negative temp co-efficients*/ if ((model->B4SOIacde < 0.1) || (model->B4SOIacde > 1.6)) { fprintf(fplog, "Warning: ACDE = %g is out of range.\n", model->B4SOIacde); @@ -913,7 +931,7 @@ FILE *fplog; if (fabs(model->B4SOIcgidl) < 1e-9) { fprintf(fplog, "Warning: CGIDL = %g is smaller than 1e-9.\n", model->B4SOIcgidl); - printf("Warning: Cgidl = %g is smaller than 1e-9.\n", + printf("Warning: Cgidl = %g is smaller than 1e-9.\n", model->B4SOIcgidl); } if (model->B4SOIegidl < 0.0) @@ -935,7 +953,7 @@ FILE *fplog; if (fabs(model->B4SOIcgisl) < 1e-9) { fprintf(fplog, "Warning: CGISL = %g is smaller than 1e-9.\n", model->B4SOIcgisl); - printf("Warning: Cgisl = %g is smaller than 1e-9.\n", + printf("Warning: Cgisl = %g is smaller than 1e-9.\n", model->B4SOIcgisl); } if (model->B4SOIegisl < 0.0) @@ -949,22 +967,28 @@ FILE *fplog; model->B4SOIesatii); printf("Warning: Esatii = %g should be within (0, 1).\n", model->B4SOIesatii); } - - - + + if (!model->B4SOIvgstcvModGiven) + { fprintf(fplog, "Warning: The default vgstcvMod is changed in v4.2 from '0' to '1'.\n"); + printf("Warning: The default vgstcvMod is changed in v4.2 from '0' to '1'.\n"); + } if (pParam->B4SOIxj > model->B4SOItsi) { fprintf(fplog, "Warning: Xj = %g is thicker than Tsi = %g.\n", - pParam->B4SOIxj, model->B4SOItsi); - printf("Warning: Xj = %g is thicker than Tsi = %g.\n", - pParam->B4SOIxj, model->B4SOItsi); + pParam->B4SOIxj, model->B4SOItsi); + printf("Warning: Xj = %g is thicker than Tsi = %g.\n", + pParam->B4SOIxj, model->B4SOItsi); } if (model->B4SOIcapMod < 2) { fprintf(fplog, "Warning: capMod < 2 is not supported by BSIM3SOI.\n"); printf("Warning: Warning: capMod < 2 is not supported by BSIM3SOI.\n"); + } + if (model->B4SOIcapMod > 3) + { fprintf(fplog, "Warning: capMod > 3 is not supported by BSIMSOI4.2.\n"); + printf("Warning: Warning: capMod > 3 is not supported by BSIMSOI4.2.\n"); } - }/* loop for the parameter check for warning messages */ + }/* loop for the parameter check for warning messages */ fclose(fplog); } else diff --git a/src/spicelib/devices/bsim3soi/b4soicvtest.c b/src/spicelib/devices/bsim3soi/b4soicvtest.c index 21bc2a95a..4da2b3c0a 100644 --- a/src/spicelib/devices/bsim3soi/b4soicvtest.c +++ b/src/spicelib/devices/bsim3soi/b4soicvtest.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soicvtest.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" diff --git a/src/spicelib/devices/bsim3soi/b4soidef.h b/src/spicelib/devices/bsim3soi/b4soidef.h index 0626f4b55..78e0327ca 100644 --- a/src/spicelib/devices/bsim3soi/b4soidef.h +++ b/src/spicelib/devices/bsim3soi/b4soidef.h @@ -3,7 +3,8 @@ Copyright 2009 Regents of the University of California. All rights reserved. Author: 1998 Samuel Fung authors:1999-2004 Pin Su, Hui Wan b3soidef.h Authors:2005- Hui Wan, Jane Xi -Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. +Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu +Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu File: b4soidef.h **********/ @@ -20,7 +21,7 @@ File: b4soidef.h #include "gendefs.h" #include "cktdefs.h" #include "complex.h" -#include "noisedef.h" +#include "noisedef.h" typedef struct sB4SOIinstance { @@ -70,7 +71,7 @@ typedef struct sB4SOIinstance double B4SOIvtm; double B4SOIni; double B4SOIueff; - double B4SOIthetavth; + double B4SOIthetavth; double B4SOIvon; double B4SOIvdsat; double B4SOIcgdo; @@ -122,12 +123,13 @@ typedef struct sB4SOIinstance double B4SOIigp; /* v4.1 for Igb in the AGBCP2 region */ double B4SOIgigpg; /* v4.1 for Igb in the AGBCP2 region */ double B4SOIgigpp; /* v4.1 for Igb in the AGBCP2 region */ + double B4SOITempSH; /* v4.2 for portability of SH temp */ double B4SOIigidl; double B4SOIigisl; double B4SOIitun; double B4SOIibp; - double B4SOIabeff; + /* double B4SOIabeff; */ /* v4.2 never used in the code */ double B4SOIvbseff; double B4SOIcbg; double B4SOIcbb; @@ -191,7 +193,7 @@ typedef struct sB4SOIinstance double B4SOIfrbody; /* v2.0 release */ - double B4SOInbc; + double B4SOInbc; double B4SOInseg; double B4SOIpdbcp; double B4SOIpsbcp; @@ -221,7 +223,7 @@ typedef struct sB4SOIinstance /* v3.2 added */ double B4SOInstar; - double B4SOIAbulk; + double B4SOIAbulk; /* v3.2 added end */ int B4SOIsoiMod; /* v3.2 */ @@ -249,7 +251,7 @@ typedef struct sB4SOIinstance double B4SOIcbodcon; double B4SOIcth; - double B4SOIcsubstrate; + /* double B4SOIcsubstrate; */ /* v4.2 never used in the code */ double B4SOIgm; double B4SOIgme; /* v3.0 */ @@ -317,7 +319,7 @@ typedef struct sB4SOIinstance double B4SOIqdrn; double B4SOIqsrc; double B4SOIqbulk; - double B4SOIcapbd; + double B4SOIcapbd; double B4SOIcapbs; @@ -351,7 +353,7 @@ typedef struct sB4SOIinstance double B4SOIAbovVgst2Vtm; /* v2.2.3 */ /* 4.0 */ - double B4SOIidovVds; + double B4SOIidovVds; double B4SOIcjsb; double B4SOIcjdb; @@ -362,7 +364,7 @@ typedef struct sB4SOIinstance unsigned B4SOIlGiven :1; unsigned B4SOIwGiven :1; unsigned B4SOImGiven :1; - + unsigned B4SOIdrainAreaGiven :1; unsigned B4SOIsourceAreaGiven :1; unsigned B4SOIdrainSquaresGiven :1; @@ -390,7 +392,7 @@ typedef struct sB4SOIinstance unsigned B4SOIfrbodyGiven: 1; /* v2.0 release */ - unsigned B4SOInbcGiven :1; + unsigned B4SOInbcGiven :1; unsigned B4SOInsegGiven :1; unsigned B4SOIpdbcpGiven :1; unsigned B4SOIpsbcpGiven :1; @@ -567,9 +569,11 @@ typedef struct sB4SOIinstance #define B4SOIvges B4SOIstates+ 27 #define B4SOIvgms B4SOIstates+ 28 #define B4SOIvgge B4SOIstates+ 29 -#define B4SOIvggm B4SOIstates+ 30 -#define B4SOIcqgmid B4SOIstates+ 31 -#define B4SOIqgmid B4SOIstates + 32 +#define B4SOIvggm B4SOIstates+ 30 +/* #define B4SOIcqgmid B4SOIstates+ 31 */ /* Bug # 29 */ +/* #define B4SOIqgmid B4SOIstates + 32 */ /* Bug # 29 */ +#define B4SOIqgmid B4SOIstates+ 31 /* Bug Fix # 29 Jul09*/ +#define B4SOIcqgmid B4SOIstates + 32 /* Bug Fix # 29 Jul09*/ /* v3.1 added or changed for RF end */ /* v4.0 */ @@ -580,7 +584,7 @@ typedef struct sB4SOIinstance #define B4SOIvdes B4SOIstates + 37 /* v4.0 end */ -#define B4SOInumStates 38 +#define B4SOInumStates 38 /* indices to the array of B4SOI NOISE SOURCES */ @@ -616,29 +620,29 @@ struct b4soiSizeDependParam double Rth0; double Cth0; - double B4SOIcdsc; - double B4SOIcdscb; - double B4SOIcdscd; - double B4SOIcit; - double B4SOInfactor; - double B4SOIvsat; - double B4SOIat; - double B4SOIa0; - double B4SOIags; - double B4SOIa1; - double B4SOIa2; - double B4SOIketa; - double B4SOInpeak; + double B4SOIcdsc; + double B4SOIcdscb; + double B4SOIcdscd; + double B4SOIcit; + double B4SOInfactor; + double B4SOIvsat; + double B4SOIat; + double B4SOIa0; + double B4SOIags; + double B4SOIa1; + double B4SOIa2; + double B4SOIketa; + double B4SOInpeak; double B4SOInsub; double B4SOIngate; double B4SOInsd; - double B4SOIgamma1; - double B4SOIgamma2; - double B4SOIvbx; - double B4SOIvbi; - double B4SOIvbm; - double B4SOIvbsc; - double B4SOIxt; + double B4SOIgamma1; + double B4SOIgamma2; + double B4SOIvbx; + double B4SOIvbi; + double B4SOIvbm; + double B4SOIvbsc; + double B4SOIxt; double B4SOIphi; double B4SOIlitl; double B4SOIk1; @@ -650,14 +654,14 @@ struct b4soiSizeDependParam double B4SOIk3b; double B4SOIw0; double B4SOIlpe0; - double B4SOIdvt0; - double B4SOIdvt1; - double B4SOIdvt2; - double B4SOIdvt0w; - double B4SOIdvt1w; - double B4SOIdvt2w; - double B4SOIdrout; - double B4SOIdsub; + double B4SOIdvt0; + double B4SOIdvt1; + double B4SOIdvt2; + double B4SOIdvt0w; + double B4SOIdvt1w; + double B4SOIdvt2w; + double B4SOIdrout; + double B4SOIdsub; double B4SOIvth0; double B4SOIua; double B4SOIua1; @@ -694,30 +698,30 @@ struct b4soiSizeDependParam double B4SOIjrecd; /* v4.0 */ double B4SOIjtuns; /* v4.0 */ double B4SOIjtund; /* v4.0 */ - double B4SOIrdw; /* v4.0 for rdsMod = 1 */ - double B4SOIrsw; /* v4.0 for rdsMod = 1 */ - double B4SOIrdwmin; /* v4.0 for rdsMod = 1 */ - double B4SOIrswmin; /* v4.0 for rdsMod = 1 */ - double B4SOIrd0; /* v4.0 for rdsMod = 1 */ - double B4SOIrs0; /* v4.0 for rdsMod = 1 */ + double B4SOIrdw; /* v4.0 for rdsMod = 1 */ + double B4SOIrsw; /* v4.0 for rdsMod = 1 */ + double B4SOIrdwmin; /* v4.0 for rdsMod = 1 */ + double B4SOIrswmin; /* v4.0 for rdsMod = 1 */ + double B4SOIrd0; /* v4.0 for rdsMod = 1 */ + double B4SOIrs0; /* v4.0 for rdsMod = 1 */ double B4SOIsdt1; double B4SOIst2; double B4SOIst3; double B4SOIdt2; double B4SOIdt3; double B4SOIdelta; - double B4SOIrdsw; - double B4SOIrds0; - double B4SOIprwg; - double B4SOIprwb; - double B4SOIprt; - double B4SOIeta0; - double B4SOIetab; - double B4SOIpclm; - double B4SOIpdibl1; - double B4SOIpdibl2; - double B4SOIpdiblb; - double B4SOIpvag; + double B4SOIrdsw; + double B4SOIrds0; + double B4SOIprwg; + double B4SOIprwb; + double B4SOIprt; + double B4SOIeta0; + double B4SOIetab; + double B4SOIpclm; + double B4SOIpdibl1; + double B4SOIpdibl2; + double B4SOIpdiblb; + double B4SOIpvag; double B4SOIwr; double B4SOIdwg; double B4SOIdwb; @@ -868,14 +872,14 @@ struct b4soiSizeDependParam double B4SOIcgdo; double B4SOIcgeo; - double B4SOIu0temp; - double B4SOIvsattemp; - double B4SOIsqrtPhi; - double B4SOIphis3; - double B4SOIXdep0; - double B4SOIsqrtXdep0; + double B4SOIu0temp; + double B4SOIvsattemp; + double B4SOIsqrtPhi; + double B4SOIphis3; + double B4SOIXdep0; + double B4SOIsqrtXdep0; double B4SOItheta0vb0; - double B4SOIthetaRout; + double B4SOIthetaRout; /* v3.2 */ @@ -907,17 +911,18 @@ struct b4soiSizeDependParam double B4SOIleffCVb; double B4SOIleffCVbg; - double B4SOIcof1; + /* double B4SOIcof1; double B4SOIcof2; double B4SOIcof3; - double B4SOIcof4; + double B4SOIcof4; */ /* v4.2 nover used in the code */ double B4SOIcdep0; /* v3.0 */ double B4SOIToxRatio; double B4SOIAechvb; double B4SOIBechvb; double B4SOIToxRatioEdge; - double B4SOIAechvbEdge; + double B4SOIAechvbEdges; /* LFW */ + double B4SOIAechvbEdged; /* LFW */ double B4SOIBechvbEdge; double B4SOIvfbsd; /* v4.0 */ @@ -945,12 +950,12 @@ struct b4soiSizeDependParam }; -typedef struct sB4SOImodel +typedef struct sB4SOImodel { int B4SOImodType; struct sB4SOImodel *B4SOInextModel; B4SOIinstance *B4SOIinstances; - IFuid B4SOImodName; + IFuid B4SOImodName; int B4SOItype; int B4SOImobMod; @@ -965,7 +970,7 @@ typedef struct sB4SOImodel int B4SOIgidlMod; int B4SOIiiiMod; - double B4SOIversion; + double B4SOIversion; double B4SOIeot; /*4.1*/ double B4SOIepsrox; @@ -986,33 +991,33 @@ typedef struct sB4SOImodel double B4SOIeasub; double B4SOItvbci; - double B4SOItox; + double B4SOItox; double B4SOItoxm; /* v3.2 */ double B4SOIdtoxcv; /* v2.2.3 */ - double B4SOIcdsc; - double B4SOIcdscb; - double B4SOIcdscd; - double B4SOIcit; - double B4SOInfactor; - double B4SOIvsat; - double B4SOIat; - double B4SOIa0; - double B4SOIags; - double B4SOIa1; - double B4SOIa2; - double B4SOIketa; + double B4SOIcdsc; + double B4SOIcdscb; + double B4SOIcdscd; + double B4SOIcit; + double B4SOInfactor; + double B4SOIvsat; + double B4SOIat; + double B4SOIa0; + double B4SOIags; + double B4SOIa1; + double B4SOIa2; + double B4SOIketa; double B4SOInsub; - double B4SOInpeak; + double B4SOInpeak; double B4SOIngate; double B4SOInsd; double B4SOIlnsd; double B4SOIwnsd; double B4SOIpnsd; - double B4SOIgamma1; - double B4SOIgamma2; - double B4SOIvbx; - double B4SOIvbm; - double B4SOIxt; + double B4SOIgamma1; + double B4SOIgamma2; + double B4SOIvbx; + double B4SOIvbm; + double B4SOIxt; double B4SOIk1; double B4SOIkt1; double B4SOIkt1l; @@ -1022,14 +1027,14 @@ typedef struct sB4SOImodel double B4SOIk3b; double B4SOIw0; double B4SOIlpe0; - double B4SOIdvt0; - double B4SOIdvt1; - double B4SOIdvt2; - double B4SOIdvt0w; - double B4SOIdvt1w; - double B4SOIdvt2w; - double B4SOIdrout; - double B4SOIdsub; + double B4SOIdvt0; + double B4SOIdvt1; + double B4SOIdvt2; + double B4SOIdvt0w; + double B4SOIdvt1w; + double B4SOIdvt2w; + double B4SOIdrout; + double B4SOIdsub; double B4SOIvth0; double B4SOIua; double B4SOIua1; @@ -1067,21 +1072,21 @@ typedef struct sB4SOImodel double B4SOIvoff; double B4SOIdelta; - double B4SOIrdsw; + double B4SOIrdsw; double B4SOIrdw; /* v4.0 for rdsMod = 1 */ double B4SOIrsw; /* v4.0 for rdsMod = 1 */ double B4SOIrdwmin; /* v4.0 for rdsMod = 1 */ double B4SOIrswmin; /* v4.0 for rdsMod = 1 */ double B4SOIprwg; double B4SOIprwb; - double B4SOIprt; - double B4SOIeta0; - double B4SOIetab; - double B4SOIpclm; - double B4SOIpdibl1; - double B4SOIpdibl2; + double B4SOIprt; + double B4SOIeta0; + double B4SOIetab; + double B4SOIpclm; + double B4SOIpdibl1; + double B4SOIpdibl2; double B4SOIpdiblb; - double B4SOIpvag; + double B4SOIpvag; double B4SOIwr; double B4SOIdwg; double B4SOIdwb; @@ -1105,7 +1110,7 @@ typedef struct sB4SOImodel double B4SOIegisl; double B4SOIagisl; double B4SOIbgisl; - double B4SOIcgisl; + double B4SOIcgisl; double B4SOIrgisl; double B4SOIkgisl; double B4SOIfgisl; @@ -1165,7 +1170,7 @@ typedef struct sB4SOImodel double B4SOItnoib; double B4SOIrnoia; double B4SOIrnoib; - double B4SOIntnoi; + double B4SOIntnoi; /* v3.2 for noise end */ /* v4.0 */ @@ -1176,13 +1181,13 @@ typedef struct sB4SOImodel double B4SOIfrbody; int B4SOIrdsMod; /* v4.0 */ - + /* v4.0 end */ /* v4.1 */ int B4SOIfdMod; double B4SOIvfb; - double B4SOIvsce; - double B4SOIcdsbs; + double B4SOIvsce; + double B4SOIcdsbs; double B4SOIminvcv; double B4SOIlminvcv; double B4SOIwminvcv; @@ -1218,7 +1223,7 @@ typedef struct sB4SOImodel /* v2.0 release */ - double B4SOIk1w1; + double B4SOIk1w1; double B4SOIk1w2; double B4SOIketas; double B4SOIdwbc; @@ -1304,8 +1309,8 @@ typedef struct sB4SOImodel double B4SOIcgeo; double B4SOIxpart; - double B4SOIcFringOut; - double B4SOIcFringMax; + /* double B4SOIcFringOut; + double B4SOIcFringMax; */ /* v4.2 never used in the code */ double B4SOIsheetResistance; double B4SOIbodyJctGateSideSGradingCoeff; /* v4.0 */ @@ -1385,9 +1390,9 @@ typedef struct sB4SOImodel double B4SOIlpigcd; double B4SOIlpoxedge; - double B4SOIlnpeak; + double B4SOIlnpeak; double B4SOIlnsub; - double B4SOIlngate; + double B4SOIlngate; double B4SOIlvth0; double B4SOIlvfb; /* v4.1 */ double B4SOIlk1; @@ -1399,48 +1404,48 @@ typedef struct sB4SOImodel double B4SOIlkb1; double B4SOIlw0; double B4SOIllpe0; - double B4SOIldvt0; - double B4SOIldvt1; - double B4SOIldvt2; - double B4SOIldvt0w; - double B4SOIldvt1w; - double B4SOIldvt2w; + double B4SOIldvt0; + double B4SOIldvt1; + double B4SOIldvt2; + double B4SOIldvt0w; + double B4SOIldvt1w; + double B4SOIldvt2w; double B4SOIlu0; double B4SOIlua; double B4SOIlub; double B4SOIluc; - double B4SOIlvsat; - double B4SOIla0; - double B4SOIlags; + double B4SOIlvsat; + double B4SOIla0; + double B4SOIlags; double B4SOIlb0; double B4SOIlb1; double B4SOIlketa; double B4SOIlketas; - double B4SOIla1; - double B4SOIla2; - double B4SOIlrdsw; - double B4SOIlrdw; /* v4.0 for rdsMod = 1 */ - double B4SOIlrsw; /* v4.0 for rdsMod = 1 */ + double B4SOIla1; + double B4SOIla2; + double B4SOIlrdsw; + double B4SOIlrdw; /* v4.0 for rdsMod = 1 */ + double B4SOIlrsw; /* v4.0 for rdsMod = 1 */ double B4SOIlprwb; double B4SOIlprwg; double B4SOIlwr; - double B4SOIlnfactor; + double B4SOIlnfactor; double B4SOIldwg; double B4SOIldwb; double B4SOIlvoff; - double B4SOIleta0; - double B4SOIletab; - double B4SOIldsub; - double B4SOIlcit; - double B4SOIlcdsc; - double B4SOIlcdscb; - double B4SOIlcdscd; - double B4SOIlpclm; - double B4SOIlpdibl1; - double B4SOIlpdibl2; - double B4SOIlpdiblb; - double B4SOIldrout; - double B4SOIlpvag; + double B4SOIleta0; + double B4SOIletab; + double B4SOIldsub; + double B4SOIlcit; + double B4SOIlcdsc; + double B4SOIlcdscb; + double B4SOIlcdscd; + double B4SOIlpclm; + double B4SOIlpdibl1; + double B4SOIlpdibl2; + double B4SOIlpdiblb; + double B4SOIldrout; + double B4SOIlpvag; double B4SOIldelta; double B4SOIlalpha0; double B4SOIlfbjtii; @@ -1453,13 +1458,13 @@ typedef struct sB4SOImodel double B4SOIlbeta0; double B4SOIlbeta1; - double B4SOIlbeta2; - double B4SOIlvdsatii0; - double B4SOIllii; - double B4SOIlesatii; - double B4SOIlsii0; - double B4SOIlsii1; - double B4SOIlsii2; + double B4SOIlbeta2; + double B4SOIlvdsatii0; + double B4SOIllii; + double B4SOIlesatii; + double B4SOIlsii0; + double B4SOIlsii1; + double B4SOIlsii2; double B4SOIlsiid; double B4SOIlagidl; double B4SOIlbgidl; @@ -1487,7 +1492,7 @@ typedef struct sB4SOImodel double B4SOIlidbjt; /* v4.0 */ double B4SOIlisdif; double B4SOIliddif; /* v4.0 */ - double B4SOIlisrec; + double B4SOIlisrec; double B4SOIlidrec; /* v4.0 */ double B4SOIlistun; double B4SOIlidtun; /* v4.0 */ @@ -1501,12 +1506,12 @@ typedef struct sB4SOImodel double B4SOIlaely; double B4SOIlahli; /* v4.0 */ double B4SOIlahlid; /* v4.0 */ - + /* v3.1 added for RF */ double B4SOIlxrcrg1; double B4SOIlxrcrg2; /* v3.1 added for RF end */ - + /* CV model */ double B4SOIlvsdfb; double B4SOIlvsdth; @@ -1559,9 +1564,9 @@ typedef struct sB4SOImodel double B4SOIwpigcd; double B4SOIwpoxedge; - double B4SOIwnpeak; + double B4SOIwnpeak; double B4SOIwnsub; - double B4SOIwngate; + double B4SOIwngate; double B4SOIwvth0; double B4SOIwvfb; /* v4.1 */ double B4SOIwk1; @@ -1573,48 +1578,48 @@ typedef struct sB4SOImodel double B4SOIwkb1; double B4SOIww0; double B4SOIwlpe0; - double B4SOIwdvt0; - double B4SOIwdvt1; - double B4SOIwdvt2; - double B4SOIwdvt0w; - double B4SOIwdvt1w; - double B4SOIwdvt2w; + double B4SOIwdvt0; + double B4SOIwdvt1; + double B4SOIwdvt2; + double B4SOIwdvt0w; + double B4SOIwdvt1w; + double B4SOIwdvt2w; double B4SOIwu0; double B4SOIwua; double B4SOIwub; double B4SOIwuc; - double B4SOIwvsat; - double B4SOIwa0; - double B4SOIwags; + double B4SOIwvsat; + double B4SOIwa0; + double B4SOIwags; double B4SOIwb0; double B4SOIwb1; double B4SOIwketa; double B4SOIwketas; - double B4SOIwa1; - double B4SOIwa2; - double B4SOIwrdsw; - double B4SOIwrdw; /* v4.0 for rdsMod = 1 */ - double B4SOIwrsw; /* v4.0 for rdsMod = 1 */ + double B4SOIwa1; + double B4SOIwa2; + double B4SOIwrdsw; + double B4SOIwrdw; /* v4.0 for rdsMod = 1 */ + double B4SOIwrsw; /* v4.0 for rdsMod = 1 */ double B4SOIwprwb; double B4SOIwprwg; double B4SOIwwr; - double B4SOIwnfactor; + double B4SOIwnfactor; double B4SOIwdwg; double B4SOIwdwb; double B4SOIwvoff; - double B4SOIweta0; - double B4SOIwetab; - double B4SOIwdsub; - double B4SOIwcit; - double B4SOIwcdsc; - double B4SOIwcdscb; - double B4SOIwcdscd; - double B4SOIwpclm; - double B4SOIwpdibl1; - double B4SOIwpdibl2; - double B4SOIwpdiblb; - double B4SOIwdrout; - double B4SOIwpvag; + double B4SOIweta0; + double B4SOIwetab; + double B4SOIwdsub; + double B4SOIwcit; + double B4SOIwcdsc; + double B4SOIwcdscb; + double B4SOIwcdscd; + double B4SOIwpclm; + double B4SOIwpdibl1; + double B4SOIwpdibl2; + double B4SOIwpdiblb; + double B4SOIwdrout; + double B4SOIwpvag; double B4SOIwdelta; double B4SOIwalpha0; double B4SOIwfbjtii; @@ -1627,13 +1632,13 @@ typedef struct sB4SOImodel double B4SOIwbeta0; double B4SOIwbeta1; - double B4SOIwbeta2; - double B4SOIwvdsatii0; - double B4SOIwlii; - double B4SOIwesatii; - double B4SOIwsii0; - double B4SOIwsii1; - double B4SOIwsii2; + double B4SOIwbeta2; + double B4SOIwvdsatii0; + double B4SOIwlii; + double B4SOIwesatii; + double B4SOIwsii0; + double B4SOIwsii1; + double B4SOIwsii2; double B4SOIwsiid; double B4SOIwagidl; double B4SOIwbgidl; @@ -1661,10 +1666,10 @@ typedef struct sB4SOImodel double B4SOIwidbjt; /* v4.0 */ double B4SOIwisdif; double B4SOIwiddif; /* v4.0 */ - double B4SOIwisrec; - double B4SOIwidrec; /* v4.0 */ - double B4SOIwistun; - double B4SOIwidtun; /* v4.0 */ + double B4SOIwisrec; + double B4SOIwidrec; /* v4.0 */ + double B4SOIwistun; + double B4SOIwidtun; /* v4.0 */ double B4SOIwvrec0; /* v4.0 */ double B4SOIwvrec0d; /* v4.0 */ double B4SOIwvtun0; /* v4.0 */ @@ -1675,12 +1680,12 @@ typedef struct sB4SOImodel double B4SOIwaely; double B4SOIwahli; /* v4.0 */ double B4SOIwahlid; /* v4.0 */ - + /* v3.1 added for RF */ double B4SOIwxrcrg1; double B4SOIwxrcrg2; /* v3.1 added for RF end */ - + /* CV model */ double B4SOIwvsdfb; double B4SOIwvsdth; @@ -1700,8 +1705,8 @@ typedef struct sB4SOImodel double B4SOIpbigbcp2; /* 4.1 */ double B4SOIpcigbcp2; /* 4.1 */ double B4SOIpndif; - double B4SOIpntrecf; - double B4SOIpntrecr; + double B4SOIpntrecf; + double B4SOIpntrecr; double B4SOIpxbjt; double B4SOIpxdif; double B4SOIpxrec; @@ -1733,9 +1738,9 @@ typedef struct sB4SOImodel double B4SOIppigcd; double B4SOIppoxedge; - double B4SOIpnpeak; + double B4SOIpnpeak; double B4SOIpnsub; - double B4SOIpngate; + double B4SOIpngate; double B4SOIpvth0; double B4SOIpvfb; /* v4.1 */ double B4SOIpk1; @@ -1747,48 +1752,48 @@ typedef struct sB4SOImodel double B4SOIpkb1; double B4SOIpw0; double B4SOIplpe0; - double B4SOIpdvt0; - double B4SOIpdvt1; - double B4SOIpdvt2; - double B4SOIpdvt0w; - double B4SOIpdvt1w; - double B4SOIpdvt2w; + double B4SOIpdvt0; + double B4SOIpdvt1; + double B4SOIpdvt2; + double B4SOIpdvt0w; + double B4SOIpdvt1w; + double B4SOIpdvt2w; double B4SOIpu0; double B4SOIpua; double B4SOIpub; double B4SOIpuc; - double B4SOIpvsat; - double B4SOIpa0; - double B4SOIpags; + double B4SOIpvsat; + double B4SOIpa0; + double B4SOIpags; double B4SOIpb0; double B4SOIpb1; double B4SOIpketa; double B4SOIpketas; - double B4SOIpa1; - double B4SOIpa2; - double B4SOIprdsw; - double B4SOIprdw; /* v4.0 for rdsMod = 1 */ - double B4SOIprsw; /* v4.0 for rdsMod = 1 */ + double B4SOIpa1; + double B4SOIpa2; + double B4SOIprdsw; + double B4SOIprdw; /* v4.0 for rdsMod = 1 */ + double B4SOIprsw; /* v4.0 for rdsMod = 1 */ double B4SOIpprwb; double B4SOIpprwg; double B4SOIpwr; - double B4SOIpnfactor; + double B4SOIpnfactor; double B4SOIpdwg; double B4SOIpdwb; double B4SOIpvoff; - double B4SOIpeta0; - double B4SOIpetab; - double B4SOIpdsub; - double B4SOIpcit; - double B4SOIpcdsc; - double B4SOIpcdscb; - double B4SOIpcdscd; - double B4SOIppclm; - double B4SOIppdibl1; - double B4SOIppdibl2; - double B4SOIppdiblb; - double B4SOIpdrout; - double B4SOIppvag; + double B4SOIpeta0; + double B4SOIpetab; + double B4SOIpdsub; + double B4SOIpcit; + double B4SOIpcdsc; + double B4SOIpcdscb; + double B4SOIpcdscd; + double B4SOIppclm; + double B4SOIppdibl1; + double B4SOIppdibl2; + double B4SOIppdiblb; + double B4SOIpdrout; + double B4SOIppvag; double B4SOIpdelta; double B4SOIpalpha0; double B4SOIpfbjtii; @@ -1801,13 +1806,13 @@ typedef struct sB4SOImodel double B4SOIpbeta0; double B4SOIpbeta1; - double B4SOIpbeta2; - double B4SOIpvdsatii0; - double B4SOIplii; - double B4SOIpesatii; - double B4SOIpsii0; - double B4SOIpsii1; - double B4SOIpsii2; + double B4SOIpbeta2; + double B4SOIpvdsatii0; + double B4SOIplii; + double B4SOIpesatii; + double B4SOIpsii0; + double B4SOIpsii1; + double B4SOIpsii2; double B4SOIpsiid; double B4SOIpagidl; double B4SOIpbgidl; @@ -1831,14 +1836,14 @@ typedef struct sB4SOImodel double B4SOIpnrecf0d; /* v4.0 */ double B4SOIpnrecr0; /* v4.0 */ double B4SOIpnrecr0d; /* v4.0 */ - double B4SOIpisbjt; - double B4SOIpidbjt; /* v4.0 */ + double B4SOIpisbjt; + double B4SOIpidbjt; /* v4.0 */ double B4SOIpisdif; double B4SOIpiddif; /* v4.0 */ - double B4SOIpisrec; - double B4SOIpidrec; /* v4.0 */ - double B4SOIpistun; - double B4SOIpidtun; /* v4.0 */ + double B4SOIpisrec; + double B4SOIpidrec; /* v4.0 */ + double B4SOIpistun; + double B4SOIpidtun; /* v4.0 */ double B4SOIpvrec0; /* v4.0 */ double B4SOIpvrec0d; /* v4.0 */ double B4SOIpvtun0; /* v4.0 */ @@ -1866,12 +1871,12 @@ typedef struct sB4SOImodel /* Pre-calculated constants */ double B4SOIcbox; double B4SOIcsi; - double B4SOIcsieff; + /* double B4SOIcsieff; double B4SOIcoxt; double B4SOInfb; - double B4SOIadice; + double B4SOIadice */ /* v4.2 never used in the code */ double B4SOIeg0; - + double B4SOIeg; /* Jun 09*/ /* v4.0 added for stress effect */ double B4SOIsaref; @@ -1898,23 +1903,23 @@ typedef struct sB4SOImodel /* v4.0 added for stress effect end */ /* MCJ: move to size-dependent param. */ - double B4SOIvtm; + double B4SOIvtm; double B4SOIcox; - double B4SOIcof1; + /* double B4SOIcof1; double B4SOIcof2; double B4SOIcof3; - double B4SOIcof4; + double B4SOIcof4 */ /* v4.2 never used in the code */ double B4SOIvcrit; double B4SOIfactor1; - double B4SOIoxideTrapDensityA; - double B4SOIoxideTrapDensityB; - double B4SOIoxideTrapDensityC; - double B4SOIem; - double B4SOIef; - double B4SOIaf; - double B4SOIkf; - double B4SOInoif; + double B4SOIoxideTrapDensityA; + double B4SOIoxideTrapDensityB; + double B4SOIoxideTrapDensityC; + double B4SOIem; + double B4SOIef; + double B4SOIaf; + double B4SOIkf; + double B4SOInoif; double B4SOIbf; /* v4.0 for noise */ double B4SOIw0flk; /* v4.0 for noise */ double B4SOIlpeb; /* v4.0 for Vth */ @@ -1975,7 +1980,7 @@ typedef struct sB4SOImodel unsigned B4SOIlngidlGiven :1; unsigned B4SOIwngidlGiven :1; unsigned B4SOIpngidlGiven :1; - + struct b4soiSizeDependParam *pSizeDependParamKnot; /* Flags */ @@ -2009,7 +2014,7 @@ typedef struct sB4SOImodel unsigned B4SOIdvbd0Given: 1; unsigned B4SOIdvbd1Given: 1; unsigned B4SOImoinFDGiven: 1; - + unsigned B4SOItboxGiven:1; unsigned B4SOItsiGiven :1; @@ -2070,7 +2075,7 @@ typedef struct sB4SOImodel unsigned B4SOIagsGiven :1; unsigned B4SOIa1Given :1; unsigned B4SOIa2Given :1; - unsigned B4SOIketaGiven :1; + unsigned B4SOIketaGiven :1; unsigned B4SOInsubGiven :1; unsigned B4SOInpeakGiven :1; unsigned B4SOIngateGiven :1; @@ -2089,14 +2094,14 @@ typedef struct sB4SOImodel unsigned B4SOIk3bGiven :1; unsigned B4SOIw0Given :1; unsigned B4SOIlpe0Given :1; - unsigned B4SOIdvt0Given :1; - unsigned B4SOIdvt1Given :1; - unsigned B4SOIdvt2Given :1; - unsigned B4SOIdvt0wGiven :1; - unsigned B4SOIdvt1wGiven :1; - unsigned B4SOIdvt2wGiven :1; - unsigned B4SOIdroutGiven :1; - unsigned B4SOIdsubGiven :1; + unsigned B4SOIdvt0Given :1; + unsigned B4SOIdvt1Given :1; + unsigned B4SOIdvt2Given :1; + unsigned B4SOIdvt0wGiven :1; + unsigned B4SOIdvt1wGiven :1; + unsigned B4SOIdvt2wGiven :1; + unsigned B4SOIdroutGiven :1; + unsigned B4SOIdsubGiven :1; unsigned B4SOIvth0Given :1; unsigned B4SOIuaGiven :1; unsigned B4SOIua1Given :1; @@ -2133,22 +2138,22 @@ typedef struct sB4SOImodel unsigned B4SOIpucsteGiven:1; unsigned B4SOIvoffGiven :1; - unsigned B4SOIrdswGiven :1; + unsigned B4SOIrdswGiven :1; unsigned B4SOIrdwGiven :1; /* v4.0 for rdsMod = 1 */ unsigned B4SOIrswGiven :1; /* v4.0 for rdsMod = 1 */ unsigned B4SOIrdwminGiven :1; /* v4.0 for rdsMod = 1 */ unsigned B4SOIrswminGiven :1; /* v4.0 for rdsMod = 1 */ - unsigned B4SOIprwgGiven :1; - unsigned B4SOIprwbGiven :1; - unsigned B4SOIprtGiven :1; - unsigned B4SOIeta0Given :1; - unsigned B4SOIetabGiven :1; - unsigned B4SOIpclmGiven :1; - unsigned B4SOIpdibl1Given :1; - unsigned B4SOIpdibl2Given :1; - unsigned B4SOIpdiblbGiven :1; - unsigned B4SOIpvagGiven :1; - unsigned B4SOIdeltaGiven :1; + unsigned B4SOIprwgGiven :1; + unsigned B4SOIprwbGiven :1; + unsigned B4SOIprtGiven :1; + unsigned B4SOIeta0Given :1; + unsigned B4SOIetabGiven :1; + unsigned B4SOIpclmGiven :1; + unsigned B4SOIpdibl1Given :1; + unsigned B4SOIpdibl2Given :1; + unsigned B4SOIpdiblbGiven :1; + unsigned B4SOIpvagGiven :1; + unsigned B4SOIdeltaGiven :1; unsigned B4SOIwrGiven :1; unsigned B4SOIdwgGiven :1; unsigned B4SOIdwbGiven :1; @@ -2194,7 +2199,7 @@ typedef struct sB4SOImodel unsigned B4SOIrbsbGiven :1; /* v4.0 end */ /* v4.1 */ - unsigned B4SOIfdModGiven :1; + unsigned B4SOIfdModGiven :1; unsigned B4SOIvsceGiven :1; unsigned B4SOIcdsbsGiven :1; unsigned B4SOIminvcvGiven :1; @@ -2233,7 +2238,7 @@ typedef struct sB4SOImodel unsigned B4SOIcigcGiven :1; unsigned B4SOIaigsdGiven :1; unsigned B4SOIbigsdGiven :1; - unsigned B4SOIcigsdGiven :1; + unsigned B4SOIcigsdGiven :1; unsigned B4SOInigcGiven :1; unsigned B4SOIpigcdGiven :1; unsigned B4SOIpoxedgeGiven :1; @@ -2241,7 +2246,7 @@ typedef struct sB4SOImodel /* v2.0 release */ - unsigned B4SOIk1w1Given :1; + unsigned B4SOIk1w1Given :1; unsigned B4SOIk1w2Given :1; unsigned B4SOIketasGiven :1; unsigned B4SOIdwbcGiven :1; @@ -2295,7 +2300,7 @@ typedef struct sB4SOImodel unsigned B4SOIrbshGiven :1; unsigned B4SOIndifGiven :1; unsigned B4SOIntrecfGiven :1; - unsigned B4SOIntrecrGiven :1; + unsigned B4SOIntrecrGiven :1; unsigned B4SOIdlcbGiven :1; unsigned B4SOIfbodyGiven :1; unsigned B4SOItcjswgGiven :1; @@ -2308,7 +2313,7 @@ typedef struct sB4SOImodel unsigned B4SOIdelvtGiven :1; unsigned B4SOIdlbgGiven :1; - + /* CV model */ unsigned B4SOIcgslGiven :1; unsigned B4SOIcgdlGiven :1; @@ -2331,8 +2336,8 @@ typedef struct sB4SOImodel unsigned B4SOIlbigbcp2Given :1; /* 4.1 */ unsigned B4SOIlcigbcp2Given :1; /* 4.1 */ unsigned B4SOIlndifGiven :1; - unsigned B4SOIlntrecfGiven :1; - unsigned B4SOIlntrecrGiven :1; + unsigned B4SOIlntrecfGiven :1; + unsigned B4SOIlntrecrGiven :1; unsigned B4SOIlxbjtGiven :1; unsigned B4SOIlxdifGiven :1; unsigned B4SOIlxrecGiven :1; @@ -2359,14 +2364,14 @@ typedef struct sB4SOImodel unsigned B4SOIlcigcGiven :1; unsigned B4SOIlaigsdGiven :1; unsigned B4SOIlbigsdGiven :1; - unsigned B4SOIlcigsdGiven :1; + unsigned B4SOIlcigsdGiven :1; unsigned B4SOIlnigcGiven :1; unsigned B4SOIlpigcdGiven :1; unsigned B4SOIlpoxedgeGiven :1; - unsigned B4SOIlnpeakGiven :1; + unsigned B4SOIlnpeakGiven :1; unsigned B4SOIlnsubGiven :1; - unsigned B4SOIlngateGiven :1; + unsigned B4SOIlngateGiven :1; unsigned B4SOIlnsdGiven :1; unsigned B4SOIlvth0Given :1; unsigned B4SOIlvfbGiven :1; /* v4.1 */ @@ -2379,48 +2384,48 @@ typedef struct sB4SOImodel unsigned B4SOIlkb1Given :1; unsigned B4SOIlw0Given :1; unsigned B4SOIllpe0Given :1; - unsigned B4SOIldvt0Given :1; - unsigned B4SOIldvt1Given :1; - unsigned B4SOIldvt2Given :1; - unsigned B4SOIldvt0wGiven :1; - unsigned B4SOIldvt1wGiven :1; - unsigned B4SOIldvt2wGiven :1; + unsigned B4SOIldvt0Given :1; + unsigned B4SOIldvt1Given :1; + unsigned B4SOIldvt2Given :1; + unsigned B4SOIldvt0wGiven :1; + unsigned B4SOIldvt1wGiven :1; + unsigned B4SOIldvt2wGiven :1; unsigned B4SOIlu0Given :1; unsigned B4SOIluaGiven :1; unsigned B4SOIlubGiven :1; unsigned B4SOIlucGiven :1; - unsigned B4SOIlvsatGiven :1; - unsigned B4SOIla0Given :1; - unsigned B4SOIlagsGiven :1; + unsigned B4SOIlvsatGiven :1; + unsigned B4SOIla0Given :1; + unsigned B4SOIlagsGiven :1; unsigned B4SOIlb0Given :1; unsigned B4SOIlb1Given :1; unsigned B4SOIlketaGiven :1; unsigned B4SOIlketasGiven :1; - unsigned B4SOIla1Given :1; - unsigned B4SOIla2Given :1; - unsigned B4SOIlrdswGiven :1; + unsigned B4SOIla1Given :1; + unsigned B4SOIla2Given :1; + unsigned B4SOIlrdswGiven :1; unsigned B4SOIlrdwGiven :1; /* v4.0 for rdsMod = 1 */ unsigned B4SOIlrswGiven :1; /* v4.0 for rdsMod = 1 */ unsigned B4SOIlprwbGiven :1; unsigned B4SOIlprwgGiven :1; unsigned B4SOIlwrGiven :1; - unsigned B4SOIlnfactorGiven :1; + unsigned B4SOIlnfactorGiven :1; unsigned B4SOIldwgGiven :1; unsigned B4SOIldwbGiven :1; unsigned B4SOIlvoffGiven :1; - unsigned B4SOIleta0Given :1; - unsigned B4SOIletabGiven :1; - unsigned B4SOIldsubGiven :1; - unsigned B4SOIlcitGiven :1; - unsigned B4SOIlcdscGiven :1; - unsigned B4SOIlcdscbGiven :1; - unsigned B4SOIlcdscdGiven :1; - unsigned B4SOIlpclmGiven :1; - unsigned B4SOIlpdibl1Given :1; - unsigned B4SOIlpdibl2Given :1; - unsigned B4SOIlpdiblbGiven :1; - unsigned B4SOIldroutGiven :1; - unsigned B4SOIlpvagGiven :1; + unsigned B4SOIleta0Given :1; + unsigned B4SOIletabGiven :1; + unsigned B4SOIldsubGiven :1; + unsigned B4SOIlcitGiven :1; + unsigned B4SOIlcdscGiven :1; + unsigned B4SOIlcdscbGiven :1; + unsigned B4SOIlcdscdGiven :1; + unsigned B4SOIlpclmGiven :1; + unsigned B4SOIlpdibl1Given :1; + unsigned B4SOIlpdibl2Given :1; + unsigned B4SOIlpdiblbGiven :1; + unsigned B4SOIldroutGiven :1; + unsigned B4SOIlpvagGiven :1; unsigned B4SOIldeltaGiven :1; unsigned B4SOIlalpha0Given :1; unsigned B4SOIlfbjtiiGiven :1; @@ -2433,13 +2438,13 @@ typedef struct sB4SOImodel unsigned B4SOIlbeta0Given :1; unsigned B4SOIlbeta1Given :1; - unsigned B4SOIlbeta2Given :1; - unsigned B4SOIlvdsatii0Given :1; - unsigned B4SOIlliiGiven :1; - unsigned B4SOIlesatiiGiven :1; - unsigned B4SOIlsii0Given :1; - unsigned B4SOIlsii1Given :1; - unsigned B4SOIlsii2Given :1; + unsigned B4SOIlbeta2Given :1; + unsigned B4SOIlvdsatii0Given :1; + unsigned B4SOIlliiGiven :1; + unsigned B4SOIlesatiiGiven :1; + unsigned B4SOIlsii0Given :1; + unsigned B4SOIlsii1Given :1; + unsigned B4SOIlsii2Given :1; unsigned B4SOIlsiidGiven :1; unsigned B4SOIlagidlGiven :1; unsigned B4SOIlbgidlGiven :1; @@ -2463,14 +2468,14 @@ typedef struct sB4SOImodel unsigned B4SOIlnrecf0dGiven :1; /* v4.0 */ unsigned B4SOIlnrecr0Given :1; /* v4.0 */ unsigned B4SOIlnrecr0dGiven :1; /* v4.0 */ - unsigned B4SOIlisbjtGiven :1; - unsigned B4SOIlidbjtGiven :1; /* v4.0 */ + unsigned B4SOIlisbjtGiven :1; + unsigned B4SOIlidbjtGiven :1; /* v4.0 */ unsigned B4SOIlisdifGiven :1; unsigned B4SOIliddifGiven :1; /* v4.0 */ - unsigned B4SOIlisrecGiven :1; - unsigned B4SOIlidrecGiven :1; /* v4.0 */ - unsigned B4SOIlistunGiven :1; - unsigned B4SOIlidtunGiven :1; /* v4.0 */ + unsigned B4SOIlisrecGiven :1; + unsigned B4SOIlidrecGiven :1; /* v4.0 */ + unsigned B4SOIlistunGiven :1; + unsigned B4SOIlidtunGiven :1; /* v4.0 */ unsigned B4SOIlvrec0Given :1; /* v4.0 */ unsigned B4SOIlvrec0dGiven :1; /* v4.0 */ unsigned B4SOIlvtun0Given :1; /* v4.0 */ @@ -2505,8 +2510,8 @@ typedef struct sB4SOImodel unsigned B4SOIwbigbcp2Given :1; /* 4.1 */ unsigned B4SOIwcigbcp2Given :1; /* 4.1 */ unsigned B4SOIwndifGiven :1; - unsigned B4SOIwntrecfGiven :1; - unsigned B4SOIwntrecrGiven :1; + unsigned B4SOIwntrecfGiven :1; + unsigned B4SOIwntrecrGiven :1; unsigned B4SOIwxbjtGiven :1; unsigned B4SOIwxdifGiven :1; unsigned B4SOIwxrecGiven :1; @@ -2533,14 +2538,14 @@ typedef struct sB4SOImodel unsigned B4SOIwcigcGiven :1; unsigned B4SOIwaigsdGiven :1; unsigned B4SOIwbigsdGiven :1; - unsigned B4SOIwcigsdGiven :1; + unsigned B4SOIwcigsdGiven :1; unsigned B4SOIwnigcGiven :1; unsigned B4SOIwpigcdGiven :1; unsigned B4SOIwpoxedgeGiven :1; - unsigned B4SOIwnpeakGiven :1; + unsigned B4SOIwnpeakGiven :1; unsigned B4SOIwnsubGiven :1; - unsigned B4SOIwngateGiven :1; + unsigned B4SOIwngateGiven :1; unsigned B4SOIwnsdGiven :1; unsigned B4SOIwvth0Given :1; unsigned B4SOIwvfbGiven :1; /* v4.1 */ @@ -2553,48 +2558,48 @@ typedef struct sB4SOImodel unsigned B4SOIwkb1Given :1; unsigned B4SOIww0Given :1; unsigned B4SOIwlpe0Given :1; - unsigned B4SOIwdvt0Given :1; - unsigned B4SOIwdvt1Given :1; - unsigned B4SOIwdvt2Given :1; - unsigned B4SOIwdvt0wGiven :1; - unsigned B4SOIwdvt1wGiven :1; - unsigned B4SOIwdvt2wGiven :1; + unsigned B4SOIwdvt0Given :1; + unsigned B4SOIwdvt1Given :1; + unsigned B4SOIwdvt2Given :1; + unsigned B4SOIwdvt0wGiven :1; + unsigned B4SOIwdvt1wGiven :1; + unsigned B4SOIwdvt2wGiven :1; unsigned B4SOIwu0Given :1; unsigned B4SOIwuaGiven :1; unsigned B4SOIwubGiven :1; unsigned B4SOIwucGiven :1; - unsigned B4SOIwvsatGiven :1; - unsigned B4SOIwa0Given :1; - unsigned B4SOIwagsGiven :1; + unsigned B4SOIwvsatGiven :1; + unsigned B4SOIwa0Given :1; + unsigned B4SOIwagsGiven :1; unsigned B4SOIwb0Given :1; unsigned B4SOIwb1Given :1; unsigned B4SOIwketaGiven :1; unsigned B4SOIwketasGiven :1; - unsigned B4SOIwa1Given :1; - unsigned B4SOIwa2Given :1; - unsigned B4SOIwrdswGiven :1; + unsigned B4SOIwa1Given :1; + unsigned B4SOIwa2Given :1; + unsigned B4SOIwrdswGiven :1; unsigned B4SOIwrdwGiven :1; /* v4.0 for rdsMod = 1 */ unsigned B4SOIwrswGiven :1; /* v4.0 for rdsMod = 1 */ unsigned B4SOIwprwbGiven :1; unsigned B4SOIwprwgGiven :1; unsigned B4SOIwwrGiven :1; - unsigned B4SOIwnfactorGiven :1; + unsigned B4SOIwnfactorGiven :1; unsigned B4SOIwdwgGiven :1; unsigned B4SOIwdwbGiven :1; unsigned B4SOIwvoffGiven :1; - unsigned B4SOIweta0Given :1; - unsigned B4SOIwetabGiven :1; - unsigned B4SOIwdsubGiven :1; - unsigned B4SOIwcitGiven :1; - unsigned B4SOIwcdscGiven :1; - unsigned B4SOIwcdscbGiven :1; - unsigned B4SOIwcdscdGiven :1; - unsigned B4SOIwpclmGiven :1; - unsigned B4SOIwpdibl1Given :1; - unsigned B4SOIwpdibl2Given :1; - unsigned B4SOIwpdiblbGiven :1; - unsigned B4SOIwdroutGiven :1; - unsigned B4SOIwpvagGiven :1; + unsigned B4SOIweta0Given :1; + unsigned B4SOIwetabGiven :1; + unsigned B4SOIwdsubGiven :1; + unsigned B4SOIwcitGiven :1; + unsigned B4SOIwcdscGiven :1; + unsigned B4SOIwcdscbGiven :1; + unsigned B4SOIwcdscdGiven :1; + unsigned B4SOIwpclmGiven :1; + unsigned B4SOIwpdibl1Given :1; + unsigned B4SOIwpdibl2Given :1; + unsigned B4SOIwpdiblbGiven :1; + unsigned B4SOIwdroutGiven :1; + unsigned B4SOIwpvagGiven :1; unsigned B4SOIwdeltaGiven :1; unsigned B4SOIwalpha0Given :1; unsigned B4SOIwfbjtiiGiven :1; @@ -2607,13 +2612,13 @@ typedef struct sB4SOImodel unsigned B4SOIwbeta0Given :1; unsigned B4SOIwbeta1Given :1; - unsigned B4SOIwbeta2Given :1; - unsigned B4SOIwvdsatii0Given :1; - unsigned B4SOIwliiGiven :1; - unsigned B4SOIwesatiiGiven :1; - unsigned B4SOIwsii0Given :1; - unsigned B4SOIwsii1Given :1; - unsigned B4SOIwsii2Given :1; + unsigned B4SOIwbeta2Given :1; + unsigned B4SOIwvdsatii0Given :1; + unsigned B4SOIwliiGiven :1; + unsigned B4SOIwesatiiGiven :1; + unsigned B4SOIwsii0Given :1; + unsigned B4SOIwsii1Given :1; + unsigned B4SOIwsii2Given :1; unsigned B4SOIwsiidGiven :1; unsigned B4SOIwagidlGiven :1; unsigned B4SOIwbgidlGiven :1; @@ -2637,14 +2642,14 @@ typedef struct sB4SOImodel unsigned B4SOIwnrecf0dGiven :1; /* v4.0 */ unsigned B4SOIwnrecr0Given :1; /* v4.0 */ unsigned B4SOIwnrecr0dGiven :1; /* v4.0 */ - unsigned B4SOIwisbjtGiven :1; - unsigned B4SOIwidbjtGiven :1; /* v4.0 */ + unsigned B4SOIwisbjtGiven :1; + unsigned B4SOIwidbjtGiven :1; /* v4.0 */ unsigned B4SOIwisdifGiven :1; unsigned B4SOIwiddifGiven :1; /* v4.0 */ - unsigned B4SOIwisrecGiven :1; - unsigned B4SOIwidrecGiven :1; /* v4.0 */ - unsigned B4SOIwistunGiven :1; - unsigned B4SOIwidtunGiven :1; /* v4.0 */ + unsigned B4SOIwisrecGiven :1; + unsigned B4SOIwidrecGiven :1; /* v4.0 */ + unsigned B4SOIwistunGiven :1; + unsigned B4SOIwidtunGiven :1; /* v4.0 */ unsigned B4SOIwvrec0Given :1; /* v4.0 */ unsigned B4SOIwvrec0dGiven :1; /* v4.0 */ unsigned B4SOIwvtun0Given :1; /* v4.0 */ @@ -2680,7 +2685,7 @@ typedef struct sB4SOImodel unsigned B4SOIpcigbcp2Given :1; /* 4.1 */ unsigned B4SOIpndifGiven :1; unsigned B4SOIpntrecfGiven :1; - unsigned B4SOIpntrecrGiven :1; + unsigned B4SOIpntrecrGiven :1; unsigned B4SOIpxbjtGiven :1; unsigned B4SOIpxdifGiven :1; unsigned B4SOIpxrecGiven :1; @@ -2707,14 +2712,14 @@ typedef struct sB4SOImodel unsigned B4SOIpcigcGiven :1; unsigned B4SOIpaigsdGiven :1; unsigned B4SOIpbigsdGiven :1; - unsigned B4SOIpcigsdGiven :1; + unsigned B4SOIpcigsdGiven :1; unsigned B4SOIpnigcGiven :1; unsigned B4SOIppigcdGiven :1; unsigned B4SOIppoxedgeGiven :1; - unsigned B4SOIpnpeakGiven :1; + unsigned B4SOIpnpeakGiven :1; unsigned B4SOIpnsubGiven :1; - unsigned B4SOIpngateGiven :1; + unsigned B4SOIpngateGiven :1; unsigned B4SOIpnsdGiven :1; unsigned B4SOIpvth0Given :1; unsigned B4SOIpvfbGiven :1; /* v4.1 */ @@ -2727,48 +2732,48 @@ typedef struct sB4SOImodel unsigned B4SOIpkb1Given :1; unsigned B4SOIpw0Given :1; unsigned B4SOIplpe0Given :1; - unsigned B4SOIpdvt0Given :1; - unsigned B4SOIpdvt1Given :1; - unsigned B4SOIpdvt2Given :1; - unsigned B4SOIpdvt0wGiven :1; - unsigned B4SOIpdvt1wGiven :1; - unsigned B4SOIpdvt2wGiven :1; + unsigned B4SOIpdvt0Given :1; + unsigned B4SOIpdvt1Given :1; + unsigned B4SOIpdvt2Given :1; + unsigned B4SOIpdvt0wGiven :1; + unsigned B4SOIpdvt1wGiven :1; + unsigned B4SOIpdvt2wGiven :1; unsigned B4SOIpu0Given :1; unsigned B4SOIpuaGiven :1; unsigned B4SOIpubGiven :1; unsigned B4SOIpucGiven :1; - unsigned B4SOIpvsatGiven :1; - unsigned B4SOIpa0Given :1; - unsigned B4SOIpagsGiven :1; + unsigned B4SOIpvsatGiven :1; + unsigned B4SOIpa0Given :1; + unsigned B4SOIpagsGiven :1; unsigned B4SOIpb0Given :1; unsigned B4SOIpb1Given :1; unsigned B4SOIpketaGiven :1; unsigned B4SOIpketasGiven :1; - unsigned B4SOIpa1Given :1; - unsigned B4SOIpa2Given :1; - unsigned B4SOIprdswGiven :1; + unsigned B4SOIpa1Given :1; + unsigned B4SOIpa2Given :1; + unsigned B4SOIprdswGiven :1; unsigned B4SOIprdwGiven :1; /* v4.0 for rdsMod = 1 */ unsigned B4SOIprswGiven :1; /* v4.0 for rdsMod = 1 */ unsigned B4SOIpprwbGiven :1; unsigned B4SOIpprwgGiven :1; unsigned B4SOIpwrGiven :1; - unsigned B4SOIpnfactorGiven :1; + unsigned B4SOIpnfactorGiven :1; unsigned B4SOIpdwgGiven :1; unsigned B4SOIpdwbGiven :1; unsigned B4SOIpvoffGiven :1; - unsigned B4SOIpeta0Given :1; - unsigned B4SOIpetabGiven :1; - unsigned B4SOIpdsubGiven :1; - unsigned B4SOIpcitGiven :1; - unsigned B4SOIpcdscGiven :1; - unsigned B4SOIpcdscbGiven :1; - unsigned B4SOIpcdscdGiven :1; - unsigned B4SOIppclmGiven :1; - unsigned B4SOIppdibl1Given :1; - unsigned B4SOIppdibl2Given :1; - unsigned B4SOIppdiblbGiven :1; - unsigned B4SOIpdroutGiven :1; - unsigned B4SOIppvagGiven :1; + unsigned B4SOIpeta0Given :1; + unsigned B4SOIpetabGiven :1; + unsigned B4SOIpdsubGiven :1; + unsigned B4SOIpcitGiven :1; + unsigned B4SOIpcdscGiven :1; + unsigned B4SOIpcdscbGiven :1; + unsigned B4SOIpcdscdGiven :1; + unsigned B4SOIppclmGiven :1; + unsigned B4SOIppdibl1Given :1; + unsigned B4SOIppdibl2Given :1; + unsigned B4SOIppdiblbGiven :1; + unsigned B4SOIpdroutGiven :1; + unsigned B4SOIppvagGiven :1; unsigned B4SOIpdeltaGiven :1; unsigned B4SOIpalpha0Given :1; unsigned B4SOIpfbjtiiGiven :1; @@ -2781,13 +2786,13 @@ typedef struct sB4SOImodel unsigned B4SOIpbeta0Given :1; unsigned B4SOIpbeta1Given :1; - unsigned B4SOIpbeta2Given :1; - unsigned B4SOIpvdsatii0Given :1; - unsigned B4SOIpliiGiven :1; - unsigned B4SOIpesatiiGiven :1; - unsigned B4SOIpsii0Given :1; - unsigned B4SOIpsii1Given :1; - unsigned B4SOIpsii2Given :1; + unsigned B4SOIpbeta2Given :1; + unsigned B4SOIpvdsatii0Given :1; + unsigned B4SOIpliiGiven :1; + unsigned B4SOIpesatiiGiven :1; + unsigned B4SOIpsii0Given :1; + unsigned B4SOIpsii1Given :1; + unsigned B4SOIpsii2Given :1; unsigned B4SOIpsiidGiven :1; unsigned B4SOIpagidlGiven :1; unsigned B4SOIpbgidlGiven :1; @@ -2811,14 +2816,14 @@ typedef struct sB4SOImodel unsigned B4SOIpnrecf0dGiven :1; /* v4.0 */ unsigned B4SOIpnrecr0Given :1; /* v4.0 */ unsigned B4SOIpnrecr0dGiven :1; /* v4.0 */ - unsigned B4SOIpisbjtGiven :1; - unsigned B4SOIpidbjtGiven :1; /* v4.0 */ + unsigned B4SOIpisbjtGiven :1; + unsigned B4SOIpidbjtGiven :1; /* v4.0 */ unsigned B4SOIpisdifGiven :1; unsigned B4SOIpiddifGiven :1; /* v4.0 */ - unsigned B4SOIpisrecGiven :1; - unsigned B4SOIpidrecGiven :1; /* v4.0 */ - unsigned B4SOIpistunGiven :1; - unsigned B4SOIpidtunGiven :1; /* v4.0 */ + unsigned B4SOIpisrecGiven :1; + unsigned B4SOIpidrecGiven :1; /* v4.0 */ + unsigned B4SOIpistunGiven :1; + unsigned B4SOIpidtunGiven :1; /* v4.0 */ unsigned B4SOIpvrec0Given :1; /* v4.0 */ unsigned B4SOIpvrec0dGiven :1; /* v4.0 */ unsigned B4SOIpvtun0Given :1; /* v4.0 */ @@ -2861,17 +2866,17 @@ typedef struct sB4SOImodel unsigned B4SOIunitLengthGateSidewallJctCapDGiven :1; /* v4.0 */ unsigned B4SOIcsdeswGiven :1; - unsigned B4SOIoxideTrapDensityAGiven :1; - unsigned B4SOIoxideTrapDensityBGiven :1; - unsigned B4SOIoxideTrapDensityCGiven :1; - unsigned B4SOIemGiven :1; - unsigned B4SOIefGiven :1; - unsigned B4SOIafGiven :1; - unsigned B4SOIkfGiven :1; - unsigned B4SOInoifGiven :1; - unsigned B4SOIbfGiven :1; /* v4.0 */ - unsigned B4SOIw0flkGiven :1; /* v4.0 */ - unsigned B4SOIfrbodyGiven :1; /* v4.0 */ + unsigned B4SOIoxideTrapDensityAGiven :1; + unsigned B4SOIoxideTrapDensityBGiven :1; + unsigned B4SOIoxideTrapDensityCGiven :1; + unsigned B4SOIemGiven :1; + unsigned B4SOIefGiven :1; + unsigned B4SOIafGiven :1; + unsigned B4SOIkfGiven :1; + unsigned B4SOInoifGiven :1; + unsigned B4SOIbfGiven :1; /* v4.0 */ + unsigned B4SOIw0flkGiven :1; /* v4.0 */ + unsigned B4SOIfrbodyGiven :1; /* v4.0 */ unsigned B4SOILintGiven :1; unsigned B4SOILlGiven :1; @@ -2932,18 +2937,18 @@ typedef struct sB4SOImodel unsigned B4SOIldvtp1Given :1; /* v4.0 for vth */ unsigned B4SOIwdvtp1Given :1; /* v4.0 for vth */ unsigned B4SOIpdvtp1Given :1; /* v4.0 for vth */ - unsigned B4SOIdvtp2Given :1; /* v4.1 for vth */ - unsigned B4SOIldvtp2Given :1; /* v4.1 for vth */ - unsigned B4SOIwdvtp2Given :1; /* v4.1 for vth */ - unsigned B4SOIpdvtp2Given :1; /* v4.1 for vth */ - unsigned B4SOIdvtp3Given :1; /* v4.1 for vth */ - unsigned B4SOIldvtp3Given :1; /* v4.1 for vth */ - unsigned B4SOIwdvtp3Given :1; /* v4.1 for vth */ - unsigned B4SOIpdvtp3Given :1; /* v4.1 for vth */ - unsigned B4SOIdvtp4Given :1; /* v4.1 for vth */ - unsigned B4SOIldvtp4Given :1; /* v4.1 for vth */ - unsigned B4SOIwdvtp4Given :1; /* v4.1 for vth */ - unsigned B4SOIpdvtp4Given :1; /* v4.1 for vth */ + unsigned B4SOIdvtp2Given :1; /* v4.1 for vth */ + unsigned B4SOIldvtp2Given :1; /* v4.1 for vth */ + unsigned B4SOIwdvtp2Given :1; /* v4.1 for vth */ + unsigned B4SOIpdvtp2Given :1; /* v4.1 for vth */ + unsigned B4SOIdvtp3Given :1; /* v4.1 for vth */ + unsigned B4SOIldvtp3Given :1; /* v4.1 for vth */ + unsigned B4SOIwdvtp3Given :1; /* v4.1 for vth */ + unsigned B4SOIpdvtp3Given :1; /* v4.1 for vth */ + unsigned B4SOIdvtp4Given :1; /* v4.1 for vth */ + unsigned B4SOIldvtp4Given :1; /* v4.1 for vth */ + unsigned B4SOIwdvtp4Given :1; /* v4.1 for vth */ + unsigned B4SOIpdvtp4Given :1; /* v4.1 for vth */ unsigned B4SOIminvGiven :1; /* v4.0 for Vgsteff */ unsigned B4SOIlminvGiven :1; /* v4.0 for Vgsteff */ unsigned B4SOIwminvGiven :1; /* v4.0 for Vgsteff */ @@ -2996,7 +3001,7 @@ typedef struct sB4SOImodel #define B4SOI_DEBUG 21 /* v2.0 release */ -#define B4SOI_NBC 22 +#define B4SOI_NBC 22 #define B4SOI_NSEG 23 #define B4SOI_PDBCP 24 #define B4SOI_PSBCP 25 @@ -3004,7 +3009,7 @@ typedef struct sB4SOImodel #define B4SOI_AEBCP 27 #define B4SOI_VBSUSR 28 #define B4SOI_TNODEOUT 29 -#define B4SOI_FRBODY 30 /* v2.2.2 */ +#define B4SOI_FRBODY 30 /* v2.2.2 */ #define B4SOI_RGATEMOD 31 /* v3.1 */ #define B4SOI_SOIMOD 32 /* v3.2 */ #define B4SOI_NF 33 /* v4.0 */ @@ -3013,9 +3018,9 @@ typedef struct sB4SOImodel #define B4SOI_RBSB 36 /* v4.0 */ #define B4SOI_CJSB 37 /* v4.0 */ #define B4SOI_CJDB 38 /* v4.0 */ -#define B4SOI_SA 41 /* v4.0 */ -#define B4SOI_SB 42 /* v4.0 */ -#define B4SOI_SD 43 /* v4.0 */ +#define B4SOI_SA 41 /* v4.0 */ +#define B4SOI_SB 42 /* v4.0 */ +#define B4SOI_SD 43 /* v4.0 */ #define B4SOI_DELVTO 44 /* v4.0 */ #define B4SOI_AGBCPD 45 /* v4.0 */ #define B4SOI_AGBCP2 46 /* v4.1 improvement on BC */ @@ -3051,7 +3056,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_ADOS 89 #define B4SOI_MOD_BDOS 90 #define B4SOI_MOD_LEFFEOT 91 -#define B4SOI_MOD_WEFFEOT 92 +#define B4SOI_MOD_WEFFEOT 92 #define B4SOI_MOD_VDDEOT 93 #define B4SOI_MOD_TEMPEOT 94 #define B4SOI_MOD_TOXP 95 @@ -3062,11 +3067,11 @@ typedef struct sB4SOImodel #define B4SOI_MOD_MTRLMOD 100 /*4.1*/ #define B4SOI_MOD_CAPMOD 101 #define B4SOI_MOD_NQSMOD 102 -#define B4SOI_MOD_MOBMOD 103 +#define B4SOI_MOD_MOBMOD 103 /*#define B4SOI_MOD_NOIMOD 104 v3.2 */ #define B4SOI_MOD_RDSMOD 104 /* v4.0 */ #define B4SOI_MOD_SHMOD 105 -#define B4SOI_MOD_DDMOD 106 +/*#define B4SOI_MOD_DDMOD 106 v4.2 ddmod is not used any more*/ #define B4SOI_MOD_TOX 107 #define B4SOI_MOD_CDSC 108 @@ -3079,14 +3084,14 @@ typedef struct sB4SOImodel #define B4SOI_MOD_A0 115 #define B4SOI_MOD_A1 116 #define B4SOI_MOD_A2 117 -#define B4SOI_MOD_KETA 118 +#define B4SOI_MOD_KETA 118 #define B4SOI_MOD_NSUB 119 #define B4SOI_MOD_NPEAK 120 #define B4SOI_MOD_NGATE 121 #define B4SOI_MOD_GAMMA1 122 #define B4SOI_MOD_GAMMA2 123 #define B4SOI_MOD_VBX 124 -#define B4SOI_MOD_BINUNIT 125 +#define B4SOI_MOD_BINUNIT 125 #define B4SOI_MOD_VBM 126 @@ -3192,7 +3197,7 @@ typedef struct sB4SOImodel /* v2.0 release */ -#define B4SOI_MOD_K1W1 239 +#define B4SOI_MOD_K1W1 239 #define B4SOI_MOD_K1W2 240 #define B4SOI_MOD_KETAS 241 #define B4SOI_MOD_DWBC 242 @@ -3266,7 +3271,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_LNSUB 302 #define B4SOI_MOD_LNGATE 303 #define B4SOI_MOD_LVTH0 304 -#define B4SOI_MOD_LK1 305 +#define B4SOI_MOD_LK1 305 #define B4SOI_MOD_LK1W1 306 #define B4SOI_MOD_LK1W2 307 #define B4SOI_MOD_LK2 308 @@ -3290,8 +3295,8 @@ typedef struct sB4SOImodel #define B4SOI_MOD_LAGS 326 #define B4SOI_MOD_LB0 327 #define B4SOI_MOD_LB1 328 -#define B4SOI_MOD_LKETA 329 -#define B4SOI_MOD_LKETAS 330 +#define B4SOI_MOD_LKETA 329 +#define B4SOI_MOD_LKETAS 330 #define B4SOI_MOD_LA1 331 #define B4SOI_MOD_LA2 332 #define B4SOI_MOD_LRDSW 333 @@ -3364,7 +3369,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_WNSUB 402 #define B4SOI_MOD_WNGATE 403 #define B4SOI_MOD_WVTH0 404 -#define B4SOI_MOD_WK1 405 +#define B4SOI_MOD_WK1 405 #define B4SOI_MOD_WK1W1 406 #define B4SOI_MOD_WK1W2 407 #define B4SOI_MOD_WK2 408 @@ -3388,8 +3393,8 @@ typedef struct sB4SOImodel #define B4SOI_MOD_WAGS 426 #define B4SOI_MOD_WB0 427 #define B4SOI_MOD_WB1 428 -#define B4SOI_MOD_WKETA 429 -#define B4SOI_MOD_WKETAS 430 +#define B4SOI_MOD_WKETA 429 +#define B4SOI_MOD_WKETAS 430 #define B4SOI_MOD_WA1 431 #define B4SOI_MOD_WA2 432 #define B4SOI_MOD_WRDSW 433 @@ -3461,7 +3466,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_PNSUB 502 #define B4SOI_MOD_PNGATE 503 #define B4SOI_MOD_PVTH0 504 -#define B4SOI_MOD_PK1 505 +#define B4SOI_MOD_PK1 505 #define B4SOI_MOD_PK1W1 506 #define B4SOI_MOD_PK1W2 507 #define B4SOI_MOD_PK2 508 @@ -3485,8 +3490,8 @@ typedef struct sB4SOImodel #define B4SOI_MOD_PAGS 526 #define B4SOI_MOD_PB0 527 #define B4SOI_MOD_PB1 528 -#define B4SOI_MOD_PKETA 529 -#define B4SOI_MOD_PKETAS 530 +#define B4SOI_MOD_PKETA 529 +#define B4SOI_MOD_PKETAS 530 #define B4SOI_MOD_PA1 531 #define B4SOI_MOD_PA2 532 #define B4SOI_MOD_PRDSW 533 @@ -3546,7 +3551,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_PDELVT 587 #define B4SOI_MOD_PACDE 588 #define B4SOI_MOD_PMOIN 589 -#define B4SOI_MOD_PXRCRG1 590 /* v3.1 for RF */ +#define B4SOI_MOD_PXRCRG1 590 /* v3.1 for RF */ #define B4SOI_MOD_PXRCRG2 591 /* v3.1 for RF */ #define B4SOI_MOD_EM 592 /* v3.2 for noise */ #define B4SOI_MOD_EF 593 /* v3.2 for noise */ @@ -3704,10 +3709,10 @@ typedef struct sB4SOImodel #define B4SOI_MOD_LWLC 841 #define B4SOI_MOD_LLC 842 #define B4SOI_MOD_LWC 843 -#define B4SOI_MOD_WWLC 844 +#define B4SOI_MOD_WWLC 844 #define B4SOI_MOD_WLC 845 #define B4SOI_MOD_WWC 846 -#define B4SOI_MOD_DTOXCV 847 +#define B4SOI_MOD_DTOXCV 847 #define B4SOI_MOD_DWC 848 #define B4SOI_MOD_DLC 849 @@ -3743,7 +3748,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_PXDIFD 891 #define B4SOI_MOD_PXRECD 892 #define B4SOI_MOD_PXTUND 893 -#define B4SOI_MOD_TCJSWGS 894 +#define B4SOI_MOD_TCJSWGS 894 #define B4SOI_MOD_TPBSWGS 895 #define B4SOI_MOD_TCJSWGD 896 #define B4SOI_MOD_TPBSWGD 897 @@ -3795,7 +3800,7 @@ typedef struct sB4SOImodel #define B4SOI_CBDB 944 #define B4SOI_CBSB 945 #define B4SOI_GMID 946 -#define B4SOI_QS 955 +#define B4SOI_QS 955 /* For debugging only */ #define B4SOI_DEBUG1 956 @@ -3852,7 +3857,7 @@ typedef struct sB4SOImodel #define B4SOI_MOD_MBJTII 4006 #define B4SOI_MOD_LEBJTII 4007 #define B4SOI_MOD_LCBJTII 4008 -#define B4SOI_MOD_LVBCI 4009 +#define B4SOI_MOD_LVBCI 4009 #define B4SOI_MOD_LABJTII 4010 #define B4SOI_MOD_LMBJTII 4011 #define B4SOI_MOD_WEBJTII 4012 @@ -3926,8 +3931,8 @@ typedef struct sB4SOImodel /* v3.2 */ /* v4.0 added for stress */ -#define B4SOI_MOD_SAREF 965 -#define B4SOI_MOD_SBREF 966 +#define B4SOI_MOD_SAREF 965 +#define B4SOI_MOD_SBREF 966 #define B4SOI_MOD_KU0 967 #define B4SOI_MOD_KVSAT 968 #define B4SOI_MOD_TKU0 969 @@ -3966,10 +3971,10 @@ typedef struct sB4SOImodel #define B4SOI_MOD_CDSBS 1223 #define B4SOI_MOD_VGSTCVMOD 1224 #define B4SOI_MOD_MINVCV 1225 -#define B4SOI_MOD_LMINVCV 1226 -#define B4SOI_MOD_WMINVCV 1227 -#define B4SOI_MOD_PMINVCV 1228 -#define B4SOI_MOD_VOFFCV 1229 +#define B4SOI_MOD_LMINVCV 1226 +#define B4SOI_MOD_WMINVCV 1227 +#define B4SOI_MOD_PMINVCV 1228 +#define B4SOI_MOD_VOFFCV 1229 #define B4SOI_MOD_LVOFFCV 1230 #define B4SOI_MOD_WVOFFCV 1231 #define B4SOI_MOD_PVOFFCV 1232 @@ -3987,8 +3992,8 @@ typedef struct sB4SOImodel /* v3.0 */ #define B4SOI_MOD_AIGC 1021 -#define B4SOI_MOD_BIGC 1022 -#define B4SOI_MOD_CIGC 1023 +#define B4SOI_MOD_BIGC 1022 +#define B4SOI_MOD_CIGC 1023 #define B4SOI_MOD_AIGSD 1024 #define B4SOI_MOD_BIGSD 1025 #define B4SOI_MOD_CIGSD 1026 @@ -4096,11 +4101,11 @@ typedef struct sB4SOImodel /* 4.0 backward compatibility */ #define B4SOI_MOD_NGIDL 2100 -#define B4SOI_MOD_LNGIDL 2101 +#define B4SOI_MOD_LNGIDL 2101 #define B4SOI_MOD_WNGIDL 2102 #define B4SOI_MOD_PNGIDL 2103 #define B4SOI_MOD_NLX 2104 -#define B4SOI_MOD_LNLX 2105 +#define B4SOI_MOD_LNLX 2105 #define B4SOI_MOD_WNLX 2106 #define B4SOI_MOD_PNLX 2107 @@ -4108,8 +4113,8 @@ typedef struct sB4SOImodel #ifdef __STDC__ extern void B4SOIevaluate(double,double,double,B4SOIinstance*,B4SOImodel*, - double*,double*,double*, double*, double*, double*, double*, - double*, double*, double*, double*, double*, double*, double*, + double*,double*,double*, double*, double*, double*, double*, + double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, CKTcircuit*); extern int B4SOIdebug(B4SOImodel*, B4SOIinstance*, CKTcircuit*, int); extern int B4SOIcheckModel(B4SOImodel*, B4SOIinstance*, CKTcircuit*); diff --git a/src/spicelib/devices/bsim3soi/b4soidel.c b/src/spicelib/devices/bsim3soi/b4soidel.c index 46d499c58..6d1456972 100644 --- a/src/spicelib/devices/bsim3soi/b4soidel.c +++ b/src/spicelib/devices/bsim3soi/b4soidel.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soidel.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" diff --git a/src/spicelib/devices/bsim3soi/b4soidest.c b/src/spicelib/devices/bsim3soi/b4soidest.c index 78d860de9..0c956207b 100644 --- a/src/spicelib/devices/bsim3soi/b4soidest.c +++ b/src/spicelib/devices/bsim3soi/b4soidest.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soidest.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" diff --git a/src/spicelib/devices/bsim3soi/b4soiext.h b/src/spicelib/devices/bsim3soi/b4soiext.h index b15049062..f8247a9c2 100644 --- a/src/spicelib/devices/bsim3soi/b4soiext.h +++ b/src/spicelib/devices/bsim3soi/b4soiext.h @@ -2,6 +2,7 @@ Copyright 2009 Regents of the University of California. All rights reserved. Author: 2005 Hui Wan (based on Samuel Fung's b3soiext.h) Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu. +Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu. File: b4soiext.h **********/ diff --git a/src/spicelib/devices/bsim3soi/b4soigetic.c b/src/spicelib/devices/bsim3soi/b4soigetic.c index 2f9bd459b..a86b51416 100644 --- a/src/spicelib/devices/bsim3soi/b4soigetic.c +++ b/src/spicelib/devices/bsim3soi/b4soigetic.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soigetic.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" diff --git a/src/spicelib/devices/bsim3soi/b4soiinit.c b/src/spicelib/devices/bsim3soi/b4soiinit.c index e272ee202..9b4d270dc 100644 --- a/src/spicelib/devices/bsim3soi/b4soiinit.c +++ b/src/spicelib/devices/bsim3soi/b4soiinit.c @@ -8,7 +8,7 @@ SPICEdev B4SOIinfo = { { "B4SOI", - "Berkeley SOI MOSFET model version 4.0", + "Berkeley SOI MOSFET model version 4.3", &B4SOInSize, &B4SOInSize, diff --git a/src/spicelib/devices/bsim3soi/b4soild.c b/src/spicelib/devices/bsim3soi/b4soild.c index b06b9a101..c800c814d 100644 --- a/src/spicelib/devices/bsim3soi/b4soild.c +++ b/src/spicelib/devices/bsim3soi/b4soild.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soild.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" @@ -26,7 +29,7 @@ #define Charge_q 1.60219e-19 #define KboQ 8.617087e-5 /* Kb / q */ #define Eg300 1.115 /* energy gap at 300K */ -#define DELTA 1.0E-9 /* v4.0 */ +#define DELTA 1.0E-9 /* v4.0 */ #define DELTA_1 0.02 #define DELTA_2 0.02 #define DELTA_3 0.02 @@ -42,4403 +45,4638 @@ #define MIN_EXPL 3.720075976e-44 #define EXPL_THRESHOLD 100.0 #define DEXP(A,B,C) { \ - if (A > EXPL_THRESHOLD) { \ - B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \ - C = MAX_EXPL; \ - } else if (A < -EXPL_THRESHOLD) { \ - B = MIN_EXPL; \ - C = 0; \ - } else { \ - B = exp(A); \ - C = B; \ - } \ - } + if (A > EXPL_THRESHOLD) { \ + B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \ + C = MAX_EXPL; \ + } else if (A < -EXPL_THRESHOLD) { \ + B = MIN_EXPL; \ + C = 0; \ + } else { \ + B = exp(A); \ + C = B; \ + } \ +} #define FLOG(A) fabs(A) + 1e-14 - /* B4SOIlimit(vnew,vold) - * limits the per-iteration change of any absolute voltage value - */ +/* B4SOIlimit(vnew,vold) + * limits the per-iteration change of any absolute voltage value + */ -double + double B4SOIlimit( -double vnew, -double vold, -double limit, -int *check) + double vnew, + double vold, + double limit, + int *check) { double T0, T1; if (isnan (vnew) || isnan (vold)) { - fprintf(stderr, "Alberto says: YOU TURKEY! The limiting function received NaN.\n"); - fprintf(stderr, "New prediction returns to 0.0!\n"); + fprintf(stderr, "Alberto says: YOU TURKEY! The limiting function received NaN.\n"); + fprintf(stderr, "New prediction returns to 0.0!\n"); vnew = 0.0; *check = 1; } T0 = vnew - vold; T1 = fabs(T0); if (T1 > limit) { - if (T0 > 0.0) + if (T0 > 0.0) vnew = vold + limit; - else + else vnew = vold - limit; - *check = 1; + *check = 1; } return vnew; } - -int + int B4SOIload( -GENmodel *inModel, -CKTcircuit *ckt) + GENmodel *inModel, + CKTcircuit *ckt) { -register B4SOImodel *model = (B4SOImodel*)inModel; -register B4SOIinstance *here; -register int selfheat; - -double Gmin; -double ag0, qgd, qgs, von, cbhat, VgstNVt, ExpVgst=0.0; -double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; -double arg; -double delvbd, delvbs, delvds, delvgd, delvgs; -double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4; -double PhiBSWG, MJSWG; -double gcgdb, gcggb, gcgsb, gcgeb, gcgT; -double gcsdb, gcsgb, gcssb, gcseb, gcsT; -double gcddb, gcdgb, gcdsb, gcdeb, gcdT; -double gcbdb, gcbgb, gcbsb, gcbeb, gcbT; -double gcedb, gcegb, gcesb, gceeb, gceT; -double gcTt, gTtg, gTtb, gTtdp, gTtt, gTtsp; -double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact; -double vg, vd, vs, vp, ve, vb; -double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Vgs_eff, Vfb=0.0, dVfb_dVb, dVfb_dVd, dVfb_dT; -double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd, dVth_dT; -double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg; -double n, dn_dVb, Vtm; -double ExpArg, V0; -double ueff, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT; -double Esat, Vdsat; -double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT; -double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat; -double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT; -double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT; -double Vbseff, dVbseff_dVb; -double CoxWL; -double T0=0.0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dT; -double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dT; -double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dT, dT2_dVp; -double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dT=0.0; -double T4, dT4_dVd, dT4_dVb, dT4_dT; -double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT=0.0; -double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dT=0.0, dT6_dVp; -double T7; -double T8, dT8_dVd; -double T9, dT9_dVd; -double T10, dT10_dVb, dT10_dVd; -double T11, T12=0.0; -double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; -double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT; -double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT; -double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb; -double Delt_vth, dDelt_vth_dVb, dDelt_vth_dT; -double Theta0, dTheta0_dVb; -double TempRatio, tmp1, tmp2, tmp3, tmp4; -double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; -double a1; - -double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb, dVgsteff_dT; -double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT; -double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; -double diffVds; -double dAbulk_dVg, dn_dVd ; -double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT; -double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT; -double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dT; -double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dT; -double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT; -double Ids, Gm, Gds, Gmb; -double CoxWovL; -double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds; -double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb; -double Leff, Weff, dWeff_dVg, dWeff_dVb; -double AbulkCV, dAbulkCV_dVb; -double qgdo, qgso, cgdo, cgso; - -double dxpart, sxpart; - -struct b4soiSizeDependParam *pParam; -int ByPass, Check, ChargeComputationNeeded=0, error; - -double gbbsp, gbbdp, gbbg, gbbb, gbbp, gbbT; -double gddpsp, gddpdp, gddpg, gddpb, gddpT; -double gsspsp, gsspdp, gsspg, gsspb, gsspT; -double Gbpbs=0.0, Gbpps; -double ves, ved, veb, vge=0.0, delves, vedo, delved; -double vps, vpd, Vps, delvps; -double Vbd, Ves, Vesfb, DeltVthtemp, dDeltVthtemp_dT; -double Vbp, dVbp_dVb; -double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT; -double Gm0, Gds0, Gmb0, GmT0, Gmc, GmT; -double dDIBL_Sft_dVb; -double Igidl, Ggidld=0.0, Ggidlg, Ggidlb=0.0; -double Igisl=0.0, Ggisls=0.0, Ggislg=0.0, Ggislb=0.0; -double Gjsd, Gjsb=0.0, GjsT, Gjdd, Gjdb=0.0, GjdT; -double Ibp, Iii, Giid=0.0, Giig, Giib=0.0, GiiT, Gcd, Gcb, GcT, ceqbody, ceqbodcon; -double gppb, gppp; -double delTemp, deldelTemp, Temp; -double ceqth, ceqqth; -double K1; -double qjs=0.0, gcjsbs=0.0, gcjsT; -double qjd=0.0, gcjdbs=0.0, gcjdds=0.0, gcjdT; -double qge; -double ceqqe; -double ni, Eg, Cbox, CboxWL; -double cjsbs; -double dVfbeff_dVrg; -double qinv, qgate=0.0, qbody=0.0, qdrn=0.0, qsrc, qsub=0.0, cqgate, cqbody, cqdrn, cqsub, cqtemp; -double Cgg, Cgd, Cgb; -double Csg, Csd, Csb, Cbg=0.0, Cbd=0.0, Cbb=0.0; -double Cgg1, Cgb1, Cgd1, Cbg1=0.0, Cbb1, Cbd1, Csg1, Csd1, Csb1; -double Vdsatii; -double Ibs1 ,dIbs1_dVb ,dIbs1_dT; -double Ibs2 ,dIbs2_dVb ,dIbs2_dT; -double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT; -double Ibs4 ,dIbs4_dVb ,dIbs4_dT; -double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT; -double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT; -double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT; -double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT=0.0; -double WTsi, NVtm1, NVtm2; -double Ic ,dIc_dVb ,dIc_dVd; -double Ibs; -double Ibd; -double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dT; -double Qsub0=0.0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ; -double Qac0=0.0 ,dQac0_dVb ,dQac0_dVd; -double Qe1 , dQe1_dVb, dQe1_dVe, dQe1_dT; -double Ce1b ,Ce1e, Ce1T; -double dQac0_dVrg, dQsub0_dVrg; - -/* for self-heating */ -double vbi, vfbb, phi, sqrtPhi, Xdep0, u0temp, vsattemp; -double jdifs, jdifd, djdifs_dT, djdifd_dT; -double jbjts, jbjtd, djbjts_dT, djbjtd_dT; -double jrecs, jrecd, djrecs_dT, djrecd_dT; -double jtuns, jtund, djtuns_dT, djtund_dT; -double rds0=0.0, ua, ub, uc; -double dvbi_dT, dvfbb_dT, du0temp_dT; -double dvsattemp_dT, drds0_dT=0.0, dua_dT, dub_dT, duc_dT, dni_dT, dVtm_dT; -double dVfbeff_dT, dQac0_dT, dQsub0_dT; -double CbT, CsT, CgT; -double rho, rho_ref, ku0temp; /* v4.0 */ -double drho_dT, drho_ref_dT, dku0temp_dT; /* v4.0 */ - -/* v2.0 release */ -double Vbsh, dVbsh_dVb; -double sqrtPhisExt, dsqrtPhisExt_dVb; -double T13, T14; -double dT11_dVb, dT13_dVb, dT14_dVb; -double dVgst_dVd; -double Vdsatii0, dVdsatii0_dT; -double VgsStep, dVgsStep_dT, Ratio=0.0, dRatio_dVg=0.0, dRatio_dVb=0.0, dRatio_dVd=0.0, dRatio_dT=0.0, dTempRatio_dT; -double Vdiff, dVdiff_dVg, dVdiff_dVb, dVdiff_dVd, dVdiff_dT; -double dNVtm1_dT; -double NVtmf, NVtmr, dNVtmf_dT, dNVtmr_dT; -double TempRatioMinus1; -double Ahlis, dAhlis_dT, Ahlid, dAhlid_dT ; -double WsTsi, WdTsi; -double dPhiBSWG_dT, dcjsbs_dT, darg_dT=0.0, ddT3_dVb_dT=0.0; -double dT7_dT, dT0_dT7, dT1_dT7, dT2_dT7; -double CoxWLb, CoxWLcenb; -double ExpVbsNVtm, dExpVbsNVtm_dVb, dExpVbsNVtm_dT; -double ExpVbdNVtm, dExpVbdNVtm_dVb, dExpVbdNVtm_dVd, dExpVbdNVtm_dT; -double Ien, dIen_dT, Iendif, dIendif_dT; -double Ibsdif=0.0, dIbsdif_dVb=0.0, dIbsdif_dT=0.0; -double Ibddif=0.0, dIbddif_dVb=0.0, dIbddif_dVd=0.0, dIbddif_dT=0.0; -double Ehlis, dEhlis_dVb, dEhlis_dT; -double EhlisFactor, dEhlisFactor_dVb, dEhlisFactor_dT; -double Ehlid, dEhlid_dVb, dEhlid_dVd, dEhlid_dT; -double EhlidFactor, dEhlidFactor_dVb, dEhlidFactor_dVd, dEhlidFactor_dT; -double E2ndFactor, dE2ndFactor_dVb, dE2ndFactor_dVd, dE2ndFactor_dT; -double dT10_dT, dT11_dT, DioMax; -double cjdbs, dcjdbs_dT; -double wdios, wdiod, wdiosCV, wdiodCV; - -/* for capMod3 */ -double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVb, LINK, Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVb; -double CoxWLcen, QovCox, dQac0_dVg, DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dVd, dDeltaPhi_dVb; -double dTcen_dVd, dTcen_dT, dCoxeff_dVd, dCoxeff_dT, dCoxWLcenb_dT, qinoi, qbulk; -double T3zb, lt1zb, ltwzb, Theta0zb; -double Delt_vthzb, dDelt_vthzb_dT; -double DeltVthwzb, dDeltVthwzb_dT; -double DeltVthtempzb, dDeltVthtempzb_dT; -double Vthzb=0.0, dVthzb_dT=0.0, Vfbzb=0.0, dVfbzb_dT=0.0; - -/* v3.2 */ -double noff, dnoff_dVd, dnoff_dVb; -double vgmb; - -/* v3.1 added for RF */ -double geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg; -double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd; -double delvges, delvgms, vgme; -double gcgmgmb=0.0, gcgmdb, gcgmsb, gcdgmb, gcsgmb; -double gcgmeb, gcegmb, qgme, qgmid=0.0, ceqqgmid; -double gcgbb; -double vgge, vggm; -double wdiosCV_NoSwap=0.0, wdiodCV_NoSwap=0.0; - -/* v3.0 */ -double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVb, Igs, dIgs_dVg, dIgs_dVs, Igd, dIgd_dVg, dIgd_dVd; -double Igcs, dIgcs_dVg, dIgcs_dVd, dIgcs_dVb, Igcd, dIgcd_dVg, dIgcd_dVd, dIgcd_dVb; -double vgs_eff, dvgs_eff_dvg, vgd_eff, dvgd_eff_dvg; -double VxNVt, ExpVxNVt; -double gIstotg, gIstotd, gIstotb, gIstots, Istoteq; -double gIdtotg, gIdtotd, gIdtotb, gIdtots, Idtoteq; -double gIgtotg, gIgtotd, gIgtotb, gIgtots, Igtoteq; - -/* v3.0 */ -double Vbsitf, dVbsitf_dVg, dVbsitf_dVd, dVbsitf_dVb, dVbsitf_dVe, dVbsitf_dT; -double dIgb1_dVe, gige, Giie, dT0_dVe, dRatio_dVe=0.0, dVdiff_dVe; -double dT1_dVe, dT5_dVe, dIgb_dVe, dVox_dVe, dVoxdepinv_dVe=0.0, dVaux_dVe; -double Gme, gTte, gbbe, gddpe, gsspe; -double Vbs0, dVbs0_dVg, dVbs0_dVd, dVbs0_dVe, dVbs0_dT; -double Vbs0mos, dVbs0mos_dVe, dVbs0mos_dT; -double Vbsmos, dVbsmos_dVg, dVbsmos_dVd, dVbsmos_dVb, dVbsmos_dVe, dVbsmos_dT; -double PhiON, dPhiON_dVg, dPhiON_dVd, dPhiON_dVe, dPhiON_dT; -double PhiFD, dPhiFD_dVg, dPhiFD_dVd, dPhiFD_dVe, dPhiFD_dT; -double Vbs0t, dVbs0t_dVg, dVbs0t_dVd, dVbs0t_dVe, dVbs0t_dT; -double VthFD, dVthFD_dVd, dVthFD_dVb, dVthFD_dVe, dVthFD_dT; -double VtgsFD, ExpVtgsFD, VgstFD, ExpVgstFD; -double VtgseffFD, dVtgseffFD_dVd, dVtgseffFD_dVg, dVtgseffFD_dVe, dVtgseffFD_dT; -double VgsteffFD, dVgsteffFD_dVd, dVgsteffFD_dVg, dVgsteffFD_dVe, dVgsteffFD_dT; -double dT2_dVe, dVbsh_dVg, dVbsh_dVd, dVbsh_dVe, dVbsh_dT; -double dVgsteff_dVe, dVbseff_dVg, dVbseff_dVd, dVbseff_dVe, dVbseff_dT; - -/* v2.2 release */ -double Vgb=0.0, dVgb_dVg=0.0, dVgb_dVb=0.0, Vox, dVox_dVg, dVox_dVd, dVox_dVb; -double OxideRatio, Vaux, dVaux_dVg, dVaux_dVd, dVaux_dVb; -double Igb, dIgb_dVg, dIgb_dVd, dIgb_dVb; -double ceqgate; -double dT0_dVox, Voxeff, dVoxeff_dVox; -double dVox_dT, dVaux_dT=0.0, dIgb_dT; -double Voxacc=0.0, dVoxacc_dVg=0.0, dVoxacc_dVd=0.0, dVoxacc_dVb=0.0; -double Voxdepinv=0.0, dVoxdepinv_dVg=0.0, dVoxdepinv_dVb=0.0, dVoxdepinv_dVd=0.0, dVoxdepinv_dT=0.0; -double Igb1, dIgb1_dVg, dIgb1_dVd, dIgb1_dVb, dIgb1_dT; -double Igb2, dIgb2_dVg, dIgb2_dVd, dIgb2_dVb, dIgb2_dT; -double gigs, gigd, gigb, gigg, gigT; -double gigpg, gigpp; - -/* v4.0 */ -double IdlovVdseff, dIdlovVdseff_dVg, dIdlovVdseff_dVd, dIdlovVdseff_dVb; -double IdovVds; -double vdbs, vsbs, vdbd=0.0, vsbd, vsbdo, vbs_jct, vbd_jct; -double Vsbs, Vdbd, Vdbs; -double delvdbd, delvsbs, delvdbs, delvbd_jct, delvbs_jct; -double gcdbdb, gcsbsb, gcsbb, gcdbb; -double ceqqjd=0.0, ceqqjs=0.0; -double Lpe_Vb; /* v4.0 for Vth */ -double DITS_Sft, DITS_Sft2, dDITS_Sft_dVb, dDITS_Sft_dVd, dDITS_Sft2_dVd, dDITS_Sft_dT; -double FP, dFP_dT, dFP_dVg; -double VADITS, dVADITS_dVg, dVADITS_dVd, dVADITS_dT; /* for DITS */ -double Iii_Igidl, Giigidl_b, Giigidl_d, Giigidl_g, Giigidl_e, Giigidl_T; -double gjsdb; -double Idbdp=0.0, Isbsp=0.0, cdbdp, csbsp, gcjdbdp, gcjsbsp, GGjdb, GGjsb; -double vdes, vses, vdedo, delvdes, delvses, delvded, Isestot, cseshat, Idedtot, cdedhat; -double PowWeffWr, rd0, rs0=0.0, rdwmin, rswmin=0.0, drs0_dT=0.0, drd0_dT=0.0, drswmin_dT=0.0, - drdwmin_dT=0.0, Rd, dRd_dVg, dRd_dVb, dRd_dT, Rs, dRs_dVg, dRs_dVb, dRs_dT; -double dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb, dgstot_dve, dgstot_dT; -double dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb, dgdtot_dve, dgdtot_dT; -double gstot, gstotd, gstotg, gstots, gstotb, ceqgstot; -double gdtot, gdtotd, gdtotg, gdtots, gdtotb, ceqgdtot; -double gdpr, gspr; -/*4.1*/ -double toxe, epsrox, epssub, epsgate; -double Tnom, Eg0, Vtm0; -double Vbci, Idsmosfet, Iiibjt; -double dVbci_dT, dIiibjt_dVd, dIiibjt_dVb, dIiibjt_dT; -double VgsteffVth, dT11_dVg; -/* v4.1 */ -double Vgd; -double dVbs0mos_dVd; -double Ig_agbcp2, dIg_agbcp2_dVg, dIg_agbcp2_dVp; -double vgp_eff, vgp=0.0, dvgp_eff_dvg, dvgp_eff_dvp; - -/* improved body contact charge model */ -double CoxWL2, CoxWLb2; -double ExpVgst2, Vgsteff2=0.0, VgstNVt2, ExpArg2; -double dVgsteff2_dVd=0.0, dVgsteff2_dVg=0.0, dVgsteff2_dVb=0.0, dVgsteff2_dVe, dVgsteff2_dT=0.0; -double T02=0.0; -double Qac02, dQac02_dVrg=0.0, dQac02_dVd=0.0, dQac02_dVg=0.0, dQac02_dVb=0.0, dQac02_dT=0.0; -double Vgs_eff2=0.0, dVgs_eff2_dVg=0.0; -double Vthzb2; -double Vfbzb2=0.0, dVfbzb2_dT=0.0; -double Vfb2, dVfb2_dVd, dVfb2_dVb, dVfb2_dT; -double Vfbeff2=0.0, dVfbeff2_dVd=0.0, dVfbeff2_dVrg=0.0, dVfbeff2_dVg=0.0, dVfbeff2_dVb=0.0, dVfbeff2_dT=0.0; -double Qsub02, dQsub02_dVg=0.0, dQsub02_dVrg=0.0, dQsub02_dVd=0.0, dQsub02_dVb=0.0, dQsub02_dT=0.0; -double VdsatCV2, dVdsatCV2_dVg, dVdsatCV2_dVb; -double VdseffCV2=0.0, dVdseffCV2_dVg=0.0, dVdseffCV2_dVd=0.0, dVdseffCV2_dVb=0.0; -double Cbg12=0.0, Cbd12=0.0, Cbb12=0.0; -double Cgg12=0.0, Cgd12=0.0, Cgb12=0.0; -double Csg12=0.0, Csd12=0.0, Csb12=0.0; -double Tcen2=0.0, dTcen2_dVg=0.0, dTcen2_dVd=0.0, dTcen2_dVb=0.0, dTcen2_dT=0.0; -double Ccen2; -double Coxeff2=0.0, dCoxeff2_dVg=0.0, dCoxeff2_dVd=0.0, dCoxeff2_dVb=0.0, dCoxeff2_dT=0.0; -double CoxWLcenb2=0.0, dCoxWLcenb2_dT=0.0; -double QovCox2; -double DeltaPhi2=0.0, dDeltaPhi2_dVg=0.0, dDeltaPhi2_dVd, dDeltaPhi2_dVb; -double CoxWLcen2=0.0; -double T22=0.0, T52=0.0; -double qsrc2, qbulk2; -double Csg2=0.0, Csd2, Csb2; -double DELTA_3_SOI2; -double dphi_dT,dsqrtPhi_dT,dXdep0_dT,cdep0,dcep0_dT,theta0vb0,dtheta0vb0_dT; -double thetaRout,dthetaRout_dT,dcdep0_dT; -double dPhis_dT,dsqrtPhis_dT,dXdep_dT,dlt1_dT,dltw_dT; -double agidl, bgidl, cgidl, egidl, rgidl, kgidl, fgidl; -double agisl, bgisl, cgisl, egisl, rgisl, kgisl, fgisl; - -double m; - -for (; model != NULL; model = model->B4SOInextModel) -{ for (here = model->B4SOIinstances; here != NULL; - here = here->B4SOInextInstance) + register B4SOImodel *model = (B4SOImodel*)inModel; + register B4SOIinstance *here; + register int selfheat; + + double Gmin; + double ag0, qgd, qgs, von, cbhat, VgstNVt, ExpVgst=0.0; + double cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; + double arg; + double delvbd, delvbs, delvds, delvgd, delvgs; + double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4; + double PhiBSWG, MJSWG; + double gcgdb, gcggb, gcgsb, gcgeb, gcgT; + double gcsdb, gcsgb, gcssb, gcseb, gcsT; + double gcddb, gcdgb, gcdsb, gcdeb, gcdT; + double gcbdb, gcbgb, gcbsb, gcbeb, gcbT; + double gcedb, gcegb, gcesb, gceeb, gceT; + double gcTt, gTtg, gTtb, gTtdp, gTtt, gTtsp; + double vbd=0.0, vbs, vds, vgb, vgd, vgs, vgdo, xfact; + double vg, vd, vs, vp, ve, vb; + double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; + + double Vgs_eff, Vfb=0.0, dVfb_dVb, dVfb_dVd, dVfb_dT; + double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd, dVth_dT; + double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg; + double n, dn_dVb, Vtm; + double ExpArg, V0; + double ueff, dueff_dVg, dueff_dVd, dueff_dVb, dueff_dT; + double Esat, Vdsat; + double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb, dEsatL_dT; + double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, dVdsat_dT, Vasat; + double dVasat_dVg, dVasat_dVb, dVasat_dVd, dVasat_dT; + double Va, dVa_dVd, dVa_dVg, dVa_dVb, dVa_dT; + double Vbseff, dVbseff_dVb; + double CoxWL; + double T0=0.0, dT0_dVg, dT0_dVd, dT0_dVb, dT0_dT; + + double T1, dT1_dVg, dT1_dVd, dT1_dVb, dT1_dT; + double T2, dT2_dVg, dT2_dVd, dT2_dVb, dT2_dT, dT2_dVp; + double T3, dT3_dVg, dT3_dVd, dT3_dVb, dT3_dT=0.0; + double T4, dT4_dVd, dT4_dVb, dT4_dT; + double T5, dT5_dVg, dT5_dVd, dT5_dVb, dT5_dT=0.0; + double T6, dT6_dVg, dT6_dVd, dT6_dVb, dT6_dT=0.0, dT6_dVp; + double T7; + double T8, dT8_dVd; + double T9, dT9_dVd; + double T10, dT10_dVb, dT10_dVd; + double T11, T12=0.0; + double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; + double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb, dVACLM_dT; + double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb, dVADIBL_dT; + double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb; + double Delt_vth, dDelt_vth_dVb, dDelt_vth_dT; + double Theta0, dTheta0_dVb; + double TempRatio, tmp1, tmp2, tmp3, tmp4; + double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg; + + double a1; + + double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb, dVgsteff_dT; + double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb, dVdseff_dT; + double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; + double diffVds; + double dAbulk_dVg, dn_dVd ; + double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb, dbeta_dT; + double gche, dgche_dVg, dgche_dVd, dgche_dVb, dgche_dT; + double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb, dfgche1_dT; + double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb, dfgche2_dT; + double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb, dIdl_dT; + double Ids, Gm, Gds, Gmb; + double CoxWovL; + double Rds, dRds_dVg, dRds_dVb, dRds_dT, WVCox, WVCoxRds; + double Vgst2Vtm, dVgst2Vtm_dT, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb; + double Leff, Weff, dWeff_dVg, dWeff_dVb; + double AbulkCV, dAbulkCV_dVb; + double qgdo, qgso, cgdo, cgso; + + double dxpart, sxpart; + + struct b4soiSizeDependParam *pParam; + int ByPass, Check, ChargeComputationNeeded=0, error; + + double gbbsp, gbbdp, gbbg, gbbb, gbbp, gbbT; + double gddpsp, gddpdp, gddpg, gddpb, gddpT; + double gsspsp, gsspdp, gsspg, gsspb, gsspT; + double Gbpbs=0.0, Gbpps; + double ves, ved, veb, vge=0.0, delves, vedo, delved; + double vps, vpd, Vps, delvps; + double Vbd, Ves, Vesfb, DeltVthtemp, dDeltVthtemp_dT; + double Vbp, dVbp_dVb; + double DeltVthw, dDeltVthw_dVb, dDeltVthw_dT; + double Gm0, Gds0, Gmb0, GmT0, Gmc, GmT; + double dDIBL_Sft_dVb; + double Igidl, Ggidld=0.0, Ggidlg, Ggidlb=0.0; + double Igisl, Ggisls=0.0, Ggislg, Ggislb=0.0; + double Gjsd, Gjsb=0.0, GjsT, Gjdd, Gjdb=0.0, GjdT; + double Ibp, Iii, Giid=0.0, Giig, Giib=0.0, GiiT, Gcd, Gcb, GcT, ceqbody, ceqbodcon; + double gppb, gppp; + double delTemp, deldelTemp, Temp; + double ceqth, ceqqth; + double K1; + double qjs=0.0, gcjsbs=0.0, gcjsT; + double qjd=0.0, gcjdbs=0.0, gcjdT; + double qge; + double ceqqe; + double ni, Eg, Cbox, CboxWL; + double cjsbs; + double dVfbeff_dVrg; + double qinv, qgate=0.0, qbody=0.0, qdrn=0.0, qsrc, qsub=0.0, cqgate, cqbody, cqdrn, cqsub, cqtemp; + + double Cgg, Cgd, Cgb; + double Csg, Csd, Csb, Cbg, Cbd, Cbb; + double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1; + double Vdsatii; + double Ibs1 ,dIbs1_dVb ,dIbs1_dT; + double Ibs2 ,dIbs2_dVb ,dIbs2_dT; + double Ibs3 ,dIbs3_dVb ,dIbs3_dVd, dIbs3_dT; + double Ibs4 ,dIbs4_dVb ,dIbs4_dT; + double Ibd1 ,dIbd1_dVb ,dIbd1_dVd ,dIbd1_dT; + double Ibd2 ,dIbd2_dVb ,dIbd2_dVd ,dIbd2_dT; + double Ibd3 ,dIbd3_dVb ,dIbd3_dVd ,dIbd3_dT; + double Ibd4 ,dIbd4_dVb ,dIbd4_dVd ,dIbd4_dT; + double WTsi, NVtm1, NVtm2; + double Ic, dIc_dVb=0.0, dIc_dVd=0.0; + double Ibs; + double Ibd; + double Denomi ,dDenomi_dVg ,dDenomi_dVd ,dDenomi_dVb ,dDenomi_dT; + double Qsub0 ,dQsub0_dVg ,dQsub0_dVb ,dQsub0_dVd ; + double Qac0 ,dQac0_dVb ,dQac0_dVd; + double Qe1 , dQe1_dVb, dQe1_dVe, dQe1_dT; + double Ce1b ,Ce1e, Ce1T; + double dQac0_dVrg, dQsub0_dVrg; + + /* for self-heating */ + double vbi, vfbb, phi, sqrtPhi, Xdep0, u0temp, vsattemp; + double jdifs, jdifd, djdifs_dT, djdifd_dT; + double jbjts, jbjtd, djbjts_dT, djbjtd_dT; + double jrecs, jrecd, djrecs_dT, djrecd_dT; + double jtuns, jtund, djtuns_dT, djtund_dT; + double rds0=0.0, ua, ub, uc; + double dvbi_dT, dvfbb_dT, du0temp_dT; + double dvsattemp_dT, drds0_dT=0.0, dua_dT, dub_dT, duc_dT, dni_dT, dVtm_dT; + double dVfbeff_dT, dQac0_dT, dQsub0_dT; + double CbT, CsT, CgT; + double rho, rho_ref, ku0temp; /* v4.0 */ + double drho_dT, drho_ref_dT, dku0temp_dT; /* v4.0 */ + + /* v2.0 release */ + double Vbsh, dVbsh_dVb; + double sqrtPhisExt, dsqrtPhisExt_dVb; + double T13, T14; + double dT11_dVb, dT13_dVb, dT14_dVb; + double dVgst_dVd; + double Vdsatii0, dVdsatii0_dT; + double VgsStep, dVgsStep_dT, Ratio, dRatio_dVg, dRatio_dVb, dRatio_dVd, dRatio_dT, dTempRatio_dT; + double Vdiff, dVdiff_dVg, dVdiff_dVb, dVdiff_dVd, dVdiff_dT; + double dNVtm1_dT; + double NVtmf, NVtmr, dNVtmf_dT, dNVtmr_dT; + double TempRatioMinus1; + double Ahlis, dAhlis_dT, Ahlid, dAhlid_dT ; + double WsTsi, WdTsi; + double dPhiBSWG_dT, dcjsbs_dT, darg_dT=0.0, ddT3_dVb_dT=0.0; + double dT7_dT, dT0_dT7, dT1_dT7, dT2_dT7; + double CoxWLb, CoxWLcenb; + double ExpVbsNVtm, dExpVbsNVtm_dVb, dExpVbsNVtm_dT; + double ExpVbdNVtm, dExpVbdNVtm_dVb, dExpVbdNVtm_dVd, dExpVbdNVtm_dT; + double Ien, dIen_dT, Iendif, dIendif_dT; + double Ibsdif=0.0, dIbsdif_dVb=0.0, dIbsdif_dT=0.0; + double Ibddif=0.0, dIbddif_dVb=0.0, dIbddif_dT=0.0; + double Ehlis, dEhlis_dVb, dEhlis_dT; + double EhlisFactor, dEhlisFactor_dVb, dEhlisFactor_dT; + double Ehlid, dEhlid_dVb, dEhlid_dVd, dEhlid_dT; + double EhlidFactor, dEhlidFactor_dVb, dEhlidFactor_dVd, dEhlidFactor_dT; + double E2ndFactor, dE2ndFactor_dVb, dE2ndFactor_dVd, dE2ndFactor_dT; + double dT10_dT, dT11_dT, DioMax; + double cjdbs, dcjdbs_dT; + double wdios, wdiod; + + /* for capMod3 */ + double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVb, LINK, Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVb; + double CoxWLcen, QovCox, dQac0_dVg, DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dVd, dDeltaPhi_dVb; + double dTcen_dVd, dTcen_dT, dCoxeff_dVd, dCoxeff_dT, dCoxWLcenb_dT, qinoi, qbulk; + double T3zb, lt1zb, ltwzb, Theta0zb; + double Delt_vthzb, dDelt_vthzb_dT; + double DeltVthwzb, dDeltVthwzb_dT; + double DeltVthtempzb, dDeltVthtempzb_dT; + double Vthzb=0.0, dVthzb_dT=0.0, Vfbzb, dVfbzb_dT; + + /* v3.2 */ + double noff, dnoff_dVd, dnoff_dVb; + double vgmb; + + /* v3.1 added for RF */ + double geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg; + double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd; + double delvges, delvgms, vgme; + double gcgmgmb=0.0, gcgmdb, gcgmsb, gcdgmb, gcsgmb; + double gcgmeb, gcegmb, qgme, qgmid=0.0, ceqqgmid; + double gcgbb; + double vgge, vggm; + + /* v3.0 */ + double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVb, Igs, dIgs_dVg, dIgs_dVs, Igd, dIgd_dVg, dIgd_dVd; + double Igcs, dIgcs_dVg, dIgcs_dVd, dIgcs_dVb, Igcd, dIgcd_dVg, dIgcd_dVd, dIgcd_dVb; + double vgs_eff, dvgs_eff_dvg, vgd_eff, dvgd_eff_dvg; + double VxNVt, ExpVxNVt; + double gIstotg, gIstotd, gIstotb, gIstots, Istoteq; + double gIdtotg, gIdtotd, gIdtotb, gIdtots, Idtoteq; + double gIgtotg, gIgtotd, gIgtotb, gIgtots, Igtoteq; + + /* v3.0 */ + double Vbsitf, dVbsitf_dVg, dVbsitf_dVd, dVbsitf_dVb, dVbsitf_dVe, dVbsitf_dT; + double dIgb1_dVe, gige, Giie, dT0_dVe, dRatio_dVe, dVdiff_dVe; + double dT1_dVe, dT5_dVe, dIgb_dVe, dVox_dVe, dVoxdepinv_dVe=0.0, dVaux_dVe; + double Gme, gTte, gbbe, gddpe, gsspe; + double Vbs0, dVbs0_dVg, dVbs0_dVd, dVbs0_dVe, dVbs0_dT; + double Vbs0mos, dVbs0mos_dVe, dVbs0mos_dT; + double Vbsmos, dVbsmos_dVg, dVbsmos_dVd, dVbsmos_dVb, dVbsmos_dVe, dVbsmos_dT; + double PhiON, dPhiON_dVg, dPhiON_dVd, dPhiON_dVe, dPhiON_dT; + double PhiFD, dPhiFD_dVg, dPhiFD_dVd, dPhiFD_dVe, dPhiFD_dT; + double Vbs0t, dVbs0t_dVg, dVbs0t_dVd, dVbs0t_dVe, dVbs0t_dT; + double VthFD, dVthFD_dVd, dVthFD_dVb, dVthFD_dVe, dVthFD_dT; + double VtgsFD, ExpVtgsFD, VgstFD, ExpVgstFD; + double VtgseffFD, dVtgseffFD_dVd, dVtgseffFD_dVg, dVtgseffFD_dVe, dVtgseffFD_dT; + double VgsteffFD, dVgsteffFD_dVd, dVgsteffFD_dVg, dVgsteffFD_dVe, dVgsteffFD_dT; + double dT2_dVe, dVbsh_dVg, dVbsh_dVd, dVbsh_dVe, dVbsh_dT; + double dVgsteff_dVe, dVbseff_dVg, dVbseff_dVd, dVbseff_dVe, dVbseff_dT; + + /* v2.2 release */ + double Vgb=0.0, dVgb_dVg=0.0, dVgb_dVb=0.0, Vox, dVox_dVg, dVox_dVd, dVox_dVb; + double OxideRatio, Vaux, dVaux_dVg, dVaux_dVd, dVaux_dVb; + double Igb, dIgb_dVg, dIgb_dVd, dIgb_dVb; + double ceqgate; + double dT0_dVox, Voxeff, dVoxeff_dVox; + double dVox_dT=0.0, dVaux_dT=0.0, dIgb_dT; + double Voxacc=0.0, dVoxacc_dVg=0.0, dVoxacc_dVd=0.0, dVoxacc_dVb=0.0; + double Voxdepinv=0.0, dVoxdepinv_dVg=0.0, dVoxdepinv_dVb=0.0, dVoxdepinv_dVd=0.0, dVoxdepinv_dT=0.0; + double Igb1, dIgb1_dVg, dIgb1_dVd, dIgb1_dVb, dIgb1_dT; + double Igb2, dIgb2_dVg, dIgb2_dVd, dIgb2_dVb, dIgb2_dT; + double gigs, gigd, gigb, gigg, gigT; + double gigpg, gigpp; + + /* v4.0 */ + double IdlovVdseff, dIdlovVdseff_dVg, dIdlovVdseff_dVd, dIdlovVdseff_dVb; + double IdovVds; + double vdbs, vsbs, vdbd=0.0, vsbd, vsbdo, vbs_jct, vbd_jct; + double Vsbs, Vdbd, Vdbs; + double delvdbd, delvsbs, delvdbs, delvbd_jct, delvbs_jct; + double gcdbdb, gcsbsb, gcsbb, gcdbb; + double ceqqjd=0.0, ceqqjs=0.0; + double Lpe_Vb; /* v4.0 for Vth */ + double DITS_Sft, DITS_Sft2, dDITS_Sft_dVb, dDITS_Sft_dVd, dDITS_Sft2_dVd, dDITS_Sft_dT; + double FP, dFP_dT, dFP_dVg; + double VADITS, dVADITS_dVg, dVADITS_dVd, dVADITS_dT; /* for DITS */ + double Iii_Igidl, Giigidl_b, Giigidl_d, Giigidl_g, Giigidl_e, Giigidl_T; + double gjsdb; + double Idbdp=0.0, Isbsp=0.0, cdbdp, csbsp, gcjdbdp, gcjsbsp, GGjdb, GGjsb; + double vdes, vses, vdedo, delvdes, delvses, delvded, Isestot, cseshat, Idedtot, cdedhat; + double PowWeffWr, rd0=0.0, rs0=0.0, rdwmin=0.0, rswmin=0.0, drs0_dT=0.0, drd0_dT=0.0, drswmin_dT=0.0, + drdwmin_dT=0.0, Rd, dRd_dVg, dRd_dVb, dRd_dT, Rs, dRs_dVg, dRs_dVb, dRs_dT; + double dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb, dgstot_dve, dgstot_dT; + double dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb, dgdtot_dve, dgdtot_dT; + double gstot, gstotd, gstotg, gstots, gstotb, ceqgstot; + double gdtot, gdtotd, gdtotg, gdtots, gdtotb, ceqgdtot; + double gdpr, gspr; + /*4.1*/ + double toxe, epsrox, epssub, epsgate; + double Tnom, Eg0, Vtm0; + double Vbci, Idsmosfet, Iiibjt; + double dVbci_dT, dIiibjt_dVd, dIiibjt_dVb, dIiibjt_dT; + double VgsteffVth, dT11_dVg; + /* v4.1 */ + /* Jun 09 */ + double toxe_mob ; + /* Jun 09 */ + + + double dTheta0_dT, dn_dT, dsqrtPhisExt_dT, dT3zb_dT, dltwzb_dT, dlt1zb_dT, dTheta0zb_dT, dvth0_dT, dDIBL_Sft_dT,dtmp2_dT; /* v4.2 temp deriv */ + double Vgd, Vgd_eff, dVgd_eff_dVg; + double dVbs0mos_dVd; + double Ig_agbcp2, dIg_agbcp2_dVg, dIg_agbcp2_dVp; + double vgp_eff, vgp=0.0, dvgp_eff_dvg, dvgp_eff_dvp; + + /* improved body contact charge model */ + double CoxWL2, CoxWLb2; + double ExpVgst2, Vgsteff2=0.0, VgstNVt2, ExpArg2; + double dVgsteff2_dVd=0.0, dVgsteff2_dVg=0.0, dVgsteff2_dVb=0.0, dVgsteff2_dVe, dVgsteff2_dT=0.0; + double T02=0.0; + double Qac02, dQac02_dVrg=0.0, dQac02_dVd=0.0, dQac02_dVg=0.0, dQac02_dVb=0.0, dQac02_dT=0.0; + double Vgs_eff2=0.0, dVgs_eff2_dVg=0.0; + double Vfbzb2=0.0, dVfbzb2_dT=0.0; + double Vfb2=0.0, dVfb2_dVd, dVfb2_dVb, dVfb2_dT; + double Vfbeff2=0.0, dVfbeff2_dVd=0.0, dVfbeff2_dVrg=0.0, dVfbeff2_dVg=0.0, dVfbeff2_dVb=0.0, dVfbeff2_dT=0.0; + double Qsub02, dQsub02_dVg=0.0, dQsub02_dVrg=0.0, dQsub02_dVd=0.0, dQsub02_dVb=0.0, dQsub02_dT=0.0; + double VdsatCV2, dVdsatCV2_dVg, dVdsatCV2_dVb; + double VdseffCV2=0.0, dVdseffCV2_dVg=0.0, dVdseffCV2_dVd=0.0, dVdseffCV2_dVb=0.0; + double Cbg12=0.0, Cbd12=0.0, Cbb12=0.0; + double Cgg12=0.0, Cgd12=0.0, Cgb12=0.0; + double Csg12=0.0, Csd12=0.0, Csb12=0.0; + double Tcen2=0.0, dTcen2_dVg=0.0, dTcen2_dVd, dTcen2_dVb=0.0, dTcen2_dT=0.0; + double Ccen2; + double Coxeff2=0.0, dCoxeff2_dVg=0.0, dCoxeff2_dVd=0.0, dCoxeff2_dVb=0.0, dCoxeff2_dT=0.0; + double CoxWLcenb2=0.0, dCoxWLcenb2_dT=0.0; + double QovCox2; + double DeltaPhi2=0.0, dDeltaPhi2_dVg=0.0, dDeltaPhi2_dVd, dDeltaPhi2_dVb; + double CoxWLcen2=0.0; + double T22=0.0, T52=0.0; + double qsrc2, qbulk2; + double Csg2, Csd2, Csb2; + double DELTA_3_SOI2; + double dphi_dT,dsqrtPhi_dT,dXdep0_dT,cdep0,dcep0_dT,theta0vb0,dtheta0vb0_dT; + double thetaRout,dthetaRout_dT,dcdep0_dT; + double dPhis_dT,dsqrtPhis_dT,dXdep_dT,dlt1_dT,dltw_dT; + double agidl, bgidl, cgidl, egidl, rgidl, kgidl, fgidl; + + double agisl, bgisl, cgisl, egisl, rgisl, kgisl, fgisl; + double ucs, ud; /* Bugfix # 21 Jul09*/ + double ndiode, ndioded; /* v4.2 bugfix */ + double nrecf0s, nrecf0d, nrecr0s, nrecr0d, vrec0s, vrec0d, ntuns, ntund, vtun0s,vtun0d;/*bugfix for junction DC swapping */ + + double m; + + for (; model != NULL; model = model->B4SOInextModel) + { for (here = model->B4SOIinstances; here != NULL; + here = here->B4SOInextInstance) { - if (here->B4SOIowner != ARCHme) - continue; - - Check = 0; - ByPass = 0; - selfheat = (model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0); - pParam = here->pParam; - - - if ((ckt->CKTmode & MODEINITSMSIG)) - { - vs = *(ckt->CKTrhsOld + here->B4SOIsNodePrime); - if (!here->B4SOIvbsusrGiven) { - vbs = *(ckt->CKTstate0 + here->B4SOIvbs); - vb = *(ckt->CKTrhsOld + here->B4SOIbNode); - } - else { - vbs = here->B4SOIvbsusr; - vb = here->B4SOIvbsusr + vs; - } - vgs = *(ckt->CKTstate0 + here->B4SOIvgs); - ves = *(ckt->CKTstate0 + here->B4SOIves); - vps = *(ckt->CKTstate0 + here->B4SOIvps); - vds = *(ckt->CKTstate0 + here->B4SOIvds); - delTemp = *(ckt->CKTstate0 + here->B4SOIdeltemp); - /* v4.0 */ - vdbs = *(ckt->CKTstate0 + here->B4SOIvdbs); /* v4.0 for rbody */ - vsbs = *(ckt->CKTstate0 + here->B4SOIvsbs); /* v4.0 for rbody */ - vses = *(ckt->CKTstate0 + here->B4SOIvses); /* v4.0 for rdsmod*/ - vdes = *(ckt->CKTstate0 + here->B4SOIvdes); /* v4.0 for rdsmod*/ - - /* v4.0 end */ - - vg = *(ckt->CKTrhsOld + here->B4SOIgNode); - vd = *(ckt->CKTrhsOld + here->B4SOIdNodePrime); - vp = *(ckt->CKTrhsOld + here->B4SOIpNode); - ve = *(ckt->CKTrhsOld + here->B4SOIeNode); - - /* v3.1 added for RF */ - vgge = *(ckt->CKTrhsOld + here->B4SOIgNodeExt); - vggm = *(ckt->CKTrhsOld + here->B4SOIgNodeMid); - - vges = *(ckt->CKTstate0 + here->B4SOIvges); - vgms = *(ckt->CKTstate0 + here->B4SOIvgms); - /* v3.1 added for RF end*/ - } - else if ((ckt->CKTmode & MODEINITTRAN)) - { - vs = *(ckt->CKTrhsOld + here->B4SOIsNodePrime); - if (!here->B4SOIvbsusrGiven) { - vbs = *(ckt->CKTstate1 + here->B4SOIvbs); - vb = *(ckt->CKTrhsOld + here->B4SOIbNode); - } - else { - vbs = here->B4SOIvbsusr; - vb = here->B4SOIvbsusr + vs; - } - vgs = *(ckt->CKTstate1 + here->B4SOIvgs); - ves = *(ckt->CKTstate1 + here->B4SOIves); - vps = *(ckt->CKTstate1 + here->B4SOIvps); - vds = *(ckt->CKTstate1 + here->B4SOIvds); - delTemp = *(ckt->CKTstate1 + here->B4SOIdeltemp); - - /* v4.0 */ - vdbs = *(ckt->CKTstate1 + here->B4SOIvdbs); /* v4.0 for rbody */ - vsbs = *(ckt->CKTstate1 + here->B4SOIvsbs); /* v4.0 for rbody */ - vses = *(ckt->CKTstate1 + here->B4SOIvses); /* v4.0 for rdsmod */ - vdes = *(ckt->CKTstate1 + here->B4SOIvdes); /* v4.0 for rdsmod */ - /* v4.0 end */ - - vg = *(ckt->CKTrhsOld + here->B4SOIgNode); - vd = *(ckt->CKTrhsOld + here->B4SOIdNodePrime); - vp = *(ckt->CKTrhsOld + here->B4SOIpNode); - ve = *(ckt->CKTrhsOld + here->B4SOIeNode); - - /* v3.1 added for RF */ - vgge = *(ckt->CKTrhsOld + here->B4SOIgNodeExt); - vggm = *(ckt->CKTrhsOld + here->B4SOIgNodeMid); - vges = *(ckt->CKTstate1 + here->B4SOIvges); - vgms = *(ckt->CKTstate1 + here->B4SOIvgms); - /* v3.1 added for RF end*/ - - } - else if ((ckt->CKTmode & MODEINITJCT) && !here->B4SOIoff) - { vds = model->B4SOItype * here->B4SOIicVDS; - vgs = model->B4SOItype * here->B4SOIicVGS; - ves = model->B4SOItype * here->B4SOIicVES; - vbs = model->B4SOItype * here->B4SOIicVBS; - vps = model->B4SOItype * here->B4SOIicVPS; - vdbs = vsbs = vbs; /* v4.0 */ - - vg = vd = vs = vp = ve = 0.0; - - /* v3.1 added for RF */ - vges = vgms = vgs; - vgge = vggm =0.0; - /* v3.1 added for RF end*/ - - if (vds > 0.0) /* v4.0 */ - { vdes = vds + 0.01; - vses = -0.01; - } - else if (vds < 0.0) - { vdes = vds - 0.01; - vses = 0.01; - } - else - vdes = vses = 0.0; - - delTemp = 0.0; - here->B4SOIphi = pParam->B4SOIphi; - - - - if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && - ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | - MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) - { vbs = 0.0; -/* vgs = model->B4SOItype*0.1 + here->B4SOIvth0; */ - vgs = model->B4SOItype * here->B4SOIvth0 + 0.1; /* v4.0 */ - vds = 0.0; - ves = 0.0; - vps = 0.0; - vges = vgms = vgs; /* v3.1 */ - vbs = vdbs = vsbs = 0.0; /* v4.0 */ - vdes = 0.01; /* v4.0 for rdsmod */ - vses = -0.01; /* v4.0 for rdsmod */ - } - } - else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && - (here->B4SOIoff)) - { delTemp = vps = vbs = vgs = vds = ves = 0.0; - vg = vd = vs = vp = ve = 0.0; - vgge = vggm = 0.0; /* v3.1 */ - vges = vgms =0.0; /* v3.1 */ - vdbs = vsbs = vdes = vses = 0.0; /* v4.0 */ - } - else - { + if (here->B4SOIowner != ARCHme) + continue; + + Check = 0; + ByPass = 0; + selfheat = (model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0); + pParam = here->pParam; + + + if ((ckt->CKTmode & MODEINITSMSIG)) + { + vs = *(ckt->CKTrhsOld + here->B4SOIsNodePrime); + if (!here->B4SOIvbsusrGiven) { + vbs = *(ckt->CKTstate0 + here->B4SOIvbs); + vb = *(ckt->CKTrhsOld + here->B4SOIbNode); + } + else { + vbs = here->B4SOIvbsusr; + vb = here->B4SOIvbsusr + vs; + } + vgs = *(ckt->CKTstate0 + here->B4SOIvgs); + ves = *(ckt->CKTstate0 + here->B4SOIves); + vps = *(ckt->CKTstate0 + here->B4SOIvps); + vds = *(ckt->CKTstate0 + here->B4SOIvds); + delTemp = *(ckt->CKTstate0 + here->B4SOIdeltemp); + /* v4.0 */ + vdbs = *(ckt->CKTstate0 + here->B4SOIvdbs); /* v4.0 for rbody */ + vdbd = *(ckt->CKTstate0 + here->B4SOIvdbd); /* v4.0 for rbody */ + vsbs = *(ckt->CKTstate0 + here->B4SOIvsbs); /* v4.0 for rbody */ + vses = *(ckt->CKTstate0 + here->B4SOIvses); /* v4.0 for rdsmod*/ + vdes = *(ckt->CKTstate0 + here->B4SOIvdes); /* v4.0 for rdsmod*/ + + /* v4.0 end */ + + vg = *(ckt->CKTrhsOld + here->B4SOIgNode); + vd = *(ckt->CKTrhsOld + here->B4SOIdNodePrime); + vp = *(ckt->CKTrhsOld + here->B4SOIpNode); + ve = *(ckt->CKTrhsOld + here->B4SOIeNode); + + /* v3.1 added for RF */ + vgge = *(ckt->CKTrhsOld + here->B4SOIgNodeExt); + vggm = *(ckt->CKTrhsOld + here->B4SOIgNodeMid); + + vges = *(ckt->CKTstate0 + here->B4SOIvges); + vgms = *(ckt->CKTstate0 + here->B4SOIvgms); + /* v3.1 added for RF end*/ + } + else if ((ckt->CKTmode & MODEINITTRAN)) + { + vs = *(ckt->CKTrhsOld + here->B4SOIsNodePrime); + if (!here->B4SOIvbsusrGiven) { + vbs = *(ckt->CKTstate1 + here->B4SOIvbs); + vb = *(ckt->CKTrhsOld + here->B4SOIbNode); + } + else { + vbs = here->B4SOIvbsusr; + vb = here->B4SOIvbsusr + vs; + } + vgs = *(ckt->CKTstate1 + here->B4SOIvgs); + ves = *(ckt->CKTstate1 + here->B4SOIves); + vps = *(ckt->CKTstate1 + here->B4SOIvps); + vds = *(ckt->CKTstate1 + here->B4SOIvds); + delTemp = *(ckt->CKTstate1 + here->B4SOIdeltemp); + + /* v4.0 */ + vdbs = *(ckt->CKTstate1 + here->B4SOIvdbs); /* v4.0 for rbody */ + vsbs = *(ckt->CKTstate1 + here->B4SOIvsbs); /* v4.0 for rbody */ + vses = *(ckt->CKTstate1 + here->B4SOIvses); /* v4.0 for rdsmod */ + vdes = *(ckt->CKTstate1 + here->B4SOIvdes); /* v4.0 for rdsmod */ + /* v4.0 end */ + + vg = *(ckt->CKTrhsOld + here->B4SOIgNode); + vd = *(ckt->CKTrhsOld + here->B4SOIdNodePrime); + vp = *(ckt->CKTrhsOld + here->B4SOIpNode); + ve = *(ckt->CKTrhsOld + here->B4SOIeNode); + + /* v3.1 added for RF */ + vgge = *(ckt->CKTrhsOld + here->B4SOIgNodeExt); + vggm = *(ckt->CKTrhsOld + here->B4SOIgNodeMid); + vges = *(ckt->CKTstate1 + here->B4SOIvges); + vgms = *(ckt->CKTstate1 + here->B4SOIvgms); + /* v3.1 added for RF end*/ + + } + else if ((ckt->CKTmode & MODEINITJCT) && !here->B4SOIoff) + { vds = model->B4SOItype * here->B4SOIicVDS; + vgs = model->B4SOItype * here->B4SOIicVGS; + ves = model->B4SOItype * here->B4SOIicVES; + vbs = model->B4SOItype * here->B4SOIicVBS; + vps = model->B4SOItype * here->B4SOIicVPS; + vdbs = vsbs = vbs; /* v4.0 */ + + vg = vd = vs = vp = ve = 0.0; + + /* v3.1 added for RF */ + vges = vgms = vgs; + vgge = vggm =0.0; + /* v3.1 added for RF end*/ + + if (vds > 0.0) /* v4.0 */ + { vdes = vds + 0.01; + vses = -0.01; + } + else if (vds < 0.0) + { vdes = vds - 0.01; + vses = 0.01; + } + else + vdes = vses = 0.0; + + delTemp = 0.0; + here->B4SOIphi = pParam->B4SOIphi; + + + + if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) && + ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP | + MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC)))) + { vbs = 0.0; + /* vgs = model->B4SOItype*0.1 + here->B4SOIvth0; */ + vgs = model->B4SOItype * here->B4SOIvth0 + 0.1; /* v4.0 */ + vds = 0.0; + ves = 0.0; + vps = 0.0; + vges = vgms = vgs; /* v3.1 */ + vbs = vdbs = vsbs = 0.0; /* v4.0 */ + vdes = 0.01; /* v4.0 for rdsmod */ + vses = -0.01; /* v4.0 for rdsmod */ + } + } + else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) && + (here->B4SOIoff)) + { delTemp = vps = vbs = vgs = vds = ves = 0.0; + vg = vd = vs = vp = ve = 0.0; + vgge = vggm = 0.0; /* v3.1 */ + vges = vgms =0.0; /* v3.1 */ + vdbs = vsbs = vdes = vses = 0.0; /* v4.0 */ + } + else + { #ifndef PREDICTOR - if ((ckt->CKTmode & MODEINITPRED)) - { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; - *(ckt->CKTstate0 + here->B4SOIvbs) = - *(ckt->CKTstate1 + here->B4SOIvbs); - vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvbs)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvbs))); - *(ckt->CKTstate0 + here->B4SOIvgs) = - *(ckt->CKTstate1 + here->B4SOIvgs); - vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvgs)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvgs))); - *(ckt->CKTstate0 + here->B4SOIves) = - *(ckt->CKTstate1 + here->B4SOIves); - ves = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIves)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIves))); - *(ckt->CKTstate0 + here->B4SOIvps) = - *(ckt->CKTstate1 + here->B4SOIvps); - vps = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvps)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvps))); - *(ckt->CKTstate0 + here->B4SOIvds) = - *(ckt->CKTstate1 + here->B4SOIvds); - vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvds)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvds))); - *(ckt->CKTstate0 + here->B4SOIvbd) = - *(ckt->CKTstate0 + here->B4SOIvbs) - - *(ckt->CKTstate0 + here->B4SOIvds); - /* v4.0 */ - *(ckt->CKTstate0 + here->B4SOIvdbs) = - *(ckt->CKTstate1 + here->B4SOIvdbs); - vdbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvdbs)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvdbs))); - *(ckt->CKTstate0 + here->B4SOIvdbd) = - *(ckt->CKTstate0 + here->B4SOIvdbs) - - *(ckt->CKTstate0 + here->B4SOIvds); - *(ckt->CKTstate0 + here->B4SOIvsbs) = - *(ckt->CKTstate1 + here->B4SOIvsbs); - vsbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvsbs)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvsbs))); - *(ckt->CKTstate0 + here->B4SOIvses) = - *(ckt->CKTstate1 + here->B4SOIvses); - vses = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvses)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvses))); - *(ckt->CKTstate0 + here->B4SOIvdes) = - *(ckt->CKTstate1 + here->B4SOIvdes); - vdes = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvdes)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvdes))); - /* v4.0 end */ - - *(ckt->CKTstate0 + here->B4SOIvg) = *(ckt->CKTstate1 + here->B4SOIvg); - *(ckt->CKTstate0 + here->B4SOIvd) = *(ckt->CKTstate1 + here->B4SOIvd); - *(ckt->CKTstate0 + here->B4SOIvs) = *(ckt->CKTstate1 + here->B4SOIvs); - *(ckt->CKTstate0 + here->B4SOIvp) = *(ckt->CKTstate1 + here->B4SOIvp); - *(ckt->CKTstate0 + here->B4SOIve) = *(ckt->CKTstate1 + here->B4SOIve); - - /* v3.1 added for RF */ - *(ckt->CKTstate0 + here->B4SOIvgge) = *(ckt->CKTstate1 + here->B4SOIvgge); - *(ckt->CKTstate0 + here->B4SOIvggm) = *(ckt->CKTstate1 + here->B4SOIvggm); - *(ckt->CKTstate0 + here->B4SOIvges) = - *(ckt->CKTstate1 + here->B4SOIvges); - vges = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvges)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvges))); - *(ckt->CKTstate0 + here->B4SOIvgms) = - *(ckt->CKTstate1 + here->B4SOIvgms); - vgms = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvgms)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIvgms))); - /* v3.1 added for RF end */ - - /* Only predict ve */ - ve = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIve)) - - (xfact * (*(ckt->CKTstate2 + here->B4SOIve))); - /* Then update vg, vs, vb, vd, vp base on ve */ - vs = ve - model->B4SOItype * ves; - vg = model->B4SOItype * vgs + vs; - vd = model->B4SOItype * vds + vs; - vb = model->B4SOItype * vbs + vs; - vp = model->B4SOItype * vps + vs; - - vgge = model->B4SOItype * vges + vs; /* v3.1 */ - vggm = model->B4SOItype * vgms + vs; /* v3.1 */ - - delTemp = (1.0 + xfact)* (*(ckt->CKTstate1 + - here->B4SOIdeltemp))-(xfact * (*(ckt->CKTstate2 + - here->B4SOIdeltemp))); - -/* v2.2.3 bug fix */ - *(ckt->CKTstate0 + here->B4SOIdeltemp) = - *(ckt->CKTstate1 + here->B4SOIdeltemp); - - if (selfheat) - { - here->B4SOIphi = 2.0 * here->B4SOIvtm - * log(pParam->B4SOInpeak / - here->B4SOIni); - } - - } - else - { + if ((ckt->CKTmode & MODEINITPRED)) + { xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1]; + *(ckt->CKTstate0 + here->B4SOIvbs) = + *(ckt->CKTstate1 + here->B4SOIvbs); + vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvbs)) + - (xfact * (*(ckt->CKTstate2 + here->B4SOIvbs))); + *(ckt->CKTstate0 + here->B4SOIvgs) = + *(ckt->CKTstate1 + here->B4SOIvgs); + vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvgs)) + - (xfact * (*(ckt->CKTstate2 + here->B4SOIvgs))); + *(ckt->CKTstate0 + here->B4SOIves) = + *(ckt->CKTstate1 + here->B4SOIves); + ves = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIves)) + - (xfact * (*(ckt->CKTstate2 + here->B4SOIves))); + *(ckt->CKTstate0 + here->B4SOIvps) = + *(ckt->CKTstate1 + here->B4SOIvps); + vps = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvps)) + - (xfact * (*(ckt->CKTstate2 + here->B4SOIvps))); + *(ckt->CKTstate0 + here->B4SOIvds) = + *(ckt->CKTstate1 + here->B4SOIvds); + vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvds)) + - (xfact * (*(ckt->CKTstate2 + here->B4SOIvds))); + *(ckt->CKTstate0 + here->B4SOIvbd) = + *(ckt->CKTstate0 + here->B4SOIvbs) + - *(ckt->CKTstate0 + here->B4SOIvds); + /* v4.0 */ + *(ckt->CKTstate0 + here->B4SOIvdbs) = + *(ckt->CKTstate1 + here->B4SOIvdbs); + vdbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvdbs)) + - (xfact * (*(ckt->CKTstate2 + here->B4SOIvdbs))); + *(ckt->CKTstate0 + here->B4SOIvdbd) = + *(ckt->CKTstate0 + here->B4SOIvdbs) + - *(ckt->CKTstate0 + here->B4SOIvds); + *(ckt->CKTstate0 + here->B4SOIvsbs) = + *(ckt->CKTstate1 + here->B4SOIvsbs); + vsbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvsbs)) + - (xfact * (*(ckt->CKTstate2 + here->B4SOIvsbs))); + *(ckt->CKTstate0 + here->B4SOIvses) = + *(ckt->CKTstate1 + here->B4SOIvses); + vses = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvses)) + - (xfact * (*(ckt->CKTstate2 + here->B4SOIvses))); + *(ckt->CKTstate0 + here->B4SOIvdes) = + *(ckt->CKTstate1 + here->B4SOIvdes); + vdes = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvdes)) + - (xfact * (*(ckt->CKTstate2 + here->B4SOIvdes))); + /* v4.0 end */ + + *(ckt->CKTstate0 + here->B4SOIvg) = *(ckt->CKTstate1 + here->B4SOIvg); + *(ckt->CKTstate0 + here->B4SOIvd) = *(ckt->CKTstate1 + here->B4SOIvd); + *(ckt->CKTstate0 + here->B4SOIvs) = *(ckt->CKTstate1 + here->B4SOIvs); + *(ckt->CKTstate0 + here->B4SOIvp) = *(ckt->CKTstate1 + here->B4SOIvp); + *(ckt->CKTstate0 + here->B4SOIve) = *(ckt->CKTstate1 + here->B4SOIve); + + /* v3.1 added for RF */ + *(ckt->CKTstate0 + here->B4SOIvgge) = *(ckt->CKTstate1 + here->B4SOIvgge); + *(ckt->CKTstate0 + here->B4SOIvggm) = *(ckt->CKTstate1 + here->B4SOIvggm); + *(ckt->CKTstate0 + here->B4SOIvges) = + *(ckt->CKTstate1 + here->B4SOIvges); + vges = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvges)) + - (xfact * (*(ckt->CKTstate2 + here->B4SOIvges))); + *(ckt->CKTstate0 + here->B4SOIvgms) = + *(ckt->CKTstate1 + here->B4SOIvgms); + vgms = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIvgms)) + - (xfact * (*(ckt->CKTstate2 + here->B4SOIvgms))); + /* v3.1 added for RF end */ + + /* Only predict ve */ + ve = (1.0 + xfact)* (*(ckt->CKTstate1 + here->B4SOIve)) + - (xfact * (*(ckt->CKTstate2 + here->B4SOIve))); + /* Then update vg, vs, vb, vd, vp base on ve */ + vs = ve - model->B4SOItype * ves; + vg = model->B4SOItype * vgs + vs; + vd = model->B4SOItype * vds + vs; + vb = model->B4SOItype * vbs + vs; + vp = model->B4SOItype * vps + vs; + + vgge = model->B4SOItype * vges + vs; /* v3.1 */ + vggm = model->B4SOItype * vgms + vs; /* v3.1 */ + + delTemp = (1.0 + xfact)* (*(ckt->CKTstate1 + + here->B4SOIdeltemp))-(xfact * (*(ckt->CKTstate2 + + here->B4SOIdeltemp))); + + /* v2.2.3 bug fix */ + *(ckt->CKTstate0 + here->B4SOIdeltemp) = + *(ckt->CKTstate1 + here->B4SOIdeltemp); + + /* if (selfheat) + { + here->B4SOIphi = 2.0 * here->B4SOIvtm + * log(pParam->B4SOInpeak / + here->B4SOIni); + } v4.2 bugfix never used in the code */ + + } + else + { #endif /* PREDICTOR */ - vg = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIgNode), - *(ckt->CKTstate0 + here->B4SOIvg), 3.0, &Check); - vd = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIdNodePrime), - *(ckt->CKTstate0 + here->B4SOIvd), 3.0, &Check); - vs = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIsNodePrime), - *(ckt->CKTstate0 + here->B4SOIvs), 3.0, &Check); - vp = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIpNode), - *(ckt->CKTstate0 + here->B4SOIvp), 3.0, &Check); - ve = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIeNode), - *(ckt->CKTstate0 + here->B4SOIve), 3.0, &Check); - /* v3.1 added for RF */ - vgge = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIgNodeExt), - *(ckt->CKTstate0 + here->B4SOIvgge), 3.0, &Check); - - vggm = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIgNodeMid), - *(ckt->CKTstate0 + here->B4SOIvggm), 3.0, &Check); - /* v3.1 added for RF end */ - - delTemp = *(ckt->CKTrhsOld + here->B4SOItempNode); - - vbs = model->B4SOItype * (*(ckt->CKTrhsOld+here->B4SOIbNode) - - *(ckt->CKTrhsOld+here->B4SOIsNodePrime)); - - vps = model->B4SOItype * (vp - vs); - vgs = model->B4SOItype * (vg - vs); - ves = model->B4SOItype * (ve - vs); - vds = model->B4SOItype * (vd - vs); - - vges = model->B4SOItype * (vgge - vs); /* v3.1 */ - vgms = model->B4SOItype * (vggm - vs); /* v3.1 */ - - /* v4.0 */ - vdbs = model->B4SOItype - * (*(ckt->CKTrhsOld + here->B4SOIdbNode) - - *(ckt->CKTrhsOld + here->B4SOIsNodePrime)); - vsbs = model->B4SOItype - * (*(ckt->CKTrhsOld + here->B4SOIsbNode) - - *(ckt->CKTrhsOld + here->B4SOIsNodePrime)); - vses = model->B4SOItype - * (*(ckt->CKTrhsOld + here->B4SOIsNode) - - *(ckt->CKTrhsOld + here->B4SOIsNodePrime)); - vdes = model->B4SOItype - * (*(ckt->CKTrhsOld + here->B4SOIdNode) - - *(ckt->CKTrhsOld + here->B4SOIsNodePrime)); - /* v4.0 end */ + vg = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIgNode), + *(ckt->CKTstate0 + here->B4SOIvg), 3.0, &Check); + vd = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIdNodePrime), + *(ckt->CKTstate0 + here->B4SOIvd), 3.0, &Check); + vs = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIsNodePrime), + *(ckt->CKTstate0 + here->B4SOIvs), 3.0, &Check); + vp = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIpNode), + *(ckt->CKTstate0 + here->B4SOIvp), 3.0, &Check); + ve = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIeNode), + *(ckt->CKTstate0 + here->B4SOIve), 3.0, &Check); + /* v3.1 added for RF */ + vgge = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIgNodeExt), + *(ckt->CKTstate0 + here->B4SOIvgge), 3.0, &Check); + + vggm = B4SOIlimit(*(ckt->CKTrhsOld + here->B4SOIgNodeMid), + *(ckt->CKTstate0 + here->B4SOIvggm), 3.0, &Check); + /* v3.1 added for RF end */ + + delTemp = *(ckt->CKTrhsOld + here->B4SOItempNode); + + vbs = model->B4SOItype * (*(ckt->CKTrhsOld+here->B4SOIbNode) + - *(ckt->CKTrhsOld+here->B4SOIsNodePrime)); + + vps = model->B4SOItype * (vp - vs); + vgs = model->B4SOItype * (vg - vs); + ves = model->B4SOItype * (ve - vs); + vds = model->B4SOItype * (vd - vs); + + vges = model->B4SOItype * (vgge - vs); /* v3.1 */ + vgms = model->B4SOItype * (vggm - vs); /* v3.1 */ + + /* v4.0 */ + vdbs = model->B4SOItype + * (*(ckt->CKTrhsOld + here->B4SOIdbNode) + - *(ckt->CKTrhsOld + here->B4SOIsNodePrime)); + vsbs = model->B4SOItype + * (*(ckt->CKTrhsOld + here->B4SOIsbNode) + - *(ckt->CKTrhsOld + here->B4SOIsNodePrime)); + vses = model->B4SOItype + * (*(ckt->CKTrhsOld + here->B4SOIsNode) + - *(ckt->CKTrhsOld + here->B4SOIsNodePrime)); + vdes = model->B4SOItype + * (*(ckt->CKTrhsOld + here->B4SOIdNode) + - *(ckt->CKTrhsOld + here->B4SOIsNodePrime)); + /* v4.0 end */ #ifndef PREDICTOR - } + } #endif /* PREDICTOR */ - vbd = vbs - vds; - vdbd = vdbs - vds; /* v4.0 */ - - vgd = vgs - vds; - ved = ves - vds; - vgdo = *(ckt->CKTstate0 + here->B4SOIvgs) - - *(ckt->CKTstate0 + here->B4SOIvds); - vedo = *(ckt->CKTstate0 + here->B4SOIves) - - *(ckt->CKTstate0 + here->B4SOIvds); - - /* v3.1 for RF */ - vgedo = *(ckt->CKTstate0 + here->B4SOIvges) - - *(ckt->CKTstate0 + here->B4SOIvds); - vgmdo = *(ckt->CKTstate0 + here->B4SOIvgms) - - *(ckt->CKTstate0 + here->B4SOIvds); - vged = vges - vds; - vgmd = vgms - vds; - delvged = vged - vgedo; - delvgmd = vgmd - vgmdo; - /* v3.1 for RF end*/ - - delvbs = vbs - *(ckt->CKTstate0 + here->B4SOIvbs); - delvbd = vbd - *(ckt->CKTstate0 + here->B4SOIvbd); - delvgs = vgs - *(ckt->CKTstate0 + here->B4SOIvgs); - delves = ves - *(ckt->CKTstate0 + here->B4SOIves); - delvps = vps - *(ckt->CKTstate0 + here->B4SOIvps); - deldelTemp = delTemp - *(ckt->CKTstate0 + here->B4SOIdeltemp); - delvds = vds - *(ckt->CKTstate0 + here->B4SOIvds); - delvgd = vgd - vgdo; - delved = ved - vedo; - delvges = vges - *(ckt->CKTstate0 + here->B4SOIvges); /* v3.1 */ - delvgms = vgms - *(ckt->CKTstate0 + here->B4SOIvgms); /* v3.1 */ - delvdbd = vdbd - *(ckt->CKTstate0 + here->B4SOIvdbd); /* v4.0 */ - delvdbs = vdbs - *(ckt->CKTstate0 + here->B4SOIvdbs); /* v4.0 */ - delvsbs = vsbs - *(ckt->CKTstate0 + here->B4SOIvsbs); /* v4.0 */ - - delvbd_jct = (!here->B4SOIrbodyMod) ? delvbd : delvdbd; /*v4.0*/ - delvbs_jct = (!here->B4SOIrbodyMod) ? delvbs : delvsbs; /*v4.0*/ - - delvses = vses - *(ckt->CKTstate0 + here->B4SOIvses);/*v4.0*/ - vdedo = *(ckt->CKTstate0 + here->B4SOIvdes) - - *(ckt->CKTstate0 + here->B4SOIvds); /* v4.0 */ - delvdes = vdes - *(ckt->CKTstate0 + here->B4SOIvdes); /* v4.0 */ - delvded = vdes - vds - vdedo; /* v4.0 */ - - if (here->B4SOImode >= 0) - { - cdhat = here->B4SOIcd - + (here->B4SOIgm-here->B4SOIgjdg) * delvgs - + (here->B4SOIgds - here->B4SOIgjdd) * delvds - + (here->B4SOIgmbs * delvbs - - here->B4SOIgjdb * delvbs_jct ) /* v4.0 */ - + (here->B4SOIgme - here->B4SOIgjde) * delves - + (here->B4SOIgmT - here->B4SOIgjdT) * deldelTemp; /* v3.0 */ - } - else - { - cdhat = here->B4SOIcd - + (here->B4SOIgm-here->B4SOIgjdg) * delvgd - - (here->B4SOIgds - here->B4SOIgjdd) * delvds - + (here->B4SOIgmbs * delvbd - - here->B4SOIgjdb * delvbd_jct ) /*v4.0 */ - + (here->B4SOIgme - here->B4SOIgjde) * delved - + (here->B4SOIgmT - here->B4SOIgjdT) * deldelTemp; /* v3.0 */ - - } - cbhat = here->B4SOIcb + here->B4SOIgbgs * delvgs - + here->B4SOIgbbs * delvbs - + here->B4SOIgbds * delvds - + here->B4SOIgbes * delves - + here->B4SOIgbps * delvps - + here->B4SOIgbT * deldelTemp; /* v3.0 */ - - Isestot = here->B4SOIgstot * (*(ckt->CKTstate0 + here->B4SOIvses)); - cseshat = Isestot + here->B4SOIgstot * delvses - + here->B4SOIgstotd * delvds + here->B4SOIgstotg * delvgs - + here->B4SOIgstotb * delvbs; - - Idedtot = here->B4SOIgdtot * vdedo; - cdedhat = Idedtot + here->B4SOIgdtot * delvded - + here->B4SOIgdtotd * delvds + here->B4SOIgdtotg * delvgs - + here->B4SOIgdtotb * delvbs; + vbd = vbs - vds; + vdbd = vdbs - vds; /* v4.0 */ + + vgd = vgs - vds; + ved = ves - vds; + vgdo = *(ckt->CKTstate0 + here->B4SOIvgs) + - *(ckt->CKTstate0 + here->B4SOIvds); + vedo = *(ckt->CKTstate0 + here->B4SOIves) + - *(ckt->CKTstate0 + here->B4SOIvds); + + /* v3.1 for RF */ + vgedo = *(ckt->CKTstate0 + here->B4SOIvges) + - *(ckt->CKTstate0 + here->B4SOIvds); + vgmdo = *(ckt->CKTstate0 + here->B4SOIvgms) + - *(ckt->CKTstate0 + here->B4SOIvds); + vged = vges - vds; + vgmd = vgms - vds; + delvged = vged - vgedo; + delvgmd = vgmd - vgmdo; + /* v3.1 for RF end*/ + + delvbs = vbs - *(ckt->CKTstate0 + here->B4SOIvbs); + delvbd = vbd - *(ckt->CKTstate0 + here->B4SOIvbd); + delvgs = vgs - *(ckt->CKTstate0 + here->B4SOIvgs); + delves = ves - *(ckt->CKTstate0 + here->B4SOIves); + delvps = vps - *(ckt->CKTstate0 + here->B4SOIvps); + deldelTemp = delTemp - *(ckt->CKTstate0 + here->B4SOIdeltemp); + delvds = vds - *(ckt->CKTstate0 + here->B4SOIvds); + delvgd = vgd - vgdo; + delved = ved - vedo; + delvges = vges - *(ckt->CKTstate0 + here->B4SOIvges); /* v3.1 */ + delvgms = vgms - *(ckt->CKTstate0 + here->B4SOIvgms); /* v3.1 */ + delvdbd = vdbd - *(ckt->CKTstate0 + here->B4SOIvdbd); /* v4.0 */ + delvdbs = vdbs - *(ckt->CKTstate0 + here->B4SOIvdbs); /* v4.0 */ + delvsbs = vsbs - *(ckt->CKTstate0 + here->B4SOIvsbs); /* v4.0 */ + + delvbd_jct = (!here->B4SOIrbodyMod) ? delvbd : delvdbd; /*v4.0*/ + delvbs_jct = (!here->B4SOIrbodyMod) ? delvbs : delvsbs; /*v4.0*/ + + delvses = vses - *(ckt->CKTstate0 + here->B4SOIvses);/*v4.0*/ + vdedo = *(ckt->CKTstate0 + here->B4SOIvdes) + - *(ckt->CKTstate0 + here->B4SOIvds); /* v4.0 */ + delvdes = vdes - *(ckt->CKTstate0 + here->B4SOIvdes); /* v4.0 */ + delvded = vdes - vds - vdedo; /* v4.0 */ + + if (here->B4SOImode >= 0) + { + cdhat = here->B4SOIcd + + (here->B4SOIgm-here->B4SOIgjdg) * delvgs + + (here->B4SOIgds - here->B4SOIgjdd) * delvds + + (here->B4SOIgmbs * delvbs + - here->B4SOIgjdb * delvbs_jct ) /* v4.0 */ + + (here->B4SOIgme - here->B4SOIgjde) * delves + + (here->B4SOIgmT - here->B4SOIgjdT) * deldelTemp; /* v3.0 */ + } + else + { + cdhat = here->B4SOIcd + + (here->B4SOIgm-here->B4SOIgjdg) * delvgd + - (here->B4SOIgds - here->B4SOIgjdd) * delvds + + (here->B4SOIgmbs * delvbd + - here->B4SOIgjdb * delvbd_jct ) /*v4.0 */ + + (here->B4SOIgme - here->B4SOIgjde) * delved + + (here->B4SOIgmT - here->B4SOIgjdT) * deldelTemp; /* v3.0 */ + + } + cbhat = here->B4SOIcb + here->B4SOIgbgs * delvgs + + here->B4SOIgbbs * delvbs + + here->B4SOIgbds * delvds + + here->B4SOIgbes * delves + + here->B4SOIgbps * delvps + + here->B4SOIgbT * deldelTemp; /* v3.0 */ + + Isestot = here->B4SOIgstot * (*(ckt->CKTstate0 + here->B4SOIvses)); + cseshat = Isestot + here->B4SOIgstot * delvses + + here->B4SOIgstotd * delvds + here->B4SOIgstotg * delvgs + + here->B4SOIgstotb * delvbs; + + Idedtot = here->B4SOIgdtot * vdedo; + cdedhat = Idedtot + here->B4SOIgdtot * delvded + + here->B4SOIgdtotd * delvds + here->B4SOIgdtotg * delvgs + + here->B4SOIgdtotb * delvbs; #ifndef NOBYPASS - /* following should be one big if connected by && all over - * the place, but some C compilers can't handle that, so - * we split it up here to let them digest it in stages - */ - - if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass) && Check == 0) - if ((here->B4SOIsoiMod == 2) || /* v3.2 */ - (fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), - fabs(*(ckt->CKTstate0+here->B4SOIvbs))) + ckt->CKTvoltTol)) ) - if ((here->B4SOIsoiMod == 2) || /* v3.2 */ - (fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), - fabs(*(ckt->CKTstate0+here->B4SOIvbd))) + ckt->CKTvoltTol)) ) - if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), - fabs(*(ckt->CKTstate0+here->B4SOIvgs))) + ckt->CKTvoltTol))) - if ((fabs(delves) < (ckt->CKTreltol * MAX(fabs(ves), - fabs(*(ckt->CKTstate0+here->B4SOIves))) + ckt->CKTvoltTol))) - if ( (here->B4SOIbodyMod == 0) || (here->B4SOIbodyMod == 2) || - (fabs(delvps) < (ckt->CKTreltol * MAX(fabs(vps), - fabs(*(ckt->CKTstate0+here->B4SOIvps))) + ckt->CKTvoltTol)) ) - if ( (here->B4SOItempNode == 0) || - (fabs(deldelTemp) < (ckt->CKTreltol * MAX(fabs(delTemp), - fabs(*(ckt->CKTstate0+here->B4SOIdeltemp))) - + ckt->CKTvoltTol*1e4))) - - /* v3.1 added for RF */ - if ((here->B4SOIrgateMod == 0) || (here->B4SOIrgateMod == 1) - || (fabs(delvges) < (ckt->CKTreltol * MAX(fabs(vges), - fabs(*(ckt->CKTstate0 + here->B4SOIvges))) + ckt->CKTvoltTol))) - if ((here->B4SOIrgateMod != 3) || (fabs(delvgms) < (ckt->CKTreltol - * MAX(fabs(vgms), fabs(*(ckt->CKTstate0 + here->B4SOIvgms))) - + ckt->CKTvoltTol))) - /* v3.1 added for RF end */ - /* v4.0 */ - if ((!here->B4SOIrbodyMod) || (fabs(delvdbs) < (ckt->CKTreltol - * MAX(fabs(vdbs), fabs(*(ckt->CKTstate0 + here->B4SOIvdbs))) - + ckt->CKTvoltTol))) - if ((!here->B4SOIrbodyMod) || (fabs(delvdbd) < (ckt->CKTreltol - * MAX(fabs(vdbd), fabs(*(ckt->CKTstate0 + here->B4SOIvdbd))) - + ckt->CKTvoltTol))) - if ((!here->B4SOIrbodyMod) || (fabs(delvsbs) < (ckt->CKTreltol - * MAX(fabs(vsbs), fabs(*(ckt->CKTstate0 + here->B4SOIvsbs))) - + ckt->CKTvoltTol))) - if ((!model->B4SOIrdsMod) || (fabs(delvses) < (ckt->CKTreltol - * MAX(fabs(vses), fabs(*(ckt->CKTstate0 + here->B4SOIvses))) - + ckt->CKTvoltTol))) - if ((!model->B4SOIrdsMod) || (fabs(delvdes) < (ckt->CKTreltol - * MAX(fabs(vdes), fabs(*(ckt->CKTstate0 + here->B4SOIvdes))) - + ckt->CKTvoltTol))) - if ((!model->B4SOIrdsMod) || ((fabs(cseshat - Isestot) < ckt->CKTreltol - * MAX(fabs(cseshat), fabs(Isestot)) + ckt->CKTabstol))) - if ((!model->B4SOIrdsMod) || ((fabs(cdedhat - Idedtot) < ckt->CKTreltol - * MAX(fabs(cdedhat), fabs(Idedtot)) + ckt->CKTabstol))) - /* v4.0 end */ - - if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), - fabs(*(ckt->CKTstate0+here->B4SOIvds))) + ckt->CKTvoltTol))) - if ((fabs(cdhat - here->B4SOIcd) < ckt->CKTreltol - * MAX(fabs(cdhat),fabs(here->B4SOIcd)) + ckt->CKTabstol)) - if ((here->B4SOIsoiMod == 2) || /* v3.2 */ - (fabs(cbhat - here->B4SOIcb) < ckt->CKTreltol - * MAX(fabs(cbhat),fabs(here->B4SOIcb)) + ckt->CKTabstol) ) - { /* bypass code */ - vbs = *(ckt->CKTstate0 + here->B4SOIvbs); - vbd = *(ckt->CKTstate0 + here->B4SOIvbd); - vgs = *(ckt->CKTstate0 + here->B4SOIvgs); - ves = *(ckt->CKTstate0 + here->B4SOIves); - vps = *(ckt->CKTstate0 + here->B4SOIvps); - vds = *(ckt->CKTstate0 + here->B4SOIvds); - - /* v3.1 added for RF */ - vges = *(ckt->CKTstate0 + here->B4SOIvges); - vgms = *(ckt->CKTstate0 + here->B4SOIvgms); - vged = vges - vds; - vgmd = vgms - vds; - vgme = vgms - ves; - /* v3.1 added for RF end */ - vgmb = vgms - vbs; /* v3.2 bug fix */ - - /* v4.0 */ - vdbs = *(ckt->CKTstate0 + here->B4SOIvdbs); - vdbd = *(ckt->CKTstate0 + here->B4SOIvdbd); - vsbs = *(ckt->CKTstate0 + here->B4SOIvsbs); - vbs_jct = (!here->B4SOIrbodyMod) ? vbs : vsbs; - vbd_jct = (!here->B4SOIrbodyMod) ? vbd : vdbd; - vses = *(ckt->CKTstate0 + here->B4SOIvses); - vdes = *(ckt->CKTstate0 + here->B4SOIvdes); - /* v4.0 end */ - - delTemp = *(ckt->CKTstate0 + here->B4SOIdeltemp); - /* calculate Vds for temperature conductance calculation - in bypass (used later when filling Temp node matrix) */ - Vds = here->B4SOImode > 0 ? vds : -vds; - - vgd = vgs - vds; - vgb = vgs - vbs; - veb = ves - vbs; - - if ((ckt->CKTmode & (MODETRAN | MODEAC)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - { ByPass = 1; - goto line755; - } - else - { goto line850; - } - } + /* following should be one big if connected by && all over + * the place, but some C compilers can't handle that, so + * we split it up here to let them digest it in stages + */ + + if ((!(ckt->CKTmode & MODEINITPRED)) && (ckt->CKTbypass) && Check == 0) + if ((here->B4SOIsoiMod == 2) || /* v3.2 */ + (fabs(delvbs) < (ckt->CKTreltol * MAX(fabs(vbs), + fabs(*(ckt->CKTstate0+here->B4SOIvbs))) + ckt->CKTvoltTol)) ) + if ((here->B4SOIsoiMod == 2) || /* v3.2 */ + (fabs(delvbd) < (ckt->CKTreltol * MAX(fabs(vbd), + fabs(*(ckt->CKTstate0+here->B4SOIvbd))) + ckt->CKTvoltTol)) ) + if ((fabs(delvgs) < (ckt->CKTreltol * MAX(fabs(vgs), + fabs(*(ckt->CKTstate0+here->B4SOIvgs))) + ckt->CKTvoltTol))) + if ((fabs(delves) < (ckt->CKTreltol * MAX(fabs(ves), + fabs(*(ckt->CKTstate0+here->B4SOIves))) + ckt->CKTvoltTol))) + if ( (here->B4SOIbodyMod == 0) || (here->B4SOIbodyMod == 2) || + (fabs(delvps) < (ckt->CKTreltol * MAX(fabs(vps), + fabs(*(ckt->CKTstate0+here->B4SOIvps))) + ckt->CKTvoltTol)) ) + if ( (here->B4SOItempNode == 0) || + (fabs(deldelTemp) < (ckt->CKTreltol * MAX(fabs(delTemp), + fabs(*(ckt->CKTstate0+here->B4SOIdeltemp))) + + ckt->CKTvoltTol*1e4))) + + /* v3.1 added for RF */ + if ((here->B4SOIrgateMod == 0) || (here->B4SOIrgateMod == 1) + || (fabs(delvges) < (ckt->CKTreltol * MAX(fabs(vges), + fabs(*(ckt->CKTstate0 + here->B4SOIvges))) + ckt->CKTvoltTol))) + if ((here->B4SOIrgateMod != 3) || (fabs(delvgms) < (ckt->CKTreltol + * MAX(fabs(vgms), fabs(*(ckt->CKTstate0 + here->B4SOIvgms))) + + ckt->CKTvoltTol))) + /* v3.1 added for RF end */ + /* v4.0 */ + if ((!here->B4SOIrbodyMod) || (fabs(delvdbs) < (ckt->CKTreltol + * MAX(fabs(vdbs), fabs(*(ckt->CKTstate0 + here->B4SOIvdbs))) + + ckt->CKTvoltTol))) + if ((!here->B4SOIrbodyMod) || (fabs(delvdbd) < (ckt->CKTreltol + * MAX(fabs(vdbd), fabs(*(ckt->CKTstate0 + here->B4SOIvdbd))) + + ckt->CKTvoltTol))) + if ((!here->B4SOIrbodyMod) || (fabs(delvsbs) < (ckt->CKTreltol + * MAX(fabs(vsbs), fabs(*(ckt->CKTstate0 + here->B4SOIvsbs))) + + ckt->CKTvoltTol))) + if ((!model->B4SOIrdsMod) || (fabs(delvses) < (ckt->CKTreltol + * MAX(fabs(vses), fabs(*(ckt->CKTstate0 + here->B4SOIvses))) + + ckt->CKTvoltTol))) + if ((!model->B4SOIrdsMod) || (fabs(delvdes) < (ckt->CKTreltol + * MAX(fabs(vdes), fabs(*(ckt->CKTstate0 + here->B4SOIvdes))) + + ckt->CKTvoltTol))) + if ((!model->B4SOIrdsMod) || ((fabs(cseshat - Isestot) < ckt->CKTreltol + * MAX(fabs(cseshat), fabs(Isestot)) + ckt->CKTabstol))) + if ((!model->B4SOIrdsMod) || ((fabs(cdedhat - Idedtot) < ckt->CKTreltol + * MAX(fabs(cdedhat), fabs(Idedtot)) + ckt->CKTabstol))) + /* v4.0 end */ + + if ((fabs(delvds) < (ckt->CKTreltol * MAX(fabs(vds), + fabs(*(ckt->CKTstate0+here->B4SOIvds))) + ckt->CKTvoltTol))) + if ((fabs(cdhat - here->B4SOIcd) < ckt->CKTreltol + * MAX(fabs(cdhat),fabs(here->B4SOIcd)) + ckt->CKTabstol)) + if ((here->B4SOIsoiMod == 2) || /* v3.2 */ + (fabs(cbhat - here->B4SOIcb) < ckt->CKTreltol + * MAX(fabs(cbhat),fabs(here->B4SOIcb)) + ckt->CKTabstol) ) + { /* bypass code */ + vbs = *(ckt->CKTstate0 + here->B4SOIvbs); + vbd = *(ckt->CKTstate0 + here->B4SOIvbd); + vgs = *(ckt->CKTstate0 + here->B4SOIvgs); + ves = *(ckt->CKTstate0 + here->B4SOIves); + vps = *(ckt->CKTstate0 + here->B4SOIvps); + vds = *(ckt->CKTstate0 + here->B4SOIvds); + + /* v3.1 added for RF */ + vges = *(ckt->CKTstate0 + here->B4SOIvges); + vgms = *(ckt->CKTstate0 + here->B4SOIvgms); + vged = vges - vds; + vgmd = vgms - vds; + vgme = vgms - ves; + /* v3.1 added for RF end */ + vgmb = vgms - vbs; /* v3.2 bug fix */ + + /* v4.0 */ + vdbs = *(ckt->CKTstate0 + here->B4SOIvdbs); + vdbd = *(ckt->CKTstate0 + here->B4SOIvdbd); + vsbs = *(ckt->CKTstate0 + here->B4SOIvsbs); + vbs_jct = (!here->B4SOIrbodyMod) ? vbs : vsbs; + vbd_jct = (!here->B4SOIrbodyMod) ? vbd : vdbd; + vses = *(ckt->CKTstate0 + here->B4SOIvses); + vdes = *(ckt->CKTstate0 + here->B4SOIvdes); + /* v4.0 end */ + + delTemp = *(ckt->CKTstate0 + here->B4SOIdeltemp); + /* calculate Vds for temperature conductance calculation + in bypass (used later when filling Temp node matrix) */ + Vds = here->B4SOImode > 0 ? vds : -vds; + + vgd = vgs - vds; + vgb = vgs - vbs; + veb = ves - vbs; + + if ((ckt->CKTmode & (MODETRAN | MODEAC)) || + ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) + { ByPass = 1; + goto line755; + } + else + { goto line850; + } + } #endif /*NOBYPASS*/ - von = here->B4SOIvon; - - - if (*(ckt->CKTstate0 + here->B4SOIvds) >= 0.0) - { T0 = *(ckt->CKTstate0 + here->B4SOIvbs); - - /* v3.1 added for RF */ - if (here->B4SOIrgateMod == 3) - { - vged = vges - vds; - vgmd = vgms - vds; - } - else if ((here->B4SOIrgateMod == 1) || (here->B4SOIrgateMod == 2)) - { - vged = vges - vds; - } - /* v3.1 added for RF end*/ - - } - else - { T0 = *(ckt->CKTstate0 + here->B4SOIvbd); - - /* added for RF */ - if (here->B4SOIrgateMod == 3) - { - vges = vged + vds; - vgms = vgmd + vds; - } - if ((here->B4SOIrgateMod == 1) || (here->B4SOIrgateMod == 2)) - { - vges = vged + vds; - } - /* added for RF end*/ + von = here->B4SOIvon; - } - if (vds >= 0.0) - { - vbs = B4SOIlimit(vbs, T0, 0.2, &Check); - vbd = vbs - vds; - vb = model->B4SOItype * vbs + vs; - - if (here->B4SOIrbodyMod) /* v4.0 */ - { vdbs = B4SOIlimit(vdbs, - *(ckt->CKTstate0 + here->B4SOIvdbs), 0.2, &Check); - vdbd = vdbs - vds; - vsbs = B4SOIlimit(vsbs, - *(ckt->CKTstate0 + here->B4SOIvsbs), 0.2, &Check); - } - } - else - { - vbd = B4SOIlimit(vbd, T0, 0.2, &Check); - vbs = vbd + vds; - vb = model->B4SOItype * vbs + vd; - /* v4.0 */ - if (here->B4SOIrbodyMod) - { vdbd = B4SOIlimit(vdbd, - *(ckt->CKTstate0 + here->B4SOIvdbd), 0.2, &Check); - vdbs = vdbd + vds; - vsbdo = *(ckt->CKTstate0 + here->B4SOIvsbs) - - *(ckt->CKTstate0 + here->B4SOIvds); - vsbd = vsbs - vds; - vsbd = B4SOIlimit(vsbd, vsbdo, 0.2, &Check); - vsbs = vsbd + vds; - } - /* v4.0 end */ - } - - delTemp =B4SOIlimit(delTemp, - *(ckt->CKTstate0 + here->B4SOIdeltemp),5.0,&Check); - - } - if(model->B4SOImtrlMod) - { - epsrox = 3.9; - toxe = model->B4SOIeot; - epssub = EPS0 * model->B4SOIepsrsub; - - } - else - { - epsrox = model->B4SOIepsrox; - toxe = model->B4SOItox; - epssub = EPSSI; - - } - - -/* Calculate temperature dependent values for self-heating effect */ - Temp = delTemp + ckt->CKTtemp; - dTempRatio_dT = 1 / model->B4SOItnom; - TempRatio = Temp * dTempRatio_dT; - - if (selfheat) { - if(model->B4SOImtrlMod==0) - { - Vtm = KboQ * Temp; - - T0 = 1108.0 + Temp; - T5 = Temp * Temp; - Eg = 1.16 - 7.02e-4 * T5 / T0; - - T1 = ((7.02e-4 * T5) - T0 * (14.04e-4 * Temp)) / T0 / T0; - /* T1 = dEg / dT */ - - T2 = 1.9230584e-4; /* T2 = 1 / 300.15^(3/2) */ - T5 = sqrt(Temp); - T3 = 1.45e10 * Temp * T5 * T2; - T4 = exp(21.5565981 - Eg / (2.0 * Vtm)); - ni = T3 * T4; - dni_dT = 2.175e10 * T2 * T5 * T4 + T3 * T4 * - (-Vtm * T1 + Eg * KboQ) / (2.0 * Vtm * Vtm); - - T0 = log(1.0e20 * pParam->B4SOInpeak / (ni * ni)); - vbi = Vtm * T0; - dvbi_dT = KboQ * T0 + Vtm * (-2.0 * dni_dT / ni); - } - else - { - Tnom = model->B4SOItnom; - Vtm = KboQ * Temp; - Vtm0= KboQ * Tnom; - - Eg0 = model->B4SOIeg0; - T0 = model->B4SOItbgbsub + Temp; - T5 = Temp * Temp; - Eg = model->B4SOIbg0sub - model->B4SOItbgasub * Temp * Temp - / (Temp + model->B4SOItbgbsub); - - T1 = ((model->B4SOItbgasub * T5) - T0 * (2.0*model->B4SOItbgasub * Temp)) / T0 / T0; - /* T1 = dEg / dT */ - - T2 = 1/sqrt(Tnom*Tnom*Tnom); - T5 = sqrt(Temp); - T3 = model->B4SOIni0sub * Temp * T5 * T2; - T4 = exp(Eg0/(2.0*Vtm0) - Eg / (2.0 * Vtm)); - ni = T3 * T4; - dni_dT=1.5*model->B4SOIni0sub*T5*T2*T4+ - T3*T4*(-Vtm * T1 + Eg * KboQ) / (2.0 * Vtm * Vtm); - - T0 = log(1.0e20 * pParam->B4SOInpeak / (ni * ni)); - vbi = Vtm * T0; - dvbi_dT = KboQ * T0 + Vtm * (-2.0 * dni_dT / ni); - - - } - if (pParam->B4SOInsub > 0) { - T0 = log(pParam->B4SOInpeak / pParam->B4SOInsub); - vfbb = -model->B4SOItype * Vtm * T0; - dvfbb_dT = -model->B4SOItype * KboQ * T0; - } - else { - T0 = log(-pParam->B4SOInpeak * pParam->B4SOInsub / ni / ni); - vfbb = -model->B4SOItype * Vtm * T0; - dvfbb_dT = -model->B4SOItype * - (KboQ * T0 - Vtm * 2.0 * dni_dT / ni); - } - - /* V4.0 changed phi */ - phi = 2.0 * Vtm * log(pParam->B4SOInpeak / ni); -/* phi = here->B4SOIphi; */ - sqrtPhi = sqrt(phi); - Xdep0 = sqrt(2.0 * epssub / (Charge_q - * pParam->B4SOInpeak * 1.0e6)) - * sqrtPhi; - /* v4.1 SH bug fix */ - dphi_dT = phi / Vtm * KboQ; - dsqrtPhi_dT = 0.5 / sqrtPhi * dphi_dT; - dXdep0_dT = Xdep0 / sqrtPhi * dsqrtPhi_dT; - - cdep0 = sqrt(Charge_q * EPSSI - * pParam->B4SOInpeak * 1.0e6 / 2.0) / sqrtPhi; - dcep0_dT = cdep0 * sqrtPhi * (-1.0) / phi * dsqrtPhi_dT; - - T1 = sqrt(EPSSI / (model->B4SOIepsrox * EPSOX / 3.9) - * model->B4SOItox * Xdep0); - dT1_dT = 0.5 * T1 / Xdep0 * dXdep0_dT; - T0 = exp(-0.5 * pParam->B4SOIdsub * pParam->B4SOIleff / T1); - dT0_dT = T0 * 0.5 * pParam->B4SOIdsub * pParam->B4SOIleff - / T1 / T1 * dT1_dT; - theta0vb0 = (T0 + 2.0 * T0 * T0); - dtheta0vb0_dT = (1.0 + 4.0 * T0) * dT0_dT; - T0 = exp(-0.5 * pParam->B4SOIdrout * pParam->B4SOIleff / T1); - dT0_dT = T0 * 0.5 * pParam->B4SOIdrout * pParam->B4SOIleff - / T1 / T1 * dT1_dT; - T2 = (T0 + 2.0 * T0 * T0); - thetaRout = pParam->B4SOIpdibl1 * T2 + pParam->B4SOIpdibl2; - dthetaRout_dT = pParam->B4SOIpdibl1 * (1.0 + 4.0 * T0) * dT0_dT; - /* Save the values below for phi calculation in B4SOIaccept() */ - here->B4SOIvtm = Vtm; - here->B4SOIni = ni; - - T3 = TempRatio - 1.0; - T8 = 1/ model->B4SOItnom; - T4 = Eg300 / Vtm * T3; - dT4_dT = Eg300 / Vtm / Vtm * (Vtm * T8 - T3 * KboQ); - - T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndiode; - dT7_dT = pParam->B4SOIxbjt * dT4_dT - / pParam->B4SOIndiode; - DEXP(T7, T0, dT0_dT7); - dT0_dT = dT0_dT7 * dT7_dT; - - if (pParam->B4SOIxbjt == pParam->B4SOIxdif) { - T1 = T0; - dT1_dT = dT0_dT; - } - else { - T7 = pParam->B4SOIxdif * T4 / pParam->B4SOIndiode; - dT7_dT = pParam->B4SOIxdif * dT4_dT / pParam->B4SOIndiode; - DEXP(T7, T1, dT1_dT7); - dT1_dT = dT1_dT7 * dT7_dT; - } - - T7 = pParam->B4SOIxrec * T4 / pParam->B4SOInrecf0; - dT7_dT = pParam->B4SOIxrec * dT4_dT - / pParam->B4SOInrecf0; - DEXP(T7, T2, dT2_dT7); - dT2_dT = dT2_dT7 * dT7_dT; - - /* high level injection */ - Ahlis = pParam->B4SOIahli * T0; - dAhlis_dT = pParam->B4SOIahli * dT0_dT; - - jbjts = pParam->B4SOIisbjt * T0; - jdifs = pParam->B4SOIisdif * T1; - jrecs = pParam->B4SOIisrec * T2; - djbjts_dT = pParam->B4SOIisbjt * dT0_dT; - djdifs_dT = pParam->B4SOIisdif * dT1_dT; - djrecs_dT = pParam->B4SOIisrec * dT2_dT; - - T7 = pParam->B4SOIxtun * T3; - dT7_dT = pParam->B4SOIxtun * T8; - DEXP(T7, T0, dT0_dT7); - dT0_dT = dT0_dT7 * dT7_dT; - jtuns = pParam->B4SOIistun * T0; - djtuns_dT = pParam->B4SOIistun * dT0_dT; - -/* drain side */ - T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndioded; - dT7_dT = pParam->B4SOIxbjt * dT4_dT / pParam->B4SOIndioded; - DEXP(T7, T0, dT0_dT7); - dT0_dT = dT0_dT7 * dT7_dT; - - if (pParam->B4SOIxbjt == pParam->B4SOIxdifd) { - T1 = T0; - dT1_dT = dT0_dT; - } - else { - T7 = pParam->B4SOIxdifd * T4 / pParam->B4SOIndioded; - dT7_dT = pParam->B4SOIxdifd * dT4_dT / pParam->B4SOIndioded; - DEXP(T7, T1, dT1_dT7); - dT1_dT = dT1_dT7 * dT7_dT; - } - - T7 = pParam->B4SOIxrecd * T4 / pParam->B4SOInrecf0d; - dT7_dT = pParam->B4SOIxrecd * dT4_dT / pParam->B4SOInrecf0d; - DEXP(T7, T2, dT2_dT7); - dT2_dT = dT2_dT7 * dT7_dT; - - /* high level injection */ - Ahlid = pParam->B4SOIahlid * T0; - dAhlid_dT = pParam->B4SOIahlid * dT0_dT; - - jbjtd = pParam->B4SOIidbjt * T0; - jdifd = pParam->B4SOIiddif * T1; - - jrecd = pParam->B4SOIidrec * T2; - djbjtd_dT = pParam->B4SOIidbjt * dT0_dT; - djdifd_dT = pParam->B4SOIiddif * dT1_dT; - djrecd_dT = pParam->B4SOIidrec * dT2_dT; - - T7 = pParam->B4SOIxtund * T3; - dT7_dT = pParam->B4SOIxtund * T8; - DEXP(T7, T0, dT0_dT7); - dT0_dT = dT0_dT7 * dT7_dT; - jtund = pParam->B4SOIidtun * T0; - djtund_dT = pParam->B4SOIidtun * dT0_dT; - - - u0temp = pParam->B4SOIu0 - * pow(TempRatio, pParam->B4SOIute); - du0temp_dT = pParam->B4SOIu0 * pParam->B4SOIute * - pow(TempRatio, pParam->B4SOIute - 1.0) * T8; - ku0temp = pParam->B4SOIku0 * (1.0 - + model->B4SOItku0 * TempRatio) + DELTA; - dku0temp_dT = pParam->B4SOIku0 * model->B4SOItku0 * T8; - T2 = ku0temp * ku0temp; - T7 = model->B4SOIku0 * pParam->B4SOIinv_od_ref; - rho_ref = T7 / ku0temp; - drho_ref_dT = -T7 / T2 * dku0temp_dT; - T4 = model->B4SOIku0 * here->B4SOIInv_ODeff; - rho = T4 / ku0temp; - drho_dT = -T4 / T2 * dku0temp_dT; - T2 = (1.0 + rho); - T7 = (1.0 + rho_ref); - T0 = T2 / T7; - dT0_dT = (drho_dT * T7 - drho_ref_dT * T2 ) / T7 / T7; - du0temp_dT = T0 * du0temp_dT + u0temp * dT0_dT; - u0temp *= T0; - - vsattemp = pParam->B4SOIvsat - pParam->B4SOIat * T3; - dvsattemp_dT = -pParam->B4SOIat * T8; - T2 = (1.0 + here->B4SOIkvsat * rho); - T7 = (1.0 + here->B4SOIkvsat * rho_ref); - T0 = T2 / T7; - dT0_dT = (here->B4SOIkvsat * drho_dT * T7 - - here->B4SOIkvsat * drho_ref_dT * T2) - / T7 / T7; - dvsattemp_dT = dvsattemp_dT * T0 + vsattemp * dT0_dT; - vsattemp *= T0; - - if (!model->B4SOIrdsMod) { - rds0 = (pParam->B4SOIrdsw + pParam->B4SOIprt * T3) - / pParam->B4SOIrds0denom; - drds0_dT = pParam->B4SOIprt / pParam->B4SOIrds0denom - * T8; - } - else { /* v4.0 */ - PowWeffWr = pParam->B4SOIrds0denom * here->B4SOInf; - T10 = pParam->B4SOIprt * T3; - - /* External Rd(V) */ - T1 = pParam->B4SOIrdw + T10; - T2 = model->B4SOIrdwmin + T10; - rd0 = T1 / PowWeffWr; - rdwmin = T2 / PowWeffWr; - drd0_dT = pParam->B4SOIprt / PowWeffWr * T8; - drdwmin_dT = drd0_dT; - - /* External Rs(V) */ - T7 = pParam->B4SOIrsw + T10; - T4 = model->B4SOIrswmin + T10; - rs0 = T7 / PowWeffWr; - rswmin = T4 / PowWeffWr; - drs0_dT = drswmin_dT = drd0_dT; - } - - ua = pParam->B4SOIuatemp + pParam->B4SOIua1 * T3; - ub = pParam->B4SOIubtemp + pParam->B4SOIub1 * T3; - uc = pParam->B4SOIuctemp + pParam->B4SOIuc1 * T3; - dua_dT = pParam->B4SOIua1 * T8; - dub_dT = pParam->B4SOIub1 * T8; - duc_dT = pParam->B4SOIuc1 * T8; - } - else { - vbi = pParam->B4SOIvbi; - vfbb = pParam->B4SOIvfbb; - phi = pParam->B4SOIphi; - sqrtPhi = pParam->B4SOIsqrtPhi; - Xdep0 = pParam->B4SOIXdep0; - Eg = model->B4SOIeg0; - /* v4.1 */ - cdep0 = pParam->B4SOIcdep0; - theta0vb0 = pParam->B4SOItheta0vb0; - thetaRout = pParam->B4SOIthetaRout; - - jbjts = pParam->B4SOIjbjts; /* v4.0 */ - jbjtd = pParam->B4SOIjbjtd; - jdifs = pParam->B4SOIjdifs; - jdifd = pParam->B4SOIjdifd; - jrecs = pParam->B4SOIjrecs; - jrecd = pParam->B4SOIjrecd; - jtuns = pParam->B4SOIjtuns; - jtund = pParam->B4SOIjtund; - - /* v2.2.2 bug fix */ - Ahlis = pParam->B4SOIahli0s; - Ahlid = pParam->B4SOIahli0d; - - u0temp = here->B4SOIu0temp; - vsattemp = here->B4SOIvsattemp; - ua = pParam->B4SOIua; - ub = pParam->B4SOIub; - uc = pParam->B4SOIuc; - dni_dT = dvbi_dT = dvfbb_dT = 0.0; - djbjts_dT = djdifs_dT = djrecs_dT = djtuns_dT = 0.0; - djbjtd_dT = djdifd_dT = djrecd_dT = djtund_dT = 0.0; - du0temp_dT = dvsattemp_dT = 0.0; - dua_dT = dub_dT = duc_dT = 0.0; - /* v4.1 */ - dphi_dT = dsqrtPhi_dT = dXdep0_dT = 0.0; - dcdep0_dT = dtheta0vb0_dT = dthetaRout_dT = 0.0; - - if (!model->B4SOIrdsMod) { - rds0 = pParam->B4SOIrds0; - drds0_dT = 0.0; - } - else { - rd0 = pParam->B4SOIrd0; - rs0 = pParam->B4SOIrs0; - rdwmin = pParam->B4SOIrdwmin; - rswmin = pParam->B4SOIrswmin; - drd0_dT = drs0_dT = drdwmin_dT = drswmin_dT = 0.0; - } - dAhlis_dT = dAhlid_dT = 0; - } - - /* TempRatio used for Vth and mobility */ - if (selfheat) { - TempRatioMinus1 = Temp / model->B4SOItnom - 1.0; - } - else { - TempRatioMinus1 = ckt->CKTtemp / model->B4SOItnom - 1.0; - } - - /* determine DC current and derivatives */ - vbd = vbs - vds; - vgd = vgs - vds; - vgb = vgs - vbs; - ved = ves - vds; - veb = ves - vbs; - vge = vgs - ves; - vpd = vps - vds; - vgp = vgs - vps; - - /* v3.1 added for RF */ - vged = vges - vds; - vgmd = vgms - vds; - vgme = vgms - ves; - /* v3.1 added for RF end */ - vgmb = vgms - vbs; /* v3.2 bug fix */ - -/* v3.1 bug fix */ - wdiosCV_NoSwap = pParam->B4SOIwdiosCV; - wdiodCV_NoSwap = pParam->B4SOIwdiodCV; - - agidl = pParam->B4SOIagidl; - bgidl = pParam->B4SOIbgidl; - cgidl = pParam->B4SOIcgidl; - egidl = pParam->B4SOIegidl; - rgidl = pParam->B4SOIrgidl; - kgidl = pParam->B4SOIkgidl; - fgidl = pParam->B4SOIfgidl; - - agisl = pParam->B4SOIagisl; - bgisl = pParam->B4SOIbgisl; - cgisl = pParam->B4SOIcgisl; - egisl = pParam->B4SOIegisl; - rgisl = pParam->B4SOIrgisl; - kgisl = pParam->B4SOIkgisl; - fgisl = pParam->B4SOIfgisl; - - - if (vds >= 0.0) - { /* normal mode */ - here->B4SOImode = 1; - Vds = vds; - Vgs = vgs; - Vbs = vbs; - Vbd = vbd; - Ves = ves; - Vps = vps; - Vsbs = vsbs; /* v4.0 */ - Vdbs = vdbs; /* v4.0 */ - Vdbd = Vdbs - Vds; /* v4.0 */ - Vgd = vgd; /* v4.1 */ - - wdios = pParam->B4SOIwdios; - wdiod = pParam->B4SOIwdiod; - wdiosCV = pParam->B4SOIwdiosCV; - wdiodCV = pParam->B4SOIwdiodCV; - - } - else - { /* inverse mode */ - here->B4SOImode = -1; - Vds = -vds; - Vgs = vgd; - Vbs = vbd; - Vbd = vbs; - Ves = ved; - Vps = vpd; - Vsbs = vdbd; /* v4.0 */ - Vdbd = vsbs; /* v4.0 */ - Vdbs = Vdbd + Vds; /* v4.0 */ - Vgd = vgs; /* v4.1 */ - wdios = pParam->B4SOIwdiod; - wdiod = pParam->B4SOIwdios; - wdiosCV = pParam->B4SOIwdiodCV; - wdiodCV = pParam->B4SOIwdiosCV; - - } - -if( vds < 0.0) -{/*Diode current*/ - T0 = jbjts; - T1 = djbjts_dT; - jbjts = jbjtd; - djbjts_dT = djbjtd_dT; - jbjtd = T0; - djbjtd_dT = T1; - - T0 = jdifs; - T1 = djdifs_dT; - jdifs = jdifd; - djdifs_dT = djdifd_dT; - jdifd = T0; - djdifd_dT = T1; - - T0 = jrecs; - T1 = djrecs_dT; - jrecs = jrecd; - djrecs_dT = djrecd_dT; - jrecd = T0; - djrecd_dT = T1; - - T0 = jtuns; - T1 = djtuns_dT; - jtuns = jtund; - djtuns_dT = djtund_dT; - jtund = T0; - djtund_dT = T1; - - /*GISL/GIDL*/ - T0 = agidl; - agidl = agisl; - agisl = T0; - - T0 = bgidl; - bgidl = bgisl; - bgisl = T0; - - T0 = cgidl; - cgidl = cgisl; - cgisl = T0; - - T0 = egidl; - egidl = egisl; - egisl = T0; - - T0 = rgidl; - rgidl = rgisl; - rgisl = T0; - - T0 = kgidl; - kgidl = kgisl; - kgisl = T0; - - T0 = fgidl; - fgidl = fgisl; - fgisl = T0; - -} - vbs_jct = (!here->B4SOIrbodyMod) ? Vbs : Vsbs; /* v4.0 */ - vbd_jct = (!here->B4SOIrbodyMod) ? Vbd : Vdbd; /* v4.0 */ + if (*(ckt->CKTstate0 + here->B4SOIvds) >= 0.0) + { T0 = *(ckt->CKTstate0 + here->B4SOIvbs); - Vesfb = Ves - vfbb; - Cbox = model->B4SOIcbox; - K1 = pParam->B4SOIk1eff; + /* v3.1 added for RF */ + if (here->B4SOIrgateMod == 3) + { + vged = vges - vds; + vgmd = vgms - vds; + } + else if ((here->B4SOIrgateMod == 1) || (here->B4SOIrgateMod == 2)) + { + vged = vges - vds; + } + /* v3.1 added for RF end*/ + + } + else + { T0 = *(ckt->CKTstate0 + here->B4SOIvbd); - ChargeComputationNeeded = - ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || - ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) - ? 1 : 0; + /* added for RF */ + if (here->B4SOIrgateMod == 3) + { + vges = vged + vds; + vgms = vgmd + vds; + } + if ((here->B4SOIrgateMod == 1) || (here->B4SOIrgateMod == 2)) + { + vges = vged + vds; + } + /* added for RF end*/ + + } + + if (vds >= 0.0) + { + vbs = B4SOIlimit(vbs, T0, 0.2, &Check); + vbd = vbs - vds; + vb = model->B4SOItype * vbs + vs; + + if (here->B4SOIrbodyMod) /* v4.0 */ + { vdbs = B4SOIlimit(vdbs, + *(ckt->CKTstate0 + here->B4SOIvdbs), 0.2, &Check); + vdbd = vdbs - vds; + vsbs = B4SOIlimit(vsbs, + *(ckt->CKTstate0 + here->B4SOIvsbs), 0.2, &Check); + } + } + else + { + vbd = B4SOIlimit(vbd, T0, 0.2, &Check); + vbs = vbd + vds; + vb = model->B4SOItype * vbs + vd; + /* v4.0 */ + if (here->B4SOIrbodyMod) + { vdbd = B4SOIlimit(vdbd, + *(ckt->CKTstate0 + here->B4SOIvdbd), 0.2, &Check); + vdbs = vdbd + vds; + vsbdo = *(ckt->CKTstate0 + here->B4SOIvsbs) + - *(ckt->CKTstate0 + here->B4SOIvds); + vsbd = vsbs - vds; + vsbd = B4SOIlimit(vsbd, vsbdo, 0.2, &Check); + vsbs = vsbd + vds; + } + /* v4.0 end */ + } + + delTemp =B4SOIlimit(delTemp, + *(ckt->CKTstate0 + here->B4SOIdeltemp),5.0,&Check); + + } + if(model->B4SOImtrlMod) + { + epsrox = 3.9; + toxe = model->B4SOIeot; + epssub = EPS0 * model->B4SOIepsrsub; + + } + else + { + epsrox = model->B4SOIepsrox; + toxe = model->B4SOItox; + epssub = EPSSI; + + } + + + /* Calculate temperature dependent values for self-heating effect */ + Temp = delTemp + ckt->CKTtemp; + dTempRatio_dT = 1 / model->B4SOItnom; + TempRatio = Temp * dTempRatio_dT; + here->B4SOITempSH = Temp; /*v4.2 added for portability of SH Temp */ + if (selfheat) { + if(model->B4SOImtrlMod==0) + { + Vtm = KboQ * Temp; + + T0 = 1108.0 + Temp; + T5 = Temp * Temp; + Eg = 1.16 - 7.02e-4 * T5 / T0; + + T1 = ((7.02e-4 * T5) - T0 * (14.04e-4 * Temp)) / T0 / T0; + /* T1 = dEg / dT */ + + T2 = 1.9230584e-4; /* T2 = 1 / 300.15^(3/2) */ + T5 = sqrt(Temp); + T3 = 1.45e10 * Temp * T5 * T2; + T4 = exp(21.5565981 - Eg / (2.0 * Vtm)); + ni = T3 * T4; + dni_dT = 2.175e10 * T2 * T5 * T4 + T3 * T4 * + (-Vtm * T1 + Eg * KboQ) / (2.0 * Vtm * Vtm); + + T0 = log(1.0e20 * pParam->B4SOInpeak / (ni * ni)); + vbi = Vtm * T0; + dvbi_dT = KboQ * T0 + Vtm * (-2.0 * dni_dT / ni); + } + else + { + Tnom = model->B4SOItnom; + Vtm = KboQ * Temp; + Vtm0= KboQ * Tnom; + + Eg0 = model->B4SOIeg0; + T0 = model->B4SOItbgbsub + Temp; + T5 = Temp * Temp; + Eg = model->B4SOIbg0sub - model->B4SOItbgasub * Temp * Temp + / (Temp + model->B4SOItbgbsub); + + T1 = ((model->B4SOItbgasub * T5) - T0 * (2.0*model->B4SOItbgasub * Temp)) / T0 / T0; + /* T1 = dEg / dT */ + + T2 = 1/sqrt(Tnom*Tnom*Tnom); + T5 = sqrt(Temp); + T3 = model->B4SOIni0sub * Temp * T5 * T2; + T4 = exp(Eg0/(2.0*Vtm0) - Eg / (2.0 * Vtm)); + ni = T3 * T4; + dni_dT=1.5*model->B4SOIni0sub*T5*T2*T4+ + T3*T4*(-Vtm * T1 + Eg * KboQ) / (2.0 * Vtm * Vtm); + + T0 = log(1.0e20 * pParam->B4SOInpeak / (ni * ni)); + vbi = Vtm * T0; + dvbi_dT = KboQ * T0 + Vtm * (-2.0 * dni_dT / ni); + + + } + if (pParam->B4SOInsub > 0) { + T0 = log(pParam->B4SOInpeak / pParam->B4SOInsub); + vfbb = -model->B4SOItype * Vtm * T0; + dvfbb_dT = -model->B4SOItype * KboQ * T0; + } + else { + T0 = log(-pParam->B4SOInpeak * pParam->B4SOInsub / ni / ni); + vfbb = -model->B4SOItype * Vtm * T0; + dvfbb_dT = -model->B4SOItype * + (KboQ * T0 - Vtm * 2.0 * dni_dT / ni); + } + + /* V4.0 changed phi */ + phi = 2.0 * Vtm * log(pParam->B4SOInpeak / ni); + /* phi = here->B4SOIphi; */ + sqrtPhi = sqrt(phi); + Xdep0 = sqrt(2.0 * epssub / (Charge_q + * pParam->B4SOInpeak * 1.0e6)) + * sqrtPhi; + /* v4.1 SH bug fix */ + /* dphi_dT = phi / Vtm * KboQ; v4.2 Temp Derivative bug fix */ + dphi_dT = phi / Vtm * KboQ - 2.0 * Vtm * dni_dT / ni; + dsqrtPhi_dT = 0.5 / sqrtPhi * dphi_dT; + dXdep0_dT = Xdep0 / sqrtPhi * dsqrtPhi_dT; + + /* cdep0 = sqrt(Charge_q * EPSSI + * pParam->B4SOInpeak * 1.0e6 / 2.0) / sqrtPhi; */ /* Bug fix #2 Jun 09 Body type is generalized for mtrlMod 1*/ + cdep0 = sqrt(Charge_q * epssub /* Fix */ + * pParam->B4SOInpeak * 1.0e6 / 2.0) / sqrtPhi; + dcep0_dT = cdep0 * sqrtPhi * (-1.0) / phi * dsqrtPhi_dT; + + /* T1 = sqrt(EPSSI / (model->B4SOIepsrox * EPSOX / 3.9) */ /* Bug fix #3 Jun 09 Body type is generalized for mtrlMod 1*/ + /* * model->B4SOItox * Xdep0); */ + T1 = sqrt(epssub / (epsrox * EPS0) /* Fix */ + * toxe * Xdep0); + dT1_dT = 0.5 * T1 / Xdep0 * dXdep0_dT; + T0 = exp(-0.5 * pParam->B4SOIdsub * pParam->B4SOIleff / T1); + dT0_dT = T0 * 0.5 * pParam->B4SOIdsub * pParam->B4SOIleff + / T1 / T1 * dT1_dT; + theta0vb0 = (T0 + 2.0 * T0 * T0); + dtheta0vb0_dT = (1.0 + 4.0 * T0) * dT0_dT; + T0 = exp(-0.5 * pParam->B4SOIdrout * pParam->B4SOIleff / T1); + dT0_dT = T0 * 0.5 * pParam->B4SOIdrout * pParam->B4SOIleff + / T1 / T1 * dT1_dT; + T2 = (T0 + 2.0 * T0 * T0); + thetaRout = pParam->B4SOIpdibl1 * T2 + pParam->B4SOIpdibl2; + dthetaRout_dT = pParam->B4SOIpdibl1 * (1.0 + 4.0 * T0) * dT0_dT; + /* Save the values below for phi calculation in B4SOIaccept() */ + here->B4SOIvtm = Vtm; + /* here->B4SOIni = ni; v4.2 bugfix never used in the code */ + + T3 = TempRatio - 1.0; + T8 = 1/ model->B4SOItnom; + T4 = Eg300 / Vtm * T3; + dT4_dT = Eg300 / Vtm / Vtm * (Vtm * T8 - T3 * KboQ); + + T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndiode; + dT7_dT = pParam->B4SOIxbjt * dT4_dT + / pParam->B4SOIndiode; + DEXP(T7, T0, dT0_dT7); + dT0_dT = dT0_dT7 * dT7_dT; + + if (pParam->B4SOIxbjt == pParam->B4SOIxdif) { + T1 = T0; + dT1_dT = dT0_dT; + } + else { + T7 = pParam->B4SOIxdif * T4 / pParam->B4SOIndiode; + dT7_dT = pParam->B4SOIxdif * dT4_dT / pParam->B4SOIndiode; + DEXP(T7, T1, dT1_dT7); + dT1_dT = dT1_dT7 * dT7_dT; + } + + T7 = pParam->B4SOIxrec * T4 / pParam->B4SOInrecf0; + dT7_dT = pParam->B4SOIxrec * dT4_dT + / pParam->B4SOInrecf0; + DEXP(T7, T2, dT2_dT7); + dT2_dT = dT2_dT7 * dT7_dT; + + /* high level injection */ + Ahlis = pParam->B4SOIahli * T0; + dAhlis_dT = pParam->B4SOIahli * dT0_dT; + + jbjts = pParam->B4SOIisbjt * T0; + jdifs = pParam->B4SOIisdif * T1; + jrecs = pParam->B4SOIisrec * T2; + djbjts_dT = pParam->B4SOIisbjt * dT0_dT; + djdifs_dT = pParam->B4SOIisdif * dT1_dT; + djrecs_dT = pParam->B4SOIisrec * dT2_dT; + + T7 = pParam->B4SOIxtun * T3; + dT7_dT = pParam->B4SOIxtun * T8; + DEXP(T7, T0, dT0_dT7); + dT0_dT = dT0_dT7 * dT7_dT; + jtuns = pParam->B4SOIistun * T0; + djtuns_dT = pParam->B4SOIistun * dT0_dT; + + /* drain side */ + T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndioded; + dT7_dT = pParam->B4SOIxbjt * dT4_dT / pParam->B4SOIndioded; + DEXP(T7, T0, dT0_dT7); + dT0_dT = dT0_dT7 * dT7_dT; + + if (pParam->B4SOIxbjt == pParam->B4SOIxdifd) { + T1 = T0; + dT1_dT = dT0_dT; + } + else { + T7 = pParam->B4SOIxdifd * T4 / pParam->B4SOIndioded; + dT7_dT = pParam->B4SOIxdifd * dT4_dT / pParam->B4SOIndioded; + DEXP(T7, T1, dT1_dT7); + dT1_dT = dT1_dT7 * dT7_dT; + } + + T7 = pParam->B4SOIxrecd * T4 / pParam->B4SOInrecf0d; + dT7_dT = pParam->B4SOIxrecd * dT4_dT / pParam->B4SOInrecf0d; + DEXP(T7, T2, dT2_dT7); + dT2_dT = dT2_dT7 * dT7_dT; + + /* high level injection */ + Ahlid = pParam->B4SOIahlid * T0; + dAhlid_dT = pParam->B4SOIahlid * dT0_dT; + + jbjtd = pParam->B4SOIidbjt * T0; + jdifd = pParam->B4SOIiddif * T1; + + jrecd = pParam->B4SOIidrec * T2; + djbjtd_dT = pParam->B4SOIidbjt * dT0_dT; + djdifd_dT = pParam->B4SOIiddif * dT1_dT; + djrecd_dT = pParam->B4SOIidrec * dT2_dT; + + T7 = pParam->B4SOIxtund * T3; + dT7_dT = pParam->B4SOIxtund * T8; + DEXP(T7, T0, dT0_dT7); + dT0_dT = dT0_dT7 * dT7_dT; + jtund = pParam->B4SOIidtun * T0; + djtund_dT = pParam->B4SOIidtun * dT0_dT; + + + u0temp = pParam->B4SOIu0 + * pow(TempRatio, pParam->B4SOIute); + du0temp_dT = pParam->B4SOIu0 * pParam->B4SOIute * + pow(TempRatio, pParam->B4SOIute - 1.0) * T8; + ku0temp = pParam->B4SOIku0 * (1.0 + /* + model->B4SOItku0 * TempRatio) + DELTA; v4.2 bugfix */ + + model->B4SOItku0 * T3) + DELTA; + dku0temp_dT = pParam->B4SOIku0 * model->B4SOItku0 * T8; + T2 = ku0temp * ku0temp; + T7 = model->B4SOIku0 * pParam->B4SOIinv_od_ref; + rho_ref = T7 / ku0temp; + drho_ref_dT = -T7 / T2 * dku0temp_dT; + T4 = model->B4SOIku0 * here->B4SOIInv_ODeff; + rho = T4 / ku0temp; + drho_dT = -T4 / T2 * dku0temp_dT; + T2 = (1.0 + rho); + T7 = (1.0 + rho_ref); + T0 = T2 / T7; + dT0_dT = (drho_dT * T7 - drho_ref_dT * T2 ) / T7 / T7; + du0temp_dT = T0 * du0temp_dT + u0temp * dT0_dT; + u0temp *= T0; + + vsattemp = pParam->B4SOIvsat - pParam->B4SOIat * T3; + dvsattemp_dT = -pParam->B4SOIat * T8; + T2 = (1.0 + here->B4SOIkvsat * rho); + T7 = (1.0 + here->B4SOIkvsat * rho_ref); + T0 = T2 / T7; + dT0_dT = (here->B4SOIkvsat * drho_dT * T7 - + here->B4SOIkvsat * drho_ref_dT * T2) + / T7 / T7; + dvsattemp_dT = dvsattemp_dT * T0 + vsattemp * dT0_dT; + vsattemp *= T0; + here->B4SOIvsattemp = vsattemp; + + if (!model->B4SOIrdsMod) { + rds0 = (pParam->B4SOIrdsw + pParam->B4SOIprt * T3) + / pParam->B4SOIrds0denom; + drds0_dT = pParam->B4SOIprt / pParam->B4SOIrds0denom + * T8; + } + else { /* v4.0 */ + PowWeffWr = pParam->B4SOIrds0denom * here->B4SOInf; + T10 = pParam->B4SOIprt * T3; + + /* External Rd(V) */ + T1 = pParam->B4SOIrdw + T10; + T2 = model->B4SOIrdwmin + T10; + rd0 = T1 / PowWeffWr; + rdwmin = T2 / PowWeffWr; + drd0_dT = pParam->B4SOIprt / PowWeffWr * T8; + drdwmin_dT = drd0_dT; + + /* External Rs(V) */ + T7 = pParam->B4SOIrsw + T10; + T4 = model->B4SOIrswmin + T10; + rs0 = T7 / PowWeffWr; + rswmin = T4 / PowWeffWr; + drs0_dT = drswmin_dT = drd0_dT; + } + + ua = pParam->B4SOIuatemp + pParam->B4SOIua1 * T3; + ub = pParam->B4SOIubtemp + pParam->B4SOIub1 * T3; + uc = pParam->B4SOIuctemp + pParam->B4SOIuc1 * T3; + dua_dT = pParam->B4SOIua1 * T8; + dub_dT = pParam->B4SOIub1 * T8; + duc_dT = pParam->B4SOIuc1 * T8; + } + else { + vbi = pParam->B4SOIvbi; + vfbb = pParam->B4SOIvfbb; + phi = pParam->B4SOIphi; + sqrtPhi = pParam->B4SOIsqrtPhi; + Xdep0 = pParam->B4SOIXdep0; + /* Eg = model->B4SOIeg0; */ /* Bug fix #11 Jun 09 'Eg is evaluated at Temp, not Tnom' */ + Eg = model->B4SOIeg; /* 'model->B4SOIeg' computed in b4soitemp.c */ + /* v4.1 */ /* Since selfheat=0, using Eg from b4soitemp.c*/ + cdep0 = pParam->B4SOIcdep0; + theta0vb0 = pParam->B4SOItheta0vb0; + thetaRout = pParam->B4SOIthetaRout; + + jbjts = pParam->B4SOIjbjts; /* v4.0 */ + jbjtd = pParam->B4SOIjbjtd; + jdifs = pParam->B4SOIjdifs; + jdifd = pParam->B4SOIjdifd; + jrecs = pParam->B4SOIjrecs; + jrecd = pParam->B4SOIjrecd; + jtuns = pParam->B4SOIjtuns; + jtund = pParam->B4SOIjtund; + + /* v2.2.2 bug fix */ + Ahlis = pParam->B4SOIahli0s; + Ahlid = pParam->B4SOIahli0d; + + u0temp = here->B4SOIu0temp; + vsattemp = here->B4SOIvsattemp; + ua = pParam->B4SOIua; + ub = pParam->B4SOIub; + uc = pParam->B4SOIuc; + dni_dT = dvbi_dT = dvfbb_dT = 0.0; + djbjts_dT = djdifs_dT = djrecs_dT = djtuns_dT = 0.0; + djbjtd_dT = djdifd_dT = djrecd_dT = djtund_dT = 0.0; + du0temp_dT = dvsattemp_dT = 0.0; + dua_dT = dub_dT = duc_dT = 0.0; + /* v4.1 */ + dphi_dT = dsqrtPhi_dT = dXdep0_dT = 0.0; + dcdep0_dT = dtheta0vb0_dT = dthetaRout_dT = 0.0; + + if (!model->B4SOIrdsMod) { + rds0 = pParam->B4SOIrds0; + drds0_dT = 0.0; + } + else { + rd0 = pParam->B4SOIrd0; + rs0 = pParam->B4SOIrs0; + rdwmin = pParam->B4SOIrdwmin; + rswmin = pParam->B4SOIrswmin; + drd0_dT = drs0_dT = drdwmin_dT = drswmin_dT = 0.0; + } + dAhlis_dT = dAhlid_dT = 0; + } + + /* TempRatio used for Vth and mobility */ + if (selfheat) { + TempRatioMinus1 = Temp / model->B4SOItnom - 1.0; + } + else { + TempRatioMinus1 = ckt->CKTtemp / model->B4SOItnom - 1.0; + } + + /* determine DC current and derivatives */ + vbd = vbs - vds; + vgd = vgs - vds; + vgb = vgs - vbs; + ved = ves - vds; + veb = ves - vbs; + vge = vgs - ves; + vpd = vps - vds; + vgp = vgs - vps; + + /* v3.1 added for RF */ + vged = vges - vds; + vgmd = vgms - vds; + vgme = vgms - ves; + /* v3.1 added for RF end */ + vgmb = vgms - vbs; /* v3.2 bug fix */ + + agidl = pParam->B4SOIagidl; + bgidl = pParam->B4SOIbgidl; + cgidl = pParam->B4SOIcgidl; + egidl = pParam->B4SOIegidl; + rgidl = pParam->B4SOIrgidl; + kgidl = pParam->B4SOIkgidl; + fgidl = pParam->B4SOIfgidl; + + agisl = pParam->B4SOIagisl; + bgisl = pParam->B4SOIbgisl; + cgisl = pParam->B4SOIcgisl; + egisl = pParam->B4SOIegisl; + rgisl = pParam->B4SOIrgisl; + kgisl = pParam->B4SOIkgisl; + fgisl = pParam->B4SOIfgisl; + + + if (vds >= 0.0) + { /* normal mode */ + here->B4SOImode = 1; + Vds = vds; + Vgs = vgs; + Vbs = vbs; + Vbd = vbd; + Ves = ves; + Vps = vps; + Vsbs = vsbs; /* v4.0 */ + Vdbs = vdbs; /* v4.0 */ + Vdbd = Vdbs - Vds; /* v4.0 */ + Vgd = vgd; /* v4.1 */ + wdios = pParam->B4SOIwdios; + wdiod = pParam->B4SOIwdiod; + ndiode = pParam->B4SOIndiode; /* v4.2 bugfix*/ + ndioded = pParam->B4SOIndioded; /* v4.2 bugfix*/ + + nrecf0s = pParam->B4SOInrecf0; /* bugfix_snps start for junction DC part*/ + nrecf0d = pParam->B4SOInrecf0d; + nrecr0s = pParam->B4SOInrecr0; + nrecr0d = pParam->B4SOInrecr0d; + vrec0s = pParam->B4SOIvrec0; + vrec0d = pParam->B4SOIvrec0d; + ntuns = pParam->B4SOIntun; + ntund = pParam->B4SOIntund; + vtun0s = pParam->B4SOIvtun0; + vtun0d = pParam->B4SOIvtun0d; /* bugfix_snps end for junction DC part*/ + } + else + { /* inverse mode */ + here->B4SOImode = -1; + Vds = -vds; + Vgs = vgd; + Vbs = vbd; + Vbd = vbs; + Ves = ved; + Vps = vpd; + Vsbs = vdbd; /* v4.0 */ + Vdbd = vsbs; /* v4.0 */ + Vdbs = Vdbd + Vds; /* v4.0 */ + Vgd = vgs; /* v4.1 */ + wdios = pParam->B4SOIwdiod; + wdiod = pParam->B4SOIwdios; + ndiode = pParam->B4SOIndioded; /* v4.2 bugfix*/ + ndioded = pParam->B4SOIndiode; /* v4.2 bugfix*/ + + nrecf0s = pParam->B4SOInrecf0d; /* bugfix_snps start for junction DC part*/ + nrecf0d = pParam->B4SOInrecf0; + nrecr0s = pParam->B4SOInrecr0d; + nrecr0d = pParam->B4SOInrecr0; + vrec0s = pParam->B4SOIvrec0d; + vrec0d = pParam->B4SOIvrec0; + ntuns = pParam->B4SOIntund; + ntund = pParam->B4SOIntun; + vtun0s = pParam->B4SOIvtun0d; + vtun0d = pParam->B4SOIvtun0; /* bugfix_snps end for junction DC part*/ + } + if( vds < 0.0) + {/*Diode current*/ + T0 = jbjts; + T1 = djbjts_dT; + jbjts = jbjtd; + djbjts_dT = djbjtd_dT; + jbjtd = T0; + djbjtd_dT = T1; + + T0 = jdifs; + T1 = djdifs_dT; + jdifs = jdifd; + djdifs_dT = djdifd_dT; + jdifd = T0; + djdifd_dT = T1; + + T0 = jrecs; + T1 = djrecs_dT; + jrecs = jrecd; + djrecs_dT = djrecd_dT; + jrecd = T0; + djrecd_dT = T1; + + T0 = jtuns; + T1 = djtuns_dT; + jtuns = jtund; + djtuns_dT = djtund_dT; + jtund = T0; + djtund_dT = T1; + + /*GISL/GIDL*/ + T0 = agidl; + agidl = agisl; + agisl = T0; + + T0 = bgidl; + bgidl = bgisl; + bgisl = T0; + + T0 = cgidl; + cgidl = cgisl; + cgisl = T0; + + T0 = egidl; + egidl = egisl; + egisl = T0; + + T0 = rgidl; + rgidl = rgisl; + rgisl = T0; + + T0 = kgidl; + kgidl = kgisl; + kgisl = T0; + + T0 = fgidl; + fgidl = fgisl; + fgisl = T0; + + T0 = Ahlis; /* bugfix_snps */ + Ahlis = Ahlid; /* bugfix_snps */ + Ahlid = T0; /* bugfix_snps */ + + T0 = dAhlis_dT; /* bugfix_snps */ + dAhlis_dT = dAhlid_dT; /* bugfix_snps */ + dAhlid_dT = T0; /* bugfix_snps */ + + } + vbs_jct = (!here->B4SOIrbodyMod) ? Vbs : Vsbs; /* v4.0 */ + vbd_jct = (!here->B4SOIrbodyMod) ? Vbd : Vdbd; /* v4.0 */ + + Vesfb = Ves - vfbb; + Cbox = model->B4SOIcbox; + K1 = pParam->B4SOIk1eff; + + ChargeComputationNeeded = + ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || + ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) + ? 1 : 0; + + if (here->B4SOIdebugMod <0) + ChargeComputationNeeded = 1; - if (here->B4SOIdebugMod <0) - ChargeComputationNeeded = 1; - #ifdef B4SOI_DEBUG_OUT - ChargeComputationNeeded = 1; - here->B4SOIdebug1 = 0.0; - here->B4SOIdebug2 = 0.0; - here->B4SOIdebug3 = 0.0; + ChargeComputationNeeded = 1; + here->B4SOIdebug1 = 0.0; + here->B4SOIdebug2 = 0.0; + here->B4SOIdebug3 = 0.0; #endif -/* Poly Gate Si Depletion Effect */ - T0 = here->B4SOIvfb + phi; - if (model->B4SOImtrlMod==0) - epsgate = epssub; - else - epsgate = model->B4SOIepsrgate * EPS0; - - if ((pParam->B4SOIngate > 1.e18) && (pParam->B4SOIngate < 1.e25) - && (Vgs > T0)&& (epsgate!=0)) - /* added to avoid the problem caused by ngate */ - { T1 = 1.0e6 * Charge_q * epsgate * pParam->B4SOIngate - / (model->B4SOIcox * model->B4SOIcox); - T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = Vgs - T5; - dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); - } - else - { Vgs_eff = Vgs; - dVgs_eff_dVg = 1.0; - } - -/* v4.1 for improved BT charge model, no poly depletion */ - - if (here->B4SOIagbcp2 > 0) - { Vgs_eff2 = Vgs; - dVgs_eff2_dVg = 1.0; - } - -/* end v4.1 for improved BT charge model */ - Leff = pParam->B4SOIleff; - - if (selfheat) { - Vtm = KboQ * Temp; - dVtm_dT = KboQ; - } - else { - Vtm = model->B4SOIvtm; - dVtm_dT = 0.0; - } - - V0 = vbi - phi; - - -/* begin of v3.0 block addition */ -/* B/S built-in potential lowering calculation */ - if (here->B4SOIsoiMod == 0) /* BSIMPD */ /* v3.2 */ - { - Vbsmos = Vbs; - dVbsmos_dVg = 0.0; - dVbsmos_dVd = 0.0; - dVbsmos_dVb = 1.0; - dVbsmos_dVe = 0.0; - if (selfheat) dVbsmos_dT = 0.0; - else dVbsmos_dT = 0.0; - - Vbp = Vbs - Vps; - dVbp_dVb = 1; - } - else /* soiMod = 1 or 2: adding FD module on top of BSIMPD */ - { - /* prepare Vbs0 & Vbs0mos for VthFD calculation */ - if (model->B4SOIfdMod == 0) /* v4.0 */ - { - T0 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; - T1 = model->B4SOIdvbd0 * (exp(0.5*T0) + 2*exp(T0)); - T2 = T1 * (vbi - phi); - T3 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; /* v3.2 */ - Vbs0t = phi - T3 + model->B4SOIvbsa + T2; - dVbs0t_dVd = 0.0; - dVbs0_dVd = 0.0; - if (selfheat) - dVbs0t_dT = T1 * dvbi_dT; - else - dVbs0t_dT = 0.0; - - T0 = 1 + model->B4SOIcsi / Cbox; - T3 = -model->B4SOIdk2b * pParam->B4SOIleff / pParam->B4SOIlitl; - T5 = model->B4SOIk2b * (exp(0.5*T3) + 2*exp(T3)); - T1 = (model->B4SOIk1b - T5) / T0; - T2 = T1 * Vesfb; - T4 = 1.0/(1 + Cbox / model->B4SOIcsi); - Vbs0 = T4 * Vbs0t + T2; - dVbs0_dVe = T1; - if (selfheat) - dVbs0_dT = T4 * dVbs0t_dT - T1 * dvfbb_dT; - else - dVbs0_dT = 0.0; - } - else - { - T0 = 1.0/(model->B4SOIcsi + Cbox + model->B4SOIcdsbs); - T1 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; - T2 = model->B4SOIdvbd0 * (exp(0.5*T1) + 2*exp(T1)); - T3 = T2 * (Vds + model->B4SOIvsce); - T4 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; - T5 = model->B4SOIcsi * T0 * (phi - T4 + model->B4SOIvbsa); - T6 = model->B4SOIcdsbs * T0 * T3; - Vbs0t = T5 + T6; - dVbs0t_dVd = model->B4SOIcdsbs * T0 * T2; - if (selfheat) - dVbs0t_dT = 0.0; - else - dVbs0t_dT = 0.0; + /* Poly Gate Si Depletion Effect */ + T0 = here->B4SOIvfb + phi; + if (model->B4SOImtrlMod==0) + epsgate = epssub; + else + epsgate = model->B4SOIepsrgate * EPS0; + + if ((pParam->B4SOIngate > 1.e18) && (pParam->B4SOIngate < 1.e25) + && (Vgs > T0)&& (epsgate!=0)) + /* added to avoid the problem caused by ngate */ + { T1 = 1.0e6 * Charge_q * epsgate * pParam->B4SOIngate + / (model->B4SOIcox * model->B4SOIcox); + T4 = sqrt(1.0 + 2.0 * (Vgs - T0) / T1); + T2 = T1 * (T4 - 1.0); + T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ + T7 = 1.12 - T3 - 0.05; + T6 = sqrt(T7 * T7 + 0.224); + T5 = 1.12 - 0.5 * (T7 + T6); + Vgs_eff = Vgs - T5; + dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); + } + else + { Vgs_eff = Vgs; + dVgs_eff_dVg = 1.0; + } + + if ((pParam->B4SOIngate > 1.e18) && (pParam->B4SOIngate < 1.e25)/* Bug fix # 25/26 Vgd_eff defined */ + && (Vgd > T0)&& (epsgate!=0)) + /* added to avoid the problem caused by ngate */ + { T1 = 1.0e6 * Charge_q * epsgate * pParam->B4SOIngate + / (model->B4SOIcox * model->B4SOIcox); + T4 = sqrt(1.0 + 2.0 * (Vgd - T0) / T1); + T2 = T1 * (T4 - 1.0); + T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ + T7 = 1.12 - T3 - 0.05; + T6 = sqrt(T7 * T7 + 0.224); + T5 = 1.12 - 0.5 * (T7 + T6); + Vgd_eff = Vgd - T5; + dVgd_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6); + } + else + { Vgd_eff = Vgd; + dVgd_eff_dVg = 1.0; + } + + /* if( here->B4SOImode != 1){ + T1=Vgs_eff; + Vgs_eff=Vgd_eff; + Vgd_eff=T1; + T2=dVgs_eff_dVg; + dVgs_eff_dVg=dVgd_eff_dVg; + dVgd_eff_dVg=T2; + } */ + + /* v4.1 for improved BT charge model, no poly depletion */ + + if (here->B4SOIagbcp2 > 0) + { Vgs_eff2 = Vgs; + dVgs_eff2_dVg = 1.0; + } + + /* end v4.1 for improved BT charge model */ + Leff = pParam->B4SOIleff; + + if (selfheat) { + Vtm = KboQ * Temp; + dVtm_dT = KboQ; + } + else { + Vtm = model->B4SOIvtm; + dVtm_dT = 0.0; + } + + V0 = vbi - phi; + + + /* begin of v3.0 block addition */ + /* B/S built-in potential lowering calculation */ + if (here->B4SOIsoiMod == 0) /* BSIMPD */ /* v3.2 */ + { + Vbsmos = Vbs; + dVbsmos_dVg = 0.0; + dVbsmos_dVd = 0.0; + dVbsmos_dVb = 1.0; + dVbsmos_dVe = 0.0; + if (selfheat) dVbsmos_dT = 0.0; + else dVbsmos_dT = 0.0; + + Vbp = Vbs - Vps; + dVbp_dVb = 1; + } + else /* soiMod = 1 or 2: adding FD module on top of BSIMPD */ + { + /* prepare Vbs0 & Vbs0mos for VthFD calculation */ + if (model->B4SOIfdMod == 0) /* v4.0 */ + { + T0 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; + T1 = model->B4SOIdvbd0 * (exp(0.5*T0) + 2*exp(T0)); + T2 = T1 * (vbi - phi); + T3 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; /* v3.2 */ + Vbs0t = phi - T3 + model->B4SOIvbsa + T2; + dVbs0t_dVd = 0.0; + dVbs0_dVd = 0.0; + if (selfheat) + dVbs0t_dT = T1 * dvbi_dT; + else + dVbs0t_dT = 0.0; + + T0 = 1 + model->B4SOIcsi / Cbox; + T3 = -model->B4SOIdk2b * pParam->B4SOIleff / pParam->B4SOIlitl; + T5 = model->B4SOIk2b * (exp(0.5*T3) + 2*exp(T3)); + T1 = (model->B4SOIk1b - T5) / T0; + T2 = T1 * Vesfb; + T4 = 1.0/(1 + Cbox / model->B4SOIcsi); + Vbs0 = T4 * Vbs0t + T2; + dVbs0_dVe = T1; + if (selfheat) + dVbs0_dT = T4 * dVbs0t_dT - T1 * dvfbb_dT; + else + dVbs0_dT = 0.0; + } + else + { + T0 = 1.0/(model->B4SOIcsi + Cbox + model->B4SOIcdsbs); + T1 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; + T2 = model->B4SOIdvbd0 * (exp(0.5*T1) + 2*exp(T1)); + T3 = T2 * (Vds + model->B4SOIvsce); + T4 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; + T5 = model->B4SOIcsi * T0 * (phi - T4 + model->B4SOIvbsa); + T6 = model->B4SOIcdsbs * T0 * T3; + Vbs0t = T5 + T6; + dVbs0t_dVd = model->B4SOIcdsbs * T0 * T2; + if (selfheat) + dVbs0t_dT = 0.0; + else + dVbs0t_dT = 0.0; + + T7 = Cbox * T0 * Vesfb; + Vbs0 = Vbs0t + T7; + dVbs0_dVe = Cbox * T0; + dVbs0_dVd = dVbs0t_dVd; + if (selfheat) + dVbs0_dT = dVbs0t_dT - Cbox * T0 * dvfbb_dT; + else + dVbs0_dT = 0.0; + + } + + /* zero field body potential cal. */ + T1 = Vbs0t - Vbs0 - 0.005; + T2 = sqrt(T1 * T1 + (2.5e-5)); + T3 = 0.5 * (T1 + T2); + T4 = T3 * model->B4SOIcsi / pParam->B4SOIqsi; /* v3.2 */ + Vbs0mos = Vbs0 - 0.5 * T3 * T4; + T5 = 0.5 * T4 * (1 + T1 / T2); + dVbs0mos_dVe = dVbs0_dVe * (1 + T5); + dVbs0mos_dVd = dVbs0_dVd + T5 * (dVbs0t_dVd - dVbs0_dVd); /* v4.1 */ + if (selfheat) + dVbs0mos_dT = dVbs0_dT * (1 + T5) - T5 * dVbs0t_dT; + else + dVbs0mos_dT = 0.0; + + + /* set the upperbound of Vbs0mos to be phi for square root calc. */ + T1 = phi - 0.02; + T2 = T1 - Vbs0mos - 0.005; + T3 = sqrt(T2 * T2 + 4.0 * 0.005); + Vbs0mos = T1 - 0.5 * (T2 + T3); + T4 = 0.5 * (1 + T2 / T3); + dVbs0mos_dVe = T4 * dVbs0mos_dVe; + dVbs0mos_dVd = T4 * dVbs0mos_dVd; /* v4.1 */ + if (selfheat) + /* dVbs0mos_dT = T4 * dVbs0mos_dT; */ + dVbs0mos_dT = dphi_dT - T4 * (dphi_dT - dVbs0mos_dT); /* v4.1 */ + else dVbs0mos_dT = 0.0; + + + /* VthFD calculation */ + Phis = phi - Vbs0mos; + dPhis_dVb = -1; /* w.r.t Vbs0mos */ + sqrtPhis = sqrt(Phis); + dsqrtPhis_dVb = -0.5 / sqrtPhis; + Xdep = Xdep0 * sqrtPhis / sqrtPhi; + dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb; + /* v4.2 bugfix temp deriv */ + if (selfheat) { + dPhis_dT = dphi_dT - dVbs0mos_dT; + dsqrtPhis_dT = 0.5 / sqrtPhis * dPhis_dT; + dXdep_dT = dXdep0_dT * sqrtPhis / sqrtPhi + + Xdep0 * (dsqrtPhis_dT * sqrtPhi - sqrtPhis * dsqrtPhi_dT) / phi; + } + else { + dPhis_dT = 0.0; + dsqrtPhis_dT = 0.0; + dXdep_dT = 0.0; + }/* v4.2 bugfix temp deriv */ + + T3 = sqrt(Xdep); + T0 = pParam->B4SOIdvt2 * Vbs0mos; + dT3_dT = 1.0 / (2.0 * T3) * dXdep_dT; /* v4.2 bugfix temp deriv */ + dT0_dT = pParam->B4SOIdvt2 * dVbs0mos_dT; /* v4.2 bugfix temp deriv */ + if (T0 >= - 0.5) + { T1 = 1.0 + T0; + dT1_dT = dT0_dT; /* v4.2 bugfix temp deriv */ + T2 = pParam->B4SOIdvt2 ; + } + else /* Added to avoid any discontinuity problems caused by dvt2 */ + { T4 = 1.0 / (3.0 + 8.0 * T0); + /* T1 = (1.0 + 3.0 * T0) * T4; */ /* v4.2 bugfix temp deriv */ + T5 = 1.0 + 3.0 * T0; /* v4.2 bugfix temp deriv */ + T1 = T4 * T5; /* v4.2 bugfix temp deriv */ + T2 = pParam->B4SOIdvt2 * T4 * T4 ; + dT1_dT = T4 * (3.0 - 8.0 * T5 * T4) * dT0_dT; /* v4.2 bugfix temp deriv */ + } + lt1 = model->B4SOIfactor1 * T3 * T1; + dlt1_dVb =model->B4SOIfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + dlt1_dT = model->B4SOIfactor1 * ( dT3_dT * T1+ T3 * dT1_dT); /* v4.2 bugfix temp deriv */ + + + T0 = pParam->B4SOIdvt2w * Vbs0mos; + dT0_dT = pParam->B4SOIdvt2w * dVbs0mos_dT; /* v4.2 bugfix temp deriv */ + if (T0 >= - 0.5) + { T1 = 1.0 + T0; + T2 = pParam->B4SOIdvt2w ; + dT1_dT = dT0_dT; /* v4.2 bugfix temp deriv */ + } + else /* Added to avoid any discontinuity problems caused by dvt2w */ + { T4 = 1.0 / (3.0 + 8.0 * T0); + /* T1 = (1.0 + 3.0 * T0) * T4; */ /* v4.2 bugfix temp deriv */ + T5 = 1.0 + 3.0 * T0; /* v4.2 bugfix temp deriv */ + T1 = T4 * T5; /* v4.2 bugfix temp deriv */ + T2 = pParam->B4SOIdvt2w * T4 * T4 ; + dT1_dT=T4*(3.0-8.0*T5*T4)*dT0_dT ; /* v4.2 bugfix temp deriv */ + } + ltw= model->B4SOIfactor1 * T3 * T1; + dltw_dVb=model->B4SOIfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + + dltw_dT=model->B4SOIfactor1 *( dT3_dT * T1+ T3 *dT1_dT);/* v4.2 bugfix temp deriv */ + + T0 = -0.5 * pParam->B4SOIdvt1 * Leff / lt1; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + Theta0 = T1 * (1.0 + 2.0 * T1); + dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; + dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; + dT1_dT = -T0 / lt1 * T1 * dlt1_dT; /* v4.2 bugfix temp deriv */ + dTheta0_dT = (1.0 + 4.0 * T1) * dT1_dT; /* v4.2 bugfix temp deriv */ + } + else + { T1 = MIN_EXPL; + Theta0 = T1 * (1.0 + 2.0 * T1); + dTheta0_dVb = 0.0; + dTheta0_dT = 0; /* v4.2 bugfix temp deriv */ + } + + T2 = pParam->B4SOInfactor * epssub / Xdep; + dT2_dVb = - T2 / Xdep * dXdep_dVb; + dT2_dT = - T2 / Xdep * dXdep_dT; /* v4.2 bugfix temp deriv */ + /* T3 = pParam->B4SOIcdsc + pParam->B4SOIcdscb * Vbseff + + pParam->B4SOIcdscd * Vds;*/ + /* v4.1 */ + T3 = pParam->B4SOIcdsc + pParam->B4SOIcdscb * Vbs0mos + + pParam->B4SOIcdscd * Vds; + dT3_dVb = pParam->B4SOIcdscb; + dT3_dVd = pParam->B4SOIcdscd; + T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) + / model->B4SOIcox; + dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb + + dTheta0_dVb * T3) / model->B4SOIcox; + dT4_dVd = Theta0 * dT3_dVd / model->B4SOIcox; + dT4_dT = (dT2_dT + T3 * dTheta0_dT + pParam->B4SOIcdscb * dVbs0mos_dT * Theta0) / model->B4SOIcox; /* v4.2 bugfix temp deriv */ + if (T4 >= -0.5) { + n = 1.0 + T4; + dn_dVb = dT4_dVb; + + dn_dVd = dT4_dVd; + dn_dT = dT4_dT; /* v4.2 bugfix temp deriv */ + } + else { /* avoid discontinuity problems caused by T4 */ + T0 = 1.0 / (3.0 + 8.0 * T4); + /*n = (1.0 + 3.0 * T4) * T0;*/ /* v4.2 bugfix temp deriv */ + T5 = 1.0 + 3.0 * T4; /* v4.2 bugfix temp deriv */ + n = T0 * T5;/* v4.2 bugfix temp deriv */ + T0 *= T0; + dn_dVb = T0 * dT4_dVb; + dn_dVd = T0 * dT4_dVd; + dn_dT = T0 * (3.0 - 8.0 * T5 * T0) * dT4_dT; /* v4.2 bugfix temp deriv */ + } + + if (pParam->B4SOIdvtp0 > 0.0) { /* v4.0 */ + T0 = -pParam->B4SOIdvtp1 * Vds; + if (T0 < -EXPL_THRESHOLD) { + T2 = MIN_EXPL; + dT2_dVd = 0.0; + } + else { + T2 = exp(T0); + dT2_dVd = -pParam->B4SOIdvtp1 * T2; + } - T7 = Cbox * T0 * Vesfb; - Vbs0 = Vbs0t + T7; - dVbs0_dVe = Cbox * T0; - dVbs0_dVd = dVbs0t_dVd; - if (selfheat) - dVbs0_dT = dVbs0t_dT - Cbox * T0 * dvfbb_dT; - else - dVbs0_dT = 0.0; - - } - - /* zero field body potential cal. */ - T1 = Vbs0t - Vbs0 - 0.005; - T2 = sqrt(T1 * T1 + (2.5e-5)); - T3 = 0.5 * (T1 + T2); - T4 = T3 * model->B4SOIcsi / pParam->B4SOIqsi; /* v3.2 */ - Vbs0mos = Vbs0 - 0.5 * T3 * T4; - T5 = 0.5 * T4 * (1 + T1 / T2); - dVbs0mos_dVe = dVbs0_dVe * (1 + T5); - dVbs0mos_dVd = dVbs0_dVd + T5 * (dVbs0t_dVd - dVbs0_dVd); /* v4.1 */ - if (selfheat) - dVbs0mos_dT = dVbs0_dT * (1 + T5) - T5 * dVbs0t_dT; - else - dVbs0mos_dT = 0.0; - - - /* set the upperbound of Vbs0mos to be phi for square root calc. */ - T1 = phi - 0.02; - T2 = T1 - Vbs0mos - 0.005; - T3 = sqrt(T2 * T2 + 4.0 * 0.005); - Vbs0mos = T1 - 0.5 * (T2 + T3); - T4 = 0.5 * (1 + T2 / T3); - dVbs0mos_dVe = T4 * dVbs0mos_dVe; - dVbs0mos_dVd = T4 * dVbs0mos_dVd; /* v4.1 */ - if (selfheat) - /* dVbs0mos_dT = T4 * dVbs0mos_dT; */ - dVbs0mos_dT = dphi_dT - T4 * (dphi_dT - dVbs0mos_dT); /* v4.1 */ - else dVbs0mos_dT = 0.0; - - - /* VthFD calculation */ - Phis = phi - Vbs0mos; - dPhis_dVb = -1; /* w.r.t Vbs0mos */ - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - Xdep = Xdep0 * sqrtPhis / sqrtPhi; - dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb; - - T3 = sqrt(Xdep); - T0 = pParam->B4SOIdvt2 * Vbs0mos; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B4SOIdvt2 ; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B4SOIdvt2 * T4 * T4 ; - } - lt1 = model->B4SOIfactor1 * T3 * T1; - dlt1_dVb =model->B4SOIfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = pParam->B4SOIdvt2w * Vbs0mos; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B4SOIdvt2w ; - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B4SOIdvt2w * T4 * T4 ; - } - ltw= model->B4SOIfactor1 * T3 * T1; - dltw_dVb=model->B4SOIfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - - T0 = -0.5 * pParam->B4SOIdvt1 * Leff / lt1; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXPL; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = 0.0; - } - - T2 = pParam->B4SOInfactor * epssub / Xdep; - dT2_dVb = - T2 / Xdep * dXdep_dVb; - - /* T3 = pParam->B4SOIcdsc + pParam->B4SOIcdscb * Vbseff - + pParam->B4SOIcdscd * Vds;*/ - /* v4.1 */ - T3 = pParam->B4SOIcdsc + pParam->B4SOIcdscb * Vbs0mos - + pParam->B4SOIcdscd * Vds; - dT3_dVb = pParam->B4SOIcdscb; - dT3_dVd = pParam->B4SOIcdscd; - T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) - / model->B4SOIcox; - dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb - + dTheta0_dVb * T3) / model->B4SOIcox; - dT4_dVd = Theta0 * dT3_dVd / model->B4SOIcox; - - if (T4 >= -0.5) { - n = 1.0 + T4; - dn_dVb = dT4_dVb; - dn_dVd = dT4_dVd; - } - else { /* avoid discontinuity problems caused by T4 */ - T0 = 1.0 / (3.0 + 8.0 * T4); - n = (1.0 + 3.0 * T4) * T0; - T0 *= T0; - dn_dVb = T0 * dT4_dVb; - dn_dVd = T0 * dT4_dVd; - } - - if (pParam->B4SOIdvtp0 > 0.0) { /* v4.0 */ - T0 = -pParam->B4SOIdvtp1 * Vds; - if (T0 < -EXPL_THRESHOLD) { - T2 = MIN_EXPL; - dT2_dVd = 0.0; + T3 = Leff + pParam->B4SOIdvtp0 * (1.0 + T2); + dT3_dVd = pParam->B4SOIdvtp0 * dT2_dVd; + T4 = Vtm * log(Leff / T3); + dT4_dVd = -Vtm * dT3_dVd / T3; + DITS_Sft = n * T4; + dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd; + dDITS_Sft_dVb = T4 * dn_dVb; + if (selfheat) { + /* dDITS_Sft_dT = n * KboQ * log(Leff / T3); *//* v4.2 bugfix temp deriv */ + dDITS_Sft_dT = n * KboQ * log(Leff / T3) + dn_dT * T4; /* v4.2 bugfix temp deriv */ + } + else + dDITS_Sft_dT = 0.0; + } + else { + DITS_Sft = dDITS_Sft_dVd = dDITS_Sft_dVb = 0.0; + dDITS_Sft_dT = 0.0; + } + + here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; + Delt_vth = here->B4SOIthetavth * V0; + dDelt_vth_dVb = pParam->B4SOIdvt0 * dTheta0_dVb * V0; + if (selfheat) + /*dDelt_vth_dT = here->B4SOIthetavth * dvbi_dT;*/ + /*dDelt_vth_dT = here->B4SOIthetavth * (dvbi_dT - dphi_dT); */ /* v4.1 */ + dDelt_vth_dT = pParam->B4SOIdvt0 * (dTheta0_dT * V0 + Theta0 * (dvbi_dT - dphi_dT)); /* v4.2 bugfix temp deriv */ + else dDelt_vth_dT = 0.0; + T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff * Leff / ltw; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + T2 = T1 * (1.0 + 2.0 * T1); + dT1_dVb = -T0 / ltw * T1 * dltw_dVb; + dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; + dT2_dT = -(1.0 + 4.0 * T1) * T1 * T0/ltw * dltw_dT; + } + else + { T1 = MIN_EXPL; + T2 = T1 * (1.0 + 2.0 * T1); + dT2_dVb = 0.0; + dT2_dT = 0; + } + T0 = pParam->B4SOIdvt0w * T2; + DeltVthw = T0 * V0; + dDeltVthw_dVb = pParam->B4SOIdvt0w * dT2_dVb * V0; + if (selfheat) + /* dDeltVthw_dT = T0 * dvbi_dT; */ + /* dDeltVthw_dT = T0 * (dvbi_dT - dphi_dT); */ /* v4.1 */ /* v4.2 bugfix temp deriv */ + dDeltVthw_dT = T0 * (dvbi_dT - dphi_dT) + pParam->B4SOIdvt0w * dT2_dT * V0; /* v4.2 bugfix temp deriv */ + else dDeltVthw_dT = 0.0; + + T0 = sqrt(1.0 + pParam->B4SOIlpe0 / Leff); + T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / Leff + + pParam->B4SOIkt2 * Vbs0mos); + + /* v4.0 */ + /* DeltVthtemp = pParam->B4SOIk1eff * (T0 - 1.0) * sqrtPhi + T1 * TempRatioMinus1; */ + DeltVthtemp = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtPhi + + T1 * TempRatioMinus1; + /* v4.0 end */ + + if (selfheat) + /* dDeltVthtemp_dT = T1 / model->B4SOItnom; */ + /* dDeltVthtemp_dT = pParam->B4SOIk1ox * (T0 - 1.0) * dsqrtPhi_dT + + T1 / model->B4SOItnom; */ /* v4.1 */ /* v4.2 bugfix temp deriv */ + dDeltVthtemp_dT = pParam->B4SOIk1ox * (T0 - 1.0) * dsqrtPhi_dT + + T1 / model-> B4SOItnom+ pParam->B4SOIkt2 * dVbs0mos_dT* TempRatioMinus1;/* v4.2 bugfix temp deriv */ + else + dDeltVthtemp_dT = 0.0; + + tmp2 = toxe * phi / (pParam->B4SOIweff + pParam->B4SOIw0); + dtmp2_dT = toxe * dphi_dT / (pParam->B4SOIweff + pParam->B4SOIw0); /* v4.2 bugfix temp deriv */ + T3 = here->B4SOIeta0 + pParam->B4SOIetab * Vbs0mos;/*v4.0*/ + dT3_dT = pParam->B4SOIetab * dVbs0mos_dT; /*v4.2 temp deriv*/ + if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ + { T9 = 1.0 / (3.0 - 2.0e4 * T3); + T5 = (2.0e-4 - T3); /*v4.2 temp deriv*/ + T3 = T5 * T9; /*(2.0e-4 - T3) * T9;*/ /*v4.2 temp deriv*/ + T4 = T9 * T9 * pParam->B4SOIetab; + dT3_dVb = T4 ; + dT3_dT = (2.0e4 * T5 * T9 * T9 - T9) * dT3_dT; /*v4.2 temp deriv*/ + } + else + { + dT3_dVb = pParam->B4SOIetab ; + } + /* DIBL_Sft = T3 * pParam->B4SOItheta0vb0 * Vds; + dDIBL_Sft_dVd = pParam->B4SOItheta0vb0 * T3; + dDIBL_Sft_dVb = pParam->B4SOItheta0vb0 * Vds * dT3_dVb; */ /* v4.2 bug fix */ + DIBL_Sft = T3 * theta0vb0 * Vds; + dDIBL_Sft_dVd = theta0vb0 * T3; + dDIBL_Sft_dVb = theta0vb0 * Vds * dT3_dVb; + dDIBL_Sft_dT = Vds * (dT3_dT * theta0vb0 + T3 * dtheta0vb0_dT); /* v4.2 bug fix */ + Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / Leff); + + /* 4.1 */ + T0 = exp(2.0 * pParam->B4SOIdvtp4 * Vds); + DITS_Sft2 = pParam->B4SOIdvtp2factor * (T0-1) / (T0+1); + dDITS_Sft2_dVd = pParam->B4SOIdvtp2factor * pParam->B4SOIdvtp4 * 4.0 * T0 / ((T0+1) * (T0+1)); + + VthFD = model->B4SOItype * here->B4SOIvth0 + + (pParam->B4SOIk1ox * sqrtPhis + - pParam->B4SOIk1eff * sqrtPhi) * Lpe_Vb + - here->B4SOIk2ox * Vbs0mos- Delt_vth - DeltVthw + + (pParam->B4SOIk3 + pParam->B4SOIk3b * Vbs0mos) + * tmp2 + DeltVthtemp - DIBL_Sft - DITS_Sft - DITS_Sft2; + + + T6 = pParam->B4SOIk3b * tmp2 - here->B4SOIk2ox + + pParam->B4SOIkt2 * TempRatioMinus1; + dVthFD_dVb = Lpe_Vb * pParam->B4SOIk1ox * dsqrtPhis_dVb + - dDelt_vth_dVb - dDeltVthw_dVb + + T6 - dDIBL_Sft_dVb - dDITS_Sft_dVb; /* v4.0 */ + /* this is actually dVth_dVbs0mos */ + + dVthFD_dVe = dVthFD_dVb * dVbs0mos_dVe; + /* dVthFD_dVd = -dDIBL_Sft_dVd -dDITS_Sft_dVd; */ /* v4.0 */ + dVthFD_dVd = dVthFD_dVb * dVbs0mos_dVd - dDIBL_Sft_dVd - dDITS_Sft_dVd - dDITS_Sft2_dVd; /* v4.1 */ + + if (selfheat) + /* dVthFD_dT = dDeltVthtemp_dT - dDelt_vth_dT + - dDeltVthw_dT + dVthFD_dVb * dVbs0mos_dT + - dDITS_Sft_dT ; */ + dVthFD_dT = dDeltVthtemp_dT - dDelt_vth_dT + - dDeltVthw_dT + dVthFD_dVb * dVbs0mos_dT + - dDITS_Sft_dT + + Lpe_Vb * ( pParam->B4SOIk1ox * 0.5 / sqrtPhis * dphi_dT + - pParam->B4SOIk1eff * dsqrtPhi_dT); /* v4.1 */ + + else dVthFD_dT = 0.0; + + + /* VtgseffFD calculation for PhiFD */ + VtgsFD = VthFD - Vgs_eff; + T10 = model->B4SOInofffd * Vtm; + DEXP((VtgsFD - model->B4SOIvofffd)/ T10, ExpVtgsFD, T0); + VtgseffFD = T10 * log(1.0 + ExpVtgsFD); + T0 /= (1.0 + ExpVtgsFD); + dVtgseffFD_dVd = T0 * dVthFD_dVd; + dVtgseffFD_dVg = -T0 * dVgs_eff_dVg; + dVtgseffFD_dVe = T0 * dVthFD_dVe; + if (selfheat) + dVtgseffFD_dT = T0 * (dVthFD_dT - (VtgsFD - model->B4SOIvofffd)/Temp) + + VtgseffFD/Temp; + else dVtgseffFD_dT = 0.0; + + + /* surface potential modeling at strong inversion: PhiON */ + VgstFD = Vgs_eff - VthFD; + DEXP((VgstFD - model->B4SOIvofffd)/ T10, ExpVgstFD, T0); + VgsteffFD = T10 * log(1.0 + ExpVgstFD); + T0 /= (1.0 + ExpVgstFD); + dVgsteffFD_dVd = -T0 * dVthFD_dVd; + dVgsteffFD_dVg = T0 * dVgs_eff_dVg; + dVgsteffFD_dVe = -T0 * dVthFD_dVe; + if (selfheat) + dVgsteffFD_dT = T0 * (-dVthFD_dT + - (VgstFD - model->B4SOIvofffd)/Temp) + + VgsteffFD/Temp; + else dVgsteffFD_dT = 0.0; + + + /* T1 = model->B4SOImoinFD*pParam->B4SOIk1eff*Vtm*Vtm; */ + T1 = model->B4SOImoinFD*pParam->B4SOIk1ox*Vtm*Vtm; + if (selfheat) dT1_dT = 2*T1/Temp; + else dT1_dT=0.0; + + T2 = VgsteffFD+ 2*pParam->B4SOIk1eff*sqrt(phi); + dT2_dVg = dVgsteffFD_dVg; + dT2_dVd = dVgsteffFD_dVd; + dT2_dVe = dVgsteffFD_dVe; + /* if (selfheat) dT2_dT = dVgsteffFD_dT; */ + if (selfheat) dT2_dT = dVgsteffFD_dT + 2*pParam->B4SOIk1eff*dsqrtPhi_dT; /* v4.1 */ + else dT2_dT = 0.0; + + T0 = 1+ VgsteffFD * T2 / T1; + dT0_dVg = (VgsteffFD * dT2_dVg + T2 * dVgsteffFD_dVg) / T1; + dT0_dVd = (VgsteffFD * dT2_dVd + T2 * dVgsteffFD_dVd) / T1; + dT0_dVe = (VgsteffFD * dT2_dVe + T2 * dVgsteffFD_dVe) / T1; + if (selfheat) + dT0_dT = (VgsteffFD * (dT2_dT - T2/T1 * dT1_dT) + T2 * dVgsteffFD_dT) / T1; + else dT0_dT = 0.0; + + + PhiON = phi + Vtm* log(T0) ; + dPhiON_dVg = Vtm* dT0_dVg/T0 ; + dPhiON_dVd = Vtm* dT0_dVd/T0 ; + dPhiON_dVe = Vtm* dT0_dVe/T0 ; + if (selfheat) + dPhiON_dT = dphi_dT + Vtm* dT0_dT/T0 + (PhiON-phi)/Temp ; /* v4.1 */ + else dPhiON_dT = 0.0; + + + /* surface potential from subthreshold to inversion: PhiFD */ + T0 = model->B4SOIcox / (model->B4SOIcox + 1.0/(1.0/model->B4SOIcsi + 1.0/Cbox)); + PhiFD = PhiON - T0 * VtgseffFD; + dPhiFD_dVg = dPhiON_dVg - T0 * dVtgseffFD_dVg; + dPhiFD_dVd = dPhiON_dVd - T0 * dVtgseffFD_dVd; + dPhiFD_dVe = dPhiON_dVe - T0 * dVtgseffFD_dVe; + if (selfheat) + dPhiFD_dT = dPhiON_dT - T0 * dVtgseffFD_dT; + else dPhiFD_dT = 0; + + + /* built-in potential lowering: Vbs0 */ + if (model->B4SOIfdMod == 0) /* v4.0 */ + { + T0 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; + T1 = model->B4SOIdvbd0 * (exp(0.5*T0) + 2*exp(T0)); + T2 = T1 * (vbi - phi); + T3 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; /* v3.2 */ + Vbs0t = PhiFD - T3 + model->B4SOIvbsa + T2; + dVbs0t_dVg = dPhiFD_dVg; + dVbs0t_dVd = dPhiFD_dVd; + dVbs0t_dVe = dPhiFD_dVe; + if (selfheat) + dVbs0t_dT = dPhiFD_dT + T1 * (dvbi_dT - dphi_dT); /* v4.1 */ + else dVbs0t_dT = 0; + + + T0 = 1 + model->B4SOIcsi / Cbox; + T3 = -model->B4SOIdk2b * pParam->B4SOIleff / pParam->B4SOIlitl; + T5 = model->B4SOIk2b * (exp(0.5*T3) + 2*exp(T3)); + T1 = (model->B4SOIk1b - T5) / T0; + T2 = T1 * Vesfb; + T0 = 1.0/(1 + Cbox / model->B4SOIcsi); + Vbs0 = T0 * Vbs0t + T2; + dVbs0_dVg = T0 * dVbs0t_dVg; + dVbs0_dVd = T0 * dVbs0t_dVd; + dVbs0_dVe = T0 * dVbs0t_dVe + T1; + if (selfheat) + dVbs0_dT = T0 * dVbs0t_dT - T1 * dvfbb_dT; + else + dVbs0_dT = 0.0; + } + else /* v4.1 */ + { + T0 = 1.0/(model->B4SOIcsi + Cbox + model->B4SOIcdsbs); + T1 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; + T2 = model->B4SOIdvbd0 * (exp(0.5*T1) + 2*exp(T1)); + T3 = T2 * (Vds + model->B4SOIvsce); + T4 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; + T5 = model->B4SOIcsi * T0 * (PhiFD - T4 + model->B4SOIvbsa); + T6 = model->B4SOIcdsbs * T0 * T3; + Vbs0t = T5 + T6; + T8 = model->B4SOIcsi * T0; + dVbs0t_dVg = T8 * dPhiFD_dVg; + dVbs0t_dVd = T8 * dPhiFD_dVd + model->B4SOIcdsbs * T0 * T2; + dVbs0t_dVe = T8 * dPhiFD_dVe; + if (selfheat) + dVbs0t_dT = T8 * dPhiFD_dT; + else + dVbs0t_dT = 0.0; + + T7 = Cbox * T0 * Vesfb; + Vbs0 = Vbs0t + T7; + dVbs0_dVg = dVbs0t_dVg; + dVbs0_dVe = dVbs0t_dVe + Cbox * T0; + dVbs0_dVd = dVbs0t_dVd; + if (selfheat) + dVbs0_dT = dVbs0t_dT - Cbox * T0 * dvfbb_dT; + else + dVbs0_dT = 0.0; + + } + + /* set lowerbound of Vbs (from SPICE) to Vbs0: Vbsitf (Vbs at back interface) */ + if (here->B4SOIsoiMod == 2) /* v3.2 */ /* v3.1 ideal FD: Vbsitf is pinned at Vbs0 */ + { + Vbs = Vbsitf = Vbs0 + OFF_Vbsitf; + dVbsitf_dVg = dVbs0_dVg; + dVbsitf_dVd = dVbs0_dVd; + dVbsitf_dVe = dVbs0_dVe; + dVbsitf_dVb = 0.0; + if (selfheat) dVbsitf_dT = dVbs0_dT; + else dVbsitf_dT = 0; + } + else /* soiMod = 1 */ + { + T1 = Vbs - (Vbs0 + OFF_Vbsitf) - 0.01; + T2 = sqrt(T1*T1 + 0.0001); + T3 = 0.5 * (1 + T1/T2); + Vbsitf = (Vbs0 + OFF_Vbsitf) + 0.5 * (T1 + T2); + dVbsitf_dVg = (1 - T3) * dVbs0_dVg; + dVbsitf_dVd = (1 - T3) * dVbs0_dVd; + dVbsitf_dVe = (1 - T3) * dVbs0_dVe; + dVbsitf_dVb = T3 ; + if (selfheat) dVbsitf_dT = (1 - T3) * dVbs0_dT; + else dVbsitf_dT = 0.0; + } + + /* Based on Vbsitf, calculate zero-field body potential for MOS: Vbsmos */ + T1 = Vbs0t - Vbsitf - 0.005; + T2 = sqrt(T1 * T1 + (2.5e-5)); + T3 = 0.5 * (T1 + T2); + T4 = T3 * model->B4SOIcsi / pParam->B4SOIqsi; /* v3.2 */ + Vbsmos = Vbsitf - 0.5 * T3 * T4; + T5 = 0.5 * T4 * (1 + T1 / T2); + dVbsmos_dVg = dVbsitf_dVg * (1 + T5) - T5 * dVbs0t_dVg; + dVbsmos_dVd = dVbsitf_dVd * (1 + T5) - T5 * dVbs0t_dVd; + dVbsmos_dVb = dVbsitf_dVb * (1 + T5); + dVbsmos_dVe = dVbsitf_dVe * (1 + T5) - T5 * dVbs0t_dVe; + if (selfheat) + dVbsmos_dT = dVbsitf_dT * (1 + T5) - T5 * dVbs0t_dT; + else + dVbsmos_dT = 0.0; + /* Vbsmos should be used in MOS after some limiting (Vbseff) */ + + + Vbp = Vbs - Vps; + dVbp_dVb = 1; + } + /* end of v3.0 block edition */ + + + /* v3.0 modification */ + /* T2 is Vbsmos limited above Vbsc=-5 */ + T0 = Vbsmos + 5 - 0.001; + T1 = sqrt(T0 * T0 - 0.004 * (-5)); + T2 = (-5) + 0.5 * (T0 + T1); + dT2_dVb = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVb; + dT2_dVg = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVg; + dT2_dVd = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVd; + dT2_dVe = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVe; + if (selfheat) dT2_dT = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dT; + else dT2_dT = 0.0; + + /* Vbsh is T2 limited below 1.5 */ + T0 = 1.5; + T1 = T0 - T2 - 0.002; + T3 = sqrt(T1 * T1 + 0.008 * T0); + Vbsh = T0 - 0.5 * (T1 + T3); + dVbsh_dVb = 0.5 * (1.0 + T1 / T3) * dT2_dVb; + dVbsh_dVg = 0.5 * (1.0 + T1 / T3) * dT2_dVg; + dVbsh_dVd = 0.5 * (1.0 + T1 / T3) * dT2_dVd; + dVbsh_dVe = 0.5 * (1.0 + T1 / T3) * dT2_dVe; + if (selfheat) dVbsh_dT = 0.5 * (1.0 + T1 / T3) * dT2_dT; + else dVbsh_dT = 0.0; + + + /* Vbseff is Vbsh limited to 0.95*phi */ + T0 = 0.95 * phi; + T1 = T0 - Vbsh - 0.002; + T2 = sqrt(T1 * T1 + 0.008 * T0); + Vbseff = T0 - 0.5 * (T1 + T2); + dVbseff_dVb = 0.5 * (1.0 + T1 / T2) * dVbsh_dVb; + dVbseff_dVg = 0.5 * (1.0 + T1 / T2) * dVbsh_dVg; + dVbseff_dVd = 0.5 * (1.0 + T1 / T2) * dVbsh_dVd; + dVbseff_dVe = 0.5 * (1.0 + T1 / T2) * dVbsh_dVe; + /* if (selfheat) dVbseff_dT = 0.5 * (1.0 + T1 / T2) * dVbsh_dT; */ + if (selfheat) { + dT0_dT = 0.95 * dphi_dT; + dT1_dT = dT0_dT - dVbsh_dT; + dVbseff_dT = dT0_dT - 0.5 * (1.0 + T1 / T2) * dT1_dT + - 0.002 * dT0_dT / T2; + } /* v4.1 */ + else dVbseff_dT = 0.0; + here->B4SOIvbseff = Vbseff; /* SPICE sol. */ + /* end of v3.0 modification */ + + + /* Below all the variables refer to Vbseff */ + if (dVbseff_dVb < 1e-20) { + dVbseff_dVb = 1e-20; + dVbsh_dVb *= 1e20; + } + else + dVbsh_dVb /= dVbseff_dVb; + + Phis = phi - Vbseff; + dPhis_dVb = -1; + sqrtPhis = sqrt(Phis); + dsqrtPhis_dVb = -0.5 / sqrtPhis; + + Xdep = Xdep0 * sqrtPhis / sqrtPhi; + dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb; + /* v4.1 */ + if (selfheat) { + dPhis_dT = dphi_dT - dVbseff_dT; + dsqrtPhis_dT = 0.5 / sqrtPhis * dPhis_dT; + /* dXdep_dT = dXdep0_dT * sqrtPhis / sqrtPhi + + (dsqrtPhis_dT * sqrtPhi - sqrtPhis * dsqrtPhi_dT) / phi; v4.2 Temp Deriv bugfix */ + dXdep_dT = dXdep0_dT * sqrtPhis / sqrtPhi + + Xdep0 * (dsqrtPhis_dT * sqrtPhi - sqrtPhis * dsqrtPhi_dT) / phi; + } + else { + dPhis_dT = 0.0; + dsqrtPhis_dT = 0.0; + dXdep_dT = 0.0; + } /* end v4.1 */ + + /* Calculate nstar v3.2 */ + here->B4SOInstar = model->B4SOIvtm / Charge_q * + (model->B4SOIcox + epssub / Xdep + pParam->B4SOIcit); + + /* Vth Calculation */ + T3 = sqrt(Xdep); + + T0 = pParam->B4SOIdvt2 * Vbseff; + if (T0 >= - 0.5) + { T1 = 1.0 + T0; + T2 = pParam->B4SOIdvt2 ; + } + else /* Added to avoid any discontinuity problems caused by dvt2 */ + { T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; + T2 = pParam->B4SOIdvt2 * T4 * T4 ; + } + lt1 = model->B4SOIfactor1 * T3 * T1; + dlt1_dVb =model->B4SOIfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + if (selfheat) dlt1_dT = model->B4SOIfactor1 * T1 * 0.5 / T3 * dXdep_dT; + else dlt1_dT = 0.0; /* v4.1 */ + + T0 = pParam->B4SOIdvt2w * Vbseff; + if (T0 >= - 0.5) + { T1 = 1.0 + T0; + T2 = pParam->B4SOIdvt2w ; + } + else /* Added to avoid any discontinuity problems caused by dvt2w */ + { T4 = 1.0 / (3.0 + 8.0 * T0); + T1 = (1.0 + 3.0 * T0) * T4; + T2 = pParam->B4SOIdvt2w * T4 * T4 ; + } + ltw= model->B4SOIfactor1 * T3 * T1; + dltw_dVb=model->B4SOIfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2); + if (selfheat) dltw_dT = model->B4SOIfactor1 * T1 * 0.5 / T3 * dXdep_dT; + else dltw_dT = 0.0; /* v4.1 */ + T0 = -0.5 * pParam->B4SOIdvt1 * Leff / lt1; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + Theta0 = T1 * (1.0 + 2.0 * T1); + dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; + dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; + dT1_dT = -T0 / lt1 * T1 * dlt1_dT; /* v4.2 bugfix temp deriv */ + dTheta0_dT = (1.0 + 4.0 * T1) * dT1_dT; /* v4.2 bugfix temp deriv */ + } + else + { T1 = MIN_EXPL; + Theta0 = T1 * (1.0 + 2.0 * T1); + dTheta0_dVb = 0.0; + dTheta0_dT = 0; /* v4.2 bugfix temp deriv */ + } + + /* Calculate n */ + T2 = pParam->B4SOInfactor * epssub / Xdep; + dT2_dVb = - T2 / Xdep * dXdep_dVb; + dT2_dT = - T2 / Xdep * dXdep_dT; /* v4.2 bugfix temp deriv */ + T3 = pParam->B4SOIcdsc + pParam->B4SOIcdscb * Vbseff + + pParam->B4SOIcdscd * Vds; + dT3_dVb = pParam->B4SOIcdscb; + dT3_dVd = pParam->B4SOIcdscd; + + T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; + dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb + dTheta0_dVb * T3) + / model->B4SOIcox; + dT4_dVd = Theta0 * dT3_dVd / model->B4SOIcox; + + dT4_dT = (dT2_dT + dTheta0_dT* T3)/ model->B4SOIcox; /* v4.2 bugfix temp deriv */ + if (T4 >= -0.5) + { n = 1.0 + T4; + dn_dVb = dT4_dVb; + dn_dVd = dT4_dVd; + dn_dT = dT4_dT; /* v4.2 bugfix temp deriv */ + } + else + /* avoid discontinuity problems caused by T4 */ + { T0 = 1.0 / (3.0 + 8.0 * T4); + /* n = (1.0 + 3.0 * T4) * T0; */ /* v4.2 bugfix temp deriv */ + T5 = 1.0 + 3.0 * T4; /* v4.2 bugfix temp deriv */ + n = T0 * T5; /* v4.2 bugfix temp deriv */ + T0 *= T0; + dn_dVb = T0 * dT4_dVb; + dn_dVd = T0 * dT4_dVd; + dn_dT = T0 * (3.0 - 8.0 * T5 * T0) * dT4_dT; /* v4.2 bugfix temp deriv */ + } + + /* v4.0 DITS */ + if (pParam->B4SOIdvtp0 > 0.0) { + T0 = -pParam->B4SOIdvtp1 * Vds; + if (T0 < -EXPL_THRESHOLD) { + T2 = MIN_EXPL; + dT2_dVd = 0.0; + } + else { + T2 = exp(T0); + dT2_dVd = -pParam->B4SOIdvtp1 * T2; + } + + T3 = Leff + pParam->B4SOIdvtp0 * (1.0 + T2); + dT3_dVd = pParam->B4SOIdvtp0 * dT2_dVd; + T4 = Vtm * log(Leff / T3); + dT4_dVd = -Vtm * dT3_dVd / T3; + DITS_Sft = n * T4; + dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd; + dDITS_Sft_dVb = T4 * dn_dVb; + if (selfheat) { + /* dDITS_Sft_dT = n * KboQ * log(Leff / T3); */ /* v4.2 bugfix temp deriv */ + dDITS_Sft_dT = n * KboQ * log(Leff / T3) + dn_dT * T4; /* v4.2 bugfix temp deriv */ + } + else + dDITS_Sft_dT = 0.0; + } + else { + DITS_Sft = dDITS_Sft_dVd = dDITS_Sft_dVb = 0.0; + dDITS_Sft_dT = 0.0; + } + + here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; + Delt_vth = here->B4SOIthetavth * V0; + dDelt_vth_dVb = pParam->B4SOIdvt0 * dTheta0_dVb * V0; + if (selfheat) /* dDelt_vth_dT = here->B4SOIthetavth * dvbi_dT; */ /* v4.2 bugfix temp deriv */ + dDelt_vth_dT = pParam->B4SOIdvt0 * (dTheta0_dT * V0 + Theta0 * (dvbi_dT - dphi_dT)); /* v4.2 bugfix temp deriv */ + else dDelt_vth_dT = 0.0; + + T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff + * Leff / ltw; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + T2 = T1 * (1.0 + 2.0 * T1); + dT1_dVb = -T0 / ltw * T1 * dltw_dVb; + dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; + dT1_dT = -T0 / ltw * T1 * dltw_dT; /* v4.2 bugfix temp deriv */ + dT2_dT = (1.0 + 4.0 * T1) * dT1_dT;/* v4.2 bugfix temp deriv */ + } + else + { T1 = MIN_EXPL; + T2 = T1 * (1.0 + 2.0 * T1); + dT2_dVb = 0.0; + } + + T0 = pParam->B4SOIdvt0w * T2; + DeltVthw = T0 * V0; + dDeltVthw_dVb = pParam->B4SOIdvt0w * dT2_dVb * V0; + if (selfheat) /*dDeltVthw_dT = T0 * dvbi_dT;*/ /* v4.2 bugfix temp deriv */ + dDeltVthw_dT = T0 * (dvbi_dT - dphi_dT) + pParam->B4SOIdvt0w * dT2_dT * V0; /* v4.2 bugfix temp deriv */ + else dDeltVthw_dT = 0.0; + + T0 = sqrt(1.0 + pParam->B4SOIlpe0 / Leff); + T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / Leff + + pParam->B4SOIkt2 * Vbseff); + DeltVthtemp = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtPhi + + T1 * TempRatioMinus1; /* v4.0 */ + if (selfheat) + /*dDeltVthtemp_dT = T1 / model->B4SOItnom; */ /* v4.2 bugfix temp deriv */ + dDeltVthtemp_dT = pParam->B4SOIk1ox * (T0 - 1.0) * dsqrtPhi_dT + T1 / model-> B4SOItnom; /* v4.2 bugfix temp deriv */ + else + dDeltVthtemp_dT = 0.0; + + tmp2 = toxe * phi / (pParam->B4SOIweff + pParam->B4SOIw0); + dtmp2_dT = toxe * dphi_dT / (pParam->B4SOIweff + pParam->B4SOIw0); /* v4.2 bugfix temp deriv */ + T3 = here->B4SOIeta0 + pParam->B4SOIetab * Vbseff; + if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ + { T9 = 1.0 / (3.0 - 2.0e4 * T3); + T3 = (2.0e-4 - T3) * T9; + T4 = T9 * T9 * pParam->B4SOIetab; + dT3_dVb = T4 ; + } + else + { + dT3_dVb = pParam->B4SOIetab ; + } + /* DIBL_Sft = T3 * pParam->B4SOItheta0vb0 * Vds; + dDIBL_Sft_dVd = pParam->B4SOItheta0vb0 * T3; + dDIBL_Sft_dVb = pParam->B4SOItheta0vb0 * Vds * dT3_dVb; */ /* v4.2 bugfix */ + DIBL_Sft = T3 * theta0vb0 * Vds; + dDIBL_Sft_dVd = theta0vb0 * T3; + dDIBL_Sft_dVb = theta0vb0 * Vds * dT3_dVb; + dDIBL_Sft_dT = T3 * Vds * dtheta0vb0_dT; /* v4.2 bug fix */ + Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / Leff); + + T9 = 2.2361 / sqrtPhi; + sqrtPhisExt = sqrtPhis - T9 * (Vbsh - Vbseff); + dsqrtPhisExt_dVb = dsqrtPhis_dVb - T9 * (dVbsh_dVb - 1); + dsqrtPhisExt_dT = dsqrtPhis_dT - T9 * (dVbsh_dT) + + 2.2361 * dsqrtPhi_dT * (Vbsh - Vbseff) / phi; /* v4.2 bugfix temp deriv */ + /* 4.1 */ + T0 = exp(2.0 * pParam->B4SOIdvtp4 * Vds); + DITS_Sft2 = pParam->B4SOIdvtp2factor * (T0-1) / (T0+1); + dDITS_Sft2_dVd = pParam->B4SOIdvtp2factor * pParam->B4SOIdvtp4 * 4.0 * T0 / ((T0+1) * (T0+1)); + + Vth = model->B4SOItype * here->B4SOIvth0 + + (pParam->B4SOIk1ox * sqrtPhisExt + - pParam->B4SOIk1eff * sqrtPhi) * Lpe_Vb + - here->B4SOIk2ox * Vbseff- Delt_vth - DeltVthw + +(pParam->B4SOIk3 + pParam->B4SOIk3b * Vbseff) * tmp2 + + DeltVthtemp - DIBL_Sft - DITS_Sft - DITS_Sft2; + + if (selfheat){ + if (!model->B4SOIvth0Given) + dvth0_dT = dphi_dT + pParam->B4SOIk1eff * dsqrtPhi_dT; + else dvth0_dT=0;} + + else dvth0_dT=0; /* v4.2 temp deriv */ + + + + here->B4SOIvon = Vth; + + T6 = pParam->B4SOIk3b * tmp2 - here->B4SOIk2ox + + pParam->B4SOIkt2 * TempRatioMinus1; + dVth_dVb = Lpe_Vb * pParam->B4SOIk1ox * dsqrtPhisExt_dVb + - dDelt_vth_dVb - dDeltVthw_dVb + + T6 - dDIBL_Sft_dVb - dDITS_Sft_dVb; + /* this is actually dVth_dVbseff */ + + dVth_dVd = -dDIBL_Sft_dVd - dDITS_Sft_dVd - dDITS_Sft2_dVd; + + if (selfheat) + /* dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT + - dDITS_Sft_dT; */ + dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT - dDITS_Sft_dT + +(pParam->B4SOIk1ox * dsqrtPhisExt_dT- pParam->B4SOIk1eff * dsqrtPhi_dT) * Lpe_Vb + + model->B4SOItype * dvth0_dT - dDIBL_Sft_dT; /* v4.2 temp deriv */ + + else dVth_dT = 0.0; + + + /* dVthzb_dT calculation */ + if ((model->B4SOIcapMod == 3) && (selfheat == 1)) { + T3zb = sqrt(Xdep0); + ltwzb = lt1zb = model->B4SOIfactor1 * T3zb; + dT3zb_dT = 1.0 / (2.0 * T3zb) * dXdep0_dT; /* v4.2 bugfix temp deriv */ + dltwzb_dT = dlt1zb_dT = model->B4SOIfactor1 * dT3zb_dT; /* v4.2 bugfix temp deriv */ + T0 = -0.5 * pParam->B4SOIdvt1 * Leff / lt1zb; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + + Theta0zb = T1 * (1.0 + 2.0 * T1); + dT0_dT = -(T0 / lt1zb) * dlt1zb_dT; /* v4.2 bugfix temp deriv */ + dT1_dT = T1 * dT0_dT; /* v4.2 bugfix temp deriv */ + dTheta0zb_dT = (1.0 + 4.0 * T1) * dT1_dT; /* v4.2 bugfix temp deriv */ + } + else + { T1 = MIN_EXPL; + Theta0zb = T1 * (1.0 + 2.0 * T1); + dTheta0zb_dT=0; /* v4.2 bugfix temp deriv */ + } + Delt_vthzb = pParam->B4SOIdvt0 * Theta0zb * V0; + /* dDelt_vthzb_dT = pParam->B4SOIdvt0 * Theta0zb * dvbi_dT; */ /* v4.2 bugfix temp deriv */ + dDelt_vthzb_dT = pParam->B4SOIdvt0 *( Theta0zb * (dvbi_dT - dphi_dT) + + dTheta0zb_dT *V0); /* v4.2 bugfix temp deriv */ + + T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff * Leff / ltwzb; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + T2 = T1 * (1.0 + 2.0 * T1); + dT0_dT = -(T0 / ltwzb) * dltwzb_dT; /* v4.2 bugfix temp deriv */ + dT1_dT = T1 * dT0_dT; /* v4.2 bugfix temp deriv */ + dT2_dT = (1.0 + 4.0 * T1) * dT1_dT; /* v4.2 bugfix temp deriv */ + } + else + { T1 = MIN_EXPL; + T2 = T1 * (1.0 + 2.0 * T1); + dT2_dT=0; /* v4.2 bugfix temp deriv */ + } + T0 = pParam->B4SOIdvt0w * T2; + dT0_dT= pParam->B4SOIdvt0w * dT2_dT; /* v4.2 bugfix temp deriv */ + DeltVthwzb = T0 * V0; + /* dDeltVthwzb_dT = T0 * dvbi_dT; *//* v4.2 bugfix temp deriv */ + dDeltVthwzb_dT = ( T0 * (dvbi_dT - dphi_dT)+ dT0_dT *V0); /* v4.2 bugfix temp deriv */ + + T0 = sqrt(1.0 + pParam->B4SOIlpe0 / Leff); + T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / Leff); + DeltVthtempzb = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtPhi + + T1 * TempRatioMinus1; + dDeltVthtempzb_dT = pParam->B4SOIk1ox * (T0 - 1.0) * dsqrtPhi_dT + T1 / model->B4SOItnom; /* v4.2 bugfix temp deriv */ + + Vthzb = model->B4SOItype * here->B4SOIvth0 + - Delt_vthzb - DeltVthwzb + pParam->B4SOIk3 * tmp2 + + DeltVthtempzb; + dVthzb_dT = dDeltVthtempzb_dT - dDelt_vthzb_dT - dDeltVthwzb_dT; + dVthzb_dT = model->B4SOItype * dvth0_dT - dDelt_vthzb_dT - dDeltVthwzb_dT + pParam->B4SOIk3 * dtmp2_dT + dDeltVthtempzb_dT; /* v4.2 bugfix temp deriv */ + /* Vthzb2 = Vthzb + 1.12; */ /* v4.1 */ /* v4.2 never used */ + } + /* Effective Vgst (Vgsteff) Calculation */ + + Vgst = Vgs_eff - Vth; + dVgst_dVg = dVgs_eff_dVg; + dVgst_dVd = -dVth_dVd; + dVgst_dVb = -dVth_dVb; + + T10 = n * Vtm; /* v4.0 */ + VgstNVt = pParam->B4SOImstar * Vgst / T10; /* v4.0 */ + ExpArg = (pParam->B4SOIvoff - (1- pParam->B4SOImstar) * Vgst) + / T10; /* v4.0 */ + + /* MCJ: Very small Vgst */ + if (VgstNVt > EXPL_THRESHOLD) + { Vgsteff = Vgst; + /* T0 is dVgsteff_dVbseff */ + T0 = -dVth_dVb; + dVgsteff_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; /* v3.0 */ + dVgsteff_dVd = -dVth_dVd + T0 * dVbseff_dVd; /* v3.0 */ + dVgsteff_dVb = T0 * dVbseff_dVb; + dVgsteff_dVe = T0 * dVbseff_dVe; /* v3.0 */ + if (selfheat) + dVgsteff_dT = -dVth_dT + T0 * dVbseff_dT; /* v3.0 */ + else + dVgsteff_dT = 0.0; + } + else if (ExpArg > EXPL_THRESHOLD) + { T0 = (Vgst - pParam->B4SOIvoff) / (n * Vtm); + ExpVgst = exp(T0); + /*Vgsteff = Vtm * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; *//*v4.2 bug fix */ + Vgsteff = Vtm * cdep0 / model->B4SOIcox * ExpVgst; /* v4.2 bug fix */ + T3 = Vgsteff / (n * Vtm) ; + /* T1 is dVgsteff_dVbseff */ + T1 = -T3 * (dVth_dVb + T0 * Vtm * dn_dVb); + dVgsteff_dVg = T3 * dVgs_eff_dVg+ T1 * dVbseff_dVg; /* v3.0 */ + dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dn_dVd)+ T1 * dVbseff_dVd; /* v3.0 */ + dVgsteff_dVe = T1 * dVbseff_dVe; /* v3.0 */ + dVgsteff_dVb = T1 * dVbseff_dVb; + if (selfheat) + /* dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * n) + + Vgsteff / Temp+ T1 * dVbseff_dT; */ /* v3.0 */ /* v4.2 temp deriv*/ + dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * n + Vtm * dn_dT) + + Vgsteff / Temp+ T1 * dVbseff_dT; /*v4.2 temp deriv*/ + else + dVgsteff_dT = 0.0; + } + else + { ExpVgst = exp(VgstNVt); + T1 = T10 * log(1.0 + ExpVgst); + dT1_dVg = ExpVgst / (1.0 + ExpVgst) * pParam->B4SOImstar; + dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) + + T1 / n * dn_dVb; + dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) + + T1 / n * dn_dVd; + /*T3 = (1.0 / Temp); */ + T3 = (1.0 / Temp + dn_dT / n); /* v4.2 temp deriv */ + if (selfheat) + dT1_dT = -dT1_dVg * (dVth_dT + Vgst * T3) + T1 * T3; + else + dT1_dT = 0.0; + + /*dT2_dVg = -model->B4SOIcox / (Vtm * pParam->B4SOIcdep0) + * exp(ExpArg) * (1 - pParam->B4SOImstar);*/ /*v4.2 bug fix*/ + dT2_dVg = -model->B4SOIcox / (Vtm * cdep0) + * exp(ExpArg) * (1 - pParam->B4SOImstar); /*v4.2 bug fix*/ + T2 = pParam->B4SOImstar - T10 * dT2_dVg + / (1.0 - pParam->B4SOImstar); + dT2_dVd = -dT2_dVg * (dVth_dVd - Vtm * ExpArg * dn_dVd + / (1.0 - pParam->B4SOImstar)) + + (T2 - pParam->B4SOImstar) / n * dn_dVd; + dT2_dVb = -dT2_dVg * (dVth_dVb - Vtm * ExpArg * dn_dVb + / (1.0 - pParam->B4SOImstar)) + + (T2 - pParam->B4SOImstar) / n * dn_dVb; + if (selfheat) + dT2_dT = -dT2_dVg * ( dVth_dT - ExpArg * T10 * T3 + / (1.0 - pParam->B4SOImstar) ); + else + dT2_dT = 0.0; + + Vgsteff = T1 / T2; + T3 = T2 * T2; + /* T4 is dVgsteff_dVbseff */ + T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; + dVgsteff_dVb = T4 * dVbseff_dVb; + dVgsteff_dVe = T4 * dVbseff_dVe; /* v3.0 */ + dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) + / T3 * dVgs_eff_dVg + + T4 * dVbseff_dVg; /* v3.0 */ + dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) + / T3+ T4 * dVbseff_dVd; /* v3.0 */ + if (selfheat) + dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) + / T3+ T4 * dVbseff_dT; /* v3.0 */ + else + dVgsteff_dT = 0.0; + } + Vgst2Vtm = Vgsteff + 2.0 * Vtm; + if (selfheat) dVgst2Vtm_dT = dVgsteff_dT + 2.0 * dVtm_dT; /* v3.1.1 bug fix */ + else dVgst2Vtm_dT = 0.0; + here->B4SOIVgsteff = Vgsteff; /* v2.2.3 bug fix */ + + /* v4.0 F-factor (degradation factor due to pocket implant) */ + if (pParam->B4SOIfprout <= 0.0) + { FP = 1.0; + dFP_dVg = dFP_dT = 0.0; + } + else + { T9 = pParam->B4SOIfprout * sqrt(Leff) / Vgst2Vtm; + FP = 1.0 / (1.0 + T9); + dFP_dVg = FP * FP * T9 / Vgst2Vtm; + if (selfheat) dFP_dT = dFP_dVg * dVgst2Vtm_dT; + else dFP_dT = 0.0; + } + + /* Calculate Effective Channel Geometry */ + T9 = sqrtPhis - sqrtPhi; + Weff = pParam->B4SOIweff - (2.0 - here->B4SOInbc) + * (pParam->B4SOIdwg * Vgsteff + pParam->B4SOIdwb * T9); + dWeff_dVg = -(2.0 - here->B4SOInbc) * pParam->B4SOIdwg; + dWeff_dVb = -(2.0 - here->B4SOInbc) * pParam->B4SOIdwb + * dsqrtPhis_dVb; + + if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ + { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); + Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; + T0 *= T0 * 4.0e-16; + dWeff_dVg *= T0; + dWeff_dVb *= T0; + } + + if (model->B4SOIrdsMod == 1) /* v4.0 */ + Rds = dRds_dVg = dRds_dVb = dRds_dT = 0.0; + else { + T0 = pParam->B4SOIprwg * Vgsteff + + pParam->B4SOIprwb * T9; + if (T0 >= -0.9) + { Rds = rds0 * (1.0 + T0); + dRds_dVg = rds0 * pParam->B4SOIprwg; + dRds_dVb = rds0 * pParam->B4SOIprwb * dsqrtPhis_dVb; + + if (selfheat && (Rds!=0.0)) + dRds_dT = (1.0 + T0) * drds0_dT; + else dRds_dT = 0.0; + + } + else + /* to avoid the discontinuity problem due to prwg and prwb*/ + { T1 = 1.0 / (17.0 + 20.0 * T0); + Rds = rds0 * (0.8 + T0) * T1; + T1 *= T1; + dRds_dVg = rds0 * pParam->B4SOIprwg * T1; + dRds_dVb = rds0 * pParam->B4SOIprwb * dsqrtPhis_dVb + * T1; + + if (selfheat && (Rds!=0.0)) + dRds_dT = (0.8 + T0) * T1 * drds0_dT; + else dRds_dT = 0.0; + + } + /* here->B4SOIrds = Rds; */ /* v2.2.3 bug fix */ /* v4.2 bugfix # 39 */ + } + here->B4SOIrds = Rds; /* v4.2 bugfix # 39 */ + /* Calculate Abulk */ + if (pParam->B4SOIa0 == 0.0) { + + Abulk0 = Abulk = 1.0; + + dAbulk0_dVb = dAbulk_dVg = dAbulk_dVb = 0.0; + } + else { + T10 = pParam->B4SOIketa * Vbsh; + if (T10 >= -0.9) { + T11 = 1.0 / (1.0 + T10); + dT11_dVb = -pParam->B4SOIketa * T11 * T11 * dVbsh_dVb; + } + else { /* added to avoid the problems caused by Keta */ + T12 = 1.0 / (0.8 + T10); + T11 = (17.0 + 20.0 * T10) * T12; + dT11_dVb = -pParam->B4SOIketa * T12 * T12 * dVbsh_dVb; + } + + /* v3.0 bug fix */ + T10 = phi + pParam->B4SOIketas; + + T13 = (Vbsh * T11) / T10; + dT13_dVb = (Vbsh * dT11_dVb + T11 * dVbsh_dVb) / T10; + + /* limit 1/sqrt(1-T13) to 6, starting at T13=0.96 */ + if (T13 < 0.96) { + T14 = 1 / sqrt(1-T13); + T10 = 0.5 * T14 / (1-T13); + dT14_dVb = T10 * dT13_dVb; + } + else { + /* IBM tweak */ + T11 = 1.0 / (1.0 - 1.0593220339*T13); + T14 = (6.0169491525 - 6.3559322034 * T13) * T11; + T10 = 0.0179546 * T11 * T11; + dT14_dVb = T10 * dT13_dVb; + } + + /* v3.0 bug fix */ + /* T10 = 0.5 * pParam->B4SOIk1eff + / sqrt(phi + pParam->B4SOIketas); */ + T10 = 0.5 * pParam->B4SOIk1ox * Lpe_Vb + / sqrt(phi + pParam->B4SOIketas); /* v4.0 */ + + T1 = T10 * T14; + dT1_dVb = T10 * dT14_dVb; + + T9 = sqrt(pParam->B4SOIxj * Xdep); + tmp1 = Leff + 2.0 * T9; + T5 = Leff / tmp1; + tmp2 = pParam->B4SOIa0 * T5; + tmp3 = pParam->B4SOIweff + pParam->B4SOIb1; + tmp4 = pParam->B4SOIb0 / tmp3; + T2 = tmp2 + tmp4; + dT2_dVb = -T9 * tmp2 / tmp1 / Xdep * dXdep_dVb; + T6 = T5 * T5; + T7 = T5 * T6; + + Abulk0 = 1 + T1 * T2; + dAbulk0_dVb = T1 * dT2_dVb + T2 * dT1_dVb; + + T8 = pParam->B4SOIags * pParam->B4SOIa0 * T7; + dAbulk_dVg = -T1 * T8; + Abulk = Abulk0 + dAbulk_dVg * Vgsteff; + + dAbulk_dVb = dAbulk0_dVb + - T8 * Vgsteff * (dT1_dVb + 3.0 * T1 * dT2_dVb / tmp2); + } + + if (Abulk0 < 0.01) + { + T9 = 1.0 / (3.0 - 200.0 * Abulk0); + Abulk0 = (0.02 - Abulk0) * T9; + dAbulk0_dVb *= T9 * T9; + } + + if (Abulk < 0.01) + { + T9 = 1.0 / (3.0 - 200.0 * Abulk); + Abulk = (0.02 - Abulk) * T9; + dAbulk_dVb *= T9 * T9; + T10 = T9 * T9; /* 3.2 bug fix */ + dAbulk_dVg *= T10; /* 3.2 bug fix */ + } + + here->B4SOIAbulk = Abulk; /*v3.2 for noise */ + + /* Mobility calculation */ + if (model->B4SOImtrlMod) { + T14 = 2.0 * model->B4SOItype *(model->B4SOIphig - model->B4SOIeasub - 0.5 * Eg + 0.45); + toxe_mob = model->B4SOIeot * model->B4SOIepsrsub / 3.9;} /* Bug fix #4 Jun 09 implementing Eeff correctly*/ + else { + T14 = 0.0; + toxe_mob = model->B4SOItox;} /* Bug fix #4 Jun 09 implementing Eeff correctly*/ + if (model->B4SOImobMod == 1) + { T0 = Vgsteff + Vth + Vth - T14; + T2 = ua + uc * Vbseff; + T3 = T0 / toxe_mob; /* Bug fix #4 Jun 09 implementing Eeff correctly*/ + T5 = T3 * (T2 + ub * T3); + dDenomi_dVg = (T2 + 2.0 * ub * T3) / toxe_mob; /* Bug fix #4 Jun 09 implementing Eeff correctly*/ + dDenomi_dVd = dDenomi_dVg * 2 * dVth_dVd; + dDenomi_dVb = dDenomi_dVg * 2 * dVth_dVb + uc * T3 ; + if (selfheat) + dDenomi_dT = dDenomi_dVg * 2 * dVth_dT + + (dua_dT + Vbseff * duc_dT + + dub_dT * T3 ) * T3; + else + dDenomi_dT = 0.0; + } + else if (model->B4SOImobMod == 2) /* Bug fix #5 Jun 09 implementing Eeff correctly*/ + { T5 = (Vgsteff -T14)/ toxe * (ua /* MobMod=2 does not use Eeff */ + + uc * Vbseff + ub * (Vgsteff -T14) /* 'toxe' keeps code consistent with BSIMSOI4.1 Manual*/ + / toxe); + dDenomi_dVg = (ua + uc * Vbseff + + 2.0 * ub * (Vgsteff -T14) / toxe) + / toxe; + dDenomi_dVd = 0.0; + dDenomi_dVb = (Vgsteff -T14) * uc / toxe; + if (selfheat) + dDenomi_dT = (Vgsteff -T14) / toxe + * (dua_dT + Vbseff * duc_dT + dub_dT + * (Vgsteff -T14) / toxe); + else + dDenomi_dT = 0.0; + } + else if (model->B4SOImobMod == 3) /* mobMod == 3 */ + { T0 = Vgsteff + Vth + Vth - T14; + T2 = 1.0 + uc * Vbseff; + T3 = T0 / toxe_mob; /* Bug fix #4 Jun 09 implementing Eeff correctly*/ + T4 = T3 * (ua + ub * T3); + T5 = T4 * T2; + dDenomi_dVg = (ua + 2.0 * ub * T3) * T2 + / toxe_mob; /* Bug fix #4 Jun 09 implementing Eeff correctly*/ + dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; + dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb + + uc * T4 ; + if (selfheat) + dDenomi_dT = dDenomi_dVg * 2.0 * dVth_dT + + (dua_dT + dub_dT * T3) * T3 * T2 + + T4 * Vbseff * duc_dT; + else + dDenomi_dT = 0.0; + } + else /* mobMod == 4 */ + { + /*universal mobility*/ + T0 = (Vgsteff + here->B4SOIvtfbphi1)* 1.0e-8 / toxe/6.0; + T1 = exp(pParam->B4SOIeu * log(T0)); /* MobMod=4 does not use Eeff */ + /* using 'toxe' keeps code consistent with BSIM4 formulation */ + dT1_dVg = T1 * pParam->B4SOIeu * 1.0e-8/ T0 / toxe/6.0; + + /*T2 = pParam->B4SOIua + pParam->B4SOIuc * Vbseff; */ /* v4.2 bugfix # 35 */ + T2 = ua + uc * Vbseff; + /*Coulombic*/ + /* pParam->B4SOIucs = pParam->B4SOIucs * pow(TempRatio, pParam->B4SOIucste); Bug# 21 Jul09*/ + /* pParam->B4SOIud = pParam->B4SOIud * pow(TempRatio, pParam->B4SOIud1) ; Bug# 21 Jul09 */ + ucs = pParam->B4SOIucs * pow(TempRatio, pParam->B4SOIucste); + ud = pParam->B4SOIud * pow(TempRatio, pParam->B4SOIud1) ; + VgsteffVth = here->B4SOIvgsteffvth; + + /*T10 = exp(pParam->B4SOIucs * log(0.5 + 0.5 * Vgsteff/VgsteffVth));*/ + /* T10 = exp(pParam->B4SOIucs * log(1.0 + Vgsteff/VgsteffVth)); Bug# 21 Jul09 */ + /* T11 = pParam->B4SOIud/T10; Bug# 21 Jul09 */ + T10 = exp(ucs * log(1.0 + Vgsteff/VgsteffVth)); /* Bug Fix # 21 Jul09*/ + T11 = ud/T10; /* Bug Fix # 21 Jul09*/ + /*dT11_dVg = - 0.5 * pParam->B4SOIucs * T11 /(0.5 + 0.5*Vgsteff/VgsteffVth)/VgsteffVth;*/ + /* dT11_dVg = (pParam->B4SOIucs - 1.0)*pParam->B4SOIud/(VgsteffVth* exp((pParam->B4SOIucs-1.0) * log(1.0 + Vgsteff/VgsteffVth))); Bug# 21 Jul09*/ + + dT11_dVg = (ucs - 1.0)*ud/(VgsteffVth* exp((ucs-1.0) * log(1.0 + Vgsteff/VgsteffVth))); /* Bug Fix # 21 Jul09*/ + + dDenomi_dVg = T2 * dT1_dVg + dT11_dVg; + dDenomi_dVd = 0.0; + /* dDenomi_dVb = T1 * pParam->B4SOIuc; v4.2 bugfix # 35 */ + dDenomi_dVb = T1 * uc; + T5 = T1 * T2 + T11; + if (selfheat) + dDenomi_dT = dDenomi_dVg * pParam->B4SOIeu * dVth_dT + + (dua_dT + dub_dT * T3) * T3 * T2 + + T4 * Vbseff * duc_dT; + else + dDenomi_dT = 0.0; + + + } + if (T5 >= -0.8) + { Denomi = 1.0 + T5; + } + else /* Added to avoid the discontinuity problem caused by ua and ub*/ + { T9 = 1.0 / (7.0 + 10.0 * T5); + Denomi = (0.6 + T5) * T9; + T9 *= T9; + dDenomi_dVg *= T9; + dDenomi_dVd *= T9; + dDenomi_dVb *= T9; + if (selfheat) dDenomi_dT *= T9; + else dDenomi_dT = 0.0; + } + + here->B4SOIueff = ueff = u0temp / Denomi; + T9 = -ueff / Denomi; + dueff_dVg = T9 * dDenomi_dVg; + dueff_dVd = T9 * dDenomi_dVd; + dueff_dVb = T9 * dDenomi_dVb; + if (selfheat) dueff_dT = T9 * dDenomi_dT + du0temp_dT / Denomi; + else dueff_dT = 0.0; + + /* Saturation Drain Voltage Vdsat */ + WVCox = Weff * vsattemp * model->B4SOIcox; + WVCoxRds = WVCox * Rds; + + /* dWVCoxRds_dT = WVCox * dRds_dT + + Weff * model->B4SOIcox * Rds * dvsattemp_dT; */ + + Esat = 2.0 * vsattemp / ueff; + EsatL = Esat * Leff; + T0 = -EsatL /ueff; + dEsatL_dVg = T0 * dueff_dVg; + dEsatL_dVd = T0 * dueff_dVd; + dEsatL_dVb = T0 * dueff_dVb; + if (selfheat) + dEsatL_dT = T0 * dueff_dT + EsatL / vsattemp * dvsattemp_dT; + else + dEsatL_dT = 0.0; + + /* Sqrt() */ + a1 = pParam->B4SOIa1; + if (a1 == 0.0) + { Lambda = pParam->B4SOIa2; + dLambda_dVg = 0.0; + } + else if (a1 > 0.0) + /* Added to avoid the discontinuity problem caused by a1 and a2 (Lambda) */ + { T0 = 1.0 - pParam->B4SOIa2; + T1 = T0 - pParam->B4SOIa1 * Vgsteff - 0.0001; + T2 = sqrt(T1 * T1 + 0.0004 * T0); + Lambda = pParam->B4SOIa2 + T0 - 0.5 * (T1 + T2); + dLambda_dVg = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2); + } + else + { T1 = pParam->B4SOIa2 + pParam->B4SOIa1 * Vgsteff - 0.0001; + T2 = sqrt(T1 * T1 + 0.0004 * pParam->B4SOIa2); + Lambda = 0.5 * (T1 + T2); + dLambda_dVg = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2); + } + + here->B4SOIAbovVgst2Vtm = Abulk /Vgst2Vtm; /* v2.2.3 bug fix */ + + if (Rds > 0) + { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; + tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; + } + else + { tmp2 = dWeff_dVg / Weff; + tmp3 = dWeff_dVb / Weff; + } + if ((Rds == 0.0) && (Lambda == 1.0)) + { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); + tmp1 = 0.0; + T1 = T0 * T0; + T2 = Vgst2Vtm * T0; + T3 = EsatL * Vgst2Vtm; + Vdsat = T3 * T0; + + dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; + dT0_dVd = -(Abulk * dEsatL_dVd) * T1; + dT0_dVb = -(Abulk * dEsatL_dVb + EsatL * dAbulk_dVb) * T1; + if (selfheat) + dT0_dT = -(Abulk * dEsatL_dT + dVgst2Vtm_dT) * T1; + else dT0_dT = 0.0; + + dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; + dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; + dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; + if (selfheat) + dVdsat_dT = T3 * dT0_dT + T2 * dEsatL_dT + + EsatL * T0 * dVgst2Vtm_dT; + else dVdsat_dT = 0.0; + } + else + { tmp1 = dLambda_dVg / (Lambda * Lambda); + T9 = Abulk * WVCoxRds; + T8 = Abulk * T9; + T7 = Vgst2Vtm * T9; + T6 = Vgst2Vtm * WVCoxRds; + T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); + dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 + + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); + /* dT0_dVb = 2.0 * (T8 * tmp3 this is equivalent to one below, but simpler + + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); */ + dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) + + (1.0 / Lambda - 1.0) * dAbulk_dVb); + dT0_dVd = 0.0; + + if (selfheat) + { + + if (Rds!=0.0) + tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; + else + tmp4 = dvsattemp_dT / vsattemp; + + dT0_dT = 2.0 * T8 * tmp4; + } else tmp4 = dT0_dT = 0.0; + + T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + + 3.0 * T7; + + dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 + + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + + 3.0 * (T9 + T7 * tmp2 + T6 * dAbulk_dVg); + dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb + + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); + dT1_dVd = Abulk * dEsatL_dVd; + + + if (selfheat) + { + tmp4 += dVgst2Vtm_dT / Vgst2Vtm; + dT1_dT = (2.0 / Lambda - 1.0) * dVgst2Vtm_dT + + Abulk * dEsatL_dT + 3.0 * T7 * tmp4; + } else dT1_dT = 0.0; + + T2 = Vgst2Vtm * (EsatL + 2.0 * T6); + dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg + + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); + dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); + dT2_dVd = Vgst2Vtm * dEsatL_dVd; + if (selfheat) + dT2_dT = Vgst2Vtm * dEsatL_dT + EsatL * dVgst2Vtm_dT + + 2.0 * T6 * (dVgst2Vtm_dT + Vgst2Vtm * tmp4); + else + dT2_dT = 0.0; + + T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); + Vdsat = (T1 - T3) / T0; + + dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 + - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; + dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 + - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; + dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; + if (selfheat) + dVdsat_dT = (dT1_dT - (T1 * dT1_dT - dT0_dT * T2 + - T0 * dT2_dT) / T3 - Vdsat * dT0_dT) / T0; + else dVdsat_dT = 0.0; + } + here->B4SOIvdsat = Vdsat; + + + /* Effective Vds (Vdseff) Calculation */ + T1 = Vdsat - Vds - pParam->B4SOIdelta; + dT1_dVg = dVdsat_dVg; + dT1_dVd = dVdsat_dVd - 1.0; + dT1_dVb = dVdsat_dVb; + dT1_dT = dVdsat_dT; + + T2 = sqrt(T1 * T1 + 4.0 * pParam->B4SOIdelta * Vdsat); + T0 = T1 / T2; + T3 = 2.0 * pParam->B4SOIdelta / T2; + dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; + dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; + dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; + if (selfheat) + dT2_dT = T0 * dT1_dT + T3 * dVdsat_dT; + else dT2_dT = 0.0; + + Vdseff = Vdsat - 0.5 * (T1 + T2); + dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); + dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); + dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); + if (selfheat) + dVdseff_dT = dVdsat_dT - 0.5 * (dT1_dT + dT2_dT); + else dVdseff_dT = 0.0; + + if (Vdseff > Vds) + Vdseff = Vds; /* This code is added to fixed the problem + caused by computer precision when + Vds is very close to Vdseff. */ + diffVds = Vds - Vdseff; + here->B4SOIVdseff = Vdseff; /* v2.2.3 bug fix */ + + /* Calculate VAsat */ + tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; + T9 = WVCoxRds * Vgsteff; + T8 = T9 / Vgst2Vtm; + T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; + + T7 = 2.0 * WVCoxRds * tmp4; + dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) + - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm + + Vdsat * dAbulk_dVg); + + dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff + - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); + dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; + + if (selfheat) + { + + if (Rds!=0.0) + tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; + else tmp4 = dvsattemp_dT / vsattemp; + + dT0_dT = dEsatL_dT + dVdsat_dT + T7 * tmp4 * Vgsteff + - T8 * (Abulk * dVdsat_dT - Abulk * Vdsat * dVgst2Vtm_dT + / Vgst2Vtm); + } else + dT0_dT = 0.0; + + T9 = WVCoxRds * Abulk; + T1 = 2.0 / Lambda - 1.0 + T9; + dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); + dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; + if (selfheat) + dT1_dT = T9 * tmp4; + else + dT1_dT = 0.0; + + Vasat = T0 / T1; + dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; + dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; + dVasat_dVd = dT0_dVd / T1; + if (selfheat) dVasat_dT = (dT0_dT - Vasat * dT1_dT) / T1; + else dVasat_dT = 0.0; + + /* Calculate VACLM */ + if ((pParam->B4SOIpclm > 0.0) && (diffVds > 1.0e-10)) + { T0 = 1.0 / (pParam->B4SOIpclm * Abulk * pParam->B4SOIlitl); + dT0_dVb = -T0 / Abulk * dAbulk_dVb; + dT0_dVg = -T0 / Abulk * dAbulk_dVg; + + T2 = Vgsteff / EsatL; + T1 = Leff * (Abulk + T2); + dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); + dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); + dT1_dVd = -T2 * dEsatL_dVd / Esat; + if (selfheat) dT1_dT = -T2 * dEsatL_dT / Esat; + else dT1_dT = 0.0; + + T9 = T0 * T1; + VACLM = T9 * diffVds; + dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg + + T1 * diffVds * dT0_dVg; + dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds + - T9 * dVdseff_dVb; + dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); + if (selfheat) + dVACLM_dT = T0 * dT1_dT * diffVds - T9 * dVdseff_dT; + else dVACLM_dT = 0.0; + + } + else + { VACLM = MAX_EXPL; + dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = dVACLM_dT = 0.0; + } + + + /* Calculate VADIBL */ + /* if (pParam->B4SOIthetaRout > 0.0) */ /* v4.2 bugfix # 36 */ + if (thetaRout > 0.0) + { T8 = Abulk * Vdsat; + T0 = Vgst2Vtm * T8; + T1 = Vgst2Vtm + T8; + dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 + + Vgst2Vtm * Vdsat * dAbulk_dVg; + dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; + dT1_dVb = dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb; + dT0_dVb = Vgst2Vtm * dT1_dVb; + dT1_dVd = Abulk * dVdsat_dVd; + dT0_dVd = Vgst2Vtm * dT1_dVd; + if (selfheat) + { + dT0_dT = dVgst2Vtm_dT * T8 + Abulk * Vgst2Vtm * dVdsat_dT; + dT1_dT = dVgst2Vtm_dT + Abulk * dVdsat_dT; + } else + dT0_dT = dT1_dT = 0.0; + + T9 = T1 * T1; + /*T2 = pParam->B4SOIthetaRout; */ /* v4.2 bugfix # 36 */ + T2 = thetaRout; + VADIBL = (Vgst2Vtm - T0 / T1) / T2; + dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; + dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; + dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; + if (selfheat) + dVADIBL_dT = (dVgst2Vtm_dT - dT0_dT/T1 + T0*dT1_dT/T9) / T2; + else dVADIBL_dT = 0.0; + + T7 = pParam->B4SOIpdiblb * Vbseff; + if (T7 >= -0.9) + { T3 = 1.0 / (1.0 + T7); + VADIBL *= T3; + dVADIBL_dVg *= T3; + dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->B4SOIpdiblb) + * T3; + dVADIBL_dVd *= T3; + if (selfheat) dVADIBL_dT *= T3; + else dVADIBL_dT = 0.0; + } + else + /* Added to avoid the discontinuity problem caused by pdiblcb */ + { T4 = 1.0 / (0.8 + T7); + T3 = (17.0 + 20.0 * T7) * T4; + dVADIBL_dVg *= T3; + dVADIBL_dVb = dVADIBL_dVb * T3 + - VADIBL * pParam->B4SOIpdiblb * T4 * T4; + dVADIBL_dVd *= T3; + if (selfheat) dVADIBL_dT *= T3; + else dVADIBL_dT = 0.0; + VADIBL *= T3; + } + } + else + { VADIBL = MAX_EXPL; + dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = dVADIBL_dT = 0.0; + } + + /* v4.0 DITS */ + T0 = pParam->B4SOIpditsd * Vds; + if (T0 > EXPL_THRESHOLD) + { T1 = MAX_EXPL; + dT1_dVd = 0; + } + else + { T1 = exp(T0); + dT1_dVd = T1 * pParam->B4SOIpditsd; + } + if (pParam->B4SOIpdits > MIN_EXPL) + { T2 = 1.0 + model->B4SOIpditsl * Leff; + VADITS = (1.0 + T2 * T1) / pParam->B4SOIpdits; + dVADITS_dVg = VADITS * dFP_dVg; + dVADITS_dVd = FP * T2 * dT1_dVd / pParam->B4SOIpdits; + VADITS *= FP; + if (selfheat) dVADITS_dT = VADITS * dFP_dT / FP; + else dVADITS_dT = 0.0; + } + else + { VADITS = MAX_EXPL; + dVADITS_dVg = dVADITS_dVd = dVADITS_dT = 0; + } + + /* Calculate VA */ + + T8 = pParam->B4SOIpvag / EsatL; + T9 = T8 * Vgsteff; + if (T9 > -0.9) + { T0 = 1.0 + T9; + dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); + dT0_dVb = -T9 * dEsatL_dVb / EsatL; + dT0_dVd = -T9 * dEsatL_dVd / EsatL; + if (selfheat) + dT0_dT = -T9 * dEsatL_dT / EsatL; + else + dT0_dT = 0.0; + } + else /* Added to avoid the discontinuity problems caused by pvag */ + { T1 = 1.0 / (17.0 + 20.0 * T9); + T0 = (0.8 + T9) * T1; + T1 *= T1; + dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; + + T9 *= T1 / EsatL; + dT0_dVb = -T9 * dEsatL_dVb; + dT0_dVd = -T9 * dEsatL_dVd; + if (selfheat) + dT0_dT = -T9 * dEsatL_dT; + else + dT0_dT = 0.0; + } + + tmp1 = VACLM * VACLM; + tmp2 = VADIBL * VADIBL; + tmp3 = VACLM + VADIBL; + + T1 = VACLM * VADIBL / tmp3; + tmp3 *= tmp3; + dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; + dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; + dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; + if (selfheat) + dT1_dT = (tmp1 * dVADIBL_dT + tmp2 * dVACLM_dT ) / tmp3; + else dT1_dT = 0.0; + + /* v4.0 adding DITS */ + tmp1 = T1 * T1; + tmp2 = VADITS * VADITS; + tmp3 = T1 + VADITS; + T2 = T1 * VADITS / tmp3; + tmp3 *= tmp3; + dT2_dVg = (tmp1 * dVADITS_dVg + tmp2 * dT1_dVg) / tmp3; + dT2_dVd = (tmp1 * dVADITS_dVd + tmp2 * dT1_dVd) / tmp3; + dT2_dVb = ( tmp2 * dT1_dVb) / tmp3; + if (selfheat) + dT2_dT = (tmp1 * dVADITS_dT + tmp2 * dT1_dT ) / tmp3; + else dT2_dT = 0.0; + + /* + Va = Vasat + T0 * T1; + dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; + dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; + dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; + if (selfheat) + dVa_dT = dVasat_dT + T1 * dT0_dT + T0 * dT1_dT; + else dVa_dT = 0.0; + */ + /* v4.0 */ + Va = Vasat + T0 * T2; + dVa_dVg = dVasat_dVg + T2 * dT0_dVg + T0 * dT2_dVg; + dVa_dVd = dVasat_dVd + T2 * dT0_dVd + T0 * dT2_dVd; + dVa_dVb = dVasat_dVb + T2 * dT0_dVb + T0 * dT2_dVb; + if (selfheat) + dVa_dT = dVasat_dT + T2 * dT0_dT + T0 * dT2_dT; + else dVa_dT = 0.0; + + /* Calculate Ids */ + CoxWovL = model->B4SOIcox * Weff / Leff; + beta = ueff * CoxWovL; + dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff ; + dbeta_dVd = CoxWovL * dueff_dVd; + dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff ; + if (selfheat) dbeta_dT = CoxWovL * dueff_dT; + else dbeta_dT = 0.0; + + T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; + dT0_dVg = -0.5 * (Abulk * dVdseff_dVg + - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; + dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; + dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) + / Vgst2Vtm; + if (selfheat) + dT0_dT = -0.5 * (Abulk * dVdseff_dT + - Abulk * Vdseff / Vgst2Vtm * dVgst2Vtm_dT) + / Vgst2Vtm; + else dT0_dT = 0.0; + + fgche1 = Vgsteff * T0; + dfgche1_dVg = Vgsteff * dT0_dVg + T0; + dfgche1_dVd = Vgsteff * dT0_dVd; + dfgche1_dVb = Vgsteff * dT0_dVb; + if (selfheat) dfgche1_dT = Vgsteff * dT0_dT; + else dfgche1_dT = 0.0; + + T9 = Vdseff / EsatL; + fgche2 = 1.0 + T9; + dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; + dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; + dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; + if (selfheat) dfgche2_dT = (dVdseff_dT - T9 * dEsatL_dT) / EsatL; + else dfgche2_dT = 0.0; + + gche = beta * fgche1 / fgche2; + dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg + - gche * dfgche2_dVg) / fgche2; + dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd + - gche * dfgche2_dVd) / fgche2; + dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb + - gche * dfgche2_dVb) / fgche2; + if (selfheat) + dgche_dT = (beta * dfgche1_dT + fgche1 * dbeta_dT + - gche * dfgche2_dT) / fgche2; + else dgche_dT = 0.0; + + T0 = 1.0 + gche * Rds; + T9 = Vdseff / T0; + Idl = gche * T9; + IdlovVdseff = gche / T0; + + /* Whoa, these formulas for the derivatives of Idl are convoluted, but I + verified them to be correct */ + + dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 + - Idl * gche / T0 * dRds_dVg ; + dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; + dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb + - Idl * dRds_dVb * gche) / T0; + if (selfheat) + dIdl_dT = (gche * dVdseff_dT + T9 * dgche_dT + - Idl * dRds_dT * gche) / T0; + else dIdl_dT = 0.0; + + T9 = diffVds / Va; + T0 = 1.0 + T9; + here->B4SOIids = Ids = Idl * T0 / here->B4SOInseg; + + here->B4SOIidovVds = IdlovVdseff * T0 / here->B4SOInseg; + /* v4.0 bug fix */ + IdovVds = IdlovVdseff * T0 / here->B4SOInseg; /* v4.0 */ + + Gm0 = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; + Gds0 = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd + - T9 * dVa_dVd) / Va; + Gmb0 = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; + Gmc = 0.0; + + if (selfheat) + GmT0 = T0 * dIdl_dT - Idl * (dVdseff_dT + T9 * dVa_dT) / Va; + else GmT0 = 0.0; + + /* This includes all dependencies from Vgsteff, Vbseff */ + + Gm = (Gm0 * dVgsteff_dVg+ Gmb0 * dVbseff_dVg) / here->B4SOInseg; /* v3.0 */ + Gmb = (Gm0 * dVgsteff_dVb + Gmb0 * dVbseff_dVb) / here->B4SOInseg; + Gds = (Gm0 * dVgsteff_dVd+ Gmb0 * dVbseff_dVd + Gds0) / here->B4SOInseg; /* v3.0 */ + Gme = (Gm0 * dVgsteff_dVe + Gmb0 * dVbseff_dVe) / here->B4SOInseg; /* v3.0 */ + if (selfheat) + GmT = (Gm0 * dVgsteff_dT + Gmb0 * dVbseff_dT + GmT0) / here->B4SOInseg; /* v3.0 */ + else GmT = 0.0; + + + /* v3.1 */ + if (here->B4SOIsoiMod != 2) /* v3.2 */ + { + /* calculate GISL/GIDL current */ + /*4.1*/ + if(model->B4SOImtrlMod == 0) + T0 = 3.0 * 3.9 / epsrox * toxe; + else + T0 = model->B4SOIepsrsub * toxe / epsrox; + + + if (model->B4SOIgidlMod==0) + { + if (model->B4SOImtrlMod==0) + /* T1 = (- Vds - Vgs_eff - egisl) / T0; */ /* Bug # 25 Jul09*/ + T1 = (- Vds - Vgd_eff - egisl) / T0; + else + /* T1 = (- Vds - Vgs_eff - egisl+pParam->B4SOIvfbsd) / T0; */ + T1 = (- Vds - Vgd_eff - egisl + pParam->B4SOIvfbsd) / T0; + /* GISL */ + if ((agisl <= 0.0) || + (bgisl <= 0.0) || (T1 <= 0.0) || + /*(cgisl < 0.0) || (Vbd > 0.0) ) */ /* v4.2 Bug # 24 Jul09*/ + (cgisl < 0.0) || (Vbs > 0.0) ) + Igisl = Ggisls = Ggislg = Ggislb = 0.0; + + else { + dT1_dVd = 1 / T0; + /* dT1_dVg = - dT1_dVd * dVgs_eff_dVg; *//* Bug fix # 25 Jul09 */ + dT1_dVg = - dT1_dVd * dVgd_eff_dVg; + T2 = bgisl / T1; + if (T2 < EXPL_THRESHOLD) + { + Igisl = wdios * agisl * T1 * exp(-T2); + T3 = Igisl / T1 * (T2 + 1); + Ggisls = T3 * dT1_dVd; + /* Ggisls = T3 * dT1_dVg; */ /* Bug # 28 Jul09*/ + Ggislg = T3 * dT1_dVg; + } else + { + T3 = wdios * agisl * MIN_EXPL; + Igisl = T3 * T1 ; + Ggisls = T3 * dT1_dVd; + Ggislg = T3 * dT1_dVg; } - else { - T2 = exp(T0); - dT2_dVd = -pParam->B4SOIdvtp1 * T2; + if(cgisl >= MIN_EXPL) { + T4 = Vbs * Vbs; + T5 = -Vbs * T4; + T6 = cgisl + T5; + T7 = T5 / T6; + T8 = 3.0 * cgisl * T4 / T6 / T6; + Ggisls = Ggisls * T7 + Igisl * T8; + Ggislg = Ggislg * T7; + Ggislb = -Igisl * T8; + Igisl *= T7; + } else + Ggislb = 0.0; + } + here->B4SOIigisl = Igisl; + /* End of GISL */ + + if (model->B4SOImtrlMod==0) + T1 = (Vds - Vgs_eff - egidl) / T0; + else + T1 = (Vds - Vgs_eff - egidl + pParam->B4SOIvfbsd) / T0; + + /* GIDL */ + if ((agidl <= 0.0) || + (bgidl <= 0.0) || (T1 <= 0.0) || + (cgidl < 0.0) || (Vbd > 0.0) ) + Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; + + else { + dT1_dVd = 1 / T0; + dT1_dVg = - dT1_dVd * dVgs_eff_dVg; + T2 = bgidl / T1; + if (T2 < EXPL_THRESHOLD) + { + Igidl = wdiod * agidl * T1 * exp(-T2); + T3 = Igidl / T1 * (T2 + 1); + Ggidld = T3 * dT1_dVd; + Ggidlg = T3 * dT1_dVg; + } else + { + T3 = wdiod * agidl * MIN_EXPL; + Igidl = T3 * T1 ; + Ggidld = T3 * dT1_dVd; + Ggidlg = T3 * dT1_dVg; } + if(cgidl >= MIN_EXPL) { + T4 = Vbd * Vbd; + T5 = -Vbd * T4; + T6 = cgidl + T5; + T7 = T5 / T6; + T8 = 3.0 * cgidl * T4 / T6 / T6; + Ggidld = Ggidld * T7 + Igidl * T8; + Ggidlg = Ggidlg * T7; + Ggidlb = -Igidl * T8; + Igidl *= T7; + } else + Ggidlb = 0.0; + } + here->B4SOIigidl = Igidl; + /* End of GIDL*/ + } + else + { + if (model->B4SOImtrlMod==0) + /* T1 = (-Vds - rgisl*Vgs_eff - pParam->B4SOIegisl) / T0;*/ + T1 = (-Vds - rgisl*Vgd_eff - egisl) / T0; /* Bug # 26 Jul09*/ + else + /* T1 = (-Vds - rgisl*Vgs_eff - pParam->B4SOIegisl+pParam->B4SOIvfbsd) / T0; */ + T1 = (-Vds - rgisl*Vgd_eff - egisl + pParam->B4SOIvfbsd) / T0; /* Bug # 26 Jul09*/ - T3 = Leff + pParam->B4SOIdvtp0 * (1.0 + T2); - dT3_dVd = pParam->B4SOIdvtp0 * dT2_dVd; - T4 = Vtm * log(Leff / T3); - dT4_dVd = -Vtm * dT3_dVd / T3; - DITS_Sft = n * T4; - dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd; - dDITS_Sft_dVb = T4 * dn_dVb; - if (selfheat) { - dDITS_Sft_dT = n * KboQ * log(Leff / T3); + /* GISL */ + + if ((agisl <= 0.0) || + (bgisl <= 0.0) || (T1 <= 0.0) || + (cgisl < 0.0) ) + Igisl = Ggisls = Ggislg = Ggislb = 0.0; + else + { + dT1_dVd = 1 / T0; + /* dT1_dVg = - rgisl*dT1_dVd * dVgs_eff_dVg;*//*Bug fix #26*/ + dT1_dVg = - rgisl*dT1_dVd * dVgd_eff_dVg; + T2 = bgisl / T1; + if (T2 < EXPL_THRESHOLD) + { + Igisl = wdios * agisl * T1 * exp(-T2); + T3 = Igisl / T1 * (T2 + 1); + Ggisls = T3 * dT1_dVd; + Ggislg = T3 * dT1_dVg; + } else + { + T3 = wdios * agisl * MIN_EXPL; + Igisl = T3 * T1 ; + Ggisls = T3 * dT1_dVd; + Ggislg = T3 * dT1_dVg; } + T4 = Vbs - fgisl; + /*if (T4==0) + T5 =1; else - dDITS_Sft_dT = 0.0; - } - else { - DITS_Sft = dDITS_Sft_dVd = dDITS_Sft_dVb = 0.0; - dDITS_Sft_dT = 0.0; - } - - here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; - Delt_vth = here->B4SOIthetavth * V0; - dDelt_vth_dVb = pParam->B4SOIdvt0 * dTheta0_dVb * V0; - if (selfheat) - /*dDelt_vth_dT = here->B4SOIthetavth * dvbi_dT;*/ - dDelt_vth_dT = here->B4SOIthetavth * (dvbi_dT - dphi_dT); /* v4.1 */ - else dDelt_vth_dT = 0.0; - - T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff * Leff / ltw; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = 0.0; - } - - T0 = pParam->B4SOIdvt0w * T2; - DeltVthw = T0 * V0; - dDeltVthw_dVb = pParam->B4SOIdvt0w * dT2_dVb * V0; - if (selfheat) - /* dDeltVthw_dT = T0 * dvbi_dT; */ - dDeltVthw_dT = T0 * (dvbi_dT - dphi_dT); /* v4.1 */ - else dDeltVthw_dT = 0.0; - - T0 = sqrt(1.0 + pParam->B4SOIlpe0 / Leff); - T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / Leff - + pParam->B4SOIkt2 * Vbs0mos); - - /* v4.0 */ -/* DeltVthtemp = pParam->B4SOIk1eff * (T0 - 1.0) * sqrtPhi + T1 * TempRatioMinus1; */ - DeltVthtemp = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtPhi - + T1 * TempRatioMinus1; - /* v4.0 end */ - - if (selfheat) - /* dDeltVthtemp_dT = T1 / model->B4SOItnom; */ - dDeltVthtemp_dT = pParam->B4SOIk1ox * (T0 - 1.0) * dsqrtPhi_dT - + T1 / model->B4SOItnom; /* v4.1 */ - else - dDeltVthtemp_dT = 0.0; - - tmp2 = toxe * phi - / (pParam->B4SOIweff + pParam->B4SOIw0); - - T3 = here->B4SOIeta0 + pParam->B4SOIetab * Vbs0mos;/*v4.0*/ - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9 * pParam->B4SOIetab; - dT3_dVb = T4 ; - } - else - { - dT3_dVb = pParam->B4SOIetab ; - } - DIBL_Sft = T3 * pParam->B4SOItheta0vb0 * Vds; - dDIBL_Sft_dVd = pParam->B4SOItheta0vb0 * T3; - dDIBL_Sft_dVb = pParam->B4SOItheta0vb0 * Vds * dT3_dVb; - - Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / Leff); - - /* 4.1 */ - T0 = exp(2.0 * pParam->B4SOIdvtp4 * Vds); - DITS_Sft2 = pParam->B4SOIdvtp2factor * (T0-1) / (T0+1); - dDITS_Sft2_dVd = pParam->B4SOIdvtp2factor * pParam->B4SOIdvtp4 * 4.0 * T0 / ((T0+1) * (T0+1)); - - VthFD = model->B4SOItype * here->B4SOIvth0 - + (pParam->B4SOIk1ox * sqrtPhis - - pParam->B4SOIk1eff * sqrtPhi) * Lpe_Vb - - here->B4SOIk2ox * Vbs0mos- Delt_vth - DeltVthw - + (pParam->B4SOIk3 + pParam->B4SOIk3b * Vbs0mos) - * tmp2 + DeltVthtemp - DIBL_Sft - DITS_Sft - DITS_Sft2; - - - T6 = pParam->B4SOIk3b * tmp2 - here->B4SOIk2ox - + pParam->B4SOIkt2 * TempRatioMinus1; - dVthFD_dVb = Lpe_Vb * pParam->B4SOIk1ox * dsqrtPhis_dVb - - dDelt_vth_dVb - dDeltVthw_dVb - + T6 - dDIBL_Sft_dVb - dDITS_Sft_dVb; /* v4.0 */ - /* this is actually dVth_dVbs0mos */ - - dVthFD_dVe = dVthFD_dVb * dVbs0mos_dVe; - /* dVthFD_dVd = -dDIBL_Sft_dVd -dDITS_Sft_dVd; */ /* v4.0 */ - dVthFD_dVd = dVthFD_dVb * dVbs0mos_dVd - dDIBL_Sft_dVd - dDITS_Sft_dVd - dDITS_Sft2_dVd; /* v4.1 */ - - if (selfheat) - /* dVthFD_dT = dDeltVthtemp_dT - dDelt_vth_dT - - dDeltVthw_dT + dVthFD_dVb * dVbs0mos_dT - - dDITS_Sft_dT ; */ - dVthFD_dT = dDeltVthtemp_dT - dDelt_vth_dT - - dDeltVthw_dT + dVthFD_dVb * dVbs0mos_dT - - dDITS_Sft_dT - + Lpe_Vb * ( pParam->B4SOIk1ox * 0.5 / sqrtPhis * dphi_dT - - pParam->B4SOIk1eff * dsqrtPhi_dT); /* v4.1 */ - - else dVthFD_dT = 0.0; - - - /* VtgseffFD calculation for PhiFD */ - VtgsFD = VthFD - Vgs_eff; - T10 = model->B4SOInofffd * Vtm; - DEXP((VtgsFD - model->B4SOIvofffd)/ T10, ExpVtgsFD, T0); - VtgseffFD = T10 * log(1.0 + ExpVtgsFD); - T0 /= (1.0 + ExpVtgsFD); - dVtgseffFD_dVd = T0 * dVthFD_dVd; - dVtgseffFD_dVg = -T0 * dVgs_eff_dVg; - dVtgseffFD_dVe = T0 * dVthFD_dVe; - if (selfheat) - dVtgseffFD_dT = T0 * (dVthFD_dT - (VtgsFD - model->B4SOIvofffd)/Temp) - + VtgseffFD/Temp; - else dVtgseffFD_dT = 0.0; - - - /* surface potential modeling at strong inversion: PhiON */ - VgstFD = Vgs_eff - VthFD; - DEXP((VgstFD - model->B4SOIvofffd)/ T10, ExpVgstFD, T0); - VgsteffFD = T10 * log(1.0 + ExpVgstFD); - T0 /= (1.0 + ExpVgstFD); - dVgsteffFD_dVd = -T0 * dVthFD_dVd; - dVgsteffFD_dVg = T0 * dVgs_eff_dVg; - dVgsteffFD_dVe = -T0 * dVthFD_dVe; - if (selfheat) - dVgsteffFD_dT = T0 * (-dVthFD_dT - - (VgstFD - model->B4SOIvofffd)/Temp) - + VgsteffFD/Temp; - else dVgsteffFD_dT = 0.0; - - -/* T1 = model->B4SOImoinFD*pParam->B4SOIk1eff*Vtm*Vtm; */ - T1 = model->B4SOImoinFD*pParam->B4SOIk1ox*Vtm*Vtm; - if (selfheat) dT1_dT = 2*T1/Temp; - else dT1_dT=0.0; - - T2 = VgsteffFD+ 2*pParam->B4SOIk1eff*sqrt(phi); - dT2_dVg = dVgsteffFD_dVg; - dT2_dVd = dVgsteffFD_dVd; - dT2_dVe = dVgsteffFD_dVe; - /* if (selfheat) dT2_dT = dVgsteffFD_dT; */ - if (selfheat) dT2_dT = dVgsteffFD_dT + 2*pParam->B4SOIk1eff*dsqrtPhi_dT; /* v4.1 */ - else dT2_dT = 0.0; - - T0 = 1+ VgsteffFD * T2 / T1; - dT0_dVg = (VgsteffFD * dT2_dVg + T2 * dVgsteffFD_dVg) / T1; - dT0_dVd = (VgsteffFD * dT2_dVd + T2 * dVgsteffFD_dVd) / T1; - dT0_dVe = (VgsteffFD * dT2_dVe + T2 * dVgsteffFD_dVe) / T1; - if (selfheat) - dT0_dT = (VgsteffFD * (dT2_dT - T2/T1 * dT1_dT) + T2 * dVgsteffFD_dT) / T1; - else dT0_dT = 0.0; - - - PhiON = phi + Vtm* log(T0) ; - dPhiON_dVg = Vtm* dT0_dVg/T0 ; - dPhiON_dVd = Vtm* dT0_dVd/T0 ; - dPhiON_dVe = Vtm* dT0_dVe/T0 ; - if (selfheat) - dPhiON_dT = dphi_dT + Vtm* dT0_dT/T0 + (PhiON-phi)/Temp ; /* v4.1 */ - else dPhiON_dT = 0.0; - - - /* surface potential from subthreshold to inversion: PhiFD */ - T0 = model->B4SOIcox / (model->B4SOIcox + 1.0/(1.0/model->B4SOIcsi + 1.0/Cbox)); - PhiFD = PhiON - T0 * VtgseffFD; - dPhiFD_dVg = dPhiON_dVg - T0 * dVtgseffFD_dVg; - dPhiFD_dVd = dPhiON_dVd - T0 * dVtgseffFD_dVd; - dPhiFD_dVe = dPhiON_dVe - T0 * dVtgseffFD_dVe; - if (selfheat) - dPhiFD_dT = dPhiON_dT - T0 * dVtgseffFD_dT; - else dPhiFD_dT = 0; - - - /* built-in potential lowering: Vbs0 */ - if (model->B4SOIfdMod == 0) /* v4.0 */ - { - T0 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; - T1 = model->B4SOIdvbd0 * (exp(0.5*T0) + 2*exp(T0)); - T2 = T1 * (vbi - phi); - T3 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; /* v3.2 */ - Vbs0t = PhiFD - T3 + model->B4SOIvbsa + T2; - dVbs0t_dVg = dPhiFD_dVg; - dVbs0t_dVd = dPhiFD_dVd; - dVbs0t_dVe = dPhiFD_dVe; - if (selfheat) - dVbs0t_dT = dPhiFD_dT + T1 * (dvbi_dT - dphi_dT); /* v4.1 */ - else dVbs0t_dT = 0; - - - T0 = 1 + model->B4SOIcsi / Cbox; - T3 = -model->B4SOIdk2b * pParam->B4SOIleff / pParam->B4SOIlitl; - T5 = model->B4SOIk2b * (exp(0.5*T3) + 2*exp(T3)); - T1 = (model->B4SOIk1b - T5) / T0; - T2 = T1 * Vesfb; - T0 = 1.0/(1 + Cbox / model->B4SOIcsi); - Vbs0 = T0 * Vbs0t + T2; - dVbs0_dVg = T0 * dVbs0t_dVg; - dVbs0_dVd = T0 * dVbs0t_dVd; - dVbs0_dVe = T0 * dVbs0t_dVe + T1; - if (selfheat) - dVbs0_dT = T0 * dVbs0t_dT - T1 * dvfbb_dT; - else - dVbs0_dT = 0.0; - } - else /* v4.1 */ - { - T0 = 1.0/(model->B4SOIcsi + Cbox + model->B4SOIcdsbs); - T1 = -model->B4SOIdvbd1 * pParam->B4SOIleff / pParam->B4SOIlitl; - T2 = model->B4SOIdvbd0 * (exp(0.5*T1) + 2*exp(T1)); - T3 = T2 * (Vds + model->B4SOIvsce); - T4 = 0.5 * pParam->B4SOIqsi / model->B4SOIcsi; - T5 = model->B4SOIcsi * T0 * (PhiFD - T4 + model->B4SOIvbsa); - T6 = model->B4SOIcdsbs * T0 * T3; - Vbs0t = T5 + T6; - T8 = model->B4SOIcsi * T0; - dVbs0t_dVg = T8 * dPhiFD_dVg; - dVbs0t_dVd = T8 * dPhiFD_dVd + model->B4SOIcdsbs * T0 * T2; - dVbs0t_dVe = T8 * dPhiFD_dVe; - if (selfheat) - dVbs0t_dT = T8 * dPhiFD_dT; + T5 = kgisl/T4; + T6 = exp(T5); + if (T6B4SOIsoiMod == 2) /* v3.2 */ /* v3.1 ideal FD: Vbsitf is pinned at Vbs0 */ - { - Vbs = Vbsitf = Vbs0 + OFF_Vbsitf; - dVbsitf_dVg = dVbs0_dVg; - dVbsitf_dVd = dVbs0_dVd; - dVbsitf_dVe = dVbs0_dVe; - dVbsitf_dVb = 0.0; - if (selfheat) dVbsitf_dT = dVbs0_dT; - else dVbsitf_dT = 0; - } - else /* soiMod = 1 */ - { - T1 = Vbs - (Vbs0 + OFF_Vbsitf) - 0.01; - T2 = sqrt(T1*T1 + 0.0001); - T3 = 0.5 * (1 + T1/T2); - Vbsitf = (Vbs0 + OFF_Vbsitf) + 0.5 * (T1 + T2); - dVbsitf_dVg = (1 - T3) * dVbs0_dVg; - dVbsitf_dVd = (1 - T3) * dVbs0_dVd; - dVbsitf_dVe = (1 - T3) * dVbs0_dVe; - dVbsitf_dVb = T3 ; - if (selfheat) dVbsitf_dT = (1 - T3) * dVbs0_dT; - else dVbsitf_dT = 0.0; - } - - /* Based on Vbsitf, calculate zero-field body potential for MOS: Vbsmos */ - T1 = Vbs0t - Vbsitf - 0.005; - T2 = sqrt(T1 * T1 + (2.5e-5)); - T3 = 0.5 * (T1 + T2); - T4 = T3 * model->B4SOIcsi / pParam->B4SOIqsi; /* v3.2 */ - Vbsmos = Vbsitf - 0.5 * T3 * T4; - T5 = 0.5 * T4 * (1 + T1 / T2); - dVbsmos_dVg = dVbsitf_dVg * (1 + T5) - T5 * dVbs0t_dVg; - dVbsmos_dVd = dVbsitf_dVd * (1 + T5) - T5 * dVbs0t_dVd; - dVbsmos_dVb = dVbsitf_dVb * (1 + T5); - dVbsmos_dVe = dVbsitf_dVe * (1 + T5) - T5 * dVbs0t_dVe; - if (selfheat) - dVbsmos_dT = dVbsitf_dT * (1 + T5) - T5 * dVbs0t_dT; - else - dVbsmos_dT = 0.0; - /* Vbsmos should be used in MOS after some limiting (Vbseff) */ - - - Vbp = Vbs - Vps; - dVbp_dVb = 1; - } -/* end of v3.0 block edition */ - - -/* v3.0 modification */ - /* T2 is Vbsmos limited above Vbsc=-5 */ - T0 = Vbsmos + 5 - 0.001; - T1 = sqrt(T0 * T0 - 0.004 * (-5)); - T2 = (-5) + 0.5 * (T0 + T1); - dT2_dVb = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVb; - dT2_dVg = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVg; - dT2_dVd = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVd; - dT2_dVe = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dVe; - if (selfheat) dT2_dT = (0.5 * (1.0 + T0 / T1)) * dVbsmos_dT; - else dT2_dT = 0.0; - - /* Vbsh is T2 limited below 1.5 */ - T0 = 1.5; - T1 = T0 - T2 - 0.002; - T3 = sqrt(T1 * T1 + 0.008 * T0); - Vbsh = T0 - 0.5 * (T1 + T3); - dVbsh_dVb = 0.5 * (1.0 + T1 / T3) * dT2_dVb; - dVbsh_dVg = 0.5 * (1.0 + T1 / T3) * dT2_dVg; - dVbsh_dVd = 0.5 * (1.0 + T1 / T3) * dT2_dVd; - dVbsh_dVe = 0.5 * (1.0 + T1 / T3) * dT2_dVe; - if (selfheat) dVbsh_dT = 0.5 * (1.0 + T1 / T3) * dT2_dT; - else dVbsh_dT = 0.0; - - - /* Vbseff is Vbsh limited to 0.95*phi */ - T0 = 0.95 * phi; - T1 = T0 - Vbsh - 0.002; - T2 = sqrt(T1 * T1 + 0.008 * T0); - Vbseff = T0 - 0.5 * (T1 + T2); - dVbseff_dVb = 0.5 * (1.0 + T1 / T2) * dVbsh_dVb; - dVbseff_dVg = 0.5 * (1.0 + T1 / T2) * dVbsh_dVg; - dVbseff_dVd = 0.5 * (1.0 + T1 / T2) * dVbsh_dVd; - dVbseff_dVe = 0.5 * (1.0 + T1 / T2) * dVbsh_dVe; - /* if (selfheat) dVbseff_dT = 0.5 * (1.0 + T1 / T2) * dVbsh_dT; */ - if (selfheat) { - dT0_dT = 0.95 * dphi_dT; - dT1_dT = dT0_dT - dVbsh_dT; - dVbseff_dT = dT0_dT - 0.5 * (1.0 + T1 / T2) * dT1_dT - - 0.002 * dT0_dT / T2; - } /* v4.1 */ - else dVbseff_dT = 0.0; - here->B4SOIvbseff = Vbseff; /* SPICE sol. */ -/* end of v3.0 modification */ - - - /* Below all the variables refer to Vbseff */ - if (dVbseff_dVb < 1e-20) { - dVbseff_dVb = 1e-20; - dVbsh_dVb *= 1e20; - } - else - dVbsh_dVb /= dVbseff_dVb; - - Phis = phi - Vbseff; - dPhis_dVb = -1; - sqrtPhis = sqrt(Phis); - dsqrtPhis_dVb = -0.5 / sqrtPhis; - - Xdep = Xdep0 * sqrtPhis / sqrtPhi; - dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb; - /* v4.1 */ - if (selfheat) { - dPhis_dT = dphi_dT - dVbseff_dT; - dsqrtPhis_dT = 0.5 / sqrtPhis * dPhis_dT; - dXdep_dT = dXdep0_dT * sqrtPhis / sqrtPhi - + (dsqrtPhis_dT * sqrtPhi - sqrtPhis * dsqrtPhi_dT) / phi; - } - else { - dPhis_dT = 0.0; - dsqrtPhis_dT = 0.0; - dXdep_dT = 0.0; - } /* end v4.1 */ - - /* Calculate nstar v3.2 */ - here->B4SOInstar = model->B4SOIvtm / Charge_q * - (model->B4SOIcox + epssub / Xdep + pParam->B4SOIcit); - -/* Vth Calculation */ - T3 = sqrt(Xdep); - - T0 = pParam->B4SOIdvt2 * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B4SOIdvt2 ; - } - else /* Added to avoid any discontinuity problems caused by dvt2 */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B4SOIdvt2 * T4 * T4 ; - } - lt1 = model->B4SOIfactor1 * T3 * T1; - dlt1_dVb =model->B4SOIfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - if (selfheat) dlt1_dT = model->B4SOIfactor1 * T1 * 0.5 / T3 * dXdep_dT; - else dlt1_dT = 0.0; /* v4.1 */ - - T0 = pParam->B4SOIdvt2w * Vbseff; - if (T0 >= - 0.5) - { T1 = 1.0 + T0; - T2 = pParam->B4SOIdvt2w ; - } - else /* Added to avoid any discontinuity problems caused by dvt2w */ - { T4 = 1.0 / (3.0 + 8.0 * T0); - T1 = (1.0 + 3.0 * T0) * T4; - T2 = pParam->B4SOIdvt2w * T4 * T4 ; - } - ltw= model->B4SOIfactor1 * T3 * T1; - dltw_dVb=model->B4SOIfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2); - if (selfheat) dltw_dT = model->B4SOIfactor1 * T1 * 0.5 / T3 * dXdep_dT; - else dltw_dT = 0.0; /* v4.1 */ - T0 = -0.5 * pParam->B4SOIdvt1 * Leff / lt1; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; - dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXPL; - Theta0 = T1 * (1.0 + 2.0 * T1); - dTheta0_dVb = 0.0; - } - - /* Calculate n */ - T2 = pParam->B4SOInfactor * epssub / Xdep; - dT2_dVb = - T2 / Xdep * dXdep_dVb; - - T3 = pParam->B4SOIcdsc + pParam->B4SOIcdscb * Vbseff - + pParam->B4SOIcdscd * Vds; - dT3_dVb = pParam->B4SOIcdscb; - dT3_dVd = pParam->B4SOIcdscd; - - T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; - dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb + dTheta0_dVb * T3) - / model->B4SOIcox; - dT4_dVd = Theta0 * dT3_dVd / model->B4SOIcox; - - if (T4 >= -0.5) - { n = 1.0 + T4; - dn_dVb = dT4_dVb; - dn_dVd = dT4_dVd; - } - else - /* avoid discontinuity problems caused by T4 */ - { T0 = 1.0 / (3.0 + 8.0 * T4); - n = (1.0 + 3.0 * T4) * T0; - T0 *= T0; - dn_dVb = T0 * dT4_dVb; - dn_dVd = T0 * dT4_dVd; - } - - /* v4.0 DITS */ - if (pParam->B4SOIdvtp0 > 0.0) { - T0 = -pParam->B4SOIdvtp1 * Vds; - if (T0 < -EXPL_THRESHOLD) { - T2 = MIN_EXPL; - dT2_dVd = 0.0; + T5 = kgisl/T4; + if (T5B4SOIdvtp1 * T2; + else + {T6 = MAX_EXPL; + Ggislb=0.0; } - - T3 = Leff + pParam->B4SOIdvtp0 * (1.0 + T2); - dT3_dVd = pParam->B4SOIdvtp0 * dT2_dVd; - T4 = Vtm * log(Leff / T3); - dT4_dVd = -Vtm * dT3_dVd / T3; - DITS_Sft = n * T4; - dDITS_Sft_dVd = dn_dVd * T4 + n * dT4_dVd; - dDITS_Sft_dVb = T4 * dn_dVb; - if (selfheat) { - dDITS_Sft_dT = n * KboQ * log(Leff / T3); + Ggisls*=T6; + Ggislg*=T6; + Igisl*=T6; + } + here->B4SOIigisl = Igisl; + /* End of GISL */ + if (model->B4SOImtrlMod==0) + /*T1 = (Vds - rgidl*Vgs_eff - pParam->B4SOIegidl) / T0; */ /* v4.2 bugfix #26 */ + T1 = (Vds - rgidl*Vgs_eff - egidl) / T0; + else + /*T1 = (Vds - rgidl*Vgs_eff - pParam->B4SOIegidl+pParam->B4SOIvfbsd) / T0;*/ /* v4.2 bugfix #26 */ + T1 = (Vds - rgidl * Vgs_eff - egidl + pParam->B4SOIvfbsd) / T0; + /* GIDL */ + if ((agidl <= 0.0) || + (bgidl <= 0.0) || (T1 <= 0.0) || + (cgidl < 0.0) ) + Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; + else + { + dT1_dVd = 1 / T0; + dT1_dVg = - rgidl*dT1_dVd * dVgs_eff_dVg; + T2 = bgidl / T1; + if (T2 < EXPL_THRESHOLD) + { + Igidl = wdiod * agidl * T1 * exp(-T2); + T3 = Igidl / T1 * (T2 + 1); + Ggidld = T3 * dT1_dVd; + Ggidlg = T3 * dT1_dVg; + } else + { + T3 = wdiod * agidl * MIN_EXPL; + Igidl = T3 * T1 ; + Ggidld = T3 * dT1_dVd; + Ggidlg = T3 * dT1_dVg; } + T4 = Vbd - fgidl; + /*if (T4==0) + T5 =1; else - dDITS_Sft_dT = 0.0; - } - else { - DITS_Sft = dDITS_Sft_dVd = dDITS_Sft_dVb = 0.0; - dDITS_Sft_dT = 0.0; - } - - here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; - Delt_vth = here->B4SOIthetavth * V0; - dDelt_vth_dVb = pParam->B4SOIdvt0 * dTheta0_dVb * V0; - if (selfheat) dDelt_vth_dT = here->B4SOIthetavth * dvbi_dT; - else dDelt_vth_dT = 0.0; - - T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff - * Leff / ltw; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - dT1_dVb = -T0 / ltw * T1 * dltw_dVb; - dT2_dVb = (1.0 + 4.0 * T1) * dT1_dVb; - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - dT2_dVb = 0.0; - } - - T0 = pParam->B4SOIdvt0w * T2; - DeltVthw = T0 * V0; - dDeltVthw_dVb = pParam->B4SOIdvt0w * dT2_dVb * V0; - if (selfheat) dDeltVthw_dT = T0 * dvbi_dT; - else dDeltVthw_dT = 0.0; - - T0 = sqrt(1.0 + pParam->B4SOIlpe0 / Leff); - T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / Leff - + pParam->B4SOIkt2 * Vbseff); - DeltVthtemp = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtPhi - + T1 * TempRatioMinus1; /* v4.0 */ - if (selfheat) - dDeltVthtemp_dT = T1 / model->B4SOItnom; - else - dDeltVthtemp_dT = 0.0; - - tmp2 = toxe * phi - / (pParam->B4SOIweff + pParam->B4SOIw0); - - T3 = here->B4SOIeta0 + pParam->B4SOIetab * Vbseff; - if (T3 < 1.0e-4) /* avoid discontinuity problems caused by etab */ - { T9 = 1.0 / (3.0 - 2.0e4 * T3); - T3 = (2.0e-4 - T3) * T9; - T4 = T9 * T9 * pParam->B4SOIetab; - dT3_dVb = T4 ; - } - else - { - dT3_dVb = pParam->B4SOIetab ; - } - DIBL_Sft = T3 * pParam->B4SOItheta0vb0 * Vds; - dDIBL_Sft_dVd = pParam->B4SOItheta0vb0 * T3; - dDIBL_Sft_dVb = pParam->B4SOItheta0vb0 * Vds * dT3_dVb; - - Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / Leff); - - T9 = 2.2361 / sqrtPhi; - sqrtPhisExt = sqrtPhis - T9 * (Vbsh - Vbseff); - dsqrtPhisExt_dVb = dsqrtPhis_dVb - T9 * (dVbsh_dVb - 1); - - /* 4.1 */ - T0 = exp(2.0 * pParam->B4SOIdvtp4 * Vds); - DITS_Sft2 = pParam->B4SOIdvtp2factor * (T0-1) / (T0+1); - dDITS_Sft2_dVd = pParam->B4SOIdvtp2factor * pParam->B4SOIdvtp4 * 4.0 * T0 / ((T0+1) * (T0+1)); - - Vth = model->B4SOItype * here->B4SOIvth0 - + (pParam->B4SOIk1ox * sqrtPhisExt - - pParam->B4SOIk1eff * sqrtPhi) * Lpe_Vb - - here->B4SOIk2ox * Vbseff- Delt_vth - DeltVthw - +(pParam->B4SOIk3 + pParam->B4SOIk3b * Vbseff) * tmp2 - + DeltVthtemp - DIBL_Sft - DITS_Sft - DITS_Sft2; - - here->B4SOIvon = Vth; - - T6 = pParam->B4SOIk3b * tmp2 - here->B4SOIk2ox - + pParam->B4SOIkt2 * TempRatioMinus1; - dVth_dVb = Lpe_Vb * pParam->B4SOIk1ox * dsqrtPhisExt_dVb - - dDelt_vth_dVb - dDeltVthw_dVb - + T6 - dDIBL_Sft_dVb - dDITS_Sft_dVb; - /* this is actually dVth_dVbseff */ - - dVth_dVd = -dDIBL_Sft_dVd - dDITS_Sft_dVd - dDITS_Sft2_dVd; - if (selfheat) - dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT - - dDITS_Sft_dT; - else dVth_dT = 0.0; - - - /* dVthzb_dT calculation */ - if ((model->B4SOIcapMod == 3) && (selfheat == 1)) { - T3zb = sqrt(Xdep0); - ltwzb = lt1zb = model->B4SOIfactor1 * T3zb; - - T0 = -0.5 * pParam->B4SOIdvt1 * Leff / lt1zb; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - Theta0zb = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXPL; - Theta0zb = T1 * (1.0 + 2.0 * T1); - } - Delt_vthzb = pParam->B4SOIdvt0 * Theta0zb * V0; - dDelt_vthzb_dT = pParam->B4SOIdvt0 * Theta0zb * dvbi_dT; - - T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff * Leff / ltwzb; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - } - T0 = pParam->B4SOIdvt0w * T2; - DeltVthwzb = T0 * V0; - dDeltVthwzb_dT = T0 * dvbi_dT; - - T0 = sqrt(1.0 + pParam->B4SOIlpe0 / Leff); - T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / Leff); - DeltVthtempzb = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtPhi - + T1 * TempRatioMinus1; - dDeltVthtempzb_dT = T1 / model->B4SOItnom; - - Vthzb = model->B4SOItype * here->B4SOIvth0 - - Delt_vthzb - DeltVthwzb + pParam->B4SOIk3 * tmp2 - + DeltVthtempzb; - dVthzb_dT = dDeltVthtempzb_dT - dDelt_vthzb_dT - dDeltVthwzb_dT; - Vthzb2 = Vthzb + 1.12; /* v4.1 */ - } - -/* Effective Vgst (Vgsteff) Calculation */ - - Vgst = Vgs_eff - Vth; - dVgst_dVg = dVgs_eff_dVg; - dVgst_dVd = -dVth_dVd; - dVgst_dVb = -dVth_dVb; - - T10 = n * Vtm; /* v4.0 */ - VgstNVt = pParam->B4SOImstar * Vgst / T10; /* v4.0 */ - ExpArg = (pParam->B4SOIvoff - (1- pParam->B4SOImstar) * Vgst) - / T10; /* v4.0 */ - - /* MCJ: Very small Vgst */ - if (VgstNVt > EXPL_THRESHOLD) - { Vgsteff = Vgst; - /* T0 is dVgsteff_dVbseff */ - T0 = -dVth_dVb; - dVgsteff_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; /* v3.0 */ - dVgsteff_dVd = -dVth_dVd + T0 * dVbseff_dVd; /* v3.0 */ - dVgsteff_dVb = T0 * dVbseff_dVb; - dVgsteff_dVe = T0 * dVbseff_dVe; /* v3.0 */ - if (selfheat) - dVgsteff_dT = -dVth_dT + T0 * dVbseff_dT; /* v3.0 */ - else - dVgsteff_dT = 0.0; - } - else if (ExpArg > EXPL_THRESHOLD) - { T0 = (Vgst - pParam->B4SOIvoff) / (n * Vtm); - ExpVgst = exp(T0); - Vgsteff = Vtm * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; - T3 = Vgsteff / (n * Vtm) ; - /* T1 is dVgsteff_dVbseff */ - T1 = -T3 * (dVth_dVb + T0 * Vtm * dn_dVb); - dVgsteff_dVg = T3 * dVgs_eff_dVg+ T1 * dVbseff_dVg; /* v3.0 */ - dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dn_dVd)+ T1 * dVbseff_dVd; /* v3.0 */ - dVgsteff_dVe = T1 * dVbseff_dVe; /* v3.0 */ - dVgsteff_dVb = T1 * dVbseff_dVb; - if (selfheat) - dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * n) - + Vgsteff / Temp+ T1 * dVbseff_dT; /* v3.0 */ - else - dVgsteff_dT = 0.0; - } - else - { ExpVgst = exp(VgstNVt); - T1 = T10 * log(1.0 + ExpVgst); - dT1_dVg = ExpVgst / (1.0 + ExpVgst) * pParam->B4SOImstar; - dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / n * dn_dVb) - + T1 / n * dn_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / n * dn_dVd) - + T1 / n * dn_dVd; - T3 = (1.0 / Temp); - if (selfheat) - dT1_dT = -dT1_dVg * (dVth_dT + Vgst * T3) + T1 * T3; - else - dT1_dT = 0.0; - - dT2_dVg = -model->B4SOIcox / (Vtm * pParam->B4SOIcdep0) - * exp(ExpArg) * (1 - pParam->B4SOImstar); - T2 = pParam->B4SOImstar - T10 * dT2_dVg - / (1.0 - pParam->B4SOImstar); - dT2_dVd = -dT2_dVg * (dVth_dVd - Vtm * ExpArg * dn_dVd - / (1.0 - pParam->B4SOImstar)) - + (T2 - pParam->B4SOImstar) / n * dn_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - Vtm * ExpArg * dn_dVb - / (1.0 - pParam->B4SOImstar)) - + (T2 - pParam->B4SOImstar) / n * dn_dVb; - if (selfheat) - dT2_dT = -dT2_dVg * ( dVth_dT - ExpArg * T10 * T3 - / (1.0 - pParam->B4SOImstar) ); - else - dT2_dT = 0.0; - - Vgsteff = T1 / T2; - T3 = T2 * T2; - /* T4 is dVgsteff_dVbseff */ - T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - dVgsteff_dVb = T4 * dVbseff_dVb; - dVgsteff_dVe = T4 * dVbseff_dVe; /* v3.0 */ - dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) - / T3 * dVgs_eff_dVg - + T4 * dVbseff_dVg; /* v3.0 */ - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) - / T3+ T4 * dVbseff_dVd; /* v3.0 */ - if (selfheat) - dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) - / T3+ T4 * dVbseff_dT; /* v3.0 */ - else - dVgsteff_dT = 0.0; - } - Vgst2Vtm = Vgsteff + 2.0 * Vtm; - if (selfheat) dVgst2Vtm_dT = dVgsteff_dT + 2.0 * dVtm_dT; /* v3.1.1 bug fix */ - else dVgst2Vtm_dT = 0.0; - here->B4SOIVgsteff = Vgsteff; /* v2.2.3 bug fix */ - - /* v4.0 F-factor (degradation factor due to pocket implant) */ - if (pParam->B4SOIfprout <= 0.0) - { FP = 1.0; - dFP_dVg = dFP_dT = 0.0; - } - else - { T9 = pParam->B4SOIfprout * sqrt(Leff) / Vgst2Vtm; - FP = 1.0 / (1.0 + T9); - dFP_dVg = FP * FP * T9 / Vgst2Vtm; - if (selfheat) dFP_dT = dFP_dVg * dVgst2Vtm_dT; - else dFP_dT = 0.0; - } - -/* Calculate Effective Channel Geometry */ - T9 = sqrtPhis - sqrtPhi; - Weff = pParam->B4SOIweff - (2.0 - here->B4SOInbc) - * (pParam->B4SOIdwg * Vgsteff + pParam->B4SOIdwb * T9); - dWeff_dVg = -(2.0 - here->B4SOInbc) * pParam->B4SOIdwg; - dWeff_dVb = -(2.0 - here->B4SOInbc) * pParam->B4SOIdwb - * dsqrtPhis_dVb; - - if (Weff < 2.0e-8) /* to avoid the discontinuity problem due to Weff*/ - { T0 = 1.0 / (6.0e-8 - 2.0 * Weff); - Weff = 2.0e-8 * (4.0e-8 - Weff) * T0; - T0 *= T0 * 4.0e-16; - dWeff_dVg *= T0; - dWeff_dVb *= T0; - } - - if (model->B4SOIrdsMod == 1) /* v4.0 */ - Rds = dRds_dVg = dRds_dVb = dRds_dT = 0.0; - else { - T0 = pParam->B4SOIprwg * Vgsteff - + pParam->B4SOIprwb * T9; - if (T0 >= -0.9) - { Rds = rds0 * (1.0 + T0); - dRds_dVg = rds0 * pParam->B4SOIprwg; - dRds_dVb = rds0 * pParam->B4SOIprwb * dsqrtPhis_dVb; - - if (selfheat && (Rds!=0.0)) - dRds_dT = (1.0 + T0) * drds0_dT; - else dRds_dT = 0.0; - - } - else - /* to avoid the discontinuity problem due to prwg and prwb*/ - { T1 = 1.0 / (17.0 + 20.0 * T0); - Rds = rds0 * (0.8 + T0) * T1; - T1 *= T1; - dRds_dVg = rds0 * pParam->B4SOIprwg * T1; - dRds_dVb = rds0 * pParam->B4SOIprwb * dsqrtPhis_dVb - * T1; - - if (selfheat && (Rds!=0.0)) - dRds_dT = (0.8 + T0) * T1 * drds0_dT; - else dRds_dT = 0.0; - - } - here->B4SOIrds = Rds; /* v2.2.3 bug fix */ - } - -/* Calculate Abulk */ - if (pParam->B4SOIa0 == 0.0) { - - Abulk0 = Abulk = 1.0; - - dAbulk0_dVb = dAbulk_dVg = dAbulk_dVb = 0.0; - } - else { - T10 = pParam->B4SOIketa * Vbsh; - if (T10 >= -0.9) { - T11 = 1.0 / (1.0 + T10); - dT11_dVb = -pParam->B4SOIketa * T11 * T11 * dVbsh_dVb; - } - else { /* added to avoid the problems caused by Keta */ - T12 = 1.0 / (0.8 + T10); - T11 = (17.0 + 20.0 * T10) * T12; - dT11_dVb = -pParam->B4SOIketa * T12 * T12 * dVbsh_dVb; - } - -/* v3.0 bug fix */ - T10 = phi + pParam->B4SOIketas; - - T13 = (Vbsh * T11) / T10; - dT13_dVb = (Vbsh * dT11_dVb + T11 * dVbsh_dVb) / T10; - - /* limit 1/sqrt(1-T13) to 6, starting at T13=0.96 */ - if (T13 < 0.96) { - T14 = 1 / sqrt(1-T13); - T10 = 0.5 * T14 / (1-T13); - dT14_dVb = T10 * dT13_dVb; - } - else { - T11 = 1.0 / (1.0 - 1.043406 * T13); - T14 = (6.00167 - 6.26044 * T13) * T11; - T10 = 0.001742 * T11 * T11; - dT14_dVb = T10 * dT13_dVb; - } - -/* v3.0 bug fix */ -/* T10 = 0.5 * pParam->B4SOIk1eff - / sqrt(phi + pParam->B4SOIketas); */ - T10 = 0.5 * pParam->B4SOIk1ox * Lpe_Vb - / sqrt(phi + pParam->B4SOIketas); /* v4.0 */ - - T1 = T10 * T14; - dT1_dVb = T10 * dT14_dVb; - - T9 = sqrt(pParam->B4SOIxj * Xdep); - tmp1 = Leff + 2.0 * T9; - T5 = Leff / tmp1; - tmp2 = pParam->B4SOIa0 * T5; - tmp3 = pParam->B4SOIweff + pParam->B4SOIb1; - tmp4 = pParam->B4SOIb0 / tmp3; - T2 = tmp2 + tmp4; - dT2_dVb = -T9 * tmp2 / tmp1 / Xdep * dXdep_dVb; - T6 = T5 * T5; - T7 = T5 * T6; - - Abulk0 = 1 + T1 * T2; - dAbulk0_dVb = T1 * dT2_dVb + T2 * dT1_dVb; - - T8 = pParam->B4SOIags * pParam->B4SOIa0 * T7; - dAbulk_dVg = -T1 * T8; - Abulk = Abulk0 + dAbulk_dVg * Vgsteff; - - dAbulk_dVb = dAbulk0_dVb - - T8 * Vgsteff * (dT1_dVb + 3.0 * T1 * dT2_dVb / tmp2); - } - - if (Abulk0 < 0.01) - { - T9 = 1.0 / (3.0 - 200.0 * Abulk0); - Abulk0 = (0.02 - Abulk0) * T9; - dAbulk0_dVb *= T9 * T9; - } - - if (Abulk < 0.01) - { - T9 = 1.0 / (3.0 - 200.0 * Abulk); - Abulk = (0.02 - Abulk) * T9; - dAbulk_dVb *= T9 * T9; - T10 = T9 * T9; /* 3.2 bug fix */ - dAbulk_dVg *= T10; /* 3.2 bug fix */ - } - - here->B4SOIAbulk = Abulk; /*v3.2 for noise */ - -/* Mobility calculation */ - if (model->B4SOImtrlMod) - T14 = 2.0 * model->B4SOItype *(model->B4SOIphig - model->B4SOIeasub - 0.5 * Eg + 0.45); - else - T14 = 0.0; - - if (model->B4SOImobMod == 1) - { T0 = Vgsteff + Vth + Vth - T14; - T2 = ua + uc * Vbseff; - T3 = T0 / toxe; - T5 = T3 * (T2 + ub * T3); - dDenomi_dVg = (T2 + 2.0 * ub * T3) / toxe; - dDenomi_dVd = dDenomi_dVg * 2 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2 * dVth_dVb + uc * T3 ; - if (selfheat) - dDenomi_dT = dDenomi_dVg * 2 * dVth_dT - + (dua_dT + Vbseff * duc_dT - + dub_dT * T3 ) * T3; - else - dDenomi_dT = 0.0; - } - else if (model->B4SOImobMod == 2) - { T5 = (Vgsteff -T14)/ model->B4SOItox * (ua - + uc * Vbseff + ub * (Vgsteff -T14) - / model->B4SOItox); - dDenomi_dVg = (ua + uc * Vbseff - + 2.0 * ub * (Vgsteff -T14) / toxe) - / toxe; - dDenomi_dVd = 0.0; - dDenomi_dVb = (Vgsteff -T14) * uc / toxe ; - if (selfheat) - dDenomi_dT = (Vgsteff -T14) / toxe - * (dua_dT + Vbseff * duc_dT + dub_dT - * (Vgsteff -T14) / toxe); - else - dDenomi_dT = 0.0; - } - else if (model->B4SOImobMod == 3) /* mobMod == 3 */ - { T0 = Vgsteff + Vth + Vth - T14; - T2 = 1.0 + uc * Vbseff; - T3 = T0 / model->B4SOItox; - T4 = T3 * (ua + ub * T3); - T5 = T4 * T2; - dDenomi_dVg = (ua + 2.0 * ub * T3) * T2 - / toxe; - dDenomi_dVd = dDenomi_dVg * 2.0 * dVth_dVd; - dDenomi_dVb = dDenomi_dVg * 2.0 * dVth_dVb - + uc * T4 ; - if (selfheat) - dDenomi_dT = dDenomi_dVg * 2.0 * dVth_dT - + (dua_dT + dub_dT * T3) * T3 * T2 - + T4 * Vbseff * duc_dT; - else - dDenomi_dT = 0.0; - } - else /* mobMod == 4 */ - { - /*univsersal mobility*/ - T0 = (Vgsteff + here->B4SOIvtfbphi1)* 1.0e-8 / toxe/6.0; - T1 = exp(pParam->B4SOIeu * log(T0)); - - dT1_dVg = T1 * pParam->B4SOIeu * 1.0e-8/ T0 / toxe/6.0; - - T2 = pParam->B4SOIua + pParam->B4SOIuc * Vbseff; - - /*Coulombic*/ - pParam->B4SOIucs = pParam->B4SOIucs * pow(TempRatio, pParam->B4SOIucste); - pParam->B4SOIud = pParam->B4SOIud * pow(TempRatio, pParam->B4SOIud1) ; - VgsteffVth = here->B4SOIvgsteffvth; - - /*T10 = exp(pParam->B4SOIucs * log(0.5 + 0.5 * Vgsteff/VgsteffVth));*/ - T10 = exp(pParam->B4SOIucs * log(1.0 + Vgsteff/VgsteffVth)); - T11 = pParam->B4SOIud/T10; - - /*dT11_dVg = - 0.5 * pParam->B4SOIucs * T11 /(0.5 + 0.5*Vgsteff/VgsteffVth)/VgsteffVth;*/ - dT11_dVg = (pParam->B4SOIucs - 1.0)*pParam->B4SOIud/(VgsteffVth* exp((pParam->B4SOIucs-1.0) * log(1.0 + Vgsteff/VgsteffVth))); - - dDenomi_dVg = T2 * dT1_dVg + dT11_dVg; - dDenomi_dVd = 0.0; - dDenomi_dVb = T1 * pParam->B4SOIuc; - - T5 = T1 * T2 + T11; - if (selfheat) - dDenomi_dT = dDenomi_dVg * pParam->B4SOIeu * dVth_dT - + (dua_dT + dub_dT * T3) * T3 * T2 - + T4 * Vbseff * duc_dT; - else - dDenomi_dT = 0.0; - - - } - if (T5 >= -0.8) - { Denomi = 1.0 + T5; - } - else /* Added to avoid the discontinuity problem caused by ua and ub*/ - { T9 = 1.0 / (7.0 + 10.0 * T5); - Denomi = (0.6 + T5) * T9; - T9 *= T9; - dDenomi_dVg *= T9; - dDenomi_dVd *= T9; - dDenomi_dVb *= T9; - if (selfheat) dDenomi_dT *= T9; - else dDenomi_dT = 0.0; - } - - here->B4SOIueff = ueff = u0temp / Denomi; - T9 = -ueff / Denomi; - dueff_dVg = T9 * dDenomi_dVg; - dueff_dVd = T9 * dDenomi_dVd; - dueff_dVb = T9 * dDenomi_dVb; - if (selfheat) dueff_dT = T9 * dDenomi_dT + du0temp_dT / Denomi; - else dueff_dT = 0.0; - -/* Saturation Drain Voltage Vdsat */ - WVCox = Weff * vsattemp * model->B4SOIcox; - WVCoxRds = WVCox * Rds; - -/* dWVCoxRds_dT = WVCox * dRds_dT - + Weff * model->B4SOIcox * Rds * dvsattemp_dT; */ - - Esat = 2.0 * vsattemp / ueff; - EsatL = Esat * Leff; - T0 = -EsatL /ueff; - dEsatL_dVg = T0 * dueff_dVg; - dEsatL_dVd = T0 * dueff_dVd; - dEsatL_dVb = T0 * dueff_dVb; - if (selfheat) - dEsatL_dT = T0 * dueff_dT + EsatL / vsattemp * dvsattemp_dT; - else - dEsatL_dT = 0.0; - - /* Sqrt() */ - a1 = pParam->B4SOIa1; - if (a1 == 0.0) - { Lambda = pParam->B4SOIa2; - dLambda_dVg = 0.0; - } - else if (a1 > 0.0) -/* Added to avoid the discontinuity problem caused by a1 and a2 (Lambda) */ - { T0 = 1.0 - pParam->B4SOIa2; - T1 = T0 - pParam->B4SOIa1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * T0); - Lambda = pParam->B4SOIa2 + T0 - 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2); - } - else - { T1 = pParam->B4SOIa2 + pParam->B4SOIa1 * Vgsteff - 0.0001; - T2 = sqrt(T1 * T1 + 0.0004 * pParam->B4SOIa2); - Lambda = 0.5 * (T1 + T2); - dLambda_dVg = 0.5 * pParam->B4SOIa1 * (1.0 + T1 / T2); - } - - here->B4SOIAbovVgst2Vtm = Abulk /Vgst2Vtm; /* v2.2.3 bug fix */ - - if (Rds > 0) - { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; - tmp3 = dRds_dVb / Rds + dWeff_dVb / Weff; - } - else - { tmp2 = dWeff_dVg / Weff; - tmp3 = dWeff_dVb / Weff; - } - if ((Rds == 0.0) && (Lambda == 1.0)) - { T0 = 1.0 / (Abulk * EsatL + Vgst2Vtm); - tmp1 = 0.0; - T1 = T0 * T0; - T2 = Vgst2Vtm * T0; - T3 = EsatL * Vgst2Vtm; - Vdsat = T3 * T0; - - dT0_dVg = -(Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 1.0) * T1; - dT0_dVd = -(Abulk * dEsatL_dVd) * T1; - dT0_dVb = -(Abulk * dEsatL_dVb + EsatL * dAbulk_dVb) * T1; - if (selfheat) - dT0_dT = -(Abulk * dEsatL_dT + dVgst2Vtm_dT) * T1; - else dT0_dT = 0.0; - - dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0; - dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd; - dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb; - if (selfheat) - dVdsat_dT = T3 * dT0_dT + T2 * dEsatL_dT - + EsatL * T0 * dVgst2Vtm_dT; - else dVdsat_dT = 0.0; - } - else - { tmp1 = dLambda_dVg / (Lambda * Lambda); - T9 = Abulk * WVCoxRds; - T8 = Abulk * T9; - T7 = Vgst2Vtm * T9; - T6 = Vgst2Vtm * WVCoxRds; - T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); - dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1 - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); -/* dT0_dVb = 2.0 * (T8 * tmp3 this is equivalent to one below, but simpler - + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg); */ - dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3) - + (1.0 / Lambda - 1.0) * dAbulk_dVb); - dT0_dVd = 0.0; - - if (selfheat) - { - - if (Rds!=0.0) - tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; - else - tmp4 = dvsattemp_dT / vsattemp; - - dT0_dT = 2.0 * T8 * tmp4; - } else tmp4 = dT0_dT = 0.0; - - T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL - + 3.0 * T7; - - dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1 - + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg - + 3.0 * (T9 + T7 * tmp2 + T6 * dAbulk_dVg); - dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb - + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3); - dT1_dVd = Abulk * dEsatL_dVd; - - - if (selfheat) - { - tmp4 += dVgst2Vtm_dT / Vgst2Vtm; - dT1_dT = (2.0 / Lambda - 1.0) * dVgst2Vtm_dT - + Abulk * dEsatL_dT + 3.0 * T7 * tmp4; - } else dT1_dT = 0.0; - - T2 = Vgst2Vtm * (EsatL + 2.0 * T6); - dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg - + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2); - dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3); - dT2_dVd = Vgst2Vtm * dEsatL_dVd; - if (selfheat) - dT2_dT = Vgst2Vtm * dEsatL_dT + EsatL * dVgst2Vtm_dT - + 2.0 * T6 * (dVgst2Vtm_dT + Vgst2Vtm * tmp4); - else - dT2_dT = 0.0; - - T3 = sqrt(T1 * T1 - 2.0 * T0 * T2); - Vdsat = (T1 - T3) / T0; - - dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2 - - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0; - dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2 - - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0; - dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0; - if (selfheat) - dVdsat_dT = (dT1_dT - (T1 * dT1_dT - dT0_dT * T2 - - T0 * dT2_dT) / T3 - Vdsat * dT0_dT) / T0; - else dVdsat_dT = 0.0; - } - here->B4SOIvdsat = Vdsat; - - -/* Effective Vds (Vdseff) Calculation */ - T1 = Vdsat - Vds - pParam->B4SOIdelta; - dT1_dVg = dVdsat_dVg; - dT1_dVd = dVdsat_dVd - 1.0; - dT1_dVb = dVdsat_dVb; - dT1_dT = dVdsat_dT; - - T2 = sqrt(T1 * T1 + 4.0 * pParam->B4SOIdelta * Vdsat); - T0 = T1 / T2; - T3 = 2.0 * pParam->B4SOIdelta / T2; - dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg; - dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd; - dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb; - if (selfheat) - dT2_dT = T0 * dT1_dT + T3 * dVdsat_dT; - else dT2_dT = 0.0; - - Vdseff = Vdsat - 0.5 * (T1 + T2); - dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); - dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); - dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - if (selfheat) - dVdseff_dT = dVdsat_dT - 0.5 * (dT1_dT + dT2_dT); - else dVdseff_dT = 0.0; - - if (Vdseff > Vds) - Vdseff = Vds; /* This code is added to fixed the problem - caused by computer precision when - Vds is very close to Vdseff. */ - diffVds = Vds - Vdseff; - here->B4SOIVdseff = Vdseff; /* v2.2.3 bug fix */ - -/* Calculate VAsat */ - tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; - T9 = WVCoxRds * Vgsteff; - T8 = T9 / Vgst2Vtm; - T0 = EsatL + Vdsat + 2.0 * T9 * tmp4; - - T7 = 2.0 * WVCoxRds * tmp4; - dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff) - - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm - + Vdsat * dAbulk_dVg); - - dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff - - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb); - dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd; - - if (selfheat) - { - - if (Rds!=0.0) - tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp; - else tmp4 = dvsattemp_dT / vsattemp; - - dT0_dT = dEsatL_dT + dVdsat_dT + T7 * tmp4 * Vgsteff - - T8 * (Abulk * dVdsat_dT - Abulk * Vdsat * dVgst2Vtm_dT - / Vgst2Vtm); - } else - dT0_dT = 0.0; - - T9 = WVCoxRds * Abulk; - T1 = 2.0 / Lambda - 1.0 + T9; - dT1_dVg = -2.0 * tmp1 + WVCoxRds * (Abulk * tmp2 + dAbulk_dVg); - dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3; - if (selfheat) - dT1_dT = T9 * tmp4; - else - dT1_dT = 0.0; - - Vasat = T0 / T1; - dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1; - dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1; - dVasat_dVd = dT0_dVd / T1; - if (selfheat) dVasat_dT = (dT0_dT - Vasat * dT1_dT) / T1; - else dVasat_dT = 0.0; - -/* Calculate VACLM */ - if ((pParam->B4SOIpclm > 0.0) && (diffVds > 1.0e-10)) - { T0 = 1.0 / (pParam->B4SOIpclm * Abulk * pParam->B4SOIlitl); - dT0_dVb = -T0 / Abulk * dAbulk_dVb; - dT0_dVg = -T0 / Abulk * dAbulk_dVg; - - T2 = Vgsteff / EsatL; - T1 = Leff * (Abulk + T2); - dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg); - dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL); - dT1_dVd = -T2 * dEsatL_dVd / Esat; - if (selfheat) dT1_dT = -T2 * dEsatL_dT / Esat; - else dT1_dT = 0.0; - - T9 = T0 * T1; - VACLM = T9 * diffVds; - dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg - + T1 * diffVds * dT0_dVg; - dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds - - T9 * dVdseff_dVb; - dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd); - if (selfheat) - dVACLM_dT = T0 * dT1_dT * diffVds - T9 * dVdseff_dT; - else dVACLM_dT = 0.0; - - } - else - { VACLM = MAX_EXPL; - dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = dVACLM_dT = 0.0; - } - - -/* Calculate VADIBL */ - if (pParam->B4SOIthetaRout > 0.0) - { T8 = Abulk * Vdsat; - T0 = Vgst2Vtm * T8; - T1 = Vgst2Vtm + T8; - dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8 - + Vgst2Vtm * Vdsat * dAbulk_dVg; - dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg; - dT1_dVb = dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb; - dT0_dVb = Vgst2Vtm * dT1_dVb; - dT1_dVd = Abulk * dVdsat_dVd; - dT0_dVd = Vgst2Vtm * dT1_dVd; - if (selfheat) - { - dT0_dT = dVgst2Vtm_dT * T8 + Abulk * Vgst2Vtm * dVdsat_dT; - dT1_dT = dVgst2Vtm_dT + Abulk * dVdsat_dT; - } else - dT0_dT = dT1_dT = 0.0; - - T9 = T1 * T1; - T2 = pParam->B4SOIthetaRout; - VADIBL = (Vgst2Vtm - T0 / T1) / T2; - dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2; - dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2; - dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2; - if (selfheat) - dVADIBL_dT = (dVgst2Vtm_dT - dT0_dT/T1 + T0*dT1_dT/T9) / T2; - else dVADIBL_dT = 0.0; - - T7 = pParam->B4SOIpdiblb * Vbseff; - if (T7 >= -0.9) - { T3 = 1.0 / (1.0 + T7); - VADIBL *= T3; - dVADIBL_dVg *= T3; - dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->B4SOIpdiblb) - * T3; - dVADIBL_dVd *= T3; - if (selfheat) dVADIBL_dT *= T3; - else dVADIBL_dT = 0.0; - } - else -/* Added to avoid the discontinuity problem caused by pdiblcb */ - { T4 = 1.0 / (0.8 + T7); - T3 = (17.0 + 20.0 * T7) * T4; - dVADIBL_dVg *= T3; - dVADIBL_dVb = dVADIBL_dVb * T3 - - VADIBL * pParam->B4SOIpdiblb * T4 * T4; - dVADIBL_dVd *= T3; - if (selfheat) dVADIBL_dT *= T3; - else dVADIBL_dT = 0.0; - VADIBL *= T3; - } - } - else - { VADIBL = MAX_EXPL; - dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = dVADIBL_dT = 0.0; - } - -/* v4.0 DITS */ - T0 = pParam->B4SOIpditsd * Vds; - if (T0 > EXPL_THRESHOLD) - { T1 = MAX_EXPL; - dT1_dVd = 0; - } - else - { T1 = exp(T0); - dT1_dVd = T1 * pParam->B4SOIpditsd; - } - if (pParam->B4SOIpdits > MIN_EXPL) - { T2 = 1.0 + model->B4SOIpditsl * Leff; - VADITS = (1.0 + T2 * T1) / pParam->B4SOIpdits; - dVADITS_dVg = VADITS * dFP_dVg; - dVADITS_dVd = FP * T2 * dT1_dVd / pParam->B4SOIpdits; - VADITS *= FP; - if (selfheat) dVADITS_dT = VADITS * dFP_dT / FP; - else dVADITS_dT = 0.0; - } - else - { VADITS = MAX_EXPL; - dVADITS_dVg = dVADITS_dVd = dVADITS_dT = 0; - } - -/* Calculate VA */ - - T8 = pParam->B4SOIpvag / EsatL; - T9 = T8 * Vgsteff; - if (T9 > -0.9) - { T0 = 1.0 + T9; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL); - dT0_dVb = -T9 * dEsatL_dVb / EsatL; - dT0_dVd = -T9 * dEsatL_dVd / EsatL; - if (selfheat) - dT0_dT = -T9 * dEsatL_dT / EsatL; - else - dT0_dT = 0.0; - } - else /* Added to avoid the discontinuity problems caused by pvag */ - { T1 = 1.0 / (17.0 + 20.0 * T9); - T0 = (0.8 + T9) * T1; - T1 *= T1; - dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1; - - T9 *= T1 / EsatL; - dT0_dVb = -T9 * dEsatL_dVb; - dT0_dVd = -T9 * dEsatL_dVd; - if (selfheat) - dT0_dT = -T9 * dEsatL_dT; - else - dT0_dT = 0.0; - } - - tmp1 = VACLM * VACLM; - tmp2 = VADIBL * VADIBL; - tmp3 = VACLM + VADIBL; - - T1 = VACLM * VADIBL / tmp3; - tmp3 *= tmp3; - dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3; - dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3; - dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3; - if (selfheat) - dT1_dT = (tmp1 * dVADIBL_dT + tmp2 * dVACLM_dT ) / tmp3; - else dT1_dT = 0.0; - - /* v4.0 adding DITS */ - tmp1 = T1 * T1; - tmp2 = VADITS * VADITS; - tmp3 = T1 + VADITS; - T2 = T1 * VADITS / tmp3; - tmp3 *= tmp3; - dT2_dVg = (tmp1 * dVADITS_dVg + tmp2 * dT1_dVg) / tmp3; - dT2_dVd = (tmp1 * dVADITS_dVd + tmp2 * dT1_dVd) / tmp3; - dT2_dVb = ( tmp2 * dT1_dVb) / tmp3; - if (selfheat) - dT2_dT = (tmp1 * dVADITS_dT + tmp2 * dT1_dT ) / tmp3; - else dT2_dT = 0.0; - -/* - Va = Vasat + T0 * T1; - dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg; - dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd; - dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb; - if (selfheat) - dVa_dT = dVasat_dT + T1 * dT0_dT + T0 * dT1_dT; - else dVa_dT = 0.0; -*/ -/* v4.0 */ - Va = Vasat + T0 * T2; - dVa_dVg = dVasat_dVg + T2 * dT0_dVg + T0 * dT2_dVg; - dVa_dVd = dVasat_dVd + T2 * dT0_dVd + T0 * dT2_dVd; - dVa_dVb = dVasat_dVb + T2 * dT0_dVb + T0 * dT2_dVb; - if (selfheat) - dVa_dT = dVasat_dT + T2 * dT0_dT + T0 * dT2_dT; - else dVa_dT = 0.0; - -/* Calculate Ids */ - CoxWovL = model->B4SOIcox * Weff / Leff; - beta = ueff * CoxWovL; - dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff ; - dbeta_dVd = CoxWovL * dueff_dVd; - dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff ; - if (selfheat) dbeta_dT = CoxWovL * dueff_dT; - else dbeta_dT = 0.0; - - T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm; - dT0_dVg = -0.5 * (Abulk * dVdseff_dVg - - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm; - dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm; - dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff) - / Vgst2Vtm; - if (selfheat) - dT0_dT = -0.5 * (Abulk * dVdseff_dT - - Abulk * Vdseff / Vgst2Vtm * dVgst2Vtm_dT) - / Vgst2Vtm; - else dT0_dT = 0.0; - - fgche1 = Vgsteff * T0; - dfgche1_dVg = Vgsteff * dT0_dVg + T0; - dfgche1_dVd = Vgsteff * dT0_dVd; - dfgche1_dVb = Vgsteff * dT0_dVb; - if (selfheat) dfgche1_dT = Vgsteff * dT0_dT; - else dfgche1_dT = 0.0; - - T9 = Vdseff / EsatL; - fgche2 = 1.0 + T9; - dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL; - dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL; - dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL; - if (selfheat) dfgche2_dT = (dVdseff_dT - T9 * dEsatL_dT) / EsatL; - else dfgche2_dT = 0.0; - - gche = beta * fgche1 / fgche2; - dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg - - gche * dfgche2_dVg) / fgche2; - dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd - - gche * dfgche2_dVd) / fgche2; - dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb - - gche * dfgche2_dVb) / fgche2; - if (selfheat) - dgche_dT = (beta * dfgche1_dT + fgche1 * dbeta_dT - - gche * dfgche2_dT) / fgche2; - else dgche_dT = 0.0; - - T0 = 1.0 + gche * Rds; - T9 = Vdseff / T0; - Idl = gche * T9; - IdlovVdseff = gche / T0; - -/* Whoa, these formulas for the derivatives of Idl are convoluted, but I - verified them to be correct */ - - dIdl_dVg = (gche * dVdseff_dVg + T9 * dgche_dVg) / T0 - - Idl * gche / T0 * dRds_dVg ; - dIdl_dVd = (gche * dVdseff_dVd + T9 * dgche_dVd) / T0; - dIdl_dVb = (gche * dVdseff_dVb + T9 * dgche_dVb - - Idl * dRds_dVb * gche) / T0; - if (selfheat) - dIdl_dT = (gche * dVdseff_dT + T9 * dgche_dT - - Idl * dRds_dT * gche) / T0; - else dIdl_dT = 0.0; - - T9 = diffVds / Va; - T0 = 1.0 + T9; - here->B4SOIids = Ids = Idl * T0 / here->B4SOInseg; - - here->B4SOIidovVds = IdlovVdseff * T0 / here->B4SOInseg; - /* v4.0 bug fix */ - IdovVds = IdlovVdseff * T0 / here->B4SOInseg; /* v4.0 */ - - Gm0 = T0 * dIdl_dVg - Idl * (dVdseff_dVg + T9 * dVa_dVg) / Va; - Gds0 = T0 * dIdl_dVd + Idl * (1.0 - dVdseff_dVd - - T9 * dVa_dVd) / Va; - Gmb0 = T0 * dIdl_dVb - Idl * (dVdseff_dVb + T9 * dVa_dVb) / Va; - Gmc = 0.0; - - if (selfheat) - GmT0 = T0 * dIdl_dT - Idl * (dVdseff_dT + T9 * dVa_dT) / Va; - else GmT0 = 0.0; - -/* This includes all dependencies from Vgsteff, Vbseff */ - - Gm = (Gm0 * dVgsteff_dVg+ Gmb0 * dVbseff_dVg) / here->B4SOInseg; /* v3.0 */ - Gmb = (Gm0 * dVgsteff_dVb + Gmb0 * dVbseff_dVb) / here->B4SOInseg; - Gds = (Gm0 * dVgsteff_dVd+ Gmb0 * dVbseff_dVd + Gds0) / here->B4SOInseg; /* v3.0 */ - Gme = (Gm0 * dVgsteff_dVe + Gmb0 * dVbseff_dVe) / here->B4SOInseg; /* v3.0 */ - if (selfheat) - GmT = (Gm0 * dVgsteff_dT + Gmb0 * dVbseff_dT + GmT0) / here->B4SOInseg; /* v3.0 */ - else GmT = 0.0; - - -/* v3.1 */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - /* calculate GISL/GIDL current */ - /*4.1*/ - if(model->B4SOImtrlMod == 0) - T0 = 3.0 * 3.9 / epsrox * toxe; - else - T0 = model->B4SOIepsrsub * toxe / epsrox; - - - if (model->B4SOIgidlMod==0) - { - if (model->B4SOImtrlMod==0) - T1 = (- Vds - Vgs_eff - egisl) / T0; - else - T1 = (- Vds - Vgs_eff - egisl+pParam->B4SOIvfbsd) / T0; - - /* GISL */ - if ((agisl <= 0.0) || - (bgisl <= 0.0) || (T1 <= 0.0) || - (cgisl < 0.0) || (Vbd > 0.0) ) - Igisl = Ggisls = Ggislg = Ggislb = 0.0; - - else { - dT1_dVd = 1 / T0; - dT1_dVg = - dT1_dVd * dVgs_eff_dVg; - T2 = bgisl / T1; - if (T2 < EXPL_THRESHOLD) - { - Igisl = wdios * agisl * T1 * exp(-T2); - T3 = Igisl / T1 * (T2 + 1); - Ggisls = T3 * dT1_dVd; - Ggisls = T3 * dT1_dVg; - } else - { - T3 = wdios * agisl * MIN_EXPL; - Igisl = T3 * T1 ; - Ggisls = T3 * dT1_dVd; - Ggislg = T3 * dT1_dVg; - } - if(cgisl >= MIN_EXPL) { - T4 = Vbs * Vbs; - T5 = -Vbs * T4; - T6 = cgisl + T5; - T7 = T5 / T6; - T8 = 3.0 * cgisl * T4 / T6 / T6; - Ggisls = Ggisls * T7 + Igisl * T8; - Ggislg = Ggislg * T7; - Ggislb = -Igisl * T8; - Igisl *= T7; - } else - Ggislb = 0.0; + T5 = kgidl/T4; + T6 = exp(T5); + if (T6B4SOIigidl = Igidl; + /* End of GIDL */ + } - here->B4SOIigisl = Igisl; - /* End of GISL */ - - if (model->B4SOImtrlMod==0) - T1 = (Vds - Vgs_eff - egidl) / T0; - else - T1 = (Vds - Vgs_eff - egidl+pParam->B4SOIvfbsd) / T0; - - /* GIDL */ - if ((agidl <= 0.0) || - (bgidl <= 0.0) || (T1 <= 0.0) || - (cgidl < 0.0) || (Vbd > 0.0) ) - Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; - - else { - dT1_dVd = 1 / T0; - dT1_dVg = - dT1_dVd * dVgs_eff_dVg; - T2 = bgidl / T1; - if (T2 < EXPL_THRESHOLD) - { - Igidl = wdiod * agidl * T1 * exp(-T2); - T3 = Igidl / T1 * (T2 + 1); - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - } else - { - T3 = wdiod * agidl * MIN_EXPL; - Igidl = T3 * T1 ; - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - } - if(cgidl >= MIN_EXPL) { - T4 = Vbd * Vbd; - T5 = -Vbd * T4; - T6 = cgidl + T5; - T7 = T5 / T6; - T8 = 3.0 * cgidl * T4 / T6 / T6; - Ggidld = Ggidld * T7 + Igidl * T8; - Ggidlg = Ggidlg * T7; - Ggidlb = -Igidl * T8; - Igidl *= T7; - } else - Ggidlb = 0.0; + + + + + + /* calculate diode and BJT current */ + WsTsi = wdios * model->B4SOItsi; + WdTsi = wdiod * model->B4SOItsi; + /* NVtm1 = Vtm * pParam->B4SOIndiode; v4.2 bugfix */ + NVtm1 = Vtm * ndiode; + if (selfheat) + /*dNVtm1_dT = pParam->B4SOIndiode * dVtm_dT; v4.2 bugfix */ + dNVtm1_dT = ndiode * dVtm_dT; + else + dNVtm1_dT = 0; + T0 = vbs_jct / NVtm1; /* v4.0 */ + dT0_dVb = 1.0 / NVtm1; + if (selfheat) + dT0_dT = -vbs_jct / NVtm1 / NVtm1 * dNVtm1_dT; + else + dT0_dT = 0; + DEXP(T0, ExpVbsNVtm, T1); + dExpVbsNVtm_dVb = T1 * dT0_dVb; + if (selfheat) + dExpVbsNVtm_dT = T1 * dT0_dT; + else + dExpVbsNVtm_dT = 0; + /* NVtm1 = Vtm * pParam->B4SOIndioded; v4.2 bugfix */ + NVtm1 = Vtm * ndioded; /* v4.0 drain side */ + if (selfheat) + /*dNVtm1_dT = pParam->B4SOIndioded* dVtm_dT; v4.2 bugfix */ + dNVtm1_dT = ndioded * dVtm_dT; + else + dNVtm1_dT = 0; + T0 = vbd_jct / NVtm1; /* v4.0 */ + dT0_dVb = 1.0 / NVtm1; + dT0_dVd = -dT0_dVb; + if (selfheat) + dT0_dT = -vbd_jct / NVtm1 / NVtm1 * dNVtm1_dT; + else + dT0_dT = 0; + DEXP(T0, ExpVbdNVtm, T1); + dExpVbdNVtm_dVb = T1 * dT0_dVb; + dExpVbdNVtm_dVd = -dExpVbdNVtm_dVb; + if (selfheat) + dExpVbdNVtm_dT = T1 * dT0_dT; + else + dExpVbdNVtm_dT = 0; + + /* Ibs1: diffusion current */ + if (jdifs == 0) { + Ibs1 = dIbs1_dVb = dIbs1_dT = 0; } - here->B4SOIigidl = Igidl; - /* End of GIDL*/ - } - else - { - if (model->B4SOImtrlMod==0) - T1 = (-Vds - rgisl*Vgs_eff - pParam->B4SOIegisl) / T0; - else - T1 = (-Vds - rgisl*Vgs_eff - pParam->B4SOIegisl+pParam->B4SOIvfbsd) / T0; - - /* GISL */ - - if ((agisl <= 0.0) || - (bgisl <= 0.0) || (T1 <= 0.0) || - (cgisl < 0.0) ) - Igisl = Ggisls = Ggislg = Ggislb = 0.0; - else - { - dT1_dVd = 1 / T0; - dT1_dVg = - rgisl*dT1_dVd * dVgs_eff_dVg; - T2 = bgisl / T1; - if (T2 < EXPL_THRESHOLD) - { - Igisl = wdios * agisl * T1 * exp(-T2); - T3 = Igisl / T1 * (T2 + 1); - Ggisls = T3 * dT1_dVd; - Ggislg = T3 * dT1_dVg; - } else - { - T3 = wdios * agisl * MIN_EXPL; - Igisl = T3 * T1 ; - Ggisls = T3 * dT1_dVd; - Ggislg = T3 * dT1_dVg; - } - T4 = Vbs - fgisl; - if (T4==0) - T5 =1; - else - T5 = kgisl/T4; - T6 = exp(T5); - if (T6B4SOIigisl = Igisl; - /* End of GISL */ - if (model->B4SOImtrlMod==0) - T1 = (Vds - rgidl*Vgs_eff - pParam->B4SOIegidl) / T0; - else - T1 = (Vds - rgidl*Vgs_eff - pParam->B4SOIegidl+pParam->B4SOIvfbsd) / T0; - /* GIDL */ - if ((agidl <= 0.0) || - (bgidl <= 0.0) || (T1 <= 0.0) || - (cgidl < 0.0) ) - Igidl = Ggidld = Ggidlg = Ggidlb = 0.0; - else - { - dT1_dVd = 1 / T0; - dT1_dVg = - rgidl*dT1_dVd * dVgs_eff_dVg; - T2 = bgidl / T1; - if (T2 < EXPL_THRESHOLD) - { - Igidl = wdiod * agidl * T1 * exp(-T2); - T3 = Igidl / T1 * (T2 + 1); - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - } else - { - T3 = wdiod * agidl * MIN_EXPL; - Igidl = T3 * T1 ; - Ggidld = T3 * dT1_dVd; - Ggidlg = T3 * dT1_dVg; - } - T4 = Vbd - fgidl; - if (T4==0) - T5 =1; - else - T5 = kgidl/T4; - T6 = exp(T5); - if (T6B4SOIigidl = Igidl; - /* End of GIDL */ - - } - - - - - - /* calculate diode and BJT current */ - WsTsi = wdios * model->B4SOItsi; - WdTsi = wdiod * model->B4SOItsi; - - NVtm1 = Vtm * pParam->B4SOIndiode; - if (selfheat) - dNVtm1_dT = pParam->B4SOIndiode * dVtm_dT; - else - dNVtm1_dT = 0; - - T0 = vbs_jct / NVtm1; /* v4.0 */ - dT0_dVb = 1.0 / NVtm1; - if (selfheat) - dT0_dT = -vbs_jct / NVtm1 / NVtm1 * dNVtm1_dT; - else + else { + T0 = WsTsi * jdifs; + if (selfheat) + dT0_dT = WsTsi * djdifs_dT; + else dT0_dT = 0; - DEXP(T0, ExpVbsNVtm, T1); - dExpVbsNVtm_dVb = T1 * dT0_dVb; - if (selfheat) - dExpVbsNVtm_dT = T1 * dT0_dT; - else - dExpVbsNVtm_dT = 0; - - NVtm1 = Vtm * pParam->B4SOIndioded; /* v4.0 drain side */ - if (selfheat) - dNVtm1_dT = pParam->B4SOIndioded* dVtm_dT; - else - dNVtm1_dT = 0; - T0 = vbd_jct / NVtm1; /* v4.0 */ - - dT0_dVb = 1.0 / NVtm1; - dT0_dVd = -dT0_dVb; - if (selfheat) - dT0_dT = -vbd_jct / NVtm1 / NVtm1 * dNVtm1_dT; - else + Ibs1 = T0 * (ExpVbsNVtm - 1); + dIbs1_dVb = T0 * dExpVbsNVtm_dVb; + if (selfheat) + dIbs1_dT = T0 * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dT0_dT; + else + dIbs1_dT = 0; + } + + /* Ibd1: diffusion current */ + if (jdifd == 0) { + Ibd1 = dIbd1_dVb = dIbd1_dVd = dIbd1_dT = 0; + } + else { + T0 = WdTsi * jdifd; + + if (selfheat) + dT0_dT = WdTsi * djdifd_dT; + else dT0_dT = 0; - DEXP(T0, ExpVbdNVtm, T1); - dExpVbdNVtm_dVb = T1 * dT0_dVb; - dExpVbdNVtm_dVd = -dExpVbdNVtm_dVb; - if (selfheat) - dExpVbdNVtm_dT = T1 * dT0_dT; - else - dExpVbdNVtm_dT = 0; - - /* Ibs1: diffusion current */ - if (jdifs == 0) { - Ibs1 = dIbs1_dVb = dIbs1_dT = 0; - } - else { - T0 = WsTsi * jdifs; - if (selfheat) - dT0_dT = WsTsi * djdifs_dT; - else - dT0_dT = 0; - Ibs1 = T0 * (ExpVbsNVtm - 1); - dIbs1_dVb = T0 * dExpVbsNVtm_dVb; - if (selfheat) - dIbs1_dT = T0 * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dT0_dT; - else - dIbs1_dT = 0; - } - - /* Ibd1: diffusion current */ - if (jdifd == 0) { - Ibd1 = dIbd1_dVb = dIbd1_dVd = dIbd1_dT = 0; - } - else { - T0 = WdTsi * jdifd; + Ibd1 = T0 * (ExpVbdNVtm - 1); + dIbd1_dVb = T0 * dExpVbdNVtm_dVb; + dIbd1_dVd = -dIbd1_dVb; + if (selfheat) + dIbd1_dT = T0 * dExpVbdNVtm_dT + (ExpVbdNVtm -1) + * dT0_dT; + else + dIbd1_dT = 0; + } - if (selfheat) - dT0_dT = WdTsi * djdifd_dT; - else - dT0_dT = 0; - Ibd1 = T0 * (ExpVbdNVtm - 1); - dIbd1_dVb = T0 * dExpVbdNVtm_dVb; - dIbd1_dVd = -dIbd1_dVb; - if (selfheat) - dIbd1_dT = T0 * dExpVbdNVtm_dT + (ExpVbdNVtm -1) - * dT0_dT; - else - dIbd1_dT = 0; - } - - - /* Ibs2:recombination/trap-assisted tunneling current */ - - if (jrecs == 0) { - Ibs2 = dIbs2_dVb = dIbs2_dT = 0; - } - else { - /* forward bias */ - NVtmf = 0.026 * pParam->B4SOInrecf0 - * (1 + pParam->B4SOIntrecf * (TempRatio - 1)); - NVtmr = 0.026 * pParam->B4SOInrecr0 - * (1 + pParam->B4SOIntrecr * (TempRatio - 1)); - if (selfheat) { - dNVtmf_dT = pParam->B4SOInrecf0 * 0.026 - * pParam->B4SOIntrecf * dTempRatio_dT; - dNVtmr_dT = pParam->B4SOInrecr0 * 0.026 - * pParam->B4SOIntrecr * dTempRatio_dT; - } - else - dNVtmf_dT = dNVtmr_dT = 0; - - T0 = vbs_jct / NVtmf; /* v4.0 */ - DEXP(T0,T10,T2); - T4 = 1 / NVtmf; - dT10_dVb = T4 * T2; - if (selfheat) - dT10_dT = - T4 * T2 * vbs_jct / NVtmf * dNVtmf_dT ; - else dT10_dT = 0.0; - /* reverse bias */ - if ((pParam->B4SOIvrec0 - vbs_jct) < 1e-3) { + /* Ibs2:recombination/trap-assisted tunneling current */ + + if (jrecs == 0) { + Ibs2 = dIbs2_dVb = dIbs2_dT = 0; + } + else { + /* forward bias */ + NVtmf = 0.026 * nrecf0s /* bugfix_snps for DC swapping*/ + * (1 + pParam->B4SOIntrecf * (TempRatio - 1)); + NVtmr = 0.026 * nrecr0s /* bugfix_snps for DC swapping*/ + * (1 + pParam->B4SOIntrecr * (TempRatio - 1)); + if (selfheat) { + dNVtmf_dT = nrecf0s * 0.026 /* bugfix_snps for DC swapping*/ + * pParam->B4SOIntrecf * dTempRatio_dT; + dNVtmr_dT = nrecr0s * 0.026 /* bugfix_snps for DC swapping*/ + * pParam->B4SOIntrecr * dTempRatio_dT; + } + else + dNVtmf_dT = dNVtmr_dT = 0; + + T0 = vbs_jct / NVtmf; /* v4.0 */ + DEXP(T0,T10,T2); + T4 = 1 / NVtmf; + dT10_dVb = T4 * T2; + if (selfheat) + dT10_dT = - T4 * T2 * vbs_jct / NVtmf * dNVtmf_dT ; + else dT10_dT = 0.0; + + /* reverse bias */ + if ((vrec0s- vbs_jct) < 1e-3) { /* bugfix_snps for DC swapping*/ /* v2.2.3 bug fix */ - T1 = 1e3; - T0 = -vbs_jct / NVtmr * pParam->B4SOIvrec0 * T1; - T11 = -exp(T0); + T1 = 1e3; + T0 = -vbs_jct / NVtmr * vrec0s * T1; /* bugfix_snps for DC swapping*/ + T11 = -exp(T0); - dT11_dVb = dT11_dT = 0; - } - else { - T1 = 1 / (pParam->B4SOIvrec0 - vbs_jct); - T0 = -vbs_jct / NVtmr * pParam->B4SOIvrec0 * T1; - dT0_dVb = -pParam->B4SOIvrec0 / NVtmr * - (T1 + vbs_jct * T1 * T1) ; - if (selfheat) - dT0_dT = -T0 / NVtmr * dNVtmr_dT; - else dT0_dT = 0; - - DEXP(T0, T11, T2); - T11 = -T11; - dT11_dVb = -T2 * dT0_dVb; - if (selfheat) - dT11_dT = -T2 * dT0_dT; - else dT11_dT = 0; - } - T3 = WsTsi * jrecs; - Ibs2 = T3 * (T10 + T11); - dIbs2_dVb = T3 * (dT10_dVb + dT11_dVb); + dT11_dVb = dT11_dT = 0; + } + else { + T1 = 1 / (vrec0s - vbs_jct); /* bugfix_snps for DC swapping*/ + T0 = -vbs_jct / NVtmr * vrec0s * T1; /* bugfix_snps for DC swapping*/ + dT0_dVb = -vrec0s / NVtmr * /* bugfix_snps for DC swapping*/ + (T1 + vbs_jct * T1 * T1) ; if (selfheat) - dIbs2_dT = T3 * (dT10_dT + dT11_dT) - + WsTsi * (T10 + T11) * djrecs_dT; - else dIbs2_dT = 0; - - } - - if (jrecd == 0) { - Ibd2 = dIbd2_dVb = dIbd2_dVd = dIbd2_dT = 0; - } - else { - NVtmf = 0.026 * pParam->B4SOInrecf0d - * (1 + pParam->B4SOIntrecf * (TempRatio - 1)); - NVtmr = 0.026 * pParam->B4SOInrecr0d - * (1 + pParam->B4SOIntrecr * (TempRatio - 1)); - if (selfheat) { - dNVtmf_dT = pParam->B4SOInrecf0d * 0.026 - * pParam->B4SOIntrecf * dTempRatio_dT; - dNVtmr_dT = pParam->B4SOInrecr0d * 0.026 - * pParam->B4SOIntrecr * dTempRatio_dT; - } - else - dNVtmf_dT = dNVtmr_dT = 0; + dT0_dT = -T0 / NVtmr * dNVtmr_dT; + else dT0_dT = 0; - T0 = vbd_jct / NVtmf; - DEXP(T0,T10,T2); - T4 = 1 / NVtmf; - dT10_dVb = T4 * T2; + DEXP(T0, T11, T2); + T11 = -T11; + dT11_dVb = -T2 * dT0_dVb; if (selfheat) - dT10_dT = - T4 * T2 * vbd_jct / NVtmf * dNVtmf_dT ; - else dT10_dT = 0.0; + dT11_dT = -T2 * dT0_dT; + else dT11_dT = 0; + } + T3 = WsTsi * jrecs; + Ibs2 = T3 * (T10 + T11); + dIbs2_dVb = T3 * (dT10_dVb + dT11_dVb); + if (selfheat) + dIbs2_dT = T3 * (dT10_dT + dT11_dT) + + WsTsi * (T10 + T11) * djrecs_dT; + else dIbs2_dT = 0; - if ((pParam->B4SOIvrec0d - vbd_jct) < 1e-3) { + } + + if (jrecd == 0) { + Ibd2 = dIbd2_dVb = dIbd2_dVd = dIbd2_dT = 0; + } + else { + NVtmf = 0.026 * nrecf0d /* bugfix_snps for DC swapping*/ + * (1 + pParam->B4SOIntrecf * (TempRatio - 1)); + NVtmr = 0.026 * nrecr0d /* bugfix_snps for DC swapping*/ + * (1 + pParam->B4SOIntrecr * (TempRatio - 1)); + if (selfheat) { + dNVtmf_dT = nrecf0d * 0.026 /*bugfix_snps for DC swapping*/ + * pParam->B4SOIntrecf * dTempRatio_dT; + dNVtmr_dT = nrecr0d * 0.026 + * pParam->B4SOIntrecr * dTempRatio_dT; /* bugfix_snps for DC swapping*/ + } + else + dNVtmf_dT = dNVtmr_dT = 0; + + T0 = vbd_jct / NVtmf; + DEXP(T0,T10,T2); + T4 = 1 / NVtmf; + dT10_dVb = T4 * T2; + if (selfheat) + dT10_dT = - T4 * T2 * vbd_jct / NVtmf * dNVtmf_dT ; + else dT10_dT = 0.0; + + if ((vrec0d - vbd_jct) < 1e-3) { /* bugfix_snps for DC swapping*/ /* v2.2.3 bug fix */ - T1 = 1e3; - T0 = -vbd_jct / NVtmr * pParam->B4SOIvrec0d * T1; - T11 = -exp(T0); + T1 = 1e3; + T0 = -vbd_jct / NVtmr * vrec0d * T1; /* bugfix_snps for DC swapping*/ + T11 = -exp(T0); - dT11_dVb = dT11_dT = 0; - } - else { - T1 = 1 / (pParam->B4SOIvrec0d - vbd_jct); - T0 = -vbd_jct / NVtmr * pParam->B4SOIvrec0d * T1; - dT0_dVb = -pParam->B4SOIvrec0d / NVtmr - * (T1 + vbd_jct * T1 * T1) ; - if (selfheat) - dT0_dT = -T0 / NVtmr * dNVtmr_dT; - else - dT0_dT = 0; - DEXP(T0, T11, T2); - T11 = - T11; - dT11_dVb = -T2 * dT0_dVb; - if (selfheat) - dT11_dT = -T2 * dT0_dT; - else - dT11_dT = 0; - } - T3 = WdTsi * jrecd; - Ibd2 = T3 * (T10 + T11); - dIbd2_dVb = T3 * (dT10_dVb + dT11_dVb); - dIbd2_dVd = -dIbd2_dVb; + dT11_dVb = dT11_dT = 0; + } + else { + T1 = 1 / (vrec0d - vbd_jct); /* bugfix_snps for DC swapping*/ + T0 = -vbd_jct / NVtmr * vrec0d * T1; /* bugfix_snps for DC swapping*/ + dT0_dVb = -vrec0d / NVtmr /* bugfix_snps for DC swapping*/ + * (T1 + vbd_jct * T1 * T1) ; if (selfheat) - dIbd2_dT = T3 * (dT10_dT + dT11_dT) - + WdTsi * (T10 + T11) * djrecd_dT; + dT0_dT = -T0 / NVtmr * dNVtmr_dT; else - dIbd2_dT = 0; - } - - /* Ibs3/Ibd3: recombination current in neutral body */ - WTsi = pParam->B4SOIweff / here->B4SOInseg * model->B4SOItsi; - if (jbjts == 0.0 && jbjtd == 0.0) - { - Ibs3 = dIbs3_dVb = dIbs3_dVd = dIbs3_dT = 0.0; - Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0.0; - Ibsdif = dIbsdif_dVb = dIbsdif_dT = 0; - Ibddif = dIbddif_dVb = dIbddif_dVd = dIbddif_dT = 0; - here->B4SOIic = Ic = Gcd = Gcb = GcT = 0.0; - } - else { - Ien = WTsi * jbjts * pParam->B4SOIlratio; + dT0_dT = 0; + DEXP(T0, T11, T2); + T11 = - T11; + dT11_dVb = -T2 * dT0_dVb; if (selfheat) - dIen_dT = WTsi * djbjts_dT * pParam->B4SOIlratio; + dT11_dT = -T2 * dT0_dT; else - dIen_dT = 0; + dT11_dT = 0; + } + T3 = WdTsi * jrecd; + Ibd2 = T3 * (T10 + T11); + dIbd2_dVb = T3 * (dT10_dVb + dT11_dVb); + dIbd2_dVd = -dIbd2_dVb; + if (selfheat) + dIbd2_dT = T3 * (dT10_dT + dT11_dT) + + WdTsi * (T10 + T11) * djrecd_dT; + else + dIbd2_dT = 0; + } - /* high level injection of source side */ - if ((Ehlis = Ahlis * (ExpVbsNVtm - 1)) < 1e-5) { - Ehlis = dEhlis_dVb = dEhlis_dT = 0; - EhlisFactor = 1; - dEhlisFactor_dVb = dEhlisFactor_dT = 0; - } - else { - dEhlis_dVb = Ahlis * dExpVbsNVtm_dVb; - if (selfheat) - dEhlis_dT = Ahlis * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dAhlis_dT; - else - dEhlis_dT = 0; - EhlisFactor = 1.0 / sqrt(1 + Ehlis); - T0 = -0.5 * EhlisFactor / (1 + Ehlis); - dEhlisFactor_dVb = T0 * dEhlis_dVb; - if (selfheat) - dEhlisFactor_dT = T0 * dEhlis_dT; - else - dEhlisFactor_dT = 0; - } - - /* high level injection of drain side */ - if ((Ehlid = Ahlid * (ExpVbdNVtm - 1)) < 1e-5) { - Ehlid = dEhlid_dVb = dEhlid_dVd = dEhlid_dT = 0; - EhlidFactor = 1; - dEhlidFactor_dVb = dEhlidFactor_dVd = dEhlidFactor_dT = 0; - } - else { - dEhlid_dVb = Ahlid * dExpVbdNVtm_dVb; - dEhlid_dVd = -dEhlid_dVb; - if (selfheat) - dEhlid_dT = Ahlid * dExpVbdNVtm_dT + (ExpVbdNVtm - 1) * dAhlid_dT; - else - dEhlid_dT = 0; - EhlidFactor = 1.0 / sqrt(1 + Ehlid); - T0 = -0.5 * EhlidFactor / (1 + Ehlid); - dEhlidFactor_dVb = T0 * dEhlid_dVb; - dEhlidFactor_dVd = -dEhlidFactor_dVb; - if (selfheat) - dEhlidFactor_dT = T0 * dEhlid_dT; - else - dEhlidFactor_dT = 0; - } - + /* Ibs3/Ibd3: recombination current in neutral body */ + WTsi = pParam->B4SOIweff / here->B4SOInseg * model->B4SOItsi; + if (jbjts == 0.0 && jbjtd == 0.0) + { + Ibs3 = dIbs3_dVb = dIbs3_dVd = dIbs3_dT = 0.0; + Ibd3 = dIbd3_dVb = dIbd3_dVd = dIbd3_dT = 0.0; + Ibsdif = dIbsdif_dVb = dIbsdif_dT = 0; + /*Ibddif = dIbddif_dVb = dIbddif_dVd = dIbddif_dT = 0; v4.2 */ + Ibddif = dIbddif_dVb = dIbddif_dT = 0; + here->B4SOIic = Ic = Gcd = Gcb = GcT = 0.0; + } + else { + Ien = WTsi * jbjts * pParam->B4SOIlratio; + if (selfheat) + dIen_dT = WTsi * djbjts_dT * pParam->B4SOIlratio; + else + dIen_dT = 0; -/* v3.1.1 bug fix for Ibjt(L) discontinuity */ - T0 = 1 - pParam->B4SOIarfabjt; - T1 = T0 * Ien; + /* high level injection of source side */ + if ((Ehlis = Ahlis * (ExpVbsNVtm - 1)) < 1e-5) { + Ehlis = dEhlis_dVb = dEhlis_dT = 0; + EhlisFactor = 1; + dEhlisFactor_dVb = dEhlisFactor_dT = 0; + } + else { + dEhlis_dVb = Ahlis * dExpVbsNVtm_dVb; if (selfheat) - dT1_dT = T0 * dIen_dT; + dEhlis_dT = Ahlis * dExpVbsNVtm_dT + (ExpVbsNVtm - 1) * dAhlis_dT; else - dT1_dT = 0; - - Ibs3 = T1 * (ExpVbsNVtm - 1) * EhlisFactor; - dIbs3_dVb = T1 * (dExpVbsNVtm_dVb * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dVb); - dIbs3_dVd = 0; + dEhlis_dT = 0; + EhlisFactor = 1.0 / sqrt(1 + Ehlis); + T0 = -0.5 * EhlisFactor / (1 + Ehlis); + dEhlisFactor_dVb = T0 * dEhlis_dVb; if (selfheat) - dIbs3_dT = dT1_dT * (ExpVbsNVtm - 1) * EhlisFactor - + T1 * (dExpVbsNVtm_dT * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dT); + dEhlisFactor_dT = T0 * dEhlis_dT; else - dIbs3_dT = 0.0; + dEhlisFactor_dT = 0; + } - Ien = WTsi * jbjtd * pParam->B4SOIlratio; + /* high level injection of drain side */ + if ((Ehlid = Ahlid * (ExpVbdNVtm - 1)) < 1e-5) { + Ehlid = dEhlid_dVb = dEhlid_dVd = dEhlid_dT = 0; + EhlidFactor = 1; + dEhlidFactor_dVb = dEhlidFactor_dVd = dEhlidFactor_dT = 0; + } + else { + dEhlid_dVb = Ahlid * dExpVbdNVtm_dVb; + dEhlid_dVd = -dEhlid_dVb; if (selfheat) - dIen_dT = WTsi * djbjtd_dT * pParam->B4SOIlratio; + dEhlid_dT = Ahlid * dExpVbdNVtm_dT + (ExpVbdNVtm - 1) * dAhlid_dT; else - dIen_dT = 0; - - T1 = T0 * Ien; + dEhlid_dT = 0; + EhlidFactor = 1.0 / sqrt(1 + Ehlid); + T0 = -0.5 * EhlidFactor / (1 + Ehlid); + dEhlidFactor_dVb = T0 * dEhlid_dVb; + dEhlidFactor_dVd = -dEhlidFactor_dVb; if (selfheat) - dT1_dT = T0 * dIen_dT; + dEhlidFactor_dT = T0 * dEhlid_dT; else - dT1_dT = 0; + dEhlidFactor_dT = 0; + } - Ibd3 = T1 * (ExpVbdNVtm - 1) * EhlidFactor; - dIbd3_dVb = T1 * (dExpVbdNVtm_dVb * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dVb); - dIbd3_dVd = -dIbd3_dVb; - if (selfheat) - dIbd3_dT = dT1_dT * (ExpVbdNVtm - 1) * EhlidFactor - + T1 * (dExpVbdNVtm_dT * EhlidFactor + + /* v3.1.1 bug fix for Ibjt(L) discontinuity */ + T0 = 1 - pParam->B4SOIarfabjt; + T1 = T0 * Ien; + if (selfheat) + dT1_dT = T0 * dIen_dT; + else + dT1_dT = 0; + + Ibs3 = T1 * (ExpVbsNVtm - 1) * EhlisFactor; + dIbs3_dVb = T1 * (dExpVbsNVtm_dVb * EhlisFactor + + (ExpVbsNVtm - 1) * dEhlisFactor_dVb); + dIbs3_dVd = 0; + if (selfheat) + dIbs3_dT = dT1_dT * (ExpVbsNVtm - 1) * EhlisFactor + + T1 * (dExpVbsNVtm_dT * EhlisFactor + + (ExpVbsNVtm - 1) * dEhlisFactor_dT); + else + dIbs3_dT = 0.0; + + Ien = WTsi * jbjtd * pParam->B4SOIlratio; + if (selfheat) + dIen_dT = WTsi * djbjtd_dT * pParam->B4SOIlratio; + else + dIen_dT = 0; + + T1 = T0 * Ien; + if (selfheat) + dT1_dT = T0 * dIen_dT; + else + dT1_dT = 0; + + Ibd3 = T1 * (ExpVbdNVtm - 1) * EhlidFactor; + dIbd3_dVb = T1 * (dExpVbdNVtm_dVb * EhlidFactor + + (ExpVbdNVtm - 1) * dEhlidFactor_dVb); + dIbd3_dVd = -dIbd3_dVb; + if (selfheat) + dIbd3_dT = dT1_dT * (ExpVbdNVtm - 1) * EhlidFactor + + T1 * (dExpVbdNVtm_dT * EhlidFactor + (ExpVbdNVtm - 1) * dEhlidFactor_dT); - else - dIbd3_dT = 0.0; + else + dIbd3_dT = 0.0; - /* effective diffusion current for capacitance calcu. */ - Iendif = WTsi * jbjts * pParam->B4SOIlratiodif; - if (selfheat) - dIendif_dT = WTsi * djbjts_dT * pParam->B4SOIlratiodif; - else - dIendif_dT = 0; + /* effective diffusion current for capacitance calcu. */ + Iendif = WTsi * jbjts * pParam->B4SOIlratiodif; + if (selfheat) + dIendif_dT = WTsi * djbjts_dT * pParam->B4SOIlratiodif; + else + dIendif_dT = 0; + + Ibsdif = Iendif * (ExpVbsNVtm - 1) * EhlisFactor; + dIbsdif_dVb = Iendif * (dExpVbsNVtm_dVb * EhlisFactor + + (ExpVbsNVtm - 1) * dEhlisFactor_dVb); + if (selfheat) + dIbsdif_dT = dIendif_dT * (ExpVbsNVtm - 1) * EhlisFactor + + Iendif * (dExpVbsNVtm_dT * EhlisFactor + + (ExpVbsNVtm - 1) * dEhlisFactor_dT); + else + dIbsdif_dT = 0; + + Iendif = WTsi * jbjtd * pParam->B4SOIlratiodif; + if (selfheat) + dIendif_dT = WTsi * djbjtd_dT * pParam->B4SOIlratiodif; + else + dIendif_dT = 0; - Ibsdif = Iendif * (ExpVbsNVtm - 1) * EhlisFactor; - dIbsdif_dVb = Iendif * (dExpVbsNVtm_dVb * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dVb); + Ibddif = Iendif * (ExpVbdNVtm - 1) * EhlidFactor; + dIbddif_dVb = Iendif * (dExpVbdNVtm_dVb * EhlidFactor + + (ExpVbdNVtm - 1) * dEhlidFactor_dVb); + /*dIbddif_dVd = -dIbddif_dVb; v4.2 */ + if (selfheat) + dIbddif_dT = dIendif_dT * (ExpVbdNVtm - 1) * EhlidFactor + + Iendif * (dExpVbdNVtm_dT * EhlidFactor + + (ExpVbdNVtm - 1) * dEhlidFactor_dT); + else + dIbddif_dT = 0; + + /* Ic: Bjt collector current */ + if ((here->B4SOIbjtoff == 1) || (Vds == 0.0)) { + here->B4SOIic = Ic = Gcd = Gcb = GcT = 0.0; + dIc_dVb = dIc_dVd = 0.0; /*bugfix_snps for setting zero */ + } + else { + /* second order effects */ + /* T0 = 1 + (Vbs + Vbd) / pParam->B4SOIvearly; v4.3 bugfix */ + T0 = 1 + (vbs_jct + vbd_jct) / pParam->B4SOIvearly; + dT0_dVb = 2.0 / pParam->B4SOIvearly; + dT0_dVd = -1.0 / pParam->B4SOIvearly; + T1 = Ehlis + Ehlid; + dT1_dVb = dEhlis_dVb + dEhlid_dVb; + dT1_dVd = dEhlid_dVd; if (selfheat) - dIbsdif_dT = dIendif_dT * (ExpVbsNVtm - 1) * EhlisFactor - + Iendif * (dExpVbsNVtm_dT * EhlisFactor - + (ExpVbsNVtm - 1) * dEhlisFactor_dT); + dT1_dT = dEhlis_dT + dEhlid_dT; else - dIbsdif_dT = 0; + dT1_dT = 0; - Iendif = WTsi * jbjtd * pParam->B4SOIlratiodif; + T3 = sqrt(T0 * T0 + 4 * T1); + dT3_dVb = 0.5 / T3 * (2 * T0 * dT0_dVb + 4 * dT1_dVb); + dT3_dVd = 0.5 / T3 * (2 * T0 * dT0_dVd + 4 * dT1_dVd); if (selfheat) - dIendif_dT = WTsi * djbjtd_dT * pParam->B4SOIlratiodif; + dT3_dT = 2 * dT1_dT / T3; else - dIendif_dT = 0; + dT3_dT = 0; - Ibddif = Iendif * (ExpVbdNVtm - 1) * EhlidFactor; - dIbddif_dVb = Iendif * (dExpVbdNVtm_dVb * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dVb); - dIbddif_dVd = -dIbddif_dVb; + T2 = (T0 + T3) / 2.0; + dT2_dVb = (dT0_dVb + dT3_dVb) / 2.0; + dT2_dVd = (dT0_dVd + dT3_dVd) / 2.0; if (selfheat) - dIbddif_dT = dIendif_dT * (ExpVbdNVtm - 1) * EhlidFactor - + Iendif * (dExpVbdNVtm_dT * EhlidFactor - + (ExpVbdNVtm - 1) * dEhlidFactor_dT); + dT2_dT = dT3_dT /2.0; else - dIbddif_dT = 0; + dT2_dT = 0; - /* Ic: Bjt collector current */ - if ((here->B4SOIbjtoff == 1) || (Vds == 0.0)) { - here->B4SOIic = Ic = Gcd = Gcb = GcT = 0.0; - } - else { - /* second order effects */ - T0 = 1 + (Vbs + Vbd) / pParam->B4SOIvearly; - dT0_dVb = 2.0 / pParam->B4SOIvearly; - dT0_dVd = -1.0 / pParam->B4SOIvearly; - - T1 = Ehlis + Ehlid; - dT1_dVb = dEhlis_dVb + dEhlid_dVb; - dT1_dVd = dEhlid_dVd; - if (selfheat) - dT1_dT = dEhlis_dT + dEhlid_dT; - else - dT1_dT = 0; - - T3 = sqrt(T0 * T0 + 4 * T1); - dT3_dVb = 0.5 / T3 * (2 * T0 * dT0_dVb + 4 * dT1_dVb); - dT3_dVd = 0.5 / T3 * (2 * T0 * dT0_dVd + 4 * dT1_dVd); - if (selfheat) - dT3_dT = 2 * dT1_dT / T3; - else - dT3_dT = 0; - - T2 = (T0 + T3) / 2.0; - dT2_dVb = (dT0_dVb + dT3_dVb) / 2.0; - dT2_dVd = (dT0_dVd + dT3_dVd) / 2.0; - if (selfheat) - dT2_dT = dT3_dT /2.0; - else - dT2_dT = 0; - - if (T2 < .1) - { - E2ndFactor = 10.0; - dE2ndFactor_dVb = dE2ndFactor_dVd = dE2ndFactor_dT = 0; - } - - else { - E2ndFactor = 1.0 / T2; - dE2ndFactor_dVb = -E2ndFactor / T2 * dT2_dVb; - dE2ndFactor_dVd = -E2ndFactor / T2 * dT2_dVd; - if (selfheat) - dE2ndFactor_dT = -E2ndFactor / T2 * dT2_dT; - else - dE2ndFactor_dT = 0; - } - - T0 = pParam->B4SOIarfabjt * Ien; /* here Ien refers to the drain side to simplify the code */ - if (selfheat) - dT0_dT = pParam->B4SOIarfabjt * dIen_dT; - else - dT0_dT = 0; - here->B4SOIic = Ic - = T0 * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor; - Gcb = dIc_dVb - = T0 * ((dExpVbsNVtm_dVb - dExpVbdNVtm_dVb) * E2ndFactor - + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVb); - Gcd = dIc_dVd - = T0 * (-dExpVbdNVtm_dVd * E2ndFactor - + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVd); - if (selfheat) - GcT = T0 * (dExpVbsNVtm_dT - dExpVbdNVtm_dT) * E2ndFactor - + dT0_dT * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor - + T0 * (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dT; - else - GcT = 0; - } - } - - /* Ibs4/Ibd4 : tunneling */ - if (jtuns == 0 && jtund == 0) - { Ibs4 = Ibd4 = dIbs4_dVb = dIbs4_dT = dIbd4_dVb = dIbd4_dVd = dIbd4_dT = 0; - } else - { - NVtm2 = 0.026 * pParam->B4SOIntun; - if ((pParam->B4SOIvtun0 - vbs_jct) < 1e-3) + if (T2 < .1) { - /* v2.2.3 bug fix */ - T1=1e3; - T0 = -vbs_jct / NVtm2 * pParam->B4SOIvtun0 * T1; - T1 = exp(T0); - T3 = WsTsi * jtuns; - Ibs4 = T3 * (1- T1); - - /*dIbs4_dVb = dIbs4_dT = 0; */ - dIbs4_dVb = 0.0; - if (selfheat) - dIbs4_dT = (1 - T1) * WsTsi * djtuns_dT; - else - dIbs4_dT = 0; - + E2ndFactor = 10.0; + dE2ndFactor_dVb = dE2ndFactor_dVd = dE2ndFactor_dT = 0; } + else { - T1 = 1 / (pParam->B4SOIvtun0 - vbs_jct); - T0 = -vbs_jct / NVtm2 * pParam->B4SOIvtun0 * T1; - dT0_dVb = -pParam->B4SOIvtun0 / NVtm2 * (T1 + vbs_jct * T1 * T1) ; - - DEXP(T0, T1, T2); - T3 = WsTsi * jtuns; - Ibs4 = T3 * (1- T1); - dIbs4_dVb = -T3 * T2 * dT0_dVb; - if (selfheat) - dIbs4_dT = (1 - T1) * WsTsi * djtuns_dT; - else dIbs4_dT = 0; + E2ndFactor = 1.0 / T2; + dE2ndFactor_dVb = -E2ndFactor / T2 * dT2_dVb; + dE2ndFactor_dVd = -E2ndFactor / T2 * dT2_dVd; + if (selfheat) + dE2ndFactor_dT = -E2ndFactor / T2 * dT2_dT; + else + dE2ndFactor_dT = 0; } - NVtm2 = 0.026 * pParam->B4SOIntund; - if ((pParam->B4SOIvtun0d - vbd_jct) < 1e-3) { + T0 = pParam->B4SOIarfabjt * Ien; /* here Ien refers to the drain side to simplify the code */ + if (selfheat) + dT0_dT = pParam->B4SOIarfabjt * dIen_dT; + else + dT0_dT = 0; + here->B4SOIic = Ic + = T0 * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor; + Gcb = dIc_dVb + = T0 * ((dExpVbsNVtm_dVb - dExpVbdNVtm_dVb) * E2ndFactor + + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVb); + Gcd = dIc_dVd + = T0 * (-dExpVbdNVtm_dVd * E2ndFactor + + (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dVd); + if (selfheat) + GcT = T0 * (dExpVbsNVtm_dT - dExpVbdNVtm_dT) * E2ndFactor + + dT0_dT * (ExpVbsNVtm - ExpVbdNVtm) * E2ndFactor + + T0 * (ExpVbsNVtm - ExpVbdNVtm) * dE2ndFactor_dT; + else + GcT = 0; + } + } + /* Ibs4/Ibd4 : tunneling */ + if (jtuns == 0 && jtund == 0) + { Ibs4 = Ibd4 = dIbs4_dVb = dIbs4_dT = dIbd4_dVb = dIbd4_dVd = dIbd4_dT = 0; + } else + { + NVtm2 = 0.026 * ntuns; /* bugfix_snps for junction DC swapping*/ + if ((vtun0s - vbs_jct) < 1e-3) /* bugfix_snps for junction DC swapping*/ + { /* v2.2.3 bug fix */ - T1=1e3; - T0 = -vbd_jct / NVtm2 * pParam->B4SOIvtun0d * T1; - T1 = exp(T0); - T3 = WdTsi * jtund; - Ibd4 = T3 * (1- T1); - - /*dIbd4_dVb = dIbd4_dT = 0;*/ - dIbd4_dVb = 0; - dIbd4_dVd = 0; - if (selfheat) - dIbs4_dT = (1 - T1) * WsTsi * djtuns_dT; - else dIbs4_dT = 0; - - } - else { - T1 = 1 / (pParam->B4SOIvtun0d - vbd_jct); - T0 = -vbd_jct / NVtm2 * pParam->B4SOIvtun0d * T1; - dT0_dVb = -pParam->B4SOIvtun0d / NVtm2 * (T1 + vbd_jct * T1 * T1) ; + T1=1e3; + T0 = -vbs_jct / NVtm2 * vtun0s * T1; /* bugfix_snps for junction DC swapping*/ + T1 = exp(T0); + T3 = WsTsi * jtuns; + Ibs4 = T3 * (1- T1); + + /*dIbs4_dVb = dIbs4_dT = 0; */ + dIbs4_dVb = 0.0; + if (selfheat) + dIbs4_dT = (1 - T1) * WsTsi * djtuns_dT; + else + dIbs4_dT = 0; - DEXP(T0, T1, T2); - T3 = WdTsi * jtund; - Ibd4 = T3 * (1- T1); - dIbd4_dVb = -T3 * T2 * dT0_dVb; + } + else { + T1 = 1 / (vtun0s - vbs_jct); /*bugfix for junction DC swapping*/ + T0 = -vbs_jct / NVtm2 * vtun0s * T1; /*bugfix for junction DC swapping*/ + dT0_dVb = -vtun0s / NVtm2 * (T1 + vbs_jct * T1 * T1) ; /*bugfix for junction DC swapping*/ + + DEXP(T0, T1, T2); + T3 = WsTsi * jtuns; + Ibs4 = T3 * (1- T1); + dIbs4_dVb = -T3 * T2 * dT0_dVb; + if (selfheat) + dIbs4_dT = (1 - T1) * WsTsi * djtuns_dT; + else dIbs4_dT = 0; + } - dIbd4_dVd = -dIbd4_dVb; + NVtm2 = 0.026 * ntund; /* bugfix_snps for junction DC swapping*/ + if ((vtun0d - vbd_jct) < 1e-3) { /* bugfix_snps for junction DC swapping*/ - if (selfheat) - dIbd4_dT = (1 - T1) * WdTsi * djtund_dT; - else dIbd4_dT = 0; - } - } - - here->B4SOIitun = - Ibd3 - Ibd4; - here->B4SOIibs = Ibs = Ibs1 + Ibs2 + Ibs3 + Ibs4; - here->B4SOIibd = Ibd = Ibd1 + Ibd2 + Ibd3 + Ibd4; - - Gjsb = dIbs1_dVb + dIbs2_dVb + dIbs3_dVb + dIbs4_dVb; - Gjsd = dIbs3_dVd; - if (selfheat) GjsT = dIbs1_dT + dIbs2_dT + dIbs3_dT + dIbs4_dT; - else GjsT = 0.0; - - Gjdb = dIbd1_dVb + dIbd2_dVb + dIbd3_dVb + dIbd4_dVb; - Gjdd = dIbd1_dVd + dIbd2_dVd + dIbd3_dVd + dIbd4_dVd; - if (selfheat) GjdT = dIbd1_dT + dIbd2_dT + dIbd3_dT + dIbd4_dT; - else GjdT = 0.0; - } - else /* v3.1 soiMod=2: ideal FD */ - { - here->B4SOIigidl= Igidl - = Ggidld = Ggidlg = Ggidlb = 0.0; - - here->B4SOIitun = 0; - here->B4SOIibs = Ibs = 0; - here->B4SOIibd = Ibd = 0; - here->B4SOIic = Ic = Gcd = Gcb = GcT = 0.0; - - Gjsb = 0; - Gjsd = 0; - GjsT = 0; - - Gjdb = 0; - Gjdd = 0; - GjdT = 0; - } - -/* v3.0: gate-tunneling */ - if ((model->B4SOIigbMod != 0) || (model->B4SOIigcMod != 0)) { - Vgb = Vgs_eff - Vbs; - dVgb_dVg = dVgs_eff_dVg; - dVgb_dVb = -1; - - /* Calculate Vox first */ - Vfb = model->B4SOItype * here->B4SOIvth0 /* v4.0 */ - - phi - pParam->B4SOIk1eff * sqrtPhi; - - T3 = Vfb - Vgs_eff + Vbs - DELTA_3; - dT3_dVg = -dVgs_eff_dVg; - dT3_dVd = 0; - dT3_dVb = 1; - - if (Vfb <= 0.0) { - T0 = sqrt(T3 * T3 - 4.0 * DELTA_3 * Vfb); - dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg; - dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb; - } - else { - T0 = sqrt(T3 * T3 + 4.0 * DELTA_3 * Vfb); - dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg; - dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb; - } - - Vfbeff = Vfb - 0.5 * (T3 + T0); - dVfbeff_dVg = -0.5 * (dT3_dVg + dT0_dVg); - dVfbeff_dVb = -0.5 * (dT3_dVb + dT0_dVb); - - Voxacc = Vfb - Vfbeff; - dVoxacc_dVg = -dVfbeff_dVg; - dVoxacc_dVd = 0.0; - dVoxacc_dVb = -dVfbeff_dVb; - if (Voxacc < 0.0) - Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0; - - - T0 = Vgs_eff - Vgsteff - Vfbeff - Vbseff; - dT0_dVg = dVgs_eff_dVg - dVgsteff_dVg - dVfbeff_dVg - dVbseff_dVg; /* v3.0 */ - dT0_dVd = -dVgsteff_dVd - dVbseff_dVd; /* v3.0 */ - dT0_dVb = -dVgsteff_dVb - dVfbeff_dVb - dVbseff_dVb; - dT0_dVe = -dVgsteff_dVe - dVbseff_dVe; - - if (selfheat) - dT0_dT = -dVgsteff_dT - dVbseff_dT; /* v3.0 */ - - if (pParam->B4SOIk1ox == 0.0) /* v4.0 */ { - Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd = dVoxdepinv_dVb - = dVoxdepinv_dT = 0.0; - } else { - if (T0 < 0.0) { - T1 = T0/pParam->B4SOIk1ox; - dT1_dVg = dT0_dVg/pParam->B4SOIk1ox; - dT1_dVd = dT0_dVd/pParam->B4SOIk1ox; - dT1_dVb = dT0_dVb/pParam->B4SOIk1ox; - dT1_dVe = dT0_dVe/pParam->B4SOIk1ox; /* v3.0 */ - if (selfheat) dT1_dT = dT0_dT/pParam->B4SOIk1ox; - } - else { - T1 = pParam->B4SOIk1ox/2*(-1 + sqrt(1 + - 4*T0/pParam->B4SOIk1ox/pParam->B4SOIk1ox)); - T2 = pParam->B4SOIk1ox/2 * - 0.5/sqrt(1 + 4*T0/pParam->B4SOIk1ox/pParam->B4SOIk1ox) * - 4/pParam->B4SOIk1ox/pParam->B4SOIk1ox; - dT1_dVg = T2 * dT0_dVg; - dT1_dVd = T2 * dT0_dVd; - dT1_dVb = T2 * dT0_dVb; - dT1_dVe = T2 * dT0_dVe; /* v3.0 */ - if (selfheat) - dT1_dT = T2 * dT0_dT; - } - - Voxdepinv = Vgs_eff - (T1*T1 + Vbs) - Vfb; - dVoxdepinv_dVg = dVgs_eff_dVg - (2.0*T1*dT1_dVg); - dVoxdepinv_dVd = -(2.0*T1*dT1_dVd); - dVoxdepinv_dVb = -(2.0*T1*dT1_dVb + 1); - dVoxdepinv_dVe = -(2.0*T1*dT1_dVe); /* v3.0 */ + /* v2.2.3 bug fix */ + T1=1e3; + T0 = -vbd_jct / NVtm2 * vtun0d * T1; /* bugfix_snps for junction DC swapping*/ + T1 = exp(T0); + T3 = WdTsi * jtund; + Ibd4 = T3 * (1- T1); + + /*dIbd4_dVb = dIbd4_dT = 0;*/ + dIbd4_dVb = 0; + dIbd4_dVd = 0; if (selfheat) - dVoxdepinv_dT = -(2.0*T1*dT1_dT); - } - } - - - /* gate-channel tunneling component */ - if (model->B4SOIigcMod) - { T0 = Vtm * pParam->B4SOInigc; - VxNVt = (Vgs_eff - model->B4SOItype * here->B4SOIvth0) - / T0; /* Vth instead of Vth0 may be used */ - if (VxNVt > EXPL_THRESHOLD) - { Vaux = Vgs_eff - model->B4SOItype * here->B4SOIvth0; - dVaux_dVg = dVgs_eff_dVg; - dVaux_dVd = 0.0; - dVaux_dVb = 0.0; - } - else if (VxNVt < -EXPL_THRESHOLD) - { Vaux = T0 * log(1.0 + MIN_EXPL); - dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0; - } - else - { ExpVxNVt = exp(VxNVt); - Vaux = T0 * log(1.0 + ExpVxNVt); - dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); - dVaux_dVd = -dVaux_dVg * 0.0; - dVaux_dVb = -dVaux_dVg * 0.0; - dVaux_dVg *= dVgs_eff_dVg; - } - - T2 = Vgs_eff * Vaux; - dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg; - dT2_dVd = Vgs_eff * dVaux_dVd; - dT2_dVb = Vgs_eff * dVaux_dVb; - - T11 = pParam->B4SOIAechvb; - T12 = pParam->B4SOIBechvb; - T3 = pParam->B4SOIaigc * pParam->B4SOIcigc - - pParam->B4SOIbigc; - T4 = pParam->B4SOIbigc * pParam->B4SOIcigc; - T5 = T12 * (pParam->B4SOIaigc + T3 * Voxdepinv - - T4 * Voxdepinv * Voxdepinv); - - if (T5 > EXPL_THRESHOLD) - { T6 = MAX_EXPL; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else if (T5 < -EXPL_THRESHOLD) - { T6 = MIN_EXPL; - dT6_dVg = dT6_dVd = dT6_dVb = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv); - dT6_dVd = dT6_dVg * dVoxdepinv_dVd; - dT6_dVb = dT6_dVg * dVoxdepinv_dVb; - dT6_dVg *= dVoxdepinv_dVg; - } - - Igc = T11 * T2 * T6; - dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd); - dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); - - T7 = -pParam->B4SOIpigcd * Vds; - T8 = T7 * T7 + 2.0e-4; - dT8_dVd = -2.0 * pParam->B4SOIpigcd * T7; - if (T7 > EXPL_THRESHOLD) - { T9 = MAX_EXPL; - dT9_dVd = 0.0; - } - else if (T7 < -EXPL_THRESHOLD) - { T9 = MIN_EXPL; - dT9_dVd = 0.0; - } - else - { T9 = exp(T7); - dT9_dVd = -T9 * pParam->B4SOIpigcd; - } - - T0 = T8 * T8; - T1 = T9 - 1.0 + 1.0e-4; - T10 = (T1 - T7) / T8; - dT10_dVd = ((pParam->B4SOIpigcd + dT9_dVd) * T8 - - (T1 - T7) * dT8_dVd) / T0; - Igcs = Igc * T10; - dIgcs_dVg = dIgc_dVg * T10; - dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; - dIgcs_dVb = dIgc_dVb * T10; - - T1 = T9 - 1.0 - 1.0e-4; - T10 = (T7 * T9 - T1) / T8; - dT10_dVd = (-pParam->B4SOIpigcd * T9 + (T7 - 1.0) - * dT9_dVd - T10 * dT8_dVd) / T8; - Igcd = Igc * T10; - dIgcd_dVg = dIgc_dVg * T10; - dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; - dIgcd_dVb = dIgc_dVb * T10; - - here->B4SOIIgcs = Igcs; - here->B4SOIgIgcsg = dIgcs_dVg; - here->B4SOIgIgcsd = dIgcs_dVd; - here->B4SOIgIgcsb = dIgcs_dVb * dVbseff_dVb; - here->B4SOIIgcd = Igcd; - here->B4SOIgIgcdg = dIgcd_dVg; - here->B4SOIgIgcdd = dIgcd_dVd; - here->B4SOIgIgcdb = dIgcd_dVb * dVbseff_dVb; - - - T0 = vgs - pParam->B4SOIvfbsd; - vgs_eff = sqrt(T0 * T0 + 1.0e-4); - dvgs_eff_dvg = T0 / vgs_eff; - - T2 = vgs * vgs_eff; - dT2_dVg = vgs * dvgs_eff_dvg + vgs_eff; - T11 = pParam->B4SOIAechvbEdge; - T12 = pParam->B4SOIBechvbEdge; - T3 = pParam->B4SOIaigsd * pParam->B4SOIcigsd - - pParam->B4SOIbigsd; - T4 = pParam->B4SOIbigsd * pParam->B4SOIcigsd; - T5 = T12 * (pParam->B4SOIaigsd + T3 * vgs_eff - - T4 * vgs_eff * vgs_eff); - if (T5 > EXPL_THRESHOLD) - { T6 = MAX_EXPL; - dT6_dVg = 0.0; - } - else if (T5 < -EXPL_THRESHOLD) - { T6 = MIN_EXPL; - dT6_dVg = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgs_eff) - * dvgs_eff_dvg; - } - Igs = T11 * T2 * T6; - dIgs_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgs_dVs = -dIgs_dVg; - - T0 = vgd - pParam->B4SOIvfbsd; - vgd_eff = sqrt(T0 * T0 + 1.0e-4); - dvgd_eff_dvg = T0 / vgd_eff; - - T2 = vgd * vgd_eff; - dT2_dVg = vgd * dvgd_eff_dvg + vgd_eff; - T5 = T12 * (pParam->B4SOIaigsd + T3 * vgd_eff - - T4 * vgd_eff * vgd_eff); - if (T5 > EXPL_THRESHOLD) - { T6 = MAX_EXPL; - dT6_dVg = 0.0; - } - else if (T5 < -EXPL_THRESHOLD) - { T6 = MIN_EXPL; - dT6_dVg = 0.0; - } - else - { T6 = exp(T5); - dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgd_eff) - * dvgd_eff_dvg; - } - Igd = T11 * T2 * T6; - dIgd_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIgd_dVd = -dIgd_dVg; - - here->B4SOIIgs = Igs; - here->B4SOIgIgsg = dIgs_dVg; - here->B4SOIgIgss = dIgs_dVs; - here->B4SOIIgd = Igd; - here->B4SOIgIgdg = dIgd_dVg; - here->B4SOIgIgdd = dIgd_dVd; - } - else - { here->B4SOIIgcs = here->B4SOIgIgcsg = here->B4SOIgIgcsd - = here->B4SOIgIgcsb = 0.0; - here->B4SOIIgcd = here->B4SOIgIgcdg = here->B4SOIgIgcdd - = here->B4SOIgIgcdb = 0.0; - here->B4SOIIgs = here->B4SOIgIgsg = here->B4SOIgIgss = 0.0; - here->B4SOIIgd = here->B4SOIgIgdg = here->B4SOIgIgdd = 0.0; - } - - here->B4SOIgIgcss = -(here->B4SOIgIgcsg + here->B4SOIgIgcsd - + here->B4SOIgIgcsb); - here->B4SOIgIgcds = -(here->B4SOIgIgcdg + here->B4SOIgIgcdd - + here->B4SOIgIgcdb); - - - /* gate-body tunneling component */ - if ((model->B4SOIigbMod!= 0) && (here->B4SOIsoiMod != 2)) /* v3.2 */ - /* v3.1: the Igb calculation is skipped for the ideal FD mode */ - { - OxideRatio = pParam->B4SOIoxideRatio; - - Vox = Voxdepinv; - /* Voxeff is Vox limited below Voxh */ - T0 = model->B4SOIvoxh; - T1 = T0 - Vox - model->B4SOIdeltavox; - T3 = sqrt(T1 * T1 + 4*model->B4SOIdeltavox * T0); - Voxeff = T0 - 0.5 * (T1 + T3); - dVoxeff_dVox = 0.5 * (1.0 + T1 / T3); - - Vox = Voxeff; - dVox_dVg = dVoxdepinv_dVg * dVoxeff_dVox; - dVox_dVd = dVoxdepinv_dVd * dVoxeff_dVox; - dVox_dVb = dVoxdepinv_dVb * dVoxeff_dVox; - dVox_dVe = dVoxdepinv_dVe * dVoxeff_dVox; /* v3.0 */ - dVox_dT = dVoxdepinv_dT * dVoxeff_dVox; - - - T0 = (Vox - model->B4SOIebg)/model->B4SOIvevb; - if (selfheat) - dT0_dT = dVox_dT /model->B4SOIvevb; - - DEXP(T0, T1, T2); /* T1=exp(T0), T2=dT1_dT0 */ - if (selfheat) - dT1_dT = T2 * dT0_dT; - - Vaux = model->B4SOIvevb * log(1 + T1); - dVaux_dVg = T2 / (1 + T1) * dVox_dVg; - dVaux_dVd = T2 / (1 + T1) * dVox_dVd; - dVaux_dVb = T2 / (1 + T1) * dVox_dVb; - dVaux_dVe = T2 / (1 + T1) * dVox_dVe; /* v3.0 */ - if (selfheat) - dVaux_dT = T2 / (1 + T1) * dVox_dT; - - if (model->B4SOIvgb1 != 0) { - T0 = 1 - Vox / model->B4SOIvgb1; - dT0_dVox = -1.0/model->B4SOIvgb1; + /* dIbs4_dT = (1 - T1) * WsTsi * djtuns_dT; */ /* Bug fix #8 Jun 09 'typo's corrected for Drain side */ + /* else dIbs4_dT = 0; */ + dIbd4_dT = (1 - T1) * WdTsi * djtund_dT; /* Fix */ + else dIbd4_dT = 0; + } + else { + T1 = 1 / (vtun0d - vbd_jct); /* bugfix_snps for junction DC swapping*/ + T0 = -vbd_jct / NVtm2 * vtun0d * T1; /* bugfix_snps for junction DC swapping*/ + dT0_dVb = -vtun0d / NVtm2 * (T1 + vbd_jct * T1 * T1) ; /* bugfix_snps for junction DC swapping*/ + + DEXP(T0, T1, T2); + T3 = WdTsi * jtund; + Ibd4 = T3 * (1- T1); + dIbd4_dVb = -T3 * T2 * dT0_dVb; + + dIbd4_dVd = -dIbd4_dVb; + if (selfheat) - dT0_dT = -dVox_dT / model->B4SOIvgb1; - } else { - T0 = 1; - dT0_dVox = dT0_dT = 0.0; - } - - if (T0 < 0.01) { - T0 = 0.01; - dT0_dVox = dT0_dT = 0.0; - } - -/* v2.2.3 bug fix */ - T1 = Leff * Weff * 3.7622e-7 * OxideRatio - / here->B4SOInseg + here->B4SOIagbcpd /* v4.0 */; - - T2 = -3.1051e10 * model->B4SOItoxqm; - T3 = pParam->B4SOIalphaGB1; - T4 = pParam->B4SOIbetaGB1; - - T6 = T2*(T3 - T4 * Vox) / T0; - if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT; - - DEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */ - dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVe = -T7 * dVox_dVe * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); /* v3.0 */ - if (selfheat) - dT5_dT = T7 * dT6_dT; - - Igb1 = T1 * Vgb * Vaux * T5; - dIgb1_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 + - Vgb*T5*dVaux_dVg); - dIgb1_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd); - dIgb1_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 + - Vgb*T5*dVaux_dVb); - dIgb1_dVe = T1 * (Vgb*Vaux*dT5_dVe + Vgb*T5*dVaux_dVe); /* v3.0 */ - if (selfheat) - dIgb1_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT); - else dIgb1_dT = 0.0; - - - Vox = Voxacc; - /* Voxeff is Vox limited below Voxh */ - T0 = model->B4SOIvoxh; - T1 = T0 - Vox - model->B4SOIdeltavox; - T3 = sqrt(T1 * T1 + 4*model->B4SOIdeltavox * T0); - Voxeff = T0 - 0.5 * (T1 + T3); - dVoxeff_dVox = 0.5 * (1.0 + T1 / T3); - - Vox = Voxeff; - dVox_dVg = dVoxacc_dVg * dVoxeff_dVox; - dVox_dVd = dVoxacc_dVd * dVoxeff_dVox; - dVox_dVb = dVoxacc_dVb * dVoxeff_dVox; - dVox_dT = 0; - - T0 = (-Vgb+(Vfb))/model->B4SOIvecb; - if (selfheat) - dT0_dT = 0; + dIbd4_dT = (1 - T1) * WdTsi * djtund_dT; + else dIbd4_dT = 0; + } + } - DEXP(T0, T1, T2); /* T1=exp(T0), T2=dT1_dT0 */ - if (selfheat) - dT1_dT = 0; + here->B4SOIitun = - Ibd3 - Ibd4; + Ibs = Ibs1 + Ibs2 + Ibs3 + Ibs4; + Ibd = Ibd1 + Ibd2 + Ibd3 + Ibd4; + + Gjsb = dIbs1_dVb + dIbs2_dVb + dIbs3_dVb + dIbs4_dVb; + Gjsd = dIbs3_dVd; + if (selfheat) GjsT = dIbs1_dT + dIbs2_dT + dIbs3_dT + dIbs4_dT; + else GjsT = 0.0; + + Gjdb = dIbd1_dVb + dIbd2_dVb + dIbd3_dVb + dIbd4_dVb; + Gjdd = dIbd1_dVd + dIbd2_dVd + dIbd3_dVd + dIbd4_dVd; + if (selfheat) GjdT = dIbd1_dT + dIbd2_dT + dIbd3_dT + dIbd4_dT; + else GjdT = 0.0; + } + else /* v3.1 soiMod=2: ideal FD */ + { + here->B4SOIigidl= Igidl + = Ggidld = Ggidlg = Ggidlb = 0.0; + here->B4SOIigisl= Igisl /* Bug fix #9 Jun 09 Code added to set Igisl components to zero */ + = Ggisls = Ggislg = Ggislb = 0.0; /* This is an appx solution */ + /* Final code will comply with BSIM MG in future releases */ + here->B4SOIitun = 0; + Ibs = 0; + Ibd = 0; + here->B4SOIic = Ic = Gcd = Gcb = GcT = 0.0; + + Gjsb = 0; + Gjsd = 0; + GjsT = 0; + + Gjdb = 0; + Gjdd = 0; + GjdT = 0; + } + if (here->B4SOImode > 0) + { + here->B4SOIibs = Ibs; + here->B4SOIibd = Ibd; + } + else + { + here->B4SOIibd = Ibs; + here->B4SOIibs = Ibd; + } + + /* v3.0: gate-tunneling */ + if ((model->B4SOIigbMod != 0) || (model->B4SOIigcMod != 0)) { + Vgb = Vgs_eff - Vbs; + dVgb_dVg = dVgs_eff_dVg; + dVgb_dVb = -1; + + /* Calculate Vox first */ + Vfb = model->B4SOItype * here->B4SOIvth0 /* v4.0 */ + - phi - pParam->B4SOIk1eff * sqrtPhi; + + T3 = Vfb - Vgs_eff + Vbs - DELTA_3; + dT3_dVg = -dVgs_eff_dVg; + dT3_dVd = 0; + dT3_dVb = 1; + + if (Vfb <= 0.0) { + T0 = sqrt(T3 * T3 - 4.0 * DELTA_3 * Vfb); + dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg; + dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb; + } + else { + T0 = sqrt(T3 * T3 + 4.0 * DELTA_3 * Vfb); + dT0_dVg = 1.0/(2.0 * T0) * 2.0*T3 * dT3_dVg; + dT0_dVb = 0.5*(1.0/T0) * 2.0*T3 * dT3_dVb; + } - Vaux = model->B4SOIvecb* log(1 + T1); - dVaux_dVg = -T2 / (1 + T1); - dVaux_dVd = 0; - dVaux_dVb = -dVaux_dVg; - if (selfheat) - dVaux_dT = 0; - - if (model->B4SOIvgb2 != 0) { - T0 = 1 - Vox / model->B4SOIvgb2; - dT0_dVox = -1.0/model->B4SOIvgb2; - if (selfheat) dT0_dT = -dVox_dT / model->B4SOIvgb2; - } else { - T0 = 1; - dT0_dVox = dT0_dT =0.0; - } - - if (T0 < 0.01) { - T0 = 0.01; - dT0_dVox = dT0_dT =0.0; - } - -/* v2.2.3 bug fix */ - T1 = Leff * Weff * 4.9758e-7 * OxideRatio - / here->B4SOInseg + here->B4SOIagbcpd /* v4.0 */; - - T2 = -2.357e10 * model->B4SOItoxqm; - T3 = pParam->B4SOIalphaGB2; - T4 = pParam->B4SOIbetaGB2; - - T6 = T2*(T3 - T4 * Vox) / T0; - if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT; - - DEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */ - dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); - if (selfheat) - dT5_dT = T7 * dT6_dT; - - Igb2 = T1 * Vgb * Vaux * T5; - dIgb2_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 + - Vgb*T5*dVaux_dVg); - dIgb2_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd); - dIgb2_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 + - Vgb*T5*dVaux_dVb); - if (selfheat) - dIgb2_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT); - else dIgb2_dT = 0.0; - + Vfbeff = Vfb - 0.5 * (T3 + T0); + dVfbeff_dVg = -0.5 * (dT3_dVg + dT0_dVg); + dVfbeff_dVb = -0.5 * (dT3_dVb + dT0_dVb); + + Voxacc = Vfb - Vfbeff; + dVoxacc_dVg = -dVfbeff_dVg; + dVoxacc_dVd = 0.0; + dVoxacc_dVb = -dVfbeff_dVb; + if (Voxacc < 0.0) + Voxacc = dVoxacc_dVg = dVoxacc_dVb = 0.0; + + + T0 = Vgs_eff - Vgsteff - Vfbeff - Vbseff; + dT0_dVg = dVgs_eff_dVg - dVgsteff_dVg - dVfbeff_dVg - dVbseff_dVg; /* v3.0 */ + dT0_dVd = -dVgsteff_dVd - dVbseff_dVd; /* v3.0 */ + dT0_dVb = -dVgsteff_dVb - dVfbeff_dVb - dVbseff_dVb; + dT0_dVe = -dVgsteff_dVe - dVbseff_dVe; + + if (selfheat) + dT0_dT = -dVgsteff_dT - dVbseff_dT; /* v3.0 */ + + if (pParam->B4SOIk1ox == 0.0) /* v4.0 */ { + Voxdepinv = dVoxdepinv_dVg = dVoxdepinv_dVd = dVoxdepinv_dVb + = dVoxdepinv_dT = 0.0; + } else { + if (T0 < 0.0) { + T1 = T0/pParam->B4SOIk1ox; + dT1_dVg = dT0_dVg/pParam->B4SOIk1ox; + dT1_dVd = dT0_dVd/pParam->B4SOIk1ox; + dT1_dVb = dT0_dVb/pParam->B4SOIk1ox; + dT1_dVe = dT0_dVe/pParam->B4SOIk1ox; /* v3.0 */ + if (selfheat) dT1_dT = dT0_dT/pParam->B4SOIk1ox; + } + else { + T1 = pParam->B4SOIk1ox/2*(-1 + sqrt(1 + + 4*T0/pParam->B4SOIk1ox/pParam->B4SOIk1ox)); + T2 = pParam->B4SOIk1ox/2 * + 0.5/sqrt(1 + 4*T0/pParam->B4SOIk1ox/pParam->B4SOIk1ox) * + 4/pParam->B4SOIk1ox/pParam->B4SOIk1ox; + dT1_dVg = T2 * dT0_dVg; + dT1_dVd = T2 * dT0_dVd; + dT1_dVb = T2 * dT0_dVb; + dT1_dVe = T2 * dT0_dVe; /* v3.0 */ + if (selfheat) + dT1_dT = T2 * dT0_dT; + } + + Voxdepinv = Vgs_eff - (T1*T1 + Vbs) - Vfb; + dVoxdepinv_dVg = dVgs_eff_dVg - (2.0*T1*dT1_dVg); + dVoxdepinv_dVd = -(2.0*T1*dT1_dVd); + dVoxdepinv_dVb = -(2.0*T1*dT1_dVb + 1); + dVoxdepinv_dVe = -(2.0*T1*dT1_dVe); /* v3.0 */ + if (selfheat) + dVoxdepinv_dT = -(2.0*T1*dT1_dT); + } + } + + + /* gate-channel tunneling component */ + if (model->B4SOIigcMod) + { T0 = Vtm * pParam->B4SOInigc; + VxNVt = (Vgs_eff - model->B4SOItype * here->B4SOIvth0) + / T0; /* Vth instead of Vth0 may be used */ + if (VxNVt > EXPL_THRESHOLD) + { Vaux = Vgs_eff - model->B4SOItype * here->B4SOIvth0; + dVaux_dVg = dVgs_eff_dVg; + dVaux_dVd = 0.0; + dVaux_dVb = 0.0; + } + else if (VxNVt < -EXPL_THRESHOLD) + { Vaux = T0 * log(1.0 + MIN_EXPL); + dVaux_dVg = dVaux_dVd = dVaux_dVb = 0.0; + } + else + { ExpVxNVt = exp(VxNVt); + Vaux = T0 * log(1.0 + ExpVxNVt); + dVaux_dVg = ExpVxNVt / (1.0 + ExpVxNVt); + dVaux_dVd = -dVaux_dVg * 0.0; + dVaux_dVb = -dVaux_dVg * 0.0; + dVaux_dVg *= dVgs_eff_dVg; + } + + T2 = Vgs_eff * Vaux; + dT2_dVg = dVgs_eff_dVg * Vaux + Vgs_eff * dVaux_dVg; + dT2_dVd = Vgs_eff * dVaux_dVd; + dT2_dVb = Vgs_eff * dVaux_dVb; + + T11 = pParam->B4SOIAechvb; + T12 = pParam->B4SOIBechvb; + T3 = pParam->B4SOIaigc * pParam->B4SOIcigc + - pParam->B4SOIbigc; + T4 = pParam->B4SOIbigc * pParam->B4SOIcigc; + T5 = T12 * (pParam->B4SOIaigc + T3 * Voxdepinv + - T4 * Voxdepinv * Voxdepinv); + + if (T5 > EXPL_THRESHOLD) + { T6 = MAX_EXPL; + dT6_dVg = dT6_dVd = dT6_dVb = 0.0; + } + else if (T5 < -EXPL_THRESHOLD) + { T6 = MIN_EXPL; + dT6_dVg = dT6_dVd = dT6_dVb = 0.0; + } + else + { T6 = exp(T5); + dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * Voxdepinv); + dT6_dVd = dT6_dVg * dVoxdepinv_dVd; + dT6_dVb = dT6_dVg * dVoxdepinv_dVb; + dT6_dVg *= dVoxdepinv_dVg; + } + + Igc = T11 * T2 * T6; + dIgc_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); + dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd); + dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb); + + T7 = -pParam->B4SOIpigcd * Vds; + T8 = T7 * T7 + 2.0e-4; + dT8_dVd = -2.0 * pParam->B4SOIpigcd * T7; + if (T7 > EXPL_THRESHOLD) + { T9 = MAX_EXPL; + dT9_dVd = 0.0; + } + else if (T7 < -EXPL_THRESHOLD) + { T9 = MIN_EXPL; + dT9_dVd = 0.0; + } + else + { T9 = exp(T7); + dT9_dVd = -T9 * pParam->B4SOIpigcd; + } + + T0 = T8 * T8; + T1 = T9 - 1.0 + 1.0e-4; + T10 = (T1 - T7) / T8; + dT10_dVd = ((pParam->B4SOIpigcd + dT9_dVd) * T8 + - (T1 - T7) * dT8_dVd) / T0; + Igcs = Igc * T10; + dIgcs_dVg = dIgc_dVg * T10; + dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; + dIgcs_dVb = dIgc_dVb * T10; + + T1 = T9 - 1.0 - 1.0e-4; + T10 = (T7 * T9 - T1) / T8; + dT10_dVd = (-pParam->B4SOIpigcd * T9 + (T7 - 1.0) + * dT9_dVd - T10 * dT8_dVd) / T8; + Igcd = Igc * T10; + dIgcd_dVg = dIgc_dVg * T10; + dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd; + dIgcd_dVb = dIgc_dVb * T10; + + here->B4SOIIgcs = Igcs; + here->B4SOIgIgcsg = dIgcs_dVg; + here->B4SOIgIgcsd = dIgcs_dVd; + here->B4SOIgIgcsb = dIgcs_dVb * dVbseff_dVb; + here->B4SOIIgcd = Igcd; + here->B4SOIgIgcdg = dIgcd_dVg; + here->B4SOIgIgcdd = dIgcd_dVd; + here->B4SOIgIgcdb = dIgcd_dVb * dVbseff_dVb; + + + T0 = vgs - pParam->B4SOIvfbsd; + vgs_eff = sqrt(T0 * T0 + 1.0e-4); + dvgs_eff_dvg = T0 / vgs_eff; + + T2 = vgs * vgs_eff; + dT2_dVg = vgs * dvgs_eff_dvg + vgs_eff; + /* T11 = pParam->B4SOIAechvbEdge; */ + T13 = pParam->B4SOIAechvbEdges; + T14 = pParam->B4SOIAechvbEdged; + T12 = pParam->B4SOIBechvbEdge; + T3 = pParam->B4SOIaigsd * pParam->B4SOIcigsd + - pParam->B4SOIbigsd; + T4 = pParam->B4SOIbigsd * pParam->B4SOIcigsd; + T5 = T12 * (pParam->B4SOIaigsd + T3 * vgs_eff + - T4 * vgs_eff * vgs_eff); + if (T5 > EXPL_THRESHOLD) + { T6 = MAX_EXPL; + dT6_dVg = 0.0; + } + else if (T5 < -EXPL_THRESHOLD) + { T6 = MIN_EXPL; + dT6_dVg = 0.0; + } + else + { T6 = exp(T5); + dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgs_eff) + * dvgs_eff_dvg; + } + /* Igs = T11 * T2 * T6; */ + Igs = T13 * T2 * T6; + dIgs_dVg = T13 * (T2 * dT6_dVg + T6 * dT2_dVg); + dIgs_dVs = -dIgs_dVg; + + T0 = vgd - pParam->B4SOIvfbsd; + vgd_eff = sqrt(T0 * T0 + 1.0e-4); + dvgd_eff_dvg = T0 / vgd_eff; + + T2 = vgd * vgd_eff; + dT2_dVg = vgd * dvgd_eff_dvg + vgd_eff; + T5 = T12 * (pParam->B4SOIaigsd + T3 * vgd_eff + - T4 * vgd_eff * vgd_eff); + if (T5 > EXPL_THRESHOLD) + { T6 = MAX_EXPL; + dT6_dVg = 0.0; + } + else if (T5 < -EXPL_THRESHOLD) + { T6 = MIN_EXPL; + dT6_dVg = 0.0; + } + else + { T6 = exp(T5); + dT6_dVg = T6 * T12 * (T3 - 2.0 * T4 * vgd_eff) + * dvgd_eff_dvg; + } + /* Igd = T11 * T2 * T6; */ + Igd = T14 * T2 * T6; + dIgd_dVg = T14 * (T2 * dT6_dVg + T6 * dT2_dVg); + dIgd_dVd = -dIgd_dVg; + + here->B4SOIIgs = Igs; + here->B4SOIgIgsg = dIgs_dVg; + here->B4SOIgIgss = dIgs_dVs; + here->B4SOIIgd = Igd; + here->B4SOIgIgdg = dIgd_dVg; + here->B4SOIgIgdd = dIgd_dVd; + } + else + { here->B4SOIIgcs = here->B4SOIgIgcsg = here->B4SOIgIgcsd + = here->B4SOIgIgcsb = 0.0; + here->B4SOIIgcd = here->B4SOIgIgcdg = here->B4SOIgIgcdd + = here->B4SOIgIgcdb = 0.0; + here->B4SOIIgs = here->B4SOIgIgsg = here->B4SOIgIgss = 0.0; + here->B4SOIIgd = here->B4SOIgIgdg = here->B4SOIgIgdd = 0.0; + } + + here->B4SOIgIgcss = -(here->B4SOIgIgcsg + here->B4SOIgIgcsd + + here->B4SOIgIgcsb); + here->B4SOIgIgcds = -(here->B4SOIgIgcdg + here->B4SOIgIgcdd + + here->B4SOIgIgcdb); + + + /* gate-body tunneling component */ + if ((model->B4SOIigbMod!= 0) && (here->B4SOIsoiMod != 2)) /* v3.2 */ + /* v3.1: the Igb calculation is skipped for the ideal FD mode */ + { + OxideRatio = pParam->B4SOIoxideRatio; + + Vox = Voxdepinv; + /* Voxeff is Vox limited below Voxh */ + T0 = model->B4SOIvoxh; + T1 = T0 - Vox - model->B4SOIdeltavox; + T3 = sqrt(T1 * T1 + 4*model->B4SOIdeltavox * T0); + Voxeff = T0 - 0.5 * (T1 + T3); + dVoxeff_dVox = 0.5 * (1.0 + T1 / T3); + + Vox = Voxeff; + dVox_dVg = dVoxdepinv_dVg * dVoxeff_dVox; + dVox_dVd = dVoxdepinv_dVd * dVoxeff_dVox; + dVox_dVb = dVoxdepinv_dVb * dVoxeff_dVox; + dVox_dVe = dVoxdepinv_dVe * dVoxeff_dVox; /* v3.0 */ + if (selfheat) /* v4.2 Bug # 23 Jul09 */ + dVox_dT = dVoxdepinv_dT * dVoxeff_dVox; + + + T0 = (Vox - model->B4SOIebg)/model->B4SOIvevb; + if (selfheat) + dT0_dT = dVox_dT /model->B4SOIvevb; + + DEXP(T0, T1, T2); /* T1=exp(T0), T2=dT1_dT0 */ + if (selfheat) + dT1_dT = T2 * dT0_dT; + + Vaux = model->B4SOIvevb * log(1 + T1); + dVaux_dVg = T2 / (1 + T1) * dVox_dVg; + dVaux_dVd = T2 / (1 + T1) * dVox_dVd; + dVaux_dVb = T2 / (1 + T1) * dVox_dVb; + dVaux_dVe = T2 / (1 + T1) * dVox_dVe; /* v3.0 */ + if (selfheat) + dVaux_dT = T2 / (1 + T1) * dVox_dT; + + if (model->B4SOIvgb1 != 0) { + T0 = 1 - Vox / model->B4SOIvgb1; + dT0_dVox = -1.0/model->B4SOIvgb1; + if (selfheat) + dT0_dT = -dVox_dT / model->B4SOIvgb1; + } else { + T0 = 1; + dT0_dVox = dT0_dT = 0.0; + } -/* Igb1 dominates in inversion region, while Igb2 doninates in accumulation */ -/* v2.2.3 bug fix for residue at low Vgb */ - if (Vgb >= 0) - { - Igb = Igb1; - dIgb_dVg = dIgb1_dVg; - dIgb_dVd = dIgb1_dVd; - dIgb_dVb = dIgb1_dVb; - dIgb_dVe = dIgb1_dVe; /* v3.0 */ - dIgb_dT = dIgb1_dT; - } - else - { - Igb = Igb2; - dIgb_dVg = dIgb2_dVg; - dIgb_dVd = dIgb2_dVd; - dIgb_dVb = dIgb2_dVb; - dIgb_dVe = 0; /* v3.0 */ - dIgb_dT = dIgb2_dT; - } - - } - else { - Igb = 0.0; - dIgb_dVg = 0.0; - dIgb_dVd = 0.0; - dIgb_dVb = 0.0; - dIgb_dVe = 0.0; /* v3.0 */ - dIgb_dT = 0.0; - } - here->B4SOIig = Igb; - here->B4SOIgigg = dIgb_dVg; - here->B4SOIgigd = dIgb_dVd; - here->B4SOIgigb = dIgb_dVb; - here->B4SOIgige = dIgb_dVe; /* v3.0 */ - here->B4SOIgigs = -(dIgb_dVg + dIgb_dVd + dIgb_dVb + dIgb_dVe); /* v3.0 */ - here->B4SOIgigT = dIgb_dT; - - /* v4.1 */ - /* gate tunneling component in the AGBCP2 region */ - Vfb2 = Vfb + 1.12; - - if ((model->B4SOIigbMod!= 0) && (here->B4SOIsoiMod != 2) && - (here->B4SOIbodyMod != 0) && (here->B4SOIagbcp2 > 0) && - (vgp < Vfb2)) - /* v4.1: the Igb2_agbcp2 calculation is skipped for the ideal FD mode or if there is no "p" node */ - { - /* Vfb, Vfb2 are taken as constants in derivative calculation for simplicity */ - T0 = vgp - Vfb2; - - T1 = sqrt(T0 * T0 + 1.0e-4); - vgp_eff = 0.5 * (-T0 + T1 - 1.0e-2); - dvgp_eff_dvg = 0.5 * (-1.0 + T0 / T1); - dvgp_eff_dvp = -dvgp_eff_dvg; - - /* T11=A* T12=B* */ - T11 = (model->B4SOItype == NMOS) ? 3.42537e-7 : 4.97232e-7; - T12 = (model->B4SOItype == NMOS) ? 1.16645e12 : 7.45669e11; - - T2 = vgp * vgp_eff; - dT2_dVg = vgp * dvgp_eff_dvg + vgp_eff; - dT2_dVp = vgp * dvgp_eff_dvp - vgp_eff; - - T3 = pParam->B4SOIaigbcp2 * pParam->B4SOIcigbcp2 - - pParam->B4SOIbigbcp2; - T4 = pParam->B4SOIbigbcp2 * pParam->B4SOIcigbcp2; - T5 = (-T12) * model->B4SOItoxqm * (pParam->B4SOIaigbcp2 - + T3 * vgp_eff - T4 * vgp_eff * vgp_eff); - if (T5 > EXPL_THRESHOLD) - { - T6 = MAX_EXPL; - dT6_dVg = 0.0; - dT6_dVp = 0.0; - } - else if (T5 < -EXPL_THRESHOLD) - { - T6 = MIN_EXPL; - dT6_dVg = 0.0; - dT6_dVp = 0.0; - } - else - { - T6 = exp(T5); - T7 = T6 * (-T12) * model->B4SOItoxqm * - (T3 - 2.0 * T4 * vgp_eff); - dT6_dVg = T7 * dvgp_eff_dvg; - dT6_dVp = T7 * dvgp_eff_dvg; - } - T11 = T11 * here->B4SOIagbcp2 * pParam->B4SOIoxideRatio; - Ig_agbcp2 = T11 * T2 * T6; - dIg_agbcp2_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); - dIg_agbcp2_dVp = -dIg_agbcp2_dVg; - } - else { - Ig_agbcp2 = 0.0; - dIg_agbcp2_dVg = 0.0; - dIg_agbcp2_dVp = 0.0; - } - here->B4SOIigp = Ig_agbcp2; - here->B4SOIgigpg = dIg_agbcp2_dVg; - here->B4SOIgigpp = dIg_agbcp2_dVp; - - /* end of gate-body tunneling */ -/* end of v3.0 gate-tunneling */ - -/* v3.1 */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - if (model->B4SOIiiiMod == 0 ) - { - /* calculate substrate current Iii */ - if (pParam->B4SOIalpha0 <= 0.0) { + if (T0 < 0.01) { + T0 = 0.01; + dT0_dVox = dT0_dT = 0.0; + } + + /* v2.2.3 bug fix */ + T1 = (Leff * Weff / here->B4SOInseg + here->B4SOIagbcpd/here->B4SOInf) * 3.7622e-7 * OxideRatio; + + T2 = -3.1051e10 * model->B4SOItoxqm; + T3 = pParam->B4SOIalphaGB1; + T4 = pParam->B4SOIbetaGB1; + + T6 = T2*(T3 - T4 * Vox) / T0; + if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT; + + DEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */ + dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); + dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); + dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); + dT5_dVe = -T7 * dVox_dVe * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); /* v3.0 */ + if (selfheat) + dT5_dT = T7 * dT6_dT; + + Igb1 = T1 * Vgb * Vaux * T5; + dIgb1_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 + + Vgb*T5*dVaux_dVg); + dIgb1_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd); + dIgb1_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 + + Vgb*T5*dVaux_dVb); + dIgb1_dVe = T1 * (Vgb*Vaux*dT5_dVe + Vgb*T5*dVaux_dVe); /* v3.0 */ + if (selfheat) + dIgb1_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT); + else dIgb1_dT = 0.0; + + + Vox = Voxacc; + /* Voxeff is Vox limited below Voxh */ + T0 = model->B4SOIvoxh; + T1 = T0 - Vox - model->B4SOIdeltavox; + T3 = sqrt(T1 * T1 + 4*model->B4SOIdeltavox * T0); + Voxeff = T0 - 0.5 * (T1 + T3); + dVoxeff_dVox = 0.5 * (1.0 + T1 / T3); + + Vox = Voxeff; + dVox_dVg = dVoxacc_dVg * dVoxeff_dVox; + dVox_dVd = dVoxacc_dVd * dVoxeff_dVox; + dVox_dVb = dVoxacc_dVb * dVoxeff_dVox; + dVox_dT = 0; + + T0 = (-Vgb+(Vfb))/model->B4SOIvecb; + if (selfheat) + dT0_dT = 0; + + DEXP(T0, T1, T2); /* T1=exp(T0), T2=dT1_dT0 */ + if (selfheat) + dT1_dT = 0; + + Vaux = model->B4SOIvecb* log(1 + T1); + dVaux_dVg = -T2 / (1 + T1); + dVaux_dVd = 0; + dVaux_dVb = -dVaux_dVg; + if (selfheat) + dVaux_dT = 0; + + if (model->B4SOIvgb2 != 0) { + T0 = 1 - Vox / model->B4SOIvgb2; + dT0_dVox = -1.0/model->B4SOIvgb2; + if (selfheat) dT0_dT = -dVox_dT / model->B4SOIvgb2; + } else { + T0 = 1; + dT0_dVox = dT0_dT =0.0; + } + + if (T0 < 0.01) { + T0 = 0.01; + dT0_dVox = dT0_dT =0.0; + } + + /* v2.2.3 bug fix */ + T1 = (Leff * Weff / here->B4SOInseg + here->B4SOIagbcpd/here->B4SOInf) * 4.9758e-7 * OxideRatio; + + T2 = -2.357e10 * model->B4SOItoxqm; + T3 = pParam->B4SOIalphaGB2; + T4 = pParam->B4SOIbetaGB2; + + T6 = T2*(T3 - T4 * Vox) / T0; + if (selfheat) dT6_dT = -T2 * T4 * dVox_dT / T0 - T6/T0 * dT0_dT; + + DEXP(T6, T5, T7); /* T5=exp(T6), T7=dT5_dT6 */ + dT5_dVg = -T7 * dVox_dVg * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); + dT5_dVd = -T7 * dVox_dVd * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); + dT5_dVb = -T7 * dVox_dVb * T2 / T0 * (T4 + (T3 - T4 * Vox) / T0 * dT0_dVox); + if (selfheat) + dT5_dT = T7 * dT6_dT; + + Igb2 = T1 * Vgb * Vaux * T5; + dIgb2_dVg = T1 * (Vgb*Vaux*dT5_dVg + dVgb_dVg*Vaux*T5 + + Vgb*T5*dVaux_dVg); + dIgb2_dVd = T1 * (Vgb*Vaux*dT5_dVd + Vgb*T5*dVaux_dVd); + dIgb2_dVb = T1 * (Vgb*Vaux*dT5_dVb + dVgb_dVb*Vaux*T5 + + Vgb*T5*dVaux_dVb); + if (selfheat) + dIgb2_dT = T1 * Vgb * (Vaux*dT5_dT + T5*dVaux_dT); + else dIgb2_dT = 0.0; + + + /* Igb1 dominates in inversion region, while Igb2 dominates in accumulation */ + /* v2.2.3 bug fix for residue at low Vgb */ + if (Vgb >= 0) + { + Igb = Igb1; + dIgb_dVg = dIgb1_dVg; + dIgb_dVd = dIgb1_dVd; + dIgb_dVb = dIgb1_dVb; + dIgb_dVe = dIgb1_dVe; /* v3.0 */ + dIgb_dT = dIgb1_dT; + } + else + { + Igb = Igb2; + dIgb_dVg = dIgb2_dVg; + dIgb_dVd = dIgb2_dVd; + dIgb_dVb = dIgb2_dVb; + dIgb_dVe = 0; /* v3.0 */ + dIgb_dT = dIgb2_dT; + } + Vfb2 = Vfb + 1.12; /* Bug fix #18 Jul09*/ + } + else { + Igb = 0.0; + dIgb_dVg = 0.0; + dIgb_dVd = 0.0; + dIgb_dVb = 0.0; + dIgb_dVe = 0.0; /* v3.0 */ + dIgb_dT = 0.0; + } + here->B4SOIig = Igb; + here->B4SOIgigg = dIgb_dVg; + here->B4SOIgigd = dIgb_dVd; + here->B4SOIgigb = dIgb_dVb; + here->B4SOIgige = dIgb_dVe; /* v3.0 */ + here->B4SOIgigs = -(dIgb_dVg + dIgb_dVd + dIgb_dVb + dIgb_dVe); /* v3.0 */ + here->B4SOIgigT = dIgb_dT; + + /* v4.1 */ + /* gate tunneling component in the AGBCP2 region */ + /* Vfb2 = Vfb + 1.12; Bug fix #18 Jul09 Code moved to 4370 where Vfb definition is valid*/ + + if ((model->B4SOIigbMod!= 0) && (here->B4SOIsoiMod != 2) && + (here->B4SOIbodyMod != 0) && (here->B4SOIagbcp2 > 0) && + (vgp < Vfb2)) + /* v4.1: the Igb2_agbcp2 calculation is skipped for the ideal FD mode or if there is no "p" node */ + { + /* Vfb, Vfb2 are taken as constants in derivative calculation for simplicity */ + T0 = vgp - Vfb2; + + T1 = sqrt(T0 * T0 + 1.0e-4); + vgp_eff = 0.5 * (-T0 + T1 - 1.0e-2); + dvgp_eff_dvg = 0.5 * (-1.0 + T0 / T1); + dvgp_eff_dvp = -dvgp_eff_dvg; + + /* T11=A* T12=B* */ + T11 = (model->B4SOItype == NMOS) ? 3.42537e-7 : 4.97232e-7; + T12 = (model->B4SOItype == NMOS) ? 1.16645e12 : 7.45669e11; + + T2 = vgp * vgp_eff; + dT2_dVg = vgp * dvgp_eff_dvg + vgp_eff; + dT2_dVp = vgp * dvgp_eff_dvp - vgp_eff; + + T3 = pParam->B4SOIaigbcp2 * pParam->B4SOIcigbcp2 + - pParam->B4SOIbigbcp2; + T4 = pParam->B4SOIbigbcp2 * pParam->B4SOIcigbcp2; + T5 = (-T12) * model->B4SOItoxqm * (pParam->B4SOIaigbcp2 + + T3 * vgp_eff - T4 * vgp_eff * vgp_eff); + if (T5 > EXPL_THRESHOLD) + { + T6 = MAX_EXPL; + dT6_dVg = 0.0; + dT6_dVp = 0.0; + } + else if (T5 < -EXPL_THRESHOLD) + { + T6 = MIN_EXPL; + dT6_dVg = 0.0; + dT6_dVp = 0.0; + } + else + { + T6 = exp(T5); + T7 = T6 * (-T12) * model->B4SOItoxqm * + (T3 - 2.0 * T4 * vgp_eff); + dT6_dVg = T7 * dvgp_eff_dvg; + dT6_dVp = T7 * dvgp_eff_dvg; + } + T11 = T11 * here->B4SOIagbcp2 * pParam->B4SOIoxideRatio/here->B4SOInf; + Ig_agbcp2 = T11 * T2 * T6; + dIg_agbcp2_dVg = T11 * (T2 * dT6_dVg + T6 * dT2_dVg); + dIg_agbcp2_dVp = -dIg_agbcp2_dVg; + } + else { + Ig_agbcp2 = 0.0; + dIg_agbcp2_dVg = 0.0; + dIg_agbcp2_dVp = 0.0; + } + here->B4SOIigp = Ig_agbcp2; + here->B4SOIgigpg = dIg_agbcp2_dVg; + here->B4SOIgigpp = dIg_agbcp2_dVp; + + /* end of gate-body tunneling */ + /* end of v3.0 gate-tunneling */ + + /* v3.1 */ + if (here->B4SOIsoiMod != 2) /* v3.2 */ + { + Idsmosfet = 0.0; + Ratio = dRatio_dVg = dRatio_dVd = dRatio_dVb = dRatio_dVe = dRatio_dT = 0.0; + if (model->B4SOIiiiMod == 0 ) + { + /* calculate substrate current Iii */ + if (pParam->B4SOIalpha0 <= 0.0) { Giig = Giib = Giid = GiiT = 0.0; Giie = 0; /* v3.0 */ here->B4SOIiii = Iii = 0.0; - } - else { + } + else { Vdsatii0 = pParam->B4SOIvdsatii0 * (1 + model->B4SOItii * (TempRatio-1.0)) - - pParam->B4SOIlii / Leff; - if (selfheat) - dVdsatii0_dT = pParam->B4SOIvdsatii0 * model->B4SOItii * dTempRatio_dT; - else - dVdsatii0_dT = 0; + - pParam->B4SOIlii / Leff; + if (selfheat) + dVdsatii0_dT = pParam->B4SOIvdsatii0 * model->B4SOItii * dTempRatio_dT; + else + dVdsatii0_dT = 0; /* Calculate VgsStep */ T0 = pParam->B4SOIesatii * Leff; /* v3.0 bug fix: T0 is dimentionless (i.e., scaled by 1V) */ @@ -4446,9 +4684,9 @@ if( vds < 0.0) T0 = 1 / (1 + pParam->B4SOIsii1 * Vgsteff); if (selfheat) - dT0_dT = - pParam->B4SOIsii1 * T0 * T0 *dVgsteff_dT; + dT0_dT = - pParam->B4SOIsii1 * T0 * T0 *dVgsteff_dT; else - dT0_dT = 0; + dT0_dT = 0; T3 = T0 + pParam->B4SOIsii2; T4 = Vgst * pParam->B4SOIsii1 * T0 * T0; T2 = Vgst * T3; @@ -4457,7 +4695,7 @@ if( vds < 0.0) dT2_dVe = T3 * dVgst_dVb * dVbseff_dVe - T4 * dVgsteff_dVe; /* v3.0 */ dT2_dVd = T3 * (dVgst_dVd - dVth_dVb * dVbseff_dVd) - T4 * dVgsteff_dVd; /* v3.0 */ if (selfheat) - dT2_dT = -(dVth_dT + dVth_dVb * dVbseff_dT) * T3 + Vgst * dT0_dT; /* v3.0 */ + dT2_dT = -(dVth_dT + dVth_dVb * dVbseff_dT) * T3 + Vgst * dT0_dT; /* v3.0 */ else dT2_dT = 0; @@ -4465,8 +4703,8 @@ if( vds < 0.0) dT3_dVd = - pParam->B4SOIsiid * T3 * T3; VgsStep = T1 * T2 * T3; - if (selfheat) - dVgsStep_dT = T1 * T3 * dT2_dT; + if (selfheat) + dVgsStep_dT = T1 * T3 * dT2_dT; else dVgsStep_dT = 0; Vdsatii = Vdsatii0 + VgsStep; Vdiff = Vds - Vdsatii; @@ -4475,110 +4713,110 @@ if( vds < 0.0) dVdiff_dVe = - T1 * T3 * dT2_dVe; /* v3.0 */ dVdiff_dVd = 1.0 - T1 * (T3 * dT2_dVd + T2 * dT3_dVd); if (selfheat) - dVdiff_dT = -(dVdsatii0_dT + dVgsStep_dT); + dVdiff_dT = -(dVdsatii0_dT + dVgsStep_dT); else dVdiff_dT = 0; T0 = pParam->B4SOIbeta2 + pParam->B4SOIbeta1 * Vdiff - + pParam->B4SOIbeta0 * Vdiff * Vdiff; + + pParam->B4SOIbeta0 * Vdiff * Vdiff; if (T0 < 1e-5) { - T0 = 1e-5; - dT0_dVg = dT0_dVd = dT0_dVb = dT0_dT = 0.0; - dT0_dVe = 0; /* v3.0 */ - } + T0 = 1e-5; + dT0_dVg = dT0_dVd = dT0_dVb = dT0_dT = 0.0; + dT0_dVe = 0; /* v3.0 */ + } else { - T1 = pParam->B4SOIbeta1 + 2 * pParam->B4SOIbeta0 * Vdiff; - dT0_dVg = T1 * dVdiff_dVg; - dT0_dVb = T1 * dVdiff_dVb; - dT0_dVd = T1 * dVdiff_dVd; - dT0_dVe = T1 * dVdiff_dVe; /* v3.0 */ - if (selfheat) - dT0_dT = T1 * dVdiff_dT; - else - dT0_dT = 0; - } + T1 = pParam->B4SOIbeta1 + 2 * pParam->B4SOIbeta0 * Vdiff; + dT0_dVg = T1 * dVdiff_dVg; + dT0_dVb = T1 * dVdiff_dVb; + dT0_dVd = T1 * dVdiff_dVd; + dT0_dVe = T1 * dVdiff_dVe; /* v3.0 */ + if (selfheat) + dT0_dT = T1 * dVdiff_dT; + else + dT0_dT = 0; + } if ((T0 < Vdiff / EXPL_THRESHOLD) && (Vdiff > 0.0)) { - Ratio = pParam->B4SOIalpha0 * MAX_EXPL; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - dRatio_dVe = 0; /* v3.0 */ + Ratio = pParam->B4SOIalpha0 * MAX_EXPL; + dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; + dRatio_dVe = 0; /* v3.0 */ } else if ((T0 < -Vdiff / EXPL_THRESHOLD) && (Vdiff < 0.0)) { - Ratio = pParam->B4SOIalpha0 * MIN_EXPL; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - dRatio_dVe = 0; /* v3.0 */ + Ratio = pParam->B4SOIalpha0 * MIN_EXPL; + dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; + dRatio_dVe = 0; /* v3.0 */ } else { - Ratio = pParam->B4SOIalpha0 * exp(Vdiff / T0); - T1 = Ratio / T0 / T0; - dRatio_dVg = T1 * (T0 * dVdiff_dVg - Vdiff * dT0_dVg); - dRatio_dVb = T1 * (T0 * dVdiff_dVb - Vdiff * dT0_dVb); - dRatio_dVd = T1 * (T0 * dVdiff_dVd - Vdiff * dT0_dVd); - /* v3.0 */ - dRatio_dVe = T1 * (T0 * dVdiff_dVe - Vdiff * dT0_dVe); - - if (selfheat) - dRatio_dT = T1 * (T0 * dVdiff_dT - Vdiff * dT0_dT); - else - dRatio_dT = 0; + Ratio = pParam->B4SOIalpha0 * exp(Vdiff / T0); + T1 = Ratio / T0 / T0; + dRatio_dVg = T1 * (T0 * dVdiff_dVg - Vdiff * dT0_dVg); + dRatio_dVb = T1 * (T0 * dVdiff_dVb - Vdiff * dT0_dVb); + dRatio_dVd = T1 * (T0 * dVdiff_dVd - Vdiff * dT0_dVd); + /* v3.0 */ + dRatio_dVe = T1 * (T0 * dVdiff_dVe - Vdiff * dT0_dVe); + + if (selfheat) + dRatio_dT = T1 * (T0 * dVdiff_dT - Vdiff * dT0_dT); + else + dRatio_dT = 0; } /* Avoid too high ratio */ if (Ratio > 10.0) { - Ratio = 10.0; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - dRatio_dVe = 0; /* v3.0 */ + Ratio = 10.0; + dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; + dRatio_dVe = 0; /* v3.0 */ } T0 = Ids + pParam->B4SOIfbjtii * Ic; here->B4SOIiii = Iii = Ratio * T0; Giig = Ratio * Gm + T0 * dRatio_dVg; - Giib = Ratio * (Gmb + pParam->B4SOIfbjtii * Gcb) - + T0 * dRatio_dVb; - Giid = Ratio * (Gds + pParam->B4SOIfbjtii * Gcd) - + T0 * dRatio_dVd; - /* v3.0 */ - Giie = Ratio * Gme + T0 * dRatio_dVe; + Giib = Ratio * (Gmb + pParam->B4SOIfbjtii * Gcb) + + T0 * dRatio_dVb; + Giid = Ratio * (Gds + pParam->B4SOIfbjtii * Gcd) + + T0 * dRatio_dVd; + /* v3.0 */ + Giie = Ratio * Gme + T0 * dRatio_dVe; if (selfheat) - GiiT = Ratio * (GmT + pParam->B4SOIfbjtii * GcT) + GiiT = Ratio * (GmT + pParam->B4SOIfbjtii * GcT) + T0 * dRatio_dT; else - GiiT = 0.0; - - } - } - else /*new Iii model*/ - { - /*Idsmosfet part*/ - if (pParam->B4SOIalpha0 <= 0.0) { - Giig = Giib = Giid = GiiT = 0.0; - Giie = 0; /* v3.0 */ - here->B4SOIiii = Iii = 0.0; - Idsmosfet = 0.0; - dIiibjt_dVb = 0.0; - dIiibjt_dVd = 0.0; - dIiibjt_dT = 0.0; - - } - else { + GiiT = 0.0; + + } + } + else /*new Iii model*/ + { + /*Idsmosfet part*/ + if (pParam->B4SOIalpha0 <= 0.0) { + /* Giig = Giib = Giid = GiiT = 0.0; + Giie = 0; */ /* v3.0 */ + /* here->B4SOIiii = Iii = 0.0; */ /* v4.2 bugfix # 38 */ + /* Idsmosfet = 0.0; */ /*v 4.2 bugfix #38 */ + /*dIiibjt_dVb = 0.0; */ /* v4.2 bugfix # 38 */ + /*dIiibjt_dVd = 0.0; + dIiibjt_dT = 0.0; */ + Ratio = 0; /* v4.2 bugfix # 38 */ + } + else { Vdsatii0 = pParam->B4SOIvdsatii0 * (1 + model->B4SOItii * (TempRatio-1.0)) - - pParam->B4SOIlii / Leff; - if (selfheat) - dVdsatii0_dT = pParam->B4SOIvdsatii0 * model->B4SOItii * dTempRatio_dT; - else - dVdsatii0_dT = 0; + - pParam->B4SOIlii / Leff; + if (selfheat) + dVdsatii0_dT = pParam->B4SOIvdsatii0 * model->B4SOItii * dTempRatio_dT; + else + dVdsatii0_dT = 0; /* Calculate VgsStep */ - T0 = pParam->B4SOIesatii * Leff; /* v3.0 bug fix: T0 is dimentionless (i.e., scaled by 1V) */ + T0 = pParam->B4SOIesatii * Leff; /* v3.0 bug fix: T0 is dimensionless (i.e., scaled by 1V) */ T1 = pParam->B4SOIsii0 * T0 / (1.0 + T0); T0 = 1 / (1 + pParam->B4SOIsii1 * Vgsteff); if (selfheat) - dT0_dT = - pParam->B4SOIsii1 * T0 * T0 *dVgsteff_dT; + dT0_dT = - pParam->B4SOIsii1 * T0 * T0 *dVgsteff_dT; else - dT0_dT = 0; + dT0_dT = 0; T3 = T0 + pParam->B4SOIsii2; T4 = Vgst * pParam->B4SOIsii1 * T0 * T0; T2 = Vgst * T3; @@ -4587,7 +4825,7 @@ if( vds < 0.0) dT2_dVe = T3 * dVgst_dVb * dVbseff_dVe - T4 * dVgsteff_dVe; /* v3.0 */ dT2_dVd = T3 * (dVgst_dVd - dVth_dVb * dVbseff_dVd) - T4 * dVgsteff_dVd; /* v3.0 */ if (selfheat) - dT2_dT = -(dVth_dT + dVth_dVb * dVbseff_dT) * T3 + Vgst * dT0_dT; /* v3.0 */ + dT2_dT = -(dVth_dT + dVth_dVb * dVbseff_dT) * T3 + Vgst * dT0_dT; /* v3.0 */ else dT2_dT = 0; @@ -4595,8 +4833,8 @@ if( vds < 0.0) dT3_dVd = - pParam->B4SOIsiid * T3 * T3; VgsStep = T1 * T2 * T3; - if (selfheat) - dVgsStep_dT = T1 * T3 * dT2_dT; + if (selfheat) + dVgsStep_dT = T1 * T3 * dT2_dT; else dVgsStep_dT = 0; Vdsatii = Vdsatii0 + VgsStep; Vdiff = Vds - Vdsatii; @@ -4605,3611 +4843,3752 @@ if( vds < 0.0) dVdiff_dVe = - T1 * T3 * dT2_dVe; /* v3.0 */ dVdiff_dVd = 1.0 - T1 * (T3 * dT2_dVd + T2 * dT3_dVd); if (selfheat) - dVdiff_dT = -(dVdsatii0_dT + dVgsStep_dT); + dVdiff_dT = -(dVdsatii0_dT + dVgsStep_dT); else dVdiff_dT = 0; T0 = pParam->B4SOIbeta2 + pParam->B4SOIbeta1 * Vdiff - + pParam->B4SOIbeta0 * Vdiff * Vdiff; + + pParam->B4SOIbeta0 * Vdiff * Vdiff; if (T0 < 1e-5) { - T0 = 1e-5; - dT0_dVg = dT0_dVd = dT0_dVb = dT0_dT = 0.0; - dT0_dVe = 0; /* v3.0 */ - } + T0 = 1e-5; + dT0_dVg = dT0_dVd = dT0_dVb = dT0_dT = 0.0; + dT0_dVe = 0; /* v3.0 */ + } else { - T1 = pParam->B4SOIbeta1 + 2 * pParam->B4SOIbeta0 * Vdiff; - dT0_dVg = T1 * dVdiff_dVg; - dT0_dVb = T1 * dVdiff_dVb; - dT0_dVd = T1 * dVdiff_dVd; - dT0_dVe = T1 * dVdiff_dVe; /* v3.0 */ - if (selfheat) - dT0_dT = T1 * dVdiff_dT; - else - dT0_dT = 0; - } + T1 = pParam->B4SOIbeta1 + 2 * pParam->B4SOIbeta0 * Vdiff; + dT0_dVg = T1 * dVdiff_dVg; + dT0_dVb = T1 * dVdiff_dVb; + dT0_dVd = T1 * dVdiff_dVd; + dT0_dVe = T1 * dVdiff_dVe; /* v3.0 */ + if (selfheat) + dT0_dT = T1 * dVdiff_dT; + else + dT0_dT = 0; + } if ((T0 < Vdiff / EXPL_THRESHOLD) && (Vdiff > 0.0)) { - Ratio = pParam->B4SOIalpha0 * MAX_EXPL; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - dRatio_dVe = 0; /* v3.0 */ + Ratio = pParam->B4SOIalpha0 * MAX_EXPL; + dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; + dRatio_dVe = 0; /* v3.0 */ } else if ((T0 < -Vdiff / EXPL_THRESHOLD) && (Vdiff < 0.0)) { - Ratio = pParam->B4SOIalpha0 * MIN_EXPL; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - dRatio_dVe = 0; /* v3.0 */ + Ratio = pParam->B4SOIalpha0 * MIN_EXPL; + dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; + dRatio_dVe = 0; /* v3.0 */ } else { - Ratio = pParam->B4SOIalpha0 * exp(Vdiff / T0); - T1 = Ratio / T0 / T0; - dRatio_dVg = T1 * (T0 * dVdiff_dVg - Vdiff * dT0_dVg); - dRatio_dVb = T1 * (T0 * dVdiff_dVb - Vdiff * dT0_dVb); - dRatio_dVd = T1 * (T0 * dVdiff_dVd - Vdiff * dT0_dVd); - /* v3.0 */ - dRatio_dVe = T1 * (T0 * dVdiff_dVe - Vdiff * dT0_dVe); - - if (selfheat) - dRatio_dT = T1 * (T0 * dVdiff_dT - Vdiff * dT0_dT); - else - dRatio_dT = 0; + Ratio = pParam->B4SOIalpha0 * exp(Vdiff / T0); + T1 = Ratio / T0 / T0; + dRatio_dVg = T1 * (T0 * dVdiff_dVg - Vdiff * dT0_dVg); + dRatio_dVb = T1 * (T0 * dVdiff_dVb - Vdiff * dT0_dVb); + dRatio_dVd = T1 * (T0 * dVdiff_dVd - Vdiff * dT0_dVd); + /* v3.0 */ + dRatio_dVe = T1 * (T0 * dVdiff_dVe - Vdiff * dT0_dVe); + + if (selfheat) + dRatio_dT = T1 * (T0 * dVdiff_dT - Vdiff * dT0_dT); + else + dRatio_dT = 0; } /* Avoid too high ratio */ if (Ratio > 10.0) { - Ratio = 10.0; - dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; - dRatio_dVe = 0; /* v3.0 */ + Ratio = 10.0; + dRatio_dVg = dRatio_dVb = dRatio_dVd = dRatio_dT = 0.0; + dRatio_dVe = 0; /* v3.0 */ } T0 = Ids; Idsmosfet = Ratio * T0; - } - /*New BJT part*/ - - T0 = (pParam->B4SOIcbjtii + pParam->B4SOIebjtii * Leff)/Leff; - - Vbci= pParam->B4SOIvbci*(1.0+model->B4SOItvbci*(TempRatio-1.0)); - T1 = Vbci - (Vbs - Vds); - - - T2 = pParam->B4SOImbjtii -1.0; - - /* - if(T1 == 0.0) - T3 =1.0; - else - T3 = -pParam->B4SOIabjtii * pow(T1,T2); - */ - - if(T1<=0.0) - T3 = 0.0; - else - T3 = -pParam->B4SOIabjtii * pow(T1,T2); - - - - - - if (T3> EXPL_THRESHOLD) - T4 = MAX_EXPL; - else if (T3 < -EXPL_THRESHOLD) - T4 = MIN_EXPL; - else - T4 = exp(T3); - - - if (T1==0.0) - {if(T3> EXPL_THRESHOLD) - { - dT4_dVd = 0.0; - dT4_dVb = 0.0; - } - else if (T3 < -EXPL_THRESHOLD) - { - dT4_dVd = 0.0; - dT4_dVb = 0.0; - } - else - { - dT4_dVd = - T4 * pParam->B4SOIabjtii* T2 ; - dT4_dVb = T4 * pParam->B4SOIabjtii* T2 ; - } - } - else - { - if(T3> EXPL_THRESHOLD) - { - dT4_dVd = 0.0; - dT4_dVb = 0.0; - } - else if (T3 < -EXPL_THRESHOLD) - { - dT4_dVd = 0.0; - dT4_dVb = 0.0; - } - else - {T5 = T2-1.0; - if (T1<=0.0) - {dT4_dVd = 0.0; - dT4_dVd = 0.0; - - } - else - { - dT4_dVd = - T4 * pParam->B4SOIabjtii* T2 * pow(T1,T5); - dT4_dVb = T4 * pParam->B4SOIabjtii* T2 * pow(T1,T5); - } - } - - } - - Iiibjt = T0 * Ic * T1 * T4; - - if (selfheat) - {T5= T2-1.0; - dVbci_dT = pParam->B4SOIvbci * model->B4SOItvbci *model->B4SOItnom; - if(T1<=0.0) - dT4_dT = 0.0; - else - dT4_dT = -T4 * pParam->B4SOIabjtii* T2 * pow(T1,T5)*dVbci_dT; - - dIiibjt_dT = T0 * Ic * T4 * dVbci_dT - + T0 *Ic *T1 * dT4_dT; - - } - else - { - dVbci_dT = 0.0; - dT4_dT =0.0; - dIiibjt_dT = 0.0; - } - - - dIiibjt_dVd = T0 * Ic *T4 - + T0 *Ic *T1*dT4_dVd; - dIiibjt_dVb = -T0 * Ic *T4 + T0*Ic*T1*dT4_dVb; - - - - - /*Total Iii*/ - T0 = Ids; - here->B4SOIiii = Iii = Idsmosfet + Iiibjt; - - - Giig = Ratio * Gm + T0 * dRatio_dVg; - Giib = Ratio * Gmb + T0 * dRatio_dVb + dIiibjt_dVb; - Giid = Ratio * Gds + T0 * dRatio_dVd + dIiibjt_dVd; - Giie = Ratio * Gme + T0 * dRatio_dVe; - - if (selfheat) - GiiT = Ratio * GmT + T0 * dRatio_dT - + dIiibjt_dT ; - else - GiiT = 0.0; - - } - - /* Current through body resistor */ - /* Current going out is +ve */ - if ((here->B4SOIbodyMod == 0) || (here->B4SOIbodyMod == 2)) - { - Ibp = Gbpbs = Gbpps = 0.0; - } - else { /* here->B4SOIbodyMod == 1 */ - if (pParam->B4SOIrbody < 1e-3) /* 3.2 bug fix */ - { - if (here->B4SOIrbodyext <= 1e-3) /* 3.2 bug fix */ - T0 = 1.0 / 1e-3; /* 3.2 bug fix */ - else - T0 = 1.0 / here->B4SOIrbodyext; - Ibp = Vbp * T0; - Gbpbs = T0 * dVbp_dVb; - Gbpps = -T0 * dVbp_dVb; - } else - { - Gbpbs = 1.0 / (pParam->B4SOIrbody + here->B4SOIrbodyext); - Ibp = Vbp * Gbpbs; - Gbpps = - Gbpbs; - } - } - - here->B4SOIibp = Ibp; - here->B4SOIgbpbs = Gbpbs; - here->B4SOIgbpps = Gbpps; - here->B4SOIgbpT = 0.0; - here->B4SOIcbodcon = Ibp - (Gbpbs * Vbs + Gbpps * Vps); - - } - - else /* v3.1 soiMod=2: ideal FD */ - { - Giig = Giib = Giid = Giie = GiiT = 0.0; - here->B4SOIiii = Iii = 0.0; - - here->B4SOIibp = Ibp = 0.0; - here->B4SOIgbpbs = 0.0; - here->B4SOIgbpps = here->B4SOIgbpT = here->B4SOIcbodcon = 0.0; - Gbpbs = Gbpps = 0.0; - } -/* v3.1 */ - - - - /* Current going out of drainprime node into the drain of device */ - /* "node" means the SPICE circuit node */ - - here->B4SOIcdrain = Ids + Ic; - here->B4SOIcd = Ids + Ic - Ibd + Iii + Igidl; - here->B4SOIcb = Ibs + Ibd + Ibp - Iii - Igidl - Igisl - Igb; - here->B4SOIgds = Gds + Gcd; - here->B4SOIgm = Gm; - here->B4SOIgmbs = Gmb + Gcb; - /* v3.0 */ - here->B4SOIgme = Gme; - - - /* v3.1 for RF */ - /* Calculate Rg */ - if (here->B4SOIrgateMod >1) - { T9 = pParam->B4SOIxrcrg2 * model->B4SOIvtm; - T0 = T9 *beta; - dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9; - dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9; - dT0_dVg = dbeta_dVg * T9; - T1 = 1 + gche * Rds; - T2 = 1 / T1; - - here->B4SOIgcrg = pParam->B4SOIxrcrg1 - * (T0 + here->B4SOIidovVds); - dIdlovVdseff_dVg = (T2 * dgche_dVg - - IdlovVdseff * gche * dRds_dVg) / T1; - dIdlovVdseff_dVd = T2 * dgche_dVd / T1; - dIdlovVdseff_dVb = (T2 * dgche_dVb - - IdlovVdseff * gche * dRds_dVb) / T1; - - T9 = diffVds / Va; - T3 = 1.0 + T9; - - T4 = T3 * dIdlovVdseff_dVg - - IdlovVdseff * (dVdseff_dVg + T9 * dVa_dVg) / Va; - T5 = T3 * dIdlovVdseff_dVd + IdlovVdseff - * (1.0 - dVdseff_dVd - T9 * dVa_dVd) / Va; - T6 = T3 * dIdlovVdseff_dVb - - IdlovVdseff * (dVdseff_dVb + T9 * dVa_dVb) / Va; - - tmp1 = (T4 * dVgsteff_dVd + T6 * dVbseff_dVd + T5) - / here->B4SOInseg; - tmp2 = (T4 * dVgsteff_dVg + T6 * dVbseff_dVg) - / here->B4SOInseg; - tmp3 = (T4 * dVgsteff_dVb + T6 * dVbseff_dVb) - / here->B4SOInseg; - - here->B4SOIgcrgd = pParam->B4SOIxrcrg1 * (dT0_dVd +tmp1); - here->B4SOIgcrgg = pParam->B4SOIxrcrg1 - * (dT0_dVg * dVgsteff_dVg + tmp2); - here->B4SOIgcrgb = pParam->B4SOIxrcrg1 - * (dT0_dVb * dVbseff_dVb + tmp3); - - if (here->B4SOInf != 1.0) - { here->B4SOIgcrg *= here->B4SOInf; - here->B4SOIgcrgg *= here->B4SOInf; - here->B4SOIgcrgd *= here->B4SOInf; - here->B4SOIgcrgb *= here->B4SOInf; - } - - if (here->B4SOIrgateMod == 2) - { T10 = here->B4SOIgrgeltd * here->B4SOIgrgeltd; - T11 = here->B4SOIgrgeltd + here->B4SOIgcrg; - here->B4SOIgcrg = here->B4SOIgrgeltd - * here->B4SOIgcrg / T11; - T12 = T10 / T11 /T11; - here->B4SOIgcrgg *= T12; - here->B4SOIgcrgd *= T12; - here->B4SOIgcrgb *= T12; } + /*New BJT part*/ - here->B4SOIgcrgs = -(here->B4SOIgcrgg + here->B4SOIgcrgd - + here->B4SOIgcrgb); - } /* v3.1 added Rg for RF end */ - - /* v4.0 Calculate bias-dependent external S/D resistance */ - if (model->B4SOIrdsMod) - { /* Rs(V) */ - T0 = vgs - pParam->B4SOIvfbsd; - T1 = sqrt(T0 * T0 + 1.0e-4); - vgs_eff = 0.5 * (T0 + T1); - dvgs_eff_dvg = vgs_eff / T1; - - T0 = 1.0 + pParam->B4SOIprwg * vgs_eff; - dT0_dVg = -pParam->B4SOIprwg / T0 / T0 * dvgs_eff_dvg; - T1 = -pParam->B4SOIprwb * vbs; - dT1_dVb = -pParam->B4SOIprwb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); - dT3_dVg = T3 / (T3 - T2); - dT3_dVb = dT3_dVg * dT1_dVb; - dT3_dVg *= dT0_dVg; - - T4 = rs0 * 0.5; - Rs = rswmin + T3 * T4; - dRs_dVg = T4 * dT3_dVg; - dRs_dVb = T4 * dT3_dVb; - - T0 = 1.0 + here->B4SOIsourceConductance * Rs; - here->B4SOIgstot = here->B4SOIsourceConductance / T0; - T0 = -here->B4SOIgstot * here->B4SOIgstot; - dgstot_dvd = 0.0; /* place holder */ - dgstot_dve = 0.0; /* place holder */ - dgstot_dvg = T0 * dRs_dVg; - dgstot_dvb = T0 * dRs_dVb; - dgstot_dvs = -(dgstot_dvg + dgstot_dvb + dgstot_dvd - + dgstot_dve); - if (selfheat) { - dRs_dT = drswmin_dT + T3 * 0.5 * drs0_dT; - dgstot_dT = T0 * dRs_dT; - } - else dRs_dT = dgstot_dT = 0.0; - - /* Rd(V) */ - T0 = vgd - pParam->B4SOIvfbsd; - T1 = sqrt(T0 * T0 + 1.0e-4); - vgd_eff = 0.5 * (T0 + T1); - dvgd_eff_dvg = vgd_eff / T1; - - T0 = 1.0 + pParam->B4SOIprwg * vgd_eff; - dT0_dVg = -pParam->B4SOIprwg / T0 / T0 * dvgd_eff_dvg; - T1 = -pParam->B4SOIprwb * vbd; - dT1_dVb = -pParam->B4SOIprwb; - - T2 = 1.0 / T0 + T1; - T3 = T2 + sqrt(T2 * T2 + 0.01); - dT3_dVg = T3 / (T3 - T2); - dT3_dVb = dT3_dVg * dT1_dVb; - dT3_dVg *= dT0_dVg; - - T4 = pParam->B4SOIrd0 * 0.5; - Rd = pParam->B4SOIrdwmin + T3 * T4; - dRd_dVg = T4 * dT3_dVg; - dRd_dVb = T4 * dT3_dVb; - T0 = 1.0 + here->B4SOIdrainConductance * Rd; - here->B4SOIgdtot = here->B4SOIdrainConductance / T0; - T0 = -here->B4SOIgdtot * here->B4SOIgdtot; - dgdtot_dvs = 0.0; - dgdtot_dve = 0.0; - dgdtot_dvg = T0 * dRd_dVg; - dgdtot_dvb = T0 * dRd_dVb; - dgdtot_dvd = -(dgdtot_dvg + dgdtot_dvb + dgdtot_dvs - + dgdtot_dve); - if (selfheat) { - dRd_dT = drdwmin_dT + T3 * 0.5 * drd0_dT; - dgdtot_dT = T0 * dRd_dT; - } - else dRd_dT = dgdtot_dT = 0.0; - - here->B4SOIgstotd = vses * dgstot_dvd; - here->B4SOIgstotg = vses * dgstot_dvg; - here->B4SOIgstots = vses * dgstot_dvs; - here->B4SOIgstotb = vses * dgstot_dvb; - - T2 = vdes - vds; - here->B4SOIgdtotd = T2 * dgdtot_dvd; - here->B4SOIgdtotg = T2 * dgdtot_dvg; - here->B4SOIgdtots = T2 * dgdtot_dvs; - here->B4SOIgdtotb = T2 * dgdtot_dvb; - } - else - { here->B4SOIgstot = here->B4SOIgstotd = here->B4SOIgstotg - = here->B4SOIgstots = here->B4SOIgstotb - = 0.0; - here->B4SOIgdtot = here->B4SOIgdtotd = here->B4SOIgdtotg - = here->B4SOIgdtots = here->B4SOIgdtotb - = 0.0; - } - - if (selfheat) - here->B4SOIgmT = GmT + GcT; - else - here->B4SOIgmT = 0.0; - - /* note that sign is switched because power flows out - of device into the temperature node. - Currently ommit self-heating due to bipolar current - because it can cause convergence problem*/ - - here->B4SOIgtempg = -Gm * Vds; - here->B4SOIgtempb = -Gmb * Vds; - /* v3.0 */ - here->B4SOIgtempe = -Gme * Vds; - - here->B4SOIgtempT = -GmT * Vds; - here->B4SOIgtempd = -Gds * Vds - Ids; - here->B4SOIcth = - Ids * Vds - model->B4SOItype * - (here->B4SOIgtempg * Vgs + here->B4SOIgtempb * Vbs - + here->B4SOIgtempe * Ves - + here->B4SOIgtempd * Vds) - - here->B4SOIgtempT * delTemp; /* v3.0 */ - - - /* Body current which flows into drainprime node from the drain of device */ - - here->B4SOIgjdb = Gjdb - Giib -Ggidlb - Ggislb; /* v4.0 */ - here->B4SOIgjdd = Gjdd - (Giid + Ggidld); - here->B4SOIgjdg = - (Giig + Ggidlg + Ggislg); - here->B4SOIgjde = - Giie; - if (selfheat) here->B4SOIgjdT = GjdT - GiiT; - else here->B4SOIgjdT = 0.0; - here->B4SOIcjd = Ibd - Iii - Igidl - - (here->B4SOIgjdb * Vbs - + here->B4SOIgjdd * Vds - + here->B4SOIgjdg * Vgs - + here->B4SOIgjde * Ves - + here->B4SOIgjdT * delTemp); /* v3.0 */ - - if (!here->B4SOIrbodyMod) - { - Giigidl_b = Giigidl_d = Giigidl_g = Giigidl_e - = Giigidl_T = Iii_Igidl = 0.0; - } - else - { - here->B4SOIgiigidlb = Giib + Ggidlb + Ggislb; - here->B4SOIgiigidld = Giid + Ggidld; - Giigidl_b = - Giib -Ggidlb - Ggislb; - Giigidl_d = - Giid -Ggidld; - Giigidl_g = - Giig -Ggidlg - Ggislg; - Giigidl_e = - Giie; - if (selfheat) Giigidl_T = -GiiT; - else GiiT = Giigidl_T = 0.0; - - Idbdp = Ibd - ( Gjdb * vbs_jct + Gjdd * Vds - + GjdT * delTemp); -/* Iii_Igidl = - Iii - Igidl - + Giigidl_b * Vbs + Giigidl_d * Vds - + Giigidl_g * Vgs + Giigidl_e * Ves - + Giigidl_T * delTemp ; */ - } - - - /* Body current which flows into sourceprime node from the source of device */ - - here->B4SOIgjsg = 0.0; - here->B4SOIgjsd = Gjsd; - here->B4SOIgjsb = Gjsb; /* v4.0 */ - if (selfheat) here->B4SOIgjsT = GjsT; - else here->B4SOIgjsT = 0.0; - here->B4SOIcjs = Ibs - Igisl - -( here->B4SOIgjsb * Vbs - + here->B4SOIgjsd * Vds - + here->B4SOIgjsg * Vgs - + here->B4SOIgjsT * delTemp); - - if (here->B4SOIrbodyMod) { - Isbsp = Ibs - ( Gjsb * vbs_jct + Gjsd * Vds - + GjsT * delTemp ); - } - - /* Current flowing into body node */ - - here->B4SOIgbbs = Giib - Gjsb - Gjdb - Gbpbs; - here->B4SOIgbgs = Giig + Ggidlg + Ggislg; - here->B4SOIgbds = Giid + Ggidld + Ggisls - Gjsd - Gjdd; - here->B4SOIgbes = Giie; - here->B4SOIgbps = - Gbpps; - if (selfheat) here->B4SOIgbT = GiiT - GjsT - GjdT; - else here->B4SOIgbT = 0.0; - - if (!here->B4SOIrbodyMod) - { - here->B4SOIcbody = Iii + Igidl + Igisl - Ibs - Ibd - - Ibp + Igb - - ( (here->B4SOIgbbs + dIgb_dVb) * Vbs - + (here->B4SOIgbgs + dIgb_dVg) * Vgs - + (here->B4SOIgbds + dIgb_dVd) * Vds - + here->B4SOIgbps * Vps - + (here->B4SOIgbes + dIgb_dVe) * Ves - + (here->B4SOIgbT + dIgb_dT) * delTemp); - } - - if (here->B4SOIrbodyMod) - { - here->B4SOIgbgiigbpb = Giib - Gbpbs; - here->B4SOIcbody = Iii + Igidl + Igisl - Ibp + Igb - - ( (Giib - Gbpbs + dIgb_dVb) * Vbs - + (here->B4SOIgbgs + dIgb_dVg) * Vgs - + (Giid + Ggidld + + Ggisls + dIgb_dVd) * Vds - + here->B4SOIgbps * Vps - + (here->B4SOIgbes + dIgb_dVe) * Ves - + (GiiT + dIgb_dT) * delTemp ); - } - - here->B4SOIcgate = Igb - - (dIgb_dVb * Vbs + dIgb_dVe * Ves + dIgb_dVg * Vgs - + dIgb_dVd * Vds + dIgb_dT * delTemp); /* v3.0 */ - - /* Calculate Qinv for Noise analysis */ - - T1 = Vgsteff * (1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm); - here->B4SOIqinv = -model->B4SOIcox * pParam->B4SOIweff - * here->B4SOInf * Leff * T1; /* v4.0 */ - - if (here->B4SOInf != 1) { - here->B4SOIcdrain *= here->B4SOInf; - here->B4SOIcd *= here->B4SOInf; - here->B4SOIcb *= here->B4SOInf; - here->B4SOIgds *= here->B4SOInf; - here->B4SOIgm *= here->B4SOInf; - here->B4SOIgmbs *= here->B4SOInf; - here->B4SOIgme *= here->B4SOInf; - - here->B4SOIcbody *= here->B4SOInf; - here->B4SOIcgate *= here->B4SOInf; - - here->B4SOIIgcs *= here->B4SOInf; - here->B4SOIgIgcsg *= here->B4SOInf; - here->B4SOIgIgcsd *= here->B4SOInf; - here->B4SOIgIgcsb *= here->B4SOInf; - here->B4SOIIgcd *= here->B4SOInf; - here->B4SOIgIgcdg *= here->B4SOInf; - here->B4SOIgIgcdd *= here->B4SOInf; - here->B4SOIgIgcdb *= here->B4SOInf; - - here->B4SOIIgs *= here->B4SOInf; - here->B4SOIgIgsg *= here->B4SOInf; - here->B4SOIgIgss *= here->B4SOInf; - here->B4SOIIgd *= here->B4SOInf; - here->B4SOIgIgdg *= here->B4SOInf; - here->B4SOIgIgdd *= here->B4SOInf; - - here->B4SOIig *= here->B4SOInf; - here->B4SOIgigg *= here->B4SOInf; - here->B4SOIgigd *= here->B4SOInf; - here->B4SOIgigb *= here->B4SOInf; - here->B4SOIgige *= here->B4SOInf; - here->B4SOIgigT *= here->B4SOInf; - - here->B4SOIcjs *= here->B4SOInf; - here->B4SOIcjd *= here->B4SOInf; - here->B4SOIibs *= here->B4SOInf; - here->B4SOIibd *= here->B4SOInf; - - here->B4SOIgbbs *= here->B4SOInf; - here->B4SOIgbgs *= here->B4SOInf; - here->B4SOIgbds *= here->B4SOInf; - here->B4SOIgbes *= here->B4SOInf; - here->B4SOIgbps *= here->B4SOInf; - here->B4SOIgbT *= here->B4SOInf; - - here->B4SOIigidl *= here->B4SOInf; - here->B4SOIigisl *= here->B4SOInf; - } - here->B4SOIgigs = -(here->B4SOIgigg + here->B4SOIgigd - + here->B4SOIgigb + here->B4SOIgige); - here->B4SOIgIgcss = -(here->B4SOIgIgcsg + here->B4SOIgIgcsd - + here->B4SOIgIgcsb); - here->B4SOIgIgcds = -(here->B4SOIgIgcdg + here->B4SOIgIgcdd - + here->B4SOIgIgcdb); - - /* Begin CV (charge) model */ - - if ((model->B4SOIxpart < 0) || (!ChargeComputationNeeded)) - { qgate = qdrn = qsrc = qbody = qsub = 0.0; /* v2.2.3 bug fix */ - here->B4SOIcggb = here->B4SOIcgsb = here->B4SOIcgdb = 0.0; - here->B4SOIcdgb = here->B4SOIcdsb = here->B4SOIcddb = 0.0; - here->B4SOIcbgb = here->B4SOIcbsb = here->B4SOIcbdb = 0.0; - goto finished; - } - else - { - CoxWL = model->B4SOIcox * (pParam->B4SOIweffCV - / here->B4SOInseg * here->B4SOInf /* v4.0 */ - * pParam->B4SOIleffCV + here->B4SOIagbcp); - CoxWLb = model->B4SOIfbody * model->B4SOIcox - * (pParam->B4SOIweffCV / here->B4SOInseg - * here->B4SOInf /* v4.0 */ - * pParam->B4SOIleffCVb + here->B4SOIagbcp); -/* v4.1 for improved BT charge model */ - - CoxWL2 = model->B4SOIcox * here->B4SOIagbcp2; - CoxWLb2 = model->B4SOIfbody * model->B4SOIcox * here->B4SOIagbcp2; -/* end v4.1 */ - - -/* v3.2 Seperate VgsteffCV with noff */ -noff = n * pParam->B4SOInoff; - dnoff_dVd = pParam->B4SOInoff * dn_dVd; - dnoff_dVb = pParam->B4SOInoff * dn_dVb; - if (model->B4SOIvgstcvMod == 0) - { - if ((VgstNVt > -EXPL_THRESHOLD) && (VgstNVt < EXPL_THRESHOLD)) - { - ExpVgst *= ExpVgst; - ExpVgst *= exp( -(pParam->B4SOIdelvt / (noff * Vtm))); - Vgsteff = noff * Vtm * log(1.0 + ExpVgst); - - T0 = ExpVgst / (1.0 + ExpVgst); - T1 = -T0 * (dVth_dVb + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVb) - + Vgsteff / noff * dnoff_dVb; - dVgsteff_dVd = -T0 * (dVth_dVd + dVth_dVb*dVbseff_dVd + Vgst / noff * dnoff_dVd) - + Vgsteff / noff * dnoff_dVd; - dVgsteff_dVg = T0 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); - dVgsteff_dVb = T1 * dVbseff_dVb; - dVgsteff_dVe = T1 * dVbseff_dVe; - if (selfheat) - dVgsteff_dT = -T0 * (dVth_dT+dVth_dVb*dVbseff_dT - + (Vgst - pParam->B4SOIdelvt) / Temp) - + Vgsteff / Temp; - else dVgsteff_dT = 0.0; -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - ExpVgst2 = ExpVgst * exp(-1.12 / noff / Vtm); - Vgsteff2 = noff * Vtm * log(1.0 + ExpVgst2); - T02 = ExpVgst2 / (1.0 + ExpVgst2); - T12 = -T02 * (dVth_dVb + (Vgst-Eg-pParam->B4SOIdelvt) / noff * dnoff_dVb) - + Vgsteff2 / noff * dnoff_dVb; - dVgsteff2_dVd = -T02 * (dVth_dVd + dVth_dVb*dVbseff_dVd + (Vgst - 1.12) / noff * dnoff_dVd) - + Vgsteff2 / noff * dnoff_dVd; - dVgsteff2_dVg = T02 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); - dVgsteff2_dVb = T12 * dVbseff_dVb; - dVgsteff2_dVe = T12 * dVbseff_dVe; - if (selfheat) - dVgsteff2_dT = -T02 * (dVth_dT+dVth_dVb*dVbseff_dT - + (Vgst - 1.12 - pParam->B4SOIdelvt) / Temp) - + Vgsteff2 / Temp; - else dVgsteff2_dT = 0.0; - } - } - } - else if (model->B4SOIvgstcvMod == 1) - {ExpVgst = exp(VgstNVt/(pParam->B4SOImstar * pParam->B4SOInoff)); - ExpVgst *= exp( -(pParam->B4SOIdelvt / (noff * Vtm))); - Vgsteff = noff * Vtm * log(1.0 + ExpVgst); - - T0 = ExpVgst / (1.0 + ExpVgst); - T1 = -T0 * (dVth_dVb + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVb) - + Vgsteff / noff * dnoff_dVb; - dVgsteff_dVd = -T0 * (dVth_dVd + dVth_dVb*dVbseff_dVd + Vgst / noff * dnoff_dVd) - + Vgsteff / noff * dnoff_dVd; - dVgsteff_dVg = T0 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); - - dVgsteff_dVb = T1 * dVbseff_dVb; - dVgsteff_dVe = T1 * dVbseff_dVe; - if (selfheat) - dVgsteff_dT = -T0 * (dVth_dT+dVth_dVb*dVbseff_dT - + (Vgst - pParam->B4SOIdelvt) / Temp) - + Vgsteff / Temp; - else dVgsteff_dT = 0.0; -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - ExpVgst2 = ExpVgst * exp(-1.12 / noff / Vtm); - Vgsteff2 = noff * Vtm * log(1.0 + ExpVgst2); - T02 = ExpVgst2 / (1.0 + ExpVgst2); - T12 = -T02 * (dVth_dVb + (Vgst-Eg-pParam->B4SOIdelvt) / noff * dnoff_dVb) - + Vgsteff2 / noff * dnoff_dVb; - dVgsteff2_dVd = -T02 * (dVth_dVd + dVth_dVb*dVbseff_dVd + (Vgst - 1.12) / noff * dnoff_dVd) - + Vgsteff2 / noff * dnoff_dVd; - dVgsteff2_dVg = T02 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); - dVgsteff2_dVb = T12 * dVbseff_dVb; - dVgsteff2_dVe = T12 * dVbseff_dVe; - if (selfheat) - dVgsteff2_dT = -T02 * (dVth_dT+dVth_dVb*dVbseff_dT - + (Vgst - 1.12 - pParam->B4SOIdelvt) / Temp) - + Vgsteff2 / Temp; - else dVgsteff2_dT = 0.0; - } - - - } - else - { - T10 = noff * Vtm; - VgstNVt = pParam->B4SOImstarcv * (Vgst - pParam->B4SOIdelvt) / T10; - ExpArg = (pParam->B4SOIvoffcv - - (1- pParam->B4SOImstarcv) * (Vgst - pParam->B4SOIdelvt))/ T10; - - /* MCJ: Very small Vgst */ - if (VgstNVt > EXPL_THRESHOLD) - { Vgsteff = Vgst - pParam->B4SOIdelvt; - /* T0 is dVgsteff_dVbseff */ - T0 = -dVth_dVb; - dVgsteff_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; - dVgsteff_dVd = -dVth_dVd + T0 * dVbseff_dVd; - dVgsteff_dVb = T0 * dVbseff_dVb; - dVgsteff_dVe = T0 * dVbseff_dVe; - if (selfheat) - dVgsteff_dT = -dVth_dT + T0 * dVbseff_dT; - else - dVgsteff_dT = 0.0; - } - else if (ExpArg > EXPL_THRESHOLD) - { T0 = (Vgst - pParam->B4SOIdelvt - pParam->B4SOIvoffcv) / (noff * Vtm); - ExpVgst = exp(T0); - Vgsteff = Vtm * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; - T3 = Vgsteff / (noff * Vtm) ; - /* T1 is dVgsteff_dVbseff */ - T1 = -T3 * (dVth_dVb + T0 * Vtm * dnoff_dVb); - dVgsteff_dVg = T3 * dVgs_eff_dVg+ T1 * dVbseff_dVg; - dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dnoff_dVd)+ T1 * dVbseff_dVd; - dVgsteff_dVe = T1 * dVbseff_dVe; - dVgsteff_dVb = T1 * dVbseff_dVb; - if (selfheat) - dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * noff) - + Vgsteff / Temp+ T1 * dVbseff_dT; - else - dVgsteff_dT = 0.0; - } - else - { - ExpVgst = exp(VgstNVt); - T1 = T10 * log(1.0 + ExpVgst); - dT1_dVg = ExpVgst / (1.0 + ExpVgst) * pParam->B4SOImstarcv; - dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / noff * dnoff_dVb) - + T1 / noff * dnoff_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / noff * dnoff_dVd) - + T1 / noff * dnoff_dVd; - T3 = (1.0 / Temp); - if (selfheat) - dT1_dT = -dT1_dVg * (dVth_dT + Vgst * T3) + T1 * T3; - else - dT1_dT = 0.0; - - dT2_dVg = -model->B4SOIcox / (Vtm * pParam->B4SOIcdep0) - * exp(ExpArg) * (1 - pParam->B4SOImstarcv); - T2 = pParam->B4SOImstarcv - T10 * dT2_dVg - / (1.0 - pParam->B4SOImstarcv); - dT2_dVd = -dT2_dVg * (dVth_dVd - Vtm * ExpArg * dnoff_dVd - / (1.0 - pParam->B4SOImstarcv)) - + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - Vtm * ExpArg * dnoff_dVb - / (1.0 - pParam->B4SOImstarcv)) - + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVb; - if (selfheat) - dT2_dT = -dT2_dVg * ( dVth_dT - ExpArg * T10 * T3 - / (1.0 - pParam->B4SOImstarcv) ); - else - dT2_dT = 0.0; - - Vgsteff = T1 / T2; - - T3 = T2 * T2; - /* T4 is dVgsteff_dVbseff */ - T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - dVgsteff_dVb = T4 * dVbseff_dVb; - dVgsteff_dVe = T4 * dVbseff_dVe; - dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) - / T3 * dVgs_eff_dVg - + T4 * dVbseff_dVg; - - dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) - / T3+ T4 * dVbseff_dVd; - if (selfheat) - dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) - / T3+ T4 * dVbseff_dT; - else - dVgsteff_dT = 0.0; - } - - - - if (here->B4SOIagbcp2 > 0) - { - VgstNVt2 = pParam->B4SOImstarcv * (Vgst - pParam->B4SOIdelvt - 1.12) / T10; - ExpArg2 = (pParam->B4SOIvoffcv - - (1- pParam->B4SOImstarcv) * (Vgst - pParam->B4SOIdelvt - 1.12))/ T10; - - /* MCJ: Very small Vgst */ - if (VgstNVt2 > EXPL_THRESHOLD) - { Vgsteff2 = Vgst - pParam->B4SOIdelvt - 1.12; - /* T0 is dVgsteff2_dVbseff */ - T0 = -dVth_dVb; - dVgsteff2_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; - dVgsteff2_dVd = -dVth_dVd + T0 * dVbseff_dVd; - dVgsteff2_dVb = T0 * dVbseff_dVb; - dVgsteff2_dVe = T0 * dVbseff_dVe; - if (selfheat) - dVgsteff2_dT = -dVth_dT + T0 * dVbseff_dT; - else - dVgsteff2_dT = 0.0; - } - else if (ExpArg2 > EXPL_THRESHOLD) - { T0 = (Vgst - pParam->B4SOIdelvt - pParam->B4SOIvoffcv - 1.12) / (noff * Vtm); - ExpVgst2 = exp(T0); - Vgsteff2 = Vtm * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; - T3 = Vgsteff2 / (noff * Vtm) ; - /* T1 is dVgsteff2_dVbseff */ - T1 = -T3 * (dVth_dVb + T0 * Vtm * dnoff_dVb); - dVgsteff2_dVg = T3 * dVgs_eff_dVg+ T1 * dVbseff_dVg; - dVgsteff2_dVd = -T3 * (dVth_dVd + T0 * Vtm * dnoff_dVd)+ T1 * dVbseff_dVd; - dVgsteff2_dVe = T1 * dVbseff_dVe; - dVgsteff2_dVb = T1 * dVbseff_dVb; - if (selfheat) - dVgsteff2_dT = -T3 * (dVth_dT + T0 * dVtm_dT * noff) - + Vgsteff2 / Temp+ T1 * dVbseff_dT; - else - dVgsteff2_dT = 0.0; - } - else - { ExpVgst2 = exp(VgstNVt2); - T1 = T10 * log(1.0 + ExpVgst2); - dT1_dVg = ExpVgst2 / (1.0 + ExpVgst2) * pParam->B4SOImstarcv; - dT1_dVb = -dT1_dVg * (dVth_dVb + Vgst / noff * dnoff_dVb) - + T1 / noff * dnoff_dVb; - dT1_dVd = -dT1_dVg * (dVth_dVd + Vgst / noff * dnoff_dVd) - + T1 / noff * dnoff_dVd; - T3 = (1.0 / Temp); - if (selfheat) - dT1_dT = -dT1_dVg * (dVth_dT + Vgst * T3) + T1 * T3; - else - dT1_dT = 0.0; - - dT2_dVg = -model->B4SOIcox / (Vtm * pParam->B4SOIcdep0) - * exp(ExpArg2) * (1 - pParam->B4SOImstarcv); - T2 = pParam->B4SOImstarcv - T10 * dT2_dVg - / (1.0 - pParam->B4SOImstarcv); - dT2_dVd = -dT2_dVg * (dVth_dVd - Vtm * ExpArg2 * dnoff_dVd - / (1.0 - pParam->B4SOImstarcv)) - + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVd; - dT2_dVb = -dT2_dVg * (dVth_dVb - Vtm * ExpArg2 * dnoff_dVb - / (1.0 - pParam->B4SOImstarcv)) - + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVb; - if (selfheat) - dT2_dT = -dT2_dVg * ( dVth_dT - ExpArg2 * T10 * T3 - / (1.0 - pParam->B4SOImstarcv) ); - else - dT2_dT = 0.0; - - Vgsteff2 = T1 / T2; - T3 = T2 * T2; - /* T4 is dVgsteff2_dVbseff */ - T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; - dVgsteff2_dVb = T4 * dVbseff_dVb; - dVgsteff2_dVe = T4 * dVbseff_dVe; - dVgsteff2_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) - / T3 * dVgs_eff_dVg - + T4 * dVbseff_dVg; - dVgsteff2_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) - / T3+ T4 * dVbseff_dVd; - if (selfheat) - dVgsteff2_dT = (T2 * dT1_dT - T1 * dT2_dT) - / T3+ T4 * dVbseff_dT; - else - dVgsteff2_dT = 0.0; - } - } - } -/* v3.2 */ -/* v3.2 */ - - - if (model->B4SOIcapMod == 2) - { - -/* v3.1 */ - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ - { - Qac0 = dQac0_dVrg = dQac0_dVd = dQac0_dVb = dQac0_dT = 0.0; - dQac02_dVrg = dQac02_dVd = dQac02_dVb = dQac02_dT = 0.0; - Qsub0 = dQsub0_dVrg = dQsub0_dVg = dQsub0_dVd = dQsub0_dVb = dQsub0_dT = 0.0; - dQsub02_dVrg = dQsub02_dVg = dQsub02_dVd = dQsub02_dVb = dQsub02_dT = 0.0; - } - else /* soiMod = 0 or 1 */ - { - Vfb = Vth - phi - pParam->B4SOIk1eff * sqrtPhis + pParam->B4SOIdelvt; - dVfb_dVb = dVth_dVb - pParam->B4SOIk1eff * dsqrtPhis_dVb; - dVfb_dVd = dVth_dVd; - dVfb_dT = dVth_dT; - - V3 = Vfb - Vgs_eff + Vbseff - DELTA_3_SOI; - if (Vfb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3_SOI * Vfb); - T2 = -DELTA_3_SOI / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3_SOI * Vfb); - T2 = DELTA_3_SOI / T0; - } - - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfb - 0.5 * (V3 + T0); - dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; - dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1; - dVfbeff_dVrg = T1 * dVgs_eff_dVg; - if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfb_dT; - else dVfbeff_dT = 0.0; - - Qac0 = CoxWLb * (Vfbeff - Vfb); - dQac0_dVrg = CoxWLb * dVfbeff_dVrg; - dQac0_dVd = CoxWLb * (dVfbeff_dVd - dVfb_dVd); - dQac0_dVb = CoxWLb * (dVfbeff_dVb - dVfb_dVb); - if (selfheat) dQac0_dT = CoxWLb * (dVfbeff_dT - dVfb_dT); - else dQac0_dT = 0.0; -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) - { - Vfb2 = Vfb + 1.12; - dVfb2_dVb = dVfb_dVb; - dVfb2_dVd = dVfb_dVd; - dVfb2_dT = dVfb_dT; - DELTA_3_SOI2 = DELTA_3_SOI; - V3 = Vfb2 - Vgs_eff2 + Vbseff - DELTA_3_SOI2; - if (Vfb2 <= 0.0) - { T0 = sqrt(V3 * V3 - 100.0 * DELTA_3_SOI2 * Vfb2); - T2 = -DELTA_3_SOI2 / T0; - } - else - { T0 = sqrt(V3 * V3 + 100.0 * DELTA_3_SOI2 * Vfb2); - T2 = DELTA_3_SOI2 / T0; - } - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff2 = Vfb2 - 0.5 * (V3 + T0); - dVfbeff2_dVd = (1.0 - T1 - 25.0 * T2) * dVfb2_dVd; - dVfbeff2_dVb = (1.0 - T1 - 25.0 * T2) * dVfb2_dVb - T1; - dVfbeff2_dVrg = T1 * dVgs_eff2_dVg; - if (selfheat) dVfbeff2_dT = (1.0 - T1 - T2) * dVfb2_dT; - else dVfbeff2_dT = 0.0; - - Qac0 += CoxWLb2 * (Vfbeff2 - Vfb2); - dQac02_dVrg = CoxWLb2 * dVfbeff2_dVrg; - dQac02_dVd = CoxWLb2 * (dVfbeff2_dVd - dVfb2_dVd); - dQac02_dVb = CoxWLb2 * (dVfbeff2_dVb - dVfb2_dVb); - if (selfheat) - dQac02_dT = CoxWLb2 * (dVfbeff2_dT - dVfb2_dT); - else dQac02_dT = 0.0; - } -/* end v4.1 */ - T0 = 0.5 * pParam->B4SOIk1ox; - T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; - if (pParam->B4SOIk1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->B4SOIk1ox; - T2 = CoxWLb; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLb * T0 / T1; - } - - Qsub0 = CoxWLb * pParam->B4SOIk1ox * (T1 - T0); /* 4.1 bug fix */ - dQsub0_dVrg = T2 * (dVgs_eff_dVg - dVfbeff_dVrg); - dQsub0_dVg = -T2; - dQsub0_dVd = -T2 * dVfbeff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + 1); - if (selfheat) dQsub0_dT = -T2 * dVfbeff_dT; - else dQsub0_dT = 0.0; -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) - { T3 = Vgs_eff2- Vfbeff2 - Vbseff - Vgsteff2; - if (T3 < 0.0) - { T1 = T0 + T3 / pParam->B4SOIk1ox; - T2 = CoxWLb2; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLb2 * T0 / T1; - } - Qsub0 += CoxWLb2 * pParam->B4SOIk1ox * (T1 - T0); - dQsub02_dVrg = T2 * (dVgs_eff2_dVg - dVfbeff2_dVrg); - dQsub02_dVg = -T2; - dQsub02_dVd = -T2 * dVfbeff2_dVd; - dQsub02_dVb = -T2 * (dVfbeff2_dVb + 1); - if (selfheat) dQsub02_dT = -T2 * dVfbeff2_dT; - else dQsub02_dT = 0.0; - } - } -/* v3.1 */ - - - - AbulkCV = Abulk0 * pParam->B4SOIabulkCVfactor; - dAbulkCV_dVb = pParam->B4SOIabulkCVfactor * dAbulk0_dVb; - - VdsatCV = Vgsteff / AbulkCV; - dVdsatCV_dVg = 1.0 / AbulkCV; - dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; - - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - dVdseffCV_dVg = T3; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) - { VdsatCV2 = Vgsteff2 / AbulkCV; - dVdsatCV2_dVg = 1.0 / AbulkCV; - dVdsatCV2_dVb = -VdsatCV2 * dAbulkCV_dVb / AbulkCV; - V4 = VdsatCV2 - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV2); - VdseffCV2 = VdsatCV2 - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - dVdseffCV2_dVg = T3; - dVdseffCV2_dVd = T1; - dVdseffCV2_dVb = -T3 * VdsatCV2 * dAbulkCV_dVb; - } -/* end v4.1 */ - -/* v3.1 */ - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ - { - qbulk = Cbg1 = Cbd1 = Cbb1 = 0; - Cbg12 = Cbd12 = Cbb12 = 0; /* v4.1 */ - } - else - { - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); - T2 = VdseffCV / T1; - T3 = T0 * T2; - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff- T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; - - T7 = 1.0 - AbulkCV; - qbulk = CoxWLb * T7 * (0.5 * VdseffCV - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); - - Cbg1 = CoxWLb * (T4 + T5 * dVdseffCV_dVg); - Cbd1 = CoxWLb * T5 * dVdseffCV_dVd ; - Cbb1 = CoxWLb * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); - /* v4.1 */ - if (here->B4SOIagbcp2 > 0) - { T0 = AbulkCV * VdseffCV2; - T1 = 12.0 * (Vgsteff2 - 0.5 * T0 + 1e-20); - T2 = VdseffCV2 / T1; - T3 = T0 * T2; - T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff2 - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff2; - T7 = 1.0 - AbulkCV; - qbulk += CoxWLb2 * T7 * (0.5 * VdseffCV2 - T3); - T4 = -T7 * (T4 - 1.0); - T5 = -T7 * T5; - T6 = -(T7 * T6 + (0.5 * VdseffCV2 - T3)); - Cbg12 = CoxWLb2 * (T4 + T5 * dVdseffCV2_dVg); - Cbd12 = CoxWLb2 * T5 * dVdseffCV2_dVd ; - Cbb12 = CoxWLb2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb); - } -/* end v4.1 */ - } -/* v3.1 */ - - - - /* Total inversion charge */ - T0 = AbulkCV * VdseffCV; - T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); -/* T2 = VdseffCV / T1; -*/ - T2 = T0 / T1; - T3 = T0 * T2; + T0 = (pParam->B4SOIcbjtii + pParam->B4SOIebjtii * Leff)/Leff; -/* T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); - T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); - T6 = 12.0 * T2 * T2 * Vgsteff; -*/ - T4 = (1.0 - 12.0 * T2 * T2);/*bug fix */ - T7 = T2 * (2.0 + 6.0 * T2) - 0.5; /*bug fix */ + Vbci= pParam->B4SOIvbci*(1.0+model->B4SOItvbci*(TempRatio-1.0)); + /*T1 = Vbci - (Vbs - Vds); v4.3 bugfix*/ + T1 = Vbci - (vbs_jct - Vds); - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; + T2 = pParam->B4SOImbjtii -1.0; -/* qinv = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); -*/ - qinv = CoxWL * (Vgsteff - 0.5 * T0 + T3); - - here->B4SOIqinv = -qinv; /* for noise v3.2 */ - - Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Cgd1 = CoxWL * T5 * dVdseffCV_dVd; - Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) - { - T02 = AbulkCV * VdseffCV2; - T12 = 12.0 * (Vgsteff2 - 0.5 * T02 + 1e-20); - T2 = T02 / T12; - T3 = T02 * T2; - T4 = (1.0 - 12.0 * T2 * T2); - T7 = T2 * (2.0 + 6.0 * T2) - 0.5; - - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV2; + /* + if(T1 == 0.0) + T3 =1.0; + else + T3 = -pParam->B4SOIabjtii * pow(T1,T2); + */ - qinv += CoxWL2 * (Vgsteff2 - 0.5 * T02 + T3); - here->B4SOIqinv = -qinv; - - Cgg12 = CoxWL2 * (T4 + T5 * dVdseffCV2_dVg); - Cgd12 = CoxWL2 * T5 * dVdseffCV2_dVd; - Cgb12 = CoxWL2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb); - } -/* end v4.1 */ - /* Inversion charge partitioning into S / D */ - if (model->B4SOIxpart > 0.5) - { /* 0/100 Charge partition model */ - T1 = T1 + T1; - qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 - - T0 * T0 / T1); - T7 = (4.0 * Vgsteff - T0) / (T1 * T1); - T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); - T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); - Csg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); - Csd1 = CoxWL * T5 * dVdseffCV_dVd; - Csb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); - -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) - { - T12 = T12 + T12; - qsrc += -CoxWL2 * (0.5 * Vgsteff2 + 0.25 * T02 - - T02 * T02 / T12); - T7 = (4.0 * Vgsteff2 - T02) / (T12 * T12); - T4 = -(0.5 + 24.0 * T02 * T02 / (T12 * T12)); - T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T02 * T7); - T6 = -(0.25 * VdseffCV2 - 12.0 * T02 * VdseffCV2 * T7); - Csg12 = CoxWL2 * (T4 + T5 * dVdseffCV2_dVg); - Csd12 = CoxWL2 * T5 * dVdseffCV2_dVd; - Csb12 = CoxWL2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb); - } -/* end v4.1 */ - - } - else if (model->B4SOIxpart < 0.5) - { /* 40/60 Charge partition model */ - T1 = T1 / 12.0; - T2 = 0.5 * CoxWL / (T1 * T1); - T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff - * (Vgsteff - 4.0 * T0 / 3.0)) - - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T2 * T3; - T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) - + 0.4 * T0 * T0; - T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 - * Vgsteff - 8.0 * T0 / 3.0) - + 2.0 * T0 * T0 / 3.0); - T5 = (qsrc / T1 + T2 * T7) * AbulkCV; - T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); - Csg1 = T4 + T5 * dVdseffCV_dVg; - Csd1 = T5 * dVdseffCV_dVd; - Csb1 = T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb; -/* v4.1 */ - if (here->B4SOIagbcp2 >0) - { - T12 = T12 /12.0; - T2 = 0.5 * CoxWL2 / (T12 * T12); - T3 = Vgsteff2 * (2.0 * T02 * T02 / 3.0 + Vgsteff2 - * (Vgsteff2 - 4.0 * T02 / 3.0)) - - 2.0 * T02 * T02 * T02 / 15.0; - qsrc2 = -T2 * T3; - - T7 = 4.0 / 3.0 * Vgsteff2 * (Vgsteff2 - T02) - + 0.4 * T02 * T02; - T4 = -2.0 * qsrc2 / T12 - T2 * (Vgsteff2 * (3.0 - * Vgsteff2 - 8.0 * T02 / 3.0) - + 2.0 * T02 * T02 / 3.0); - T5 = (qsrc2 / T12 + T2 * T7) * AbulkCV; - T6 = (qsrc2 / T12 * VdseffCV2 + T2 * T7 * VdseffCV2); - Csg12 = T4 + T5 * dVdseffCV2_dVg; - Csd12 = T5 * dVdseffCV2_dVd; - Csb12 = T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb; - qsrc += qsrc2; - } - -/* end v4.1 */ - } - else - { /* 50/50 Charge partition model */ - qsrc = - 0.5 * (qinv + qbulk); - Csg1 = - 0.5 * (Cgg1 + Cbg1); - Csb1 = - 0.5 * (Cgb1 + Cbb1); - Csd1 = - 0.5 * (Cgd1 + Cbd1); -/* v4.1 */ - if (here->B4SOIagbcp2 >0) - { - Csg12 = -0.5 * (Cgg12 + Cbg12); - Csb12 = -0.5 * (Cgb12 + Cbb12); - Csd12 = -0.5 * (Cgd12 + Cbd12); - } -/* end v4.1 */ - } - - - - /* Backgate charge */ -/* v3.1 */ - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ - { - Qe1 = dQe1_dVb = dQe1_dVe = dQe1_dT = 0; - } - else /* soiMod = 0 or 1 */ - { - CboxWL = pParam->B4SOIkb1 * model->B4SOIfbody * Cbox - * (pParam->B4SOIweffCV / here->B4SOInseg - * pParam->B4SOIleffCVbg + here->B4SOIaebcp); - Qe1 = CboxWL * (Vesfb - Vbs); - dQe1_dVb = -CboxWL; - dQe1_dVe = CboxWL; - if (selfheat) dQe1_dT = -CboxWL * dvfbb_dT; - else dQe1_dT = 0; - } -/* v3.1 */ - - - qgate = qinv + Qac0 + Qsub0; - qbody = (qbulk - Qac0 - Qsub0 - Qe1); - qsub = Qe1; - qdrn = -(qgate + qsrc + qbody + qsub); - - /* This transform all the dependency on Vgsteff, Vbseff - into real ones */ - Ce1b = dQe1_dVb; - Ce1e = dQe1_dVe; - - Csg = Csg1 * dVgsteff_dVg; - Csd = Csd1 + Csg1 * dVgsteff_dVd; - Csb = Csg1 * dVgsteff_dVb + Csb1 * dVbseff_dVb; - if (selfheat) CsT = Csg1 * dVgsteff_dT; - else CsT = 0.0; - - Cgg = (Cgg1 + dQsub0_dVg) * dVgsteff_dVg - + dQac0_dVrg + dQsub0_dVrg; - Cgd = (Cgg1 + dQsub0_dVg) * dVgsteff_dVd + Cgd1 - + dQac0_dVd + dQsub0_dVd; - Cgb = (Cgg1 + dQsub0_dVg) * dVgsteff_dVb - + (Cgb1 + dQsub0_dVb + dQac0_dVb) * dVbseff_dVb; - if (selfheat) - CgT = (Cgg1 + dQsub0_dVg) * dVgsteff_dT - + dQac0_dT + dQsub0_dT; - else CgT = 0.0; - - Cbg = (Cbg1 - dQsub0_dVg) * dVgsteff_dVg - - dQac0_dVrg - dQsub0_dVrg; - Cbd = (Cbg1 - dQsub0_dVg) * dVgsteff_dVd + Cbd1 - - dQac0_dVd - dQsub0_dVd; - Cbb = (Cbg1 - dQsub0_dVg) * dVgsteff_dVb - dQe1_dVb - + (Cbb1 - dQsub0_dVb - dQac0_dVb) * dVbseff_dVb; - if (selfheat) - CbT = (Cbg1 - dQsub0_dVg) * dVgsteff_dT - - dQac0_dT - dQsub0_dT - dQe1_dT; - else CbT = 0.0; -/* v4.1 */ - if (here->B4SOIagbcp2 >0) { - Csg += Csg12 * dVgsteff2_dVg; - Csd += Csd12 + Csg12 * dVgsteff2_dVd; - Csb += Csg12 * dVgsteff2_dVb + Csb12 * dVbseff_dVb; - if (selfheat) CsT += Csg12 * dVgsteff2_dT; - - Cgg += (Cgg12 + dQsub02_dVg) * dVgsteff2_dVg - + dQac02_dVrg + dQsub02_dVrg; - Cgd += (Cgg12 + dQsub02_dVg) * dVgsteff2_dVd + Cgd12 - + dQac02_dVd + dQsub02_dVd; - Cgb += (Cgg12 + dQsub02_dVg) * dVgsteff2_dVb - + (Cgb12 + dQsub02_dVb + dQac02_dVb) * dVbseff_dVb; - if (selfheat) - CgT += (Cgg12 + dQsub02_dVg) * dVgsteff2_dT - + dQac02_dT + dQsub02_dT; - - Cbg += (Cbg12 - dQsub02_dVg) * dVgsteff2_dVg - - dQac02_dVrg - dQsub02_dVrg; - Cbd += (Cbg12 - dQsub02_dVg) * dVgsteff2_dVd + Cbd12 - - dQac02_dVd - dQsub02_dVd; - Cbb += (Cbg12 - dQsub02_dVg) * dVgsteff2_dVb - + (Cbb12 - dQsub02_dVb - dQac02_dVb) * dVbseff_dVb; - if (selfheat) - CbT += (Cbg12 - dQsub02_dVg) * dVgsteff2_dT - - dQac02_dT - dQsub02_dT; - } -/* end v4.1 */ - - here->B4SOIcggb = Cgg ; - here->B4SOIcgsb = - (Cgg + Cgd + Cgb); - here->B4SOIcgdb = Cgd; - here->B4SOIcgT = CgT; - - here->B4SOIcbgb = Cbg; - here->B4SOIcbsb = -(Cbg + Cbd + Cbb) - + Ce1e; - here->B4SOIcbdb = Cbd; - here->B4SOIcbeb = - Ce1e ; - here->B4SOIcbT = CbT; - - here->B4SOIceeb = Ce1e ; - here->B4SOIceT = dQe1_dT; - - here->B4SOIcdgb = -(Cgg + Cbg + Csg); - here->B4SOIcddb = -(Cgd + Cbd + Csd); - here->B4SOIcdeb = 0; - here->B4SOIcdT = -(CgT + CbT + CsT) - dQe1_dT; - here->B4SOIcdsb = (Cgg + Cgd + Cgb - + Cbg + Cbd + Cbb - + Csg + Csd + Csb) + Ce1b; - } /* End of if capMod == 2 */ - - else if (model->B4SOIcapMod == 3) - { - - dVgsteff_dVb /= dVbseff_dVb; - if(model->B4SOImtrlMod == 0) - Cox = 3.453133e-11 / model->B4SOItoxp; - else - Cox = epsrox * EPS0 / model->B4SOItoxp; - CoxWL *= toxe/ model->B4SOItoxp; - CoxWLb *= model->B4SOItox/ model->B4SOItoxp; - Tox=1.0e8*model->B4SOItoxp; - - - /* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - dVgsteff2_dVb /= dVbseff_dVb; - CoxWL2 *= model->B4SOItox / - model->B4SOItoxp; - CoxWLb2 *= model->B4SOItox/ - model->B4SOItoxp; - } -/* end v4.1 */ - -/* v3.1 */ - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ - { - Qac0 = dQac0_dVg = dQac0_dVb = dQac0_dT = 0.0; - dQac02_dVg = dQac02_dVb = dQac02_dT = 0.0; - Qsub0 = dQsub0_dVg = dQsub0_dVd = dQsub0_dVb = dQsub0_dT = 0.0; - dQsub02_dVg = dQsub02_dVd = dQsub02_dVb = dQsub02_dT = 0.0; - } - else /* soiMod = 0 or 1 */ - { - if (selfheat) { - Vfbzb = Vthzb - phi - pParam->B4SOIk1eff * sqrtPhi - + pParam->B4SOIdelvt; - dVfbzb_dT = dVthzb_dT; - } - else { - Vfbzb = here->B4SOIvfbzb + pParam->B4SOIdelvt; - dVfbzb_dT = 0; - } + if(T1<=0.0) + T3 = 0.0; + else + T3 = -pParam->B4SOIabjtii * pow(T1,T2); - V3 = Vfbzb - Vgs_eff + Vbseff - DELTA_3; - if (Vfbzb <= 0.0) - { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfbzb); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfbzb); - T2 = DELTA_3 / T0; - } - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff = Vfbzb - 0.5 * (V3 + T0); - dVfbeff_dVg = T1 * dVgs_eff_dVg; - dVfbeff_dVb = -T1; - if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfbzb_dT; - else dVfbeff_dT = 0.0; -/* v4.1 */ - if (here->B4SOIagbcp2 >0) { - Vfbzb2 = Vfbzb + 1.12; - if (selfheat) dVfbzb2_dT = dVfbzb_dT; - else dVfbzb2_dT = 0; - V3 = Vfbzb2 - Vgs_eff2 + Vbseff - DELTA_3; - if (Vfbzb <= 0.0) - { T0 = sqrt(V3 * V3 - 100.0 * DELTA_3 * Vfbzb2); - T2 = -DELTA_3 / T0; - } - else - { T0 = sqrt(V3 * V3 + 100.0 * DELTA_3 * Vfbzb2); - T2 = DELTA_3 / T0; - } - T1 = 0.5 * (1.0 + V3 / T0); - Vfbeff2 = Vfbzb2 - 0.5 * (V3 + T0); - dVfbeff2_dVg = T1 * dVgs_eff2_dVg; - dVfbeff2_dVb = -T1; - if (selfheat) dVfbeff2_dT = (1.0 - T1 - T2) * dVfbzb2_dT; - else dVfbeff2_dT = 0.0; - } -/* end v4.1 */ - - T0 = (Vgs_eff - Vbseff - Vfbzb) / Tox; - dT0_dVg = dVgs_eff_dVg / Tox; - dT0_dVb = -1.0 / Tox; - tmp = T0 * pParam->B4SOIacde; - if ((-EXPL_THRESHOLD < tmp) && (tmp < EXPL_THRESHOLD)) - { Tcen = pParam->B4SOIldeb * exp(tmp); - dTcen_dVg = pParam->B4SOIacde * Tcen; - dTcen_dVb = dTcen_dVg * dT0_dVb; - dTcen_dVg *= dT0_dVg; - if (selfheat) - dTcen_dT = -Tcen * pParam->B4SOIacde * dVfbzb_dT / Tox; - else dTcen_dT = 0; - } - else if (tmp <= -EXPL_THRESHOLD) - { Tcen = pParam->B4SOIldeb * MIN_EXPL; - dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0; - } - else - { Tcen = pParam->B4SOIldeb * MAX_EXPL; - dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0; - } - /*LINK = 1.0e-3 * (toxe - model->B4SOIdtoxcv); v2.2.3 */ - LINK = 1.0e-3 * model->B4SOItoxp; - V3 = pParam->B4SOIldeb - Tcen - LINK; - V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->B4SOIldeb); - Tcen = pParam->B4SOIldeb - 0.5 * (V3 + V4); - T1 = 0.5 * (1.0 + V3 / V4); - /* v4.1 small Tcen can introduce numerical issue */ - if (Tcen < 1e-15) - { Tcen = 1e-15; - T1 = 0; - } /* end */ - - dTcen_dVg *= T1; - dTcen_dVb *= T1; - if (selfheat) - dTcen_dT *= T1; - else dTcen_dT = 0; -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - T0 = (Vgs_eff2 - Vbseff - Vfbzb2) / Tox; - dT0_dVg = dVgs_eff2_dVg / Tox; - dT0_dVb = -1.0 / Tox; - - tmp = T0 * pParam->B4SOIacde; - if ((-EXPL_THRESHOLD < tmp) && (tmp < EXPL_THRESHOLD)) - { Tcen2 = pParam->B4SOIldeb * exp(tmp); - dTcen2_dVg = pParam->B4SOIacde * Tcen2; - dTcen2_dVb = dTcen2_dVg * dT0_dVb; - dTcen2_dVg *= dT0_dVg; - if (selfheat) - dTcen2_dT = -Tcen2 * pParam->B4SOIacde * dVfbzb2_dT / Tox; - else dTcen2_dT = 0; - } - else if (tmp <= -EXPL_THRESHOLD) - { Tcen2 = pParam->B4SOIldeb * MIN_EXPL; - dTcen2_dVg = dTcen2_dVb = dTcen2_dT = 0.0; - } - else - { Tcen2 = pParam->B4SOIldeb * MAX_EXPL; - dTcen2_dVg = dTcen2_dVb = dTcen2_dT = 0.0; - } - - V3 = pParam->B4SOIldeb - Tcen2 - LINK; - V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->B4SOIldeb); - Tcen2 = pParam->B4SOIldeb - 0.5 * (V3 + V4); - T1 = 0.5 * (1.0 + V3 / V4); - - if (Tcen2 < 1e-15) - { Tcen2 = 1e-15; - T1 = 0; - } - dTcen2_dVg *= T1; - dTcen2_dVb *= T1; - if (selfheat) - dTcen2_dT *= T1; - else dTcen2_dT = 0; - } -/* end v4.1 */ - - Ccen = epssub / Tcen; - T2 = Cox / (Cox + Ccen); - Coxeff = T2 * Ccen; - T3 = -Ccen / Tcen; - dCoxeff_dVg = T2 * T2 * T3; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - if (selfheat) - dCoxeff_dT = T3 * dTcen_dT * (T2 - Coxeff / (Cox + Ccen)); - else dCoxeff_dT = 0; -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - Ccen2 = EPSSI / Tcen2; - T2 = Cox / (Cox + Ccen2); - Coxeff2 = T2 * Ccen2; - T3 = -Ccen2 / Tcen2; - dCoxeff2_dVg = T2 * T2 * T3; - dCoxeff2_dVb = dCoxeff2_dVg * dTcen2_dVb; - dCoxeff2_dVg *= dTcen2_dVg; - if (selfheat) - dCoxeff2_dT = T3 * dTcen2_dT * (T2 - Coxeff2 / (Cox + Ccen2)); - else dCoxeff2_dT = 0; - } -/* end v4.1 */ - CoxWLcenb = CoxWLb * Coxeff / Cox; - if (selfheat) - dCoxWLcenb_dT = CoxWLb * dCoxeff_dT / Cox; - else dCoxWLcenb_dT = 0; -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - CoxWLcenb2 = CoxWLb2 * Coxeff2 / Cox; - if (selfheat) - dCoxWLcenb2_dT = CoxWLb2 * dCoxeff2_dT / Cox; - else dCoxWLcenb2_dT = 0; - } -/* end v4.1 */ - Qac0 = CoxWLcenb * (Vfbeff - Vfbzb); - QovCox = Qac0 / Coxeff; - dQac0_dVg = CoxWLcenb * dVfbeff_dVg - + QovCox * dCoxeff_dVg; - dQac0_dVb = CoxWLcenb * dVfbeff_dVb - + QovCox * dCoxeff_dVb; - if (selfheat) dQac0_dT = CoxWLcenb * (dVfbeff_dT - dVfbzb_dT) - + dCoxWLcenb_dT * (Vfbeff - Vfbzb); - else dQac0_dT = 0.0; -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - Qac02 = CoxWLcenb2 * (Vfbeff2 - Vfbzb2); - QovCox2 = Qac02 / Coxeff2; - dQac02_dVg = CoxWLcenb2 * dVfbeff2_dVg - + QovCox2 * dCoxeff2_dVg; - dQac02_dVb = CoxWLcenb2 * dVfbeff2_dVb - + QovCox2 * dCoxeff2_dVb; - if (selfheat) dQac02_dT = CoxWLcenb2 * (dVfbeff2_dT - dVfbzb2_dT) - + dCoxWLcenb2_dT * (Vfbeff2 - Vfbzb2); - else dQac02_dT = 0.0; - - Qac0 += Qac02; - } -/* end v4.1 */ - - T0 = 0.5 * pParam->B4SOIk1ox; - T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; - if (pParam->B4SOIk1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->B4SOIk1ox; - T2 = CoxWLcenb; + + if (T3> EXPL_THRESHOLD) + T4 = MAX_EXPL; + else if (T3 < -EXPL_THRESHOLD) + T4 = MIN_EXPL; + else + T4 = exp(T3); + + + if (T1==0.0) + {if(T3> EXPL_THRESHOLD) + { + dT4_dVd = 0.0; + dT4_dVb = 0.0; + } + else if (T3 < -EXPL_THRESHOLD) + { + dT4_dVd = 0.0; + dT4_dVb = 0.0; + } + else + { + dT4_dVd = - T4 * pParam->B4SOIabjtii* T2 ; + dT4_dVb = T4 * pParam->B4SOIabjtii* T2 ; + } + } + else + { + if(T3> EXPL_THRESHOLD) + { + dT4_dVd = 0.0; + dT4_dVb = 0.0; + } + else if (T3 < -EXPL_THRESHOLD) + { + dT4_dVd = 0.0; + dT4_dVb = 0.0; + } + else + {T5 = T2-1.0; + if (T1<=0.0) + {dT4_dVd = 0.0; + dT4_dVd = 0.0; + } else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLcenb * T0 / T1; + { + dT4_dVd = - T4 * pParam->B4SOIabjtii* T2 * pow(T1,T5); + dT4_dVb = T4 * pParam->B4SOIabjtii* T2 * pow(T1,T5); } + } - Qsub0 = CoxWLcenb * pParam->B4SOIk1ox * (T1 - T0); - QovCox = Qsub0 / Coxeff; - dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) - + QovCox * dCoxeff_dVg; - dQsub0_dVd = -T2 * dVgsteff_dVd; - dQsub0_dVb = -T2 * (dVfbeff_dVb + 1 + dVgsteff_dVb) - + QovCox * dCoxeff_dVb; - if (selfheat) - dQsub0_dT = -T2 * (dVfbeff_dT + dVgsteff_dT) - + dCoxWLcenb_dT * pParam->B4SOIk1ox * (T1 - T0); - else dQsub0_dT = 0.0; - -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - T3 = Vgs_eff2 - Vfbeff2 - Vbseff - Vgsteff2; - if (pParam->B4SOIk1ox == 0.0) - { T1 = 0.0; - T2 = 0.0; - } - else if (T3 < 0.0) - { T1 = T0 + T3 / pParam->B4SOIk1ox; - T2 = CoxWLcenb2; - } - else - { T1 = sqrt(T0 * T0 + T3); - T2 = CoxWLcenb2 * T0 / T1; - } - - Qsub02 = CoxWLcenb2 * pParam->B4SOIk1ox * (T1 - T0); - QovCox2 = Qsub02 / Coxeff2; - dQsub02_dVg = T2 * (dVgs_eff2_dVg - dVfbeff2_dVg - dVgsteff2_dVg) - + QovCox2 * dCoxeff2_dVg; - dQsub02_dVd = -T2 * dVgsteff2_dVd; - dQsub02_dVb = -T2 * (dVfbeff2_dVb + 1 + dVgsteff2_dVb) - + QovCox2 * dCoxeff2_dVb; - if (selfheat) - dQsub02_dT = -T2 * (dVfbeff2_dT + dVgsteff2_dT) - + dCoxWLcenb2_dT * pParam->B4SOIk1ox * (T1 - T0); - else dQsub02_dT = 0.0; - - Qsub0 += Qsub02; - } -/* end v4.1 */ - - } -/* v3.1 */ - - - /* Gate-bias dependent delta Phis begins */ - if (pParam->B4SOIk1ox <= 0.0) - { Denomi = 0.25 * pParam->B4SOImoin * Vtm; - T0 = 0.5 * pParam->B4SOIsqrtPhi; - } - else - { Denomi = pParam->B4SOImoin * Vtm - * pParam->B4SOIk1ox * pParam->B4SOIk1ox; - T0 = pParam->B4SOIk1ox * pParam->B4SOIsqrtPhi; - } - T1 = 2.0 * T0 + Vgsteff; - - DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); - dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); - dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd; - dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb; - -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - T1 = 2.0 * T0 + Vgsteff2; - DeltaPhi2 = Vtm * log(1.0 + T1 * Vgsteff2 / Denomi); - dDeltaPhi2_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff2); - dDeltaPhi2_dVd = dDeltaPhi2_dVg * dVgsteff2_dVd; - dDeltaPhi2_dVb = dDeltaPhi2_dVg * dVgsteff2_dVb; - } -/* end v4.1 */ - /* End of delta Phis */ - - -/* v3.1.1 bug fix for discontinuity */ - T3 = 4.0 * (Vth - Vfbzb - phi); - T2 = sqrt(T3*T3 + 0.0001); - T5 = 0.5 * (1 + T3/T2); - T4 = 0.5 * (T3 + T2); - - Tox += Tox; - T0 = (Vgsteff + T4) / Tox; - tmp = exp(0.7 * log(T0)); - T1 = 1.0 + tmp; - T2 = 0.7 * tmp / (T0 * Tox); - Tcen = 1.9e-9 / T1; - dTcen_dVg = -Tcen * T2 / T1; - dTcen_dVd = dTcen_dVg * (T5 * 4.0 * dVth_dVd + dVgsteff_dVd); - dTcen_dVb = dTcen_dVg * (T5 * 4.0 * dVth_dVb + dVgsteff_dVb); - dTcen_dVg *= dVgsteff_dVg; - if (selfheat) - dTcen_dT = -Tcen * T2 / T1 - * (T5 * 4.0 * (dVth_dT - dVfbzb_dT) + dVgsteff_dT); - else dTcen_dT = 0; - - - Ccen = epssub / Tcen; - T0 = Cox / (Cox + Ccen); - Coxeff = T0 * Ccen; - T1 = -Ccen / Tcen; - dCoxeff_dVg = T0 * T0 * T1; - dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; - dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; - dCoxeff_dVg *= dTcen_dVg; - if (selfheat) - dCoxeff_dT = T1 * dTcen_dT * (T0 - Coxeff / (Cox + Ccen)); - else dCoxeff_dT = 0; - CoxWLcen = CoxWL * Coxeff / Cox; - CoxWLcenb = CoxWLb * Coxeff / Cox; -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - T3 = 4.0 * (Vth + 1.12 - Vfbzb2 - phi); - T2 = sqrt(T3*T3 + 0.0001); - T5 = 0.5 * (1 + T3/T2); - T4 = 0.5 * (T3 + T2); - /* Tox += Tox; */ - T0 = (Vgsteff2 + T4) / Tox; - tmp = exp(0.7 * log(T0)); - T1 = 1.0 + tmp; - T2 = 0.7 * tmp / (T0 * Tox); - Tcen2 = 1.9e-9 / T1; - dTcen2_dVg = -Tcen2 * T2 / T1; - dTcen2_dVd = dTcen2_dVg * (T5 * 4.0 * dVth_dVd + dVgsteff2_dVd); - dTcen2_dVb = dTcen2_dVg * (T5 * 4.0 * dVth_dVb + dVgsteff2_dVb); - dTcen2_dVg *= dVgsteff2_dVg; - if (selfheat) - dTcen2_dT = -Tcen2 * T2 / T1 - * (T5 * 4.0 * (dVth_dT - dVfbzb2_dT) + dVgsteff2_dT); - else dTcen2_dT = 0; - Ccen2 = EPSSI / Tcen2; - T0 = Cox / (Cox + Ccen2); - Coxeff2 = T0 * Ccen2; - T1 = -Ccen2 / Tcen2; - dCoxeff2_dVg = T0 * T0 * T1; - dCoxeff2_dVd = dCoxeff2_dVg * dTcen2_dVd; - dCoxeff2_dVb = dCoxeff2_dVg * dTcen2_dVb; - dCoxeff2_dVg *= dTcen2_dVg; - if (selfheat) - dCoxeff2_dT = T1 * dTcen2_dT * (T0 - Coxeff2 / (Cox + Ccen2)); - else dCoxeff2_dT = 0; - CoxWLcen2 = CoxWL2 * Coxeff2 / Cox; - CoxWLcenb2 = CoxWLb2 * Coxeff2 / Cox; - } -/* end v4.1 */ - - AbulkCV = Abulk0 * pParam->B4SOIabulkCVfactor; - dAbulkCV_dVb = pParam->B4SOIabulkCVfactor * dAbulk0_dVb; - VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - T4 = T3 * ( 1.0 - dDeltaPhi_dVg); - dVdseffCV_dVg = T4; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - - T0 = AbulkCV * VdseffCV; - T1 = Vgsteff - DeltaPhi; - T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); - T3 = T0 / T2; - T4 = 1.0 - 12.0 * T3 * T3; - T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); - T6 = T5 * VdseffCV / AbulkCV; - - qinv = qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); - QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg) - + T5 * dVdseffCV_dVg); - Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; - -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - VdsatCV2 = (Vgsteff2 - DeltaPhi2) / AbulkCV; - V4 = VdsatCV2 - Vds - DELTA_4; - T02 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV2); - VdseffCV2 = VdsatCV2 - 0.5 * (V4 + T02); - T12 = 0.5 * (1.0 + V4 / T02); - T22 = DELTA_4 / T02; - T3 = (1.0 - T12 - T22) / AbulkCV; - T4 = T3 * ( 1.0 - dDeltaPhi2_dVg); - dVdseffCV2_dVg = T4; - dVdseffCV2_dVd = T12; - dVdseffCV2_dVb = -T3 * VdsatCV2 * dAbulkCV_dVb; - - T02 = AbulkCV * VdseffCV2; - T12 = Vgsteff2 - DeltaPhi2; - T22 = 12.0 * (T12 - 0.5 * T02 + 1.0e-20); - T3 = T02 / T22; - T4 = 1.0 - 12.0 * T3 * T3; - T52 = AbulkCV * (6.0 * T02 * (4.0 * T12 - T02) / (T22 * T22) - 0.5); - T6 = T52 * VdseffCV2 / AbulkCV; - T7 = CoxWLcen2 * (T12 - T02 * (0.5 - T3)); - qinv += T7; - qgate = qinoi = qinv; - QovCox2 = T7 / Coxeff2; - Cgg12 = CoxWLcen2 * (T4 * (1.0 - dDeltaPhi2_dVg) - + T52 * dVdseffCV2_dVg); - Cgd12 = CoxWLcen2 * T52 * dVdseffCV2_dVd + Cgg12 - * dVgsteff2_dVd + QovCox2 * dCoxeff2_dVd; - Cgb12 = CoxWLcen2 * (T52 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb) - + Cgg12 * dVgsteff2_dVb + QovCox2 * dCoxeff2_dVb; - Cgg12 = Cgg12 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; - } - -/* end v4.1 */ - - -/* v3.1 */ - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ - { - qbulk = Cbg1 = Cbd1 = Cbb1 = Cbg12 = Cbb12 = Cbd12 = 0; - } - else /* soiMod = 0 or 1 */ - { - T7 = 1.0 - AbulkCV; - T8 = T2 * T2; - T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); - T10 = T9 * (1.0 - dDeltaPhi_dVg); - T11 = -T7 * T5 / AbulkCV; - T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); - - qbulk = CoxWLcenb * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); - QovCox = qbulk / Coxeff; - Cbg1 = CoxWLcenb * (T10 + T11 * dVdseffCV_dVg); - Cbd1 = CoxWLcenb * T11 * dVdseffCV_dVd + Cbg1 - * dVgsteff_dVd + QovCox * dCoxeff_dVd; - Cbb1 = CoxWLcenb * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) - + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - T8 = T22 * T22; - T9 = 12.0 * T7 * T02 * T02 / (T8 * AbulkCV); - T10 = T9 * (1.0 - dDeltaPhi2_dVg); - T11 = -T7 * T52 / AbulkCV; - T12 = -(T9 * (Vgsteff2 - DeltaPhi2) / AbulkCV + VdseffCV2 * (0.5 - T02 / T22)); - - qbulk2 = CoxWLcenb2 * T7 * (0.5 * VdseffCV2 - T02 * VdseffCV2 / T22); - QovCox2 = qbulk2 / Coxeff2; - Cbg12 = CoxWLcenb2 * (T10 + T11 * dVdseffCV2_dVg); - Cbd12 = CoxWLcenb2 * T11 * dVdseffCV2_dVd + Cbg12 - * dVgsteff2_dVd + QovCox2 * dCoxeff2_dVd; - Cbb12 = CoxWLcenb2 * (T11 * dVdseffCV2_dVb + T12 * dAbulkCV_dVb) - + Cbg12 * dVgsteff2_dVb + QovCox2 * dCoxeff2_dVb; - Cbg12 = Cbg12 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; - qbulk += qbulk2; - } + } -/* end v4.1 */ - - } -/* v3.1 */ - - - if (model->B4SOIxpart > 0.5) - { /* 0/100 partition */ - qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 - - 0.5 * T0 * T0 / T2); - QovCox = qsrc / Coxeff; - T2 += T2; - T3 = T2 * T2; - T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV; - - Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); - Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd - + QovCox * dCoxeff_dVd; - Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) - + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; - /* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - qsrc2 = -CoxWLcen2 * ( (Vgsteff2 - DeltaPhi2) / 2.0 + T02 / 4.0 - - 0.5 * T02 * T02 / T2); - QovCox2 = qsrc2 / Coxeff2; - T22 += T22; - T3 = T22 * T22; - T7 = -(0.25 - 12.0 * T02 * (4.0 * T12 - T02) / T3); - T4 = -(0.5 + 24.0 * T02 * T02 / T3) * (1.0 - dDeltaPhi2_dVg); - T5 = T7 * AbulkCV; - T6 = T7 * VdseffCV2; - Csg2 = CoxWLcen2 * (T4 + T5 * dVdseffCV2_dVg); - Csd2 = CoxWLcen2 * T5 * dVdseffCV2_dVd + Csg2 * dVgsteff2_dVd - + QovCox2 * dCoxeff2_dVd; - Csb2 = CoxWLcen2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb) - + Csg2 * dVgsteff2_dVb + QovCox2 * dCoxeff2_dVb; - Csg2 = Csg2 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; - qsrc += qsrc2; - } -/* end v4.1 */ - - } - else if (model->B4SOIxpart < 0.5) - { /* 40/60 partition */ - T2 = T2 / 12.0; - T3 = 0.5 * CoxWLcen / (T2 * T2); - T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 - * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; - qsrc = -T3 * T4; - QovCox = qsrc / Coxeff; - T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; - T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 - * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); - T6 = AbulkCV * (qsrc / T2 + T3 * T8); - T7 = T6 * VdseffCV / AbulkCV; - - Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; - Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd - + QovCox * dCoxeff_dVd; - Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb - + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; - Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - T22 = T22 / 12.0; - T3 = 0.5 * CoxWLcen2 / (T22 * T22); - T4 = T12 * (2.0 * T02 * T02 / 3.0 + T12 * (T12 - 4.0 - * T02 / 3.0)) - 2.0 * T02 * T02 * T02 / 15.0; - qsrc2 = -T3 * T4; - QovCox2 = qsrc2 / Coxeff2; - T8 = 4.0 / 3.0 * T12 * (T12 - T02) + 0.4 * T02 * T02; - T5 = -2.0 * qsrc2 / T22 - T3 * (T12 * (3.0 * T12 - 8.0 - * T02 / 3.0) + 2.0 * T02 * T02 / 3.0); - T6 = AbulkCV * (qsrc2 / T22 + T3 * T8); - T7 = T6 * VdseffCV2 / AbulkCV; - - Csg2 = T5 * (1.0 - dDeltaPhi2_dVg) + T6 * dVdseffCV2_dVg; - Csd2 = Csg2 * dVgsteff2_dVd + T6 * dVdseffCV2_dVd - + QovCox2 * dCoxeff2_dVd; - Csb2 = Csg2 * dVgsteff2_dVb + T6 * dVdseffCV2_dVb - + T7 * dAbulkCV_dVb + QovCox2 * dCoxeff2_dVb; - Csg2 = Csg2 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; - qsrc += qsrc2; - } -/* end v4.1 */ - } - else - { /* 50/50 partition */ - qsrc = -0.5 * qgate; - Csg = -0.5 * Cgg1; - Csd = -0.5 * Cgd1; - Csb = -0.5 * Cgb1; -/* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - Csg2 = -0.5 * Cgg12; - Csd -= 0.5 * Cgd12; - Csb -= 0.5 * Cgb12; - } -/* end v4.1 */ - } - - - /* Backgate charge */ -/* v3.1 */ - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ - { - Qe1 = Ce1b = Ce1e = Ce1T = dQe1_dT = 0; - } - else /* soiMod = 0 or 1 */ - { - CboxWL = pParam->B4SOIkb1 * model->B4SOIfbody * Cbox - * (pParam->B4SOIweffCV / here->B4SOInseg - * pParam->B4SOIleffCVbg + here->B4SOIaebcp); - Qe1 = CboxWL * (Vesfb - Vbs); - Ce1b = dQe1_dVb = -CboxWL; - Ce1e = dQe1_dVe = CboxWL; - if (selfheat) Ce1T = dQe1_dT = -CboxWL * dvfbb_dT; - else Ce1T = dQe1_dT = 0.0; - } -/* v3.1 */ - - - qgate += Qac0 + Qsub0 - qbulk; - qbody = qbulk - Qac0 - Qsub0 - Qe1; - qsub = Qe1; - qdrn = -(qgate + qbody + qsub + qsrc); - - Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - Cbd = Cbd1 - dQsub0_dVd; - Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb - Ce1b / dVbseff_dVb; - if (selfheat) - CbT = Cbg1 * dVgsteff_dT - dQac0_dT - - dQsub0_dT - dQe1_dT; - else CbT = 0.0; - - Cgg = Cgg1 - Cbg; - Cgd = Cgd1 - Cbd; - Cgb = Cgb1 - Cbb - Ce1b / dVbseff_dVb; - if (selfheat) - CgT = Cgg1 * dVgsteff_dT + dQac0_dT - + dQsub0_dT; - else CgT = 0.0; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - Csb *= dVbseff_dVb; - if (selfheat) CsT = Csg * dVgsteff_dT; - else CsT = 0.0; - /* v4.1 */ - if (here->B4SOIagbcp2 > 0) { - Cbg += Cbg12 - dQac02_dVg - dQsub02_dVg; - Cbd += Cbd12 - dQsub02_dVd; - Cbb += Cbb12 - dQac02_dVb - dQsub02_dVb; - if (selfheat) - CbT += Cbg12 * dVgsteff2_dT - dQac02_dT - - dQsub02_dT; - else CbT = 0.0; - Cgg = Cgg1 + Cgg12 - Cbg; - Cgd = Cgd1 + Cgd12 - Cbd; - Cgb = Cgb1 + Cgb12 - Cbb - Ce1b / dVbseff_dVb; - if (selfheat) - CgT += Cgg12 * dVgsteff2_dT + dQac02_dT - + dQsub02_dT; - else CgT = 0.0; - - Cgb *= dVbseff_dVb; - Cbb *= dVbseff_dVb; - if (selfheat) CsT += Csg2 * dVgsteff2_dT; - else CsT = 0.0; - Csg += Csg2; - } - -/* end v4.1 */ - here->B4SOIcggb = Cgg; - here->B4SOIcgsb = -(Cgg + Cgd + Cgb); - here->B4SOIcgdb = Cgd; - here->B4SOIcgT = CgT; - - here->B4SOIcbgb = Cbg; - here->B4SOIcbsb = -(Cbg + Cbd + Cbb) - + Ce1e; - here->B4SOIcbdb = Cbd; - here->B4SOIcbeb = -Ce1e; - here->B4SOIcbT = CbT; - - here->B4SOIceT = Ce1T; - here->B4SOIceeb = Ce1e ; - - here->B4SOIcdgb = -(Cgg + Cbg + Csg); - here->B4SOIcddb = -(Cgd + Cbd + Csd); - here->B4SOIcdeb = 0; - here->B4SOIcdT = -(CgT+CbT+CsT) - Ce1T; - here->B4SOIcdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb - + Csg + Csd + Csb) + Ce1b; - here->B4SOIqinv = -qinoi; - - } /* End of if capMod ==3 */ - else { /* v4.0 */ - Qsub0 = Qac0 = 0.0; - qgate = qdrn = qsrc = qbody = qsub = 0.0; - Cbg = Cbd = Cbb = 0.0; - here->B4SOIcggb = here->B4SOIcgsb - = here->B4SOIcgdb = 0.0; - here->B4SOIcdgb = here->B4SOIcdsb - = here->B4SOIcddb = 0.0; - here->B4SOIcbgb = here->B4SOIcbsb - = here->B4SOIcbdb = 0.0; - } - } - here->B4SOIqgate = qgate; - here->B4SOIqdrn = qdrn; - here->B4SOIqbulk = qbody; - here->B4SOIqsrc = qsrc; - - - - finished: /* returning Values to Calling Routine */ - /* - * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE - */ - if (ChargeComputationNeeded) - { - /* Intrinsic S/D junction charge */ - -/* v3.1 */ - if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ - { - qjs = qjd = 0.0; - gcjdds = gcjdbs = gcjdT = 0.0; - gcjsbs = gcjsT = 0.0; - here->B4SOIcjsb = here->B4SOIcjdb = 0.0 /*v4.0*/; - - } - else /* soiMod = 0 or 1 */ - { - PhiBSWG = model->B4SOIGatesidewallJctSPotential; - dPhiBSWG_dT = -model->B4SOItpbswg; - PhiBSWG += dPhiBSWG_dT * (Temp - model->B4SOItnom); - MJSWG = model->B4SOIbodyJctGateSideSGradingCoeff; - - cjsbs = model->B4SOIunitLengthGateSidewallJctCapS - * wdiosCV * model->B4SOItsi / 1e-7; - dcjsbs_dT = cjsbs * model->B4SOItcjswg; - cjsbs += dcjsbs_dT * (Temp - model->B4SOItnom); - - cjdbs = model->B4SOIunitLengthGateSidewallJctCapD - * wdiodCV * model->B4SOItsi / 1e-7; - dcjdbs_dT = cjdbs * model->B4SOItcjswgd; - cjdbs += dcjdbs_dT * (Temp - model->B4SOItnom); - - DioMax = 0.9 * (PhiBSWG); - - arg = 1.0 - (Vbs > DioMax ? DioMax : Vbs) / PhiBSWG; - - if (selfheat) - darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT; - - if (MJSWG == 0.5) { - dT3_dVb = 1.0 / sqrt(arg); - - if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT; - } - else { - dT3_dVb = exp(-MJSWG * log(arg)); - - if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT; - } - T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); - - if (selfheat) - dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG) - - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); - - if (Vbs > DioMax) - T3 += dT3_dVb * (Vbs - DioMax); - - qjs = cjsbs * T3 + model->B4SOItt * Ibsdif; - gcjsbs = cjsbs * dT3_dVb + model->B4SOItt * dIbsdif_dVb; - - if (selfheat) - gcjsT = model->B4SOItt * dIbsdif_dT + dcjsbs_dT * T3 + dT3_dT * cjsbs; - else gcjsT = 0.0; - - PhiBSWG = model->B4SOIGatesidewallJctDPotential; - dPhiBSWG_dT = -model->B4SOItpbswgd; - PhiBSWG += dPhiBSWG_dT * (Temp - model->B4SOItnom); - MJSWG = model->B4SOIbodyJctGateSideDGradingCoeff; - - DioMax = 0.9 * (PhiBSWG); - - arg = 1.0 - (Vbd > DioMax ? DioMax : Vbd) / PhiBSWG; - - if (selfheat) - darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT; - - if (MJSWG == 0.5) { - dT3_dVb = 1.0 / sqrt(arg); - - if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT; - } - else { - dT3_dVb = exp(-MJSWG * log(arg)); - - if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT; - } - T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); + Iiibjt = T0 * Ic * T1 * T4; - if (selfheat) - dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG) - - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); + if (selfheat) + {T5= T2-1.0; + dVbci_dT = pParam->B4SOIvbci * model->B4SOItvbci *model->B4SOItnom; + if(T1<=0.0) + dT4_dT = 0.0; + else + dT4_dT = -T4 * pParam->B4SOIabjtii* T2 * pow(T1,T5)*dVbci_dT; - if (Vbd > DioMax) - T3 += dT3_dVb * (Vbd - DioMax); + dIiibjt_dT = T0 * Ic * T4 * dVbci_dT + + T0 *Ic *T1 * dT4_dT + T0 * GcT *T1 * T4; /* Samuel Mertens */ - dT3_dVd = -dT3_dVb; + } + else + { + dVbci_dT = 0.0; + dT4_dT =0.0; + dIiibjt_dT = 0.0; + } - qjd = cjdbs * T3 + model->B4SOItt * Ibddif; - gcjdbs = cjdbs * dT3_dVb + model->B4SOItt * dIbddif_dVb; - gcjdds = cjdbs * dT3_dVd + model->B4SOItt * dIbddif_dVd; - if (selfheat) - gcjdT = model->B4SOItt * dIbddif_dT + dcjdbs_dT * T3 + dT3_dT * cjdbs; - else gcjdT = 0.0; - } -/* v3.1 */ + // Xue fix 10/29/2009 + dIiibjt_dVd = T0 * Ic *T4 + + T0 *Ic *T1*dT4_dVd + T0 * dIc_dVd * T1 * T4; + dIiibjt_dVb = -T0 * Ic *T4 + T0*Ic*T1*dT4_dVb + T0 * dIc_dVb * T1 * T4; - /* v4.0 */ -/* qdrn -= qjd; - qbody += (qjs + qjd); - qsrc = -(qgate + qbody + qdrn + qsub); -*/ - /* Update the conductance */ - here->B4SOIcddb -= gcjdds; - here->B4SOIcdT -= gcjdT; - here->B4SOIcdsb += gcjdds + gcjdbs; - - - here->B4SOIcbdb += (gcjdds); - here->B4SOIcbT += (gcjdT + gcjsT); - here->B4SOIcbsb -= (gcjdds + gcjdbs + gcjsbs); - - here->B4SOIcjsb = (gcjdds + gcjdbs + gcjsbs); /* v4.0 */ - here->B4SOIcjdb = -gcjdds; /* v4.0 */ - - /* Extrinsic Bottom S/D to substrate charge */ - T10 = -model->B4SOItype * ves; - /* T10 is vse without type conversion */ - T11 = model->B4SOItype * (vds - ves); - /* T11 is vde without type conversion */ - - if (model->B4SOIcsdmin != 0.0) - { - if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || - ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) - { - if (T10 < pParam->B4SOIvsdfb) - { here->B4SOIqse = here->B4SOIcsbox * (T10 - pParam->B4SOIvsdfb); - here->B4SOIgcse = here->B4SOIcsbox; - } - else if (T10 < pParam->B4SOIsdt1) - { T0 = T10 - pParam->B4SOIvsdfb; - T1 = T0 * T0; - here->B4SOIqse = T0 * (here->B4SOIcsbox - - pParam->B4SOIst2 / 3 * T1) ; - here->B4SOIgcse = here->B4SOIcsbox - pParam->B4SOIst2 * T1; - } - else if (T10 < pParam->B4SOIvsdth) - { T0 = T10 - pParam->B4SOIvsdth; - T1 = T0 * T0; - here->B4SOIqse = here->B4SOIcsmin * T10 + here->B4SOIst4 + - pParam->B4SOIst3 / 3 * T0 * T1; - here->B4SOIgcse = here->B4SOIcsmin + pParam->B4SOIst3 * T1; - } - else - { here->B4SOIqse = here->B4SOIcsmin * T10 + here->B4SOIst4; - here->B4SOIgcse = here->B4SOIcsmin; - } - } else - { - if (T10 < pParam->B4SOIvsdth) - { here->B4SOIqse = here->B4SOIcsmin * (T10 - pParam->B4SOIvsdth); - here->B4SOIgcse = here->B4SOIcsmin; - } - else if (T10 < pParam->B4SOIsdt1) - { T0 = T10 - pParam->B4SOIvsdth; - T1 = T0 * T0; - here->B4SOIqse = T0 * (here->B4SOIcsmin - pParam->B4SOIst2 / 3 * T1) ; - here->B4SOIgcse = here->B4SOIcsmin - pParam->B4SOIst2 * T1; - } - else if (T10 < pParam->B4SOIvsdfb) - { T0 = T10 - pParam->B4SOIvsdfb; - T1 = T0 * T0; - here->B4SOIqse = here->B4SOIcsbox * T10 + here->B4SOIst4 + - pParam->B4SOIst3 / 3 * T0 * T1; - here->B4SOIgcse = here->B4SOIcsbox + pParam->B4SOIst3 * T1; - } - else - { here->B4SOIqse = here->B4SOIcsbox * T10 + here->B4SOIst4; - here->B4SOIgcse = here->B4SOIcsbox; - } - } - - if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || - ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) - { - if (T11 < pParam->B4SOIvsdfb) - { here->B4SOIqde = here->B4SOIcdbox * (T11 - pParam->B4SOIvsdfb); - here->B4SOIgcde = here->B4SOIcdbox; - } - else if (T11 < pParam->B4SOIsdt1) - { T0 = T11 - pParam->B4SOIvsdfb; - T1 = T0 * T0; - here->B4SOIqde = T0 * (here->B4SOIcdbox - pParam->B4SOIdt2 / 3 * T1) ; - here->B4SOIgcde = here->B4SOIcdbox - pParam->B4SOIdt2 * T1; - } - else if (T11 < pParam->B4SOIvsdth) - { T0 = T11 - pParam->B4SOIvsdth; - T1 = T0 * T0; - here->B4SOIqde = here->B4SOIcdmin * T11 + here->B4SOIdt4 + - pParam->B4SOIdt3 / 3 * T0 * T1; - here->B4SOIgcde = here->B4SOIcdmin + pParam->B4SOIdt3 * T1; - } - else - { here->B4SOIqde = here->B4SOIcdmin * T11 + here->B4SOIdt4; - here->B4SOIgcde = here->B4SOIcdmin; - } - } else - { - if (T11 < pParam->B4SOIvsdth) - { here->B4SOIqde = here->B4SOIcdmin * (T11 - pParam->B4SOIvsdth); - here->B4SOIgcde = here->B4SOIcdmin; - } - else if (T11 < pParam->B4SOIsdt1) - { T0 = T11 - pParam->B4SOIvsdth; - T1 = T0 * T0; - here->B4SOIqde = T0 * (here->B4SOIcdmin - pParam->B4SOIdt2 / 3 * T1) ; - here->B4SOIgcde = here->B4SOIcdmin - pParam->B4SOIdt2 * T1; - } - else if (T11 < pParam->B4SOIvsdfb) - { T0 = T11 - pParam->B4SOIvsdfb; - T1 = T0 * T0; - here->B4SOIqde = here->B4SOIcdbox * T11 + here->B4SOIdt4 + - pParam->B4SOIdt3 / 3 * T0 * T1; - here->B4SOIgcde = here->B4SOIcdbox + pParam->B4SOIdt3 * T1; - } - else - { here->B4SOIqde = here->B4SOIcdbox * T11 + here->B4SOIdt4; - here->B4SOIgcde = here->B4SOIcdbox; - } - } - } - else { - here->B4SOIqse = here->B4SOIcsbox * T10; - here->B4SOIgcse = here->B4SOIcsbox; - here->B4SOIqde = here->B4SOIcdbox * T11; - here->B4SOIgcde = here->B4SOIcdbox; - } - - /* Extrinsic : Sidewall fringing S/D charge */ - here->B4SOIqse += here->B4SOIcsesw * T10; - here->B4SOIgcse += here->B4SOIcsesw; - here->B4SOIqde += here->B4SOIcdesw * T11; - here->B4SOIgcde += here->B4SOIcdesw; - - /* All charge are mutliplied with type at the end, but qse and qde - have true polarity => so pre-mutliplied with type */ - here->B4SOIqse *= model->B4SOItype; - here->B4SOIqde *= model->B4SOItype; - } - else { /* v4.0 */ - qjs = qjd = 0.0; - here->B4SOIqse = here->B4SOIqde = 0.0; - here->B4SOIgcse = here->B4SOIgcde = 0.0; - } - - here->B4SOIcbb = Cbb; - here->B4SOIcbd = Cbd; - here->B4SOIcbg = Cbg; - here->B4SOIqbf = -Qsub0 - Qac0; - here->B4SOIqjs = qjs; - here->B4SOIqjd = qjd; - *(ckt->CKTstate0 + here->B4SOIqbs) = qjs; /* v4.0 */ - *(ckt->CKTstate0 + here->B4SOIqbd) = qjd; /* v4.0 */ - - /* - * check convergence - */ - if ((here->B4SOIoff == 0) || (!(ckt->CKTmode & MODEINITFIX))) - { if (Check == 1) - { ckt->CKTnoncon++; -#ifndef NEWCONV - } - else - { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(here->B4SOIcd)) - + ckt->CKTabstol; - if (fabs(cdhat - here->B4SOIcd) >= tol) - { ckt->CKTnoncon++; - } - else - { tol = ckt->CKTreltol * MAX(fabs(cbhat), - fabs(here->B4SOIcbs + here->B4SOIcbd)) - + ckt->CKTabstol; - if (fabs(cbhat - (here->B4SOIcbs + here->B4SOIcbd)) - > tol) - { ckt->CKTnoncon++; - } - } -#endif /* NEWCONV */ - } - } - - *(ckt->CKTstate0 + here->B4SOIvg) = vg; - *(ckt->CKTstate0 + here->B4SOIvd) = vd; - *(ckt->CKTstate0 + here->B4SOIvs) = vs; - *(ckt->CKTstate0 + here->B4SOIvp) = vp; - *(ckt->CKTstate0 + here->B4SOIve) = ve; - - *(ckt->CKTstate0 + here->B4SOIvbs) = vbs; - *(ckt->CKTstate0 + here->B4SOIvbd) = vbd; - *(ckt->CKTstate0 + here->B4SOIvgs) = vgs; - *(ckt->CKTstate0 + here->B4SOIvds) = vds; - *(ckt->CKTstate0 + here->B4SOIves) = ves; - *(ckt->CKTstate0 + here->B4SOIvps) = vps; - *(ckt->CKTstate0 + here->B4SOIdeltemp) = delTemp; - - /* v3.1 added for RF */ - *(ckt->CKTstate0 + here->B4SOIvgge) = vgge; - *(ckt->CKTstate0 + here->B4SOIvggm) = vggm; - *(ckt->CKTstate0 + here->B4SOIvges) = vges; - *(ckt->CKTstate0 + here->B4SOIvgms) = vgms; - /* v3.1 added for RF end*/ - *(ckt->CKTstate0 + here->B4SOIvdbs) = vdbs; /* v4.0 */ - *(ckt->CKTstate0 + here->B4SOIvdbd) = vdbd; /* v4.0 */ - *(ckt->CKTstate0 + here->B4SOIvsbs) = vsbs; /* v4.0 */ - *(ckt->CKTstate0 + here->B4SOIvses) = vses; - *(ckt->CKTstate0 + here->B4SOIvdes) = vdes; - - /* bulk and channel charge plus overlaps */ - - if (!ChargeComputationNeeded) - goto line850; - - line755: - ag0 = ckt->CKTag[0]; - - T0 = vgd + DELTA_1; - if (here->B4SOIrgateMod == 3) T0 = vgmd + DELTA_1; /* v3.2 bug fix */ - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - -/* v2.2.3 bug fix */ - T3 = wdiodCV_NoSwap * pParam->B4SOIcgdl; /* v3.1 bug fix */ - - T4 = sqrt(1.0 - 4.0 * T2 / pParam->B4SOIckappa); - cgdo = pParam->B4SOIcgdo + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgdo = (pParam->B4SOIcgdo + T3) * vgd - T3 * (T2 - + 0.5 * pParam->B4SOIckappa * (T4 - 1.0)); - - if (here->B4SOIrgateMod == 3) { - qgdo = (pParam->B4SOIcgdo + T3) * vgmd - T3 * (T2 - + 0.5 * pParam->B4SOIckappa * (T4 - 1.0)); - } /* v3.2 bug fix */ - - T0 = vgs + DELTA_1; - if (here->B4SOIrgateMod == 3) T0 = vgms + DELTA_1; /* v3.2 bug fix */ - T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); - T2 = 0.5 * (T0 - T1); - -/* v2.2.3 bug fix */ - T3 = wdiosCV_NoSwap * pParam->B4SOIcgsl; /* v3.1 bug fix */ - - T4 = sqrt(1.0 - 4.0 * T2 / pParam->B4SOIckappa); - cgso = pParam->B4SOIcgso + T3 - T3 * (1.0 - 1.0 / T4) - * (0.5 - 0.5 * T0 / T1); - qgso = (pParam->B4SOIcgso + T3) * vgs - T3 * (T2 - + 0.5 * pParam->B4SOIckappa * (T4 - 1.0)); - - if (here->B4SOIrgateMod == 3) { - qgso = (pParam->B4SOIcgso + T3) * vgms - T3 * (T2 - + 0.5 * pParam->B4SOIckappa * (T4 - 1.0)); - } /* v3.2 bug fix */ - - if (here->B4SOInf != 1.0) - { cgdo *= here->B4SOInf; - cgso *= here->B4SOInf; - qgdo *= here->B4SOInf; - qgso *= here->B4SOInf; - } -/* here->B4SOIcgdo = cgdo; - here->B4SOIcgso = cgso; -*/ - if (here->B4SOIdebugMod < 0) - goto line850; - if (here->B4SOImode > 0) - { + /*Total Iii*/ + T0 = Ids; + here->B4SOIiii = Iii = Idsmosfet + Iiibjt; - /* v3.1 added for RF */ - if (here->B4SOIrgateMod == 3) - { - gcgmgmb = (cgdo + cgso + pParam->B4SOIcgeo) * ag0; - - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmeb = -pParam->B4SOIcgeo * ag0; - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcegmb = gcgmeb; - - gcggb = here->B4SOIcggb * ag0; - gcgdb = here->B4SOIcgdb * ag0; - gcgsb = here->B4SOIcgsb * ag0; - gcgeb = 0 ;/*v3.1 changed*/ - gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); - - gcdgb = here->B4SOIcdgb * ag0; - gcegb = gcgeb; /*v3.1 added*/ - gcsgb = -(here->B4SOIcggb + here->B4SOIcbgb - + here->B4SOIcdgb) * ag0 - gcegb; - gcbgb = here->B4SOIcbgb * ag0; - - qgd = qgdo; - qgs = qgso; - qge = 0; /* v3.1 change */ - - qgme = pParam->B4SOIcgeo * vgme; - qgmid = qgdo + qgso + qgme; - qdrn += here->B4SOIqde - qgd; - qsub -= qgme + here->B4SOIqse + here->B4SOIqde; - qsrc = -(qgate + qgmid + qbody + qdrn + qsub) - qjs; - qdrn -= qjd; - if (!here->B4SOIrbodyMod) qbody += qjd + qjs; - - } + + Giig = Ratio * Gm + T0 * dRatio_dVg; + Giib = Ratio * Gmb + T0 * dRatio_dVb + dIiibjt_dVb; + Giid = Ratio * Gds + T0 * dRatio_dVd + dIiibjt_dVd; + Giie = Ratio * Gme + T0 * dRatio_dVe; + + if (selfheat) + GiiT = Ratio * GmT + T0 * dRatio_dT + + dIiibjt_dT ; else + GiiT = 0.0; + + } + + /* Current through body resistor */ + /* Current going out is +ve */ + if ((here->B4SOIbodyMod == 0) || (here->B4SOIbodyMod == 2)) + { + Ibp = Gbpbs = Gbpps = 0.0; + } + else { /* here->B4SOIbodyMod == 1 */ + if (pParam->B4SOIrbody < 1e-3) /* 3.2 bug fix */ + { + if (here->B4SOIrbodyext <= 1e-3) /* 3.2 bug fix */ + T0 = 1.0 / 1e-3; /* 3.2 bug fix */ + else + T0 = 1.0 / here->B4SOIrbodyext; + Ibp = Vbp * T0; + Gbpbs = T0 * dVbp_dVb; + Gbpps = -T0 * dVbp_dVb; + } else { - gcggb = (here->B4SOIcggb + cgdo + cgso - + pParam->B4SOIcgeo) * ag0; - gcgdb = (here->B4SOIcgdb - cgdo) * ag0; - gcgsb = (here->B4SOIcgsb - cgso) * ag0; - gcgeb = (-pParam->B4SOIcgeo) *ag0; - gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); - - gcegb = (- pParam->B4SOIcgeo) * ag0; - gcdgb = (here->B4SOIcdgb - cgdo) * ag0; - gcsgb = -(here->B4SOIcggb + here->B4SOIcbgb - + here->B4SOIcdgb + cgso) * ag0; - gcbgb = here->B4SOIcbgb * ag0; - - gcdgmb = gcsgmb = gcegmb = 0.0; - gcgmdb = gcgmsb = gcgmeb = 0.0; - - /* Lump the overlap capacitance and S/D parasitics */ - qgd = qgdo; - qgs = qgso; - qge = pParam->B4SOIcgeo * vge; - qgate += qgd + qgs + qge; - qdrn += here->B4SOIqde - qgd; - qsub -= qge + here->B4SOIqse + here->B4SOIqde; - qsrc = -(qgate + qbody + qdrn + qsub) - qjs; - qdrn -= qjd; - if (!here->B4SOIrbodyMod) qbody += qjd + qjs; + Gbpbs = 1.0 / (pParam->B4SOIrbody + here->B4SOIrbodyext); + Ibp = Vbp * Gbpbs; + Gbpps = - Gbpbs; } + } - gcddb = (here->B4SOIcddb + cgdo + here->B4SOIgcde) * ag0; - gcdsb = here->B4SOIcdsb * ag0; - gcdeb = (here->B4SOIcdeb - here->B4SOIgcde) * ag0; - gcdT = model->B4SOItype * here->B4SOIcdT * ag0; + here->B4SOIibp = Ibp; + here->B4SOIgbpbs = Gbpbs; + here->B4SOIgbpps = Gbpps; + here->B4SOIgbpT = 0.0; + here->B4SOIcbodcon = (Ibp - (Gbpbs * Vbs + Gbpps * Vps)); + + } + + else /* v3.1 soiMod=2: ideal FD */ + { + Giig = Giib = Giid = Giie = GiiT = 0.0; + here->B4SOIiii = Iii = 0.0; + + here->B4SOIibp = Ibp = 0.0; + here->B4SOIgbpbs = 0.0; + here->B4SOIgbpps = here->B4SOIgbpT = here->B4SOIcbodcon = 0.0; + Gbpbs = Gbpps = 0.0; + } + /* v3.1 */ + + + + /* Current going out of drainprime node into the drain of device */ + /* "node" means the SPICE circuit node */ + + here->B4SOIcdrain = Ids + Ic; + here->B4SOIcd = Ids + Ic - Ibd + Iii + Igidl; + here->B4SOIcb = Ibs + Ibd + Ibp / here->B4SOInf - Iii - Igidl - Igisl - Igb; /* v4.2 bug fix # 27*/ + here->B4SOIgds = Gds + Gcd; + here->B4SOIgm = Gm; + here->B4SOIgmbs = Gmb + Gcb; + /* v3.0 */ + here->B4SOIgme = Gme; + + + /* v3.1 for RF */ + /* Calculate Rg */ + if (here->B4SOIrgateMod >1) + { T9 = pParam->B4SOIxrcrg2 * model->B4SOIvtm; + T0 = T9 *beta; + dT0_dVd = (dbeta_dVd + dbeta_dVg * dVgsteff_dVd) * T9; + dT0_dVb = (dbeta_dVb + dbeta_dVg * dVgsteff_dVb) * T9; + dT0_dVg = dbeta_dVg * T9; + T1 = 1 + gche * Rds; + T2 = 1 / T1; + + here->B4SOIgcrg = pParam->B4SOIxrcrg1 + * (T0 + here->B4SOIidovVds); + dIdlovVdseff_dVg = (T2 * dgche_dVg + - IdlovVdseff * gche * dRds_dVg) / T1; + dIdlovVdseff_dVd = T2 * dgche_dVd / T1; + dIdlovVdseff_dVb = (T2 * dgche_dVb + - IdlovVdseff * gche * dRds_dVb) / T1; + + T9 = diffVds / Va; + T3 = 1.0 + T9; + + T4 = T3 * dIdlovVdseff_dVg + - IdlovVdseff * (dVdseff_dVg + T9 * dVa_dVg) / Va; + T5 = T3 * dIdlovVdseff_dVd + IdlovVdseff + * (1.0 - dVdseff_dVd - T9 * dVa_dVd) / Va; + T6 = T3 * dIdlovVdseff_dVb + - IdlovVdseff * (dVdseff_dVb + T9 * dVa_dVb) / Va; + + tmp1 = (T4 * dVgsteff_dVd + T6 * dVbseff_dVd + T5) + / here->B4SOInseg; + tmp2 = (T4 * dVgsteff_dVg + T6 * dVbseff_dVg) + / here->B4SOInseg; + tmp3 = (T4 * dVgsteff_dVb + T6 * dVbseff_dVb) + / here->B4SOInseg; + + here->B4SOIgcrgd = pParam->B4SOIxrcrg1 * (dT0_dVd +tmp1); + here->B4SOIgcrgg = pParam->B4SOIxrcrg1 + * (dT0_dVg * dVgsteff_dVg + tmp2); + here->B4SOIgcrgb = pParam->B4SOIxrcrg1 + * (dT0_dVb * dVbseff_dVb + tmp3); + + if (here->B4SOInf != 1.0) + { here->B4SOIgcrg *= here->B4SOInf; + here->B4SOIgcrgg *= here->B4SOInf; + here->B4SOIgcrgd *= here->B4SOInf; + here->B4SOIgcrgb *= here->B4SOInf; + } - gcsdb = -(here->B4SOIcgdb + here->B4SOIcbdb - + here->B4SOIcddb) * ag0; - gcssb = (cgso + here->B4SOIgcse - (here->B4SOIcgsb - + here->B4SOIcbsb + here->B4SOIcdsb)) * ag0; - gcseb = -(here->B4SOIgcse + here->B4SOIcbeb - + here->B4SOIcdeb + here->B4SOIceeb) * ag0; - gcsT = - model->B4SOItype * (here->B4SOIcgT - + here->B4SOIcbT + here->B4SOIcdT + here->B4SOIceT) - * ag0; + if (here->B4SOIrgateMod == 2) + { T10 = here->B4SOIgrgeltd * here->B4SOIgrgeltd; + T11 = here->B4SOIgrgeltd + here->B4SOIgcrg; + here->B4SOIgcrg = here->B4SOIgrgeltd + * here->B4SOIgcrg / T11; + T12 = T10 / T11 /T11; + here->B4SOIgcrgg *= T12; + here->B4SOIgcrgd *= T12; + here->B4SOIgcrgb *= T12; + } - gcgT = model->B4SOItype * here->B4SOIcgT * ag0; + here->B4SOIgcrgs = -(here->B4SOIgcrgg + here->B4SOIgcrgd + + here->B4SOIgcrgb); + } /* v3.1 added Rg for RF end */ + + /* v4.0 Calculate bias-dependent external S/D resistance */ + if (model->B4SOIrdsMod) + { /* Rs(V) */ + T0 = vgs - pParam->B4SOIvfbsd; + T1 = sqrt(T0 * T0 + 1.0e-4); + vgs_eff = 0.5 * (T0 + T1); + dvgs_eff_dvg = vgs_eff / T1; + + T0 = 1.0 + pParam->B4SOIprwg * vgs_eff; + dT0_dVg = -pParam->B4SOIprwg / T0 / T0 * dvgs_eff_dvg; + T1 = -pParam->B4SOIprwb * vbs; + dT1_dVb = -pParam->B4SOIprwb; + + T2 = 1.0 / T0 + T1; + T3 = T2 + sqrt(T2 * T2 + 0.01); + dT3_dVg = T3 / (T3 - T2); + dT3_dVb = dT3_dVg * dT1_dVb; + dT3_dVg *= dT0_dVg; + + T4 = rs0 * 0.5; + Rs = rswmin + T3 * T4; + dRs_dVg = T4 * dT3_dVg; + dRs_dVb = T4 * dT3_dVb; + + T0 = 1.0 + here->B4SOIsourceConductance * Rs; + here->B4SOIgstot = here->B4SOIsourceConductance / T0; + T0 = -here->B4SOIgstot * here->B4SOIgstot; + dgstot_dvd = 0.0; /* place holder */ + dgstot_dve = 0.0; /* place holder */ + dgstot_dvg = T0 * dRs_dVg; + dgstot_dvb = T0 * dRs_dVb; + dgstot_dvs = -(dgstot_dvg + dgstot_dvb + dgstot_dvd + + dgstot_dve); + if (selfheat) { + dRs_dT = drswmin_dT + T3 * 0.5 * drs0_dT; + dgstot_dT = T0 * dRs_dT; + } + else dRs_dT = dgstot_dT = 0.0; + + /* Rd(V) */ + T0 = vgd - pParam->B4SOIvfbsd; + T1 = sqrt(T0 * T0 + 1.0e-4); + vgd_eff = 0.5 * (T0 + T1); + dvgd_eff_dvg = vgd_eff / T1; + + T0 = 1.0 + pParam->B4SOIprwg * vgd_eff; + dT0_dVg = -pParam->B4SOIprwg / T0 / T0 * dvgd_eff_dvg; + T1 = -pParam->B4SOIprwb * vbd; + dT1_dVb = -pParam->B4SOIprwb; + + T2 = 1.0 / T0 + T1; + T3 = T2 + sqrt(T2 * T2 + 0.01); + dT3_dVg = T3 / (T3 - T2); + dT3_dVb = dT3_dVg * dT1_dVb; + dT3_dVg *= dT0_dVg; + + /*T4 = pParam->B4SOIrd0 * 0.5;*/ /* v4.2 bugfix # 37 */ + /*Rd = pParam->B4SOIrdwmin + T3 * T4;*/ /* v4.2 bugfix # 37 */ + T4 = rd0 * 0.5; + Rd = rdwmin + T3 * T4; + dRd_dVg = T4 * dT3_dVg; + dRd_dVb = T4 * dT3_dVb; + T0 = 1.0 + here->B4SOIdrainConductance * Rd; + here->B4SOIgdtot = here->B4SOIdrainConductance / T0; + T0 = -here->B4SOIgdtot * here->B4SOIgdtot; + dgdtot_dvs = 0.0; + dgdtot_dve = 0.0; + dgdtot_dvg = T0 * dRd_dVg; + dgdtot_dvb = T0 * dRd_dVb; + dgdtot_dvd = -(dgdtot_dvg + dgdtot_dvb + dgdtot_dvs + + dgdtot_dve); + if (selfheat) { + dRd_dT = drdwmin_dT + T3 * 0.5 * drd0_dT; + dgdtot_dT = T0 * dRd_dT; + } + else dRd_dT = dgdtot_dT = 0.0; + + here->B4SOIgstotd = vses * dgstot_dvd; + here->B4SOIgstotg = vses * dgstot_dvg; + here->B4SOIgstots = vses * dgstot_dvs; + here->B4SOIgstotb = vses * dgstot_dvb; + + T2 = vdes - vds; + here->B4SOIgdtotd = T2 * dgdtot_dvd; + here->B4SOIgdtotg = T2 * dgdtot_dvg; + here->B4SOIgdtots = T2 * dgdtot_dvs; + here->B4SOIgdtotb = T2 * dgdtot_dvb; + } + else + { here->B4SOIgstot = here->B4SOIgstotd = here->B4SOIgstotg + = here->B4SOIgstots = here->B4SOIgstotb + = 0.0; + here->B4SOIgdtot = here->B4SOIgdtotd = here->B4SOIgdtotg + = here->B4SOIgdtots = here->B4SOIgdtotb + = 0.0; + } + + if (selfheat) + here->B4SOIgmT = GmT + GcT; + else + here->B4SOIgmT = 0.0; + + /* note that sign is switched because power flows out + of device into the temperature node. + Currently omit self-heating due to bipolar current + because it can cause convergence problem*/ + + here->B4SOIgtempg = -model->B4SOItype*Gm * Vds; + here->B4SOIgtempb = -model->B4SOItype*Gmb * Vds; + /* v3.0 */ + here->B4SOIgtempe = -model->B4SOItype*Gme * Vds; + + here->B4SOIgtempT = -GmT * Vds; + here->B4SOIgtempd = -model->B4SOItype* (Gds * Vds + Ids); + here->B4SOIcth = - Ids * Vds - model->B4SOItype * + (here->B4SOIgtempg * Vgs + here->B4SOIgtempb * Vbs + + here->B4SOIgtempe * Ves + + here->B4SOIgtempd * Vds) + - here->B4SOIgtempT * delTemp; /* v3.0 */ + + + /* Body current which flows into drainprime node from the drain of device */ + + here->B4SOIgjdb = Gjdb - Giib -Ggidlb - Ggislb; /* v4.0 */ + here->B4SOIgjdd = Gjdd - (Giid + Ggidld); + here->B4SOIgjdg = - (Giig + Ggidlg + Ggislg); + here->B4SOIgjde = - Giie; + if (selfheat) here->B4SOIgjdT = GjdT - GiiT; + else here->B4SOIgjdT = 0.0; + here->B4SOIcjd = Ibd - Iii - Igidl + - (here->B4SOIgjdb * Vbs + + here->B4SOIgjdd * Vds + + here->B4SOIgjdg * Vgs + + here->B4SOIgjde * Ves + + here->B4SOIgjdT * delTemp); /* v3.0 */ + + if (!here->B4SOIrbodyMod) + { + Giigidl_b = Giigidl_d = Giigidl_g = Giigidl_e + = Giigidl_T = Iii_Igidl = 0.0; + } + else + { + here->B4SOIgiigidlb = Giib + Ggidlb + Ggislb; + here->B4SOIgiigidld = Giid + Ggidld; + Giigidl_b = - Giib -Ggidlb - Ggislb; + Giigidl_d = - Giid -Ggidld; + Giigidl_g = - Giig -Ggidlg - Ggislg; + Giigidl_e = - Giie; + if (selfheat) Giigidl_T = -GiiT; + else GiiT = Giigidl_T = 0.0; + + /*Idbdp = Ibd - ( Gjdb * vbs_jct + Gjdd * Vds + + GjdT * delTemp); v4.2 bugfix */ + Idbdp = Ibd - ( Gjdb * vbd_jct + Gjdd * Vds + GjdT * delTemp); + /* Iii_Igidl = - Iii - Igidl + + Giigidl_b * Vbs + Giigidl_d * Vds + + Giigidl_g * Vgs + Giigidl_e * Ves + + Giigidl_T * delTemp ; */ + } + + /* Body current which flows into sourceprime node from the source of device */ + + here->B4SOIgjsg = 0.0; + here->B4SOIgjsd = Gjsd; + here->B4SOIgjsb = Gjsb; /* v4.0 */ + if (selfheat) here->B4SOIgjsT = GjsT; + else here->B4SOIgjsT = 0.0; + here->B4SOIcjs = Ibs - Igisl + -( here->B4SOIgjsb * Vbs + + here->B4SOIgjsd * Vds + + here->B4SOIgjsg * Vgs + + here->B4SOIgjsT * delTemp); + + if (here->B4SOIrbodyMod) { + Isbsp = Ibs - ( Gjsb * vbs_jct + Gjsd * Vds + + GjsT * delTemp ); + } + + /* Current flowing into body node */ + + here->B4SOIgbbs = Giib - Gjsb - Gjdb - Gbpbs / here->B4SOInf; /* v4.2 bug fix #27 */ + here->B4SOIgbgs = Giig + Ggidlg + Ggislg; + here->B4SOIgbds = Giid + Ggidld + Ggisls - Gjsd - Gjdd; + here->B4SOIgbes = Giie; + here->B4SOIgbps = - Gbpps / here->B4SOInf; /* v4.2 bug fix #27 */ + if (selfheat) here->B4SOIgbT = GiiT - GjsT - GjdT; + else here->B4SOIgbT = 0.0; + + if (!here->B4SOIrbodyMod) + { + here->B4SOIcbody = Iii + Igidl + Igisl - Ibs - Ibd + - Ibp / here->B4SOInf + Igb /* v4.2 bug fix #27 */ + - ( (here->B4SOIgbbs + dIgb_dVb) * Vbs + + (here->B4SOIgbgs + dIgb_dVg) * Vgs + + (here->B4SOIgbds + dIgb_dVd) * Vds + + here->B4SOIgbps * Vps + + (here->B4SOIgbes + dIgb_dVe) * Ves + + (here->B4SOIgbT + dIgb_dT) * delTemp); + } + + if (here->B4SOIrbodyMod) + { + here->B4SOIgbgiigbpb = Giib - Gbpbs / here->B4SOInf; /* v4.3 bug fix */ + here->B4SOIcbody = Iii + Igidl + Igisl - Ibp / here->B4SOInf + Igb /* v4.2 bug fix #27 */ + - ( (Giib - Gbpbs / here->B4SOInf + dIgb_dVb) * Vbs /* v4.2 bug fix #27 */ + + (here->B4SOIgbgs + dIgb_dVg) * Vgs + + (Giid + Ggidld + dIgb_dVd) * Vds + + here->B4SOIgbps * Vps + + (here->B4SOIgbes + dIgb_dVe) * Ves + + (GiiT + dIgb_dT) * delTemp ); + } + + here->B4SOIcgate = Igb + - (dIgb_dVb * Vbs + dIgb_dVe * Ves + dIgb_dVg * Vgs + + dIgb_dVd * Vds + dIgb_dT * delTemp); /* v3.0 */ + + /* Calculate Qinv for Noise analysis */ + + T1 = Vgsteff * (1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm); + here->B4SOIqinv = -model->B4SOIcox * pParam->B4SOIweff + * here->B4SOInf * Leff * T1; /* v4.0 */ + + if (here->B4SOInf != 1) { + here->B4SOIcdrain *= here->B4SOInf; + here->B4SOIcd *= here->B4SOInf; + here->B4SOIcb *= here->B4SOInf; + here->B4SOIgds *= here->B4SOInf; + here->B4SOIgm *= here->B4SOInf; + here->B4SOIgmbs *= here->B4SOInf; + here->B4SOIgme *= here->B4SOInf; + // Xue fix 10/29/2009 + /* here->B4SOIgmT *= here->B4SOInf; *added in line 5424 */ + here->B4SOIcbody *= here->B4SOInf; + + + here->B4SOIcgate *= here->B4SOInf; + + here->B4SOIIgcs *= here->B4SOInf; + here->B4SOIgIgcsg *= here->B4SOInf; + here->B4SOIgIgcsd *= here->B4SOInf; + here->B4SOIgIgcsb *= here->B4SOInf; + here->B4SOIIgcd *= here->B4SOInf; + here->B4SOIgIgcdg *= here->B4SOInf; + here->B4SOIgIgcdd *= here->B4SOInf; + here->B4SOIgIgcdb *= here->B4SOInf; + + here->B4SOIIgs *= here->B4SOInf; + here->B4SOIgIgsg *= here->B4SOInf; + here->B4SOIgIgss *= here->B4SOInf; + here->B4SOIIgd *= here->B4SOInf; + here->B4SOIgIgdg *= here->B4SOInf; + here->B4SOIgIgdd *= here->B4SOInf; + + here->B4SOIig *= here->B4SOInf; + here->B4SOIgigg *= here->B4SOInf; + here->B4SOIgigd *= here->B4SOInf; + here->B4SOIgigb *= here->B4SOInf; + here->B4SOIgige *= here->B4SOInf; + here->B4SOIgigT *= here->B4SOInf; + + here->B4SOIcjs *= here->B4SOInf; + here->B4SOIcjd *= here->B4SOInf; + here->B4SOIibs *= here->B4SOInf; + here->B4SOIibd *= here->B4SOInf; + Idbdp *= here->B4SOInf; /*v4.2 bug fix Idbdp needs update as Ibd for nf!=1*/ + Isbsp *= here->B4SOInf; /*v4.2 bug fix Isbsp needs update as Ibd for nf!=1*/ + here->B4SOIgbbs *= here->B4SOInf; + here->B4SOIgbgs *= here->B4SOInf; + here->B4SOIgbds *= here->B4SOInf; + here->B4SOIgbes *= here->B4SOInf; + here->B4SOIgbps *= here->B4SOInf; + here->B4SOIgbT *= here->B4SOInf; + here->B4SOIigidl *= here->B4SOInf; + here->B4SOIigisl *= here->B4SOInf; + + /* bugfix_snps NF*/ + here->B4SOIgjdb *= here->B4SOInf; + here->B4SOIgjdd *= here->B4SOInf; + here->B4SOIgjdg *= here->B4SOInf; + here->B4SOIgjde *= here->B4SOInf; + here->B4SOIgjdT *= here->B4SOInf; + here->B4SOIgjsb *= here->B4SOInf; + here->B4SOIgjsd *= here->B4SOInf; + here->B4SOIgjsg *= here->B4SOInf; + here->B4SOIgjsT *= here->B4SOInf; + + here->B4SOIcth *= here->B4SOInf; + here->B4SOIgmT *= here->B4SOInf; + here->B4SOIgtempg *= here->B4SOInf; + here->B4SOIgtempb *= here->B4SOInf; + here->B4SOIgtempe *= here->B4SOInf; + here->B4SOIgtempT *= here->B4SOInf; + here->B4SOIgtempd *= here->B4SOInf; + here->B4SOIiii *= here->B4SOInf; + /* bugfix NF ends */ + } + here->B4SOIgigs = -(here->B4SOIgigg + here->B4SOIgigd + + here->B4SOIgigb + here->B4SOIgige); + here->B4SOIgIgcss = -(here->B4SOIgIgcsg + here->B4SOIgIgcsd + + here->B4SOIgIgcsb); + here->B4SOIgIgcds = -(here->B4SOIgIgcdg + here->B4SOIgIgcdd + + here->B4SOIgIgcdb); + + /* Begin CV (charge) model */ + + if ((model->B4SOIxpart < 0) || (!ChargeComputationNeeded)) + { qgate = qdrn = qsrc = qbody = qsub = 0.0; /* v2.2.3 bug fix */ + Qsub0=Qac0=Cbb=Cbg=Cbd=0; /* Bugfix #19 Jul09*/ + here->B4SOIcggb = here->B4SOIcgsb = here->B4SOIcgdb = 0.0; + here->B4SOIcdgb = here->B4SOIcdsb = here->B4SOIcddb = 0.0; + here->B4SOIcbgb = here->B4SOIcbsb = here->B4SOIcbdb = 0.0; + goto finished; + } + else + { + CoxWL = model->B4SOIcox * (pParam->B4SOIweffCV + / here->B4SOInseg * here->B4SOInf /* v4.0 */ + * pParam->B4SOIleffCV + here->B4SOIagbcp); + CoxWLb = model->B4SOIfbody * model->B4SOIcox + * (pParam->B4SOIweffCV / here->B4SOInseg + * here->B4SOInf /* v4.0 */ + * pParam->B4SOIleffCVb + here->B4SOIagbcp); + /* v4.1 for improved BT charge model */ + + CoxWL2 = model->B4SOIcox * here->B4SOIagbcp2; + CoxWLb2 = model->B4SOIfbody * model->B4SOIcox * here->B4SOIagbcp2; + /* end v4.1 */ + + + /* v3.2 Seperate VgsteffCV with noff */ + noff = n * pParam->B4SOInoff; + dnoff_dVd = pParam->B4SOInoff * dn_dVd; + dnoff_dVb = pParam->B4SOInoff * dn_dVb; + if (model->B4SOIvgstcvMod == 0) + { + if ((VgstNVt > -EXPL_THRESHOLD) && (VgstNVt < EXPL_THRESHOLD)) + { + ExpVgst *= ExpVgst; + ExpVgst *= exp( -(pParam->B4SOIdelvt / (noff * Vtm))); + Vgsteff = noff * Vtm * log(1.0 + ExpVgst); + + T0 = ExpVgst / (1.0 + ExpVgst); + T1 = -T0 * (dVth_dVb + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVb) + + Vgsteff / noff * dnoff_dVb; + dVgsteff_dVd = -T0 * (dVth_dVd + dVth_dVb*dVbseff_dVd + (Vgst-pParam->B4SOIdelvt)/ noff * dnoff_dVd) + + Vgsteff / noff * dnoff_dVd; + dVgsteff_dVg = T0 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); + dVgsteff_dVb = T1 * dVbseff_dVb; + dVgsteff_dVe = T1 * dVbseff_dVe; + if (selfheat) + dVgsteff_dT = -T0 * (dVth_dT+dVth_dVb*dVbseff_dT + + (Vgst - pParam->B4SOIdelvt) / Temp) + + Vgsteff / Temp; + else dVgsteff_dT = 0.0; + /* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + ExpVgst2 = ExpVgst * exp(-1.12 / noff / Vtm); + Vgsteff2 = noff * Vtm * log(1.0 + ExpVgst2); + T02 = ExpVgst2 / (1.0 + ExpVgst2); + T12 = -T02 * (dVth_dVb + (Vgst-1.12-pParam->B4SOIdelvt) / noff * dnoff_dVb) + + Vgsteff2 / noff * dnoff_dVb; + dVgsteff2_dVd = -T02 * (dVth_dVd + dVth_dVb*dVbseff_dVd + (Vgst-pParam->B4SOIdelvt-1.12) / noff * dnoff_dVd) + + Vgsteff2 / noff * dnoff_dVd; + dVgsteff2_dVg = T02 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); + dVgsteff2_dVb = T12 * dVbseff_dVb; + dVgsteff2_dVe = T12 * dVbseff_dVe; + if (selfheat) + dVgsteff2_dT = -T02 * (dVth_dT+dVth_dVb*dVbseff_dT + + (Vgst - 1.12 - pParam->B4SOIdelvt) / Temp) + + Vgsteff2 / Temp; + else dVgsteff2_dT = 0.0; + } + } + } + else if (model->B4SOIvgstcvMod == 1) + {ExpVgst = exp(VgstNVt/(pParam->B4SOImstar * pParam->B4SOInoff)); + ExpVgst *= exp( -(pParam->B4SOIdelvt / (noff * Vtm))); + Vgsteff = noff * Vtm * log(1.0 + ExpVgst); + + T0 = ExpVgst / (1.0 + ExpVgst); + T1 = -T0 * (dVth_dVb + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVb) + + Vgsteff / noff * dnoff_dVb; + dVgsteff_dVd = -T0 * (dVth_dVd + dVth_dVb*dVbseff_dVd + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVd) + + Vgsteff / noff * dnoff_dVd; + dVgsteff_dVg = T0 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); + + dVgsteff_dVb = T1 * dVbseff_dVb; + dVgsteff_dVe = T1 * dVbseff_dVe; + if (selfheat) + dVgsteff_dT = -T0 * (dVth_dT+dVth_dVb*dVbseff_dT + + (Vgst - pParam->B4SOIdelvt) / Temp) + + Vgsteff / Temp; + else dVgsteff_dT = 0.0; + /* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + ExpVgst2 = ExpVgst * exp(-1.12 / noff / Vtm); + Vgsteff2 = noff * Vtm * log(1.0 + ExpVgst2); + T02 = ExpVgst2 / (1.0 + ExpVgst2); + T12 = -T02 * (dVth_dVb + (Vgst-1.12-pParam->B4SOIdelvt) / noff * dnoff_dVb) + + Vgsteff2 / noff * dnoff_dVb; + dVgsteff2_dVd = -T02 * (dVth_dVd + dVth_dVb*dVbseff_dVd + (Vgst-pParam->B4SOIdelvt - 1.12) / noff * dnoff_dVd) + + Vgsteff2 / noff * dnoff_dVd; + dVgsteff2_dVg = T02 * (dVgs_eff_dVg - dVth_dVb*dVbseff_dVg); + dVgsteff2_dVb = T12 * dVbseff_dVb; + dVgsteff2_dVe = T12 * dVbseff_dVe; + if (selfheat) + dVgsteff2_dT = -T02 * (dVth_dT+dVth_dVb*dVbseff_dT + + (Vgst - 1.12 - pParam->B4SOIdelvt) / Temp) + + Vgsteff2 / Temp; + else dVgsteff2_dT = 0.0; + } -/* gcbdb = here->B4SOIcbdb * ag0; - gcbsb = here->B4SOIcbsb * ag0; -*/ - gcbeb = here->B4SOIcbeb * ag0; - gcbT = model->B4SOItype * here->B4SOIcbT * ag0; - - /* v4.0 */ - if (!here->B4SOIrbodyMod) - { - gcjdbdp = gcjsbsp = 0.0; - gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb + gcdeb); - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb + gcseb); - gcdbdb = gcsbsb = 0.0; - gcbdb = here->B4SOIcbdb * ag0; - gcbsb = here->B4SOIcbsb * ag0; - here->B4SOIGGjdb = GGjdb = 0.0; - here->B4SOIGGjsb = GGjsb = 0.0; - } - else - { - gcjdbdp = gcjdbs * ag0; - gcjsbsp = gcjsbs * ag0; - gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb + gcdeb) - + gcjdbdp; - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb + gcseb) - + gcjsbsp; - gcdbdb = gcjdds * ag0; - gcsbsb = -(gcjdds + gcjdbs + gcjsbs) * ag0; - gcbdb = here->B4SOIcbdb * ag0 - gcdbdb; - gcbsb = here->B4SOIcbsb * ag0 - gcsbsb; - here->B4SOIGGjdb = GGjdb = Gjdb; - here->B4SOIGGjsb = GGjsb = Gjsb; - } - /* v4.0 end */ - - gcedb = (- here->B4SOIgcde) * ag0; - gcesb = (- here->B4SOIgcse) * ag0; - gceeb = (here->B4SOIgcse + here->B4SOIgcde + - here->B4SOIceeb + pParam->B4SOIcgeo) * ag0; - - gceT = model->B4SOItype * here->B4SOIceT * ag0; - - gcTt = pParam->B4SOIcth * ag0; - - sxpart = 0.6; - dxpart = 0.4; - - -/* v3.1 moved the following original code ahead */ - /* Lump the overlap capacitance and S/D parasitics */ -/* qgd = qgdo; - qgs = qgso; - qge = pParam->B4SOIcgeo * vge; - qgate += qgd + qgs + qge; - qdrn += here->B4SOIqde - qgd; - qsub -= qge + here->B4SOIqse + here->B4SOIqde; - qsrc = -(qgate + qbody + qdrn + qsub); -*/ -/* v3.1 end */ - } - - else - { - if (here->B4SOIrgateMod == 3) - { - gcgmgmb = (cgdo + cgso + pParam->B4SOIcgeo) * ag0; - gcgmdb = -cgdo * ag0; - gcgmsb = -cgso * ag0; - gcgmeb = -pParam->B4SOIcgeo * ag0; - gcdgmb = gcgmdb; - gcsgmb = gcgmsb; - gcegmb = gcgmeb; - - gcggb = here->B4SOIcggb * ag0; - gcgsb = here->B4SOIcgdb * ag0; - gcgdb = here->B4SOIcgsb * ag0; - gcgeb = 0; /* v3.1 */ - gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); /* v3.1 added gcgeb */ - - gcsgb = here->B4SOIcdgb * ag0; - gcegb = gcgeb; /* v3.1 added */ - gcdgb = -(here->B4SOIcggb + here->B4SOIcbgb - + here->B4SOIcdgb) * ag0 - gcegb; /*v3.1 added gcegb*/ - gcbgb = here->B4SOIcbgb * ag0; - - qgd = qgdo; - qgs = qgso; - qge = 0; /* v3.1 */ - qgme = pParam->B4SOIcgeo * vgme; - qgmid = qgdo + qgso + qgme; - qgate += qge; - qbody -= 0; - qsrc = qdrn - qgs + here->B4SOIqse; - qsub -= qgme + here->B4SOIqse + here->B4SOIqde; - qdrn = -(qgate + qgmid + qbody + qsrc + qsub) -qjd; - qsrc -= qjs; - if (!here->B4SOIrbodyMod) qbody += qjs + qjd; + } + else + { + T10 = noff * Vtm; + VgstNVt = pParam->B4SOImstarcv * (Vgst - pParam->B4SOIdelvt) / T10; + ExpArg = (pParam->B4SOIvoffcv - + (1- pParam->B4SOImstarcv) * (Vgst - pParam->B4SOIdelvt))/ T10; + + /* MCJ: Very small Vgst */ + if (VgstNVt > EXPL_THRESHOLD) + { Vgsteff = Vgst - pParam->B4SOIdelvt; + /* T0 is dVgsteff_dVbseff */ + T0 = -dVth_dVb; + dVgsteff_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; + dVgsteff_dVd = -dVth_dVd + T0 * dVbseff_dVd; + dVgsteff_dVb = T0 * dVbseff_dVb; + dVgsteff_dVe = T0 * dVbseff_dVe; + if (selfheat) + dVgsteff_dT = -dVth_dT + T0 * dVbseff_dT; + else + dVgsteff_dT = 0.0; + } + else if (ExpArg > EXPL_THRESHOLD) + { T0 = (Vgst - pParam->B4SOIdelvt - pParam->B4SOIvoffcv) / (noff * Vtm); + ExpVgst = exp(T0); + /*Vgsteff = Vtm * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst;*/ /*v4.2 bug fix*/ + Vgsteff = Vtm * cdep0 / model->B4SOIcox * ExpVgst; /* v4.2 bug fix */ + T3 = Vgsteff / (noff * Vtm) ; + /* T1 is dVgsteff_dVbseff */ + T1 = -T3 * (dVth_dVb + T0 * Vtm * dnoff_dVb); + dVgsteff_dVg = T3 * dVgs_eff_dVg+ T1 * dVbseff_dVg; + dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dnoff_dVd)+ T1 * dVbseff_dVd; + dVgsteff_dVe = T1 * dVbseff_dVe; + dVgsteff_dVb = T1 * dVbseff_dVb; + if (selfheat) + dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * noff) + + Vgsteff / Temp+ T1 * dVbseff_dT; + else + dVgsteff_dT = 0.0; } else { - gcggb = (here->B4SOIcggb + cgdo + cgso + pParam->B4SOIcgeo) * ag0; - gcgdb = (here->B4SOIcgsb - cgdo) * ag0; - gcgsb = (here->B4SOIcgdb - cgso) * ag0; - gcgeb = (- pParam->B4SOIcgeo) * ag0; - gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); /*added gcgbb*/ - - gcegb = gcgeb; /* v3.1 added */ - gcsgb = (here->B4SOIcdgb - cgso) * ag0; - gcdgb = -(here->B4SOIcggb + here->B4SOIcbgb + here->B4SOIcdgb + cgdo) * ag0; - gcbgb = here->B4SOIcbgb * ag0; - - gcdgmb = gcsgmb = gcegmb = 0.0; - gcgmdb = gcgmsb = gcgmeb = 0.0; - - /* Lump the overlap capacitance and S/D parasitics */ - qgd = qgdo; - qgs = qgso; - qge = pParam->B4SOIcgeo * vge; - qgate += qgd + qgs + qge; - qsrc = qdrn - qgs + here->B4SOIqse; - qsub -= qge + here->B4SOIqse + here->B4SOIqde; - qdrn = -(qgate + qbody + qsrc + qsub) - qjd; - qsrc -= qjs; - if (!here->B4SOIrbodyMod) qbody += qjs + qjd; - } + ExpVgst = exp(VgstNVt); + T1 = T10 * log(1.0 + ExpVgst); + dT1_dVg = ExpVgst / (1.0 + ExpVgst) * pParam->B4SOImstarcv; + dT1_dVb = -dT1_dVg * (dVth_dVb + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVb) + + T1 / noff * dnoff_dVb; + dT1_dVd = -dT1_dVg * (dVth_dVd + (Vgst-pParam->B4SOIdelvt) / noff * dnoff_dVd) + + T1 / noff * dnoff_dVd; + T3 = (1.0 / Temp); + if (selfheat) + dT1_dT = -dT1_dVg * (dVth_dT + (Vgst-pParam->B4SOIdelvt) * T3) + T1 * T3; + else + dT1_dT = 0.0; + + /* dT2_dVg = -model->B4SOIcox / (Vtm * pParam->B4SOIcdep0) + * exp(ExpArg) * (1 - pParam->B4SOImstarcv); */ /* v4.2 bug fix */ + dT2_dVg = -model->B4SOIcox / (Vtm * cdep0) + * exp(ExpArg) * (1 - pParam->B4SOImstarcv); /* v4.2 bug fix */ + T2 = pParam->B4SOImstarcv - T10 * dT2_dVg + / (1.0 - pParam->B4SOImstarcv); + dT2_dVd = -dT2_dVg * (dVth_dVd - Vtm * ExpArg * dnoff_dVd + / (1.0 - pParam->B4SOImstarcv)) + + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVd; + dT2_dVb = -dT2_dVg * (dVth_dVb - Vtm * ExpArg * dnoff_dVb + / (1.0 - pParam->B4SOImstarcv)) + + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVb; + if (selfheat) + dT2_dT = -dT2_dVg * ( dVth_dT - ExpArg * T10 * T3 + / (1.0 - pParam->B4SOImstarcv) ); + else + dT2_dT = 0.0; - gcssb = (here->B4SOIcddb + cgso + here->B4SOIgcse) * ag0; - gcsdb = here->B4SOIcdsb * ag0; - gcseb = (here->B4SOIcdeb - here->B4SOIgcse) * ag0; - gcsT = model->B4SOItype * here->B4SOIcdT * ag0; - - gcdsb = -(here->B4SOIcgdb + here->B4SOIcbdb - + here->B4SOIcddb) * ag0; - gcddb = (cgdo + here->B4SOIgcde - (here->B4SOIcgsb - + here->B4SOIcbsb + here->B4SOIcdsb)) * ag0; - gcdeb = -(here->B4SOIgcde + here->B4SOIcbeb - + here->B4SOIcdeb + here->B4SOIceeb) * ag0; - gcdT = - model->B4SOItype * (here->B4SOIcgT - + here->B4SOIcbT + here->B4SOIcdT + here->B4SOIceT) - * ag0; - - gcgT = model->B4SOItype * here->B4SOIcgT * ag0; - - gcbeb = here->B4SOIcbeb * ag0; - gcbT = model->B4SOItype * here->B4SOIcbT * ag0; -/* v4.0 gcbsb = here->B4SOIcbdb * ag0; - gcbdb = here->B4SOIcbsb * ag0; -*/ + Vgsteff = T1 / T2; - /* v4.0 */ - if (!here->B4SOIrbodyMod) - { - gcjdbdp = gcjsbsp = 0.0; - gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb + gcdeb); - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb + gcseb); - gcdbdb = gcsbsb = 0.0; - gcbdb = here->B4SOIcbsb * ag0; - gcbsb = here->B4SOIcbdb * ag0; - here->B4SOIGGjdb = GGjdb = 0.0; - here->B4SOIGGjsb = GGjsb = 0.0; - } - else - { - gcjdbdp = gcjsbs * ag0; - gcjsbsp = gcjdbs * ag0; - gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb + gcdeb) - + gcjdbdp; - gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb + gcseb) - + gcjsbsp; - gcsbsb = gcjdds * ag0; - gcdbdb = -(gcjdds + gcjdbs + gcjsbs) * ag0; - gcbdb = here->B4SOIcbsb * ag0 - gcdbdb; - gcbsb = here->B4SOIcbdb * ag0 - gcsbsb; - here->B4SOIGGjdb = GGjdb = Gjsb; - here->B4SOIGGjsb = GGjsb = Gjdb; - } - /* v4.0 end */ - -/* gcegb = (-pParam->B4SOIcgeo) * ag0; V3.2 bug fix */ - gcesb = (- here->B4SOIgcse) * ag0; - gcedb = (- here->B4SOIgcde) * ag0; - gceeb = (here->B4SOIceeb + pParam->B4SOIcgeo + - here->B4SOIgcse + here->B4SOIgcde) * ag0; - gceT = model->B4SOItype * here->B4SOIceT * ag0; - - gcTt = pParam->B4SOIcth * ag0; - - dxpart = 0.6; - sxpart = 0.4; - - - /* v3.1 moved the following code ahead */ - /* Lump the overlap capacitance */ - /* - qgd = qgdo; - gs = qgso; - qge = pParam->B4SOIcgeo * vge; - qgate += qgd + qgs + qge; - qsrc = qdrn - qgs + here->B4SOIqse; - qsub -= qge + here->B4SOIqse + here->B4SOIqde; - qdrn = -(qgate + qbody + qsrc + qsub); - */ - /* v3.1 end */ - - - } - - here->B4SOIcgdo = cgdo; - here->B4SOIcgso = cgso; - - if (ByPass) goto line860; - - *(ckt->CKTstate0 + here->B4SOIqe) = qsub; - *(ckt->CKTstate0 + here->B4SOIqg) = qgate; - *(ckt->CKTstate0 + here->B4SOIqd) = qdrn; - *(ckt->CKTstate0 + here->B4SOIqb) = qbody; - if ((model->B4SOIshMod == 1) && (here->B4SOIrth0!=0.0)) - *(ckt->CKTstate0 + here->B4SOIqth) = pParam->B4SOIcth * delTemp; - if (here->B4SOIrgateMod == 3) /* 3.1 bug fix */ - *(ckt->CKTstate0 + here->B4SOIqgmid) = qgmid; - - - /* store small signal parameters */ - if (ckt->CKTmode & MODEINITSMSIG) - { goto line1000; - } - if (!ChargeComputationNeeded) - goto line850; - - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->B4SOIqb) = - *(ckt->CKTstate0 + here->B4SOIqb); - *(ckt->CKTstate1 + here->B4SOIqg) = - *(ckt->CKTstate0 + here->B4SOIqg); - *(ckt->CKTstate1 + here->B4SOIqd) = - *(ckt->CKTstate0 + here->B4SOIqd); - *(ckt->CKTstate1 + here->B4SOIqe) = - *(ckt->CKTstate0 + here->B4SOIqe); - *(ckt->CKTstate1 + here->B4SOIqth) = - *(ckt->CKTstate0 + here->B4SOIqth); - if (here->B4SOIrgateMod == 3) - *(ckt->CKTstate1 + here->B4SOIqgmid) = - *(ckt->CKTstate0 + here->B4SOIqgmid); - if (here->B4SOIrbodyMod) /* v4.0 */ - { *(ckt->CKTstate1 + here->B4SOIqbs) = - *(ckt->CKTstate0 + here->B4SOIqbs); - *(ckt->CKTstate1 + here->B4SOIqbd) = - *(ckt->CKTstate0 + here->B4SOIqbd); - } - - } - - error = NIintegrate(ckt, &geq, &ceq,0.0,here->B4SOIqb); - if (error) return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqg); - if (error) return(error); - error = NIintegrate(ckt,&geq, &ceq, 0.0, here->B4SOIqd); - if (error) return(error); - error = NIintegrate(ckt,&geq, &ceq, 0.0, here->B4SOIqe); - if (error) return(error); - if ((model->B4SOIshMod == 1) && (here->B4SOIrth0!=0.0)) - { - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqth); - if (error) return (error); - } - - if (here->B4SOIrgateMod == 3) - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqgmid); - if (error) return(error); - } /*3.1 bug fix*/ - - if (here->B4SOIrbodyMod) /* v4.0 */ - { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqbs); - if (error) return(error); - error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqbd); - if (error) return(error); - } - - goto line860; - - line850: - /* initialize to zero charge conductance and current */ - ceqqe = ceqqg = ceqqb = ceqqd = ceqqth= 0.0; - - gcdgb = gcddb = gcdsb = gcdeb = gcdT = 0.0; - gcsgb = gcsdb = gcssb = gcseb = gcsT = 0.0; - gcggb = gcgdb = gcgsb = gcgeb = gcgT = 0.0; - gcbgb = gcbdb = gcbsb = gcbeb = gcbT = 0.0; - gcegb = gcedb = gceeb = gcesb = gceT = 0.0; - gcTt = 0.0; - - /* v3.1 added for RF */ - gcgmgmb = gcgmdb = gcgmsb = gcgmeb = 0.0; - gcdgmb = gcsgmb = gcegmb = ceqqgmid = 0.0; - gcgbb = gcsbb = gcdbb = 0.0; - /* v3.1 added for RF end */ - - gcdbdb = gcsbsb = gcjdbdp = gcjsbsp = 0.0; /* v4.0 */ - ceqqjd = ceqqjs = 0.0; /* v4.0 */ - GGjdb = GGjsb = 0.0; /* v4.0 */ - - sxpart = (1.0 - (dxpart = (here->B4SOImode > 0) ? 0.4 : 0.6)); - - goto line900; - - line860: - /* evaluate equivalent charge current */ - - cqgate = *(ckt->CKTstate0 + here->B4SOIcqg); - cqbody = *(ckt->CKTstate0 + here->B4SOIcqb); - cqdrn = *(ckt->CKTstate0 + here->B4SOIcqd); - cqsub = *(ckt->CKTstate0 + here->B4SOIcqe); - cqtemp = *(ckt->CKTstate0 + here->B4SOIcqth); - - here->B4SOIcb += cqbody; - here->B4SOIcd += cqdrn; - - ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs - - gcgeb * veb - gcgT * delTemp; - - ceqqb = cqbody - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs - - gcbeb * veb - gcbT * delTemp; /* v3.2 bug fix */ - ceqqd = cqdrn - gcdgb * vgb + (gcddb + gcdbdb) * vbd - + gcdsb * vbs - gcdeb * veb - gcdT * delTemp - - gcdbdb * vbd_jct - gcdgmb * vgmb;/* v4.0 */ - - ceqqe = cqsub - gcegb * vgb + gcedb * vbd + gcesb * vbs - - gceeb * veb - gceT * delTemp - gcegmb * vgmb; /* 3.2 bug fix */ - ceqqth = cqtemp - gcTt * delTemp; - - /* v3.1 added for RF */ - if (here->B4SOIrgateMod == 3) - ceqqgmid = *(ckt->CKTstate0 + here->B4SOIcqgmid) - + gcgmdb * vbd + gcgmsb * vbs - gcgmgmb * vgmb;/* 3.2 bug fix */ - else - ceqqgmid = 0.0; - /* v3.1 added for RF end */ - - if (here->B4SOIrbodyMod) /* v4.0 */ - { ceqqjs = *(ckt->CKTstate0 + here->B4SOIcqbs) - + gcsbsb * vbs_jct; - ceqqjd = *(ckt->CKTstate0 + here->B4SOIcqbd) - + gcdbdb * vbd_jct; - } - - if (ckt->CKTmode & MODEINITTRAN) - { *(ckt->CKTstate1 + here->B4SOIcqe) = - *(ckt->CKTstate0 + here->B4SOIcqe); - *(ckt->CKTstate1 + here->B4SOIcqb) = - *(ckt->CKTstate0 + here->B4SOIcqb); - *(ckt->CKTstate1 + here->B4SOIcqg) = - *(ckt->CKTstate0 + here->B4SOIcqg); - *(ckt->CKTstate1 + here->B4SOIcqd) = - *(ckt->CKTstate0 + here->B4SOIcqd); - *(ckt->CKTstate1 + here->B4SOIcqth) = - *(ckt->CKTstate0 + here->B4SOIcqth); - - if (here->B4SOIrgateMod == 3) /* v3.1 */ - *(ckt->CKTstate1 + here->B4SOIcqgmid) = - *(ckt->CKTstate0 + here->B4SOIcqgmid); - - if (here->B4SOIrbodyMod) /* v4.0 */ - { *(ckt->CKTstate1 + here->B4SOIcqbs) = - *(ckt->CKTstate0 + here->B4SOIcqbs); - *(ckt->CKTstate1 + here->B4SOIcqbd) = - *(ckt->CKTstate0 + here->B4SOIcqbd); - } - - } - - /* - * load current vector - */ - line900: - - if (here->B4SOImode >= 0) - { Gm = here->B4SOIgm; - Gmbs = here->B4SOIgmbs; -/* v3.0 */ - Gme = here->B4SOIgme; - - GmT = model->B4SOItype * here->B4SOIgmT; - FwdSum = Gm + Gmbs + Gme; /* v3.0 */ - RevSum = 0.0; - - /* v2.2.2 bug fix */ - cdreq = model->B4SOItype * (here->B4SOIcdrain - - here->B4SOIgds * vds - Gm * vgs - Gmbs * vbs - - Gme * ves) - GmT * delTemp; /* v3.0 */ - - /* ceqbs now is compatible with cdreq, ie. going in is +ve */ - /* Equivalent current source from the diode */ - ceqbs = here->B4SOIcjs; - ceqbd = here->B4SOIcjd; - cdbdp = Idbdp; - csbsp = Isbsp; - - /* Current going in is +ve */ - ceqbody = -here->B4SOIcbody; - - ceqgate = here->B4SOIcgate; - gigg = here->B4SOIgigg; - gigb = here->B4SOIgigb; - gige = here->B4SOIgige; /* v3.0 */ - gigs = here->B4SOIgigs; - gigd = here->B4SOIgigd; - gigT = model->B4SOItype * here->B4SOIgigT; - - ceqth = here->B4SOIcth; - ceqbodcon = here->B4SOIcbodcon; - - /* v4.1 */ - gigpg = here->B4SOIgigpg; - gigpp = here->B4SOIgigpp; - ceqgate += (here->B4SOIigp - gigpg * vgp); - if(here->B4SOIbodyMod == 1) - ceqbodcon += (here->B4SOIigp - gigpg * vgp); - else if(here->B4SOIbodyMod == 2) - ceqbody -= (here->B4SOIigp - gigpg * vgp); - - gbbg = -here->B4SOIgbgs; - gbbdp = -here->B4SOIgbds; - gbbb = -here->B4SOIgbbs; - gbbp = -here->B4SOIgbps; - gbbT = -model->B4SOItype * here->B4SOIgbT; -/* v3.0 */ - gbbe = -here->B4SOIgbes; - - if (here->B4SOIrbodyMod) { /* v4.0 */ - gbbdp = -Giid - Ggidld - Ggisls; - gbbb = -Giib + Gbpbs; - gjsdb = Gjsb + Gjdb; - } - - gbbsp = - ( gbbg + gbbdp + gbbb + gbbp + gbbe); - - gddpg = -here->B4SOIgjdg; - gddpdp = -here->B4SOIgjdd; - if (!here->B4SOIrbodyMod) /* v4.0 */ - gddpb = -here->B4SOIgjdb; - else - gddpb = Giib + Ggidlb + Ggislb; - gddpT = -model->B4SOItype * here->B4SOIgjdT; -/* v3.0 */ - gddpe = -here->B4SOIgjde; - gddpsp = - ( gddpg + gddpdp + gddpb + gddpe); - - gsspg = -here->B4SOIgjsg; - gsspdp = -here->B4SOIgjsd; - if (!here->B4SOIrbodyMod) - gsspb = -here->B4SOIgjsb; - else - gsspb = 0.0; - gsspT = -model->B4SOItype * here->B4SOIgjsT; -/* v3.0 */ - gsspe = 0.0; - gsspsp = - (gsspg + gsspdp + gsspb + gsspe); - - gppb = -here->B4SOIgbpbs; - gppp = -here->B4SOIgbpps; - - gTtg = here->B4SOIgtempg; - gTtb = here->B4SOIgtempb; - gTtdp = here->B4SOIgtempd; - gTtt = here->B4SOIgtempT; - -/* v3.0 */ - gTte = here->B4SOIgtempe; - gTtsp = - (gTtg + gTtb + gTtdp + gTte); - - -/* v3.0 */ - if (model->B4SOIigcMod) - { gIstotg = here->B4SOIgIgsg + here->B4SOIgIgcsg; - gIstotd = here->B4SOIgIgcsd; - gIstots = here->B4SOIgIgss + here->B4SOIgIgcss; - gIstotb = here->B4SOIgIgcsb; - Istoteq = model->B4SOItype * (here->B4SOIIgs + here->B4SOIIgcs - - gIstotg * vgs - here->B4SOIgIgcsd * vds - - here->B4SOIgIgcsb * vbs); - - gIdtotg = here->B4SOIgIgdg + here->B4SOIgIgcdg; - gIdtotd = here->B4SOIgIgdd + here->B4SOIgIgcdd; - gIdtots = here->B4SOIgIgcds; - gIdtotb = here->B4SOIgIgcdb; - Idtoteq = model->B4SOItype * (here->B4SOIIgd + here->B4SOIIgcd - - here->B4SOIgIgdg * vgd - here->B4SOIgIgcdg * vgs - - here->B4SOIgIgcdd * vds - here->B4SOIgIgcdb * vbs); - - gIgtotg = gIstotg + gIdtotg; - gIgtotd = gIstotd + gIdtotd; - gIgtots = gIstots + gIdtots; - gIgtotb = gIstotb + gIdtotb; - Igtoteq = Istoteq + Idtoteq; - } - else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; - } - - /* v3.1 added for RF */ - if (here->B4SOIrgateMod == 2) - T0 = vges - vgs; - else if (here->B4SOIrgateMod == 3) - T0 = vgms - vgs; - if (here->B4SOIrgateMod > 1) - { - gcrgd = here->B4SOIgcrgd * T0; - gcrgg = here->B4SOIgcrgg * T0; - gcrgs = here->B4SOIgcrgs * T0; - gcrgb = here->B4SOIgcrgb * T0; - - ceqgcrg = -(gcrgd * vds + gcrgg * vgs - + gcrgb * vbs); - gcrgg -= here->B4SOIgcrg; - gcrg = here->B4SOIgcrg; - } - else - ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - /* v3.1 added for RF end */ - - } /* end of soimode>=0 */ - - else - { Gm = -here->B4SOIgm; - Gmbs = -here->B4SOIgmbs; -/* v3.0 */ - Gme = -here->B4SOIgme; - - GmT = -model->B4SOItype * here->B4SOIgmT; - FwdSum = 0.0; - RevSum = -(Gm + Gmbs + Gme); /* v3.0 */ - - -/* v3.1 bug fix */ - cdreq = -model->B4SOItype * (here->B4SOIcdrain + here->B4SOIgds*vds - + Gm * vgd + Gmbs * vbd + Gme * (ves - vds)) - - GmT * delTemp; - - - ceqbs = here->B4SOIcjd; - ceqbd = here->B4SOIcjs; - csbsp = Idbdp; - cdbdp = Isbsp; - - /* Current going in is +ve */ - ceqbody = -here->B4SOIcbody; - - - ceqgate = here->B4SOIcgate; - gigg = here->B4SOIgigg; - gigb = here->B4SOIgigb; - gige = here->B4SOIgige; /* v3.0 */ - gigs = here->B4SOIgigd; - gigd = here->B4SOIgigs; - gigT = model->B4SOItype * here->B4SOIgigT; - - ceqth = here->B4SOIcth; - ceqbodcon = here->B4SOIcbodcon; - - /* v4.1 */ - gigpg = here->B4SOIgigpg; - gigpp = here->B4SOIgigpp; - ceqgate += (here->B4SOIigp - gigpg * vgp); - if(here->B4SOIbodyMod == 1) - ceqbodcon += (here->B4SOIigp - gigpg * vgp); - else if(here->B4SOIbodyMod == 2) - ceqbody -= (here->B4SOIigp - gigpg * vgp); - - gbbg = -here->B4SOIgbgs; - gbbb = -here->B4SOIgbbs; - gbbp = -here->B4SOIgbps; - gbbsp = -here->B4SOIgbds; - gbbT = -model->B4SOItype * here->B4SOIgbT; -/* v3.0 */ - gbbe = -here->B4SOIgbes; - - if (here->B4SOIrbodyMod) { /* v4.0 */ - gbbsp = -Giid - Ggidld - Ggisls; - gbbb = -Giib + Gbpbs; - gjsdb = Gjsb + Gjdb; - } - gbbdp = - ( gbbg + gbbsp + gbbb + gbbp + gbbe); - - gddpg = -here->B4SOIgjsg; - gddpsp = -here->B4SOIgjsd; - if (!here->B4SOIrbodyMod) - gddpb = -here->B4SOIgjsb; - else - gddpb = 0.0; - gddpT = -model->B4SOItype * here->B4SOIgjsT; -/* v3.0 */ - gddpe = 0.0; - gddpdp = - (gddpg + gddpsp + gddpb + gddpe); - - gsspg = -here->B4SOIgjdg; - gsspsp = -here->B4SOIgjdd; - if (!here->B4SOIrbodyMod) - gsspb = -here->B4SOIgjdb; - else - gsspb = Giib + Ggidlb + Ggislb; - gsspT = -model->B4SOItype * here->B4SOIgjdT; -/* v3.0 */ - gsspe = -here->B4SOIgjde; - gsspdp = - ( gsspg + gsspsp + gsspb + gsspe); - - gppb = -here->B4SOIgbpbs; - gppp = -here->B4SOIgbpps; - - gTtg = here->B4SOIgtempg; - gTtb = here->B4SOIgtempb; - gTtsp = here->B4SOIgtempd; - gTtt = here->B4SOIgtempT; - -/* v3.0 */ - gTte = here->B4SOIgtempe; - gTtdp = - (gTtg + gTtb + gTtsp + gTte); - -/* v3.0 */ - if (model->B4SOIigcMod) - { gIstotg = here->B4SOIgIgsg + here->B4SOIgIgcdg; - gIstotd = here->B4SOIgIgcds; - gIstots = here->B4SOIgIgss + here->B4SOIgIgcdd; - gIstotb = here->B4SOIgIgcdb; - Istoteq = model->B4SOItype * (here->B4SOIIgs + here->B4SOIIgcd - - here->B4SOIgIgsg * vgs - here->B4SOIgIgcdg * vgd - + here->B4SOIgIgcdd * vds - here->B4SOIgIgcdb * vbd); - - gIdtotg = here->B4SOIgIgdg + here->B4SOIgIgcsg; - gIdtotd = here->B4SOIgIgdd + here->B4SOIgIgcss; - gIdtots = here->B4SOIgIgcsd; - gIdtotb = here->B4SOIgIgcsb; - Idtoteq = model->B4SOItype * (here->B4SOIIgd + here->B4SOIIgcs - - (here->B4SOIgIgdg + here->B4SOIgIgcsg) * vgd - + here->B4SOIgIgcsd * vds - here->B4SOIgIgcsb * vbd); - - gIgtotg = gIstotg + gIdtotg; - gIgtotd = gIstotd + gIdtotd; - gIgtots = gIstots + gIdtots; - gIgtotb = gIstotb + gIdtotb; - Igtoteq = Istoteq + Idtoteq; - - } - else - { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; - gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; - - gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; - } - - /* v3.1 added for RF */ - if (here->B4SOIrgateMod == 2) - T0 = vges - vgs; - else if (here->B4SOIrgateMod == 3) - T0 = vgms - vgs; - if (here->B4SOIrgateMod > 1) - { - gcrgd = here->B4SOIgcrgs * T0; - gcrgg = here->B4SOIgcrgg * T0; - gcrgs = here->B4SOIgcrgd * T0; - gcrgb = here->B4SOIgcrgb * T0; - ceqgcrg = -(gcrgg * vgd - gcrgs * vds - + gcrgb * vbd); - gcrgg -= here->B4SOIgcrg; - gcrg = here->B4SOIgcrg; - } - else - ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; - /* v3.1 added for RF end */ - - } /* end of soimod<0 */ - - - if (model->B4SOIrdsMod == 1) - { ceqgstot = model->B4SOItype * (here->B4SOIgstotd * vds - + here->B4SOIgstotg * vgs + here->B4SOIgstotb * vbs); - /* ceqgstot flowing away from sNodePrime */ - gstot = here->B4SOIgstot; - gstotd = here->B4SOIgstotd; - gstotg = here->B4SOIgstotg; - gstots = here->B4SOIgstots - gstot; - gstotb = here->B4SOIgstotb; - - ceqgdtot = -model->B4SOItype * (here->B4SOIgdtotd * vds - + here->B4SOIgdtotg * vgs + here->B4SOIgdtotb * vbs); - /* ceqgdtot defined as flowing into dNodePrime */ - gdtot = here->B4SOIgdtot; - gdtotd = here->B4SOIgdtotd - gdtot; - gdtotg = here->B4SOIgdtotg; - gdtots = here->B4SOIgdtots; - gdtotb = here->B4SOIgdtotb; - } - else - { gstot = gstotd = gstotg = gstots - = gstotb = ceqgstot = 0.0; - gdtot = gdtotd = gdtotg = gdtots - = gdtotb = ceqgdtot = 0.0; - } - - if (model->B4SOItype > 0) - { - ceqqg = ceqqg; - ceqqb = ceqqb; - ceqqe = ceqqe; - ceqqd = ceqqd; - } - else - { - ceqbodcon = -ceqbodcon; - ceqbody = -ceqbody; - ceqgate = -ceqgate; - ceqbs = -ceqbs; - ceqbd = -ceqbd; - ceqqg = -ceqqg; - ceqqb = -ceqqb; - ceqqd = -ceqqd; - ceqqe = -ceqqe; - cdbdp = - cdbdp; /* v4.0 */ - csbsp = - csbsp; /* v4.0 */ - - - ceqgcrg = -ceqgcrg; /* v3.1 */ - if (here->B4SOIrgateMod == 3) - ceqqgmid = -ceqqgmid; - - if (here->B4SOIrbodyMod) /* v4.0 */ - { ceqqjs = -ceqqjs; - ceqqjd = -ceqqjd; - } - - } - - m = here->B4SOIm; - -/* v3.1 */ - - /* v3.1 added ceqgcrg for RF */ - (*(ckt->CKTrhs + here->B4SOIgNode) -= m * ((ceqgate + ceqqg) - + Igtoteq - ceqgcrg)); - /* v3.1 added ceqgcrg for RF end */ - - (*(ckt->CKTrhs + here->B4SOIdNodePrime) += m * ((ceqbd - cdreq - - ceqqd) + Idtoteq - /* v4.0 */ + ceqgdtot)); - if (!here->B4SOIrbodyMod) { - (*(ckt->CKTrhs + here->B4SOIsNodePrime) += m * ((cdreq + ceqbs - + ceqqg + ceqqb + ceqqd + ceqqe) + Istoteq - + ceqqgmid - ceqgstot)); /* v4.0 */ - } - else { /* v4.0 */ - (*(ckt->CKTrhs + here->B4SOIsNodePrime) += m * ((cdreq + ceqbs - + ceqqg + ceqqb + ceqqd + ceqqe) + Istoteq - + ceqqgmid + ceqqjd + ceqqjs - ceqgstot)); - } - - (*(ckt->CKTrhs + here->B4SOIeNode) -= m * ceqqe); - - if (here->B4SOIrgateMod == 2) - (*(ckt->CKTrhs + here->B4SOIgNodeExt) -= m * ceqgcrg); - else if (here->B4SOIrgateMod == 3) - (*(ckt->CKTrhs + here->B4SOIgNodeMid) -= m * (ceqqgmid - + ceqgcrg)); - - if (here->B4SOIbodyMod == 1) { - (*(ckt->CKTrhs + here->B4SOIpNode) += m * ceqbodcon); - } - - if ( here->B4SOIsoiMod != 2 ) - {if (!here->B4SOIrbodyMod) - (*(ckt->CKTrhs + here->B4SOIbNode) -= m * (ceqbody + ceqqb)); - else /* v4.0 */ - { (*(ckt->CKTrhs + here->B4SOIdbNode) -= m * (cdbdp + ceqqjd)); - (*(ckt->CKTrhs + here->B4SOIbNode) -= m * (ceqbody + ceqqb)); - (*(ckt->CKTrhs + here->B4SOIsbNode) -= m * (csbsp + ceqqjs)); - } - } - - if (selfheat) { - (*(ckt->CKTrhs + here->B4SOItempNode) -= m * (ceqth + ceqqth)); - } - - if (model->B4SOIrdsMod) - { (*(ckt->CKTrhs + here->B4SOIdNode) -= m * ceqgdtot); - (*(ckt->CKTrhs + here->B4SOIsNode) += m * ceqgstot); - } - - if (here->B4SOIdebugMod != 0) - { - *(ckt->CKTrhs + here->B4SOIvbsNode) = here->B4SOIvbseff; - *(ckt->CKTrhs + here->B4SOIidsNode) = FLOG(here->B4SOIids); - *(ckt->CKTrhs + here->B4SOIicNode) = FLOG(here->B4SOIic); - *(ckt->CKTrhs + here->B4SOIibsNode) = FLOG(here->B4SOIibs); - *(ckt->CKTrhs + here->B4SOIibdNode) = FLOG(here->B4SOIibd); - *(ckt->CKTrhs + here->B4SOIiiiNode) = FLOG(here->B4SOIiii); - *(ckt->CKTrhs + here->B4SOIigNode) = here->B4SOIig; - *(ckt->CKTrhs + here->B4SOIgiggNode) = here->B4SOIgigg; - *(ckt->CKTrhs + here->B4SOIgigdNode) = here->B4SOIgigd; - *(ckt->CKTrhs + here->B4SOIgigbNode) = here->B4SOIgigb; - *(ckt->CKTrhs + here->B4SOIigidlNode) = here->B4SOIigidl; - *(ckt->CKTrhs + here->B4SOIitunNode) = here->B4SOIitun; - *(ckt->CKTrhs + here->B4SOIibpNode) = here->B4SOIibp; - *(ckt->CKTrhs + here->B4SOIcbbNode) = here->B4SOIcbb; - *(ckt->CKTrhs + here->B4SOIcbdNode) = here->B4SOIcbd; - *(ckt->CKTrhs + here->B4SOIcbgNode) = here->B4SOIcbg; - *(ckt->CKTrhs + here->B4SOIqbfNode) = here->B4SOIqbf; - *(ckt->CKTrhs + here->B4SOIqjsNode) = here->B4SOIqjs; - *(ckt->CKTrhs + here->B4SOIqjdNode) = here->B4SOIqjd; - - } - - if (!model->B4SOIrdsMod) - { gdpr = here->B4SOIdrainConductance; - gspr = here->B4SOIsourceConductance; - } - else - gdpr = gspr = 0.0; /* v4.0 */ - - /* - * load y matrix - */ - Gmin = ckt->CKTgmin * 1e-6; - - /* v3.1 added for RF */ - geltd = here->B4SOIgrgeltd; - if (here->B4SOIrgateMod == 1) - { - *(here->B4SOIGEgePtr) += m * geltd; - *(here->B4SOIGgePtr) -= m * geltd; - *(here->B4SOIGEgPtr) -= m * geltd; - } - else if (here->B4SOIrgateMod == 2) - { - *(here->B4SOIGEgePtr) += m * gcrg; - *(here->B4SOIGEgPtr) += m * gcrgg; - *(here->B4SOIGEdpPtr) += m * gcrgd; - *(here->B4SOIGEspPtr) += m * gcrgs; - *(here->B4SOIGgePtr) -= m * gcrg; - if (here->B4SOIsoiMod !=2) /* v3.2 */ - *(here->B4SOIGEbPtr) += m * gcrgb; - } - else if (here->B4SOIrgateMod == 3) - { - *(here->B4SOIGEgePtr) += m * geltd; - *(here->B4SOIGEgmPtr) -= m * geltd; - *(here->B4SOIGMgePtr) -= m * geltd; - *(here->B4SOIGMgmPtr) += m * (geltd + gcrg + gcgmgmb); - - *(here->B4SOIGMdpPtr) += m * (gcrgd + gcgmdb); - *(here->B4SOIGMgPtr) += m * gcrgg; - *(here->B4SOIGMspPtr) += m * (gcrgs + gcgmsb); - *(here->B4SOIGMePtr) += m * gcgmeb; - if (here->B4SOIsoiMod !=2) /* v3.2 */ - *(here->B4SOIGMbPtr) += m * gcrgb; - - *(here->B4SOIDPgmPtr) += m * gcdgmb; - *(here->B4SOIGgmPtr) -= m * gcrg; - *(here->B4SOISPgmPtr) += m * gcsgmb; - *(here->B4SOIEgmPtr) += m * gcegmb; - } - /* v3.1 added for RF end*/ - - -/* v3.0 */ - if (here->B4SOIsoiMod != 0) /* v3.2 */ - { - (*(here->B4SOIDPePtr) += m * (Gme + gddpe)); - (*(here->B4SOISPePtr) += m * (gsspe - Gme)); - - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - *(here->B4SOIGePtr) += m * gige; - *(here->B4SOIBePtr) -= m * gige; - } - } - - *(here->B4SOIEdpPtr) += m * gcedb; - *(here->B4SOIEspPtr) += m * gcesb; - *(here->B4SOIDPePtr) += m * gcdeb; - *(here->B4SOISPePtr) += m * gcseb; - *(here->B4SOIEgPtr) += m * gcegb; - *(here->B4SOIGePtr) += m * gcgeb; - -/* v3.1 */ - if (here->B4SOIsoiMod != 2) /* v3.2 */ - { - (*(here->B4SOIEbPtr) -= m * (gcegb + gcedb + gcesb + gceeb + gcegmb)); /* 3.2 bug fix */ + T3 = T2 * T2; + /* T4 is dVgsteff_dVbseff */ + T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; + dVgsteff_dVb = T4 * dVbseff_dVb; + dVgsteff_dVe = T4 * dVbseff_dVe; + dVgsteff_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) + / T3 * dVgs_eff_dVg + + T4 * dVbseff_dVg; - /* v3.1 changed GbPtr for RF */ - if ((here->B4SOIrgateMod == 0) || (here->B4SOIrgateMod == 1)) - (*(here->B4SOIGbPtr) -= m * (-gigb + gcggb + gcgdb + gcgsb - + gcgeb - gIgtotb)); - else /* v3.1 for rgateMod = 2 or 3 */ - *(here->B4SOIGbPtr) += m * (gigb + gcgbb +gIgtotb - gcrgb); + dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) + / T3+ T4 * dVbseff_dVd; + if (selfheat) + dVgsteff_dT = (T2 * dT1_dT - T1 * dT2_dT) + / T3+ T4 * dVbseff_dT; + else + dVgsteff_dT = 0.0; + } - (*(here->B4SOIDPbPtr) -= m * (-gddpb - Gmbs - gcdbb + gdtotb - + gIdtotb)); /* v4.0 */ -/* (*(here->B4SOIDPbPtr) -= (-gddpb - Gmbs + gcdgb + gcddb - + gcdeb + gcdsb) + gcdgmb - + gIdtotb ); -*/ + if (here->B4SOIagbcp2 > 0) + { + VgstNVt2 = pParam->B4SOImstarcv * (Vgst - pParam->B4SOIdelvt - 1.12) / T10; + ExpArg2 = (pParam->B4SOIvoffcv - + (1- pParam->B4SOImstarcv) * (Vgst - pParam->B4SOIdelvt - 1.12))/ T10; + + /* MCJ: Very small Vgst */ + if (VgstNVt2 > EXPL_THRESHOLD) + { Vgsteff2 = Vgst - pParam->B4SOIdelvt - 1.12; + /* T0 is dVgsteff2_dVbseff */ + T0 = -dVth_dVb; + dVgsteff2_dVg = dVgs_eff_dVg + T0 * dVbseff_dVg; + dVgsteff2_dVd = -dVth_dVd + T0 * dVbseff_dVd; + dVgsteff2_dVb = T0 * dVbseff_dVb; + dVgsteff2_dVe = T0 * dVbseff_dVe; + if (selfheat) + dVgsteff2_dT = -dVth_dT + T0 * dVbseff_dT; + else + dVgsteff2_dT = 0.0; + } + else if (ExpArg2 > EXPL_THRESHOLD) + { T0 = (Vgst - pParam->B4SOIdelvt - pParam->B4SOIvoffcv - 1.12) / (noff * Vtm); + ExpVgst2 = exp(T0); + /*Vgsteff2 = Vtm * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst*/ + Vgsteff2 = Vtm * cdep0 / model->B4SOIcox * ExpVgst2; /*v4.2 bug fix */ + T3 = Vgsteff2 / (noff * Vtm) ; + /* T1 is dVgsteff2_dVbseff */ + T1 = -T3 * (dVth_dVb + T0 * Vtm * dnoff_dVb); + dVgsteff2_dVg = T3 * dVgs_eff_dVg+ T1 * dVbseff_dVg; + dVgsteff2_dVd = -T3 * (dVth_dVd + T0 * Vtm * dnoff_dVd)+ T1 * dVbseff_dVd; + dVgsteff2_dVe = T1 * dVbseff_dVe; + dVgsteff2_dVb = T1 * dVbseff_dVb; + if (selfheat) + dVgsteff2_dT = -T3 * (dVth_dT + T0 * dVtm_dT * noff) + + Vgsteff2 / Temp+ T1 * dVbseff_dT; + else + dVgsteff2_dT = 0.0; + } + else + { ExpVgst2 = exp(VgstNVt2); + T1 = T10 * log(1.0 + ExpVgst2); + dT1_dVg = ExpVgst2 / (1.0 + ExpVgst2) * pParam->B4SOImstarcv; + dT1_dVb = -dT1_dVg * (dVth_dVb + (Vgst - pParam->B4SOIdelvt - 1.12) / noff * dnoff_dVb) + + T1 / noff * dnoff_dVb; + dT1_dVd = -dT1_dVg * (dVth_dVd + (Vgst - pParam->B4SOIdelvt - 1.12) / noff * dnoff_dVd) + + T1 / noff * dnoff_dVd; + T3 = (1.0 / Temp); + if (selfheat) + dT1_dT = -dT1_dVg * (dVth_dT + (Vgst - pParam->B4SOIdelvt - 1.12) * T3) + T1 * T3; + else + dT1_dT = 0.0; + + /* dT2_dVg = -model->B4SOIcox / (Vtm * pParam->B4SOIcdep0) + * exp(ExpArg2) * (1 - pParam->B4SOImstarcv);*/ + dT2_dVg = -model->B4SOIcox / (Vtm * cdep0) + * exp(ExpArg2) * (1 - pParam->B4SOImstarcv); /*v4.2 bug fix */ + T2 = pParam->B4SOImstarcv - T10 * dT2_dVg + / (1.0 - pParam->B4SOImstarcv); + dT2_dVd = -dT2_dVg * (dVth_dVd - Vtm * ExpArg2 * dnoff_dVd + / (1.0 - pParam->B4SOImstarcv)) + + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVd; + dT2_dVb = -dT2_dVg * (dVth_dVb - Vtm * ExpArg2 * dnoff_dVb + / (1.0 - pParam->B4SOImstarcv)) + + (T2 - pParam->B4SOImstarcv) / noff * dnoff_dVb; + if (selfheat) + dT2_dT = -dT2_dVg * ( dVth_dT - ExpArg2 * T10 * T3 + / (1.0 - pParam->B4SOImstarcv) ); + else + dT2_dT = 0.0; + + Vgsteff2 = T1 / T2; + T3 = T2 * T2; + /* T4 is dVgsteff2_dVbseff */ + T4 = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; + dVgsteff2_dVb = T4 * dVbseff_dVb; + dVgsteff2_dVe = T4 * dVbseff_dVe; + dVgsteff2_dVg = (T2 * dT1_dVg - T1 * dT2_dVg) + / T3 * dVgs_eff_dVg + + T4 * dVbseff_dVg; + dVgsteff2_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) + / T3+ T4 * dVbseff_dVd; + if (selfheat) + dVgsteff2_dT = (T2 * dT1_dT - T1 * dT2_dT) + / T3+ T4 * dVbseff_dT; + else + dVgsteff2_dT = 0.0; + } + } + } + /* v3.2 */ + /* v3.2 */ - (*(here->B4SOISPbPtr) -= m * (-gsspb + Gmbs - gcsbb + gstotb - + Gmin + gIstotb)); /* v4.0 */ -/* (*(here->B4SOISPbPtr) -= (-gsspb + Gmbs + gcsgb + gcsdb - + gcseb + gcssb) + gcsgmb - + Gmin + gIstotb); -*/ - (*(here->B4SOIBePtr) += m * (gbbe + gcbeb)); /* v3.0 */ - (*(here->B4SOIBgPtr) += m * (-gigg + gcbgb + gbbg)); - (*(here->B4SOIBdpPtr) += m * (-gigd + gcbdb + gbbdp)); + if (model->B4SOIcapMod == 2) + { - (*(here->B4SOIBspPtr) += m * (gcbsb + gbbsp - Gmin - - gigs)); -/* if (!here->B4SOIrbodyMod) -*/ - (*(here->B4SOIBbPtr) += m * (-gigb + gbbb - gcbgb - gcbdb - - gcbsb - gcbeb + Gmin)) ; -/* else - (*(here->B4SOIBbPtr) += -gigb - (Giib - Gbpbs) - gcbgb - - gcbdb - gcbsb - gcbeb + Gmin) ; -*/ - /* v4.0 */ - if (here->B4SOIrbodyMod) { - (*(here->B4SOIDPdbPtr) += m * (-gcjdbdp - GGjdb)); - (*(here->B4SOISPsbPtr) += m * (-gcjsbsp - GGjsb)); - (*(here->B4SOIDBdpPtr) += m * (-gcjdbdp - GGjdb)); - (*(here->B4SOIDBdbPtr) += m * (gcjdbdp + GGjdb - + here->B4SOIgrbdb)); - (*(here->B4SOIDBbPtr) -= m * here->B4SOIgrbdb); - (*(here->B4SOISBspPtr) += m * (-gcjsbsp - GGjsb)); - (*(here->B4SOISBbPtr) -= m * here->B4SOIgrbsb); - (*(here->B4SOISBsbPtr) += m * (gcjsbsp + GGjsb - + here->B4SOIgrbsb)); - (*(here->B4SOIBdbPtr) -= m * here->B4SOIgrbdb); - (*(here->B4SOIBsbPtr) -= m * here->B4SOIgrbsb); - (*(here->B4SOIBbPtr) += m * (here->B4SOIgrbsb - + here->B4SOIgrbdb)); - } - if (model->B4SOIrdsMod) - { - (*(here->B4SOIDbPtr) += m * gdtotb); - (*(here->B4SOISbPtr) += m * gstotb); - } - - } -/* v3.1 */ - if (model->B4SOIrdsMod) - { (*(here->B4SOIDgPtr) += m * gdtotg); - (*(here->B4SOIDspPtr) += m * gdtots); - (*(here->B4SOISdpPtr) += m * gstotd); - (*(here->B4SOISgPtr) += m * gstotg); - } - - (*(here->B4SOIEePtr) += m * gceeb); - - if (here->B4SOIrgateMod == 0) - { - (*(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin - + gIgtotg)); - (*(here->B4SOIGdpPtr) += m * (gigd + gcgdb - Gmin - + gIgtotd)); - (*(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots)); - } - else if (here->B4SOIrgateMod == 1) /* v3.1 for RF */ - { - *(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin - + gIgtotg + geltd); - *(here->B4SOIGdpPtr) += m * (gigd + gcgdb - Gmin - + gIgtotd); - *(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots); - } - else /* v3.1 for RF rgateMod == 2 or 3 */ - { - *(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin - + gIgtotg - gcrgg); - *(here->B4SOIGdpPtr) += m * (gigd + gcgdb - Gmin - + gIgtotd - gcrgd); - *(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots - gcrgs); - } - - - (*(here->B4SOIDPgPtr) += m * ((Gm + gcdgb) + gddpg - Gmin - - gIdtotg - gdtotg)); /* v4.0 */ - (*(here->B4SOIDPdpPtr) += m * ((gdpr + here->B4SOIgds + gddpdp - + RevSum + gcddb) + Gmin - - gIdtotd - gdtotd)); /* v4.0 */ - (*(here->B4SOIDPspPtr) -= m * ((-gddpsp + here->B4SOIgds + FwdSum - - gcdsb) + gIdtots + gdtots)); - - (*(here->B4SOIDPdPtr) -= m * (gdpr + gdtot)); - - (*(here->B4SOISPgPtr) += m * (gcsgb - Gm + gsspg - gIstotg - - gstotg)); /* v4.0 */ - (*(here->B4SOISPdpPtr) -= m * ((here->B4SOIgds - gsspdp + RevSum - - gcsdb + gIstotd) + gstotd)); /* v4.0 */ - - (*(here->B4SOISPspPtr) += m * ((gspr - gstots - + here->B4SOIgds + gsspsp - + FwdSum + gcssb) - + Gmin - gIstots)); /* v4.0 */ - - (*(here->B4SOISPsPtr) -= m * (gspr + gstot)); - - - (*(here->B4SOIDdPtr) += m * (gdpr + gdtot)); - (*(here->B4SOIDdpPtr) -= m * (gdpr - gdtotd)); - - - (*(here->B4SOISsPtr) += m * (gspr + gstot)); - (*(here->B4SOISspPtr) -= m * (gspr - gstots)); - - - if (here->B4SOIbodyMod == 1) { - (*(here->B4SOIBpPtr) -= m * gppp); - (*(here->B4SOIPbPtr) += m * gppb); - (*(here->B4SOIPpPtr) += m * gppp); - } - - /* v4.1 Ig_agbcp2 stamping */ - (*(here->B4SOIGgPtr) += gigpg); - if (here->B4SOIbodyMod == 1) { - (*(here->B4SOIPpPtr) -= m * gigpp); - (*(here->B4SOIPgPtr) -= m * gigpg); - (*(here->B4SOIGpPtr) += m * gigpp); - } - else if(here->B4SOIbodyMod == 2) - { - (*(here->B4SOIBbPtr) -= m * gigpp); - (*(here->B4SOIBgPtr) -= m * gigpg); - (*(here->B4SOIGbPtr) += m * gigpp); - } - - - if (selfheat) - { - (*(here->B4SOIDPtempPtr) += m * (GmT + gddpT + gcdT)); - (*(here->B4SOISPtempPtr) += m * (-GmT + gsspT + gcsT)); - (*(here->B4SOIBtempPtr) += m * (gbbT + gcbT - gigT)); - (*(here->B4SOIEtempPtr) += m * gceT); - (*(here->B4SOIGtempPtr) += m * (gcgT + gigT)); - (*(here->B4SOITemptempPtr) += m * (gTtt + 1/pParam->B4SOIrth + gcTt)); - (*(here->B4SOITempgPtr) += m * gTtg); - (*(here->B4SOITempbPtr) += m * gTtb); - (*(here->B4SOITempdpPtr) += m * gTtdp); - (*(here->B4SOITempspPtr) += m * gTtsp); - -/* v3.0 */ - if (here->B4SOIsoiMod != 0) /* v3.2 */ - (*(here->B4SOITempePtr) += m * gTte); - - } - - if (here->B4SOIdebugMod != 0) - { - *(here->B4SOIVbsPtr) += 1; - *(here->B4SOIIdsPtr) += 1; - *(here->B4SOIIcPtr) += 1; - *(here->B4SOIIbsPtr) += 1; - *(here->B4SOIIbdPtr) += 1; - *(here->B4SOIIiiPtr) += 1; - *(here->B4SOIIgPtr) += 1; - *(here->B4SOIGiggPtr) += 1; - *(here->B4SOIGigdPtr) += 1; - *(here->B4SOIGigbPtr) += 1; - *(here->B4SOIIgidlPtr) += 1; - *(here->B4SOIItunPtr) += 1; - *(here->B4SOIIbpPtr) += 1; - *(here->B4SOICbgPtr) += 1; - *(here->B4SOICbbPtr) += 1; - *(here->B4SOICbdPtr) += 1; - *(here->B4SOIQbfPtr) += 1; - *(here->B4SOIQjsPtr) += 1; - *(here->B4SOIQjdPtr) += 1; - } - - line1000: ; - - - } /* End of Mosfet Instance */ -} /* End of Model Instance */ - - -return(OK); + /* v3.1 */ + if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ + { + Qac0 = dQac0_dVrg = dQac0_dVd = dQac0_dVb = dQac0_dT = 0.0; + dQac02_dVrg = dQac02_dVd = dQac02_dVb = dQac02_dT = 0.0; + Qsub0 = dQsub0_dVrg = dQsub0_dVg = dQsub0_dVd = dQsub0_dVb = dQsub0_dT = 0.0; + dQsub02_dVrg = dQsub02_dVg = dQsub02_dVd = dQsub02_dVb = dQsub02_dT = 0.0; + } + else /* soiMod = 0 or 1 */ + { + Vfb = Vth - phi - pParam->B4SOIk1eff * sqrtPhis + pParam->B4SOIdelvt; + dVfb_dVb = dVth_dVb - pParam->B4SOIk1eff * dsqrtPhis_dVb; + dVfb_dVd = dVth_dVd; + dVfb_dT = dVth_dT; + + V3 = Vfb - Vgs_eff + Vbseff - DELTA_3_SOI; + if (Vfb <= 0.0) + { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3_SOI * Vfb); + T2 = -DELTA_3_SOI / T0; + } + else + { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3_SOI * Vfb); + T2 = DELTA_3_SOI / T0; + } + + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff = Vfb - 0.5 * (V3 + T0); + dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; + dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1; + dVfbeff_dVrg = T1 * dVgs_eff_dVg; + if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfb_dT; + else dVfbeff_dT = 0.0; + + Qac0 = CoxWLb * (Vfbeff - Vfb); + dQac0_dVrg = CoxWLb * dVfbeff_dVrg; + dQac0_dVd = CoxWLb * (dVfbeff_dVd - dVfb_dVd); + dQac0_dVb = CoxWLb * (dVfbeff_dVb - dVfb_dVb); + if (selfheat) dQac0_dT = CoxWLb * (dVfbeff_dT - dVfb_dT); + else dQac0_dT = 0.0; + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' Jun 09 */ + ( here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) + { + Vfb2 = Vfb + 1.12; + dVfb2_dVb = dVfb_dVb; + dVfb2_dVd = dVfb_dVd; + dVfb2_dT = dVfb_dT; + DELTA_3_SOI2 = DELTA_3_SOI; + V3 = Vfb2 - Vgs_eff2 + Vbseff - DELTA_3_SOI2; + if (Vfb2 <= 0.0) + { T0 = sqrt(V3 * V3 - 100.0 * DELTA_3_SOI2 * Vfb2); + T2 = -25.0 * DELTA_3_SOI2 / T0; + } + else + { T0 = sqrt(V3 * V3 + 100.0 * DELTA_3_SOI2 * Vfb2); + T2 = 25.0 * DELTA_3_SOI2 / T0; + } + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff2 = Vfb2 - 0.5 * (V3 + T0); + dVfbeff2_dVd = (1.0 - T1 - T2) * dVfb2_dVd; /* Samuel Mertens */ + dVfbeff2_dVb = (1.0 - T1 - T2) * dVfb2_dVb - T1; /* Samuel Mertens */ + dVfbeff2_dVrg = T1 * dVgs_eff2_dVg; + if (selfheat) dVfbeff2_dT = (1.0 - T1 - T2) * dVfb2_dT; + else dVfbeff2_dT = 0.0; + + Qac0 += CoxWLb2 * (Vfbeff2 - Vfb2); + dQac02_dVrg = CoxWLb2 * dVfbeff2_dVrg; + dQac02_dVd = CoxWLb2 * (dVfbeff2_dVd - dVfb2_dVd); + dQac02_dVb = CoxWLb2 * (dVfbeff2_dVb - dVfb2_dVb); + if (selfheat) + dQac02_dT = CoxWLb2 * (dVfbeff2_dT - dVfb2_dT); + else dQac02_dT = 0.0; + } + /* end v4.1 */ + T0 = 0.5 * pParam->B4SOIk1ox; + T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; + if (pParam->B4SOIk1ox == 0.0) + { T1 = 0.0; + T2 = 0.0; + } + else if (T3 < 0.0) + { T1 = T0 + T3 / pParam->B4SOIk1ox; + T2 = CoxWLb; + } + else + { T1 = sqrt(T0 * T0 + T3); + T2 = CoxWLb * T0 / T1; + } + + Qsub0 = CoxWLb * pParam->B4SOIk1ox * (T1 - T0); /* 4.1 bug fix */ + dQsub0_dVrg = T2 * (dVgs_eff_dVg - dVfbeff_dVrg); + dQsub0_dVg = -T2; + dQsub0_dVd = -T2 * dVfbeff_dVd; + dQsub0_dVb = -T2 * (dVfbeff_dVb + 1); + if (selfheat) dQsub0_dT = -T2 * dVfbeff_dT; + else dQsub0_dT = 0.0; + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) + { T3 = Vgs_eff2- Vfbeff2 - Vbseff - Vgsteff2; + if (T3 < 0.0) + { T1 = T0 + T3 / pParam->B4SOIk1ox; + T2 = CoxWLb2; + } + else + { T1 = sqrt(T0 * T0 + T3); + T2 = CoxWLb2 * T0 / T1; + } + Qsub0 += CoxWLb2 * pParam->B4SOIk1ox * (T1 - T0); + dQsub02_dVrg = T2 * (dVgs_eff2_dVg - dVfbeff2_dVrg); + dQsub02_dVg = -T2; + dQsub02_dVd = -T2 * dVfbeff2_dVd; + dQsub02_dVb = -T2 * (dVfbeff2_dVb + 1); + if (selfheat) dQsub02_dT = -T2 * dVfbeff2_dT; + else dQsub02_dT = 0.0; + } + } + /* v3.1 */ + + + + AbulkCV = Abulk0 * pParam->B4SOIabulkCVfactor; + dAbulkCV_dVb = pParam->B4SOIabulkCVfactor * dAbulk0_dVb; + + VdsatCV = Vgsteff / AbulkCV; + dVdsatCV_dVg = 1.0 / AbulkCV; + dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; + + V4 = VdsatCV - Vds - DELTA_4; + T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); + VdseffCV = VdsatCV - 0.5 * (V4 + T0); + T1 = 0.5 * (1.0 + V4 / T0); + T2 = DELTA_4 / T0; + T3 = (1.0 - T1 - T2) / AbulkCV; + dVdseffCV_dVg = T3; + dVdseffCV_dVd = T1; + dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; + + /* v4.1 */ + if (here->B4SOIagbcp2 > 0) + { VdsatCV2 = Vgsteff2 / AbulkCV; + dVdsatCV2_dVg = 1.0 / AbulkCV; + dVdsatCV2_dVb = -VdsatCV2 * dAbulkCV_dVb / AbulkCV; + V4 = VdsatCV2 - Vds - DELTA_4; + T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV2); + VdseffCV2 = VdsatCV2 - 0.5 * (V4 + T0); + T1 = 0.5 * (1.0 + V4 / T0); + T2 = DELTA_4 / T0; + T3 = (1.0 - T1 - T2) / AbulkCV; + dVdseffCV2_dVg = T3; + dVdseffCV2_dVd = T1; + dVdseffCV2_dVb = -T3 * VdsatCV2 * dAbulkCV_dVb; + } + /* end v4.1 */ + + /* v3.1 */ + if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ + { + qbulk = Cbg1 = Cbd1 = Cbb1 = 0; + Cbg12 = Cbd12 = Cbb12 = 0; /* v4.1 */ + } + else + { + T0 = AbulkCV * VdseffCV; + T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); + T2 = VdseffCV / T1; + T3 = T0 * T2; + T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); + T5 = (6.0 * T0 * (4.0 * Vgsteff- T0) / (T1 * T1) - 0.5); + T6 = 12.0 * T2 * T2 * Vgsteff; + + T7 = 1.0 - AbulkCV; + qbulk = CoxWLb * T7 * (0.5 * VdseffCV - T3); + T4 = -T7 * (T4 - 1.0); + T5 = -T7 * T5; + T6 = -(T7 * T6 + (0.5 * VdseffCV - T3)); + + Cbg1 = CoxWLb * (T4 + T5 * dVdseffCV_dVg); + Cbd1 = CoxWLb * T5 * dVdseffCV_dVd ; + Cbb1 = CoxWLb * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) + { T0 = AbulkCV * VdseffCV2; + T1 = 12.0 * (Vgsteff2 - 0.5 * T0 + 1e-20); + T2 = VdseffCV2 / T1; + T3 = T0 * T2; + T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); + T5 = (6.0 * T0 * (4.0 * Vgsteff2 - T0) / (T1 * T1) - 0.5); + T6 = 12.0 * T2 * T2 * Vgsteff2; + T7 = 1.0 - AbulkCV; + qbulk += CoxWLb2 * T7 * (0.5 * VdseffCV2 - T3); + T4 = -T7 * (T4 - 1.0); + T5 = -T7 * T5; + T6 = -(T7 * T6 + (0.5 * VdseffCV2 - T3)); + Cbg12 = CoxWLb2 * (T4 + T5 * dVdseffCV2_dVg); + Cbd12 = CoxWLb2 * T5 * dVdseffCV2_dVd ; + Cbb12 = CoxWLb2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb); + } + /* end v4.1 */ + } + /* v3.1 */ + + + + /* Total inversion charge */ + T0 = AbulkCV * VdseffCV; + T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); + /* T2 = VdseffCV / T1; + */ + T2 = T0 / T1; + T3 = T0 * T2; + + /* T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV); + T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5); + T6 = 12.0 * T2 * T2 * Vgsteff; + */ + T4 = (1.0 - 12.0 * T2 * T2);/*bug fix */ + T7 = T2 * (2.0 + 6.0 * T2) - 0.5; /*bug fix */ + + T5 = T7 * AbulkCV; + T6 = T7 * VdseffCV; + + /* qinv = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3); + */ + qinv = CoxWL * (Vgsteff - 0.5 * T0 + T3); + + here->B4SOIqinv = -qinv; /* for noise v3.2 */ + + Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Cgd1 = CoxWL * T5 * dVdseffCV_dVd; + Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) + { + T02 = AbulkCV * VdseffCV2; + T12 = 12.0 * (Vgsteff2 - 0.5 * T02 + 1e-20); + T2 = T02 / T12; + T3 = T02 * T2; + T4 = (1.0 - 12.0 * T2 * T2); + T7 = T2 * (2.0 + 6.0 * T2) - 0.5; + + T5 = T7 * AbulkCV; + T6 = T7 * VdseffCV2; + + qinv += CoxWL2 * (Vgsteff2 - 0.5 * T02 + T3); + here->B4SOIqinv = -qinv; + + Cgg12 = CoxWL2 * (T4 + T5 * dVdseffCV2_dVg); + Cgd12 = CoxWL2 * T5 * dVdseffCV2_dVd; + Cgb12 = CoxWL2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb); + } + /* end v4.1 */ + /* Inversion charge partitioning into S / D */ + if (model->B4SOIxpart > 0.5) + { /* 0/100 Charge partition model */ + T1 = T1 + T1; + qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0 + - T0 * T0 / T1); + T7 = (4.0 * Vgsteff - T0) / (T1 * T1); + T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1)); + T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7); + T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7); + Csg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg); + Csd1 = CoxWL * T5 * dVdseffCV_dVd; + Csb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb); + + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) + { + T12 = T12 + T12; + qsrc += -CoxWL2 * (0.5 * Vgsteff2 + 0.25 * T02 + - T02 * T02 / T12); + T7 = (4.0 * Vgsteff2 - T02) / (T12 * T12); + T4 = -(0.5 + 24.0 * T02 * T02 / (T12 * T12)); + T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T02 * T7); + T6 = -(0.25 * VdseffCV2 - 12.0 * T02 * VdseffCV2 * T7); + Csg12 = CoxWL2 * (T4 + T5 * dVdseffCV2_dVg); + Csd12 = CoxWL2 * T5 * dVdseffCV2_dVd; + Csb12 = CoxWL2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb); + } + /* end v4.1 */ + + } + else if (model->B4SOIxpart < 0.5) + { /* 40/60 Charge partition model */ + T1 = T1 / 12.0; + T2 = 0.5 * CoxWL / (T1 * T1); + T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff + * (Vgsteff - 4.0 * T0 / 3.0)) + - 2.0 * T0 * T0 * T0 / 15.0; + qsrc = -T2 * T3; + T7 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0) + + 0.4 * T0 * T0; + T4 = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0 + * Vgsteff - 8.0 * T0 / 3.0) + + 2.0 * T0 * T0 / 3.0); + T5 = (qsrc / T1 + T2 * T7) * AbulkCV; + T6 = (qsrc / T1 * VdseffCV + T2 * T7 * VdseffCV); + Csg1 = T4 + T5 * dVdseffCV_dVg; + Csd1 = T5 * dVdseffCV_dVd; + Csb1 = T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb; + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 >0) + { + T12 = T12 /12.0; + T2 = 0.5 * CoxWL2 / (T12 * T12); + T3 = Vgsteff2 * (2.0 * T02 * T02 / 3.0 + Vgsteff2 + * (Vgsteff2 - 4.0 * T02 / 3.0)) + - 2.0 * T02 * T02 * T02 / 15.0; + qsrc2 = -T2 * T3; + + T7 = 4.0 / 3.0 * Vgsteff2 * (Vgsteff2 - T02) + + 0.4 * T02 * T02; + T4 = -2.0 * qsrc2 / T12 - T2 * (Vgsteff2 * (3.0 + * Vgsteff2 - 8.0 * T02 / 3.0) + + 2.0 * T02 * T02 / 3.0); + T5 = (qsrc2 / T12 + T2 * T7) * AbulkCV; + T6 = (qsrc2 / T12 * VdseffCV2 + T2 * T7 * VdseffCV2); + Csg12 = T4 + T5 * dVdseffCV2_dVg; + Csd12 = T5 * dVdseffCV2_dVd; + Csb12 = T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb; + qsrc += qsrc2; + } + + /* end v4.1 */ + } + else + { /* 50/50 Charge partition model */ + qsrc = - 0.5 * (qinv + qbulk); + Csg1 = - 0.5 * (Cgg1 + Cbg1); + Csb1 = - 0.5 * (Cgb1 + Cbb1); + Csd1 = - 0.5 * (Cgd1 + Cbd1); + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 >0) + { + Csg12 = -0.5 * (Cgg12 + Cbg12); + Csb12 = -0.5 * (Cgb12 + Cbb12); + Csd12 = -0.5 * (Cgd12 + Cbd12); + } + /* end v4.1 */ + } + + + + /* Backgate charge */ + /* v3.1 */ + if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ + { + Qe1 = dQe1_dVb = dQe1_dVe = dQe1_dT = 0; + } + else /* soiMod = 0 or 1 */ + { + CboxWL = pParam->B4SOIkb1 * model->B4SOIfbody * Cbox + * (pParam->B4SOIweffCV / here->B4SOInseg + * here->B4SOInf /* bugfix_snps nf*/ + * pParam->B4SOIleffCVbg + here->B4SOIaebcp); + Qe1 = CboxWL * (Vesfb - Vbs); + dQe1_dVb = -CboxWL; + dQe1_dVe = CboxWL; + if (selfheat) dQe1_dT = -CboxWL * dvfbb_dT; + else dQe1_dT = 0; + } + /* v3.1 */ + + + qgate = qinv + Qac0 + Qsub0; + qbody = (qbulk - Qac0 - Qsub0 - Qe1); + qsub = Qe1; + qdrn = -(qgate + qsrc + qbody + qsub); + + /* This transform all the dependency on Vgsteff, Vbseff + into real ones */ + Ce1b = dQe1_dVb; + Ce1e = dQe1_dVe; + + Csg = Csg1 * dVgsteff_dVg; + Csd = Csd1 + Csg1 * dVgsteff_dVd; + Csb = Csg1 * dVgsteff_dVb + Csb1 * dVbseff_dVb; + if (selfheat) CsT = Csg1 * dVgsteff_dT; + else CsT = 0.0; + + Cgg = (Cgg1 + dQsub0_dVg) * dVgsteff_dVg + + dQac0_dVrg + dQsub0_dVrg; + Cgd = (Cgg1 + dQsub0_dVg) * dVgsteff_dVd + Cgd1 + + dQac0_dVd + dQsub0_dVd; + Cgb = (Cgg1 + dQsub0_dVg) * dVgsteff_dVb + + (Cgb1 + dQsub0_dVb + dQac0_dVb) * dVbseff_dVb; + if (selfheat) + CgT = (Cgg1 + dQsub0_dVg) * dVgsteff_dT + + dQac0_dT + dQsub0_dT; + else CgT = 0.0; + + Cbg = (Cbg1 - dQsub0_dVg) * dVgsteff_dVg + - dQac0_dVrg - dQsub0_dVrg; + Cbd = (Cbg1 - dQsub0_dVg) * dVgsteff_dVd + Cbd1 + - dQac0_dVd - dQsub0_dVd; + Cbb = (Cbg1 - dQsub0_dVg) * dVgsteff_dVb - dQe1_dVb + + (Cbb1 - dQsub0_dVb - dQac0_dVb) * dVbseff_dVb; + if (selfheat) + CbT = (Cbg1 - dQsub0_dVg) * dVgsteff_dT + - dQac0_dT - dQsub0_dT - dQe1_dT; + else CbT = 0.0; + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 >0) { + Csg += Csg12 * dVgsteff2_dVg; + Csd += Csd12 + Csg12 * dVgsteff2_dVd; + Csb += Csg12 * dVgsteff2_dVb + Csb12 * dVbseff_dVb; + if (selfheat) CsT += Csg12 * dVgsteff2_dT; + + Cgg += (Cgg12 + dQsub02_dVg) * dVgsteff2_dVg + + dQac02_dVrg + dQsub02_dVrg; + Cgd += (Cgg12 + dQsub02_dVg) * dVgsteff2_dVd + Cgd12 + + dQac02_dVd + dQsub02_dVd; + Cgb += (Cgg12 + dQsub02_dVg) * dVgsteff2_dVb + + (Cgb12 + dQsub02_dVb + dQac02_dVb) * dVbseff_dVb; + if (selfheat) + CgT += (Cgg12 + dQsub02_dVg) * dVgsteff2_dT + + dQac02_dT + dQsub02_dT; + + Cbg += (Cbg12 - dQsub02_dVg) * dVgsteff2_dVg + - dQac02_dVrg - dQsub02_dVrg; + Cbd += (Cbg12 - dQsub02_dVg) * dVgsteff2_dVd + Cbd12 + - dQac02_dVd - dQsub02_dVd; + Cbb += (Cbg12 - dQsub02_dVg) * dVgsteff2_dVb + + (Cbb12 - dQsub02_dVb - dQac02_dVb) * dVbseff_dVb; + if (selfheat) + CbT += (Cbg12 - dQsub02_dVg) * dVgsteff2_dT + - dQac02_dT - dQsub02_dT; + } + /* end v4.1 */ + + here->B4SOIcggb = Cgg ; + here->B4SOIcgsb = - (Cgg + Cgd + Cgb); + here->B4SOIcgdb = Cgd; + here->B4SOIcgT = CgT; + + here->B4SOIcbgb = Cbg; + here->B4SOIcbsb = -(Cbg + Cbd + Cbb) + + Ce1e; + here->B4SOIcbdb = Cbd; + here->B4SOIcbeb = - Ce1e ; + here->B4SOIcbT = CbT; + + here->B4SOIceeb = Ce1e ; + here->B4SOIceT = dQe1_dT; + + here->B4SOIcdgb = -(Cgg + Cbg + Csg); + here->B4SOIcddb = -(Cgd + Cbd + Csd); + here->B4SOIcdeb = 0; + here->B4SOIcdT = -(CgT + CbT + CsT) - dQe1_dT; + here->B4SOIcdsb = (Cgg + Cgd + Cgb + + Cbg + Cbd + Cbb + + Csg + Csd + Csb) + Ce1b; + } /* End of if capMod == 2 */ + + else if (model->B4SOIcapMod == 3) + { + + dVgsteff_dVb /= dVbseff_dVb; + if(model->B4SOImtrlMod == 0) + Cox = 3.453133e-11 / model->B4SOItoxp; + else + Cox = epsrox * EPS0 / model->B4SOItoxp; + CoxWL *= toxe/ model->B4SOItoxp; + CoxWLb *= model->B4SOItox/ model->B4SOItoxp; + Tox=1.0e8*model->B4SOItoxp; + + + /* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + dVgsteff2_dVb /= dVbseff_dVb; + CoxWL2 *= model->B4SOItox / + model->B4SOItoxp; + CoxWLb2 *= model->B4SOItox/ + model->B4SOItoxp; + } + /* end v4.1 */ + + /* v3.1 */ + if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ + { + Qac0 = dQac0_dVg = dQac0_dVb = dQac0_dT = 0.0; + dQac02_dVg = dQac02_dVb = dQac02_dT = 0.0; + Qsub0 = dQsub0_dVg = dQsub0_dVd = dQsub0_dVb = dQsub0_dT = 0.0; + dQsub02_dVg = dQsub02_dVd = dQsub02_dVb = dQsub02_dT = 0.0; + Vfbzb = dVfbzb_dT = 0; /* v4.2 bug fix # 20 */ + } + else /* soiMod = 0 or 1 */ + { + if (selfheat) { + Vfbzb = Vthzb - phi - pParam->B4SOIk1eff * sqrtPhi + + pParam->B4SOIdelvt; + dVfbzb_dT = dVthzb_dT; + } + else { + Vfbzb = here->B4SOIvfbzb + pParam->B4SOIdelvt; + dVfbzb_dT = 0; + } + + V3 = Vfbzb - Vgs_eff + Vbseff - DELTA_3; + if (Vfbzb <= 0.0) + { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfbzb); + T2 = -DELTA_3 / T0; + } + else + { T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfbzb); + T2 = DELTA_3 / T0; + } + + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff = Vfbzb - 0.5 * (V3 + T0); + dVfbeff_dVg = T1 * dVgs_eff_dVg; + dVfbeff_dVb = -T1; + if (selfheat) dVfbeff_dT = (1.0 - T1 - T2) * dVfbzb_dT; + else dVfbeff_dT = 0.0; + /* v4.1 */ + if (here->B4SOIagbcp2 >0) { + Vfbzb2 = Vfbzb + 1.12; + if (selfheat) dVfbzb2_dT = dVfbzb_dT; + else dVfbzb2_dT = 0; + V3 = Vfbzb2 - Vgs_eff2 + Vbseff - DELTA_3; + if (Vfbzb2 <= 0.0) /* Bug fix #12 Jun 09 Vfbzb changed to Vfbzb2 */ + { T0 = sqrt(V3 * V3 - 100.0 * DELTA_3 * Vfbzb2); /* Value of 100 instead of 4 is used to make transition smooth*/ + T2 = -25.0 * DELTA_3 / T0; /* p+/p has same smoothness as n+/p with 100, 4 makes it too steep*/ + } + else + { T0 = sqrt(V3 * V3 + 100.0 * DELTA_3 * Vfbzb2); + T2 = 25.0 * DELTA_3 / T0; + } + T1 = 0.5 * (1.0 + V3 / T0); + Vfbeff2 = Vfbzb2 - 0.5 * (V3 + T0); + dVfbeff2_dVg = T1 * dVgs_eff2_dVg; + dVfbeff2_dVb = -T1; + if (selfheat) dVfbeff2_dT = (1.0 - T1 - T2) * dVfbzb2_dT; + else dVfbeff2_dT = 0.0; + } + /* end v4.1 */ + + T0 = (Vgs_eff - Vbseff - Vfbzb) / Tox; + dT0_dVg = dVgs_eff_dVg / Tox; + dT0_dVb = -1.0 / Tox; + + tmp = T0 * pParam->B4SOIacde; + if ((-EXPL_THRESHOLD < tmp) && (tmp < EXPL_THRESHOLD)) + { Tcen = pParam->B4SOIldeb * exp(tmp); + dTcen_dVg = pParam->B4SOIacde * Tcen; + dTcen_dVb = dTcen_dVg * dT0_dVb; + dTcen_dVg *= dT0_dVg; + if (selfheat) + dTcen_dT = -Tcen * pParam->B4SOIacde * dVfbzb_dT / Tox; + else dTcen_dT = 0; + } + else if (tmp <= -EXPL_THRESHOLD) + { Tcen = pParam->B4SOIldeb * MIN_EXPL; + dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0; + } + else + { Tcen = pParam->B4SOIldeb * MAX_EXPL; + dTcen_dVg = dTcen_dVb = dTcen_dT = 0.0; + } + + /*LINK = 1.0e-3 * (toxe - model->B4SOIdtoxcv); v2.2.3 */ + LINK = 1.0e-3 * model->B4SOItoxp; + V3 = pParam->B4SOIldeb - Tcen - LINK; + V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->B4SOIldeb); + Tcen = pParam->B4SOIldeb - 0.5 * (V3 + V4); + T1 = 0.5 * (1.0 + V3 / V4); + /* v4.1 small Tcen can introduce numerical issue */ + if (Tcen < 1e-15) + { Tcen = 1e-15; + T1 = 0; + } /* end */ + + dTcen_dVg *= T1; + dTcen_dVb *= T1; + if (selfheat) + dTcen_dT *= T1; + else dTcen_dT = 0; + /* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + T0 = (Vgs_eff2 - Vbseff - Vfbzb2) / Tox; + dT0_dVg = dVgs_eff2_dVg / Tox; + dT0_dVb = -1.0 / Tox; + + tmp = T0 * pParam->B4SOIacde; + if ((-EXPL_THRESHOLD < tmp) && (tmp < EXPL_THRESHOLD)) + { Tcen2 = pParam->B4SOIldeb * exp(tmp); + dTcen2_dVg = pParam->B4SOIacde * Tcen2; + dTcen2_dVb = dTcen2_dVg * dT0_dVb; + dTcen2_dVg *= dT0_dVg; + if (selfheat) + dTcen2_dT = -Tcen2 * pParam->B4SOIacde * dVfbzb2_dT / Tox; + else dTcen2_dT = 0; + } + else if (tmp <= -EXPL_THRESHOLD) + { Tcen2 = pParam->B4SOIldeb * MIN_EXPL; + dTcen2_dVg = dTcen2_dVb = dTcen2_dT = 0.0; + } + else + { Tcen2 = pParam->B4SOIldeb * MAX_EXPL; + dTcen2_dVg = dTcen2_dVb = dTcen2_dT = 0.0; + } + + V3 = pParam->B4SOIldeb - Tcen2 - LINK; + V4 = sqrt(V3 * V3 + 4.0 * LINK * pParam->B4SOIldeb); + Tcen2 = pParam->B4SOIldeb - 0.5 * (V3 + V4); + T1 = 0.5 * (1.0 + V3 / V4); + + if (Tcen2 < 1e-15) + { Tcen2 = 1e-15; + T1 = 0; + } + dTcen2_dVg *= T1; + dTcen2_dVb *= T1; + if (selfheat) + dTcen2_dT *= T1; + else dTcen2_dT = 0; + } + /* end v4.1 */ + + Ccen = epssub / Tcen; + T2 = Cox / (Cox + Ccen); + Coxeff = T2 * Ccen; + T3 = -Ccen / Tcen; + dCoxeff_dVg = T2 * T2 * T3; + dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; + dCoxeff_dVg *= dTcen_dVg; + if (selfheat) + dCoxeff_dT = T3 * dTcen_dT * (T2 - Coxeff / (Cox + Ccen)); + else dCoxeff_dT = 0; + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { + /* Ccen2 = EPSSI / Tcen2; */ /* Bug Fix # 30 Jul09 EPSSI changed to epssub */ + Ccen2 = epssub / Tcen2; + T2 = Cox / (Cox + Ccen2); + Coxeff2 = T2 * Ccen2; + T3 = -Ccen2 / Tcen2; + dCoxeff2_dVg = T2 * T2 * T3; + dCoxeff2_dVb = dCoxeff2_dVg * dTcen2_dVb; + dCoxeff2_dVg *= dTcen2_dVg; + if (selfheat) + dCoxeff2_dT = T3 * dTcen2_dT * (T2 - Coxeff2 / (Cox + Ccen2)); + else dCoxeff2_dT = 0; + } + /* end v4.1 */ + CoxWLcenb = CoxWLb * Coxeff / Cox; + if (selfheat) + dCoxWLcenb_dT = CoxWLb * dCoxeff_dT / Cox; + else dCoxWLcenb_dT = 0; + /* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + CoxWLcenb2 = CoxWLb2 * Coxeff2 / Cox; + if (selfheat) + dCoxWLcenb2_dT = CoxWLb2 * dCoxeff2_dT / Cox; + else dCoxWLcenb2_dT = 0; + } + /* end v4.1 */ + Qac0 = CoxWLcenb * (Vfbeff - Vfbzb); + QovCox = Qac0 / Coxeff; + dQac0_dVg = CoxWLcenb * dVfbeff_dVg + + QovCox * dCoxeff_dVg; + dQac0_dVb = CoxWLcenb * dVfbeff_dVb + + QovCox * dCoxeff_dVb; + if (selfheat) dQac0_dT = CoxWLcenb * (dVfbeff_dT - dVfbzb_dT) + + dCoxWLcenb_dT * (Vfbeff - Vfbzb); + else dQac0_dT = 0.0; + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { + Qac02 = CoxWLcenb2 * (Vfbeff2 - Vfbzb2); + QovCox2 = Qac02 / Coxeff2; + dQac02_dVg = CoxWLcenb2 * dVfbeff2_dVg + + QovCox2 * dCoxeff2_dVg; + dQac02_dVb = CoxWLcenb2 * dVfbeff2_dVb + + QovCox2 * dCoxeff2_dVb; + if (selfheat) dQac02_dT = CoxWLcenb2 * (dVfbeff2_dT - dVfbzb2_dT) + + dCoxWLcenb2_dT * (Vfbeff2 - Vfbzb2); + else dQac02_dT = 0.0; + + Qac0 += Qac02; + } + /* end v4.1 */ + + T0 = 0.5 * pParam->B4SOIk1ox; + T3 = Vgs_eff - Vfbeff - Vbseff - Vgsteff; + if (pParam->B4SOIk1ox == 0.0) + { T1 = 0.0; + T2 = 0.0; + } + else if (T3 < 0.0) + { T1 = T0 + T3 / pParam->B4SOIk1ox; + T2 = CoxWLcenb; + } + else + { T1 = sqrt(T0 * T0 + T3); + T2 = CoxWLcenb * T0 / T1; + } + + Qsub0 = CoxWLcenb * pParam->B4SOIk1ox * (T1 - T0); + QovCox = Qsub0 / Coxeff; + dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg) + + QovCox * dCoxeff_dVg; + dQsub0_dVd = -T2 * dVgsteff_dVd; + dQsub0_dVb = -T2 * (dVfbeff_dVb + 1 + dVgsteff_dVb) + + QovCox * dCoxeff_dVb; + if (selfheat) + dQsub0_dT = -T2 * (dVfbeff_dT + dVgsteff_dT) + + dCoxWLcenb_dT * pParam->B4SOIk1ox * (T1 - T0); + else dQsub0_dT = 0.0; + + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { + T3 = Vgs_eff2 - Vfbeff2 - Vbseff - Vgsteff2; + if (pParam->B4SOIk1ox == 0.0) + { T1 = 0.0; + T2 = 0.0; + } + else if (T3 < 0.0) + { T1 = T0 + T3 / pParam->B4SOIk1ox; + T2 = CoxWLcenb2; + } + else + { T1 = sqrt(T0 * T0 + T3); + T2 = CoxWLcenb2 * T0 / T1; + } + + Qsub02 = CoxWLcenb2 * pParam->B4SOIk1ox * (T1 - T0); + QovCox2 = Qsub02 / Coxeff2; + dQsub02_dVg = T2 * (dVgs_eff2_dVg - dVfbeff2_dVg - dVgsteff2_dVg) + + QovCox2 * dCoxeff2_dVg; + dQsub02_dVd = -T2 * dVgsteff2_dVd; + dQsub02_dVb = -T2 * (dVfbeff2_dVb + 1 + dVgsteff2_dVb) + + QovCox2 * dCoxeff2_dVb; + if (selfheat) + dQsub02_dT = -T2 * (dVfbeff2_dT + dVgsteff2_dT) + + dCoxWLcenb2_dT * pParam->B4SOIk1ox * (T1 - T0); + else dQsub02_dT = 0.0; + + Qsub0 += Qsub02; + } + /* end v4.1 */ + + } + /* v3.1 */ + + + /* Gate-bias dependent delta Phis begins */ + if (pParam->B4SOIk1ox <= 0.0) + { Denomi = 0.25 * pParam->B4SOImoin * Vtm; + T0 = 0.5 * pParam->B4SOIsqrtPhi; + } + else + { Denomi = pParam->B4SOImoin * Vtm + * pParam->B4SOIk1ox * pParam->B4SOIk1ox; + T0 = pParam->B4SOIk1ox * pParam->B4SOIsqrtPhi; + } + T1 = 2.0 * T0 + Vgsteff; + + DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); + dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); + dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd; + dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb; + + /* v4.1 */ + if (here->B4SOIagbcp2 > 0) { + T1 = 2.0 * T0 + Vgsteff2; + DeltaPhi2 = Vtm * log(1.0 + T1 * Vgsteff2 / Denomi); + dDeltaPhi2_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff2); + dDeltaPhi2_dVd = dDeltaPhi2_dVg * dVgsteff2_dVd; + dDeltaPhi2_dVb = dDeltaPhi2_dVg * dVgsteff2_dVb; + } + /* end v4.1 */ + /* End of delta Phis */ + + + /* v3.1.1 bug fix for discontinuity */ + T3 = 4.0 * (Vth - Vfbzb - phi); + T2 = sqrt(T3*T3 + 0.0001); + T5 = 0.5 * (1 + T3/T2); + T4 = 0.5 * (T3 + T2); + + Tox += Tox; + T0 = (Vgsteff + T4) / Tox; + tmp = exp(0.7 * log(T0)); + T1 = 1.0 + tmp; + T2 = 0.7 * tmp / (T0 * Tox); + Tcen = 1.9e-9 / T1; + dTcen_dVg = -Tcen * T2 / T1; + dTcen_dVd = dTcen_dVg * (T5 * 4.0 * dVth_dVd + dVgsteff_dVd); + dTcen_dVb = dTcen_dVg * (T5 * 4.0 * dVth_dVb + dVgsteff_dVb); + dTcen_dVg *= dVgsteff_dVg; + if (selfheat) + dTcen_dT = -Tcen * T2 / T1 + * (T5 * 4.0 * (dVth_dT - dVfbzb_dT) + dVgsteff_dT); + else dTcen_dT = 0; + + + Ccen = epssub / Tcen; + T0 = Cox / (Cox + Ccen); + Coxeff = T0 * Ccen; + T1 = -Ccen / Tcen; + dCoxeff_dVg = T0 * T0 * T1; + dCoxeff_dVd = dCoxeff_dVg * dTcen_dVd; + dCoxeff_dVb = dCoxeff_dVg * dTcen_dVb; + dCoxeff_dVg *= dTcen_dVg; + if (selfheat) + dCoxeff_dT = T1 * dTcen_dT * (T0 - Coxeff / (Cox + Ccen)); + else dCoxeff_dT = 0; + CoxWLcen = CoxWL * Coxeff / Cox; + CoxWLcenb = CoxWLb * Coxeff / Cox; + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { + T3 = 4.0 * (Vth + 1.12 - Vfbzb2 - phi); + T2 = sqrt(T3*T3 + 0.0001); + T5 = 0.5 * (1 + T3/T2); + T4 = 0.5 * (T3 + T2); + /* Tox += Tox; */ + T0 = (Vgsteff2 + T4) / Tox; + tmp = exp(0.7 * log(T0)); + T1 = 1.0 + tmp; + T2 = 0.7 * tmp / (T0 * Tox); + Tcen2 = 1.9e-9 / T1; + dTcen2_dVg = -Tcen2 * T2 / T1; + dTcen2_dVd = dTcen2_dVg * (T5 * 4.0 * dVth_dVd + dVgsteff2_dVd); + dTcen2_dVb = dTcen2_dVg * (T5 * 4.0 * dVth_dVb + dVgsteff2_dVb); + dTcen2_dVg *= dVgsteff2_dVg; + if (selfheat) + dTcen2_dT = -Tcen2 * T2 / T1 + * (T5 * 4.0 * (dVth_dT - dVfbzb2_dT) + dVgsteff2_dT); + else dTcen2_dT = 0; + /*Ccen2 = EPSSI / Tcen2;*//*Bug Fix # 30 Jul09*/ + Ccen2 = epssub/ Tcen2; + T0 = Cox / (Cox + Ccen2); + Coxeff2 = T0 * Ccen2; + T1 = -Ccen2 / Tcen2; + dCoxeff2_dVg = T0 * T0 * T1; + dCoxeff2_dVd = dCoxeff2_dVg * dTcen2_dVd; + dCoxeff2_dVb = dCoxeff2_dVg * dTcen2_dVb; + dCoxeff2_dVg *= dTcen2_dVg; + if (selfheat) + dCoxeff2_dT = T1 * dTcen2_dT * (T0 - Coxeff2 / (Cox + Ccen2)); + else dCoxeff2_dT = 0; + CoxWLcen2 = CoxWL2 * Coxeff2 / Cox; + CoxWLcenb2 = CoxWLb2 * Coxeff2 / Cox; + } + /* end v4.1 */ + + AbulkCV = Abulk0 * pParam->B4SOIabulkCVfactor; + dAbulkCV_dVb = pParam->B4SOIabulkCVfactor * dAbulk0_dVb; + VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; + V4 = VdsatCV - Vds - DELTA_4; + T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); + VdseffCV = VdsatCV - 0.5 * (V4 + T0); + T1 = 0.5 * (1.0 + V4 / T0); + T2 = DELTA_4 / T0; + T3 = (1.0 - T1 - T2) / AbulkCV; + T4 = T3 * ( 1.0 - dDeltaPhi_dVg); + dVdseffCV_dVg = T4; + dVdseffCV_dVd = T1; + dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; + + T0 = AbulkCV * VdseffCV; + T1 = Vgsteff - DeltaPhi; + T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); + T3 = T0 / T2; + T4 = 1.0 - 12.0 * T3 * T3; + T5 = AbulkCV * (6.0 * T0 * (4.0 * T1 - T0) / (T2 * T2) - 0.5); + T6 = T5 * VdseffCV / AbulkCV; + + qinv = qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); + QovCox = qgate / Coxeff; + Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg) + + T5 * dVdseffCV_dVg); + Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 + * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cgb1 = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Cgg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cgg1 = Cgg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; + + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { + VdsatCV2 = (Vgsteff2 - DeltaPhi2) / AbulkCV; + V4 = VdsatCV2 - Vds - DELTA_4; + T02 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV2); + VdseffCV2 = VdsatCV2 - 0.5 * (V4 + T02); + T12 = 0.5 * (1.0 + V4 / T02); + T22 = DELTA_4 / T02; + T3 = (1.0 - T12 - T22) / AbulkCV; + T4 = T3 * ( 1.0 - dDeltaPhi2_dVg); + dVdseffCV2_dVg = T4; + dVdseffCV2_dVd = T12; + dVdseffCV2_dVb = -T3 * VdsatCV2 * dAbulkCV_dVb; + + T02 = AbulkCV * VdseffCV2; + T12 = Vgsteff2 - DeltaPhi2; + T22 = 12.0 * (T12 - 0.5 * T02 + 1.0e-20); + T3 = T02 / T22; + T4 = 1.0 - 12.0 * T3 * T3; + T52 = AbulkCV * (6.0 * T02 * (4.0 * T12 - T02) / (T22 * T22) - 0.5); + T6 = T52 * VdseffCV2 / AbulkCV; + T7 = CoxWLcen2 * (T12 - T02 * (0.5 - T3)); + qinv += T7; + qgate = qinoi = qinv; + QovCox2 = T7 / Coxeff2; + Cgg12 = CoxWLcen2 * (T4 * (1.0 - dDeltaPhi2_dVg) + + T52 * dVdseffCV2_dVg); + Cgd12 = CoxWLcen2 * T52 * dVdseffCV2_dVd + Cgg12 + * dVgsteff2_dVd + QovCox2 * dCoxeff2_dVd; + Cgb12 = CoxWLcen2 * (T52 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb) + + Cgg12 * dVgsteff2_dVb + QovCox2 * dCoxeff2_dVb; + Cgg12 = Cgg12 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; + } + + /* end v4.1 */ + + + /* v3.1 */ + if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ + { + qbulk = Cbg1 = Cbd1 = Cbb1 = Cbg12 = Cbb12 = Cbd12 = 0; + } + else /* soiMod = 0 or 1 */ + { + T7 = 1.0 - AbulkCV; + T8 = T2 * T2; + T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); + T10 = T9 * (1.0 - dDeltaPhi_dVg); + T11 = -T7 * T5 / AbulkCV; + T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); + + qbulk = CoxWLcenb * T7 * (0.5 * VdseffCV - T0 * VdseffCV / T2); + QovCox = qbulk / Coxeff; + Cbg1 = CoxWLcenb * (T10 + T11 * dVdseffCV_dVg); + Cbd1 = CoxWLcenb * T11 * dVdseffCV_dVd + Cbg1 + * dVgsteff_dVd + QovCox * dCoxeff_dVd; + Cbb1 = CoxWLcenb * (T11 * dVdseffCV_dVb + T12 * dAbulkCV_dVb) + + Cbg1 * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Cbg1 = Cbg1 * dVgsteff_dVg + QovCox * dCoxeff_dVg; + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { + T8 = T22 * T22; + T9 = 12.0 * T7 * T02 * T02 / (T8 * AbulkCV); + T10 = T9 * (1.0 - dDeltaPhi2_dVg); + T11 = -T7 * T52 / AbulkCV; + T12 = -(T9 * (Vgsteff2 - DeltaPhi2) / AbulkCV + VdseffCV2 * (0.5 - T02 / T22)); + + qbulk2 = CoxWLcenb2 * T7 * (0.5 * VdseffCV2 - T02 * VdseffCV2 / T22); + QovCox2 = qbulk2 / Coxeff2; + Cbg12 = CoxWLcenb2 * (T10 + T11 * dVdseffCV2_dVg); + Cbd12 = CoxWLcenb2 * T11 * dVdseffCV2_dVd + Cbg12 + * dVgsteff2_dVd + QovCox2 * dCoxeff2_dVd; + Cbb12 = CoxWLcenb2 * (T11 * dVdseffCV2_dVb + T12 * dAbulkCV_dVb) + + Cbg12 * dVgsteff2_dVb + QovCox2 * dCoxeff2_dVb; + Cbg12 = Cbg12 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; + qbulk += qbulk2; + } + + /* end v4.1 */ + + } + /* v3.1 */ + + Csg2 = Csd2 = Csb2 = 0.0; /* CJB LFW */ + if (model->B4SOIxpart > 0.5) + { /* 0/100 partition */ + qsrc = -CoxWLcen * (T1 / 2.0 + T0 / 4.0 + - 0.5 * T0 * T0 / T2); + QovCox = qsrc / Coxeff; + T2 += T2; + T3 = T2 * T2; + T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); + T4 = -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); + T5 = T7 * AbulkCV; + T6 = T7 * VdseffCV; + + Csg = CoxWLcen * (T4 + T5 * dVdseffCV_dVg); + Csd = CoxWLcen * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd + + QovCox * dCoxeff_dVd; + Csb = CoxWLcen * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb) + + Csg * dVgsteff_dVb + QovCox * dCoxeff_dVb; + Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { + T12 = Vgsteff2 - DeltaPhi2; /* must restore for derivatives below*/ + qsrc2 = -CoxWLcen2 * ( (Vgsteff2 - DeltaPhi2) / 2.0 + T02 / 4.0 + - 0.5 * T02 * T02 / T22); /* CJB LFW */ + QovCox2 = qsrc2 / Coxeff2; + T22 += T22; + T3 = T22 * T22; + T7 = -(0.25 - 12.0 * T02 * (4.0 * T12 - T02) / T3); + T4 = -(0.5 + 24.0 * T02 * T02 / T3) * (1.0 - dDeltaPhi2_dVg); + T5 = T7 * AbulkCV; + T6 = T7 * VdseffCV2; + Csg2 = CoxWLcen2 * (T4 + T5 * dVdseffCV2_dVg); + Csd2 = CoxWLcen2 * T5 * dVdseffCV2_dVd + Csg2 * dVgsteff2_dVd + + QovCox2 * dCoxeff2_dVd; + Csb2 = CoxWLcen2 * (T5 * dVdseffCV2_dVb + T6 * dAbulkCV_dVb) + + Csg2 * dVgsteff2_dVb + QovCox2 * dCoxeff2_dVb; + Csg2 = Csg2 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; + qsrc += qsrc2; + } + /* end v4.1 */ + + } + else if (model->B4SOIxpart < 0.5) + { /* 40/60 partition */ + T2 = T2 / 12.0; + T3 = 0.5 * CoxWLcen / (T2 * T2); + T4 = T1 * (2.0 * T0 * T0 / 3.0 + T1 * (T1 - 4.0 + * T0 / 3.0)) - 2.0 * T0 * T0 * T0 / 15.0; + qsrc = -T3 * T4; + QovCox = qsrc / Coxeff; + T8 = 4.0 / 3.0 * T1 * (T1 - T0) + 0.4 * T0 * T0; + T5 = -2.0 * qsrc / T2 - T3 * (T1 * (3.0 * T1 - 8.0 + * T0 / 3.0) + 2.0 * T0 * T0 / 3.0); + T6 = AbulkCV * (qsrc / T2 + T3 * T8); + T7 = T6 * VdseffCV / AbulkCV; + + Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; + Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd + + QovCox * dCoxeff_dVd; + Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb + + T7 * dAbulkCV_dVb + QovCox * dCoxeff_dVb; + Csg = Csg * dVgsteff_dVg + QovCox * dCoxeff_dVg; + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { + T12 = Vgsteff2 - DeltaPhi2; /* must restore for derivatives below*/ + T22 = T22 / 12.0; + T3 = 0.5 * CoxWLcen2 / (T22 * T22); + T4 = T12 * (2.0 * T02 * T02 / 3.0 + T12 * (T12 - 4.0 + * T02 / 3.0)) - 2.0 * T02 * T02 * T02 / 15.0; + qsrc2 = -T3 * T4; + QovCox2 = qsrc2 / Coxeff2; + T8 = 4.0 / 3.0 * T12 * (T12 - T02) + 0.4 * T02 * T02; + T5 = -2.0 * qsrc2 / T22 - T3 * (T12 * (3.0 * T12 - 8.0 + * T02 / 3.0) + 2.0 * T02 * T02 / 3.0); + T6 = AbulkCV * (qsrc2 / T22 + T3 * T8); + T7 = T6 * VdseffCV2 / AbulkCV; + + Csg2 = T5 * (1.0 - dDeltaPhi2_dVg) + T6 * dVdseffCV2_dVg; + Csd2 = Csg2 * dVgsteff2_dVd + T6 * dVdseffCV2_dVd + + QovCox2 * dCoxeff2_dVd; + Csb2 = Csg2 * dVgsteff2_dVb + T6 * dVdseffCV2_dVb + + T7 * dAbulkCV_dVb + QovCox2 * dCoxeff2_dVb; + Csg2 = Csg2 * dVgsteff2_dVg + QovCox2 * dCoxeff2_dVg; + qsrc += qsrc2; + } + /* end v4.1 */ + } + else + { /* 50/50 partition */ + qsrc = -0.5 * qgate; + Csg = -0.5 * Cgg1; + Csd = -0.5 * Cgd1; + Csb = -0.5 * Cgb1; + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { + Csg2 = -0.5 * Cgg12; + Csd -= 0.5 * Cgd12; + Csb -= 0.5 * Cgb12; + Csd2 = 0.0; /* CJB LFW */ + Csb2 = 0.0; /* CJB LFW */ + } + /* end v4.1 */ + } + + + /* Backgate charge */ + /* v3.1 */ + if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ + { + Qe1 = Ce1b = Ce1e = Ce1T = dQe1_dT = 0; + } + else /* soiMod = 0 or 1 */ + { + CboxWL = pParam->B4SOIkb1 * model->B4SOIfbody * Cbox + * (pParam->B4SOIweffCV / here->B4SOInseg + * here->B4SOInf /* bugfix_snps nf*/ + * pParam->B4SOIleffCVbg + here->B4SOIaebcp); + Qe1 = CboxWL * (Vesfb - Vbs); + Ce1b = dQe1_dVb = -CboxWL; + Ce1e = dQe1_dVe = CboxWL; + if (selfheat) Ce1T = dQe1_dT = -CboxWL * dvfbb_dT; + else Ce1T = dQe1_dT = 0.0; + } + /* v3.1 */ + + + qgate += Qac0 + Qsub0 - qbulk; + qbody = qbulk - Qac0 - Qsub0 - Qe1; + qsub = Qe1; + qdrn = -(qgate + qbody + qsub + qsrc); + + Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; + Cbd = Cbd1 - dQsub0_dVd; + Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb - Ce1b / dVbseff_dVb; + if (selfheat) + CbT = Cbg1 * dVgsteff_dT - dQac0_dT + - dQsub0_dT - dQe1_dT; + else CbT = 0.0; + + Cgg = Cgg1 - Cbg; + Cgd = Cgd1 - Cbd; + Cgb = Cgb1 - Cbb - Ce1b / dVbseff_dVb; + if (selfheat) + CgT = Cgg1 * dVgsteff_dT + dQac0_dT + + dQsub0_dT; + else CgT = 0.0; + + Cgb *= dVbseff_dVb; + Cbb *= dVbseff_dVb; + Csb *= dVbseff_dVb; + if (selfheat) CsT = Csg * dVgsteff_dT; + else CsT = 0.0; + /* v4.1 */ + if ((here->B4SOIsoiMod != 2) && /* Bug fix #10 Jun 09 'opposite type Q/C evaluated only if bodymod=1' */ + (here->B4SOIbodyMod != 0) && here->B4SOIagbcp2 > 0) { + Cbg += Cbg12 - dQac02_dVg - dQsub02_dVg; + Cbd += Cbd12 - dQsub02_dVd; + Cbb += (Cbb12 - dQac02_dVb - dQsub02_dVb)*dVbseff_dVb; + if (selfheat) + CbT += Cbg12 * dVgsteff2_dT - dQac02_dT + - dQsub02_dT; + else CbT = 0.0; + Cgg = Cgg1 + Cgg12 - Cbg; + Cgd = Cgd1 + Cgd12 - Cbd; + Cgb = Cgb1 + Cgb12 - Cbb - Ce1b / dVbseff_dVb; + if (selfheat) + CgT += Cgg12 * dVgsteff2_dT + dQac02_dT + + dQsub02_dT; + else CgT = 0.0; + + Cgb *= dVbseff_dVb; + /* Cbb *= dVbseff_dVb; */ + if (selfheat) CsT += Csg2 * dVgsteff2_dT; + else CsT = 0.0; + Csg += Csg2; + Csd += Csd2; /* CJB LFW */ + Csb += Csb2; /* CJB LFW */ + } + + /* end v4.1 */ + here->B4SOIcggb = Cgg; + here->B4SOIcgsb = -(Cgg + Cgd + Cgb); + here->B4SOIcgdb = Cgd; + here->B4SOIcgT = CgT; + + here->B4SOIcbgb = Cbg; + here->B4SOIcbsb = -(Cbg + Cbd + Cbb) + + Ce1e; + here->B4SOIcbdb = Cbd; + here->B4SOIcbeb = -Ce1e; + here->B4SOIcbT = CbT; + + here->B4SOIceT = Ce1T; + here->B4SOIceeb = Ce1e ; + + here->B4SOIcdgb = -(Cgg + Cbg + Csg); + here->B4SOIcddb = -(Cgd + Cbd + Csd); + here->B4SOIcdeb = 0; + here->B4SOIcdT = -(CgT+CbT+CsT) - Ce1T; + here->B4SOIcdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb + + Csg + Csd + Csb) + Ce1b; + here->B4SOIqinv = -qinoi; + + } /* End of if capMod ==3 */ + else { /* v4.0 */ + Qsub0 = Qac0 = 0.0; + qgate = qdrn = qsrc = qbody = qsub = 0.0; + Cbg = Cbd = Cbb = 0.0; + here->B4SOIcggb = here->B4SOIcgsb + = here->B4SOIcgdb = 0.0; + here->B4SOIcdgb = here->B4SOIcdsb + = here->B4SOIcddb = 0.0; + here->B4SOIcbgb = here->B4SOIcbsb + = here->B4SOIcbdb = 0.0; + } + } + here->B4SOIqgate = qgate; + here->B4SOIqdrn = qdrn; + here->B4SOIqbulk = qbody; + here->B4SOIqsrc = qsrc; + + + +finished: /* returning Values to Calling Routine */ + /* + * COMPUTE EQUIVALENT DRAIN CURRENT SOURCE + */ + if (ChargeComputationNeeded) + { + /* Intrinsic S/D junction charge */ + + /* v3.1 */ + if (here->B4SOIsoiMod == 2) /* v3.2 */ /* ideal FD */ + { + qjs = qjd = 0.0; + /*gcjdds = gcjdbs = gcjdT = 0.0; v4.2 */ + gcjdbs = gcjdT = 0.0; + gcjsbs = gcjsT = 0.0; + here->B4SOIcjsb = here->B4SOIcjdb = 0.0 /*v4.0*/; + + } + else /* soiMod = 0 or 1 */ + { + PhiBSWG = model->B4SOIGatesidewallJctSPotential; + dPhiBSWG_dT = -model->B4SOItpbswg; + PhiBSWG += dPhiBSWG_dT * (Temp - model->B4SOItnom); + MJSWG = model->B4SOIbodyJctGateSideSGradingCoeff; + + cjsbs = model->B4SOIunitLengthGateSidewallJctCapS + * pParam->B4SOIwdiosCV * model->B4SOItsi * here->B4SOInf / 1e-7; /* bugfix_snps nf*/ + dcjsbs_dT = cjsbs * model->B4SOItcjswg; + cjsbs += dcjsbs_dT * (Temp - model->B4SOItnom); + + cjdbs = model->B4SOIunitLengthGateSidewallJctCapD + * pParam->B4SOIwdiodCV * model->B4SOItsi * here->B4SOInf / 1e-7; /* bugfix_snps nf*/ + dcjdbs_dT = cjdbs * model->B4SOItcjswgd; + cjdbs += dcjdbs_dT * (Temp - model->B4SOItnom); + + DioMax = 0.9 * (PhiBSWG); + + /* arg = 1.0 - (Vbs > DioMax ? DioMax : Vbs) / PhiBSWG; */ /* Bug fix #6 Vbs evaluated taking consideration of Rbody Mode*/ + if (here->B4SOIrbodyMod) + arg = 1.0 - (vsbs > DioMax ? DioMax : vsbs) / PhiBSWG; /* Bug fix #6 */ + else + arg = 1.0 - (vbs > DioMax ? DioMax : vbs) / PhiBSWG; /* Bug fix #6 */ + if (selfheat) + darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT; + + if (MJSWG == 0.5) { + dT3_dVb = 1.0 / sqrt(arg); + + if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT; + } + else { + dT3_dVb = exp(-MJSWG * log(arg)); + + if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT; + } + T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); + + if (selfheat) + dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG) + - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); + + /* if (vbs > DioMax) + T3 += dT3_dVb * (vbs - DioMax); */ /* Bug fix #6 Vbs evaluated taking consideration of Rbody Mode*/ + + if (here->B4SOIrbodyMod) + { + if (vsbs > DioMax) /* Bug fix #6 */ + T3 += dT3_dVb * (vsbs - DioMax); + } + else + { + if (vbs > DioMax) /* Bug fix #6 */ + T3 += dT3_dVb * (vbs - DioMax); + } + + if (here->B4SOImode > 0) + { + qjs = cjsbs * T3 + model->B4SOItt * Ibsdif * here->B4SOInf; + gcjsbs = cjsbs * dT3_dVb + model->B4SOItt * dIbsdif_dVb * here->B4SOInf; + } + else + { + qjs = cjsbs * T3 + model->B4SOItt * Ibddif * here->B4SOInf; + gcjsbs = cjsbs * dT3_dVb + model->B4SOItt * dIbddif_dVb * here->B4SOInf; + } + + if (selfheat) + gcjsT = model->B4SOItt * dIbsdif_dT * here->B4SOInf + dcjsbs_dT * T3 + dT3_dT * cjsbs; + else gcjsT = 0.0; + + PhiBSWG = model->B4SOIGatesidewallJctDPotential; + dPhiBSWG_dT = -model->B4SOItpbswgd; + PhiBSWG += dPhiBSWG_dT * (Temp - model->B4SOItnom); + MJSWG = model->B4SOIbodyJctGateSideDGradingCoeff; + + DioMax = 0.9 * (PhiBSWG); + /* arg = 1.0 - (vbd > DioMax ? DioMax : vbd) / PhiBSWG; */ /* Bug fix #6 Vbd evaluated taking consideration of Rbody Mode*/ + if (here->B4SOIrbodyMod) + arg = 1.0 - (vdbd > DioMax ? DioMax : vdbd) / PhiBSWG; /* Bug Fix #6 */ + else + arg = 1.0 - (vbd > DioMax ? DioMax : vbd) / PhiBSWG; /* Bug Fix #6 */ + + if (selfheat) + darg_dT = (1 - arg) / PhiBSWG * dPhiBSWG_dT; + + if (MJSWG == 0.5) { + dT3_dVb = 1.0 / sqrt(arg); + + if (selfheat) ddT3_dVb_dT = -0.5 * dT3_dVb / arg * darg_dT; + } + else { + dT3_dVb = exp(-MJSWG * log(arg)); + + if (selfheat) ddT3_dVb_dT = -MJSWG * dT3_dVb / arg * darg_dT; + } + T3 = (1.0 - arg * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); + + if (selfheat) + dT3_dT = (1.0 - arg * dT3_dVb) * dPhiBSWG_dT / (1.0 - MJSWG) + - (arg * ddT3_dVb_dT + darg_dT * dT3_dVb) * PhiBSWG / (1.0 - MJSWG); + + /* if (vbd > DioMax) + T3 += dT3_dVb * (vbd - DioMax); */ /* Bug fix #6 Vbd evaluated taking consideration of Rbody Mode*/ + if (here->B4SOIrbodyMod) + { + if (vdbd > DioMax) /* Bug fix #6 */ + T3 += dT3_dVb * (vdbd - DioMax); + } + else + { + if (vbd > DioMax) /* Bug fix #6 */ + T3 += dT3_dVb * (vbd - DioMax); + } + dT3_dVd = -dT3_dVb; + + if (here->B4SOImode > 0) + { + qjd = cjdbs * T3 + model->B4SOItt * Ibddif * here->B4SOInf; + gcjdbs = cjdbs * dT3_dVb + model->B4SOItt * dIbddif_dVb * here->B4SOInf; + } + else + { + qjd = cjdbs * T3 + model->B4SOItt * Ibsdif * here->B4SOInf; + gcjdbs = cjdbs * dT3_dVb + model->B4SOItt * dIbsdif_dVb * here->B4SOInf; + } + /*gcjdds = cjdbs * dT3_dVd + model->B4SOItt * dIbddif_dVd; v4.2 */ + if (selfheat) + gcjdT = model->B4SOItt * dIbddif_dT * here->B4SOInf + dcjdbs_dT * T3 + dT3_dT * cjdbs; + else gcjdT = 0.0; + } + /* v3.1 */ + + /* v4.0 */ + /* qdrn -= qjd; + qbody += (qjs + qjd); + qsrc = -(qgate + qbody + qdrn + qsub); + */ + + /* Update the conductance */ + /* v4.2 bugfix: qjs/qjd computed using unswapped voltages; however, total capacitances are swapped below + note that gcjdds = -gcjdbs always, so (gcjdds + gcjdbs) == 0 + here->B4SOIcddb -= gcjdds; + here->B4SOIcdT -= gcjdT; + here->B4SOIcdsb += gcjdds + gcjdbs; + + + here->B4SOIcbdb += (gcjdds); + here->B4SOIcbT += (gcjdT + gcjsT); + here->B4SOIcbsb -= (gcjdds + gcjdbs + gcjsbs); + + here->B4SOIcjsb = (gcjdds + gcjdbs + gcjsbs); + here->B4SOIcjdb = -gcjdds; + */ + here->B4SOIcbT += (gcjdT + gcjsT); + if (here->B4SOImode > 0) + { + here->B4SOIcddb += gcjdbs; + here->B4SOIcdT -= gcjdT; + + here->B4SOIcbdb -= (gcjdbs); + here->B4SOIcbsb -= (gcjsbs); + + here->B4SOIcjsb = gcjsbs; + here->B4SOIcjdb = gcjdbs; + } else { + here->B4SOIcddb += gcjsbs; + here->B4SOIcdT -= gcjsT; + + here->B4SOIcbdb -= (gcjsbs); + here->B4SOIcbsb -= (gcjdbs); + + here->B4SOIcjsb = gcjdbs; + here->B4SOIcjdb = gcjsbs; + } + + /* Extrinsic Bottom S/D to substrate charge */ + T10 = -model->B4SOItype * ves; + /* T10 is vse without type conversion */ + T11 = model->B4SOItype * (vds - ves); + /* T11 is vde without type conversion */ + + if (model->B4SOIcsdmin != 0.0) + { + if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || + ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) + { + if (T10 < pParam->B4SOIvsdfb) + { here->B4SOIqse = here->B4SOIcsbox * (T10 - pParam->B4SOIvsdfb); + here->B4SOIgcse = here->B4SOIcsbox; + } + else if (T10 < pParam->B4SOIsdt1) + { T0 = T10 - pParam->B4SOIvsdfb; + T1 = T0 * T0; + here->B4SOIqse = T0 * (here->B4SOIcsbox - + pParam->B4SOIst2 / 3 * T1) ; + here->B4SOIgcse = here->B4SOIcsbox - pParam->B4SOIst2 * T1; + } + else if (T10 < pParam->B4SOIvsdth) + { T0 = T10 - pParam->B4SOIvsdth; + T1 = T0 * T0; + here->B4SOIqse = here->B4SOIcsmin * T10 + here->B4SOIst4 + + pParam->B4SOIst3 / 3 * T0 * T1; + here->B4SOIgcse = here->B4SOIcsmin + pParam->B4SOIst3 * T1; + } + else + { here->B4SOIqse = here->B4SOIcsmin * T10 + here->B4SOIst4; + here->B4SOIgcse = here->B4SOIcsmin; + } + } else + { + if (T10 < pParam->B4SOIvsdth) + { here->B4SOIqse = here->B4SOIcsmin * (T10 - pParam->B4SOIvsdth); + here->B4SOIgcse = here->B4SOIcsmin; + } + else if (T10 < pParam->B4SOIsdt1) + { T0 = T10 - pParam->B4SOIvsdth; + T1 = T0 * T0; + here->B4SOIqse = T0 * (here->B4SOIcsmin - pParam->B4SOIst2 / 3 * T1) ; + here->B4SOIgcse = here->B4SOIcsmin - pParam->B4SOIst2 * T1; + } + else if (T10 < pParam->B4SOIvsdfb) + { T0 = T10 - pParam->B4SOIvsdfb; + T1 = T0 * T0; + here->B4SOIqse = here->B4SOIcsbox * T10 + here->B4SOIst4 + + pParam->B4SOIst3 / 3 * T0 * T1; + here->B4SOIgcse = here->B4SOIcsbox + pParam->B4SOIst3 * T1; + } + else + { here->B4SOIqse = here->B4SOIcsbox * T10 + here->B4SOIst4; + here->B4SOIgcse = here->B4SOIcsbox; + } + } + + if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || + ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) + { + if (T11 < pParam->B4SOIvsdfb) + { here->B4SOIqde = here->B4SOIcdbox * (T11 - pParam->B4SOIvsdfb); + here->B4SOIgcde = here->B4SOIcdbox; + } + else if (T11 < pParam->B4SOIsdt1) + { T0 = T11 - pParam->B4SOIvsdfb; + T1 = T0 * T0; + here->B4SOIqde = T0 * (here->B4SOIcdbox - pParam->B4SOIdt2 / 3 * T1) ; + here->B4SOIgcde = here->B4SOIcdbox - pParam->B4SOIdt2 * T1; + } + else if (T11 < pParam->B4SOIvsdth) + { T0 = T11 - pParam->B4SOIvsdth; + T1 = T0 * T0; + here->B4SOIqde = here->B4SOIcdmin * T11 + here->B4SOIdt4 + + pParam->B4SOIdt3 / 3 * T0 * T1; + here->B4SOIgcde = here->B4SOIcdmin + pParam->B4SOIdt3 * T1; + } + else + { here->B4SOIqde = here->B4SOIcdmin * T11 + here->B4SOIdt4; + here->B4SOIgcde = here->B4SOIcdmin; + } + } else + { + if (T11 < pParam->B4SOIvsdth) + { here->B4SOIqde = here->B4SOIcdmin * (T11 - pParam->B4SOIvsdth); + here->B4SOIgcde = here->B4SOIcdmin; + } + else if (T11 < pParam->B4SOIsdt1) + { T0 = T11 - pParam->B4SOIvsdth; + T1 = T0 * T0; + here->B4SOIqde = T0 * (here->B4SOIcdmin - pParam->B4SOIdt2 / 3 * T1) ; + here->B4SOIgcde = here->B4SOIcdmin - pParam->B4SOIdt2 * T1; + } + else if (T11 < pParam->B4SOIvsdfb) + { T0 = T11 - pParam->B4SOIvsdfb; + T1 = T0 * T0; + here->B4SOIqde = here->B4SOIcdbox * T11 + here->B4SOIdt4 + + pParam->B4SOIdt3 / 3 * T0 * T1; + here->B4SOIgcde = here->B4SOIcdbox + pParam->B4SOIdt3 * T1; + } + else + { here->B4SOIqde = here->B4SOIcdbox * T11 + here->B4SOIdt4; + here->B4SOIgcde = here->B4SOIcdbox; + } + } + } + else { + here->B4SOIqse = here->B4SOIcsbox * T10; + here->B4SOIgcse = here->B4SOIcsbox; + here->B4SOIqde = here->B4SOIcdbox * T11; + here->B4SOIgcde = here->B4SOIcdbox; + } + + /* Extrinsic : Sidewall fringing S/D charge */ + here->B4SOIqse += here->B4SOIcsesw * T10; + here->B4SOIgcse += here->B4SOIcsesw; + here->B4SOIqde += here->B4SOIcdesw * T11; + here->B4SOIgcde += here->B4SOIcdesw; + + /* All charge are multiplied with type at the end, but qse and qde + have true polarity => so pre-multiplied with type */ + here->B4SOIqse *= model->B4SOItype; + here->B4SOIqde *= model->B4SOItype; + } + else { /* v4.0 */ + qjs = qjd = 0.0; + here->B4SOIqse = here->B4SOIqde = 0.0; + here->B4SOIgcse = here->B4SOIgcde = 0.0; + } + + here->B4SOIcbb = Cbb; + here->B4SOIcbd = Cbd; + here->B4SOIcbg = Cbg; + here->B4SOIqbf = -Qsub0 - Qac0; + here->B4SOIqjs = qjs; + here->B4SOIqjd = qjd; + *(ckt->CKTstate0 + here->B4SOIqbs) = qjs; /* v4.0 */ + *(ckt->CKTstate0 + here->B4SOIqbd) = qjd; /* v4.0 */ + + /* + * check convergence + */ + if ((here->B4SOIoff == 0) || (!(ckt->CKTmode & MODEINITFIX))) + { if (Check == 1) + { ckt->CKTnoncon++; +#ifndef NEWCONV + } + else + { tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(here->B4SOIcd)) + + ckt->CKTabstol; + if (fabs(cdhat - here->B4SOIcd) >= tol) + { ckt->CKTnoncon++; + } + else + { tol = ckt->CKTreltol * MAX(fabs(cbhat), + fabs(here->B4SOIcbs + here->B4SOIcbd)) + + ckt->CKTabstol; + if (fabs(cbhat - (here->B4SOIcbs + here->B4SOIcbd)) + > tol) + { ckt->CKTnoncon++; + } + } +#endif /* NEWCONV */ + } + } + + *(ckt->CKTstate0 + here->B4SOIvg) = vg; + *(ckt->CKTstate0 + here->B4SOIvd) = vd; + *(ckt->CKTstate0 + here->B4SOIvs) = vs; + *(ckt->CKTstate0 + here->B4SOIvp) = vp; + *(ckt->CKTstate0 + here->B4SOIve) = ve; + + *(ckt->CKTstate0 + here->B4SOIvbs) = vbs; + *(ckt->CKTstate0 + here->B4SOIvbd) = vbd; + *(ckt->CKTstate0 + here->B4SOIvgs) = vgs; + *(ckt->CKTstate0 + here->B4SOIvds) = vds; + *(ckt->CKTstate0 + here->B4SOIves) = ves; + *(ckt->CKTstate0 + here->B4SOIvps) = vps; + *(ckt->CKTstate0 + here->B4SOIdeltemp) = delTemp; + + /* v3.1 added for RF */ + *(ckt->CKTstate0 + here->B4SOIvgge) = vgge; + *(ckt->CKTstate0 + here->B4SOIvggm) = vggm; + *(ckt->CKTstate0 + here->B4SOIvges) = vges; + *(ckt->CKTstate0 + here->B4SOIvgms) = vgms; + /* v3.1 added for RF end*/ + *(ckt->CKTstate0 + here->B4SOIvdbs) = vdbs; /* v4.0 */ + *(ckt->CKTstate0 + here->B4SOIvdbd) = vdbd; /* v4.0 */ + *(ckt->CKTstate0 + here->B4SOIvsbs) = vsbs; /* v4.0 */ + *(ckt->CKTstate0 + here->B4SOIvses) = vses; + *(ckt->CKTstate0 + here->B4SOIvdes) = vdes; + + /* bulk and channel charge plus overlaps */ + + if (!ChargeComputationNeeded) + goto line850; + +line755: + ag0 = ckt->CKTag[0]; + + T0 = vgd + DELTA_1; + if (here->B4SOIrgateMod == 3) T0 = vgmd + DELTA_1; /* v3.2 bug fix */ + T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); + T2 = 0.5 * (T0 - T1); + + /* v2.2.3 bug fix */ + T3 = pParam->B4SOIwdiodCV * pParam->B4SOIcgdl; /* v3.1 bug fix */ + + T4 = sqrt(1.0 - 4.0 * T2 / pParam->B4SOIckappa); + cgdo = pParam->B4SOIcgdo + T3 - T3 * (1.0 - 1.0 / T4) + * (0.5 - 0.5 * T0 / T1); + qgdo = (pParam->B4SOIcgdo + T3) * vgd - T3 * (T2 + + 0.5 * pParam->B4SOIckappa * (T4 - 1.0)); + + if (here->B4SOIrgateMod == 3) { + qgdo = (pParam->B4SOIcgdo + T3) * vgmd - T3 * (T2 + + 0.5 * pParam->B4SOIckappa * (T4 - 1.0)); + } /* v3.2 bug fix */ + + T0 = vgs + DELTA_1; + if (here->B4SOIrgateMod == 3) T0 = vgms + DELTA_1; /* v3.2 bug fix */ + T1 = sqrt(T0 * T0 + 4.0 * DELTA_1); + T2 = 0.5 * (T0 - T1); + + /* v2.2.3 bug fix */ + T3 = pParam->B4SOIwdiosCV * pParam->B4SOIcgsl; /* v3.1 bug fix */ + + T4 = sqrt(1.0 - 4.0 * T2 / pParam->B4SOIckappa); + cgso = pParam->B4SOIcgso + T3 - T3 * (1.0 - 1.0 / T4) + * (0.5 - 0.5 * T0 / T1); + qgso = (pParam->B4SOIcgso + T3) * vgs - T3 * (T2 + + 0.5 * pParam->B4SOIckappa * (T4 - 1.0)); + + if (here->B4SOIrgateMod == 3) { + qgso = (pParam->B4SOIcgso + T3) * vgms - T3 * (T2 + + 0.5 * pParam->B4SOIckappa * (T4 - 1.0)); + } /* v3.2 bug fix */ + + if (here->B4SOInf != 1.0) + { cgdo *= here->B4SOInf; + cgso *= here->B4SOInf; + qgdo *= here->B4SOInf; + qgso *= here->B4SOInf; + } + /* here->B4SOIcgdo = cgdo; + here->B4SOIcgso = cgso; + */ + if (here->B4SOIdebugMod < 0) + goto line850; + + + if (here->B4SOImode > 0) + { + + /* v3.1 added for RF */ + if (here->B4SOIrgateMod == 3) + { + gcgmgmb = (cgdo + cgso + pParam->B4SOIcgeo) * ag0; + + gcgmdb = -cgdo * ag0; + gcgmsb = -cgso * ag0; + gcgmeb = -pParam->B4SOIcgeo * ag0; + gcdgmb = gcgmdb; + gcsgmb = gcgmsb; + gcegmb = gcgmeb; + + gcggb = here->B4SOIcggb * ag0; + gcgdb = here->B4SOIcgdb * ag0; + gcgsb = here->B4SOIcgsb * ag0; + gcgeb = 0 ;/*v3.1 changed*/ + gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); + + gcdgb = here->B4SOIcdgb * ag0; + gcegb = gcgeb; /*v3.1 added*/ + gcsgb = -(here->B4SOIcggb + here->B4SOIcbgb + + here->B4SOIcdgb) * ag0 - gcegb; + gcbgb = here->B4SOIcbgb * ag0; + + qgd = qgdo; + qgs = qgso; + qge = 0; /* v3.1 change */ + + qgme = pParam->B4SOIcgeo * vgme; + qgmid = qgdo + qgso + qgme; + qdrn += here->B4SOIqde - qgd; + qsub -= qgme + here->B4SOIqse + here->B4SOIqde; + qsrc = -(qgate + qgmid + qbody + qdrn + qsub) - qjs; + qdrn -= qjd; + if (!here->B4SOIrbodyMod) qbody += qjd + qjs; + + } + else + { + gcggb = (here->B4SOIcggb + cgdo + cgso + + pParam->B4SOIcgeo) * ag0; + gcgdb = (here->B4SOIcgdb - cgdo) * ag0; + gcgsb = (here->B4SOIcgsb - cgso) * ag0; + gcgeb = (-pParam->B4SOIcgeo) *ag0; + gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); + + gcegb = (- pParam->B4SOIcgeo) * ag0; + gcdgb = (here->B4SOIcdgb - cgdo) * ag0; + gcsgb = -(here->B4SOIcggb + here->B4SOIcbgb + + here->B4SOIcdgb + cgso) * ag0; + gcbgb = here->B4SOIcbgb * ag0; + + gcdgmb = gcsgmb = gcegmb = 0.0; + gcgmdb = gcgmsb = gcgmeb = 0.0; + + /* Lump the overlap capacitance and S/D parasitics */ + qgd = qgdo; + qgs = qgso; + qge = pParam->B4SOIcgeo * vge; + qgate += qgd + qgs + qge; + qdrn += here->B4SOIqde - qgd; + qsub -= qge + here->B4SOIqse + here->B4SOIqde; + qsrc = -(qgate + qbody + qdrn + qsub) - qjs; + qdrn -= qjd; + if (!here->B4SOIrbodyMod) qbody += qjd + qjs; + } + + gcddb = (here->B4SOIcddb + cgdo + here->B4SOIgcde) * ag0; + gcdsb = here->B4SOIcdsb * ag0; + gcdeb = (here->B4SOIcdeb - here->B4SOIgcde) * ag0; + gcdT = model->B4SOItype * here->B4SOIcdT * ag0; + + gcsdb = -(here->B4SOIcgdb + here->B4SOIcbdb + + here->B4SOIcddb) * ag0; + gcssb = (cgso + here->B4SOIgcse - (here->B4SOIcgsb + + here->B4SOIcbsb + here->B4SOIcdsb)) * ag0; + gcseb = -(here->B4SOIgcse + here->B4SOIcbeb + + here->B4SOIcdeb + here->B4SOIceeb) * ag0; + gcsT = - model->B4SOItype * (here->B4SOIcgT + + here->B4SOIcbT + here->B4SOIcdT + here->B4SOIceT) + * ag0; + + gcgT = model->B4SOItype * here->B4SOIcgT * ag0; + + /* gcbdb = here->B4SOIcbdb * ag0; + gcbsb = here->B4SOIcbsb * ag0; + */ + gcbeb = here->B4SOIcbeb * ag0; + gcbT = model->B4SOItype * here->B4SOIcbT * ag0; + + /* v4.0 */ + if (!here->B4SOIrbodyMod) + { + gcjdbdp = gcjsbsp = 0.0; + gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb + gcdeb); + gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb + gcseb); + gcdbdb = gcsbsb = 0.0; + gcbdb = here->B4SOIcbdb * ag0; + gcbsb = here->B4SOIcbsb * ag0; + here->B4SOIGGjdb = GGjdb = 0.0; + here->B4SOIGGjsb = GGjsb = 0.0; + } + else + { + gcjdbdp = gcjdbs * ag0; + gcjsbsp = gcjsbs * ag0; + gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb + gcdeb) + + gcjdbdp; + gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb + gcseb) + + gcjsbsp; + /* v4.2 optimization: gcjdds + gcjdbs = 0 + gcdbdb = gcjdds * ag0; + gcsbsb = -(gcjdds + gcjdbs + gcjsbs) * ag0; + */ + gcdbdb = -gcjdbs * ag0; + gcsbsb = -gcjsbs * ag0; + gcbdb = here->B4SOIcbdb * ag0 - gcdbdb; + gcbsb = here->B4SOIcbsb * ag0 - gcsbsb; + here->B4SOIGGjdb = GGjdb = Gjdb; + here->B4SOIGGjsb = GGjsb = Gjsb; + } + /* v4.0 end */ + + gcedb = (- here->B4SOIgcde) * ag0; + gcesb = (- here->B4SOIgcse) * ag0; + gceeb = (here->B4SOIgcse + here->B4SOIgcde + + here->B4SOIceeb + pParam->B4SOIcgeo) * ag0; + + gceT = model->B4SOItype * here->B4SOIceT * ag0; + + gcTt = pParam->B4SOIcth * ag0; + + sxpart = 0.6; + dxpart = 0.4; + + + /* v3.1 moved the following original code ahead */ + /* Lump the overlap capacitance and S/D parasitics */ + /* qgd = qgdo; + qgs = qgso; + qge = pParam->B4SOIcgeo * vge; + qgate += qgd + qgs + qge; + qdrn += here->B4SOIqde - qgd; + qsub -= qge + here->B4SOIqse + here->B4SOIqde; + qsrc = -(qgate + qbody + qdrn + qsub); + */ + /* v3.1 end */ + + } + + else + { + if (here->B4SOIrgateMod == 3) + { + gcgmgmb = (cgdo + cgso + pParam->B4SOIcgeo) * ag0; + gcgmdb = -cgdo * ag0; + gcgmsb = -cgso * ag0; + gcgmeb = -pParam->B4SOIcgeo * ag0; + gcdgmb = gcgmdb; + gcsgmb = gcgmsb; + gcegmb = gcgmeb; + + gcggb = here->B4SOIcggb * ag0; + gcgsb = here->B4SOIcgdb * ag0; + gcgdb = here->B4SOIcgsb * ag0; + gcgeb = 0; /* v3.1 */ + gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); /* v3.1 added gcgeb */ + + gcsgb = here->B4SOIcdgb * ag0; + gcegb = gcgeb; /* v3.1 added */ + gcdgb = -(here->B4SOIcggb + here->B4SOIcbgb + + here->B4SOIcdgb) * ag0 - gcegb; /*v3.1 added gcegb*/ + gcbgb = here->B4SOIcbgb * ag0; + + qgd = qgdo; + qgs = qgso; + qge = 0; /* v3.1 */ + qgme = pParam->B4SOIcgeo * vgme; + qgmid = qgdo + qgso + qgme; + qgate += qge; + qbody -= 0; + qsrc = qdrn - qgs + here->B4SOIqse; + qsub -= qgme + here->B4SOIqse + here->B4SOIqde; + qdrn = -(qgate + qgmid + qbody + qsrc + qsub) -qjd; + qsrc -= qjs; + if (!here->B4SOIrbodyMod) qbody += qjs + qjd; + } + else + { + gcggb = (here->B4SOIcggb + cgdo + cgso + pParam->B4SOIcgeo) * ag0; + gcgdb = (here->B4SOIcgsb - cgdo) * ag0; + gcgsb = (here->B4SOIcgdb - cgso) * ag0; + gcgeb = (- pParam->B4SOIcgeo) * ag0; + gcgbb = -(gcggb + gcgdb + gcgsb + gcgeb); /*added gcgbb*/ + + gcegb = gcgeb; /* v3.1 added */ + gcsgb = (here->B4SOIcdgb - cgso) * ag0; + gcdgb = -(here->B4SOIcggb + here->B4SOIcbgb + here->B4SOIcdgb + cgdo) * ag0; + gcbgb = here->B4SOIcbgb * ag0; + + gcdgmb = gcsgmb = gcegmb = 0.0; + gcgmdb = gcgmsb = gcgmeb = 0.0; + + /* Lump the overlap capacitance and S/D parasitics */ + qgd = qgdo; + qgs = qgso; + qge = pParam->B4SOIcgeo * vge; + qgate += qgd + qgs + qge; + qsrc = qdrn - qgs + here->B4SOIqse; + qsub -= qge + here->B4SOIqse + here->B4SOIqde; + qdrn = -(qgate + qbody + qsrc + qsub) - qjd; + qsrc -= qjs; + if (!here->B4SOIrbodyMod) qbody += qjs + qjd; + } + + gcssb = (here->B4SOIcddb + cgso + here->B4SOIgcse) * ag0; + gcsdb = here->B4SOIcdsb * ag0; + gcseb = (here->B4SOIcdeb - here->B4SOIgcse) * ag0; + gcsT = model->B4SOItype * here->B4SOIcdT * ag0; + + gcdsb = -(here->B4SOIcgdb + here->B4SOIcbdb + + here->B4SOIcddb) * ag0; + gcddb = (cgdo + here->B4SOIgcde - (here->B4SOIcgsb + + here->B4SOIcbsb + here->B4SOIcdsb)) * ag0; + gcdeb = -(here->B4SOIgcde + here->B4SOIcbeb + + here->B4SOIcdeb + here->B4SOIceeb) * ag0; + gcdT = - model->B4SOItype * (here->B4SOIcgT + + here->B4SOIcbT + here->B4SOIcdT + here->B4SOIceT) + * ag0; + + gcgT = model->B4SOItype * here->B4SOIcgT * ag0; + + gcbeb = here->B4SOIcbeb * ag0; + gcbT = model->B4SOItype * here->B4SOIcbT * ag0; + /* v4.0 gcbsb = here->B4SOIcbdb * ag0; + gcbdb = here->B4SOIcbsb * ag0; + */ + + /* v4.0 */ + if (!here->B4SOIrbodyMod) + { + gcjdbdp = gcjsbsp = 0.0; + gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb + gcdeb); + gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb + gcseb); + gcdbdb = gcsbsb = 0.0; + gcbdb = here->B4SOIcbsb * ag0; + gcbsb = here->B4SOIcbdb * ag0; + here->B4SOIGGjdb = GGjdb = 0.0; + here->B4SOIGGjsb = GGjsb = 0.0; + } + else + { + /* v4.2 bugfix; qjd/qjs are not swapped + gcjdbdp = gcjsbs * ag0; + gcjsbsp = gcjdbs * ag0; + */ + gcjdbdp = gcjdbs * ag0; + gcjsbsp = gcjsbs * ag0; + gcdbb = -(gcdgb + gcddb + gcdsb + gcdgmb + gcdeb) + + gcjdbdp; + gcsbb = -(gcsgb + gcsdb + gcssb + gcsgmb + gcseb) + + gcjsbsp; + /* v4.2 bugfix; qjd/qjs are not swapped + gcsbsb = gcjdds * ag0; + gcdbdb = -(gcjdds + gcjdbs + gcjsbs) * ag0; + */ + gcsbsb = -gcjdbs * ag0; + gcdbdb = -gcjsbs * ag0; + gcbdb = here->B4SOIcbsb * ag0 - gcdbdb; + gcbsb = here->B4SOIcbdb * ag0 - gcsbsb; + here->B4SOIGGjdb = GGjdb = Gjsb; + here->B4SOIGGjsb = GGjsb = Gjdb; + } + /* v4.0 end */ + + /* gcegb = (-pParam->B4SOIcgeo) * ag0; V3.2 bug fix */ + gcesb = (- here->B4SOIgcse) * ag0; + gcedb = (- here->B4SOIgcde) * ag0; + gceeb = (here->B4SOIceeb + pParam->B4SOIcgeo + + here->B4SOIgcse + here->B4SOIgcde) * ag0; + gceT = model->B4SOItype * here->B4SOIceT * ag0; + + gcTt = pParam->B4SOIcth * ag0; + + dxpart = 0.6; + sxpart = 0.4; + + + /* v3.1 moved the following code ahead */ + /* Lump the overlap capacitance */ + /* + qgd = qgdo; + gs = qgso; + qge = pParam->B4SOIcgeo * vge; + qgate += qgd + qgs + qge; + qsrc = qdrn - qgs + here->B4SOIqse; + qsub -= qge + here->B4SOIqse + here->B4SOIqde; + qdrn = -(qgate + qbody + qsrc + qsub); + */ + /* v3.1 end */ + + + } + + here->B4SOIcgdo = cgdo; + here->B4SOIcgso = cgso; + + if (ByPass) goto line860; + + *(ckt->CKTstate0 + here->B4SOIqe) = qsub; + *(ckt->CKTstate0 + here->B4SOIqg) = qgate; + *(ckt->CKTstate0 + here->B4SOIqd) = qdrn; + *(ckt->CKTstate0 + here->B4SOIqb) = qbody; + if ((model->B4SOIshMod == 1) && (here->B4SOIrth0!=0.0)) + *(ckt->CKTstate0 + here->B4SOIqth) = pParam->B4SOIcth * delTemp; + if (here->B4SOIrgateMod == 3) /* 3.1 bug fix */ + *(ckt->CKTstate0 + here->B4SOIqgmid) = qgmid; + + + /* store small signal parameters */ + if (ckt->CKTmode & MODEINITSMSIG) + { goto line1000; + } + if (!ChargeComputationNeeded) + goto line850; + + + if (ckt->CKTmode & MODEINITTRAN) + { *(ckt->CKTstate1 + here->B4SOIqb) = + *(ckt->CKTstate0 + here->B4SOIqb); + *(ckt->CKTstate1 + here->B4SOIqg) = + *(ckt->CKTstate0 + here->B4SOIqg); + *(ckt->CKTstate1 + here->B4SOIqd) = + *(ckt->CKTstate0 + here->B4SOIqd); + *(ckt->CKTstate1 + here->B4SOIqe) = + *(ckt->CKTstate0 + here->B4SOIqe); + *(ckt->CKTstate1 + here->B4SOIqth) = + *(ckt->CKTstate0 + here->B4SOIqth); + if (here->B4SOIrgateMod == 3) + *(ckt->CKTstate1 + here->B4SOIqgmid) = + *(ckt->CKTstate0 + here->B4SOIqgmid); + if (here->B4SOIrbodyMod) /* v4.0 */ + { *(ckt->CKTstate1 + here->B4SOIqbs) = + *(ckt->CKTstate0 + here->B4SOIqbs); + *(ckt->CKTstate1 + here->B4SOIqbd) = + *(ckt->CKTstate0 + here->B4SOIqbd); + } + + } + + error = NIintegrate(ckt, &geq, &ceq,0.0,here->B4SOIqb); + if (error) return(error); + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqg); + if (error) return(error); + error = NIintegrate(ckt,&geq, &ceq, 0.0, here->B4SOIqd); + if (error) return(error); + error = NIintegrate(ckt,&geq, &ceq, 0.0, here->B4SOIqe); + if (error) return(error); + if ((model->B4SOIshMod == 1) && (here->B4SOIrth0!=0.0)) + { + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqth); + if (error) return (error); + } + + if (here->B4SOIrgateMod == 3) + { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqgmid); + if (error) return(error); + } /*3.1 bug fix*/ + + if (here->B4SOIrbodyMod) /* v4.0 */ + { error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqbs); + if (error) return(error); + error = NIintegrate(ckt, &geq, &ceq, 0.0, here->B4SOIqbd); + if (error) return(error); + } + + goto line860; + +line850: + /* initialize to zero charge conductance and current */ + ceqqe = ceqqg = ceqqb = ceqqd = ceqqth= 0.0; + + gcdgb = gcddb = gcdsb = gcdeb = gcdT = 0.0; + gcsgb = gcsdb = gcssb = gcseb = gcsT = 0.0; + gcggb = gcgdb = gcgsb = gcgeb = gcgT = 0.0; + gcbgb = gcbdb = gcbsb = gcbeb = gcbT = 0.0; + gcegb = gcedb = gceeb = gcesb = gceT = 0.0; + gcTt = 0.0; + + /* v3.1 added for RF */ + gcgmgmb = gcgmdb = gcgmsb = gcgmeb = 0.0; + gcdgmb = gcsgmb = gcegmb = ceqqgmid = 0.0; + gcgbb = gcsbb = gcdbb = 0.0; + /* v3.1 added for RF end */ + + gcdbdb = gcsbsb = gcjdbdp = gcjsbsp = 0.0; /* v4.0 */ + ceqqjd = ceqqjs = 0.0; /* v4.0 */ + GGjdb = GGjsb = 0.0; /* v4.0 */ + + sxpart = (1.0 - (dxpart = (here->B4SOImode > 0) ? 0.4 : 0.6)); + + goto line900; + +line860: + /* evaluate equivalent charge current */ + + cqgate = *(ckt->CKTstate0 + here->B4SOIcqg); + cqbody = *(ckt->CKTstate0 + here->B4SOIcqb); + cqdrn = *(ckt->CKTstate0 + here->B4SOIcqd); + cqsub = *(ckt->CKTstate0 + here->B4SOIcqe); + cqtemp = *(ckt->CKTstate0 + here->B4SOIcqth); + + here->B4SOIcb += cqbody; + here->B4SOIcd += cqdrn; + + ceqqg = cqgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs + - gcgeb * veb - gcgT * delTemp; + + ceqqb = cqbody - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs + - gcbeb * veb - gcbT * delTemp; /* v3.2 bug fix */ + ceqqd = cqdrn - gcdgb * vgb + (gcddb + gcdbdb) * vbd + + gcdsb * vbs - gcdeb * veb - gcdT * delTemp + - gcdbdb * vbd_jct - gcdgmb * vgmb;/* v4.0 */ + + ceqqe = cqsub - gcegb * vgb + gcedb * vbd + gcesb * vbs + - gceeb * veb - gceT * delTemp - gcegmb * vgmb; /* 3.2 bug fix */ + ceqqth = cqtemp - gcTt * delTemp; + + /* v3.1 added for RF */ + if (here->B4SOIrgateMod == 3) + ceqqgmid = *(ckt->CKTstate0 + here->B4SOIcqgmid) + + gcgmdb * vbd + gcgmsb * vbs - gcgmgmb * vgmb;/* 3.2 bug fix */ + else + ceqqgmid = 0.0; + /* v3.1 added for RF end */ + + if (here->B4SOIrbodyMod) /* v4.0 */ + { ceqqjs = *(ckt->CKTstate0 + here->B4SOIcqbs) + + gcsbsb * vbs_jct; + ceqqjd = *(ckt->CKTstate0 + here->B4SOIcqbd) + + gcdbdb * vbd_jct; + } + + if (ckt->CKTmode & MODEINITTRAN) + { *(ckt->CKTstate1 + here->B4SOIcqe) = + *(ckt->CKTstate0 + here->B4SOIcqe); + *(ckt->CKTstate1 + here->B4SOIcqb) = + *(ckt->CKTstate0 + here->B4SOIcqb); + *(ckt->CKTstate1 + here->B4SOIcqg) = + *(ckt->CKTstate0 + here->B4SOIcqg); + *(ckt->CKTstate1 + here->B4SOIcqd) = + *(ckt->CKTstate0 + here->B4SOIcqd); + *(ckt->CKTstate1 + here->B4SOIcqth) = + *(ckt->CKTstate0 + here->B4SOIcqth); + + if (here->B4SOIrgateMod == 3) /* v3.1 */ + *(ckt->CKTstate1 + here->B4SOIcqgmid) = + *(ckt->CKTstate0 + here->B4SOIcqgmid); + + if (here->B4SOIrbodyMod) /* v4.0 */ + { *(ckt->CKTstate1 + here->B4SOIcqbs) = + *(ckt->CKTstate0 + here->B4SOIcqbs); + *(ckt->CKTstate1 + here->B4SOIcqbd) = + *(ckt->CKTstate0 + here->B4SOIcqbd); + } + + } + + /* + * load current vector + */ +line900: + + if (here->B4SOImode >= 0) + { Gm = here->B4SOIgm; + Gmbs = here->B4SOIgmbs; + /* v3.0 */ + Gme = here->B4SOIgme; + + GmT = model->B4SOItype * here->B4SOIgmT; + FwdSum = Gm + Gmbs + Gme; /* v3.0 */ + RevSum = 0.0; + + /* v2.2.2 bug fix */ + cdreq = model->B4SOItype * (here->B4SOIcdrain + - here->B4SOIgds * vds - Gm * vgs - Gmbs * vbs + - Gme * ves) - GmT * delTemp; /* v3.0 */ + + /* ceqbs now is compatible with cdreq, ie. going in is +ve */ + /* Equivalent current source from the diode */ + ceqbs = here->B4SOIcjs; + ceqbd = here->B4SOIcjd; + cdbdp = Idbdp; + csbsp = Isbsp; + + /* Current going in is +ve */ + ceqbody = -here->B4SOIcbody; + + ceqgate = here->B4SOIcgate; + gigg = here->B4SOIgigg; + gigb = here->B4SOIgigb; + gige = here->B4SOIgige; /* v3.0 */ + gigs = here->B4SOIgigs; + gigd = here->B4SOIgigd; + gigT = model->B4SOItype * here->B4SOIgigT; + + ceqth = here->B4SOIcth; + ceqbodcon = here->B4SOIcbodcon; + + /* v4.1 */ + gigpg = here->B4SOIgigpg; + gigpp = here->B4SOIgigpp; + ceqgate += (here->B4SOIigp - gigpg * vgp); + if(here->B4SOIbodyMod == 1) + ceqbodcon += (here->B4SOIigp - gigpg * vgp); + else if(here->B4SOIbodyMod == 2) + ceqbody -= (here->B4SOIigp - gigpg * vgp); + + gbbg = -here->B4SOIgbgs; + gbbdp = -here->B4SOIgbds; + gbbb = -here->B4SOIgbbs; + gbbp = -here->B4SOIgbps; + gbbT = -model->B4SOItype * here->B4SOIgbT; + /* v3.0 */ + gbbe = -here->B4SOIgbes; + + if (here->B4SOIrbodyMod) { /* v4.0 */ + gbbdp = -Giid - Ggidld - Ggisls; + gbbb = -Giib + Gbpbs; + gjsdb = Gjsb + Gjdb; + } + + gbbsp = - ( gbbg + gbbdp + gbbb + gbbp + gbbe); + + gddpg = -here->B4SOIgjdg; + gddpdp = -here->B4SOIgjdd; + if (!here->B4SOIrbodyMod) /* v4.0 */ + gddpb = -here->B4SOIgjdb; + else + gddpb = Giib + Ggidlb + Ggislb; + gddpT = -model->B4SOItype * here->B4SOIgjdT; + /* v3.0 */ + gddpe = -here->B4SOIgjde; + gddpsp = - ( gddpg + gddpdp + gddpb + gddpe); + + gsspg = -here->B4SOIgjsg; + gsspdp = -here->B4SOIgjsd; + if (!here->B4SOIrbodyMod) + gsspb = -here->B4SOIgjsb; + else + gsspb = 0.0; + gsspT = -model->B4SOItype * here->B4SOIgjsT; + /* v3.0 */ + gsspe = 0.0; + gsspsp = - (gsspg + gsspdp + gsspb + gsspe); + + gppb = -here->B4SOIgbpbs; + gppp = -here->B4SOIgbpps; + + gTtg = here->B4SOIgtempg; + gTtb = here->B4SOIgtempb; + gTtdp = here->B4SOIgtempd; + gTtt = here->B4SOIgtempT; + + /* v3.0 */ + gTte = here->B4SOIgtempe; + gTtsp = - (gTtg + gTtb + gTtdp + gTte); + + + /* v3.0 */ + if (model->B4SOIigcMod) + { gIstotg = here->B4SOIgIgsg + here->B4SOIgIgcsg; + gIstotd = here->B4SOIgIgcsd; + gIstots = here->B4SOIgIgss + here->B4SOIgIgcss; + gIstotb = here->B4SOIgIgcsb; + Istoteq = model->B4SOItype * (here->B4SOIIgs + here->B4SOIIgcs + - gIstotg * vgs - here->B4SOIgIgcsd * vds + - here->B4SOIgIgcsb * vbs); + + gIdtotg = here->B4SOIgIgdg + here->B4SOIgIgcdg; + gIdtotd = here->B4SOIgIgdd + here->B4SOIgIgcdd; + gIdtots = here->B4SOIgIgcds; + gIdtotb = here->B4SOIgIgcdb; + Idtoteq = model->B4SOItype * (here->B4SOIIgd + here->B4SOIIgcd + - here->B4SOIgIgdg * vgd - here->B4SOIgIgcdg * vgs + - here->B4SOIgIgcdd * vds - here->B4SOIgIgcdb * vbs); + + gIgtotg = gIstotg + gIdtotg; + gIgtotd = gIstotd + gIdtotd; + gIgtots = gIstots + gIdtots; + gIgtotb = gIstotb + gIdtotb; + Igtoteq = Istoteq + Idtoteq; + } + else + { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; + gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; + + gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; + } + + /* v3.1 added for RF */ + if (here->B4SOIrgateMod == 2) + T0 = vges - vgs; + else if (here->B4SOIrgateMod == 3) + T0 = vgms - vgs; + if (here->B4SOIrgateMod > 1) + { + gcrgd = here->B4SOIgcrgd * T0; + gcrgg = here->B4SOIgcrgg * T0; + gcrgs = here->B4SOIgcrgs * T0; + gcrgb = here->B4SOIgcrgb * T0; + + ceqgcrg = -(gcrgd * vds + gcrgg * vgs + + gcrgb * vbs); + gcrgg -= here->B4SOIgcrg; + gcrg = here->B4SOIgcrg; + } + else + ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; + /* v3.1 added for RF end */ + + } /* end of soimode>=0 */ + + else + { Gm = -here->B4SOIgm; + Gmbs = -here->B4SOIgmbs; + /* v3.0 */ + Gme = -here->B4SOIgme; + + GmT = -model->B4SOItype * here->B4SOIgmT; + FwdSum = 0.0; + RevSum = -(Gm + Gmbs + Gme); /* v3.0 */ + + + /* v3.1 bug fix */ + cdreq = -model->B4SOItype * (here->B4SOIcdrain + here->B4SOIgds*vds + + Gm * vgd + Gmbs * vbd + Gme * (ves - vds)) + - GmT * delTemp; + + + ceqbs = here->B4SOIcjd; + ceqbd = here->B4SOIcjs; + csbsp = Idbdp; + cdbdp = Isbsp; + + /* Current going in is +ve */ + ceqbody = -here->B4SOIcbody; + + + ceqgate = here->B4SOIcgate; + gigg = here->B4SOIgigg; + gigb = here->B4SOIgigb; + gige = here->B4SOIgige; /* v3.0 */ + gigs = here->B4SOIgigd; + gigd = here->B4SOIgigs; + gigT = model->B4SOItype * here->B4SOIgigT; + + ceqth = here->B4SOIcth; + ceqbodcon = here->B4SOIcbodcon; + + /* v4.1 */ + gigpg = here->B4SOIgigpg; + gigpp = here->B4SOIgigpp; + ceqgate += (here->B4SOIigp - gigpg * vgp); + if(here->B4SOIbodyMod == 1) + ceqbodcon += (here->B4SOIigp - gigpg * vgp); + else if(here->B4SOIbodyMod == 2) + ceqbody -= (here->B4SOIigp - gigpg * vgp); + + gbbg = -here->B4SOIgbgs; + gbbb = -here->B4SOIgbbs; + gbbp = -here->B4SOIgbps; + gbbsp = -here->B4SOIgbds; + gbbT = -model->B4SOItype * here->B4SOIgbT; + /* v3.0 */ + gbbe = -here->B4SOIgbes; + + if (here->B4SOIrbodyMod) { /* v4.0 */ + gbbsp = -Giid - Ggidld - Ggisls; + gbbb = -Giib + Gbpbs; + gjsdb = Gjsb + Gjdb; + } + gbbdp = - ( gbbg + gbbsp + gbbb + gbbp + gbbe); + + gddpg = -here->B4SOIgjsg; + gddpsp = -here->B4SOIgjsd; + if (!here->B4SOIrbodyMod) + gddpb = -here->B4SOIgjsb; + else + gddpb = 0.0; + gddpT = -model->B4SOItype * here->B4SOIgjsT; + /* v3.0 */ + gddpe = 0.0; + gddpdp = - (gddpg + gddpsp + gddpb + gddpe); + + gsspg = -here->B4SOIgjdg; + gsspsp = -here->B4SOIgjdd; + if (!here->B4SOIrbodyMod) + gsspb = -here->B4SOIgjdb; + else + gsspb = Giib + Ggidlb + Ggislb; + gsspT = -model->B4SOItype * here->B4SOIgjdT; + /* v3.0 */ + gsspe = -here->B4SOIgjde; + gsspdp = - ( gsspg + gsspsp + gsspb + gsspe); + + gppb = -here->B4SOIgbpbs; + gppp = -here->B4SOIgbpps; + + gTtg = here->B4SOIgtempg; + gTtb = here->B4SOIgtempb; + gTtsp = here->B4SOIgtempd; + gTtt = here->B4SOIgtempT; + + /* v3.0 */ + gTte = here->B4SOIgtempe; + gTtdp = - (gTtg + gTtb + gTtsp + gTte); + + /* v3.0 */ + if (model->B4SOIigcMod) + { gIstotg = here->B4SOIgIgsg + here->B4SOIgIgcdg; + gIstotd = here->B4SOIgIgcds; + gIstots = here->B4SOIgIgss + here->B4SOIgIgcdd; + gIstotb = here->B4SOIgIgcdb; + Istoteq = model->B4SOItype * (here->B4SOIIgs + here->B4SOIIgcd + - here->B4SOIgIgsg * vgs - here->B4SOIgIgcdg * vgd + + here->B4SOIgIgcdd * vds - here->B4SOIgIgcdb * vbd); + + gIdtotg = here->B4SOIgIgdg + here->B4SOIgIgcsg; + gIdtotd = here->B4SOIgIgdd + here->B4SOIgIgcss; + gIdtots = here->B4SOIgIgcsd; + gIdtotb = here->B4SOIgIgcsb; + Idtoteq = model->B4SOItype * (here->B4SOIIgd + here->B4SOIIgcs + - (here->B4SOIgIgdg + here->B4SOIgIgcsg) * vgd + + here->B4SOIgIgcsd * vds - here->B4SOIgIgcsb * vbd); + + gIgtotg = gIstotg + gIdtotg; + gIgtotd = gIstotd + gIdtotd; + gIgtots = gIstots + gIdtots; + gIgtotb = gIstotb + gIdtotb; + Igtoteq = Istoteq + Idtoteq; + + } + else + { gIstotg = gIstotd = gIstots = gIstotb = Istoteq = 0.0; + gIdtotg = gIdtotd = gIdtots = gIdtotb = Idtoteq = 0.0; + + gIgtotg = gIgtotd = gIgtots = gIgtotb = Igtoteq = 0.0; + } + + /* v3.1 added for RF */ + if (here->B4SOIrgateMod == 2) + T0 = vges - vgs; + else if (here->B4SOIrgateMod == 3) + T0 = vgms - vgs; + if (here->B4SOIrgateMod > 1) + { + gcrgd = here->B4SOIgcrgs * T0; + gcrgg = here->B4SOIgcrgg * T0; + gcrgs = here->B4SOIgcrgd * T0; + gcrgb = here->B4SOIgcrgb * T0; + ceqgcrg = -(gcrgg * vgd - gcrgs * vds + + gcrgb * vbd); + gcrgg -= here->B4SOIgcrg; + gcrg = here->B4SOIgcrg; + } + else + ceqgcrg = gcrg = gcrgd = gcrgg = gcrgs = gcrgb = 0.0; + /* v3.1 added for RF end */ + + } /* end of soimod<0 */ + + + if (model->B4SOIrdsMod == 1) + { ceqgstot = model->B4SOItype * (here->B4SOIgstotd * vds + + here->B4SOIgstotg * vgs + here->B4SOIgstotb * vbs); + /* ceqgstot flowing away from sNodePrime */ + gstot = here->B4SOIgstot; + gstotd = here->B4SOIgstotd; + gstotg = here->B4SOIgstotg; + gstots = here->B4SOIgstots - gstot; + gstotb = here->B4SOIgstotb; + + ceqgdtot = -model->B4SOItype * (here->B4SOIgdtotd * vds + + here->B4SOIgdtotg * vgs + here->B4SOIgdtotb * vbs); + /* ceqgdtot defined as flowing into dNodePrime */ + gdtot = here->B4SOIgdtot; + gdtotd = here->B4SOIgdtotd - gdtot; + gdtotg = here->B4SOIgdtotg; + gdtots = here->B4SOIgdtots; + gdtotb = here->B4SOIgdtotb; + } + else + { gstot = gstotd = gstotg = gstots + = gstotb = ceqgstot = 0.0; + gdtot = gdtotd = gdtotg = gdtots + = gdtotb = ceqgdtot = 0.0; + } + + if (model->B4SOItype > 0) + { + ceqqg = ceqqg; + ceqqb = ceqqb; + ceqqe = ceqqe; + ceqqd = ceqqd; + } + else + { + ceqbodcon = -ceqbodcon; + ceqbody = -ceqbody; + ceqgate = -ceqgate; + ceqbs = -ceqbs; + ceqbd = -ceqbd; + ceqqg = -ceqqg; + ceqqb = -ceqqb; + ceqqd = -ceqqd; + ceqqe = -ceqqe; + cdbdp = - cdbdp; /* v4.0 */ + csbsp = - csbsp; /* v4.0 */ + + + ceqgcrg = -ceqgcrg; /* v3.1 */ + if (here->B4SOIrgateMod == 3) + ceqqgmid = -ceqqgmid; + + if (here->B4SOIrbodyMod) /* v4.0 */ + { ceqqjs = -ceqqjs; + ceqqjd = -ceqqjd; + } + + } + + m = here->B4SOIm; + + /* v3.1 */ + + /* v3.1 added ceqgcrg for RF */ + (*(ckt->CKTrhs + here->B4SOIgNode) -= m * ((ceqgate + ceqqg) + + Igtoteq - ceqgcrg)); + /* v3.1 added ceqgcrg for RF end */ + + (*(ckt->CKTrhs + here->B4SOIdNodePrime) += m * ((ceqbd - cdreq + - ceqqd) + Idtoteq + /* v4.0 */ + ceqgdtot)); + if (!here->B4SOIrbodyMod) { + (*(ckt->CKTrhs + here->B4SOIsNodePrime) += m * ((cdreq + ceqbs + + ceqqg + ceqqb + ceqqd + ceqqe) + Istoteq + + ceqqgmid - ceqgstot)); /* v4.0 */ + } + else { /* v4.0 */ + (*(ckt->CKTrhs + here->B4SOIsNodePrime) += m * ((cdreq + ceqbs + + ceqqg + ceqqb + ceqqd + ceqqe) + Istoteq + + ceqqgmid + ceqqjd + ceqqjs - ceqgstot)); + } + + (*(ckt->CKTrhs + here->B4SOIeNode) -= m * ceqqe); + + if (here->B4SOIrgateMod == 2) + (*(ckt->CKTrhs + here->B4SOIgNodeExt) -= m * ceqgcrg); + else if (here->B4SOIrgateMod == 3) + (*(ckt->CKTrhs + here->B4SOIgNodeMid) -= m * (ceqqgmid + + ceqgcrg)); + + if (here->B4SOIbodyMod == 1) { + (*(ckt->CKTrhs + here->B4SOIpNode) += m * ceqbodcon); + } + + if ( here->B4SOIsoiMod != 2 ) + {if (!here->B4SOIrbodyMod) + (*(ckt->CKTrhs + here->B4SOIbNode) -= m * (ceqbody + ceqqb)); + else /* v4.0 */ + { (*(ckt->CKTrhs + here->B4SOIdbNode) -= m * (cdbdp + ceqqjd)); + (*(ckt->CKTrhs + here->B4SOIbNode) -= m * (ceqbody + ceqqb)); + (*(ckt->CKTrhs + here->B4SOIsbNode) -= m * (csbsp + ceqqjs)); + } + } + + if (selfheat) { + (*(ckt->CKTrhs + here->B4SOItempNode) -= m * (ceqth + ceqqth)); + } + + if (model->B4SOIrdsMod) + { (*(ckt->CKTrhs + here->B4SOIdNode) -= m * ceqgdtot); + (*(ckt->CKTrhs + here->B4SOIsNode) += m * ceqgstot); + } + + if (here->B4SOIdebugMod != 0) + { + *(ckt->CKTrhs + here->B4SOIvbsNode) = here->B4SOIvbseff; + *(ckt->CKTrhs + here->B4SOIidsNode) = FLOG(here->B4SOIids); + *(ckt->CKTrhs + here->B4SOIicNode) = FLOG(here->B4SOIic); + *(ckt->CKTrhs + here->B4SOIibsNode) = FLOG(here->B4SOIibs); + *(ckt->CKTrhs + here->B4SOIibdNode) = FLOG(here->B4SOIibd); + *(ckt->CKTrhs + here->B4SOIiiiNode) = FLOG(here->B4SOIiii); + *(ckt->CKTrhs + here->B4SOIigNode) = here->B4SOIig; + *(ckt->CKTrhs + here->B4SOIgiggNode) = here->B4SOIgigg; + *(ckt->CKTrhs + here->B4SOIgigdNode) = here->B4SOIgigd; + *(ckt->CKTrhs + here->B4SOIgigbNode) = here->B4SOIgigb; + *(ckt->CKTrhs + here->B4SOIigidlNode) = here->B4SOIigidl; + *(ckt->CKTrhs + here->B4SOIitunNode) = here->B4SOIitun; + *(ckt->CKTrhs + here->B4SOIibpNode) = here->B4SOIibp; + *(ckt->CKTrhs + here->B4SOIcbbNode) = here->B4SOIcbb; + *(ckt->CKTrhs + here->B4SOIcbdNode) = here->B4SOIcbd; + *(ckt->CKTrhs + here->B4SOIcbgNode) = here->B4SOIcbg; + *(ckt->CKTrhs + here->B4SOIqbfNode) = here->B4SOIqbf; + *(ckt->CKTrhs + here->B4SOIqjsNode) = here->B4SOIqjs; + *(ckt->CKTrhs + here->B4SOIqjdNode) = here->B4SOIqjd; + + } + + if (!model->B4SOIrdsMod) + { gdpr = here->B4SOIdrainConductance; + gspr = here->B4SOIsourceConductance; + } + else + gdpr = gspr = 0.0; /* v4.0 */ + + /* + * load y matrix + */ + Gmin = ckt->CKTgmin * 1e-6; + + /* v3.1 added for RF */ + geltd = here->B4SOIgrgeltd; + if (here->B4SOIrgateMod == 1) + { + *(here->B4SOIGEgePtr) += m * geltd; + *(here->B4SOIGgePtr) -= m * geltd; + *(here->B4SOIGEgPtr) -= m * geltd; + } + else if (here->B4SOIrgateMod == 2) + { + *(here->B4SOIGEgePtr) += m * gcrg; + *(here->B4SOIGEgPtr) += m * gcrgg; + *(here->B4SOIGEdpPtr) += m * gcrgd; + *(here->B4SOIGEspPtr) += m * gcrgs; + *(here->B4SOIGgePtr) -= m * gcrg; + if (here->B4SOIsoiMod !=2) /* v3.2 */ + *(here->B4SOIGEbPtr) += m * gcrgb; + } + else if (here->B4SOIrgateMod == 3) + { + *(here->B4SOIGEgePtr) += m * geltd; + *(here->B4SOIGEgmPtr) -= m * geltd; + *(here->B4SOIGMgePtr) -= m * geltd; + *(here->B4SOIGMgmPtr) += m * (geltd + gcrg + gcgmgmb); + + *(here->B4SOIGMdpPtr) += m * (gcrgd + gcgmdb); + *(here->B4SOIGMgPtr) += m * gcrgg; + *(here->B4SOIGMspPtr) += m * (gcrgs + gcgmsb); + *(here->B4SOIGMePtr) += m * gcgmeb; + if (here->B4SOIsoiMod !=2) /* v3.2 */ + *(here->B4SOIGMbPtr) += m * gcrgb; + + *(here->B4SOIDPgmPtr) += m * gcdgmb; + *(here->B4SOIGgmPtr) -= m * gcrg; + *(here->B4SOISPgmPtr) += m * gcsgmb; + *(here->B4SOIEgmPtr) += m * gcegmb; + } + /* v3.1 added for RF end*/ + + + /* v3.0 */ + if (here->B4SOIsoiMod != 0) /* v3.2 */ + { + (*(here->B4SOIDPePtr) += m * (Gme + gddpe)); + (*(here->B4SOISPePtr) += m * (gsspe - Gme)); + + if (here->B4SOIsoiMod != 2) /* v3.2 */ + { + *(here->B4SOIGePtr) += m * gige; + *(here->B4SOIBePtr) -= m * gige; + } + } + + *(here->B4SOIEdpPtr) += m * gcedb; + *(here->B4SOIEspPtr) += m * gcesb; + *(here->B4SOIDPePtr) += m * gcdeb; + *(here->B4SOISPePtr) += m * gcseb; + *(here->B4SOIEgPtr) += m * gcegb; + *(here->B4SOIGePtr) += m * gcgeb; + + /* v3.1 */ + if (here->B4SOIsoiMod != 2) /* v3.2 */ + { + (*(here->B4SOIEbPtr) -= m * (gcegb + gcedb + gcesb + gceeb + gcegmb)); /* 3.2 bug fix */ + + /* v3.1 changed GbPtr for RF */ + if ((here->B4SOIrgateMod == 0) || (here->B4SOIrgateMod == 1)) + (*(here->B4SOIGbPtr) -= m * (-gigb + gcggb + gcgdb + gcgsb + + gcgeb - gIgtotb)); + else /* v3.1 for rgateMod = 2 or 3 */ + *(here->B4SOIGbPtr) += m * (gigb + gcgbb +gIgtotb - gcrgb); + + + (*(here->B4SOIDPbPtr) -= m * (-gddpb - Gmbs - gcdbb + gdtotb + + gIdtotb)); /* v4.0 */ + +/* (*(here->B4SOIDPbPtr) -= (-gddpb - Gmbs + gcdgb + gcddb + + gcdeb + gcdsb) + gcdgmb + + gIdtotb ); +*/ + + (*(here->B4SOISPbPtr) -= m * (-gsspb + Gmbs - gcsbb + gstotb + + Gmin + gIstotb)); /* v4.0 */ + +/* (*(here->B4SOISPbPtr) -= (-gsspb + Gmbs + gcsgb + gcsdb + + gcseb + gcssb) + gcsgmb + + Gmin + gIstotb); +*/ + (*(here->B4SOIBePtr) += m * (gbbe + gcbeb)); /* v3.0 */ + (*(here->B4SOIBgPtr) += m * (-gigg + gcbgb + gbbg)); + (*(here->B4SOIBdpPtr) += m * (-gigd + gcbdb + gbbdp)); + + (*(here->B4SOIBspPtr) += m * (gcbsb + gbbsp - Gmin + - gigs)); +/* if (!here->B4SOIrbodyMod) +*/ + (*(here->B4SOIBbPtr) += m * (-gigb + gbbb - gcbgb - gcbdb + - gcbsb - gcbeb + Gmin)) ; +/* else + (*(here->B4SOIBbPtr) += -gigb - (Giib - Gbpbs) - gcbgb + - gcbdb - gcbsb - gcbeb + Gmin) ; +*/ + /* v4.0 */ + if (here->B4SOIrbodyMod) { + (*(here->B4SOIDPdbPtr) += m * (-gcjdbdp - GGjdb)); + (*(here->B4SOISPsbPtr) += m * (-gcjsbsp - GGjsb)); + (*(here->B4SOIDBdpPtr) += m * (-gcjdbdp - GGjdb)); + (*(here->B4SOIDBdbPtr) += m * (gcjdbdp + GGjdb + + here->B4SOIgrbdb)); + (*(here->B4SOIDBbPtr) -= m * here->B4SOIgrbdb); + (*(here->B4SOISBspPtr) += m * (-gcjsbsp - GGjsb)); + (*(here->B4SOISBbPtr) -= m * here->B4SOIgrbsb); + (*(here->B4SOISBsbPtr) += m * (gcjsbsp + GGjsb + + here->B4SOIgrbsb)); + (*(here->B4SOIBdbPtr) -= m * here->B4SOIgrbdb); + (*(here->B4SOIBsbPtr) -= m * here->B4SOIgrbsb); + (*(here->B4SOIBbPtr) += m * (here->B4SOIgrbsb + + here->B4SOIgrbdb)); + } + if (model->B4SOIrdsMod) + { + (*(here->B4SOIDbPtr) += m * gdtotb); + (*(here->B4SOISbPtr) += m * gstotb); + } + + } + /* v3.1 */ + if (model->B4SOIrdsMod) + { (*(here->B4SOIDgPtr) += m * gdtotg); + (*(here->B4SOIDspPtr) += m * gdtots); + (*(here->B4SOISdpPtr) += m * gstotd); + (*(here->B4SOISgPtr) += m * gstotg); + } + + (*(here->B4SOIEePtr) += m * gceeb); + + if (here->B4SOIrgateMod == 0) + { + (*(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin + + gIgtotg)); + (*(here->B4SOIGdpPtr) += m * (gigd + gcgdb - Gmin + + gIgtotd)); + (*(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots)); + } + else if (here->B4SOIrgateMod == 1) /* v3.1 for RF */ + { + *(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin + + gIgtotg + geltd); + *(here->B4SOIGdpPtr) += m * (gigd + gcgdb - Gmin + + gIgtotd); + *(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots); + } + else /* v3.1 for RF rgateMod == 2 or 3 */ + { + *(here->B4SOIGgPtr) += m * (gigg + gcggb + Gmin + + gIgtotg - gcrgg); + *(here->B4SOIGdpPtr) += m * (gigd + gcgdb - Gmin + + gIgtotd - gcrgd); + *(here->B4SOIGspPtr) += m * (gcgsb + gigs + gIgtots - gcrgs); + } + + + (*(here->B4SOIDPgPtr) += m * ((Gm + gcdgb) + gddpg - Gmin + - gIdtotg - gdtotg)); /* v4.0 */ + (*(here->B4SOIDPdpPtr) += m * ((gdpr + here->B4SOIgds + gddpdp + + RevSum + gcddb) + Gmin + - gIdtotd - gdtotd)); /* v4.0 */ + (*(here->B4SOIDPspPtr) -= m * ((-gddpsp + here->B4SOIgds + FwdSum + - gcdsb) + gIdtots + gdtots)); + + (*(here->B4SOIDPdPtr) -= m * (gdpr + gdtot)); + + (*(here->B4SOISPgPtr) += m * (gcsgb - Gm + gsspg - gIstotg + - gstotg)); /* v4.0 */ + (*(here->B4SOISPdpPtr) -= m * ((here->B4SOIgds - gsspdp + RevSum + - gcsdb + gIstotd) + gstotd)); /* v4.0 */ + + (*(here->B4SOISPspPtr) += m * ((gspr - gstots + + here->B4SOIgds + gsspsp + + FwdSum + gcssb) + + Gmin - gIstots)); /* v4.0 */ + + (*(here->B4SOISPsPtr) -= m * (gspr + gstot)); + + + (*(here->B4SOIDdPtr) += m * (gdpr + gdtot)); + (*(here->B4SOIDdpPtr) -= m * (gdpr - gdtotd)); + + + (*(here->B4SOISsPtr) += m * (gspr + gstot)); + (*(here->B4SOISspPtr) -= m * (gspr - gstots)); + + + if (here->B4SOIbodyMod == 1) { + (*(here->B4SOIBpPtr) -= m * gppp); + (*(here->B4SOIPbPtr) += m * gppb); + (*(here->B4SOIPpPtr) += m * gppp); + } + + /* v4.1 Ig_agbcp2 stamping */ + (*(here->B4SOIGgPtr) += gigpg); + if (here->B4SOIbodyMod == 1) { + (*(here->B4SOIPpPtr) -= m * gigpp); + (*(here->B4SOIPgPtr) -= m * gigpg); + (*(here->B4SOIGpPtr) += m * gigpp); + } + else if(here->B4SOIbodyMod == 2) + { + (*(here->B4SOIBbPtr) -= m * gigpp); + (*(here->B4SOIBgPtr) -= m * gigpg); + (*(here->B4SOIGbPtr) += m * gigpp); + } + + + if (selfheat) + { + (*(here->B4SOIDPtempPtr) += m * (GmT + gddpT + gcdT)); + (*(here->B4SOISPtempPtr) += m * (-GmT + gsspT + gcsT)); + (*(here->B4SOIBtempPtr) += m * (gbbT + gcbT - gigT)); + (*(here->B4SOIEtempPtr) += m * gceT); + (*(here->B4SOIGtempPtr) += m * (gcgT + gigT)); + (*(here->B4SOITemptempPtr) += m * (gTtt + 1/pParam->B4SOIrth + gcTt)); + (*(here->B4SOITempgPtr) += m * gTtg); + (*(here->B4SOITempbPtr) += m * gTtb); + (*(here->B4SOITempdpPtr) += m * gTtdp); + (*(here->B4SOITempspPtr) += m * gTtsp); + + /* v3.0 */ + if (here->B4SOIsoiMod != 0) /* v3.2 */ + (*(here->B4SOITempePtr) += m * gTte); + + } + + if (here->B4SOIdebugMod != 0) + { + *(here->B4SOIVbsPtr) += 1; + *(here->B4SOIIdsPtr) += 1; + *(here->B4SOIIcPtr) += 1; + *(here->B4SOIIbsPtr) += 1; + *(here->B4SOIIbdPtr) += 1; + *(here->B4SOIIiiPtr) += 1; + *(here->B4SOIIgPtr) += 1; + *(here->B4SOIGiggPtr) += 1; + *(here->B4SOIGigdPtr) += 1; + *(here->B4SOIGigbPtr) += 1; + *(here->B4SOIIgidlPtr) += 1; + *(here->B4SOIItunPtr) += 1; + *(here->B4SOIIbpPtr) += 1; + *(here->B4SOICbgPtr) += 1; + *(here->B4SOICbbPtr) += 1; + *(here->B4SOICbdPtr) += 1; + *(here->B4SOIQbfPtr) += 1; + *(here->B4SOIQjsPtr) += 1; + *(here->B4SOIQjdPtr) += 1; + } + +line1000: ; + + + } /* End of Mosfet Instance */ + } /* End of Model Instance */ + + + return(OK); } diff --git a/src/spicelib/devices/bsim3soi/b4soimask.c b/src/spicelib/devices/bsim3soi/b4soimask.c index 3ff132af9..09e760bdd 100644 --- a/src/spicelib/devices/bsim3soi/b4soimask.c +++ b/src/spicelib/devices/bsim3soi/b4soimask.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soimask.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" @@ -1229,10 +1232,10 @@ IFvalue *value) value->iValue = model->B4SOIrgateMod; return(OK); case B4SOI_MOD_XRCRG1: - value->iValue = model->B4SOIxrcrg1; + value->rValue = model->B4SOIxrcrg1; return(OK); case B4SOI_MOD_XRCRG2: - value->iValue = model->B4SOIxrcrg2; + value->rValue = model->B4SOIxrcrg2; return(OK); case B4SOI_MOD_RSHG: value->rValue = model->B4SOIrshg; diff --git a/src/spicelib/devices/bsim3soi/b4soimdel.c b/src/spicelib/devices/bsim3soi/b4soimdel.c index b880e328f..4ef6bc51a 100644 --- a/src/spicelib/devices/bsim3soi/b4soimdel.c +++ b/src/spicelib/devices/bsim3soi/b4soimdel.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soimdel.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" diff --git a/src/spicelib/devices/bsim3soi/b4soimpar.c b/src/spicelib/devices/bsim3soi/b4soimpar.c index a0e01d5c1..21fb42961 100644 --- a/src/spicelib/devices/bsim3soi/b4soimpar.c +++ b/src/spicelib/devices/bsim3soi/b4soimpar.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soimpar.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" @@ -217,20 +220,21 @@ GENmodel *inMod) case B4SOI_MOD_NPEAK: mod->B4SOInpeak = value->rValue; mod->B4SOInpeakGiven = TRUE; - if (mod->B4SOInpeak > 1.0e20) - mod->B4SOInpeak *= 1.0e-6; + /* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/ + /* if (mod->B4SOInpeak > 1.0e20) + mod->B4SOInpeak *= 1.0e-6; */ break; case B4SOI_MOD_NSD: mod->B4SOInsd = value->rValue; mod->B4SOInsdGiven = TRUE; - if (mod->B4SOInsd > 1.0e23) - mod->B4SOInsd *= 1.0e-6; + /* if (mod->B4SOInsd > 1.0e23) + mod->B4SOInsd *= 1.0e-6; */ /* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/ break; case B4SOI_MOD_NGATE: mod->B4SOIngate = value->rValue; mod->B4SOIngateGiven = TRUE; - if (mod->B4SOIngate > 1.0e23) - mod->B4SOIngate *= 1.0e-6; + /* if (mod->B4SOIngate > 1.0e23) + mod->B4SOIngate *= 1.0e-6; */ /* Bug # 22 Jul09 Proper limiting conditions are specified in the B4SOIcheck.c file*/ break; case B4SOI_MOD_GAMMA1: mod->B4SOIgamma1 = value->rValue; @@ -428,6 +432,7 @@ case B4SOI_MOD_UD: case B4SOI_MOD_PUCS: mod->B4SOIpucs = value->rValue; mod->B4SOIpucsGiven = TRUE; + break; /* Bug fix # 31 Jul09 */ case B4SOI_MOD_UCSTE: mod->B4SOIucste = value->rValue; mod->B4SOIucsteGiven = TRUE; @@ -659,8 +664,9 @@ case B4SOI_MOD_UD: mod->B4SOIfgislGiven = TRUE; break; case B4SOI_MOD_FDMOD : - mod->B4SOIfdMod = value->rValue; - mod->B4SOIfdModGiven = TRUE; + /* mod->B4SOIfdMod = value->rValue; v4.2 */ + mod->B4SOIfdMod = value->iValue; + mod->B4SOIfdModGiven = TRUE; break; case B4SOI_MOD_VSCE : mod->B4SOIvsce = value->rValue; @@ -1167,7 +1173,8 @@ case B4SOI_MOD_UD: case B4SOI_MOD_RBDB : mod->B4SOIrbdb = value->rValue; mod->B4SOIrbdbGiven = TRUE; - case B4SOI_MOD_RBSB : + break; /* Bug fix # 31 Jul 09 */ + case B4SOI_MOD_RBSB : mod->B4SOIrbsb = value->rValue; mod->B4SOIrbsbGiven = TRUE; break; @@ -1402,7 +1409,8 @@ case B4SOI_MOD_UD: case B4SOI_MOD_LODK2 : mod->B4SOIlodk2 = value->rValue; mod->B4SOIlodk2Given = TRUE; - case B4SOI_MOD_STETA0 : + break; /* Bug fix # 31 Jul 09*/ + case B4SOI_MOD_STETA0 : mod->B4SOIsteta0 = value->rValue; mod->B4SOIsteta0Given = TRUE; break; diff --git a/src/spicelib/devices/bsim3soi/b4soinoi.c b/src/spicelib/devices/bsim3soi/b4soinoi.c index 7f46218ca..3a7817dad 100644 --- a/src/spicelib/devices/bsim3soi/b4soinoi.c +++ b/src/spicelib/devices/bsim3soi/b4soinoi.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soinoi.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" @@ -60,7 +63,7 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; pParam = here->pParam; cd = fabs(here->B4SOIcd); - esat = 2.0 * pParam->B4SOIvsattemp / here->B4SOIueff; + esat = 2.0 * here->B4SOIvsattemp / here->B4SOIueff; /* v2.2.3 bug fix */ if(model->B4SOIem<=0.0) DelClm = 0.0; else { @@ -79,7 +82,6 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; Nl = model->B4SOIcox * here->B4SOIVgsteff * (1.0 - here->B4SOIAbovVgst2Vtm * here->B4SOIVdseff) / CHARGE; - T3 = model->B4SOIoxideTrapDensityA * log(MAX(((N0 + here->B4SOInstar) / (Nl + here->B4SOInstar)), N_MINLOG)); T4 = model->B4SOIoxideTrapDensityB * (N0 - Nl); @@ -122,6 +124,7 @@ double Ssi, Swi; double npart_theta, npart_beta, igsquare, esat; /* v3.2 end */ double gspr, gdpr; +double tempRatioSH, Vdseffovcd; /* v4.2 bugfix */ int i; @@ -218,8 +221,22 @@ int i; case N_CALC: switch (mode) { case N_DENS: - if (model->B4SOItnoiMod == 0) /* v4.0 */ - { if (model->B4SOIrdsMod == 0) + /*v4.2 implementing SH temp */ + if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0)) + tempRatioSH = here->B4SOITempSH / ckt->CKTtemp; + else + tempRatioSH = 1.0; + /*v4.2 implementing limit on Vdseffovcd*/ + if (here->B4SOIcd != 0) + { + Vdseffovcd = here->B4SOIVdseff / here->B4SOIcd; + if (Vdseffovcd >= 1.0e9) Vdseffovcd = 1.0e9 ; + } + else + Vdseffovcd = 1.0e9; + /* if (model->B4SOItnoiMod == 0) */ /* v4.0 */ /* v4.2 bugfix: consider tnoiMod = 2*/ + if (model->B4SOItnoiMod != 1) + { if (model->B4SOIrdsMod == 0) { gspr = here->B4SOIsourceConductance; gdpr = here->B4SOIdrainConductance; } @@ -230,8 +247,8 @@ int i; } else { - esat = 2.0 * pParam->B4SOIvsattemp / here->B4SOIueff; - T5 = here->B4SOIVgsteff / esat + esat = 2.0 * here->B4SOIvsattemp / here->B4SOIueff; + T5 = here->B4SOIVgsteff / esat / pParam->B4SOIleff; T5 *= T5; npart_beta = model->B4SOIrnoia * (1.0 + @@ -241,6 +258,13 @@ int i; T5 * model->B4SOItnoib * pParam->B4SOIleff); + /* v4.2 bugfix: implement bugfix from bsim4.6.2 */ + if(npart_theta > 0.9) + npart_theta = 0.9; + if(npart_theta > 0.9 * npart_beta) + npart_theta = 0.9 * npart_beta; + + if (model->B4SOIrdsMod == 0) { gspr = here->B4SOIsourceConductance; gdpr = here->B4SOIdrainConductance; @@ -263,27 +287,39 @@ int i; NevalSrc(&noizDens[B4SOIRDNOIZ], &lnNdens[B4SOIRDNOIZ], ckt, THERMNOISE, here->B4SOIdNodePrime, here->B4SOIdNode, - gdpr * here->B4SOIm); + gdpr * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */ NevalSrc(&noizDens[B4SOIRSNOIZ], &lnNdens[B4SOIRSNOIZ], ckt, THERMNOISE, here->B4SOIsNodePrime, here->B4SOIsNode, - gspr * here->B4SOIm); + gspr * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */ - if ((here->B4SOIrgateMod == 1) || - (here->B4SOIrgateMod == 2)) + /* v4.2 bugfix: implement correct thermal noise model (bsim4.6.0)*/ + /* if ((here->B4SOIrgateMod == 1) || + (here->B4SOIrgateMod == 2)) */ + if (here->B4SOIrgateMod == 1) { NevalSrc(&noizDens[B4SOIRGNOIZ], &lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE, here->B4SOIgNode, here->B4SOIgNodeExt, - here->B4SOIgrgeltd); + here->B4SOIgrgeltd * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */ + } + else if (here->B4SOIrgateMod == 2) /*v4.2*/ + { + T0 = 1.0 + here->B4SOIgrgeltd/here->B4SOIgcrg; + T1 = T0 * T0; + NevalSrc(&noizDens[B4SOIRGNOIZ], + &lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE, + here->B4SOIgNode, + here->B4SOIgNodeExt, + here->B4SOIgrgeltd/T1 * tempRatioSH * here->B4SOIm); /*v4.2*/ } else if (here->B4SOIrgateMod == 3) { NevalSrc(&noizDens[B4SOIRGNOIZ], &lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE, here->B4SOIgNodeMid, here->B4SOIgNodeExt, - here->B4SOIgrgeltd); + here->B4SOIgrgeltd * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */ } else { noizDens[B4SOIRGNOIZ] = 0.0; @@ -297,11 +333,11 @@ int i; NevalSrc(&noizDens[B4SOIRBSBNOIZ], &lnNdens[B4SOIRBSBNOIZ], ckt, THERMNOISE, here->B4SOIbNode, here->B4SOIsbNode, - here->B4SOIgrbsb); + here->B4SOIgrbsb * here->B4SOIm); NevalSrc(&noizDens[B4SOIRBDBNOIZ], &lnNdens[B4SOIRBDBNOIZ], ckt, THERMNOISE, here->B4SOIbNode, here->B4SOIdbNode, - here->B4SOIgrbdb); + here->B4SOIgrbdb * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */ } else { noizDens[B4SOIRBSBNOIZ] = 0.0; @@ -317,15 +353,15 @@ int i; NevalSrc(&noizDens[B4SOIRBODYNOIZ], &lnNdens[B4SOIRBODYNOIZ], ckt, THERMNOISE, here->B4SOIbNode, here->B4SOIpNode, - 1/ (here->B4SOIrbodyext + - pParam->B4SOIrbody)); + tempRatioSH / (here->B4SOIrbodyext + /* v4.2 self-heating temp */ + pParam->B4SOIrbody) * here->B4SOIm); } else { noizDens[B4SOIRBODYNOIZ] = 0.0; lnNdens[B4SOIRBODYNOIZ] = log(MAX(noizDens[B4SOIRBODYNOIZ], N_MINLOG)); } - + switch( model->B4SOItnoiMod ) { case 0: @@ -341,7 +377,8 @@ int i; + here->B4SOIueff*fabs (here->B4SOIqinv) * here->B4SOIrds))) - * model->B4SOIntnoi ); + * tempRatioSH /* v4.2 self-heating temp */ + * model->B4SOIntnoi * here->B4SOIm); break; /* v2.2.3 bug fix */ @@ -349,7 +386,7 @@ int i; T0 = here->B4SOIgm + here->B4SOIgmbs + here->B4SOIgds; T0 *= T0; - esat = 2.0 * pParam->B4SOIvsattemp / + esat = 2.0 * here->B4SOIvsattemp / here->B4SOIueff; T5 = here->B4SOIVgsteff / esat / pParam->B4SOIleff; @@ -360,20 +397,20 @@ int i; npart_theta = model->B4SOIrnoib * (1.0 + T5 * model->B4SOItnoib * pParam->B4SOIleff); - igsquare = npart_theta * npart_theta * - T0 * here->B4SOIVdseff / - here->B4SOIcd; + /*igsquare = npart_theta * npart_theta * + T0 * here->B4SOIVdseff / here->B4SOIcd; v4.2 implementing limit on Vdseffovcd*/ + igsquare = npart_theta * npart_theta * T0 * Vdseffovcd; T1 = npart_beta * (here->B4SOIgm + here->B4SOIgmbs) + here->B4SOIgds; - T2 = T1 * T1 * here->B4SOIVdseff / - here->B4SOIcd; - + /*T2 = T1 * T1 * here->B4SOIVdseff / here->B4SOIcd; v4.2 implementing limit on Vdseffovcd*/ + T2 = T1 * T1 * Vdseffovcd; NevalSrc(&noizDens[B4SOIIDNOIZ], &lnNdens[B4SOIIDNOIZ], ckt, THERMNOISE, here->B4SOIdNodePrime, here->B4SOIsNodePrime, - (T2 - igsquare)); + /* (T2 - igsquare)); */ + (T2 - igsquare) * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */ break; case 2: @@ -383,9 +420,10 @@ int i; here->B4SOIdNodePrime, here->B4SOIsNodePrime, model->B4SOIntnoi * + tempRatioSH * /* v4.2 self-heating temp */ (2.0 / 3.0 * fabs(here->B4SOIgm + here->B4SOIgds - + here->B4SOIgmbs))); + + here->B4SOIgmbs)) * here->B4SOIm); break; } @@ -423,13 +461,23 @@ int i; { vds = -vds; vgs = vgs + vds; } - - Ssi = B4SOIEval1ovFNoise(vds, model, here, - data->freq, ckt->CKTtemp); - - T10 = model->B4SOIoxideTrapDensityA - * CONSTboltz * ckt->CKTtemp; - T11 = pParam->B4SOIweff * here->B4SOInf + /*v4.2 implementing SH temp */ + if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0)) + Ssi = B4SOIEval1ovFNoise(vds, model, here, + data->freq, here->B4SOITempSH); + else + Ssi = B4SOIEval1ovFNoise(vds, model, here, + data->freq, ckt->CKTtemp); /*v4.2 implementing SH temp */ + + /*v4.2 implementing SH temp */ + if ((model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0)) + T10 = model->B4SOIoxideTrapDensityA + * CONSTboltz * here->B4SOITempSH; + else + T10 = model->B4SOIoxideTrapDensityA + * CONSTboltz * ckt->CKTtemp; /*v4.2 implementing SH temp */ + + T11 = pParam->B4SOIweff * here->B4SOInf * pParam->B4SOIleff * pow(data->freq, model->B4SOIef) * 1.0e10 * here->B4SOInstar @@ -476,12 +524,17 @@ int i; here->B4SOIsNodePrime, here->B4SOIbNode, model->B4SOInoif * here->B4SOIibs * here->B4SOIm); - NevalSrc(&noizDens[B4SOIFB_IBDNOIZ], + /* NevalSrc(&noizDens[B4SOIFB_IBDNOIZ], &lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE, here->B4SOIdNodePrime, here->B4SOIbNode, - model->B4SOInoif * fabs(here->B4SOIibd) * here->B4SOIm); + model->B4SOInoif * fabs(here->B4SOIibd)); */ /*v4.2*/ - noizDens[B4SOITOTNOIZ] = noizDens[B4SOIRDNOIZ] + NevalSrc(&noizDens[B4SOIFB_IBDNOIZ], + &lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE, + here->B4SOIdNodePrime, here->B4SOIbNode, + model->B4SOInoif * (here->B4SOIibd) * here->B4SOIm); /*v4.2 extra fabs()removed */ + + noizDens[B4SOITOTNOIZ] = noizDens[B4SOIRDNOIZ] + noizDens[B4SOIRSNOIZ] + noizDens[B4SOIRGNOIZ] + noizDens[B4SOIIDNOIZ] diff --git a/src/spicelib/devices/bsim3soi/b4soipar.c b/src/spicelib/devices/bsim3soi/b4soipar.c index 80800d54b..a7b76134c 100644 --- a/src/spicelib/devices/bsim3soi/b4soipar.c +++ b/src/spicelib/devices/bsim3soi/b4soipar.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soipar.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" @@ -208,15 +211,19 @@ IFvalue *select) case 5: here->B4SOIicVPS = *(value->v.vec.rVec+4); here->B4SOIicVPSGiven = TRUE; + break; /* v4.2 bugfix */ case 4: here->B4SOIicVES = *(value->v.vec.rVec+3); here->B4SOIicVESGiven = TRUE; + break; /* v4.2 bugfix */ case 3: here->B4SOIicVBS = *(value->v.vec.rVec+2); here->B4SOIicVBSGiven = TRUE; + break; /* v4.2 bugfix */ case 2: here->B4SOIicVGS = *(value->v.vec.rVec+1); here->B4SOIicVGSGiven = TRUE; + break; /* v4.2 bugfix */ case 1: here->B4SOIicVDS = *(value->v.vec.rVec); here->B4SOIicVDSGiven = TRUE; diff --git a/src/spicelib/devices/bsim3soi/b4soipzld.c b/src/spicelib/devices/bsim3soi/b4soipzld.c index 55ffb25be..4be0ca80b 100644 --- a/src/spicelib/devices/bsim3soi/b4soipzld.c +++ b/src/spicelib/devices/bsim3soi/b4soipzld.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soipzld.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" @@ -37,7 +40,7 @@ double m; for (; model != NULL; model = model->B4SOInextModel) { for (here = model->B4SOIinstances; here!= NULL; here = here->B4SOInextInstance) - { + { if (here->B4SOImode >= 0) { @@ -45,9 +48,9 @@ double m; continue; Gm = here->B4SOIgm; - Gmbs = here->B4SOIgmbs; - FwdSum = Gm + Gmbs; - RevSum = 0.0; + Gmbs = here->B4SOIgmbs; + FwdSum = Gm + Gmbs; + RevSum = 0.0; cggb = here->B4SOIcggb; cgsb = here->B4SOIcgsb; cgdb = here->B4SOIcgdb; @@ -60,11 +63,11 @@ double m; cdsb = here->B4SOIcdsb; cddb = here->B4SOIcddb; } - else - { Gm = -here->B4SOIgm; - Gmbs = -here->B4SOIgmbs; - FwdSum = 0.0; - RevSum = -Gm - Gmbs; + else + { Gm = -here->B4SOIgm; + Gmbs = -here->B4SOIgmbs; + FwdSum = 0.0; + RevSum = -Gm - Gmbs; cggb = here->B4SOIcggb; cgsb = here->B4SOIcgdb; cgdb = here->B4SOIcgsb; @@ -86,10 +89,10 @@ double m; capbd= here->B4SOIcapbd; capbs= here->B4SOIcapbs; #endif - GSoverlapCap = here->B4SOIcgso; - GDoverlapCap = here->B4SOIcgdo; + GSoverlapCap = here->B4SOIcgso; + GDoverlapCap = here->B4SOIcgdo; #ifdef BULKCODE - GBoverlapCap = here->pParam->B4SOIcgbo; + GBoverlapCap = here->pParam->B4SOIcgbo; #endif xcdgb = (cdgb - GDoverlapCap); diff --git a/src/spicelib/devices/bsim3soi/b4soiset.c b/src/spicelib/devices/bsim3soi/b4soiset.c index 935953ed0..a5fffc8ce 100644 --- a/src/spicelib/devices/bsim3soi/b4soiset.c +++ b/src/spicelib/devices/bsim3soi/b4soiset.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soiset.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" @@ -61,11 +64,14 @@ double Vbs0t, Qsi; model->B4SOIparamChk = 0; if (!model->B4SOIcapModGiven) model->B4SOIcapMod = 2; + if (!model->B4SOIiiiModGiven) /* Bug fix #7 Jun 09 'iiimod' with default value added */ + model->B4SOIiiiMod = 0; if (!model->B4SOImtrlModGiven) model->B4SOImtrlMod = 0; /*4.1*/ if (!model->B4SOIvgstcvModGiven) - model->B4SOIvgstcvMod = 0; + /*model->B4SOIvgstcvMod = 0; v4.2 Bugfix */ + model->B4SOIvgstcvMod = 1; if (!model->B4SOIgidlModGiven) model->B4SOIgidlMod = 0; if (!model->B4SOIeotGiven) @@ -307,7 +313,8 @@ double Vbs0t, Qsi; if (!model->B4SOIwudGiven) model->B4SOIwud = 0.0; if (!model->B4SOIpudGiven) - model->B4SOIpud1 = 0.0; + /* model->B4SOIpud1 = 0.0; */ /*Bug fix # 33 Jul 09 */ + model->B4SOIpud = 0.0; if (!model->B4SOIud1Given) model->B4SOIud1 = 0.0; if (!model->B4SOIlud1Given) @@ -422,7 +429,7 @@ double Vbs0t, Qsi; if (!model->B4SOIbgidlGiven) model->B4SOIbgidl = 2.3e9; /* v4.0 */ if (!model->B4SOIcgidlGiven) /* v4.0 */ - model->B4SOIcgidl = 0.0; + model->B4SOIcgidl = 0.5; /* v4.2 default value changed from 0 to 0.5 */ if (!model->B4SOIrgidlGiven) /* v4.1 */ model->B4SOIrgidl = 1.0; if (!model->B4SOIkgidlGiven) /* v4.1 */ @@ -2041,8 +2048,7 @@ double Vbs0t, Qsi; model->B4SOIvsce = 0.0; if (!model->B4SOIcdsbsGiven) model->B4SOIcdsbs = 0.0; - - if (!model->B4SOIminvcvGiven) /* v4.1 for Vgsteffcv */ + if (!model->B4SOIminvcvGiven) /* v4.1 for Vgsteffcv */ model->B4SOIminvcv = 0.0; if (!model->B4SOIlminvcvGiven) /* v4.1 for Vgsteffcv */ model->B4SOIlminvcv = 0.0; @@ -2051,7 +2057,8 @@ double Vbs0t, Qsi; if (!model->B4SOIpminvcvGiven) /* v4.1 for Vgsteffcv */ model->B4SOIpminvcv = 0.0; if (!model->B4SOIvoffcvGiven) - model->B4SOIvoffcv = -0.08; + /*model->B4SOIvoffcv = -0.08; v4.2 */ + model->B4SOIvoffcv = 0.0; if (!model->B4SOIlvoffcvGiven) model->B4SOIlvoffcv = 0.0; if (!model->B4SOIwvoffcvGiven) @@ -2103,10 +2110,8 @@ double Vbs0t, Qsi; here->B4SOIsourceSquares = 1; if (!here->B4SOIwGiven) here->B4SOIw = 5e-6; - if (!here->B4SOImGiven) - here->B4SOIm = 1; - + here->B4SOIm = 1; /* v2.0 release */ if (!here->B4SOInbcGiven) here->B4SOInbc = 0; @@ -2657,7 +2662,9 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ } int -B4SOIunsetup(GENmodel *inModel, CKTcircuit *ckt) +B4SOIunsetup( + GENmodel *inModel, + CKTcircuit *ckt) { #ifndef HAS_BATCHSIM B4SOImodel *model; diff --git a/src/spicelib/devices/bsim3soi/b4soitemp.c b/src/spicelib/devices/bsim3soi/b4soitemp.c index be5b792d1..75698bf68 100644 --- a/src/spicelib/devices/bsim3soi/b4soitemp.c +++ b/src/spicelib/devices/bsim3soi/b4soitemp.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soitemp.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ /* Lmin, Lmax, Wmin, Wmax */ @@ -35,1990 +38,2023 @@ #define EXPL_THRESHOLD 100.0 #define DELTA 1.0E-9 #define DEXP(A,B) { \ - if (A > EXPL_THRESHOLD) { \ - B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \ - } else if (A < -EXPL_THRESHOLD) { \ - B = MIN_EXPL; \ - } else { \ - B = exp(A); \ - } \ - } - -/* ARGSUSED */ -int + if (A > EXPL_THRESHOLD) { \ + B = MAX_EXPL*(1.0+(A)-EXPL_THRESHOLD); \ + } else if (A < -EXPL_THRESHOLD) { \ + B = MIN_EXPL; \ + } else { \ + B = exp(A); \ + } \ +} + /* ARGSUSED */ + int B4SOItemp( -GENmodel *inModel, -CKTcircuit *ckt) + GENmodel *inModel, + CKTcircuit *ckt) { -register B4SOImodel *model = (B4SOImodel*) inModel; -register B4SOIinstance *here; -struct b4soiSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; -double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6; -double Ldrn=0.0, Wdrn; -double Temp, TempRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; -double SDphi, SDgamma; -double Inv_saref, Inv_sbref, Inv_sa, Inv_sb, rho, dvth0_lod; -double W_tmp, Inv_ODeff, OD_offset, dk2_lod, deta0_lod, kvsat; -int Size_Not_Found, i; -double PowWeffWr, T10; /*v4.0 */ -double Vtm0eot, Vtmeot,vbieot,phieot,sqrtphieot,vddeot; -double Vgs_eff,Vgsteff, V0, Vth,Vgst; -double lt1,ltw; -double TempRatioMinus1; -double n, VgstNVt, ExpArg, sqrtPhisExt,ExpVgst,Vgst2Vtm,vtfbphi2eot; -double DIBL_Sft,Lpe_Vb,DITS_Sft,DeltVthtemp, DITS_Sft2; -double Theta0,Delt_vth,DeltVthw; -double niter,toxpf,toxpi, Tcen; -double n0; - - - -/* v2.0 release */ -double tmp3, T7; -/*4.1*/ -double epsrox, toxe, epssub; + register B4SOImodel *model = (B4SOImodel*) inModel; + register B4SOIinstance *here; + struct b4soiSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL; + double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6; + double Ldrn=0.0, Wdrn; + double Temp, TempRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; + double SDphi, SDgamma; + double Inv_saref, Inv_sbref, Inv_sa, Inv_sb, rho, dvth0_lod; + double W_tmp, Inv_ODeff, OD_offset, dk2_lod, deta0_lod, kvsat; + int Size_Not_Found, i; + double PowWeffWr, T10; /*v4.0 */ + double Vtm0eot, Vtmeot,vbieot,phieot,sqrtphieot,vddeot; + double Vgs_eff,Vgsteff, V0, Vth,Vgst; + double lt1,ltw; + double TempRatioMinus1; + double n, VgstNVt, ExpArg, sqrtPhisExt,ExpVgst,Vgst2Vtm,vtfbphi2eot; + double DIBL_Sft,Lpe_Vb,DITS_Sft,DeltVthtemp, DITS_Sft2; + double Theta0,Delt_vth,DeltVthw; + double niter,toxpf,toxpi, Tcen; + double n0; + + + /* v2.0 release */ + double tmp3, T7; + /*4.1*/ + double epsrox, toxe, epssub; /* loop through all the B4SOI device models */ for (; model != NULL; model = model->B4SOInextModel) { Temp = ckt->CKTtemp; - if (model->B4SOIGatesidewallJctSPotential < 0.1) /* v4.0 */ - model->B4SOIGatesidewallJctSPotential = 0.1; - if (model->B4SOIGatesidewallJctDPotential < 0.1) /* v4.0 */ - model->B4SOIGatesidewallJctDPotential = 0.1; - model->pSizeDependParamKnot = NULL; - pLastKnot = NULL; - - Tnom = model->B4SOItnom; - TempRatio = Temp / Tnom; - - if(model->B4SOImtrlMod) - { - epsrox = 3.9; - toxe = model->B4SOIeot; - epssub = EPS0 * model->B4SOIepsrsub; - - } - else - { - epsrox = model->B4SOIepsrox; - toxe = model->B4SOItox; - epssub = EPSSI; - - } - - - /*model->B4SOIcox = epsrox * EPS0 / toxe;*/ - - model->B4SOIvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); - if(model->B4SOImtrlMod == 0) - model->B4SOIfactor1 = sqrt(EPSSI / EPSOX * model->B4SOItox); - else - model->B4SOIfactor1 = sqrt(epssub / (epsrox*EPS0) * toxe);/*4.1*/ - - if (model->B4SOImtrlMod==0) - { - Vtm0 = KboQ * Tnom; - Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); - model->B4SOIeg0 = Eg0; - model->B4SOIvtm = KboQ * Temp; - - Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); - - /* ni is in cm^-3 */ - ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15) - * exp(21.5565981 - Eg / (2.0 * model->B4SOIvtm)); - } - else - { Vtm0 = KboQ * Tnom; - Eg0 = model->B4SOIbg0sub - model->B4SOItbgasub * Tnom * Tnom - / (Tnom + model->B4SOItbgbsub); - model->B4SOIeg0 = Eg0; - model->B4SOIvtm = KboQ * Temp; - Eg = model->B4SOIbg0sub - model->B4SOItbgasub * Temp * Temp - / (Temp + model->B4SOItbgbsub); - - ni = model->B4SOIni0sub * (Temp / Tnom) * sqrt(Temp / Tnom) - * exp(Eg0/(2.0*Vtm0) - Eg / (2.0 * model->B4SOIvtm)); - - - } - - /* loop through all the instances of the model */ - /* MCJ: Length and Width not initialized */ - for (here = model->B4SOIinstances; here != NULL; - here = here->B4SOInextInstance) - { - here->B4SOIrbodyext = here->B4SOIbodySquares * - model->B4SOIrbsh; - pSizeDependParamKnot = model->pSizeDependParamKnot; - Size_Not_Found = 1; - while ((pSizeDependParamKnot != NULL) && Size_Not_Found) - { if ((here->B4SOIl == pSizeDependParamKnot->Length) - && (here->B4SOIw == pSizeDependParamKnot->Width) - && (here->B4SOIrth0 == pSizeDependParamKnot->Rth0) - && (here->B4SOIcth0 == pSizeDependParamKnot->Cth0) - && (here->B4SOInf == pSizeDependParamKnot->NFinger)) /*4.0*/ - { Size_Not_Found = 0; - here->pParam = pSizeDependParamKnot; - pParam = here->pParam; /* v2.2.3 bug fix */ - } - else - { pLastKnot = pSizeDependParamKnot; - pSizeDependParamKnot = pSizeDependParamKnot->pNext; - } - } - - if (Size_Not_Found) - { pParam = (struct b4soiSizeDependParam *)malloc( - sizeof(struct b4soiSizeDependParam)); - if (pLastKnot == NULL) - model->pSizeDependParamKnot = pParam; - else - pLastKnot->pNext = pParam; - pParam->pNext = NULL; - here->pParam = pParam; - - Ldrn = here->B4SOIl; - Wdrn = here->B4SOIw / here->B4SOInf; /* v4.0 */ - pParam->Length = here->B4SOIl; - pParam->Width = here->B4SOIw; - pParam->NFinger = here->B4SOInf; /* v4.0 */ - pParam->Rth0 = here->B4SOIrth0; - pParam->Cth0 = here->B4SOIcth0; - - T0 = pow(Ldrn, model->B4SOILln); - T1 = pow(Wdrn, model->B4SOILwn); - tmp1 = model->B4SOILl / T0 + model->B4SOILw / T1 - + model->B4SOILwl / (T0 * T1); - pParam->B4SOIdl = model->B4SOILint + tmp1; - -/* v2.2.3 */ - tmp1 = model->B4SOILlc / T0 + model->B4SOILwc / T1 - + model->B4SOILwlc / (T0 * T1); - pParam->B4SOIdlc = model->B4SOIdlc + tmp1; - -/* v3.0 */ - pParam->B4SOIdlcig = model->B4SOIdlcig + tmp1; - - - T2 = pow(Ldrn, model->B4SOIWln); - T3 = pow(Wdrn, model->B4SOIWwn); - tmp2 = model->B4SOIWl / T2 + model->B4SOIWw / T3 - + model->B4SOIWwl / (T2 * T3); - pParam->B4SOIdw = model->B4SOIWint + tmp2; - -/* v2.2.3 */ - tmp2 = model->B4SOIWlc / T2 + model->B4SOIWwc / T3 - + model->B4SOIWwlc / (T2 * T3); - pParam->B4SOIdwc = model->B4SOIdwc + tmp2; - - - pParam->B4SOIleff = here->B4SOIl - 2.0 * pParam->B4SOIdl; - if (pParam->B4SOIleff <= 0.0) - { IFuid namarray[2]; - namarray[0] = model->B4SOImodName; - namarray[1] = here->B4SOIname; - (*(SPfrontEnd->IFerror))(ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel length <= 0", - namarray); - return(E_BADPARM); - } - - pParam->B4SOIweff = here->B4SOIw / here->B4SOInf /* v4.0 */ - - here->B4SOInbc * model->B4SOIdwbc - - (2.0 - here->B4SOInbc) * pParam->B4SOIdw; - if (pParam->B4SOIweff <= 0.0) - { IFuid namarray[2]; - namarray[0] = model->B4SOImodName; - namarray[1] = here->B4SOIname; - (*(SPfrontEnd->IFerror))(ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel width <= 0", - namarray); - return(E_BADPARM); - } - - pParam->B4SOIwdiod = pParam->B4SOIweff / here->B4SOInseg - + here->B4SOIpdbcp; - pParam->B4SOIwdios = pParam->B4SOIweff / here->B4SOInseg - + here->B4SOIpsbcp; - - pParam->B4SOIleffCV = here->B4SOIl - 2.0 * pParam->B4SOIdlc; - if (pParam->B4SOIleffCV <= 0.0) - { IFuid namarray[2]; - namarray[0] = model->B4SOImodName; - namarray[1] = here->B4SOIname; - (*(SPfrontEnd->IFerror))(ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel length for C-V <= 0", - namarray); - return(E_BADPARM); - } - - pParam->B4SOIweffCV = here->B4SOIw /here->B4SOInf /* v4.0 */ - - here->B4SOInbc * model->B4SOIdwbc - - (2.0 - here->B4SOInbc) * pParam->B4SOIdwc; - if (pParam->B4SOIweffCV <= 0.0) - { IFuid namarray[2]; - namarray[0] = model->B4SOImodName; - namarray[1] = here->B4SOIname; - (*(SPfrontEnd->IFerror))(ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel width for C-V <= 0", - namarray); - return(E_BADPARM); - } - - pParam->B4SOIwdiodCV = pParam->B4SOIweffCV / here->B4SOInseg - + here->B4SOIpdbcp; - pParam->B4SOIwdiosCV = pParam->B4SOIweffCV / here->B4SOInseg - + here->B4SOIpsbcp; - - pParam->B4SOIleffCVb = here->B4SOIl - 2.0 * pParam->B4SOIdlc - - model->B4SOIdlcb; - if (pParam->B4SOIleffCVb <= 0.0) - { - IFuid namarray[2]; - namarray[0] = model->B4SOImodName; - namarray[1] = here->B4SOIname; - (*(SPfrontEnd->IFerror))(ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel length for C-V (body) <= 0", - namarray); - return(E_BADPARM); - } - - pParam->B4SOIleffCVbg = pParam->B4SOIleffCVb + 2 * model->B4SOIdlbg; - if (pParam->B4SOIleffCVbg <= 0.0) - { - IFuid namarray[2]; - namarray[0] = model->B4SOImodName; - namarray[1] = here->B4SOIname; - (*(SPfrontEnd->IFerror))(ERR_FATAL, - "B4SOI: mosfet %s, model %s: Effective channel length for C-V (backgate) <= 0", - namarray); - return(E_BADPARM); - } - - - /* Not binned - START */ - pParam->B4SOIgamma1 = model->B4SOIgamma1; - pParam->B4SOIgamma2 = model->B4SOIgamma2; - pParam->B4SOIvbx = model->B4SOIvbx; - pParam->B4SOIvbm = model->B4SOIvbm; - pParam->B4SOIxt = model->B4SOIxt; - /* Not binned - END */ - - /* CV model */ - pParam->B4SOIcf = model->B4SOIcf; - pParam->B4SOIclc = model->B4SOIclc; - pParam->B4SOIcle = model->B4SOIcle; - - pParam->B4SOIabulkCVfactor = 1.0 + pow((pParam->B4SOIclc - / pParam->B4SOIleff), - pParam->B4SOIcle); - - /* Added for binning - START */ - if (model->B4SOIbinUnit == 1) - { Inv_L = 1.0e-6 / pParam->B4SOIleff; - Inv_W = 1.0e-6 / pParam->B4SOIweff; - Inv_LW = 1.0e-12 / (pParam->B4SOIleff - * pParam->B4SOIweff); - } - else - { Inv_L = 1.0 / pParam->B4SOIleff; - Inv_W = 1.0 / pParam->B4SOIweff; - Inv_LW = 1.0 / (pParam->B4SOIleff - * pParam->B4SOIweff); - } - pParam->B4SOInpeak = model->B4SOInpeak - + model->B4SOIlnpeak * Inv_L - + model->B4SOIwnpeak * Inv_W - + model->B4SOIpnpeak * Inv_LW; - pParam->B4SOInsub = model->B4SOInsub - + model->B4SOIlnsub * Inv_L - + model->B4SOIwnsub * Inv_W - + model->B4SOIpnsub * Inv_LW; - pParam->B4SOIngate = model->B4SOIngate - + model->B4SOIlngate * Inv_L - + model->B4SOIwngate * Inv_W - + model->B4SOIpngate * Inv_LW; -/*4.1*/ - pParam->B4SOInsd = model->B4SOInsd - + model->B4SOIlnsd * Inv_L - + model->B4SOIwnsd * Inv_W - + model->B4SOIpnsd * Inv_LW; - - - - pParam->B4SOIvth0 = model->B4SOIvth0 - + model->B4SOIlvth0 * Inv_L - + model->B4SOIwvth0 * Inv_W - + model->B4SOIpvth0 * Inv_LW; - pParam->B4SOIvfb = model->B4SOIvfb - + model->B4SOIlvfb * Inv_L - + model->B4SOIwvfb * Inv_W - + model->B4SOIpvfb * Inv_LW; /* v4.1 */ - pParam->B4SOIk1 = model->B4SOIk1 - + model->B4SOIlk1 * Inv_L - + model->B4SOIwk1 * Inv_W - + model->B4SOIpk1 * Inv_LW; - pParam->B4SOIk2 = model->B4SOIk2 - + model->B4SOIlk2 * Inv_L - + model->B4SOIwk2 * Inv_W - + model->B4SOIpk2 * Inv_LW; - pParam->B4SOIk1w1 = model->B4SOIk1w1 - + model->B4SOIlk1w1 * Inv_L - + model->B4SOIwk1w1 * Inv_W - + model->B4SOIpk1w1 * Inv_LW; - pParam->B4SOIk1w2 = model->B4SOIk1w2 - + model->B4SOIlk1w2 * Inv_L - + model->B4SOIwk1w2 * Inv_W - + model->B4SOIpk1w2 * Inv_LW; - pParam->B4SOIk3 = model->B4SOIk3 - + model->B4SOIlk3 * Inv_L - + model->B4SOIwk3 * Inv_W - + model->B4SOIpk3 * Inv_LW; - pParam->B4SOIk3b = model->B4SOIk3b - + model->B4SOIlk3b * Inv_L - + model->B4SOIwk3b * Inv_W - + model->B4SOIpk3b * Inv_LW; - pParam->B4SOIkb1 = model->B4SOIkb1 - + model->B4SOIlkb1 * Inv_L - + model->B4SOIwkb1 * Inv_W - + model->B4SOIpkb1 * Inv_LW; - pParam->B4SOIw0 = model->B4SOIw0 - + model->B4SOIlw0 * Inv_L - + model->B4SOIww0 * Inv_W - + model->B4SOIpw0 * Inv_LW; - pParam->B4SOIlpe0 = model->B4SOIlpe0 - + model->B4SOIllpe0 * Inv_L - + model->B4SOIwlpe0 * Inv_W - + model->B4SOIplpe0 * Inv_LW; - pParam->B4SOIlpeb = model->B4SOIlpeb - + model->B4SOIllpeb * Inv_L - + model->B4SOIwlpeb * Inv_W - + model->B4SOIplpeb * Inv_LW; /* v4.0 */ - pParam->B4SOIdvt0 = model->B4SOIdvt0 - + model->B4SOIldvt0 * Inv_L - + model->B4SOIwdvt0 * Inv_W - + model->B4SOIpdvt0 * Inv_LW; - pParam->B4SOIdvt1 = model->B4SOIdvt1 - + model->B4SOIldvt1 * Inv_L - + model->B4SOIwdvt1 * Inv_W - + model->B4SOIpdvt1 * Inv_LW; - pParam->B4SOIdvt2 = model->B4SOIdvt2 - + model->B4SOIldvt2 * Inv_L - + model->B4SOIwdvt2 * Inv_W - + model->B4SOIpdvt2 * Inv_LW; - pParam->B4SOIdvt0w = model->B4SOIdvt0w - + model->B4SOIldvt0w * Inv_L - + model->B4SOIwdvt0w * Inv_W - + model->B4SOIpdvt0w * Inv_LW; - pParam->B4SOIdvt1w = model->B4SOIdvt1w - + model->B4SOIldvt1w * Inv_L - + model->B4SOIwdvt1w * Inv_W - + model->B4SOIpdvt1w * Inv_LW; - pParam->B4SOIdvt2w = model->B4SOIdvt2w - + model->B4SOIldvt2w * Inv_L - + model->B4SOIwdvt2w * Inv_W - + model->B4SOIpdvt2w * Inv_LW; - pParam->B4SOIu0 = model->B4SOIu0 - + model->B4SOIlu0 * Inv_L - + model->B4SOIwu0 * Inv_W - + model->B4SOIpu0 * Inv_LW; - pParam->B4SOIua = model->B4SOIua - + model->B4SOIlua * Inv_L - + model->B4SOIwua * Inv_W - + model->B4SOIpua * Inv_LW; - pParam->B4SOIub = model->B4SOIub - + model->B4SOIlub * Inv_L - + model->B4SOIwub * Inv_W - + model->B4SOIpub * Inv_LW; - pParam->B4SOIuc = model->B4SOIuc - + model->B4SOIluc * Inv_L - + model->B4SOIwuc * Inv_W - + model->B4SOIpuc * Inv_LW; - pParam->B4SOIvsat = model->B4SOIvsat - + model->B4SOIlvsat * Inv_L - + model->B4SOIwvsat * Inv_W - + model->B4SOIpvsat * Inv_LW; - pParam->B4SOIa0 = model->B4SOIa0 - + model->B4SOIla0 * Inv_L - + model->B4SOIwa0 * Inv_W - + model->B4SOIpa0 * Inv_LW; - pParam->B4SOIags = model->B4SOIags - + model->B4SOIlags * Inv_L - + model->B4SOIwags * Inv_W - + model->B4SOIpags * Inv_LW; - pParam->B4SOIb0 = model->B4SOIb0 - + model->B4SOIlb0 * Inv_L - + model->B4SOIwb0 * Inv_W - + model->B4SOIpb0 * Inv_LW; - pParam->B4SOIb1 = model->B4SOIb1 - + model->B4SOIlb1 * Inv_L - + model->B4SOIwb1 * Inv_W - + model->B4SOIpb1 * Inv_LW; - pParam->B4SOIketa = model->B4SOIketa - + model->B4SOIlketa * Inv_L - + model->B4SOIwketa * Inv_W - + model->B4SOIpketa * Inv_LW; - pParam->B4SOIketas = model->B4SOIketas - + model->B4SOIlketas * Inv_L - + model->B4SOIwketas * Inv_W - + model->B4SOIpketas * Inv_LW; - pParam->B4SOIa1 = model->B4SOIa1 - + model->B4SOIla1 * Inv_L - + model->B4SOIwa1 * Inv_W - + model->B4SOIpa1 * Inv_LW; - pParam->B4SOIa2 = model->B4SOIa2 - + model->B4SOIla2 * Inv_L - + model->B4SOIwa2 * Inv_W - + model->B4SOIpa2 * Inv_LW; - pParam->B4SOIrdsw = model->B4SOIrdsw - + model->B4SOIlrdsw * Inv_L - + model->B4SOIwrdsw * Inv_W - + model->B4SOIprdsw * Inv_LW; - pParam->B4SOIrsw = model->B4SOIrsw /* v4.0 */ - + model->B4SOIlrsw * Inv_L - + model->B4SOIwrsw * Inv_W - + model->B4SOIprsw * Inv_LW; - pParam->B4SOIrdw = model->B4SOIrdw /* v4.0 */ - + model->B4SOIlrdw * Inv_L - + model->B4SOIwrdw * Inv_W - + model->B4SOIprdw * Inv_LW; - pParam->B4SOIprwb = model->B4SOIprwb - + model->B4SOIlprwb * Inv_L - + model->B4SOIwprwb * Inv_W - + model->B4SOIpprwb * Inv_LW; - pParam->B4SOIprwg = model->B4SOIprwg - + model->B4SOIlprwg * Inv_L - + model->B4SOIwprwg * Inv_W - + model->B4SOIpprwg * Inv_LW; - pParam->B4SOIwr = model->B4SOIwr - + model->B4SOIlwr * Inv_L - + model->B4SOIwwr * Inv_W - + model->B4SOIpwr * Inv_LW; - pParam->B4SOInfactor = model->B4SOInfactor - + model->B4SOIlnfactor * Inv_L - + model->B4SOIwnfactor * Inv_W - + model->B4SOIpnfactor * Inv_LW; - pParam->B4SOIdwg = model->B4SOIdwg - + model->B4SOIldwg * Inv_L - + model->B4SOIwdwg * Inv_W - + model->B4SOIpdwg * Inv_LW; - pParam->B4SOIdwb = model->B4SOIdwb - + model->B4SOIldwb * Inv_L - + model->B4SOIwdwb * Inv_W - + model->B4SOIpdwb * Inv_LW; - pParam->B4SOIvoff = model->B4SOIvoff - + model->B4SOIlvoff * Inv_L - + model->B4SOIwvoff * Inv_W - + model->B4SOIpvoff * Inv_LW; - pParam->B4SOIeta0 = model->B4SOIeta0 - + model->B4SOIleta0 * Inv_L - + model->B4SOIweta0 * Inv_W - + model->B4SOIpeta0 * Inv_LW; - pParam->B4SOIetab = model->B4SOIetab - + model->B4SOIletab * Inv_L - + model->B4SOIwetab * Inv_W - + model->B4SOIpetab * Inv_LW; - pParam->B4SOIdsub = model->B4SOIdsub - + model->B4SOIldsub * Inv_L - + model->B4SOIwdsub * Inv_W - + model->B4SOIpdsub * Inv_LW; - pParam->B4SOIcit = model->B4SOIcit - + model->B4SOIlcit * Inv_L - + model->B4SOIwcit * Inv_W - + model->B4SOIpcit * Inv_LW; - pParam->B4SOIcdsc = model->B4SOIcdsc - + model->B4SOIlcdsc * Inv_L - + model->B4SOIwcdsc * Inv_W - + model->B4SOIpcdsc * Inv_LW; - pParam->B4SOIcdscb = model->B4SOIcdscb - + model->B4SOIlcdscb * Inv_L - + model->B4SOIwcdscb * Inv_W - + model->B4SOIpcdscb * Inv_LW; - pParam->B4SOIcdscd = model->B4SOIcdscd - + model->B4SOIlcdscd * Inv_L - + model->B4SOIwcdscd * Inv_W - + model->B4SOIpcdscd * Inv_LW; - pParam->B4SOIpclm = model->B4SOIpclm - + model->B4SOIlpclm * Inv_L - + model->B4SOIwpclm * Inv_W - + model->B4SOIppclm * Inv_LW; - pParam->B4SOIpdibl1 = model->B4SOIpdibl1 - + model->B4SOIlpdibl1 * Inv_L - + model->B4SOIwpdibl1 * Inv_W - + model->B4SOIppdibl1 * Inv_LW; - pParam->B4SOIpdibl2 = model->B4SOIpdibl2 - + model->B4SOIlpdibl2 * Inv_L - + model->B4SOIwpdibl2 * Inv_W - + model->B4SOIppdibl2 * Inv_LW; - pParam->B4SOIpdiblb = model->B4SOIpdiblb - + model->B4SOIlpdiblb * Inv_L - + model->B4SOIwpdiblb * Inv_W - + model->B4SOIppdiblb * Inv_LW; - pParam->B4SOIdrout = model->B4SOIdrout - + model->B4SOIldrout * Inv_L - + model->B4SOIwdrout * Inv_W - + model->B4SOIpdrout * Inv_LW; - pParam->B4SOIpvag = model->B4SOIpvag - + model->B4SOIlpvag * Inv_L - + model->B4SOIwpvag * Inv_W - + model->B4SOIppvag * Inv_LW; - pParam->B4SOIdelta = model->B4SOIdelta - + model->B4SOIldelta * Inv_L - + model->B4SOIwdelta * Inv_W - + model->B4SOIpdelta * Inv_LW; - pParam->B4SOIalpha0 = model->B4SOIalpha0 - + model->B4SOIlalpha0 * Inv_L - + model->B4SOIwalpha0 * Inv_W - + model->B4SOIpalpha0 * Inv_LW; - pParam->B4SOIfbjtii = model->B4SOIfbjtii - + model->B4SOIlfbjtii * Inv_L - + model->B4SOIwfbjtii * Inv_W - + model->B4SOIpfbjtii * Inv_LW; - /*4.1 Iii model*/ - pParam->B4SOIebjtii = model->B4SOIebjtii - + model->B4SOIlebjtii * Inv_L - + model->B4SOIwebjtii * Inv_W - + model->B4SOIpebjtii * Inv_LW; - pParam->B4SOIcbjtii = model->B4SOIcbjtii - + model->B4SOIlcbjtii * Inv_L - + model->B4SOIwcbjtii * Inv_W - + model->B4SOIpcbjtii * Inv_LW; - pParam->B4SOIvbci = model->B4SOIvbci - + model->B4SOIlvbci * Inv_L - + model->B4SOIwvbci * Inv_W - + model->B4SOIpvbci * Inv_LW; - - pParam->B4SOIabjtii = model->B4SOIabjtii - + model->B4SOIlabjtii * Inv_L - + model->B4SOIwabjtii * Inv_W - + model->B4SOIpabjtii * Inv_LW; - pParam->B4SOImbjtii = model->B4SOImbjtii - + model->B4SOIlmbjtii * Inv_L - + model->B4SOIwmbjtii * Inv_W - + model->B4SOIpmbjtii * Inv_LW; - - pParam->B4SOIbeta0 = model->B4SOIbeta0 - + model->B4SOIlbeta0 * Inv_L - + model->B4SOIwbeta0 * Inv_W - + model->B4SOIpbeta0 * Inv_LW; - pParam->B4SOIbeta1 = model->B4SOIbeta1 - + model->B4SOIlbeta1 * Inv_L - + model->B4SOIwbeta1 * Inv_W - + model->B4SOIpbeta1 * Inv_LW; - pParam->B4SOIbeta2 = model->B4SOIbeta2 - + model->B4SOIlbeta2 * Inv_L - + model->B4SOIwbeta2 * Inv_W - + model->B4SOIpbeta2 * Inv_LW; - pParam->B4SOIvdsatii0 = model->B4SOIvdsatii0 - + model->B4SOIlvdsatii0 * Inv_L - + model->B4SOIwvdsatii0 * Inv_W - + model->B4SOIpvdsatii0 * Inv_LW; - pParam->B4SOIlii = model->B4SOIlii - + model->B4SOIllii * Inv_L - + model->B4SOIwlii * Inv_W - + model->B4SOIplii * Inv_LW; - pParam->B4SOIesatii = model->B4SOIesatii - + model->B4SOIlesatii * Inv_L - + model->B4SOIwesatii * Inv_W - + model->B4SOIpesatii * Inv_LW; - pParam->B4SOIsii0 = model->B4SOIsii0 - + model->B4SOIlsii0 * Inv_L - + model->B4SOIwsii0 * Inv_W - + model->B4SOIpsii0 * Inv_LW; - pParam->B4SOIsii1 = model->B4SOIsii1 - + model->B4SOIlsii1 * Inv_L - + model->B4SOIwsii1 * Inv_W - + model->B4SOIpsii1 * Inv_LW; - pParam->B4SOIsii2 = model->B4SOIsii2 - + model->B4SOIlsii2 * Inv_L - + model->B4SOIwsii2 * Inv_W - + model->B4SOIpsii2 * Inv_LW; - pParam->B4SOIsiid = model->B4SOIsiid - + model->B4SOIlsiid * Inv_L - + model->B4SOIwsiid * Inv_W - + model->B4SOIpsiid * Inv_LW; - pParam->B4SOIagidl = model->B4SOIagidl - + model->B4SOIlagidl * Inv_L - + model->B4SOIwagidl * Inv_W - + model->B4SOIpagidl * Inv_LW; - pParam->B4SOIbgidl = model->B4SOIbgidl - + model->B4SOIlbgidl * Inv_L - + model->B4SOIwbgidl * Inv_W - + model->B4SOIpbgidl * Inv_LW; - pParam->B4SOIcgidl = model->B4SOIcgidl - + model->B4SOIlcgidl * Inv_L - + model->B4SOIwcgidl * Inv_W - + model->B4SOIpcgidl * Inv_LW; - pParam->B4SOIegidl = model->B4SOIegidl - + model->B4SOIlegidl * Inv_L - + model->B4SOIwegidl * Inv_W - + model->B4SOIpegidl * Inv_LW; - pParam->B4SOIrgidl = model->B4SOIrgidl - + model->B4SOIlrgidl * Inv_L - + model->B4SOIwrgidl * Inv_W - + model->B4SOIprgidl * Inv_LW; - pParam->B4SOIkgidl = model->B4SOIkgidl - + model->B4SOIlkgidl * Inv_L - + model->B4SOIwkgidl * Inv_W - + model->B4SOIpkgidl * Inv_LW; - pParam->B4SOIfgidl = model->B4SOIfgidl - + model->B4SOIlfgidl * Inv_L - + model->B4SOIwfgidl * Inv_W - + model->B4SOIpfgidl * Inv_LW; - pParam->B4SOIagisl = model->B4SOIagisl - + model->B4SOIlagisl * Inv_L - + model->B4SOIwagisl * Inv_W - + model->B4SOIpagisl * Inv_LW; - pParam->B4SOIbgisl = model->B4SOIbgisl - + model->B4SOIlbgisl * Inv_L - + model->B4SOIwbgisl * Inv_W - + model->B4SOIpbgisl * Inv_LW; - pParam->B4SOIcgisl = model->B4SOIcgisl - + model->B4SOIlcgisl * Inv_L - + model->B4SOIwcgisl * Inv_W - + model->B4SOIpcgisl * Inv_LW; - pParam->B4SOIegisl = model->B4SOIegisl - + model->B4SOIlegisl * Inv_L - + model->B4SOIwegisl * Inv_W - + model->B4SOIpegisl * Inv_LW; - pParam->B4SOIrgisl = model->B4SOIrgisl - + model->B4SOIlrgisl * Inv_L - + model->B4SOIwrgisl * Inv_W - + model->B4SOIprgisl * Inv_LW; - pParam->B4SOIkgisl = model->B4SOIkgisl - + model->B4SOIlkgisl * Inv_L - + model->B4SOIwkgisl * Inv_W - + model->B4SOIpkgisl * Inv_LW; - pParam->B4SOIfgisl = model->B4SOIfgisl - + model->B4SOIlfgisl * Inv_L - + model->B4SOIwfgisl * Inv_W - + model->B4SOIpfgisl * Inv_LW; - - pParam->B4SOIntun = model->B4SOIntun /* v4.0 */ - + model->B4SOIlntun * Inv_L - + model->B4SOIwntun * Inv_W - + model->B4SOIpntun * Inv_LW; - pParam->B4SOIntund = model->B4SOIntund /* v4.0 */ - + model->B4SOIlntund * Inv_L - + model->B4SOIwntund * Inv_W - + model->B4SOIpntund * Inv_LW; - pParam->B4SOIndiode = model->B4SOIndiode /* v4.0 */ - + model->B4SOIlndiode * Inv_L - + model->B4SOIwndiode * Inv_W - + model->B4SOIpndiode * Inv_LW; - pParam->B4SOIndioded = model->B4SOIndioded /* v4.0 */ - + model->B4SOIlndioded * Inv_L - + model->B4SOIwndioded * Inv_W - + model->B4SOIpndioded * Inv_LW; - pParam->B4SOInrecf0 = model->B4SOInrecf0 /* v4.0 */ - + model->B4SOIlnrecf0 * Inv_L - + model->B4SOIwnrecf0 * Inv_W - + model->B4SOIpnrecf0 * Inv_LW; - pParam->B4SOInrecf0d = model->B4SOInrecf0d /* v4.0 */ - + model->B4SOIlnrecf0d * Inv_L - + model->B4SOIwnrecf0d * Inv_W - + model->B4SOIpnrecf0d * Inv_LW; - pParam->B4SOInrecr0 = model->B4SOInrecr0 /* v4.0 */ - + model->B4SOIlnrecr0 * Inv_L - + model->B4SOIwnrecr0 * Inv_W - + model->B4SOIpnrecr0 * Inv_LW; - pParam->B4SOInrecr0d = model->B4SOInrecr0d /* v4.0 */ - + model->B4SOIlnrecr0d * Inv_L - + model->B4SOIwnrecr0d * Inv_W - + model->B4SOIpnrecr0d * Inv_LW; - pParam->B4SOIisbjt = model->B4SOIisbjt - + model->B4SOIlisbjt * Inv_L - + model->B4SOIwisbjt * Inv_W - + model->B4SOIpisbjt * Inv_LW; - pParam->B4SOIidbjt = model->B4SOIidbjt - + model->B4SOIlidbjt * Inv_L - + model->B4SOIwidbjt * Inv_W - + model->B4SOIpidbjt * Inv_LW; - pParam->B4SOIisdif = model->B4SOIisdif - + model->B4SOIlisdif * Inv_L - + model->B4SOIwisdif * Inv_W - + model->B4SOIpisdif * Inv_LW; - pParam->B4SOIiddif = model->B4SOIiddif - + model->B4SOIliddif * Inv_L - + model->B4SOIwiddif * Inv_W - + model->B4SOIpiddif * Inv_LW; - pParam->B4SOIisrec = model->B4SOIisrec - + model->B4SOIlisrec * Inv_L - + model->B4SOIwisrec * Inv_W - + model->B4SOIpisrec * Inv_LW; - pParam->B4SOIistun = model->B4SOIistun - + model->B4SOIlistun * Inv_L - + model->B4SOIwistun * Inv_W - + model->B4SOIpistun * Inv_LW; - pParam->B4SOIidrec = model->B4SOIidrec - + model->B4SOIlidrec * Inv_L - + model->B4SOIwidrec * Inv_W - + model->B4SOIpidrec * Inv_LW; - pParam->B4SOIidtun = model->B4SOIidtun - + model->B4SOIlidtun * Inv_L - + model->B4SOIwidtun * Inv_W - + model->B4SOIpidtun * Inv_LW; - pParam->B4SOIvrec0 = model->B4SOIvrec0 /* v4.0 */ - + model->B4SOIlvrec0 * Inv_L - + model->B4SOIwvrec0 * Inv_W - + model->B4SOIpvrec0 * Inv_LW; - pParam->B4SOIvrec0d = model->B4SOIvrec0d /* v4.0 */ - + model->B4SOIlvrec0d * Inv_L - + model->B4SOIwvrec0d * Inv_W - + model->B4SOIpvrec0d * Inv_LW; - pParam->B4SOIvtun0 = model->B4SOIvtun0 /* v4.0 */ - + model->B4SOIlvtun0 * Inv_L - + model->B4SOIwvtun0 * Inv_W - + model->B4SOIpvtun0 * Inv_LW; - pParam->B4SOIvtun0d = model->B4SOIvtun0d /* v4.0 */ - + model->B4SOIlvtun0d * Inv_L - + model->B4SOIwvtun0d * Inv_W - + model->B4SOIpvtun0d * Inv_LW; - pParam->B4SOInbjt = model->B4SOInbjt - + model->B4SOIlnbjt * Inv_L - + model->B4SOIwnbjt * Inv_W - + model->B4SOIpnbjt * Inv_LW; - pParam->B4SOIlbjt0 = model->B4SOIlbjt0 - + model->B4SOIllbjt0 * Inv_L - + model->B4SOIwlbjt0 * Inv_W - + model->B4SOIplbjt0 * Inv_LW; - pParam->B4SOIvabjt = model->B4SOIvabjt - + model->B4SOIlvabjt * Inv_L - + model->B4SOIwvabjt * Inv_W - + model->B4SOIpvabjt * Inv_LW; - pParam->B4SOIaely = model->B4SOIaely - + model->B4SOIlaely * Inv_L - + model->B4SOIwaely * Inv_W - + model->B4SOIpaely * Inv_LW; - pParam->B4SOIahli = model->B4SOIahli /* v4.0 */ - + model->B4SOIlahli * Inv_L - + model->B4SOIwahli * Inv_W - + model->B4SOIpahli * Inv_LW; - pParam->B4SOIahlid = model->B4SOIahlid /* v4.0 */ - + model->B4SOIlahlid * Inv_L - + model->B4SOIwahlid * Inv_W - + model->B4SOIpahlid * Inv_LW; - - -/* v3.1 */ - pParam->B4SOIxj = model->B4SOIxj - + model->B4SOIlxj * Inv_L - + model->B4SOIwxj * Inv_W - + model->B4SOIpxj * Inv_LW; - pParam->B4SOIalphaGB1 = model->B4SOIalphaGB1 - + model->B4SOIlalphaGB1 * Inv_L - + model->B4SOIwalphaGB1 * Inv_W - + model->B4SOIpalphaGB1 * Inv_LW; - pParam->B4SOIalphaGB2 = model->B4SOIalphaGB2 - + model->B4SOIlalphaGB2 * Inv_L - + model->B4SOIwalphaGB2 * Inv_W - + model->B4SOIpalphaGB2 * Inv_LW; - pParam->B4SOIbetaGB1 = model->B4SOIbetaGB1 - + model->B4SOIlbetaGB1* Inv_L - + model->B4SOIwbetaGB1 * Inv_W - + model->B4SOIpbetaGB1 * Inv_LW; - pParam->B4SOIbetaGB2 = model->B4SOIbetaGB2 - + model->B4SOIlbetaGB2 * Inv_L - + model->B4SOIwbetaGB2 * Inv_W - + model->B4SOIpbetaGB2 * Inv_LW; - pParam->B4SOIndif = model->B4SOIndif - + model->B4SOIlndif * Inv_L - + model->B4SOIwndif * Inv_W - + model->B4SOIpndif * Inv_LW; - pParam->B4SOIntrecf = model->B4SOIntrecf - + model->B4SOIlntrecf* Inv_L - + model->B4SOIwntrecf * Inv_W - + model->B4SOIpntrecf * Inv_LW; - pParam->B4SOIntrecr = model->B4SOIntrecr - + model->B4SOIlntrecr * Inv_L - + model->B4SOIwntrecr * Inv_W - + model->B4SOIpntrecr * Inv_LW; - pParam->B4SOIxbjt = model->B4SOIxbjt - + model->B4SOIlxbjt * Inv_L - + model->B4SOIwxbjt * Inv_W - + model->B4SOIpxbjt * Inv_LW; - pParam->B4SOIxdif = model->B4SOIxdif - + model->B4SOIlxdif* Inv_L - + model->B4SOIwxdif * Inv_W - + model->B4SOIpxdif * Inv_LW; - pParam->B4SOIxrec = model->B4SOIxrec - + model->B4SOIlxrec * Inv_L - + model->B4SOIwxrec * Inv_W - + model->B4SOIpxrec * Inv_LW; - pParam->B4SOIxtun = model->B4SOIxtun - + model->B4SOIlxtun * Inv_L - + model->B4SOIwxtun * Inv_W - + model->B4SOIpxtun * Inv_LW; - pParam->B4SOIxdifd = model->B4SOIxdifd - + model->B4SOIlxdifd* Inv_L - + model->B4SOIwxdifd * Inv_W - + model->B4SOIpxdifd * Inv_LW; - pParam->B4SOIxrecd = model->B4SOIxrecd - + model->B4SOIlxrecd * Inv_L - + model->B4SOIwxrecd * Inv_W - + model->B4SOIpxrecd * Inv_LW; - pParam->B4SOIxtund = model->B4SOIxtund - + model->B4SOIlxtund * Inv_L - + model->B4SOIwxtund * Inv_W - + model->B4SOIpxtund * Inv_LW; - pParam->B4SOIcgdl = model->B4SOIcgdl - + model->B4SOIlcgdl * Inv_L - + model->B4SOIwcgdl * Inv_W - + model->B4SOIpcgdl * Inv_LW; - pParam->B4SOIcgsl = model->B4SOIcgsl - + model->B4SOIlcgsl * Inv_L - + model->B4SOIwcgsl * Inv_W - + model->B4SOIpcgsl * Inv_LW; - pParam->B4SOIckappa = model->B4SOIckappa - + model->B4SOIlckappa * Inv_L - + model->B4SOIwckappa * Inv_W - + model->B4SOIpckappa * Inv_LW; - pParam->B4SOIute = model->B4SOIute - + model->B4SOIlute * Inv_L - + model->B4SOIwute * Inv_W - + model->B4SOIpute * Inv_LW; - - /*4.1 mobmod=4*/ - pParam->B4SOIud = model->B4SOIud - + model->B4SOIud * Inv_L - + model->B4SOIwud * Inv_W - + model->B4SOIpud * Inv_LW; - pParam->B4SOIud1 = model->B4SOIud1 - + model->B4SOIlud1 * Inv_L - + model->B4SOIwud1 * Inv_W - + model->B4SOIpud1 * Inv_LW; - pParam->B4SOIeu = model->B4SOIeu - + model->B4SOIleu * Inv_L - + model->B4SOIweu * Inv_W - + model->B4SOIpeu * Inv_LW; - pParam->B4SOIucs = model->B4SOIucs - + model->B4SOIlucs * Inv_L - + model->B4SOIwucs * Inv_W - + model->B4SOIpucs * Inv_LW; - pParam->B4SOIucste = model->B4SOIucste - + model->B4SOIlucste * Inv_L - + model->B4SOIwucste * Inv_W - + model->B4SOIpucste * Inv_LW; - - pParam->B4SOIkt1 = model->B4SOIkt1 - + model->B4SOIlkt1 * Inv_L - + model->B4SOIwkt1 * Inv_W - + model->B4SOIpkt1 * Inv_LW; - pParam->B4SOIkt2 = model->B4SOIkt2 - + model->B4SOIlkt2 * Inv_L - + model->B4SOIwkt2 * Inv_W - + model->B4SOIpkt2 * Inv_LW; - pParam->B4SOIkt1l = model->B4SOIkt1l - + model->B4SOIlkt1l * Inv_L - + model->B4SOIwkt1l * Inv_W - + model->B4SOIpkt1l * Inv_LW; - pParam->B4SOIua1 = model->B4SOIua1 - + model->B4SOIlua1 * Inv_L - + model->B4SOIwua1 * Inv_W - + model->B4SOIpua1 * Inv_LW; - pParam->B4SOIub1 = model->B4SOIub1 - + model->B4SOIlub1* Inv_L - + model->B4SOIwub1 * Inv_W - + model->B4SOIpub1 * Inv_LW; - pParam->B4SOIuc1 = model->B4SOIuc1 - + model->B4SOIluc1 * Inv_L - + model->B4SOIwuc1 * Inv_W - + model->B4SOIpuc1 * Inv_LW; - pParam->B4SOIat = model->B4SOIat - + model->B4SOIlat * Inv_L - + model->B4SOIwat * Inv_W - + model->B4SOIpat * Inv_LW; - pParam->B4SOIprt = model->B4SOIprt - + model->B4SOIlprt * Inv_L - + model->B4SOIwprt * Inv_W - + model->B4SOIpprt * Inv_LW; - - -/* v3.0 */ - pParam->B4SOInigc = model->B4SOInigc - + model->B4SOIlnigc * Inv_L - + model->B4SOIwnigc * Inv_W - + model->B4SOIpnigc * Inv_LW; - pParam->B4SOIaigc = model->B4SOIaigc - + model->B4SOIlaigc * Inv_L - + model->B4SOIwaigc * Inv_W - + model->B4SOIpaigc * Inv_LW; - pParam->B4SOIbigc = model->B4SOIbigc - + model->B4SOIlbigc * Inv_L - + model->B4SOIwbigc * Inv_W - + model->B4SOIpbigc * Inv_LW; - pParam->B4SOIcigc = model->B4SOIcigc - + model->B4SOIlcigc * Inv_L - + model->B4SOIwcigc * Inv_W - + model->B4SOIpcigc * Inv_LW; - pParam->B4SOIaigsd = model->B4SOIaigsd - + model->B4SOIlaigsd * Inv_L - + model->B4SOIwaigsd * Inv_W - + model->B4SOIpaigsd * Inv_LW; - pParam->B4SOIbigsd = model->B4SOIbigsd - + model->B4SOIlbigsd * Inv_L - + model->B4SOIwbigsd * Inv_W - + model->B4SOIpbigsd * Inv_LW; - pParam->B4SOIcigsd = model->B4SOIcigsd - + model->B4SOIlcigsd * Inv_L - + model->B4SOIwcigsd * Inv_W - + model->B4SOIpcigsd * Inv_LW; - pParam->B4SOIpigcd = model->B4SOIpigcd - + model->B4SOIlpigcd * Inv_L - + model->B4SOIwpigcd * Inv_W - + model->B4SOIppigcd * Inv_LW; - pParam->B4SOIpoxedge = model->B4SOIpoxedge - + model->B4SOIlpoxedge * Inv_L - + model->B4SOIwpoxedge * Inv_W - + model->B4SOIppoxedge * Inv_LW; -/* v3.0 */ - - /* v3.1 added for RF */ - pParam->B4SOIxrcrg1 = model->B4SOIxrcrg1 - + model->B4SOIlxrcrg1 * Inv_L - + model->B4SOIwxrcrg1 * Inv_W - + model->B4SOIpxrcrg1 * Inv_LW; - pParam->B4SOIxrcrg2 = model->B4SOIxrcrg2 - + model->B4SOIlxrcrg2 * Inv_L - + model->B4SOIwxrcrg2 * Inv_W - + model->B4SOIpxrcrg2 * Inv_LW; - /* v3.1 added for RF end */ - - - /* CV model */ - pParam->B4SOIvsdfb = model->B4SOIvsdfb - + model->B4SOIlvsdfb * Inv_L - + model->B4SOIwvsdfb * Inv_W - + model->B4SOIpvsdfb * Inv_LW; - pParam->B4SOIvsdth = model->B4SOIvsdth - + model->B4SOIlvsdth * Inv_L - + model->B4SOIwvsdth * Inv_W - + model->B4SOIpvsdth * Inv_LW; - pParam->B4SOIdelvt = model->B4SOIdelvt - + model->B4SOIldelvt * Inv_L - + model->B4SOIwdelvt * Inv_W - + model->B4SOIpdelvt * Inv_LW; - pParam->B4SOIacde = model->B4SOIacde - + model->B4SOIlacde * Inv_L - + model->B4SOIwacde * Inv_W - + model->B4SOIpacde * Inv_LW; - pParam->B4SOIacde = pParam->B4SOIacde * - pow((pParam->B4SOInpeak / 2.0e16), -0.25); - /* v3.2 bug fix */ - - pParam->B4SOImoin = model->B4SOImoin - + model->B4SOIlmoin * Inv_L - + model->B4SOIwmoin * Inv_W - + model->B4SOIpmoin * Inv_LW; - pParam->B4SOInoff = model->B4SOInoff - + model->B4SOIlnoff * Inv_L - + model->B4SOIwnoff * Inv_W - + model->B4SOIpnoff * Inv_LW; /* v3.2 */ - - pParam->B4SOIdvtp0 = model->B4SOIdvtp0 - + model->B4SOIldvtp0 * Inv_L - + model->B4SOIwdvtp0 * Inv_W - + model->B4SOIpdvtp0 * Inv_LW; /* v4.0 */ - pParam->B4SOIdvtp1 = model->B4SOIdvtp1 - + model->B4SOIldvtp1 * Inv_L - + model->B4SOIwdvtp1 * Inv_W - + model->B4SOIpdvtp1 * Inv_LW; /* v4.0 */ - pParam->B4SOIdvtp2 = model->B4SOIdvtp2 - + model->B4SOIldvtp2 * Inv_L - + model->B4SOIwdvtp2 * Inv_W - + model->B4SOIpdvtp2 * Inv_LW; /* v4.1 */ - pParam->B4SOIdvtp3 = model->B4SOIdvtp3 - + model->B4SOIldvtp3 * Inv_L - + model->B4SOIwdvtp3 * Inv_W - + model->B4SOIpdvtp3 * Inv_LW; /* v4.1 */ - pParam->B4SOIdvtp4 = model->B4SOIdvtp4 - + model->B4SOIldvtp4 * Inv_L - + model->B4SOIwdvtp4 * Inv_W - + model->B4SOIpdvtp4 * Inv_LW; /* v4.1 */ - pParam->B4SOIminv = model->B4SOIminv - + model->B4SOIlminv * Inv_L - + model->B4SOIwminv * Inv_W - + model->B4SOIpminv * Inv_LW; /* v4.0 */ - pParam->B4SOIminvcv = model->B4SOIminvcv - + model->B4SOIlminvcv * Inv_L - + model->B4SOIwminvcv * Inv_W - + model->B4SOIpminvcv * Inv_LW; /* v4.1 */ - pParam->B4SOIfprout = model->B4SOIfprout - + model->B4SOIlfprout * Inv_L - + model->B4SOIwfprout * Inv_W - + model->B4SOIpfprout * Inv_LW; /* v4.0 */ - pParam->B4SOIpdits = model->B4SOIpdits - + model->B4SOIlpdits * Inv_L - + model->B4SOIwpdits * Inv_W - + model->B4SOIppdits * Inv_LW; /* v4.0 */ - pParam->B4SOIpditsd = model->B4SOIpditsd - + model->B4SOIlpditsd * Inv_L - + model->B4SOIwpditsd * Inv_W - + model->B4SOIppditsd * Inv_LW; /* v4.0 */ - pParam->B4SOIaigbcp2 = model->B4SOIaigbcp2 - + model->B4SOIlaigbcp2 * Inv_L - + model->B4SOIwaigbcp2 * Inv_W - + model->B4SOIpaigbcp2 * Inv_LW; /* v4.0 */ - pParam->B4SOIbigbcp2 = model->B4SOIbigbcp2 - + model->B4SOIlbigbcp2 * Inv_L - + model->B4SOIwbigbcp2 * Inv_W - + model->B4SOIpbigbcp2 * Inv_LW; /* v4.0 */ - pParam->B4SOIcigbcp2 = model->B4SOIcigbcp2 - + model->B4SOIlcigbcp2 * Inv_L - + model->B4SOIwcigbcp2 * Inv_W - + model->B4SOIpcigbcp2 * Inv_LW; /* v4.0 */ - - /* Added for binning - END */ - - /* v4.0 add mstar for Vgsteff */ - pParam->B4SOImstar = 0.5 + atan(pParam->B4SOIminv) / PI; - if (model->B4SOIvgstcvMod == 0) - printf("vgstcvMod = 0, users are suggested to use vgstcvMod = 1 or 2.\n"); - /* v4.1 add mstarcv for Vgsteffcv */ - pParam->B4SOImstarcv = 0.5 + atan(pParam->B4SOIminvcv) / PI; - - T0 = (TempRatio - 1.0); - - pParam->B4SOIuatemp = pParam->B4SOIua; /* save ua, ub, and uc for b4soild.c */ - pParam->B4SOIubtemp = pParam->B4SOIub; - pParam->B4SOIuctemp = pParam->B4SOIuc; - pParam->B4SOIrds0denom = pow(pParam->B4SOIweff * 1E6, pParam->B4SOIwr); - - -/* v2.2 release */ - pParam->B4SOIrth = here->B4SOIrth0 - / (pParam->B4SOIweff + model->B4SOIwth0) - * here->B4SOInseg; - pParam->B4SOIcth = here->B4SOIcth0 - * (pParam->B4SOIweff + model->B4SOIwth0) - / here->B4SOInseg; - -/* v2.2.2 adding layout-dependent Frbody multiplier */ - pParam->B4SOIrbody = here->B4SOIfrbody *model->B4SOIrbody - * model->B4SOIrhalo - / (2 * model->B4SOIrbody - + model->B4SOIrhalo * pParam->B4SOIleff) - * pParam->B4SOIweff / here->B4SOInseg - / here->B4SOInf /* v4.0 */; - - pParam->B4SOIoxideRatio = pow(model->B4SOItoxref - /model->B4SOItoxqm, model->B4SOIntox) - /model->B4SOItoxqm/model->B4SOItoxqm; -/* v2.2 release */ - - - pParam->B4SOIua = pParam->B4SOIua + pParam->B4SOIua1 * T0; - pParam->B4SOIub = pParam->B4SOIub + pParam->B4SOIub1 * T0; - pParam->B4SOIuc = pParam->B4SOIuc + pParam->B4SOIuc1 * T0; - if (pParam->B4SOIu0 > 1.0) - pParam->B4SOIu0 = pParam->B4SOIu0 / 1.0e4; - - pParam->B4SOIu0temp = pParam->B4SOIu0 - * pow(TempRatio, pParam->B4SOIute); - pParam->B4SOIvsattemp = pParam->B4SOIvsat - pParam->B4SOIat - * T0; - pParam->B4SOIrds0 = (pParam->B4SOIrdsw - + pParam->B4SOIprt * T0) - / pow(pParam->B4SOIweff * 1E6, - pParam->B4SOIwr); - - if(model->B4SOIrdsMod) { /* v4.0 */ - PowWeffWr = pParam->B4SOIrds0denom * here->B4SOInf; - T10 = pParam->B4SOIprt * T0; - /* External Rd(V) */ - T1 = pParam->B4SOIrdw + T10; - T2 = model->B4SOIrdwmin + T10; - if (T1 < 0.0) - { T1 = 0.0; - printf("Warning: Rdw at current temperature is negative; set to 0.\n"); - } - if (T2 < 0.0) - { T2 = 0.0; - printf("Warning: Rdwmin at current temperature is negative; set to 0.\n"); - } - - pParam->B4SOIrd0 = T1 / PowWeffWr; - pParam->B4SOIrdwmin = T2 / PowWeffWr; - - /* External Rs(V) */ - T3 = pParam->B4SOIrsw + T10; - T4 = model->B4SOIrswmin + T10; - if (T3 < 0.0) - { T3 = 0.0; - printf("Warning: Rsw at current temperature is negative; set to 0.\n"); - } - if (T4 < 0.0) - { T4 = 0.0; - printf("Warning: Rswmin at current temperature is negative; set to 0.\n"); - } - pParam->B4SOIrs0 = T3 / PowWeffWr; - pParam->B4SOIrswmin = T4 / PowWeffWr; - } - - if (B4SOIcheckModel(model, here, ckt)) - { IFuid namarray[2]; - namarray[0] = model->B4SOImodName; - namarray[1] = here->B4SOIname; - (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during B4SOIV3 parameter checking for %s in model %s", namarray); - return(E_BADPARM); - } - - - pParam->B4SOIcgdo = (model->B4SOIcgdo + pParam->B4SOIcf) - * pParam->B4SOIwdiodCV; - pParam->B4SOIcgso = (model->B4SOIcgso + pParam->B4SOIcf) - * pParam->B4SOIwdiosCV; - - pParam->B4SOIcgeo = model->B4SOIcgeo * pParam->B4SOIleffCV - * here->B4SOInf; /* v4.0 */ - - - if (!model->B4SOInpeakGiven && model->B4SOIgamma1Given) - { T0 = pParam->B4SOIgamma1 * model->B4SOIcox; - pParam->B4SOInpeak = 3.021E22 * T0 * T0; - } - - - T4 = Eg300 / model->B4SOIvtm * (TempRatio - 1.0); -/* source side */ - T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndiode; - DEXP(T7, T0); - T7 = pParam->B4SOIxdif * T4 / pParam->B4SOIndiode; - DEXP(T7, T1); - T7 = pParam->B4SOIxrec * T4 / pParam->B4SOInrecf0; - DEXP(T7, T2); - - pParam->B4SOIahli0s = pParam->B4SOIahli * T0; - pParam->B4SOIjbjts = pParam->B4SOIisbjt * T0; - pParam->B4SOIjdifs = pParam->B4SOIisdif * T1; - pParam->B4SOIjrecs = pParam->B4SOIisrec * T2; - T7 = pParam->B4SOIxtun * (TempRatio - 1); - DEXP(T7, T0); - pParam->B4SOIjtuns = pParam->B4SOIistun * T0; - -/* drain side */ - pParam->B4SOIjtund = pParam->B4SOIidtun * T0; - - T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndioded; - DEXP(T7, T0); - T7 = pParam->B4SOIxdifd * T4 / pParam->B4SOIndioded; - DEXP(T7, T1); - T7 = pParam->B4SOIxrecd * T4 / pParam->B4SOInrecf0d; - DEXP(T7, T2); - - pParam->B4SOIahli0d = pParam->B4SOIahlid * T0; - pParam->B4SOIjbjtd = pParam->B4SOIidbjt * T0; - pParam->B4SOIjdifd = pParam->B4SOIiddif * T1; - pParam->B4SOIjrecd = pParam->B4SOIidrec * T2; - T7 = pParam->B4SOIxtund * (TempRatio - 1); - DEXP(T7, T0); - pParam->B4SOIjtund = pParam->B4SOIidtun * T0; - - if (pParam->B4SOInsub > 0) - pParam->B4SOIvfbb = -model->B4SOItype * model->B4SOIvtm * - log(pParam->B4SOInpeak/ pParam->B4SOInsub); - else - pParam->B4SOIvfbb = -model->B4SOItype * model->B4SOIvtm * - log(-pParam->B4SOInpeak* pParam->B4SOInsub/ni/ni); - - if (!model->B4SOIvsdfbGiven) - { - if (pParam->B4SOInsub > 0) - pParam->B4SOIvsdfb = -model->B4SOItype * - (model->B4SOIvtm*log(1e20 * - pParam->B4SOInsub / ni /ni) - 0.3); - else if (pParam->B4SOInsub < 0) - pParam->B4SOIvsdfb = -model->B4SOItype * - (model->B4SOIvtm*log(-1e20 / - pParam->B4SOInsub) + 0.3); - } - - /* Phi & Gamma */ - SDphi = 2.0*model->B4SOIvtm*log(fabs(pParam->B4SOInsub) / ni); - SDgamma = 5.753e-12 * sqrt(fabs(pParam->B4SOInsub)) - / model->B4SOIcbox; - - if (!model->B4SOIvsdthGiven) - { - if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || - ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) - pParam->B4SOIvsdth = pParam->B4SOIvsdfb + SDphi + - SDgamma * sqrt(SDphi); - else - pParam->B4SOIvsdth = pParam->B4SOIvsdfb - SDphi - - SDgamma * sqrt(SDphi); - } - - if (!model->B4SOIcsdminGiven) { - /* Cdmin */ - tmp = sqrt(2.0 * epssub * SDphi / (Charge_q * - fabs(pParam->B4SOInsub) * 1.0e6)); - tmp1 = epssub / tmp; - model->B4SOIcsdmin = tmp1 * model->B4SOIcbox / - (tmp1 + model->B4SOIcbox); - } - - - pParam->B4SOIphi = 2.0 * model->B4SOIvtm - * log(pParam->B4SOInpeak / ni); - - pParam->B4SOIsqrtPhi = sqrt(pParam->B4SOIphi); - pParam->B4SOIphis3 = pParam->B4SOIsqrtPhi * pParam->B4SOIphi; - - pParam->B4SOIXdep0 = sqrt(2.0 * epssub / (Charge_q - * pParam->B4SOInpeak * 1.0e6)) - * pParam->B4SOIsqrtPhi; - pParam->B4SOIsqrtXdep0 = sqrt(pParam->B4SOIXdep0); - /*4.1*/ - if (model->B4SOImtrlMod==0) - pParam->B4SOIlitl = sqrt(3.0 *3.9/epsrox* pParam->B4SOIxj - * model->B4SOItox); - else - pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * model->B4SOItox/(epsrox*EPS0)); - pParam->B4SOIvbi = model->B4SOIvtm * log(1.0e20 - * pParam->B4SOInpeak / (ni * ni)); - pParam->B4SOIcdep0 = sqrt(Charge_q * epssub - * pParam->B4SOInpeak * 1.0e6 / 2.0 - / pParam->B4SOIphi); - -/* v3.0 */ -/*4.1 */ - if (model->B4SOImtrlMod ==0) - { - if (pParam->B4SOIngate > 0.0) - { pParam->B4SOIvfbsd = Vtm0 * log(pParam->B4SOIngate - / 1.0e20); - } - else - pParam->B4SOIvfbsd = 0.0; - } - else - { - T0 = Vtm0 * log(pParam->B4SOInsd/ni); - T1 = 0.5 * Eg0; - if(T0 > T1) - T0 = T1; - T2 = model->B4SOIeasub + T1 - model->B4SOItype * T0; - pParam->B4SOIvfbsd = model->B4SOIphig - T2; - - - } - pParam->B4SOIToxRatio = exp(model->B4SOIntox - * log(model->B4SOItoxref /model->B4SOItoxqm)) - /model->B4SOItoxqm /model->B4SOItoxqm; - pParam->B4SOIToxRatioEdge = exp(model->B4SOIntox - * log(model->B4SOItoxref - / (model->B4SOItoxqm * pParam->B4SOIpoxedge))) - / model->B4SOItoxqm / model->B4SOItoxqm - / pParam->B4SOIpoxedge / pParam->B4SOIpoxedge; - pParam->B4SOIAechvb = (model->B4SOItype == NMOS) ? 4.97232e-7 : 3.42537e-7; - pParam->B4SOIBechvb = (model->B4SOItype == NMOS) ? 7.45669e11 : 1.16645e12; - pParam->B4SOIAechvbEdge = pParam->B4SOIAechvb * pParam->B4SOIweff/here->B4SOInseg - * pParam->B4SOIdlcig * pParam->B4SOIToxRatioEdge; /* v3.1 bug fix */ - pParam->B4SOIBechvbEdge = -pParam->B4SOIBechvb - * model->B4SOItoxqm * pParam->B4SOIpoxedge; - pParam->B4SOIAechvb *= pParam->B4SOIweff/here->B4SOInseg - * pParam->B4SOIleff - * pParam->B4SOIToxRatio - + here->B4SOIagbcpd; /* v4.0 */ - - pParam->B4SOIBechvb *= -model->B4SOItoxqm; -/* v3.0 */ - - - if (model->B4SOIk1Given || model->B4SOIk2Given) - { if (!model->B4SOIk1Given) - { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); - pParam->B4SOIk1 = 0.53; - } - if (!model->B4SOIk2Given) - { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); - pParam->B4SOIk2 = -0.0186; - } - if (model->B4SOIxtGiven) - fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); - if (model->B4SOIvbxGiven) - fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); - if (model->B4SOIvbmGiven) - fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n"); - if (model->B4SOIgamma1Given) - fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); - if (model->B4SOIgamma2Given) - fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); - } - else - { if (!model->B4SOIvbxGiven) - pParam->B4SOIvbx = pParam->B4SOIphi - 7.7348e-4 - * pParam->B4SOInpeak - * pParam->B4SOIxt * pParam->B4SOIxt; - if (pParam->B4SOIvbx > 0.0) - pParam->B4SOIvbx = -pParam->B4SOIvbx; - if (pParam->B4SOIvbm > 0.0) - pParam->B4SOIvbm = -pParam->B4SOIvbm; - - if (!model->B4SOIgamma1Given) - pParam->B4SOIgamma1 = 5.753e-12 - * sqrt(pParam->B4SOInpeak) - / model->B4SOIcox; - if (!model->B4SOIgamma2Given) - pParam->B4SOIgamma2 = 5.753e-12 - * sqrt(pParam->B4SOInsub) - / model->B4SOIcox; - - T0 = pParam->B4SOIgamma1 - pParam->B4SOIgamma2; - T1 = sqrt(pParam->B4SOIphi - pParam->B4SOIvbx) - - pParam->B4SOIsqrtPhi; - T2 = sqrt(pParam->B4SOIphi * (pParam->B4SOIphi - - pParam->B4SOIvbm)) - pParam->B4SOIphi; - pParam->B4SOIk2 = T0 * T1 / (2.0 * T2 + pParam->B4SOIvbm); - pParam->B4SOIk1 = pParam->B4SOIgamma2 - 2.0 - * pParam->B4SOIk2 * sqrt(pParam->B4SOIphi - - pParam->B4SOIvbm); - } - - if (pParam->B4SOIk2 < 0.0) - { T0 = 0.5 * pParam->B4SOIk1 / pParam->B4SOIk2; - pParam->B4SOIvbsc = 0.9 * (pParam->B4SOIphi - T0 * T0); - if (pParam->B4SOIvbsc > -3.0) - pParam->B4SOIvbsc = -3.0; - else if (pParam->B4SOIvbsc < -30.0) - pParam->B4SOIvbsc = -30.0; - } - else - { pParam->B4SOIvbsc = -30.0; - } - if (pParam->B4SOIvbsc > pParam->B4SOIvbm) - pParam->B4SOIvbsc = pParam->B4SOIvbm; - - if ((T0 = pParam->B4SOIweff + pParam->B4SOIk1w2) < 1e-8) - T0 = 1e-8; - pParam->B4SOIk1eff = pParam->B4SOIk1 * (1 + pParam->B4SOIk1w1/T0); -/*4.0 - if (model->B4SOIvth0Given) - { pParam->B4SOIvfb = model->B4SOItype * pParam->B4SOIvth0 - - pParam->B4SOIphi - pParam->B4SOIk1eff - * pParam->B4SOIsqrtPhi; - } - else - { pParam->B4SOIvfb = -1.0; - pParam->B4SOIvth0 = model->B4SOItype * (pParam->B4SOIvfb - + pParam->B4SOIphi + pParam->B4SOIk1eff - * pParam->B4SOIsqrtPhi); - } -*/ -/* v4.1 */ - if (!model->B4SOIvfbGiven) - { if (model->B4SOIvth0Given) - { pParam->B4SOIvfb = model->B4SOItype * pParam->B4SOIvth0 - - pParam->B4SOIphi - pParam->B4SOIk1eff - * pParam->B4SOIsqrtPhi; - } - else - { pParam->B4SOIvfb = -1.0; - } - } - if (!model->B4SOIvth0Given) - { pParam->B4SOIvth0 = model->B4SOItype * (pParam->B4SOIvfb - + pParam->B4SOIphi + pParam->B4SOIk1eff - * pParam->B4SOIsqrtPhi); - } -/* v4.0 */ - pParam->B4SOIk1ox = pParam->B4SOIk1eff * model->B4SOItox - / model->B4SOItoxm; - if(model->B4SOImtrlMod == 0) - T1 = sqrt(EPSSI / EPSOX * model->B4SOItox - * pParam->B4SOIXdep0); - else - T1 = sqrt(epssub / (epsrox*EPS0) * model->B4SOItox - * pParam->B4SOIXdep0); - T0 = exp(-0.5 * pParam->B4SOIdsub * pParam->B4SOIleff / T1); - pParam->B4SOItheta0vb0 = (T0 + 2.0 * T0 * T0); - - T0 = exp(-0.5 * pParam->B4SOIdrout * pParam->B4SOIleff / T1); - T2 = (T0 + 2.0 * T0 * T0); - pParam->B4SOIthetaRout = pParam->B4SOIpdibl1 * T2 - + pParam->B4SOIpdibl2; - - /* New DITS term (added in 4.1) */ - pParam->B4SOIdvtp2factor = pParam->B4SOIdvtp2 / exp(pParam->B4SOIdvtp3 * log(pParam->B4SOIleff)); - -/* stress effect */ - T0 = pow(Ldrn, model->B4SOIllodku0); - W_tmp = Wdrn + model->B4SOIwlod; - T1 = pow(W_tmp, model->B4SOIwlodku0); - tmp1 = model->B4SOIlku0 / T0 + model->B4SOIwku0 / T1 - + model->B4SOIpku0 / (T0 * T1); - pParam->B4SOIku0 = 1.0 + tmp1; - - T0 = pow(Ldrn, model->B4SOIllodvth); - T1 = pow(W_tmp, model->B4SOIwlodvth); - tmp1 = model->B4SOIlkvth0 / T0 + model->B4SOIwkvth0 / T1 - + model->B4SOIpkvth0 / (T0 * T1); - pParam->B4SOIkvth0 = 1.0 + tmp1; - pParam->B4SOIkvth0 = sqrt( pParam->B4SOIkvth0 - * pParam->B4SOIkvth0 + DELTA); - - /*T0 = (TRatio - 1.0);*/ - T0 = (TempRatio - 1.0); /* bug fix v4.1 */ - pParam->B4SOIku0temp = pParam->B4SOIku0 * (1.0 - + model->B4SOItku0 * T0) + DELTA; - - Inv_saref = 1.0 / (model->B4SOIsaref + 0.5 * Ldrn); - Inv_sbref = 1.0 / (model->B4SOIsbref + 0.5 * Ldrn); - pParam->B4SOIinv_od_ref = Inv_saref + Inv_sbref; - pParam->B4SOIrho_ref = model->B4SOIku0 / pParam->B4SOIku0temp - * pParam->B4SOIinv_od_ref; -/* stress effect end */ - - } - - here->B4SOIcsbox = model->B4SOIcbox*here->B4SOIsourceArea; - here->B4SOIcsmin = model->B4SOIcsdmin*here->B4SOIsourceArea; - here->B4SOIcdbox = model->B4SOIcbox*here->B4SOIdrainArea; - here->B4SOIcdmin = model->B4SOIcsdmin*here->B4SOIdrainArea; - - if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || - ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) - { - T0 = pParam->B4SOIvsdth - pParam->B4SOIvsdfb; - pParam->B4SOIsdt1 = pParam->B4SOIvsdfb + model->B4SOIasd * T0; - T1 = here->B4SOIcsbox - here->B4SOIcsmin; - T2 = T1 / T0 / T0; - pParam->B4SOIst2 = T2 / model->B4SOIasd; - pParam->B4SOIst3 = T2 /( 1 - model->B4SOIasd); - here->B4SOIst4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - - here->B4SOIcsmin * pParam->B4SOIvsdfb; - - T1 = here->B4SOIcdbox - here->B4SOIcdmin; - T2 = T1 / T0 / T0; - pParam->B4SOIdt2 = T2 / model->B4SOIasd; - pParam->B4SOIdt3 = T2 /( 1 - model->B4SOIasd); - here->B4SOIdt4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - - here->B4SOIcdmin * pParam->B4SOIvsdfb; - } else - { - T0 = pParam->B4SOIvsdfb - pParam->B4SOIvsdth; - pParam->B4SOIsdt1 = pParam->B4SOIvsdth + model->B4SOIasd * T0; - T1 = here->B4SOIcsmin - here->B4SOIcsbox; - T2 = T1 / T0 / T0; - pParam->B4SOIst2 = T2 / model->B4SOIasd; - pParam->B4SOIst3 = T2 /( 1 - model->B4SOIasd); - here->B4SOIst4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - - here->B4SOIcsbox * pParam->B4SOIvsdth; - - T1 = here->B4SOIcdmin - here->B4SOIcdbox; - T2 = T1 / T0 / T0; - pParam->B4SOIdt2 = T2 / model->B4SOIasd; - pParam->B4SOIdt3 = T2 /( 1 - model->B4SOIasd); - here->B4SOIdt4 = T0 * T1 * (1 + model->B4SOIasd) / 3 - - here->B4SOIcdbox * pParam->B4SOIvsdth; - } - - /* v2.2.2 bug fix */ - T0 = model->B4SOIcsdesw * log(1 + model->B4SOItsi / - model->B4SOItbox); - T1 = here->B4SOIsourcePerimeter - here->B4SOIw; - if (T1 > 0.0) - here->B4SOIcsesw = T0 * T1; - else - here->B4SOIcsesw = 0.0; - T1 = here->B4SOIdrainPerimeter - here->B4SOIw; - if (T1 > 0.0) - here->B4SOIcdesw = T0 * T1; - else - here->B4SOIcdesw = 0.0; - - - here->B4SOIphi = pParam->B4SOIphi; - /* process source/drain series resistance */ - here->B4SOIdrainConductance = model->B4SOIsheetResistance - * here->B4SOIdrainSquares; - if (here->B4SOIdrainConductance > 0.0) - here->B4SOIdrainConductance = 1.0 - / here->B4SOIdrainConductance; - else - here->B4SOIdrainConductance = 0.0; - - here->B4SOIsourceConductance = model->B4SOIsheetResistance - * here->B4SOIsourceSquares; - if (here->B4SOIsourceConductance > 0.0) - here->B4SOIsourceConductance = 1.0 - / here->B4SOIsourceConductance; - else - here->B4SOIsourceConductance = 0.0; - here->B4SOIcgso = pParam->B4SOIcgso; - here->B4SOIcgdo = pParam->B4SOIcgdo; - - -/* v2.0 release */ - if (model->B4SOIln < 1e-15) model->B4SOIln = 1e-15; - T0 = -0.5 * pParam->B4SOIleff * pParam->B4SOIleff / model->B4SOIln / model->B4SOIln; - DEXP(T0,T1); - pParam->B4SOIarfabjt = T1; - - T0 = pParam->B4SOIlbjt0 * (1.0 / pParam->B4SOIleff + 1.0 / model->B4SOIln); - pParam->B4SOIlratio = pow(T0,pParam->B4SOInbjt); - pParam->B4SOIlratiodif = 1.0 + model->B4SOIldif0 * pow(T0,pParam->B4SOIndif); - - if ((pParam->B4SOIvearly = pParam->B4SOIvabjt + pParam->B4SOIaely * pParam->B4SOIleff) < 1) - pParam->B4SOIvearly = 1; - -/*4.1 toxp calculation*/ - if(model->B4SOImtrlMod==0) - { - model->B4SOItoxp = model->B4SOItox - model->B4SOIdtoxcv; - } - else - { - /* Calculate TOXP from EOT */ - /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ - Vtm0eot = KboQ * model->B4SOItempeot; - Vtmeot = Vtm0eot; - vbieot = Vtm0eot * log(1.0e20 - * pParam->B4SOInpeak / (ni * ni)); - phieot = 2.0 * Vtm0eot - * log(pParam->B4SOInpeak / ni); - sqrtphieot = sqrt(phieot); - tmp2 = here->B4SOIvfb + phieot; - vddeot = model->B4SOItype * model->B4SOIvddeot; - - T0 = model->B4SOIepsrgate * EPS0; - if ((pParam->B4SOIngate > 1.0e18) && (pParam->B4SOIngate < 1.0e25) + if (model->B4SOIGatesidewallJctSPotential < 0.1) /* v4.0 */ + model->B4SOIGatesidewallJctSPotential = 0.1; + if (model->B4SOIGatesidewallJctDPotential < 0.1) /* v4.0 */ + model->B4SOIGatesidewallJctDPotential = 0.1; + model->pSizeDependParamKnot = NULL; + pLastKnot = NULL; + + Tnom = model->B4SOItnom; + TempRatio = Temp / Tnom; + + if(model->B4SOImtrlMod) + { + epsrox = 3.9; + toxe = model->B4SOIeot; + epssub = EPS0 * model->B4SOIepsrsub; + + } + else + { + epsrox = model->B4SOIepsrox; + toxe = model->B4SOItox; + epssub = EPSSI; + + } + + + /*model->B4SOIcox = epsrox * EPS0 / toxe;*/ + + model->B4SOIvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14)); + if(model->B4SOImtrlMod == 0) + model->B4SOIfactor1 = sqrt(EPSSI / EPSOX * model->B4SOItox); + else + model->B4SOIfactor1 = sqrt(epssub / (epsrox*EPS0) * toxe);/*4.1*/ + + if (model->B4SOImtrlMod==0) + { + Vtm0 = KboQ * Tnom; + Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0); + model->B4SOIeg0 = Eg0; + model->B4SOIvtm = KboQ * Temp; + + Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0); + model->B4SOIeg = Eg; /* Bug fix #11 Jun 09 Eg is evaluated at Temp, not Tnom. To be used if no selfheat */ + /* ni is in cm^-3 */ + ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15) + * exp(21.5565981 - Eg / (2.0 * model->B4SOIvtm)); + } + else + { Vtm0 = KboQ * Tnom; + Eg0 = model->B4SOIbg0sub - model->B4SOItbgasub * Tnom * Tnom + / (Tnom + model->B4SOItbgbsub); + model->B4SOIeg0 = Eg0; + model->B4SOIvtm = KboQ * Temp; + Eg = model->B4SOIbg0sub - model->B4SOItbgasub * Temp * Temp + / (Temp + model->B4SOItbgbsub); + model->B4SOIeg = Eg; /* Bug fix #11 Jun 09 Eg is evaluated at Temp, not Tnom. To be used if no selfheat */ + ni = model->B4SOIni0sub * (Temp / Tnom) * sqrt(Temp / Tnom) + * exp(Eg0/(2.0*Vtm0) - Eg / (2.0 * model->B4SOIvtm)); + + + } + + /* loop through all the instances of the model */ + /* MCJ: Length and Width not initialized */ + for (here = model->B4SOIinstances; here != NULL; + here = here->B4SOInextInstance) + { + here->B4SOIrbodyext = here->B4SOIbodySquares * + model->B4SOIrbsh; + pSizeDependParamKnot = model->pSizeDependParamKnot; + Size_Not_Found = 1; + while ((pSizeDependParamKnot != NULL) && Size_Not_Found) + { + if ((here->B4SOIl == pSizeDependParamKnot->Length) + && (here->B4SOIw == pSizeDependParamKnot->Width) + && (here->B4SOIrth0 == pSizeDependParamKnot->Rth0) + && (here->B4SOIcth0 == pSizeDependParamKnot->Cth0) + && (here->B4SOInf == pSizeDependParamKnot->NFinger)) /*4.0*/ + { Size_Not_Found = 0; + here->pParam = pSizeDependParamKnot; + pParam = here->pParam; /* v2.2.3 bug fix */ + } + else + { pLastKnot = pSizeDependParamKnot; + pSizeDependParamKnot = pSizeDependParamKnot->pNext; + } + } + + if (Size_Not_Found) + { pParam = (struct b4soiSizeDependParam *)malloc( + sizeof(struct b4soiSizeDependParam)); + if (pLastKnot == NULL) + model->pSizeDependParamKnot = pParam; + else + pLastKnot->pNext = pParam; + pParam->pNext = NULL; + here->pParam = pParam; + + Ldrn = here->B4SOIl; + Wdrn = here->B4SOIw / here->B4SOInf; /* v4.0 */ + pParam->Length = here->B4SOIl; + pParam->Width = here->B4SOIw; + pParam->NFinger = here->B4SOInf; /* v4.0 */ + pParam->Rth0 = here->B4SOIrth0; + pParam->Cth0 = here->B4SOIcth0; + + T0 = pow(Ldrn, model->B4SOILln); + T1 = pow(Wdrn, model->B4SOILwn); + tmp1 = model->B4SOILl / T0 + model->B4SOILw / T1 + + model->B4SOILwl / (T0 * T1); + pParam->B4SOIdl = model->B4SOILint + tmp1; + + /* v2.2.3 */ + tmp1 = model->B4SOILlc / T0 + model->B4SOILwc / T1 + + model->B4SOILwlc / (T0 * T1); + pParam->B4SOIdlc = model->B4SOIdlc + tmp1; + + /* v3.0 */ + pParam->B4SOIdlcig = model->B4SOIdlcig + tmp1; + + + T2 = pow(Ldrn, model->B4SOIWln); + T3 = pow(Wdrn, model->B4SOIWwn); + tmp2 = model->B4SOIWl / T2 + model->B4SOIWw / T3 + + model->B4SOIWwl / (T2 * T3); + pParam->B4SOIdw = model->B4SOIWint + tmp2; + + /* v2.2.3 */ + tmp2 = model->B4SOIWlc / T2 + model->B4SOIWwc / T3 + + model->B4SOIWwlc / (T2 * T3); + pParam->B4SOIdwc = model->B4SOIdwc + tmp2; + + + pParam->B4SOIleff = here->B4SOIl - 2.0 * pParam->B4SOIdl; + if (pParam->B4SOIleff <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->B4SOImodName; + namarray[1] = here->B4SOIname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B4SOI: mosfet %s, model %s: Effective channel length <= 0", + namarray); + return(E_BADPARM); + } + + pParam->B4SOIweff = here->B4SOIw / here->B4SOInf /* v4.0 */ + - here->B4SOInbc * model->B4SOIdwbc + - (2.0 - here->B4SOInbc) * pParam->B4SOIdw; + if (pParam->B4SOIweff <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->B4SOImodName; + namarray[1] = here->B4SOIname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B4SOI: mosfet %s, model %s: Effective channel width <= 0", + namarray); + return(E_BADPARM); + } + + pParam->B4SOIwdiod = pParam->B4SOIweff / here->B4SOInseg + + here->B4SOIpdbcp; + pParam->B4SOIwdios = pParam->B4SOIweff / here->B4SOInseg + + here->B4SOIpsbcp; + + pParam->B4SOIleffCV = here->B4SOIl - 2.0 * pParam->B4SOIdlc; + if (pParam->B4SOIleffCV <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->B4SOImodName; + namarray[1] = here->B4SOIname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B4SOI: mosfet %s, model %s: Effective channel length for C-V <= 0", + namarray); + return(E_BADPARM); + } + + pParam->B4SOIweffCV = here->B4SOIw /here->B4SOInf /* v4.0 */ + - here->B4SOInbc * model->B4SOIdwbc + - (2.0 - here->B4SOInbc) * pParam->B4SOIdwc; + if (pParam->B4SOIweffCV <= 0.0) + { IFuid namarray[2]; + namarray[0] = model->B4SOImodName; + namarray[1] = here->B4SOIname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B4SOI: mosfet %s, model %s: Effective channel width for C-V <= 0", + namarray); + return(E_BADPARM); + } + + pParam->B4SOIwdiodCV = pParam->B4SOIweffCV / here->B4SOInseg + + here->B4SOIpdbcp; + pParam->B4SOIwdiosCV = pParam->B4SOIweffCV / here->B4SOInseg + + here->B4SOIpsbcp; + + pParam->B4SOIleffCVb = here->B4SOIl - 2.0 * pParam->B4SOIdlc + - model->B4SOIdlcb; + if (pParam->B4SOIleffCVb <= 0.0) + { + IFuid namarray[2]; + namarray[0] = model->B4SOImodName; + namarray[1] = here->B4SOIname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B4SOI: mosfet %s, model %s: Effective channel length for C-V (body) <= 0", + namarray); + return(E_BADPARM); + } + + pParam->B4SOIleffCVbg = pParam->B4SOIleffCVb + 2 * model->B4SOIdlbg; + if (pParam->B4SOIleffCVbg <= 0.0) + { + IFuid namarray[2]; + namarray[0] = model->B4SOImodName; + namarray[1] = here->B4SOIname; + (*(SPfrontEnd->IFerror))(ERR_FATAL, + "B4SOI: mosfet %s, model %s: Effective channel length for C-V (backgate) <= 0", + namarray); + return(E_BADPARM); + } + + + /* Not binned - START */ + pParam->B4SOIgamma1 = model->B4SOIgamma1; + pParam->B4SOIgamma2 = model->B4SOIgamma2; + pParam->B4SOIvbx = model->B4SOIvbx; + pParam->B4SOIvbm = model->B4SOIvbm; + pParam->B4SOIxt = model->B4SOIxt; + /* Not binned - END */ + + /* CV model */ + pParam->B4SOIcf = model->B4SOIcf; + pParam->B4SOIclc = model->B4SOIclc; + pParam->B4SOIcle = model->B4SOIcle; + + pParam->B4SOIabulkCVfactor = 1.0 + pow((pParam->B4SOIclc + / pParam->B4SOIleff), + pParam->B4SOIcle); + + /* Added for binning - START */ + if (model->B4SOIbinUnit == 1) + { Inv_L = 1.0e-6 / pParam->B4SOIleff; + Inv_W = 1.0e-6 / pParam->B4SOIweff; + Inv_LW = 1.0e-12 / (pParam->B4SOIleff + * pParam->B4SOIweff); + } + else + { Inv_L = 1.0 / pParam->B4SOIleff; + Inv_W = 1.0 / pParam->B4SOIweff; + Inv_LW = 1.0 / (pParam->B4SOIleff + * pParam->B4SOIweff); + } + pParam->B4SOInpeak = model->B4SOInpeak + + model->B4SOIlnpeak * Inv_L + + model->B4SOIwnpeak * Inv_W + + model->B4SOIpnpeak * Inv_LW; + pParam->B4SOInsub = model->B4SOInsub + + model->B4SOIlnsub * Inv_L + + model->B4SOIwnsub * Inv_W + + model->B4SOIpnsub * Inv_LW; + pParam->B4SOIngate = model->B4SOIngate + + model->B4SOIlngate * Inv_L + + model->B4SOIwngate * Inv_W + + model->B4SOIpngate * Inv_LW; + /*4.1*/ + pParam->B4SOInsd = model->B4SOInsd + + model->B4SOIlnsd * Inv_L + + model->B4SOIwnsd * Inv_W + + model->B4SOIpnsd * Inv_LW; + + + + pParam->B4SOIvth0 = model->B4SOIvth0 + + model->B4SOIlvth0 * Inv_L + + model->B4SOIwvth0 * Inv_W + + model->B4SOIpvth0 * Inv_LW; + pParam->B4SOIvfb = model->B4SOIvfb + + model->B4SOIlvfb * Inv_L + + model->B4SOIwvfb * Inv_W + + model->B4SOIpvfb * Inv_LW; /* v4.1 */ + pParam->B4SOIk1 = model->B4SOIk1 + + model->B4SOIlk1 * Inv_L + + model->B4SOIwk1 * Inv_W + + model->B4SOIpk1 * Inv_LW; + pParam->B4SOIk2 = model->B4SOIk2 + + model->B4SOIlk2 * Inv_L + + model->B4SOIwk2 * Inv_W + + model->B4SOIpk2 * Inv_LW; + pParam->B4SOIk1w1 = model->B4SOIk1w1 + + model->B4SOIlk1w1 * Inv_L + + model->B4SOIwk1w1 * Inv_W + + model->B4SOIpk1w1 * Inv_LW; + pParam->B4SOIk1w2 = model->B4SOIk1w2 + + model->B4SOIlk1w2 * Inv_L + + model->B4SOIwk1w2 * Inv_W + + model->B4SOIpk1w2 * Inv_LW; + pParam->B4SOIk3 = model->B4SOIk3 + + model->B4SOIlk3 * Inv_L + + model->B4SOIwk3 * Inv_W + + model->B4SOIpk3 * Inv_LW; + pParam->B4SOIk3b = model->B4SOIk3b + + model->B4SOIlk3b * Inv_L + + model->B4SOIwk3b * Inv_W + + model->B4SOIpk3b * Inv_LW; + pParam->B4SOIkb1 = model->B4SOIkb1 + + model->B4SOIlkb1 * Inv_L + + model->B4SOIwkb1 * Inv_W + + model->B4SOIpkb1 * Inv_LW; + pParam->B4SOIw0 = model->B4SOIw0 + + model->B4SOIlw0 * Inv_L + + model->B4SOIww0 * Inv_W + + model->B4SOIpw0 * Inv_LW; + pParam->B4SOIlpe0 = model->B4SOIlpe0 + + model->B4SOIllpe0 * Inv_L + + model->B4SOIwlpe0 * Inv_W + + model->B4SOIplpe0 * Inv_LW; + pParam->B4SOIlpeb = model->B4SOIlpeb + + model->B4SOIllpeb * Inv_L + + model->B4SOIwlpeb * Inv_W + + model->B4SOIplpeb * Inv_LW; /* v4.0 */ + pParam->B4SOIdvt0 = model->B4SOIdvt0 + + model->B4SOIldvt0 * Inv_L + + model->B4SOIwdvt0 * Inv_W + + model->B4SOIpdvt0 * Inv_LW; + pParam->B4SOIdvt1 = model->B4SOIdvt1 + + model->B4SOIldvt1 * Inv_L + + model->B4SOIwdvt1 * Inv_W + + model->B4SOIpdvt1 * Inv_LW; + pParam->B4SOIdvt2 = model->B4SOIdvt2 + + model->B4SOIldvt2 * Inv_L + + model->B4SOIwdvt2 * Inv_W + + model->B4SOIpdvt2 * Inv_LW; + pParam->B4SOIdvt0w = model->B4SOIdvt0w + + model->B4SOIldvt0w * Inv_L + + model->B4SOIwdvt0w * Inv_W + + model->B4SOIpdvt0w * Inv_LW; + pParam->B4SOIdvt1w = model->B4SOIdvt1w + + model->B4SOIldvt1w * Inv_L + + model->B4SOIwdvt1w * Inv_W + + model->B4SOIpdvt1w * Inv_LW; + pParam->B4SOIdvt2w = model->B4SOIdvt2w + + model->B4SOIldvt2w * Inv_L + + model->B4SOIwdvt2w * Inv_W + + model->B4SOIpdvt2w * Inv_LW; + pParam->B4SOIu0 = model->B4SOIu0 + + model->B4SOIlu0 * Inv_L + + model->B4SOIwu0 * Inv_W + + model->B4SOIpu0 * Inv_LW; + pParam->B4SOIua = model->B4SOIua + + model->B4SOIlua * Inv_L + + model->B4SOIwua * Inv_W + + model->B4SOIpua * Inv_LW; + pParam->B4SOIub = model->B4SOIub + + model->B4SOIlub * Inv_L + + model->B4SOIwub * Inv_W + + model->B4SOIpub * Inv_LW; + pParam->B4SOIuc = model->B4SOIuc + + model->B4SOIluc * Inv_L + + model->B4SOIwuc * Inv_W + + model->B4SOIpuc * Inv_LW; + pParam->B4SOIvsat = model->B4SOIvsat + + model->B4SOIlvsat * Inv_L + + model->B4SOIwvsat * Inv_W + + model->B4SOIpvsat * Inv_LW; + pParam->B4SOIa0 = model->B4SOIa0 + + model->B4SOIla0 * Inv_L + + model->B4SOIwa0 * Inv_W + + model->B4SOIpa0 * Inv_LW; + pParam->B4SOIags = model->B4SOIags + + model->B4SOIlags * Inv_L + + model->B4SOIwags * Inv_W + + model->B4SOIpags * Inv_LW; + pParam->B4SOIb0 = model->B4SOIb0 + + model->B4SOIlb0 * Inv_L + + model->B4SOIwb0 * Inv_W + + model->B4SOIpb0 * Inv_LW; + pParam->B4SOIb1 = model->B4SOIb1 + + model->B4SOIlb1 * Inv_L + + model->B4SOIwb1 * Inv_W + + model->B4SOIpb1 * Inv_LW; + pParam->B4SOIketa = model->B4SOIketa + + model->B4SOIlketa * Inv_L + + model->B4SOIwketa * Inv_W + + model->B4SOIpketa * Inv_LW; + pParam->B4SOIketas = model->B4SOIketas + + model->B4SOIlketas * Inv_L + + model->B4SOIwketas * Inv_W + + model->B4SOIpketas * Inv_LW; + pParam->B4SOIa1 = model->B4SOIa1 + + model->B4SOIla1 * Inv_L + + model->B4SOIwa1 * Inv_W + + model->B4SOIpa1 * Inv_LW; + pParam->B4SOIa2 = model->B4SOIa2 + + model->B4SOIla2 * Inv_L + + model->B4SOIwa2 * Inv_W + + model->B4SOIpa2 * Inv_LW; + pParam->B4SOIrdsw = model->B4SOIrdsw + + model->B4SOIlrdsw * Inv_L + + model->B4SOIwrdsw * Inv_W + + model->B4SOIprdsw * Inv_LW; + pParam->B4SOIrsw = model->B4SOIrsw /* v4.0 */ + + model->B4SOIlrsw * Inv_L + + model->B4SOIwrsw * Inv_W + + model->B4SOIprsw * Inv_LW; + pParam->B4SOIrdw = model->B4SOIrdw /* v4.0 */ + + model->B4SOIlrdw * Inv_L + + model->B4SOIwrdw * Inv_W + + model->B4SOIprdw * Inv_LW; + pParam->B4SOIprwb = model->B4SOIprwb + + model->B4SOIlprwb * Inv_L + + model->B4SOIwprwb * Inv_W + + model->B4SOIpprwb * Inv_LW; + pParam->B4SOIprwg = model->B4SOIprwg + + model->B4SOIlprwg * Inv_L + + model->B4SOIwprwg * Inv_W + + model->B4SOIpprwg * Inv_LW; + pParam->B4SOIwr = model->B4SOIwr + + model->B4SOIlwr * Inv_L + + model->B4SOIwwr * Inv_W + + model->B4SOIpwr * Inv_LW; + pParam->B4SOInfactor = model->B4SOInfactor + + model->B4SOIlnfactor * Inv_L + + model->B4SOIwnfactor * Inv_W + + model->B4SOIpnfactor * Inv_LW; + pParam->B4SOIdwg = model->B4SOIdwg + + model->B4SOIldwg * Inv_L + + model->B4SOIwdwg * Inv_W + + model->B4SOIpdwg * Inv_LW; + pParam->B4SOIdwb = model->B4SOIdwb + + model->B4SOIldwb * Inv_L + + model->B4SOIwdwb * Inv_W + + model->B4SOIpdwb * Inv_LW; + pParam->B4SOIvoff = model->B4SOIvoff + + model->B4SOIlvoff * Inv_L + + model->B4SOIwvoff * Inv_W + + model->B4SOIpvoff * Inv_LW; + pParam->B4SOIeta0 = model->B4SOIeta0 + + model->B4SOIleta0 * Inv_L + + model->B4SOIweta0 * Inv_W + + model->B4SOIpeta0 * Inv_LW; + pParam->B4SOIetab = model->B4SOIetab + + model->B4SOIletab * Inv_L + + model->B4SOIwetab * Inv_W + + model->B4SOIpetab * Inv_LW; + pParam->B4SOIdsub = model->B4SOIdsub + + model->B4SOIldsub * Inv_L + + model->B4SOIwdsub * Inv_W + + model->B4SOIpdsub * Inv_LW; + pParam->B4SOIcit = model->B4SOIcit + + model->B4SOIlcit * Inv_L + + model->B4SOIwcit * Inv_W + + model->B4SOIpcit * Inv_LW; + pParam->B4SOIcdsc = model->B4SOIcdsc + + model->B4SOIlcdsc * Inv_L + + model->B4SOIwcdsc * Inv_W + + model->B4SOIpcdsc * Inv_LW; + pParam->B4SOIcdscb = model->B4SOIcdscb + + model->B4SOIlcdscb * Inv_L + + model->B4SOIwcdscb * Inv_W + + model->B4SOIpcdscb * Inv_LW; + pParam->B4SOIcdscd = model->B4SOIcdscd + + model->B4SOIlcdscd * Inv_L + + model->B4SOIwcdscd * Inv_W + + model->B4SOIpcdscd * Inv_LW; + pParam->B4SOIpclm = model->B4SOIpclm + + model->B4SOIlpclm * Inv_L + + model->B4SOIwpclm * Inv_W + + model->B4SOIppclm * Inv_LW; + pParam->B4SOIpdibl1 = model->B4SOIpdibl1 + + model->B4SOIlpdibl1 * Inv_L + + model->B4SOIwpdibl1 * Inv_W + + model->B4SOIppdibl1 * Inv_LW; + pParam->B4SOIpdibl2 = model->B4SOIpdibl2 + + model->B4SOIlpdibl2 * Inv_L + + model->B4SOIwpdibl2 * Inv_W + + model->B4SOIppdibl2 * Inv_LW; + pParam->B4SOIpdiblb = model->B4SOIpdiblb + + model->B4SOIlpdiblb * Inv_L + + model->B4SOIwpdiblb * Inv_W + + model->B4SOIppdiblb * Inv_LW; + pParam->B4SOIdrout = model->B4SOIdrout + + model->B4SOIldrout * Inv_L + + model->B4SOIwdrout * Inv_W + + model->B4SOIpdrout * Inv_LW; + pParam->B4SOIpvag = model->B4SOIpvag + + model->B4SOIlpvag * Inv_L + + model->B4SOIwpvag * Inv_W + + model->B4SOIppvag * Inv_LW; + pParam->B4SOIdelta = model->B4SOIdelta + + model->B4SOIldelta * Inv_L + + model->B4SOIwdelta * Inv_W + + model->B4SOIpdelta * Inv_LW; + pParam->B4SOIalpha0 = model->B4SOIalpha0 + + model->B4SOIlalpha0 * Inv_L + + model->B4SOIwalpha0 * Inv_W + + model->B4SOIpalpha0 * Inv_LW; + pParam->B4SOIfbjtii = model->B4SOIfbjtii + + model->B4SOIlfbjtii * Inv_L + + model->B4SOIwfbjtii * Inv_W + + model->B4SOIpfbjtii * Inv_LW; + /*4.1 Iii model*/ + pParam->B4SOIebjtii = model->B4SOIebjtii + + model->B4SOIlebjtii * Inv_L + + model->B4SOIwebjtii * Inv_W + + model->B4SOIpebjtii * Inv_LW; + pParam->B4SOIcbjtii = model->B4SOIcbjtii + + model->B4SOIlcbjtii * Inv_L + + model->B4SOIwcbjtii * Inv_W + + model->B4SOIpcbjtii * Inv_LW; + pParam->B4SOIvbci = model->B4SOIvbci + + model->B4SOIlvbci * Inv_L + + model->B4SOIwvbci * Inv_W + + model->B4SOIpvbci * Inv_LW; + + pParam->B4SOIabjtii = model->B4SOIabjtii + + model->B4SOIlabjtii * Inv_L + + model->B4SOIwabjtii * Inv_W + + model->B4SOIpabjtii * Inv_LW; + pParam->B4SOImbjtii = model->B4SOImbjtii + + model->B4SOIlmbjtii * Inv_L + + model->B4SOIwmbjtii * Inv_W + + model->B4SOIpmbjtii * Inv_LW; + + pParam->B4SOIbeta0 = model->B4SOIbeta0 + + model->B4SOIlbeta0 * Inv_L + + model->B4SOIwbeta0 * Inv_W + + model->B4SOIpbeta0 * Inv_LW; + pParam->B4SOIbeta1 = model->B4SOIbeta1 + + model->B4SOIlbeta1 * Inv_L + + model->B4SOIwbeta1 * Inv_W + + model->B4SOIpbeta1 * Inv_LW; + pParam->B4SOIbeta2 = model->B4SOIbeta2 + + model->B4SOIlbeta2 * Inv_L + + model->B4SOIwbeta2 * Inv_W + + model->B4SOIpbeta2 * Inv_LW; + pParam->B4SOIvdsatii0 = model->B4SOIvdsatii0 + + model->B4SOIlvdsatii0 * Inv_L + + model->B4SOIwvdsatii0 * Inv_W + + model->B4SOIpvdsatii0 * Inv_LW; + pParam->B4SOIlii = model->B4SOIlii + + model->B4SOIllii * Inv_L + + model->B4SOIwlii * Inv_W + + model->B4SOIplii * Inv_LW; + pParam->B4SOIesatii = model->B4SOIesatii + + model->B4SOIlesatii * Inv_L + + model->B4SOIwesatii * Inv_W + + model->B4SOIpesatii * Inv_LW; + pParam->B4SOIsii0 = model->B4SOIsii0 + + model->B4SOIlsii0 * Inv_L + + model->B4SOIwsii0 * Inv_W + + model->B4SOIpsii0 * Inv_LW; + pParam->B4SOIsii1 = model->B4SOIsii1 + + model->B4SOIlsii1 * Inv_L + + model->B4SOIwsii1 * Inv_W + + model->B4SOIpsii1 * Inv_LW; + pParam->B4SOIsii2 = model->B4SOIsii2 + + model->B4SOIlsii2 * Inv_L + + model->B4SOIwsii2 * Inv_W + + model->B4SOIpsii2 * Inv_LW; + pParam->B4SOIsiid = model->B4SOIsiid + + model->B4SOIlsiid * Inv_L + + model->B4SOIwsiid * Inv_W + + model->B4SOIpsiid * Inv_LW; + pParam->B4SOIagidl = model->B4SOIagidl + + model->B4SOIlagidl * Inv_L + + model->B4SOIwagidl * Inv_W + + model->B4SOIpagidl * Inv_LW; + pParam->B4SOIbgidl = model->B4SOIbgidl + + model->B4SOIlbgidl * Inv_L + + model->B4SOIwbgidl * Inv_W + + model->B4SOIpbgidl * Inv_LW; + pParam->B4SOIcgidl = model->B4SOIcgidl + + model->B4SOIlcgidl * Inv_L + + model->B4SOIwcgidl * Inv_W + + model->B4SOIpcgidl * Inv_LW; + pParam->B4SOIegidl = model->B4SOIegidl + + model->B4SOIlegidl * Inv_L + + model->B4SOIwegidl * Inv_W + + model->B4SOIpegidl * Inv_LW; + pParam->B4SOIrgidl = model->B4SOIrgidl + + model->B4SOIlrgidl * Inv_L + + model->B4SOIwrgidl * Inv_W + + model->B4SOIprgidl * Inv_LW; + pParam->B4SOIkgidl = model->B4SOIkgidl + + model->B4SOIlkgidl * Inv_L + + model->B4SOIwkgidl * Inv_W + + model->B4SOIpkgidl * Inv_LW; + pParam->B4SOIfgidl = model->B4SOIfgidl + + model->B4SOIlfgidl * Inv_L + + model->B4SOIwfgidl * Inv_W + + model->B4SOIpfgidl * Inv_LW; + pParam->B4SOIagisl = model->B4SOIagisl + + model->B4SOIlagisl * Inv_L + + model->B4SOIwagisl * Inv_W + + model->B4SOIpagisl * Inv_LW; + pParam->B4SOIbgisl = model->B4SOIbgisl + + model->B4SOIlbgisl * Inv_L + + model->B4SOIwbgisl * Inv_W + + model->B4SOIpbgisl * Inv_LW; + pParam->B4SOIcgisl = model->B4SOIcgisl + + model->B4SOIlcgisl * Inv_L + + model->B4SOIwcgisl * Inv_W + + model->B4SOIpcgisl * Inv_LW; + pParam->B4SOIegisl = model->B4SOIegisl + + model->B4SOIlegisl * Inv_L + + model->B4SOIwegisl * Inv_W + + model->B4SOIpegisl * Inv_LW; + pParam->B4SOIrgisl = model->B4SOIrgisl + + model->B4SOIlrgisl * Inv_L + + model->B4SOIwrgisl * Inv_W + + model->B4SOIprgisl * Inv_LW; + pParam->B4SOIkgisl = model->B4SOIkgisl + + model->B4SOIlkgisl * Inv_L + + model->B4SOIwkgisl * Inv_W + + model->B4SOIpkgisl * Inv_LW; + pParam->B4SOIfgisl = model->B4SOIfgisl + + model->B4SOIlfgisl * Inv_L + + model->B4SOIwfgisl * Inv_W + + model->B4SOIpfgisl * Inv_LW; + + pParam->B4SOIntun = model->B4SOIntun /* v4.0 */ + + model->B4SOIlntun * Inv_L + + model->B4SOIwntun * Inv_W + + model->B4SOIpntun * Inv_LW; + pParam->B4SOIntund = model->B4SOIntund /* v4.0 */ + + model->B4SOIlntund * Inv_L + + model->B4SOIwntund * Inv_W + + model->B4SOIpntund * Inv_LW; + pParam->B4SOIndiode = model->B4SOIndiode /* v4.0 */ + + model->B4SOIlndiode * Inv_L + + model->B4SOIwndiode * Inv_W + + model->B4SOIpndiode * Inv_LW; + pParam->B4SOIndioded = model->B4SOIndioded /* v4.0 */ + + model->B4SOIlndioded * Inv_L + + model->B4SOIwndioded * Inv_W + + model->B4SOIpndioded * Inv_LW; + pParam->B4SOInrecf0 = model->B4SOInrecf0 /* v4.0 */ + + model->B4SOIlnrecf0 * Inv_L + + model->B4SOIwnrecf0 * Inv_W + + model->B4SOIpnrecf0 * Inv_LW; + pParam->B4SOInrecf0d = model->B4SOInrecf0d /* v4.0 */ + + model->B4SOIlnrecf0d * Inv_L + + model->B4SOIwnrecf0d * Inv_W + + model->B4SOIpnrecf0d * Inv_LW; + pParam->B4SOInrecr0 = model->B4SOInrecr0 /* v4.0 */ + + model->B4SOIlnrecr0 * Inv_L + + model->B4SOIwnrecr0 * Inv_W + + model->B4SOIpnrecr0 * Inv_LW; + pParam->B4SOInrecr0d = model->B4SOInrecr0d /* v4.0 */ + + model->B4SOIlnrecr0d * Inv_L + + model->B4SOIwnrecr0d * Inv_W + + model->B4SOIpnrecr0d * Inv_LW; + pParam->B4SOIisbjt = model->B4SOIisbjt + + model->B4SOIlisbjt * Inv_L + + model->B4SOIwisbjt * Inv_W + + model->B4SOIpisbjt * Inv_LW; + pParam->B4SOIidbjt = model->B4SOIidbjt + + model->B4SOIlidbjt * Inv_L + + model->B4SOIwidbjt * Inv_W + + model->B4SOIpidbjt * Inv_LW; + pParam->B4SOIisdif = model->B4SOIisdif + + model->B4SOIlisdif * Inv_L + + model->B4SOIwisdif * Inv_W + + model->B4SOIpisdif * Inv_LW; + pParam->B4SOIiddif = model->B4SOIiddif + + model->B4SOIliddif * Inv_L + + model->B4SOIwiddif * Inv_W + + model->B4SOIpiddif * Inv_LW; + pParam->B4SOIisrec = model->B4SOIisrec + + model->B4SOIlisrec * Inv_L + + model->B4SOIwisrec * Inv_W + + model->B4SOIpisrec * Inv_LW; + pParam->B4SOIistun = model->B4SOIistun + + model->B4SOIlistun * Inv_L + + model->B4SOIwistun * Inv_W + + model->B4SOIpistun * Inv_LW; + pParam->B4SOIidrec = model->B4SOIidrec + + model->B4SOIlidrec * Inv_L + + model->B4SOIwidrec * Inv_W + + model->B4SOIpidrec * Inv_LW; + pParam->B4SOIidtun = model->B4SOIidtun + + model->B4SOIlidtun * Inv_L + + model->B4SOIwidtun * Inv_W + + model->B4SOIpidtun * Inv_LW; + pParam->B4SOIvrec0 = model->B4SOIvrec0 /* v4.0 */ + + model->B4SOIlvrec0 * Inv_L + + model->B4SOIwvrec0 * Inv_W + + model->B4SOIpvrec0 * Inv_LW; + pParam->B4SOIvrec0d = model->B4SOIvrec0d /* v4.0 */ + + model->B4SOIlvrec0d * Inv_L + + model->B4SOIwvrec0d * Inv_W + + model->B4SOIpvrec0d * Inv_LW; + pParam->B4SOIvtun0 = model->B4SOIvtun0 /* v4.0 */ + + model->B4SOIlvtun0 * Inv_L + + model->B4SOIwvtun0 * Inv_W + + model->B4SOIpvtun0 * Inv_LW; + pParam->B4SOIvtun0d = model->B4SOIvtun0d /* v4.0 */ + + model->B4SOIlvtun0d * Inv_L + + model->B4SOIwvtun0d * Inv_W + + model->B4SOIpvtun0d * Inv_LW; + pParam->B4SOInbjt = model->B4SOInbjt + + model->B4SOIlnbjt * Inv_L + + model->B4SOIwnbjt * Inv_W + + model->B4SOIpnbjt * Inv_LW; + pParam->B4SOIlbjt0 = model->B4SOIlbjt0 + + model->B4SOIllbjt0 * Inv_L + + model->B4SOIwlbjt0 * Inv_W + + model->B4SOIplbjt0 * Inv_LW; + pParam->B4SOIvabjt = model->B4SOIvabjt + + model->B4SOIlvabjt * Inv_L + + model->B4SOIwvabjt * Inv_W + + model->B4SOIpvabjt * Inv_LW; + pParam->B4SOIaely = model->B4SOIaely + + model->B4SOIlaely * Inv_L + + model->B4SOIwaely * Inv_W + + model->B4SOIpaely * Inv_LW; + pParam->B4SOIahli = model->B4SOIahli /* v4.0 */ + + model->B4SOIlahli * Inv_L + + model->B4SOIwahli * Inv_W + + model->B4SOIpahli * Inv_LW; + pParam->B4SOIahlid = model->B4SOIahlid /* v4.0 */ + + model->B4SOIlahlid * Inv_L + + model->B4SOIwahlid * Inv_W + + model->B4SOIpahlid * Inv_LW; + + + /* v3.1 */ + pParam->B4SOIxj = model->B4SOIxj + + model->B4SOIlxj * Inv_L + + model->B4SOIwxj * Inv_W + + model->B4SOIpxj * Inv_LW; + pParam->B4SOIalphaGB1 = model->B4SOIalphaGB1 + + model->B4SOIlalphaGB1 * Inv_L + + model->B4SOIwalphaGB1 * Inv_W + + model->B4SOIpalphaGB1 * Inv_LW; + pParam->B4SOIalphaGB2 = model->B4SOIalphaGB2 + + model->B4SOIlalphaGB2 * Inv_L + + model->B4SOIwalphaGB2 * Inv_W + + model->B4SOIpalphaGB2 * Inv_LW; + pParam->B4SOIbetaGB1 = model->B4SOIbetaGB1 + + model->B4SOIlbetaGB1* Inv_L + + model->B4SOIwbetaGB1 * Inv_W + + model->B4SOIpbetaGB1 * Inv_LW; + pParam->B4SOIbetaGB2 = model->B4SOIbetaGB2 + + model->B4SOIlbetaGB2 * Inv_L + + model->B4SOIwbetaGB2 * Inv_W + + model->B4SOIpbetaGB2 * Inv_LW; + pParam->B4SOIndif = model->B4SOIndif + + model->B4SOIlndif * Inv_L + + model->B4SOIwndif * Inv_W + + model->B4SOIpndif * Inv_LW; + pParam->B4SOIntrecf = model->B4SOIntrecf + + model->B4SOIlntrecf* Inv_L + + model->B4SOIwntrecf * Inv_W + + model->B4SOIpntrecf * Inv_LW; + pParam->B4SOIntrecr = model->B4SOIntrecr + + model->B4SOIlntrecr * Inv_L + + model->B4SOIwntrecr * Inv_W + + model->B4SOIpntrecr * Inv_LW; + pParam->B4SOIxbjt = model->B4SOIxbjt + + model->B4SOIlxbjt * Inv_L + + model->B4SOIwxbjt * Inv_W + + model->B4SOIpxbjt * Inv_LW; + pParam->B4SOIxdif = model->B4SOIxdif + + model->B4SOIlxdif* Inv_L + + model->B4SOIwxdif * Inv_W + + model->B4SOIpxdif * Inv_LW; + pParam->B4SOIxrec = model->B4SOIxrec + + model->B4SOIlxrec * Inv_L + + model->B4SOIwxrec * Inv_W + + model->B4SOIpxrec * Inv_LW; + pParam->B4SOIxtun = model->B4SOIxtun + + model->B4SOIlxtun * Inv_L + + model->B4SOIwxtun * Inv_W + + model->B4SOIpxtun * Inv_LW; + pParam->B4SOIxdifd = model->B4SOIxdifd + + model->B4SOIlxdifd* Inv_L + + model->B4SOIwxdifd * Inv_W + + model->B4SOIpxdifd * Inv_LW; + pParam->B4SOIxrecd = model->B4SOIxrecd + + model->B4SOIlxrecd * Inv_L + + model->B4SOIwxrecd * Inv_W + + model->B4SOIpxrecd * Inv_LW; + pParam->B4SOIxtund = model->B4SOIxtund + + model->B4SOIlxtund * Inv_L + + model->B4SOIwxtund * Inv_W + + model->B4SOIpxtund * Inv_LW; + pParam->B4SOIcgdl = model->B4SOIcgdl + + model->B4SOIlcgdl * Inv_L + + model->B4SOIwcgdl * Inv_W + + model->B4SOIpcgdl * Inv_LW; + pParam->B4SOIcgsl = model->B4SOIcgsl + + model->B4SOIlcgsl * Inv_L + + model->B4SOIwcgsl * Inv_W + + model->B4SOIpcgsl * Inv_LW; + pParam->B4SOIckappa = model->B4SOIckappa + + model->B4SOIlckappa * Inv_L + + model->B4SOIwckappa * Inv_W + + model->B4SOIpckappa * Inv_LW; + pParam->B4SOIute = model->B4SOIute + + model->B4SOIlute * Inv_L + + model->B4SOIwute * Inv_W + + model->B4SOIpute * Inv_LW; + + /*4.1 mobmod=4*/ + pParam->B4SOIud = model->B4SOIud + /* + model->B4SOIud * Inv_L*//*Bug #15 Jun 09*/ + + model->B4SOIlud * Inv_L /*Fix*/ + + model->B4SOIwud * Inv_W + + model->B4SOIpud * Inv_LW; + + pParam->B4SOIud1 = model->B4SOIud1 + + model->B4SOIlud1 * Inv_L + + model->B4SOIwud1 * Inv_W + + model->B4SOIpud1 * Inv_LW; + pParam->B4SOIeu = model->B4SOIeu + + model->B4SOIleu * Inv_L + + model->B4SOIweu * Inv_W + + model->B4SOIpeu * Inv_LW; + pParam->B4SOIucs = model->B4SOIucs + + model->B4SOIlucs * Inv_L + + model->B4SOIwucs * Inv_W + + model->B4SOIpucs * Inv_LW; + pParam->B4SOIucste = model->B4SOIucste + + model->B4SOIlucste * Inv_L + + model->B4SOIwucste * Inv_W + + model->B4SOIpucste * Inv_LW; + + pParam->B4SOIkt1 = model->B4SOIkt1 + + model->B4SOIlkt1 * Inv_L + + model->B4SOIwkt1 * Inv_W + + model->B4SOIpkt1 * Inv_LW; + pParam->B4SOIkt2 = model->B4SOIkt2 + + model->B4SOIlkt2 * Inv_L + + model->B4SOIwkt2 * Inv_W + + model->B4SOIpkt2 * Inv_LW; + pParam->B4SOIkt1l = model->B4SOIkt1l + + model->B4SOIlkt1l * Inv_L + + model->B4SOIwkt1l * Inv_W + + model->B4SOIpkt1l * Inv_LW; + pParam->B4SOIua1 = model->B4SOIua1 + + model->B4SOIlua1 * Inv_L + + model->B4SOIwua1 * Inv_W + + model->B4SOIpua1 * Inv_LW; + pParam->B4SOIub1 = model->B4SOIub1 + + model->B4SOIlub1* Inv_L + + model->B4SOIwub1 * Inv_W + + model->B4SOIpub1 * Inv_LW; + pParam->B4SOIuc1 = model->B4SOIuc1 + + model->B4SOIluc1 * Inv_L + + model->B4SOIwuc1 * Inv_W + + model->B4SOIpuc1 * Inv_LW; + pParam->B4SOIat = model->B4SOIat + + model->B4SOIlat * Inv_L + + model->B4SOIwat * Inv_W + + model->B4SOIpat * Inv_LW; + pParam->B4SOIprt = model->B4SOIprt + + model->B4SOIlprt * Inv_L + + model->B4SOIwprt * Inv_W + + model->B4SOIpprt * Inv_LW; + + + /* v3.0 */ + pParam->B4SOInigc = model->B4SOInigc + + model->B4SOIlnigc * Inv_L + + model->B4SOIwnigc * Inv_W + + model->B4SOIpnigc * Inv_LW; + pParam->B4SOIaigc = model->B4SOIaigc + + model->B4SOIlaigc * Inv_L + + model->B4SOIwaigc * Inv_W + + model->B4SOIpaigc * Inv_LW; + pParam->B4SOIbigc = model->B4SOIbigc + + model->B4SOIlbigc * Inv_L + + model->B4SOIwbigc * Inv_W + + model->B4SOIpbigc * Inv_LW; + pParam->B4SOIcigc = model->B4SOIcigc + + model->B4SOIlcigc * Inv_L + + model->B4SOIwcigc * Inv_W + + model->B4SOIpcigc * Inv_LW; + pParam->B4SOIaigsd = model->B4SOIaigsd + + model->B4SOIlaigsd * Inv_L + + model->B4SOIwaigsd * Inv_W + + model->B4SOIpaigsd * Inv_LW; + pParam->B4SOIbigsd = model->B4SOIbigsd + + model->B4SOIlbigsd * Inv_L + + model->B4SOIwbigsd * Inv_W + + model->B4SOIpbigsd * Inv_LW; + pParam->B4SOIcigsd = model->B4SOIcigsd + + model->B4SOIlcigsd * Inv_L + + model->B4SOIwcigsd * Inv_W + + model->B4SOIpcigsd * Inv_LW; + pParam->B4SOIpigcd = model->B4SOIpigcd + + model->B4SOIlpigcd * Inv_L + + model->B4SOIwpigcd * Inv_W + + model->B4SOIppigcd * Inv_LW; + pParam->B4SOIpoxedge = model->B4SOIpoxedge + + model->B4SOIlpoxedge * Inv_L + + model->B4SOIwpoxedge * Inv_W + + model->B4SOIppoxedge * Inv_LW; + /* v3.0 */ + + /* v3.1 added for RF */ + pParam->B4SOIxrcrg1 = model->B4SOIxrcrg1 + + model->B4SOIlxrcrg1 * Inv_L + + model->B4SOIwxrcrg1 * Inv_W + + model->B4SOIpxrcrg1 * Inv_LW; + pParam->B4SOIxrcrg2 = model->B4SOIxrcrg2 + + model->B4SOIlxrcrg2 * Inv_L + + model->B4SOIwxrcrg2 * Inv_W + + model->B4SOIpxrcrg2 * Inv_LW; + /* v3.1 added for RF end */ + + + /* CV model */ + pParam->B4SOIvsdfb = model->B4SOIvsdfb + + model->B4SOIlvsdfb * Inv_L + + model->B4SOIwvsdfb * Inv_W + + model->B4SOIpvsdfb * Inv_LW; + pParam->B4SOIvsdth = model->B4SOIvsdth + + model->B4SOIlvsdth * Inv_L + + model->B4SOIwvsdth * Inv_W + + model->B4SOIpvsdth * Inv_LW; + pParam->B4SOIdelvt = model->B4SOIdelvt + + model->B4SOIldelvt * Inv_L + + model->B4SOIwdelvt * Inv_W + + model->B4SOIpdelvt * Inv_LW; + pParam->B4SOIacde = model->B4SOIacde + + model->B4SOIlacde * Inv_L + + model->B4SOIwacde * Inv_W + + model->B4SOIpacde * Inv_LW; + pParam->B4SOIacde = pParam->B4SOIacde * + pow((pParam->B4SOInpeak / 2.0e16), -0.25); + /* v3.2 bug fix */ + + pParam->B4SOImoin = model->B4SOImoin + + model->B4SOIlmoin * Inv_L + + model->B4SOIwmoin * Inv_W + + model->B4SOIpmoin * Inv_LW; + pParam->B4SOInoff = model->B4SOInoff + + model->B4SOIlnoff * Inv_L + + model->B4SOIwnoff * Inv_W + + model->B4SOIpnoff * Inv_LW; /* v3.2 */ + + pParam->B4SOIdvtp0 = model->B4SOIdvtp0 + + model->B4SOIldvtp0 * Inv_L + + model->B4SOIwdvtp0 * Inv_W + + model->B4SOIpdvtp0 * Inv_LW; /* v4.0 */ + pParam->B4SOIdvtp1 = model->B4SOIdvtp1 + + model->B4SOIldvtp1 * Inv_L + + model->B4SOIwdvtp1 * Inv_W + + model->B4SOIpdvtp1 * Inv_LW; /* v4.0 */ + pParam->B4SOIdvtp2 = model->B4SOIdvtp2 + + model->B4SOIldvtp2 * Inv_L + + model->B4SOIwdvtp2 * Inv_W + + model->B4SOIpdvtp2 * Inv_LW; /* v4.1 */ + pParam->B4SOIdvtp3 = model->B4SOIdvtp3 + + model->B4SOIldvtp3 * Inv_L + + model->B4SOIwdvtp3 * Inv_W + + model->B4SOIpdvtp3 * Inv_LW; /* v4.1 */ + pParam->B4SOIdvtp4 = model->B4SOIdvtp4 + + model->B4SOIldvtp4 * Inv_L + + model->B4SOIwdvtp4 * Inv_W + + model->B4SOIpdvtp4 * Inv_LW; /* v4.1 */ + pParam->B4SOIminv = model->B4SOIminv + + model->B4SOIlminv * Inv_L + + model->B4SOIwminv * Inv_W + + model->B4SOIpminv * Inv_LW; /* v4.0 */ + pParam->B4SOIminvcv = model->B4SOIminvcv + + model->B4SOIlminvcv * Inv_L + + model->B4SOIwminvcv * Inv_W + + model->B4SOIpminvcv * Inv_LW; /* v4.1 */ + pParam->B4SOIvoffcv = model->B4SOIvoffcv /*Bug fix # 16 Jun09*/ + + model->B4SOIlvoffcv * Inv_L + + model->B4SOIwvoffcv * Inv_W + + model->B4SOIpvoffcv * Inv_LW; + pParam->B4SOIfprout = model->B4SOIfprout + + model->B4SOIlfprout * Inv_L + + model->B4SOIwfprout * Inv_W + + model->B4SOIpfprout * Inv_LW; /* v4.0 */ + pParam->B4SOIpdits = model->B4SOIpdits + + model->B4SOIlpdits * Inv_L + + model->B4SOIwpdits * Inv_W + + model->B4SOIppdits * Inv_LW; /* v4.0 */ + pParam->B4SOIpditsd = model->B4SOIpditsd + + model->B4SOIlpditsd * Inv_L + + model->B4SOIwpditsd * Inv_W + + model->B4SOIppditsd * Inv_LW; /* v4.0 */ + pParam->B4SOIaigbcp2 = model->B4SOIaigbcp2 + + model->B4SOIlaigbcp2 * Inv_L + + model->B4SOIwaigbcp2 * Inv_W + + model->B4SOIpaigbcp2 * Inv_LW; /* v4.0 */ + pParam->B4SOIbigbcp2 = model->B4SOIbigbcp2 + + model->B4SOIlbigbcp2 * Inv_L + + model->B4SOIwbigbcp2 * Inv_W + + model->B4SOIpbigbcp2 * Inv_LW; /* v4.0 */ + pParam->B4SOIcigbcp2 = model->B4SOIcigbcp2 + + model->B4SOIlcigbcp2 * Inv_L + + model->B4SOIwcigbcp2 * Inv_W + + model->B4SOIpcigbcp2 * Inv_LW; /* v4.0 */ + + /* Added for binning - END */ + + /* v4.0 add mstar for Vgsteff */ + pParam->B4SOImstar = 0.5 + atan(pParam->B4SOIminv) / PI; + if (model->B4SOIvgstcvMod == 0) + printf("vgstcvMod = 0, users are suggested to use vgstcvMod = 1 or 2.\n"); + /* v4.1 add mstarcv for Vgsteffcv */ + pParam->B4SOImstarcv = 0.5 + atan(pParam->B4SOIminvcv) / PI; + + T0 = (TempRatio - 1.0); + + pParam->B4SOIuatemp = pParam->B4SOIua; /* save ua, ub, and uc for b4soild.c */ + pParam->B4SOIubtemp = pParam->B4SOIub; + pParam->B4SOIuctemp = pParam->B4SOIuc; + pParam->B4SOIrds0denom = pow(pParam->B4SOIweff * 1E6, pParam->B4SOIwr); + + + /* v2.2 release */ + pParam->B4SOIrth = here->B4SOIrth0 + / (pParam->B4SOIweff + model->B4SOIwth0) + * here->B4SOInseg / here->B4SOInf; /* bugfix_snps nf*/ + pParam->B4SOIcth = here->B4SOIcth0 + * (pParam->B4SOIweff + model->B4SOIwth0) + / here->B4SOInseg * here->B4SOInf; /* bugfix_snps nf*/ + + /* v2.2.2 adding layout-dependent Frbody multiplier */ + /* pParam->B4SOIrbody = here->B4SOIfrbody *model->B4SOIrbody + * model->B4SOIrhalo + / (2 * model->B4SOIrbody + + model->B4SOIrhalo * pParam->B4SOIleff) + * pParam->B4SOIweff / here->B4SOInseg + / here->B4SOInf */ /* v4.0 *//*;*/ + + if (model->B4SOIrbody == 0) /* Bug Fix # 27 added to avoid NaN (0/0) in QA*/ + pParam->B4SOIrbody = 0; + else + pParam->B4SOIrbody = here->B4SOIfrbody *model->B4SOIrbody + * model->B4SOIrhalo + / (2 * model->B4SOIrbody + + model->B4SOIrhalo * pParam->B4SOIleff) + * pParam->B4SOIweff / here->B4SOInseg/ here->B4SOInf; /* v4.0 */ + + pParam->B4SOIoxideRatio = pow(model->B4SOItoxref + /model->B4SOItoxqm, model->B4SOIntox) + /model->B4SOItoxqm/model->B4SOItoxqm; + /* v2.2 release */ + + + pParam->B4SOIua = pParam->B4SOIua + pParam->B4SOIua1 * T0; + pParam->B4SOIub = pParam->B4SOIub + pParam->B4SOIub1 * T0; + pParam->B4SOIuc = pParam->B4SOIuc + pParam->B4SOIuc1 * T0; + if (pParam->B4SOIu0 > 1.0) + pParam->B4SOIu0 = pParam->B4SOIu0 / 1.0e4; + + pParam->B4SOIu0temp = pParam->B4SOIu0 + * pow(TempRatio, pParam->B4SOIute); + pParam->B4SOIvsattemp = pParam->B4SOIvsat - pParam->B4SOIat + * T0; + pParam->B4SOIrds0 = (pParam->B4SOIrdsw + + pParam->B4SOIprt * T0) + / pow(pParam->B4SOIweff * 1E6, + pParam->B4SOIwr); + + if(model->B4SOIrdsMod) { /* v4.0 */ + PowWeffWr = pParam->B4SOIrds0denom * here->B4SOInf; + T10 = pParam->B4SOIprt * T0; + /* External Rd(V) */ + T1 = pParam->B4SOIrdw + T10; + T2 = model->B4SOIrdwmin + T10; + if (T1 < 0.0) + { T1 = 0.0; + printf("Warning: Rdw at current temperature is negative; set to 0.\n"); + } + if (T2 < 0.0) + { T2 = 0.0; + printf("Warning: Rdwmin at current temperature is negative; set to 0.\n"); + } + + pParam->B4SOIrd0 = T1 / PowWeffWr; + pParam->B4SOIrdwmin = T2 / PowWeffWr; + + /* External Rs(V) */ + T3 = pParam->B4SOIrsw + T10; + T4 = model->B4SOIrswmin + T10; + if (T3 < 0.0) + { T3 = 0.0; + printf("Warning: Rsw at current temperature is negative; set to 0.\n"); + } + if (T4 < 0.0) + { T4 = 0.0; + printf("Warning: Rswmin at current temperature is negative; set to 0.\n"); + } + pParam->B4SOIrs0 = T3 / PowWeffWr; + pParam->B4SOIrswmin = T4 / PowWeffWr; + } + + if (B4SOIcheckModel(model, here, ckt)) + { IFuid namarray[2]; + namarray[0] = model->B4SOImodName; + namarray[1] = here->B4SOIname; + (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during B4SOIV3 parameter checking for %s in model %s", namarray); + return(E_BADPARM); + } + + + pParam->B4SOIcgdo = (model->B4SOIcgdo + pParam->B4SOIcf) + * pParam->B4SOIwdiodCV; + pParam->B4SOIcgso = (model->B4SOIcgso + pParam->B4SOIcf) + * pParam->B4SOIwdiosCV; + + pParam->B4SOIcgeo = model->B4SOIcgeo * pParam->B4SOIleffCV + * here->B4SOInf; /* v4.0 */ + + + if (!model->B4SOInpeakGiven && model->B4SOIgamma1Given) + { T0 = pParam->B4SOIgamma1 * model->B4SOIcox; + pParam->B4SOInpeak = 3.021E22 * T0 * T0; + } + + + T4 = Eg300 / model->B4SOIvtm * (TempRatio - 1.0); + /* source side */ + T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndiode; + DEXP(T7, T0); + T7 = pParam->B4SOIxdif * T4 / pParam->B4SOIndiode; + DEXP(T7, T1); + T7 = pParam->B4SOIxrec * T4 / pParam->B4SOInrecf0; + DEXP(T7, T2); + + pParam->B4SOIahli0s = pParam->B4SOIahli * T0; + pParam->B4SOIjbjts = pParam->B4SOIisbjt * T0; + pParam->B4SOIjdifs = pParam->B4SOIisdif * T1; + pParam->B4SOIjrecs = pParam->B4SOIisrec * T2; + T7 = pParam->B4SOIxtun * (TempRatio - 1); + DEXP(T7, T0); + pParam->B4SOIjtuns = pParam->B4SOIistun * T0; + + /* drain side */ + /* pParam->B4SOIjtund = pParam->B4SOIidtun * T0; */ /*v4.2 redundant */ + + T7 = pParam->B4SOIxbjt * T4 / pParam->B4SOIndioded; + DEXP(T7, T0); + T7 = pParam->B4SOIxdifd * T4 / pParam->B4SOIndioded; + DEXP(T7, T1); + T7 = pParam->B4SOIxrecd * T4 / pParam->B4SOInrecf0d; + DEXP(T7, T2); + + pParam->B4SOIahli0d = pParam->B4SOIahlid * T0; + pParam->B4SOIjbjtd = pParam->B4SOIidbjt * T0; + pParam->B4SOIjdifd = pParam->B4SOIiddif * T1; + pParam->B4SOIjrecd = pParam->B4SOIidrec * T2; + T7 = pParam->B4SOIxtund * (TempRatio - 1); + DEXP(T7, T0); + pParam->B4SOIjtund = pParam->B4SOIidtun * T0; + + if (pParam->B4SOInsub > 0) + pParam->B4SOIvfbb = -model->B4SOItype * model->B4SOIvtm * + log(pParam->B4SOInpeak/ pParam->B4SOInsub); + else + pParam->B4SOIvfbb = -model->B4SOItype * model->B4SOIvtm * + log(-pParam->B4SOInpeak* pParam->B4SOInsub/ni/ni); + + if (!model->B4SOIvsdfbGiven) + { + if (pParam->B4SOInsub > 0) + pParam->B4SOIvsdfb = -model->B4SOItype * + (model->B4SOIvtm*log(1e20 * + pParam->B4SOInsub / ni /ni) - 0.3); + else if (pParam->B4SOInsub < 0) + pParam->B4SOIvsdfb = -model->B4SOItype * + (model->B4SOIvtm*log(-1e20 / + pParam->B4SOInsub) + 0.3); + } + + /* Phi & Gamma */ + SDphi = 2.0*model->B4SOIvtm*log(fabs(pParam->B4SOInsub) / ni); + SDgamma = 5.753e-12 * sqrt(fabs(pParam->B4SOInsub)) + / model->B4SOIcbox; + + if (!model->B4SOIvsdthGiven) + { + if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || + ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) + pParam->B4SOIvsdth = pParam->B4SOIvsdfb + SDphi + + SDgamma * sqrt(SDphi); + else + pParam->B4SOIvsdth = pParam->B4SOIvsdfb - SDphi - + SDgamma * sqrt(SDphi); + } + + if (!model->B4SOIcsdminGiven) { + /* Cdmin */ + tmp = sqrt(2.0 * epssub * SDphi / (Charge_q * + fabs(pParam->B4SOInsub) * 1.0e6)); + tmp1 = epssub / tmp; + model->B4SOIcsdmin = tmp1 * model->B4SOIcbox / + (tmp1 + model->B4SOIcbox); + } + + + pParam->B4SOIphi = 2.0 * model->B4SOIvtm + * log(pParam->B4SOInpeak / ni); + + pParam->B4SOIsqrtPhi = sqrt(pParam->B4SOIphi); + pParam->B4SOIphis3 = pParam->B4SOIsqrtPhi * pParam->B4SOIphi; + + pParam->B4SOIXdep0 = sqrt(2.0 * epssub / (Charge_q + * pParam->B4SOInpeak * 1.0e6)) + * pParam->B4SOIsqrtPhi; + pParam->B4SOIsqrtXdep0 = sqrt(pParam->B4SOIXdep0); + /*4.1*/ + if (model->B4SOImtrlMod==0) + pParam->B4SOIlitl = sqrt(3.0 *3.9/epsrox* pParam->B4SOIxj + * model->B4SOItox); + else + /* pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * model->B4SOItox/(epsrox*EPS0)); */ /* Bug fix # 13 Jun 09 'not reported by vendors'*/ + pParam->B4SOIlitl = sqrt(epssub * pParam->B4SOIxj * toxe/(epsrox*EPS0)); /* fix */ + pParam->B4SOIvbi = model->B4SOIvtm * log(1.0e20 + * pParam->B4SOInpeak / (ni * ni)); + pParam->B4SOIcdep0 = sqrt(Charge_q * epssub + * pParam->B4SOInpeak * 1.0e6 / 2.0 + / pParam->B4SOIphi); + + /* v3.0 */ + /*4.1 */ + if (model->B4SOImtrlMod ==0) + { + if (pParam->B4SOIngate > 0.0) + { pParam->B4SOIvfbsd = Vtm0 * log(pParam->B4SOIngate + / 1.0e20); + } + else + pParam->B4SOIvfbsd = 0.0; + } + else + { + T0 = Vtm0 * log(pParam->B4SOInsd/ni); + T1 = 0.5 * Eg0; + if(T0 > T1) + T0 = T1; + T2 = model->B4SOIeasub + T1 - model->B4SOItype * T0; + pParam->B4SOIvfbsd = model->B4SOIphig - T2; + + + } + pParam->B4SOIToxRatio = exp(model->B4SOIntox + * log(model->B4SOItoxref /model->B4SOItoxqm)) + /model->B4SOItoxqm /model->B4SOItoxqm; + pParam->B4SOIToxRatioEdge = exp(model->B4SOIntox + * log(model->B4SOItoxref + / (model->B4SOItoxqm * pParam->B4SOIpoxedge))) + / model->B4SOItoxqm / model->B4SOItoxqm + / pParam->B4SOIpoxedge / pParam->B4SOIpoxedge; + pParam->B4SOIAechvb = (model->B4SOItype == NMOS) ? 4.97232e-7 : 3.42537e-7; + pParam->B4SOIBechvb = (model->B4SOItype == NMOS) ? 7.45669e11 : 1.16645e12; +// The edge should have a contribution from psbcp & pdbcp. Need s & d terms. +// There is no NF correction because psbcp & pdbcp are "per finger" in manual. + pParam->B4SOIAechvbEdges = pParam->B4SOIAechvb + * (pParam->B4SOIweff/here->B4SOInseg + here->B4SOIpsbcp) + * pParam->B4SOIdlcig * pParam->B4SOIToxRatioEdge; /* v3.1 bug fix */ + pParam->B4SOIAechvbEdged = pParam->B4SOIAechvb + * (pParam->B4SOIweff/here->B4SOInseg + here->B4SOIpdbcp) + * pParam->B4SOIdlcig * pParam->B4SOIToxRatioEdge; /* v3.1 bug fix */ + pParam->B4SOIBechvbEdge = -pParam->B4SOIBechvb + * model->B4SOItoxqm * pParam->B4SOIpoxedge; +/* pParam->B4SOIAechvb *= pParam->B4SOIweff/here->B4SOInseg */ +/* * pParam->B4SOIleff */ +/* * pParam->B4SOIToxRatio */ +/* + here->B4SOIagbcpd; v4.0 */ + pParam->B4SOIAechvb *= (pParam->B4SOIweff/here->B4SOInseg + * pParam->B4SOIleff + + here->B4SOIagbcpd/here->B4SOInf) /* LFW */ + * pParam->B4SOIToxRatio; /* From Geoffrey Coram 10/22/09 */ + + pParam->B4SOIBechvb *= -model->B4SOItoxqm; + /* v3.0 */ + + + if (model->B4SOIk1Given || model->B4SOIk2Given) + { if (!model->B4SOIk1Given) + { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); + pParam->B4SOIk1 = 0.53; + } + if (!model->B4SOIk2Given) + { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); + pParam->B4SOIk2 = -0.0186; + } + if (model->B4SOIxtGiven) + fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); + if (model->B4SOIvbxGiven) + fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); + if (model->B4SOIvbmGiven) + fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n"); + if (model->B4SOIgamma1Given) + fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); + if (model->B4SOIgamma2Given) + fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); + } + else + { if (!model->B4SOIvbxGiven) + pParam->B4SOIvbx = pParam->B4SOIphi - 7.7348e-4 + * pParam->B4SOInpeak + * pParam->B4SOIxt * pParam->B4SOIxt; + if (pParam->B4SOIvbx > 0.0) + pParam->B4SOIvbx = -pParam->B4SOIvbx; + if (pParam->B4SOIvbm > 0.0) + pParam->B4SOIvbm = -pParam->B4SOIvbm; + + if (!model->B4SOIgamma1Given) + pParam->B4SOIgamma1 = 5.753e-12 + * sqrt(pParam->B4SOInpeak) + / model->B4SOIcox; + if (!model->B4SOIgamma2Given) + pParam->B4SOIgamma2 = 5.753e-12 + * sqrt(pParam->B4SOInsub) + / model->B4SOIcox; + + T0 = pParam->B4SOIgamma1 - pParam->B4SOIgamma2; + T1 = sqrt(pParam->B4SOIphi - pParam->B4SOIvbx) + - pParam->B4SOIsqrtPhi; + T2 = sqrt(pParam->B4SOIphi * (pParam->B4SOIphi + - pParam->B4SOIvbm)) - pParam->B4SOIphi; + pParam->B4SOIk2 = T0 * T1 / (2.0 * T2 + pParam->B4SOIvbm); + pParam->B4SOIk1 = pParam->B4SOIgamma2 - 2.0 + * pParam->B4SOIk2 * sqrt(pParam->B4SOIphi + - pParam->B4SOIvbm); + } + + /*if (pParam->B4SOIk2 < 0.0) + { T0 = 0.5 * pParam->B4SOIk1 / pParam->B4SOIk2; + pParam->B4SOIvbsc = 0.9 * (pParam->B4SOIphi - T0 * T0); + if (pParam->B4SOIvbsc > -3.0) + pParam->B4SOIvbsc = -3.0; + else if (pParam->B4SOIvbsc < -30.0) + pParam->B4SOIvbsc = -30.0; + } + else + { pParam->B4SOIvbsc = -30.0; + } + if (pParam->B4SOIvbsc > pParam->B4SOIvbm) + pParam->B4SOIvbsc = pParam->B4SOIvbm; */ /* v4.2 never used in code */ + + if ((T0 = pParam->B4SOIweff + pParam->B4SOIk1w2) < 1e-8) + T0 = 1e-8; + pParam->B4SOIk1eff = pParam->B4SOIk1 * (1 + pParam->B4SOIk1w1/T0); + /*4.0 + if (model->B4SOIvth0Given) + { pParam->B4SOIvfb = model->B4SOItype * pParam->B4SOIvth0 + - pParam->B4SOIphi - pParam->B4SOIk1eff + * pParam->B4SOIsqrtPhi; + } + else + { pParam->B4SOIvfb = -1.0; + pParam->B4SOIvth0 = model->B4SOItype * (pParam->B4SOIvfb + + pParam->B4SOIphi + pParam->B4SOIk1eff + * pParam->B4SOIsqrtPhi); + } + */ + /* v4.1 */ + if (!model->B4SOIvfbGiven) + { if (model->B4SOIvth0Given) + { pParam->B4SOIvfb = model->B4SOItype * pParam->B4SOIvth0 + - pParam->B4SOIphi - pParam->B4SOIk1eff + * pParam->B4SOIsqrtPhi; + } + else + { pParam->B4SOIvfb = -1.0; + } + } + if (!model->B4SOIvth0Given) + { pParam->B4SOIvth0 = model->B4SOItype * (pParam->B4SOIvfb + + pParam->B4SOIphi + pParam->B4SOIk1eff + * pParam->B4SOIsqrtPhi); + } + /* v4.0 */ + pParam->B4SOIk1ox = pParam->B4SOIk1eff * model->B4SOItox + / model->B4SOItoxm; + if(model->B4SOImtrlMod == 0) + T1 = sqrt(EPSSI / EPSOX * model->B4SOItox + * pParam->B4SOIXdep0); + else + T1 = sqrt(epssub / (epsrox*EPS0) * model->B4SOItox + * pParam->B4SOIXdep0); + T0 = exp(-0.5 * pParam->B4SOIdsub * pParam->B4SOIleff / T1); + pParam->B4SOItheta0vb0 = (T0 + 2.0 * T0 * T0); + + T0 = exp(-0.5 * pParam->B4SOIdrout * pParam->B4SOIleff / T1); + T2 = (T0 + 2.0 * T0 * T0); + pParam->B4SOIthetaRout = pParam->B4SOIpdibl1 * T2 + + pParam->B4SOIpdibl2; + + /* New DITS term (added in 4.1) */ + pParam->B4SOIdvtp2factor = pParam->B4SOIdvtp2 / exp(pParam->B4SOIdvtp3 * log(pParam->B4SOIleff)); + + /* stress effect */ + if (model->B4SOIwlod < 0.0) + { fprintf(stderr, "Warning: WLOD = %g is less than 0. Set to 0.0\n",model->B4SOIwlod); + model->B4SOIwlod = 0.0; + } + + T0 = pow(Ldrn, model->B4SOIllodku0); + W_tmp = Wdrn + model->B4SOIwlod; + T1 = pow(W_tmp, model->B4SOIwlodku0); + tmp1 = model->B4SOIlku0 / T0 + model->B4SOIwku0 / T1 + + model->B4SOIpku0 / (T0 * T1); + pParam->B4SOIku0 = 1.0 + tmp1; + + T0 = pow(Ldrn, model->B4SOIllodvth); + T1 = pow(W_tmp, model->B4SOIwlodvth); + tmp1 = model->B4SOIlkvth0 / T0 + model->B4SOIwkvth0 / T1 + + model->B4SOIpkvth0 / (T0 * T1); + pParam->B4SOIkvth0 = 1.0 + tmp1; + pParam->B4SOIkvth0 = sqrt( pParam->B4SOIkvth0 + * pParam->B4SOIkvth0 + DELTA); + + /*T0 = (TRatio - 1.0);*/ + T0 = (TempRatio - 1.0); /* bug fix v4.1 */ + pParam->B4SOIku0temp = pParam->B4SOIku0 * (1.0 + + model->B4SOItku0 * T0) + DELTA; + + Inv_saref = 1.0 / (model->B4SOIsaref + 0.5 * Ldrn); + Inv_sbref = 1.0 / (model->B4SOIsbref + 0.5 * Ldrn); + pParam->B4SOIinv_od_ref = Inv_saref + Inv_sbref; + pParam->B4SOIrho_ref = model->B4SOIku0 / pParam->B4SOIku0temp + * pParam->B4SOIinv_od_ref; + /* stress effect end */ + + } + + /* v4.0 stress effect */ /* Bug Fix # 17 Jul09 Code 1484-1560 is moved up from lines 1884-1958 of old version*/ + /* v4.0 stress effect */ + if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && + ( (here->B4SOInf == 1.0) || + ((here->B4SOInf > 1.0) && (here->B4SOIsd > 0.0)) + ) + ) + { Inv_sa = 0; + Inv_sb = 0; + + if (model->B4SOIkvsat < -1.0 ) + { fprintf(stderr, "Warning: KVSAT = %g is too small; Reset to -1.0.\n",model->B4SOIkvsat); + here->B4SOIkvsat = kvsat = -1.0; + } + else if (model->B4SOIkvsat > 1.0) + { fprintf(stderr, "Warning: KVSAT = %g is too big; Reset to 1.0.\n",model->B4SOIkvsat); + here->B4SOIkvsat = kvsat = 1.0; + } + else here->B4SOIkvsat = model->B4SOIkvsat; + + for(i = 0; i < here->B4SOInf; i++) { + T0 = 1.0 / here->B4SOInf / (here->B4SOIsa + + 0.5*Ldrn + i * (here->B4SOIsd +Ldrn)); + T1 = 1.0 / here->B4SOInf / (here->B4SOIsb + + 0.5*Ldrn + i * (here->B4SOIsd +Ldrn)); + Inv_sa += T0; + Inv_sb += T1; + } + + Inv_ODeff = Inv_sa + Inv_sb; + here->B4SOIInv_ODeff = Inv_ODeff; + rho = model->B4SOIku0 / pParam->B4SOIku0temp * Inv_ODeff; + T0 = (1.0 + rho)/(1.0 + pParam->B4SOIrho_ref); + here->B4SOIu0temp = pParam->B4SOIu0temp * T0; + + T1 = (1.0 + here->B4SOIkvsat * rho)/(1.0 + here->B4SOIkvsat * pParam->B4SOIrho_ref);/*self-heating bug fix*/ + here->B4SOIvsattemp = pParam->B4SOIvsattemp * T1; + + OD_offset = Inv_ODeff - pParam->B4SOIinv_od_ref; + dvth0_lod = model->B4SOIkvth0 + / pParam->B4SOIkvth0 * OD_offset; + dk2_lod = model->B4SOIstk2 + / pow(pParam->B4SOIkvth0, model->B4SOIlodk2) + * OD_offset; + deta0_lod = model->B4SOIsteta0 + / pow(pParam->B4SOIkvth0, model->B4SOIlodeta0) + * OD_offset; + here->B4SOIvth0 = pParam->B4SOIvth0 + dvth0_lod; + + here->B4SOIk2 = pParam->B4SOIk2 + dk2_lod; + + here->B4SOIeta0 = pParam->B4SOIeta0 + deta0_lod; + } + else { + here->B4SOIu0temp = pParam->B4SOIu0temp; + here->B4SOIvth0 = pParam->B4SOIvth0; + here->B4SOIvsattemp = pParam->B4SOIvsattemp; + here->B4SOIk2 = pParam->B4SOIk2; + here->B4SOIeta0 = pParam->B4SOIeta0; + here->B4SOIInv_ODeff = 0; + pParam->B4SOIinv_od_ref = 0; /*Stress bug fix*/ + here->B4SOIkvsat = 0; /*Stress bug fix*/ + } /* v4.0 stress effect end */ + + + + + here->B4SOIk2ox = here->B4SOIk2 * model->B4SOItox + / model->B4SOItoxm; /* v4.0 */ + here->B4SOIvth0 += here->B4SOIdelvto; /* v4.0 */ + here->B4SOIvfb = pParam->B4SOIvfb + model->B4SOItype * here->B4SOIdelvto; + /* Bug Fix # 17 Jul09 Code 1479-1545 is moved up from lines 1884-1950 of old version, 1954-2035 in this version*/ + + here->B4SOIcsbox = model->B4SOIcbox*here->B4SOIsourceArea; + here->B4SOIcsmin = model->B4SOIcsdmin*here->B4SOIsourceArea; + here->B4SOIcdbox = model->B4SOIcbox*here->B4SOIdrainArea; + here->B4SOIcdmin = model->B4SOIcsdmin*here->B4SOIdrainArea; + + if ( ((pParam->B4SOInsub > 0) && (model->B4SOItype > 0)) || + ((pParam->B4SOInsub < 0) && (model->B4SOItype < 0)) ) + { + T0 = pParam->B4SOIvsdth - pParam->B4SOIvsdfb; + pParam->B4SOIsdt1 = pParam->B4SOIvsdfb + model->B4SOIasd * T0; + T1 = here->B4SOIcsbox - here->B4SOIcsmin; + T2 = T1 / T0 / T0; + pParam->B4SOIst2 = T2 / model->B4SOIasd; + pParam->B4SOIst3 = T2 /( 1 - model->B4SOIasd); + here->B4SOIst4 = T0 * T1 * (1 + model->B4SOIasd) / 3 + - here->B4SOIcsmin * pParam->B4SOIvsdfb; + + T1 = here->B4SOIcdbox - here->B4SOIcdmin; + T2 = T1 / T0 / T0; + pParam->B4SOIdt2 = T2 / model->B4SOIasd; + pParam->B4SOIdt3 = T2 /( 1 - model->B4SOIasd); + here->B4SOIdt4 = T0 * T1 * (1 + model->B4SOIasd) / 3 + - here->B4SOIcdmin * pParam->B4SOIvsdfb; + } else + { + T0 = pParam->B4SOIvsdfb - pParam->B4SOIvsdth; + pParam->B4SOIsdt1 = pParam->B4SOIvsdth + model->B4SOIasd * T0; + T1 = here->B4SOIcsmin - here->B4SOIcsbox; + T2 = T1 / T0 / T0; + pParam->B4SOIst2 = T2 / model->B4SOIasd; + pParam->B4SOIst3 = T2 /( 1 - model->B4SOIasd); + here->B4SOIst4 = T0 * T1 * (1 + model->B4SOIasd) / 3 + - here->B4SOIcsbox * pParam->B4SOIvsdth; + + T1 = here->B4SOIcdmin - here->B4SOIcdbox; + T2 = T1 / T0 / T0; + pParam->B4SOIdt2 = T2 / model->B4SOIasd; + pParam->B4SOIdt3 = T2 /( 1 - model->B4SOIasd); + here->B4SOIdt4 = T0 * T1 * (1 + model->B4SOIasd) / 3 + - here->B4SOIcdbox * pParam->B4SOIvsdth; + } + + /* v2.2.2 bug fix */ + T0 = model->B4SOIcsdesw * log(1 + model->B4SOItsi / + model->B4SOItbox); + T1 = here->B4SOIsourcePerimeter - here->B4SOIw; + if (T1 > 0.0) + here->B4SOIcsesw = T0 * T1; + else + here->B4SOIcsesw = 0.0; + T1 = here->B4SOIdrainPerimeter - here->B4SOIw; + if (T1 > 0.0) + here->B4SOIcdesw = T0 * T1; + else + here->B4SOIcdesw = 0.0; + + + here->B4SOIphi = pParam->B4SOIphi; + /* process source/drain series resistance */ + here->B4SOIdrainConductance = model->B4SOIsheetResistance + * here->B4SOIdrainSquares; + if (here->B4SOIdrainConductance > 0.0) + here->B4SOIdrainConductance = 1.0 + / here->B4SOIdrainConductance; + else + here->B4SOIdrainConductance = 0.0; + + here->B4SOIsourceConductance = model->B4SOIsheetResistance + * here->B4SOIsourceSquares; + if (here->B4SOIsourceConductance > 0.0) + here->B4SOIsourceConductance = 1.0 + / here->B4SOIsourceConductance; + else + here->B4SOIsourceConductance = 0.0; + here->B4SOIcgso = pParam->B4SOIcgso; + here->B4SOIcgdo = pParam->B4SOIcgdo; + + + /* v2.0 release */ + if (model->B4SOIln < 1e-15) model->B4SOIln = 1e-15; + T0 = -0.5 * pParam->B4SOIleff * pParam->B4SOIleff / model->B4SOIln / model->B4SOIln; + DEXP(T0,T1); + pParam->B4SOIarfabjt = T1; + + T0 = pParam->B4SOIlbjt0 * (1.0 / pParam->B4SOIleff + 1.0 / model->B4SOIln); + pParam->B4SOIlratio = pow(T0,pParam->B4SOInbjt); + pParam->B4SOIlratiodif = 1.0 + model->B4SOIldif0 * pow(T0,pParam->B4SOIndif); + + if ((pParam->B4SOIvearly = pParam->B4SOIvabjt + pParam->B4SOIaely * pParam->B4SOIleff) < 1) + pParam->B4SOIvearly = 1; + + /*4.1 toxp calculation*/ + if(model->B4SOImtrlMod==0) + { + model->B4SOItoxp = model->B4SOItox - model->B4SOIdtoxcv; + } + else + { + /* Calculate TOXP from EOT */ + /* Calculate Vgs_eff @ Vgs = VDD with Poly Depletion Effect */ + Vtm0eot = KboQ * model->B4SOItempeot; + Vtmeot = Vtm0eot; + vbieot = Vtm0eot * log(1.0e20 + * pParam->B4SOInpeak / (ni * ni)); + phieot = 2.0 * Vtm0eot + * log(pParam->B4SOInpeak / ni); + sqrtphieot = sqrt(phieot); + tmp2 = here->B4SOIvfb + phieot; + vddeot = model->B4SOItype * model->B4SOIvddeot; + + T0 = model->B4SOIepsrgate * EPS0; + if ((pParam->B4SOIngate > 1.0e18) && (pParam->B4SOIngate < 1.0e25) && (vddeot > tmp2) && (T0!=0)) - { T1 = 1.0e6 * Charge_q * epssub * pParam->B4SOIngate - / (model->B4SOIcox * model->B4SOIcox); - T4 = sqrt(1.0 + 2.0 * (vddeot - T0) / T1); - T2 = T1 * (T4 - 1.0); - T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ - T7 = 1.12 - T3 - 0.05; - T6 = sqrt(T7 * T7 + 0.224); - T5 = 1.12 - 0.5 * (T7 + T6); - Vgs_eff = vddeot - T5; - - } - else - { Vgs_eff = vddeot; - - } - - - - /* Calculate Vth @ Vds=Vbs=0 */ - - V0 = vbieot - phieot; - - T3 = sqrt(pParam->B4SOIXdep0); - - - - - lt1 = model->B4SOIfactor1 * T3; - - - - ltw= model->B4SOIfactor1 * T3 ; - - - T0 = -0.5 * pParam->B4SOIdvt1 * model->B4SOIleffeot / lt1; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - Theta0 = T1 * (1.0 + 2.0 * T1); - - } - else - { T1 = MIN_EXPL; - Theta0 = T1 * (1.0 + 2.0 * T1); - - } - - /* Calculate n */ - T2 = pParam->B4SOInfactor * epssub / pParam->B4SOIXdep0; - T3 = pParam->B4SOIcdsc ; - T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; - - - if (T4 >= -0.5) - { n = 1.0 + T4; - - } - else - /* avoid discontinuity problems caused by T4 */ - { T0 = 1.0 / (3.0 + 8.0 * T4); - n = (1.0 + 3.0 * T4) * T0; - - } - - /* v4.0 DITS */ - if (pParam->B4SOIdvtp0 > 0.0) { - T0 = 0.0; - if (T0 < -EXPL_THRESHOLD) { - T2 = MIN_EXPL; - - } - else { - T2 = exp(T0); - - } - - T3 = model->B4SOIleffeot + pParam->B4SOIdvtp0 * (1.0 + T2); - - T4 = Vtmeot * log(model->B4SOIleffeot / T3); - - DITS_Sft = n * T4; - - - } - else { - DITS_Sft=0.0; - - } - - here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; - Delt_vth = here->B4SOIthetavth * V0; - - T0 = -0.5 * pParam->B4SOIdvt1w * model->B4SOIweffeot - * model->B4SOIleffeot / ltw; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - - } - - T0 = pParam->B4SOIdvt0w * T2; - DeltVthw = T0 * V0; - - TempRatioMinus1 = model->B4SOItempeot / model->B4SOItnom - 1.0; - - T0 = sqrt(1.0 + pParam->B4SOIlpe0 / model->B4SOIleffeot); - T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / model->B4SOIleffeot); - DeltVthtemp = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtphieot - + T1 * TempRatioMinus1; /* v4.0 */ - - - tmp2 = toxe * phieot - / (model->B4SOIweffeot + pParam->B4SOIw0); - - - DIBL_Sft = 0.0; - DITS_Sft2 = 0.0; - - - Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / model->B4SOIleffeot); - - - sqrtPhisExt = sqrtphieot; - - - Vth = model->B4SOItype * here->B4SOIvth0 - + (pParam->B4SOIk1ox * sqrtPhisExt - - pParam->B4SOIk1eff * sqrtphieot) * Lpe_Vb - - Delt_vth - DeltVthw - +pParam->B4SOIk3 * tmp2 - + DeltVthtemp - DIBL_Sft -DITS_Sft - DITS_Sft2; - - - Vgst = Vgs_eff - Vth; - - - T10 = n * Vtmeot; /* v4.0 */ - VgstNVt = pParam->B4SOImstar * Vgst / T10; /* v4.0 */ - ExpArg = (pParam->B4SOIvoff - (1- pParam->B4SOImstar) * Vgst) - / T10; /* v4.0 */ - - /* MCJ: Very small Vgst */ - if (VgstNVt > EXPL_THRESHOLD) - { Vgsteff = Vgst; - /* T0 is dVgsteff_dVbseff */ - - } - else if (ExpArg > EXPL_THRESHOLD) - { T0 = (Vgst - pParam->B4SOIvoff) / (n * Vtmeot); - ExpVgst = exp(T0); - Vgsteff = Vtmeot * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; - - - } - else - { ExpVgst = exp(VgstNVt); - T1 = T10 * log(1.0 + ExpVgst); - - T3 = (1.0 / model->B4SOItempeot); - - - T4 = -model->B4SOIcox / (Vtm0eot * pParam->B4SOIcdep0) - * exp(ExpArg) * (1 - pParam->B4SOImstar); - T2 = pParam->B4SOImstar - T10 * T4 - / (1.0 - pParam->B4SOImstar); - - Vgsteff = T1 / T2; - - } - Vgst2Vtm = Vgsteff + 2.0 * Vtmeot; - - - - - - /* calculating Toxp */ - T3 = model->B4SOItype * here->B4SOIvth0 - - here->B4SOIvfb - phieot; - - - vtfbphi2eot = 4.0 * T3; - if (vtfbphi2eot < 0.0) - vtfbphi2eot = 0.0; - - - niter = 0; - toxpf = toxe; - do - { - toxpi = toxpf; - tmp2 = 2.0e8 * toxpf; - T0 = (Vgsteff + vtfbphi2eot) / tmp2; - T1 = 1.0 + exp(model->B4SOIbdos * 0.7 * log(T0)); - Tcen = model->B4SOIados * 1.9e-9 / T1; - toxpf = toxe - epsrox/model->B4SOIepsrsub * Tcen; - niter++; - } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); - model->B4SOItoxp = toxpf; - /*model->B4SOIcoxp = epsrox * EPS0 / model->B4SOItoxp;*/ - - - }/*End of Toxp*/ - - /* vfbzb calculation for capMod 3 */ - tmp = sqrt(pParam->B4SOIXdep0); - tmp1 = pParam->B4SOIvbi - pParam->B4SOIphi; - tmp2 = model->B4SOIfactor1 * tmp; - - T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff - * pParam->B4SOIleff / tmp2; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T2 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXPL; - T2 = T1 * (1.0 + 2.0 * T1); - } - T0 = pParam->B4SOIdvt0w * T2; - T2 = T0 * tmp1; - - T0 = -0.5 * pParam->B4SOIdvt1 * pParam->B4SOIleff / tmp2; - if (T0 > -EXPL_THRESHOLD) - { T1 = exp(T0); - T3 = T1 * (1.0 + 2.0 * T1); - } - else - { T1 = MIN_EXPL; - T3 = T1 * (1.0 + 2.0 * T1); - } - T3 = pParam->B4SOIdvt0 * T3 * tmp1; - -/* v2.2.3 */ - /*4.1*/ - /* T4 = (model->B4SOItox - model->B4SOIdtoxcv) * pParam->B4SOIphi - / (pParam->B4SOIweff + pParam->B4SOIw0); -*/ - T4 = model->B4SOItoxp * pParam->B4SOIphi - / (pParam->B4SOIweff + pParam->B4SOIw0); - T0 = sqrt(1.0 + pParam->B4SOIlpe0 / pParam->B4SOIleff); /*v4.0*/ - T5 = pParam->B4SOIk1ox * (T0 - 1.0) * pParam->B4SOIsqrtPhi - + (pParam->B4SOIkt1 + pParam->B4SOIkt1l / pParam->B4SOIleff) - * (TempRatio - 1.0); /* v4.0 */ - - tmp3 = model->B4SOItype * pParam->B4SOIvth0 - - T2 - T3 + pParam->B4SOIk3 * T4 + T5; - pParam->B4SOIvfbzb = tmp3 - pParam->B4SOIphi - pParam->B4SOIk1 - * pParam->B4SOIsqrtPhi; - /* End of vfbzb */ - - - /* v3.2 */ - pParam->B4SOIqsi = Charge_q * model->B4SOInpeak - * (1.0 + pParam->B4SOIlpe0 / pParam->B4SOIleff) - * 1e6 * model->B4SOItsi; - - - /* v3.1 added for RF */ - here->B4SOIgrgeltd = model->B4SOIrshg * (model->B4SOIxgw - + pParam->B4SOIweff / here->B4SOInseg - / 3.0 / model->B4SOIngcon) / - (model->B4SOIngcon * here->B4SOInf * - (here->B4SOIl - model->B4SOIxgl)); - if (here->B4SOIgrgeltd > 0.0) - here->B4SOIgrgeltd = 1.0 / here->B4SOIgrgeltd; - else - { here->B4SOIgrgeltd = 1.0e3; /* mho */ - if (here->B4SOIrgateMod !=0) - printf("Warning: The gate conductance reset to 1.0e3 mho.\n"); - } - /* v3.1 added for RF end */ - - /* v4.0 rbodyMod */ - if (here->B4SOIrbodyMod) - { if (here->B4SOIrbdb < 1.0e-3) - here->B4SOIgrbdb = 1.0e3; /* in mho */ - else - here->B4SOIgrbdb = model->B4SOIgbmin - + 1.0 / here->B4SOIrbdb; - if (here->B4SOIrbsb < 1.0e-3) - here->B4SOIgrbsb = 1.0e3; - else - here->B4SOIgrbsb = model->B4SOIgbmin - + 1.0 / here->B4SOIrbsb; - } - /* v4.0 rbodyMod end */ - /* v4.0 stress effect */ - if( (here->B4SOIsa > 0.0) && (here->B4SOIsb > 0.0) && - ( (here->B4SOInf == 1.0) || - ((here->B4SOInf > 1.0) && (here->B4SOIsd > 0.0)) - ) - ) - { Inv_sa = 0; - Inv_sb = 0; - - if (model->B4SOIwlod < 0.0) - { fprintf(stderr, "Warning: WLOD = %g is less than 0. Set to 0.0\n",model->B4SOIwlod); - model->B4SOIwlod = 0.0; - } - - if (model->B4SOIkvsat < -1.0 ) - { fprintf(stderr, "Warning: KVSAT = %g is too small; Reset to -1.0.\n",model->B4SOIkvsat); - here->B4SOIkvsat = kvsat = -1.0; - } - else if (model->B4SOIkvsat > 1.0) - { fprintf(stderr, "Warning: KVSAT = %g is too big; Reset to 1.0.\n",model->B4SOIkvsat); - here->B4SOIkvsat = kvsat = 1.0; - } - else here->B4SOIkvsat = model->B4SOIkvsat; - - for(i = 0; i < here->B4SOInf; i++) { - T0 = 1.0 / here->B4SOInf / (here->B4SOIsa - + 0.5*Ldrn + i * (here->B4SOIsd +Ldrn)); - T1 = 1.0 / here->B4SOInf / (here->B4SOIsb - + 0.5*Ldrn + i * (here->B4SOIsd +Ldrn)); - Inv_sa += T0; - Inv_sb += T1; - } - - Inv_ODeff = Inv_sa + Inv_sb; - here->B4SOIInv_ODeff = Inv_ODeff; - rho = model->B4SOIku0 / pParam->B4SOIku0temp * Inv_ODeff; - T0 = (1.0 + rho)/(1.0 + pParam->B4SOIrho_ref); - here->B4SOIu0temp = pParam->B4SOIu0temp * T0; - - T1 = (1.0 + here->B4SOIkvsat * rho)/(1.0 + here->B4SOIkvsat * pParam->B4SOIrho_ref);/*self-heating bug fix*/ - here->B4SOIvsattemp = pParam->B4SOIvsattemp * T1; - - OD_offset = Inv_ODeff - pParam->B4SOIinv_od_ref; - dvth0_lod = model->B4SOIkvth0 - / pParam->B4SOIkvth0 * OD_offset; - dk2_lod = model->B4SOIstk2 - / pow(pParam->B4SOIkvth0, model->B4SOIlodk2) - * OD_offset; - deta0_lod = model->B4SOIsteta0 - / pow(pParam->B4SOIkvth0, model->B4SOIlodeta0) - * OD_offset; - here->B4SOIvth0 = pParam->B4SOIvth0 + dvth0_lod; - - here->B4SOIk2 = pParam->B4SOIk2 + dk2_lod; - - here->B4SOIeta0 = pParam->B4SOIeta0 + deta0_lod; - } - else { - here->B4SOIu0temp = pParam->B4SOIu0temp; - here->B4SOIvth0 = pParam->B4SOIvth0; - here->B4SOIvsattemp = pParam->B4SOIvsattemp; - here->B4SOIk2 = pParam->B4SOIk2; - here->B4SOIeta0 = pParam->B4SOIeta0; - here->B4SOIInv_ODeff = 0; - pParam->B4SOIinv_od_ref = 0; /*Stress bug fix*/ - here->B4SOIkvsat = 0; /*Stress bug fix*/ - } /* v4.0 stress effect end */ - - - - - here->B4SOIk2ox = here->B4SOIk2 * model->B4SOItox - / model->B4SOItoxm; /* v4.0 */ - here->B4SOIvth0 += here->B4SOIdelvto; /* v4.0 */ - here->B4SOIvfb = pParam->B4SOIvfb + model->B4SOItype * here->B4SOIdelvto; - here->B4SOIvfbzb = pParam->B4SOIvfbzb + model->B4SOItype * here->B4SOIdelvto; - - pParam->B4SOIldeb = sqrt(epssub * Vtm0 / - (Charge_q * pParam->B4SOInpeak * 1.0e6)) / 3.0; - - /*For high k mobility*/ - T1 = model->B4SOItype * here->B4SOIvth0 - - here->B4SOIvfb - pParam->B4SOIphi; - T2 = T1 + T1; - T3 = 2.5 * T1; - here->B4SOIvtfbphi1 = (model->B4SOItype == NMOS) ? T2 : T3; - if (here->B4SOIvtfbphi1 < 0.0) - here->B4SOIvtfbphi1 = 0.0; - /*Calculate VgsteffVth for mobMod=4*/ - if(model->B4SOImobMod == 4) - { - /*Calculate n @ Vbs=Vds=0*/ - V0 = pParam->B4SOIvbi - pParam->B4SOIphi; - lt1 = model->B4SOIfactor1* pParam->B4SOIsqrtXdep0; - ltw = lt1; - T0 = pParam->B4SOIdvt1 * pParam->B4SOIleff / lt1; - if (T0 < EXPL_THRESHOLD) - { - T1 = exp(T0); - T2 = T1 - 1.0; - T3 = T2 * T2; - T4 = T3 + 2.0 * T1 * MIN_EXPL; - Theta0 = T1 / T4; - } - else - Theta0 = 1.0 / (MAX_EXPL - 2.0); - - tmp1 = epssub / pParam->B4SOIXdep0; - here->B4SOInstar = model->B4SOIvtm / Charge_q * - (model->B4SOIcox + tmp1 + pParam->B4SOIcit); - tmp2 = pParam->B4SOInfactor * tmp1; - tmp3 = (tmp2 + pParam->B4SOIcdsc * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; - if (tmp3 >= -0.5) - n0 = 1.0 + tmp3; - else - { - T0 = 1.0 / (3.0 + 8.0 * tmp3); - n0 = (1.0 + 3.0 * tmp3) * T0; - } - - T0 = n0 * Vtm0; - T1 = pParam->B4SOIvoff; - T2 = T1/T0; - if (T2 < -EXPL_THRESHOLD) - { T3 = model->B4SOIcox * MIN_EXPL / pParam->B4SOIcdep0; - T4 = pParam->B4SOImstar + T3 * n0; - } - else if (T2 > EXPL_THRESHOLD) - { T3 = model->B4SOIcox * MAX_EXPL / pParam->B4SOIcdep0; - T4 = pParam->B4SOImstar + T3 * n0; - } - else - { T3 = exp(T2)* model->B4SOIcox / pParam->B4SOIcdep0; - T4 = pParam->B4SOImstar + T3 * n0; - - } - - here->B4SOIvgsteffvth = T0 * log(2.0)/T4; - - } - - - } + { T1 = 1.0e6 * Charge_q * epssub * pParam->B4SOIngate + / (model->B4SOIcox * model->B4SOIcox); + T4 = sqrt(1.0 + 2.0 * (vddeot - T0) / T1); + T2 = T1 * (T4 - 1.0); + T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */ + T7 = 1.12 - T3 - 0.05; + T6 = sqrt(T7 * T7 + 0.224); + T5 = 1.12 - 0.5 * (T7 + T6); + Vgs_eff = vddeot - T5; + + } + else + { Vgs_eff = vddeot; + + } + + + + /* Calculate Vth @ Vds=Vbs=0 */ + + V0 = vbieot - phieot; + + T3 = sqrt(pParam->B4SOIXdep0); + + + + + lt1 = model->B4SOIfactor1 * T3; + + + + ltw= model->B4SOIfactor1 * T3 ; + + + T0 = -0.5 * pParam->B4SOIdvt1 * model->B4SOIleffeot / lt1; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + Theta0 = T1 * (1.0 + 2.0 * T1); + + } + else + { T1 = MIN_EXPL; + Theta0 = T1 * (1.0 + 2.0 * T1); + + } + + /* Calculate n */ + T2 = pParam->B4SOInfactor * epssub / pParam->B4SOIXdep0; + T3 = pParam->B4SOIcdsc ; + T4 = (T2 + T3 * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; + + + if (T4 >= -0.5) + { n = 1.0 + T4; + + } + else + /* avoid discontinuity problems caused by T4 */ + { T0 = 1.0 / (3.0 + 8.0 * T4); + n = (1.0 + 3.0 * T4) * T0; + + } + + /* v4.0 DITS */ + if (pParam->B4SOIdvtp0 > 0.0) { + T2 = 1; /* Bug fix #1 Jun 09 Shorter implementation of same code */ + /* T0 = 0.0; + T2 = exp(T0); + if (T0 < -EXPL_THRESHOLD) { + T2 = MIN_EXPL; + + } + else { + T2 = exp(T0); + + } end */ + + T3 = model->B4SOIleffeot + pParam->B4SOIdvtp0 * (1.0 + T2); + + T4 = Vtmeot * log(model->B4SOIleffeot / T3); + + DITS_Sft = n * T4; + + + } + else { + DITS_Sft=0.0; + + } + + here->B4SOIthetavth = pParam->B4SOIdvt0 * Theta0; + Delt_vth = here->B4SOIthetavth * V0; + + T0 = -0.5 * pParam->B4SOIdvt1w * model->B4SOIweffeot + * model->B4SOIleffeot / ltw; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + T2 = T1 * (1.0 + 2.0 * T1); + + } + else + { T1 = MIN_EXPL; + T2 = T1 * (1.0 + 2.0 * T1); + + } + + T0 = pParam->B4SOIdvt0w * T2; + DeltVthw = T0 * V0; + + TempRatioMinus1 = model->B4SOItempeot / model->B4SOItnom - 1.0; + + T0 = sqrt(1.0 + pParam->B4SOIlpe0 / model->B4SOIleffeot); + T1 = (pParam->B4SOIkt1 + pParam->B4SOIkt1l / model->B4SOIleffeot); + DeltVthtemp = pParam->B4SOIk1ox * (T0 - 1.0) * sqrtphieot + + T1 * TempRatioMinus1; /* v4.0 */ + + + tmp2 = toxe * phieot + / (model->B4SOIweffeot + pParam->B4SOIw0); + + + DIBL_Sft = 0.0; + DITS_Sft2 = 0.0; + + + Lpe_Vb = sqrt(1.0 + pParam->B4SOIlpeb / model->B4SOIleffeot); + + + sqrtPhisExt = sqrtphieot; + + + Vth = model->B4SOItype * here->B4SOIvth0 + + (pParam->B4SOIk1ox * sqrtPhisExt + - pParam->B4SOIk1eff * sqrtphieot) * Lpe_Vb + - Delt_vth - DeltVthw + +pParam->B4SOIk3 * tmp2 + + DeltVthtemp - DIBL_Sft -DITS_Sft - DITS_Sft2; + + + Vgst = Vgs_eff - Vth; + + + T10 = n * Vtmeot; /* v4.0 */ + VgstNVt = pParam->B4SOImstar * Vgst / T10; /* v4.0 */ + + ExpArg = (pParam->B4SOIvoff - (1- pParam->B4SOImstar) * Vgst) + / T10; /* v4.0 */ + + /* MCJ: Very small Vgst */ + if (VgstNVt > EXPL_THRESHOLD) + { Vgsteff = Vgst; + /* T0 is dVgsteff_dVbseff */ + + } + else if (ExpArg > EXPL_THRESHOLD) + { T0 = (Vgst - pParam->B4SOIvoff) / (n * Vtmeot); + ExpVgst = exp(T0); + Vgsteff = Vtmeot * pParam->B4SOIcdep0 / model->B4SOIcox * ExpVgst; + + + } + else + { ExpVgst = exp(VgstNVt); + T1 = T10 * log(1.0 + ExpVgst); + + T3 = (1.0 / model->B4SOItempeot); + + + T4 = -model->B4SOIcox / (Vtm0eot * pParam->B4SOIcdep0) + * exp(ExpArg) * (1 - pParam->B4SOImstar); + T2 = pParam->B4SOImstar - T10 * T4 + / (1.0 - pParam->B4SOImstar); + + Vgsteff = T1 / T2; + + } + Vgst2Vtm = Vgsteff + 2.0 * Vtmeot; + + + + + + /* calculating Toxp */ + T3 = model->B4SOItype * here->B4SOIvth0 + - here->B4SOIvfb - phieot; + + + vtfbphi2eot = 4.0 * T3; + if (vtfbphi2eot < 0.0) + vtfbphi2eot = 0.0; + + + niter = 0; + toxpf = toxe; + do + { + toxpi = toxpf; + tmp2 = 2.0e8 * toxpf; + T0 = (Vgsteff + vtfbphi2eot) / tmp2; + T1 = 1.0 + exp(model->B4SOIbdos * 0.7 * log(T0)); + Tcen = model->B4SOIados * 1.9e-9 / T1; + toxpf = toxe - epsrox/model->B4SOIepsrsub * Tcen; + niter++; + } while ((niter<=4)&&(ABS(toxpf-toxpi)>1e-12)); + model->B4SOItoxp = toxpf; + /*model->B4SOIcoxp = epsrox * EPS0 / model->B4SOItoxp;*/ + + + }/*End of Toxp*/ + + /* vfbzb calculation for capMod 3 */ + tmp = sqrt(pParam->B4SOIXdep0); + tmp1 = pParam->B4SOIvbi - pParam->B4SOIphi; + tmp2 = model->B4SOIfactor1 * tmp; + + T0 = -0.5 * pParam->B4SOIdvt1w * pParam->B4SOIweff + * pParam->B4SOIleff / tmp2; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + T2 = T1 * (1.0 + 2.0 * T1); + } + else + { T1 = MIN_EXPL; + T2 = T1 * (1.0 + 2.0 * T1); + } + T0 = pParam->B4SOIdvt0w * T2; + T2 = T0 * tmp1; + + T0 = -0.5 * pParam->B4SOIdvt1 * pParam->B4SOIleff / tmp2; + if (T0 > -EXPL_THRESHOLD) + { T1 = exp(T0); + T3 = T1 * (1.0 + 2.0 * T1); + } + else + { T1 = MIN_EXPL; + T3 = T1 * (1.0 + 2.0 * T1); + } + T3 = pParam->B4SOIdvt0 * T3 * tmp1; + + /* v2.2.3 */ + /*4.1*/ + /* T4 = (model->B4SOItox - model->B4SOIdtoxcv) * pParam->B4SOIphi + / (pParam->B4SOIweff + pParam->B4SOIw0); + */ + T4 = model->B4SOItoxp * pParam->B4SOIphi + / (pParam->B4SOIweff + pParam->B4SOIw0); + T0 = sqrt(1.0 + pParam->B4SOIlpe0 / pParam->B4SOIleff); /*v4.0*/ + T5 = pParam->B4SOIk1ox * (T0 - 1.0) * pParam->B4SOIsqrtPhi + + (pParam->B4SOIkt1 + pParam->B4SOIkt1l / pParam->B4SOIleff) + * (TempRatio - 1.0); /* v4.0 */ + + tmp3 = model->B4SOItype * pParam->B4SOIvth0 + - T2 - T3 + pParam->B4SOIk3 * T4 + T5; + pParam->B4SOIvfbzb = tmp3 - pParam->B4SOIphi - pParam->B4SOIk1 + * pParam->B4SOIsqrtPhi; + /* End of vfbzb */ + + + /* v3.2 */ + pParam->B4SOIqsi = Charge_q * model->B4SOInpeak + * (1.0 + pParam->B4SOIlpe0 / pParam->B4SOIleff) + * 1e6 * model->B4SOItsi; + + + /* v3.1 added for RF */ + here->B4SOIgrgeltd = model->B4SOIrshg * (model->B4SOIxgw + + pParam->B4SOIweff / here->B4SOInseg + / 3.0 / model->B4SOIngcon) / + (model->B4SOIngcon * here->B4SOInf * + (here->B4SOIl - model->B4SOIxgl)); + if (here->B4SOIgrgeltd > 0.0) + here->B4SOIgrgeltd = 1.0 / here->B4SOIgrgeltd; + else + { here->B4SOIgrgeltd = 1.0e3; /* mho */ + if (here->B4SOIrgateMod !=0) + printf("Warning: The gate conductance reset to 1.0e3 mho.\n"); + } + /* v3.1 added for RF end */ + + /* v4.0 rbodyMod */ + if (here->B4SOIrbodyMod) + { if (here->B4SOIrbdb < 1.0e-3) + here->B4SOIgrbdb = 1.0e3; /* in mho */ + else + here->B4SOIgrbdb = model->B4SOIgbmin + + 1.0 / here->B4SOIrbdb; + if (here->B4SOIrbsb < 1.0e-3) + here->B4SOIgrbsb = 1.0e3; + else + here->B4SOIgrbsb = model->B4SOIgbmin + + 1.0 / here->B4SOIrbsb; + } + /* v4.0 rbodyMod end */ + /* Bug Fix # 17 Jul09 Stress effect code (lines: 1954-2020) is moved up to lines 1479-1545*/ + + here->B4SOIvfbzb = pParam->B4SOIvfbzb + model->B4SOItype * here->B4SOIdelvto; + + pParam->B4SOIldeb = sqrt(epssub * Vtm0 / + (Charge_q * pParam->B4SOInpeak * 1.0e6)) / 3.0; + + /*For high k mobility*/ + T1 = model->B4SOItype * here->B4SOIvth0 + - here->B4SOIvfb - pParam->B4SOIphi; + T2 = T1 + T1; + T3 = 2.5 * T1; + here->B4SOIvtfbphi1 = (model->B4SOItype == NMOS) ? T2 : T3; + if (here->B4SOIvtfbphi1 < 0.0) + here->B4SOIvtfbphi1 = 0.0; + /*Calculate VgsteffVth for mobMod=4*/ + if(model->B4SOImobMod == 4) + { + /*Calculate n @ Vbs=Vds=0*/ + /*V0 = pParam->B4SOIvbi - pParam->B4SOIphi; */ /* v4.2 never used in code */ + lt1 = model->B4SOIfactor1* pParam->B4SOIsqrtXdep0; + /* ltw = lt1; */ /* v4.2 never used in code */ + T0 = pParam->B4SOIdvt1 * pParam->B4SOIleff / lt1; + if (T0 < EXPL_THRESHOLD) + { + T1 = exp(T0); + T2 = T1 - 1.0; + T3 = T2 * T2; + T4 = T3 + 2.0 * T1 * MIN_EXPL; + Theta0 = T1 / T4; + } + else + Theta0 = 1.0 / (MAX_EXPL - 2.0); + + tmp1 = epssub / pParam->B4SOIXdep0; + /*here->B4SOInstar = model->B4SOIvtm / Charge_q * + (model->B4SOIcox + tmp1 + pParam->B4SOIcit); */ /* v4.2 never used in code */ + tmp2 = pParam->B4SOInfactor * tmp1; + tmp3 = (tmp2 + pParam->B4SOIcdsc * Theta0 + pParam->B4SOIcit) / model->B4SOIcox; + if (tmp3 >= -0.5) + n0 = 1.0 + tmp3; + else + { + T0 = 1.0 / (3.0 + 8.0 * tmp3); + n0 = (1.0 + 3.0 * tmp3) * T0; + } + + T0 = n0 * Vtm0; + T1 = pParam->B4SOIvoff; + T2 = T1/T0; + if (T2 < -EXPL_THRESHOLD) + { T3 = model->B4SOIcox * MIN_EXPL / pParam->B4SOIcdep0; + T4 = pParam->B4SOImstar + T3 * n0; + } + else if (T2 > EXPL_THRESHOLD) + { T3 = model->B4SOIcox * MAX_EXPL / pParam->B4SOIcdep0; + T4 = pParam->B4SOImstar + T3 * n0; + } + else + { T3 = exp(T2)* model->B4SOIcox / pParam->B4SOIcdep0; + T4 = pParam->B4SOImstar + T3 * n0; + + } + + here->B4SOIvgsteffvth = T0 * log(2.0)/T4; + + } + + + } } return(OK); } diff --git a/src/spicelib/devices/bsim3soi/b4soitrunc.c b/src/spicelib/devices/bsim3soi/b4soitrunc.c index f857229b6..2024eb758 100644 --- a/src/spicelib/devices/bsim3soi/b4soitrunc.c +++ b/src/spicelib/devices/bsim3soi/b4soitrunc.c @@ -1,4 +1,5 @@ -/*** B4SOI 03/06/2009 Wenwei Yang Release ***/ +/*** B4SOI 12/31/2009 Released by Tanvir Morshed ***/ + /********** * Copyright 2009 Regents of the University of California. All rights reserved. @@ -9,6 +10,8 @@ * File: b4soitrunc.c * Modified by Hui Wan, Xuemei Xi 11/30/2005 * Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009 + * Modified by Tanvir Morshed 09/22/2009 + * Modified by Tanvir Morshed 12/31/2009 **********/ #include "ngspice.h" diff --git a/tests/bsim3soi/inv_dc.cir b/tests/bsim3soi/inv_dc.cir index 01dae9c2f..5044f993b 100644 --- a/tests/bsim3soi/inv_dc.cir +++ b/tests/bsim3soi/inv_dc.cir @@ -1,8 +1,8 @@ B4SOI Drain Gate Source Back-gate(substrate) Body Tx W L (body ommitted for FB) * Modified by Darsen Lu 03/11/2009 -.include ./nmos4p1.mod -.include ./pmos4p1.mod +.include ./nmos4p3.mod +.include ./pmos4p3.mod .option TEMP=27C noacct Vpower VD 0 1.5 diff --git a/tests/bsim3soi/inv_tr.cir b/tests/bsim3soi/inv_tr.cir index 0885a1500..d9de25c49 100644 --- a/tests/bsim3soi/inv_tr.cir +++ b/tests/bsim3soi/inv_tr.cir @@ -1,8 +1,8 @@ B4SOI Drain Gate Source Back-gate(substrate) Body Tx W L (body ommitted for FB) * Modified by Darsen Lu 03/11/2009 -.include ./nmos4p1.mod -.include ./pmos4p1.mod +.include ./nmos4p3.mod +.include ./pmos4p3.mod .option TEMP=27C noacct Vpower VD 0 1.5 diff --git a/tests/bsim3soi/nmos4p1.mod b/tests/bsim3soi/nmos4p3.mod similarity index 99% rename from tests/bsim3soi/nmos4p1.mod rename to tests/bsim3soi/nmos4p3.mod index 5d433abb1..8b0498044 100644 --- a/tests/bsim3soi/nmos4p1.mod +++ b/tests/bsim3soi/nmos4p3.mod @@ -1,4 +1,4 @@ -* BSIMSOI4.1 example modelcard +* BSIMSOI4.3 example modelcard .Model N1 NMOS Level= 10 +MOBMOD = 2 SHMOD = 0 CAPMOD = 2 diff --git a/tests/bsim3soi/pmos4p1.mod b/tests/bsim3soi/pmos4p3.mod similarity index 99% rename from tests/bsim3soi/pmos4p1.mod rename to tests/bsim3soi/pmos4p3.mod index 222c18ff1..9557f7e7d 100644 --- a/tests/bsim3soi/pmos4p1.mod +++ b/tests/bsim3soi/pmos4p3.mod @@ -1,4 +1,4 @@ -*BSIMSOI4.1 example modelcard +*BSIMSOI4.3 example modelcard .Model P1 PMOS Level= 10 +MOBMOD = 2 SHMOD = 0 CAPMOD = 2 diff --git a/tests/bsim3soi/ring51_41.cir b/tests/bsim3soi/ring51_41.cir index e08456e3e..d1774987b 100644 --- a/tests/bsim3soi/ring51_41.cir +++ b/tests/bsim3soi/ring51_41.cir @@ -16,8 +16,8 @@ cout buf ss 1pF *.option itl1=1000 itl4=20 temp=85 gmin=1e-15 abstol=1e-12 reltol=1e-4 .tran 0.2n 10n .print tran v(out25) v(out50) -.include nmos4p1.mod -.include pmos4p1.mod +.include nmos4p3.mod +.include pmos4p3.mod .subckt inv1 dd ss sub in out diff --git a/tests/bsim3soi/test1.cir b/tests/bsim3soi/test1.cir index 6bddd7779..1e80f1b0c 100644 --- a/tests/bsim3soi/test1.cir +++ b/tests/bsim3soi/test1.cir @@ -5,7 +5,7 @@ .option ingold=1 .option gmin=0 -m1 d g s 0 p n1 w=1u l=0.1u soimod=0 +m1 d g s b p n1 w=1u l=0.1u soimod=0 +NF=1 +SA=0.31u SB=0.2u SD=0.1u @@ -13,9 +13,10 @@ vg g 0 1.2 vd d 0 1.2 vs s 0 0.0 vp p 0 0.0 +vb b 0 0.0 .dc vd 0 1.2 0.01 vg 0.2 1.2 0.1 -.include ./nmos4p1.mod -.print dc i(vd) +.include ./nmos4p3.mod +.print dc i(vd) i(vs) .end diff --git a/tests/bsim3soi/test1.out b/tests/bsim3soi/test1.out index 46f5c483e..d77123ecf 100644 --- a/tests/bsim3soi/test1.out +++ b/tests/bsim3soi/test1.out @@ -13,1337 +13,1337 @@ Date: Thu Mar 19 20:54:30 2009 -------------------------------------------------------------------------------- Index sweep vd#branch -------------------------------------------------------------------------------- -0 0.000000e+00 3.745008e-18 -1 1.000000e-02 -1.68741e-09 -2 2.000000e-02 -2.91222e-09 -3 3.000000e-02 -3.74980e-09 -4 4.000000e-02 -4.29876e-09 -5 5.000000e-02 -4.65844e-09 -6 6.000000e-02 -4.90588e-09 -7 7.000000e-02 -5.08987e-09 -8 8.000000e-02 -5.23798e-09 -9 9.000000e-02 -5.36520e-09 -10 1.000000e-01 -5.47974e-09 -11 1.100000e-01 -5.58625e-09 -12 1.200000e-01 -5.68746e-09 -13 1.300000e-01 -5.78506e-09 -14 1.400000e-01 -5.88012e-09 -15 1.500000e-01 -5.97336e-09 -16 1.600000e-01 -6.06528e-09 -17 1.700000e-01 -6.15624e-09 -18 1.800000e-01 -6.24651e-09 -19 1.900000e-01 -6.33628e-09 -20 2.000000e-01 -6.42572e-09 -21 2.100000e-01 -6.51495e-09 -22 2.200000e-01 -6.60407e-09 -23 2.300000e-01 -6.69317e-09 -24 2.400000e-01 -6.78233e-09 -25 2.500000e-01 -6.87161e-09 -26 2.600000e-01 -6.96105e-09 -27 2.700000e-01 -7.05072e-09 -28 2.800000e-01 -7.14066e-09 -29 2.900000e-01 -7.23090e-09 -30 3.000000e-01 -7.32148e-09 -31 3.100000e-01 -7.41244e-09 -32 3.200000e-01 -7.50380e-09 -33 3.300000e-01 -7.59560e-09 -34 3.400000e-01 -7.68786e-09 -35 3.500000e-01 -7.78060e-09 -36 3.600000e-01 -7.87385e-09 -37 3.700000e-01 -7.96764e-09 -38 3.800000e-01 -8.06198e-09 -39 3.900000e-01 -8.15689e-09 -40 4.000000e-01 -8.25240e-09 -41 4.100000e-01 -8.34852e-09 -42 4.200000e-01 -8.44526e-09 -43 4.300000e-01 -8.54266e-09 -44 4.400000e-01 -8.64072e-09 -45 4.500000e-01 -8.73946e-09 -46 4.600000e-01 -8.83890e-09 -47 4.700000e-01 -8.93906e-09 -48 4.800000e-01 -9.03993e-09 -49 4.900000e-01 -9.14156e-09 -50 5.000000e-01 -9.24394e-09 -51 5.100000e-01 -9.34709e-09 -52 5.200000e-01 -9.45102e-09 -53 5.300000e-01 -9.55576e-09 -54 5.400000e-01 -9.66130e-09 -55 5.500000e-01 -9.76768e-09 -56 5.600000e-01 -9.87489e-09 -57 5.700000e-01 -9.98295e-09 -58 5.800000e-01 -1.00919e-08 -59 5.900000e-01 -1.02017e-08 -60 6.000000e-01 -1.03124e-08 -61 6.100000e-01 -1.04240e-08 -62 6.200000e-01 -1.05365e-08 -63 6.300000e-01 -1.06499e-08 -64 6.400000e-01 -1.07643e-08 -65 6.500000e-01 -1.08796e-08 -66 6.600000e-01 -1.09959e-08 -67 6.700000e-01 -1.11132e-08 -68 6.800000e-01 -1.12315e-08 -69 6.900000e-01 -1.13507e-08 -70 7.000000e-01 -1.14710e-08 -71 7.100000e-01 -1.15923e-08 -72 7.200000e-01 -1.17146e-08 -73 7.300000e-01 -1.18380e-08 -74 7.400000e-01 -1.19625e-08 -75 7.500000e-01 -1.20880e-08 -76 7.600000e-01 -1.22146e-08 -77 7.700000e-01 -1.23423e-08 -78 7.800000e-01 -1.24711e-08 -79 7.900000e-01 -1.26010e-08 -80 8.000000e-01 -1.27320e-08 -81 8.100000e-01 -1.28642e-08 -82 8.200000e-01 -1.29976e-08 -83 8.300000e-01 -1.31321e-08 -84 8.400000e-01 -1.32678e-08 -85 8.500000e-01 -1.34047e-08 -86 8.600000e-01 -1.35428e-08 -87 8.700000e-01 -1.36821e-08 -88 8.800000e-01 -1.38226e-08 -89 8.900000e-01 -1.39644e-08 -90 9.000000e-01 -1.41074e-08 -91 9.100000e-01 -1.42517e-08 -92 9.200000e-01 -1.43973e-08 -93 9.300000e-01 -1.45442e-08 -94 9.400000e-01 -1.46924e-08 -95 9.500000e-01 -1.48418e-08 -96 9.600000e-01 -1.49927e-08 -97 9.700000e-01 -1.51448e-08 -98 9.800000e-01 -1.52983e-08 -99 9.900000e-01 -1.54532e-08 -100 1.000000e+00 -1.56095e-08 -101 1.010000e+00 -1.57672e-08 -102 1.020000e+00 -1.59262e-08 -103 1.030000e+00 -1.60867e-08 -104 1.040000e+00 -1.62487e-08 -105 1.050000e+00 -1.64120e-08 -106 1.060000e+00 -1.65769e-08 -107 1.070000e+00 -1.67432e-08 -108 1.080000e+00 -1.69110e-08 -109 1.090000e+00 -1.70803e-08 -110 1.100000e+00 -1.72511e-08 -111 1.110000e+00 -1.74235e-08 -112 1.120000e+00 -1.75974e-08 -113 1.130000e+00 -1.77728e-08 -114 1.140000e+00 -1.79499e-08 -115 1.150000e+00 -1.81285e-08 -116 1.160000e+00 -1.83087e-08 -117 1.170000e+00 -1.84906e-08 -118 1.180000e+00 -1.86741e-08 -119 1.190000e+00 -1.88592e-08 -120 1.200000e+00 -1.90460e-08 -121 0.000000e+00 1.843013e-17 -122 1.000000e-02 -2.97240e-08 -123 2.000000e-02 -5.16099e-08 -124 3.000000e-02 -6.68313e-08 -125 4.000000e-02 -7.69513e-08 -126 5.000000e-02 -8.36144e-08 -127 6.000000e-02 -8.81649e-08 -128 7.000000e-02 -9.14956e-08 -129 8.000000e-02 -9.41281e-08 -130 9.000000e-02 -9.63512e-08 -131 1.000000e-01 -9.83245e-08 -132 1.100000e-01 -1.00139e-07 -133 1.200000e-01 -1.01847e-07 -134 1.300000e-01 -1.03482e-07 -135 1.400000e-01 -1.05064e-07 -136 1.500000e-01 -1.06608e-07 -137 1.600000e-01 -1.08122e-07 -138 1.700000e-01 -1.09614e-07 -139 1.800000e-01 -1.11089e-07 -140 1.900000e-01 -1.12551e-07 -141 2.000000e-01 -1.14002e-07 -142 2.100000e-01 -1.15445e-07 -143 2.200000e-01 -1.16881e-07 -144 2.300000e-01 -1.18313e-07 -145 2.400000e-01 -1.19741e-07 -146 2.500000e-01 -1.21167e-07 -147 2.600000e-01 -1.22592e-07 -148 2.700000e-01 -1.24016e-07 -149 2.800000e-01 -1.25441e-07 -150 2.900000e-01 -1.26867e-07 -151 3.000000e-01 -1.28294e-07 -152 3.100000e-01 -1.29724e-07 -153 3.200000e-01 -1.31156e-07 -154 3.300000e-01 -1.32592e-07 -155 3.400000e-01 -1.34032e-07 -156 3.500000e-01 -1.35475e-07 -157 3.600000e-01 -1.36923e-07 -158 3.700000e-01 -1.38376e-07 -159 3.800000e-01 -1.39834e-07 -160 3.900000e-01 -1.41297e-07 -161 4.000000e-01 -1.42766e-07 -162 4.100000e-01 -1.44242e-07 -163 4.200000e-01 -1.45723e-07 -164 4.300000e-01 -1.47211e-07 -165 4.400000e-01 -1.48706e-07 -166 4.500000e-01 -1.50208e-07 -167 4.600000e-01 -1.51718e-07 -168 4.700000e-01 -1.53235e-07 -169 4.800000e-01 -1.54759e-07 -170 4.900000e-01 -1.56292e-07 -171 5.000000e-01 -1.57833e-07 -172 5.100000e-01 -1.59382e-07 -173 5.200000e-01 -1.60939e-07 -174 5.300000e-01 -1.62506e-07 -175 5.400000e-01 -1.64081e-07 -176 5.500000e-01 -1.65665e-07 -177 5.600000e-01 -1.67258e-07 -178 5.700000e-01 -1.68861e-07 -179 5.800000e-01 -1.70473e-07 -180 5.900000e-01 -1.72095e-07 -181 6.000000e-01 -1.73727e-07 -182 6.100000e-01 -1.75369e-07 -183 6.200000e-01 -1.77020e-07 -184 6.300000e-01 -1.78682e-07 -185 6.400000e-01 -1.80355e-07 -186 6.500000e-01 -1.82038e-07 -187 6.600000e-01 -1.83732e-07 -188 6.700000e-01 -1.85436e-07 -189 6.800000e-01 -1.87152e-07 -190 6.900000e-01 -1.88878e-07 -191 7.000000e-01 -1.90616e-07 -192 7.100000e-01 -1.92365e-07 -193 7.200000e-01 -1.94126e-07 -194 7.300000e-01 -1.95898e-07 -195 7.400000e-01 -1.97682e-07 -196 7.500000e-01 -1.99478e-07 -197 7.600000e-01 -2.01285e-07 -198 7.700000e-01 -2.03105e-07 -199 7.800000e-01 -2.04937e-07 -200 7.900000e-01 -2.06782e-07 -201 8.000000e-01 -2.08638e-07 -202 8.100000e-01 -2.10508e-07 -203 8.200000e-01 -2.12390e-07 -204 8.300000e-01 -2.14285e-07 -205 8.400000e-01 -2.16192e-07 -206 8.500000e-01 -2.18113e-07 -207 8.600000e-01 -2.20047e-07 -208 8.700000e-01 -2.21994e-07 -209 8.800000e-01 -2.23955e-07 -210 8.900000e-01 -2.25929e-07 -211 9.000000e-01 -2.27917e-07 -212 9.100000e-01 -2.29919e-07 -213 9.200000e-01 -2.31934e-07 -214 9.300000e-01 -2.33963e-07 -215 9.400000e-01 -2.36007e-07 -216 9.500000e-01 -2.38064e-07 -217 9.600000e-01 -2.40136e-07 -218 9.700000e-01 -2.42223e-07 -219 9.800000e-01 -2.44324e-07 -220 9.900000e-01 -2.46439e-07 -221 1.000000e+00 -2.48570e-07 -222 1.010000e+00 -2.50715e-07 -223 1.020000e+00 -2.52875e-07 -224 1.030000e+00 -2.55051e-07 -225 1.040000e+00 -2.57241e-07 -226 1.050000e+00 -2.59447e-07 -227 1.060000e+00 -2.61669e-07 -228 1.070000e+00 -2.63906e-07 -229 1.080000e+00 -2.66159e-07 -230 1.090000e+00 -2.68427e-07 -231 1.100000e+00 -2.70712e-07 -232 1.110000e+00 -2.73013e-07 -233 1.120000e+00 -2.75329e-07 -234 1.130000e+00 -2.77663e-07 -235 1.140000e+00 -2.80012e-07 -236 1.150000e+00 -2.82378e-07 -237 1.160000e+00 -2.84761e-07 -238 1.170000e+00 -2.87161e-07 -239 1.180000e+00 -2.89577e-07 -240 1.190000e+00 -2.92011e-07 -241 1.200000e+00 -2.94462e-07 -242 0.000000e+00 7.865259e-17 -243 1.000000e-02 -2.68927e-07 -244 2.000000e-02 -4.85409e-07 -245 3.000000e-02 -6.53621e-07 -246 4.000000e-02 -7.79471e-07 -247 5.000000e-02 -8.70648e-07 -248 6.000000e-02 -9.35780e-07 -249 7.000000e-02 -9.82949e-07 -250 8.000000e-02 -1.01849e-06 -251 9.000000e-02 -1.04675e-06 -252 1.000000e-01 -1.07045e-06 -253 1.100000e-01 -1.09123e-06 -254 1.200000e-01 -1.11010e-06 -255 1.300000e-01 -1.12765e-06 -256 1.400000e-01 -1.14427e-06 -257 1.500000e-01 -1.16021e-06 -258 1.600000e-01 -1.17564e-06 -259 1.700000e-01 -1.19066e-06 -260 1.800000e-01 -1.20536e-06 -261 1.900000e-01 -1.21981e-06 -262 2.000000e-01 -1.23404e-06 -263 2.100000e-01 -1.24809e-06 -264 2.200000e-01 -1.26198e-06 -265 2.300000e-01 -1.27575e-06 -266 2.400000e-01 -1.28941e-06 -267 2.500000e-01 -1.30298e-06 -268 2.600000e-01 -1.31646e-06 -269 2.700000e-01 -1.32987e-06 -270 2.800000e-01 -1.34322e-06 -271 2.900000e-01 -1.35652e-06 -272 3.000000e-01 -1.36977e-06 -273 3.100000e-01 -1.38299e-06 -274 3.200000e-01 -1.39618e-06 -275 3.300000e-01 -1.40934e-06 -276 3.400000e-01 -1.42248e-06 -277 3.500000e-01 -1.43560e-06 -278 3.600000e-01 -1.44872e-06 -279 3.700000e-01 -1.46183e-06 -280 3.800000e-01 -1.47493e-06 -281 3.900000e-01 -1.48803e-06 -282 4.000000e-01 -1.50114e-06 -283 4.100000e-01 -1.51425e-06 -284 4.200000e-01 -1.52738e-06 -285 4.300000e-01 -1.54051e-06 -286 4.400000e-01 -1.55366e-06 -287 4.500000e-01 -1.56683e-06 -288 4.600000e-01 -1.58002e-06 -289 4.700000e-01 -1.59322e-06 -290 4.800000e-01 -1.60645e-06 -291 4.900000e-01 -1.61971e-06 -292 5.000000e-01 -1.63299e-06 -293 5.100000e-01 -1.64631e-06 -294 5.200000e-01 -1.65965e-06 -295 5.300000e-01 -1.67302e-06 -296 5.400000e-01 -1.68643e-06 -297 5.500000e-01 -1.69987e-06 -298 5.600000e-01 -1.71335e-06 -299 5.700000e-01 -1.72687e-06 -300 5.800000e-01 -1.74043e-06 -301 5.900000e-01 -1.75402e-06 -302 6.000000e-01 -1.76766e-06 -303 6.100000e-01 -1.78134e-06 -304 6.200000e-01 -1.79507e-06 -305 6.300000e-01 -1.80884e-06 -306 6.400000e-01 -1.82265e-06 -307 6.500000e-01 -1.83652e-06 -308 6.600000e-01 -1.85043e-06 -309 6.700000e-01 -1.86439e-06 -310 6.800000e-01 -1.87840e-06 -311 6.900000e-01 -1.89245e-06 -312 7.000000e-01 -1.90657e-06 -313 7.100000e-01 -1.92073e-06 -314 7.200000e-01 -1.93494e-06 -315 7.300000e-01 -1.94921e-06 -316 7.400000e-01 -1.96354e-06 -317 7.500000e-01 -1.97792e-06 -318 7.600000e-01 -1.99235e-06 -319 7.700000e-01 -2.00684e-06 -320 7.800000e-01 -2.02139e-06 -321 7.900000e-01 -2.03600e-06 -322 8.000000e-01 -2.05067e-06 -323 8.100000e-01 -2.06539e-06 -324 8.200000e-01 -2.08018e-06 -325 8.300000e-01 -2.09503e-06 -326 8.400000e-01 -2.10993e-06 -327 8.500000e-01 -2.12490e-06 -328 8.600000e-01 -2.13993e-06 -329 8.700000e-01 -2.15503e-06 -330 8.800000e-01 -2.17018e-06 -331 8.900000e-01 -2.18541e-06 -332 9.000000e-01 -2.20069e-06 -333 9.100000e-01 -2.21604e-06 -334 9.200000e-01 -2.23146e-06 -335 9.300000e-01 -2.24694e-06 -336 9.400000e-01 -2.26249e-06 -337 9.500000e-01 -2.27811e-06 -338 9.600000e-01 -2.29379e-06 -339 9.700000e-01 -2.30954e-06 -340 9.800000e-01 -2.32537e-06 -341 9.900000e-01 -2.34125e-06 -342 1.000000e+00 -2.35721e-06 -343 1.010000e+00 -2.37324e-06 -344 1.020000e+00 -2.38934e-06 -345 1.030000e+00 -2.40551e-06 -346 1.040000e+00 -2.42175e-06 -347 1.050000e+00 -2.43806e-06 -348 1.060000e+00 -2.45445e-06 -349 1.070000e+00 -2.47090e-06 -350 1.080000e+00 -2.48743e-06 -351 1.090000e+00 -2.50404e-06 -352 1.100000e+00 -2.52071e-06 -353 1.110000e+00 -2.53746e-06 -354 1.120000e+00 -2.55429e-06 -355 1.130000e+00 -2.57119e-06 -356 1.140000e+00 -2.58816e-06 -357 1.150000e+00 -2.60521e-06 -358 1.160000e+00 -2.62234e-06 -359 1.170000e+00 -2.63954e-06 -360 1.180000e+00 -2.65682e-06 -361 1.190000e+00 -2.67418e-06 -362 1.200000e+00 -2.69162e-06 -363 0.000000e+00 2.215571e-16 -364 1.000000e-02 -1.06854e-06 -365 2.000000e-02 -2.02050e-06 -366 3.000000e-02 -2.85948e-06 -367 4.000000e-02 -3.58967e-06 -368 5.000000e-02 -4.21608e-06 -369 6.000000e-02 -4.74496e-06 -370 7.000000e-02 -5.18421e-06 -371 8.000000e-02 -5.54357e-06 -372 9.000000e-02 -5.83453e-06 -373 1.000000e-01 -6.06961e-06 -374 1.100000e-01 -6.26115e-06 -375 1.200000e-01 -6.42013e-06 -376 1.300000e-01 -6.55542e-06 -377 1.400000e-01 -6.67372e-06 -378 1.500000e-01 -6.77979e-06 -379 1.600000e-01 -6.87696e-06 -380 1.700000e-01 -6.96751e-06 -381 1.800000e-01 -7.05302e-06 -382 1.900000e-01 -7.13461e-06 -383 2.000000e-01 -7.21305e-06 -384 2.100000e-01 -7.28892e-06 -385 2.200000e-01 -7.36263e-06 -386 2.300000e-01 -7.43451e-06 -387 2.400000e-01 -7.50481e-06 -388 2.500000e-01 -7.57372e-06 -389 2.600000e-01 -7.64140e-06 -390 2.700000e-01 -7.70799e-06 -391 2.800000e-01 -7.77358e-06 -392 2.900000e-01 -7.83827e-06 -393 3.000000e-01 -7.90215e-06 -394 3.100000e-01 -7.96527e-06 -395 3.200000e-01 -8.02770e-06 -396 3.300000e-01 -8.08949e-06 -397 3.400000e-01 -8.15070e-06 -398 3.500000e-01 -8.21135e-06 -399 3.600000e-01 -8.27150e-06 -400 3.700000e-01 -8.33117e-06 -401 3.800000e-01 -8.39039e-06 -402 3.900000e-01 -8.44921e-06 -403 4.000000e-01 -8.50764e-06 -404 4.100000e-01 -8.56571e-06 -405 4.200000e-01 -8.62344e-06 -406 4.300000e-01 -8.68085e-06 -407 4.400000e-01 -8.73797e-06 -408 4.500000e-01 -8.79481e-06 -409 4.600000e-01 -8.85139e-06 -410 4.700000e-01 -8.90773e-06 -411 4.800000e-01 -8.96384e-06 -412 4.900000e-01 -9.01973e-06 -413 5.000000e-01 -9.07543e-06 -414 5.100000e-01 -9.13094e-06 -415 5.200000e-01 -9.18627e-06 -416 5.300000e-01 -9.24144e-06 -417 5.400000e-01 -9.29646e-06 -418 5.500000e-01 -9.35134e-06 -419 5.600000e-01 -9.40608e-06 -420 5.700000e-01 -9.46070e-06 -421 5.800000e-01 -9.51521e-06 -422 5.900000e-01 -9.56961e-06 -423 6.000000e-01 -9.62391e-06 -424 6.100000e-01 -9.67812e-06 -425 6.200000e-01 -9.73225e-06 -426 6.300000e-01 -9.78631e-06 -427 6.400000e-01 -9.84029e-06 -428 6.500000e-01 -9.89421e-06 -429 6.600000e-01 -9.94808e-06 -430 6.700000e-01 -1.00019e-05 -431 6.800000e-01 -1.00557e-05 -432 6.900000e-01 -1.01094e-05 -433 7.000000e-01 -1.01631e-05 -434 7.100000e-01 -1.02167e-05 -435 7.200000e-01 -1.02704e-05 -436 7.300000e-01 -1.03240e-05 -437 7.400000e-01 -1.03776e-05 -438 7.500000e-01 -1.04311e-05 -439 7.600000e-01 -1.04847e-05 -440 7.700000e-01 -1.05383e-05 -441 7.800000e-01 -1.05918e-05 -442 7.900000e-01 -1.06454e-05 -443 8.000000e-01 -1.06990e-05 -444 8.100000e-01 -1.07525e-05 -445 8.200000e-01 -1.08061e-05 -446 8.300000e-01 -1.08597e-05 -447 8.400000e-01 -1.09133e-05 -448 8.500000e-01 -1.09670e-05 -449 8.600000e-01 -1.10206e-05 -450 8.700000e-01 -1.10743e-05 -451 8.800000e-01 -1.11280e-05 -452 8.900000e-01 -1.11818e-05 -453 9.000000e-01 -1.12355e-05 -454 9.100000e-01 -1.12893e-05 -455 9.200000e-01 -1.13432e-05 -456 9.300000e-01 -1.13971e-05 -457 9.400000e-01 -1.14510e-05 -458 9.500000e-01 -1.15049e-05 -459 9.600000e-01 -1.15590e-05 -460 9.700000e-01 -1.16130e-05 -461 9.800000e-01 -1.16671e-05 -462 9.900000e-01 -1.17213e-05 -463 1.000000e+00 -1.17755e-05 -464 1.010000e+00 -1.18297e-05 -465 1.020000e+00 -1.18840e-05 -466 1.030000e+00 -1.19384e-05 -467 1.040000e+00 -1.19928e-05 -468 1.050000e+00 -1.20473e-05 -469 1.060000e+00 -1.21018e-05 -470 1.070000e+00 -1.21564e-05 -471 1.080000e+00 -1.22111e-05 -472 1.090000e+00 -1.22658e-05 -473 1.100000e+00 -1.23206e-05 -474 1.110000e+00 -1.23755e-05 -475 1.120000e+00 -1.24304e-05 -476 1.130000e+00 -1.24854e-05 -477 1.140000e+00 -1.25405e-05 -478 1.150000e+00 -1.25956e-05 -479 1.160000e+00 -1.26508e-05 -480 1.170000e+00 -1.27061e-05 -481 1.180000e+00 -1.27615e-05 -482 1.190000e+00 -1.28169e-05 -483 1.200000e+00 -1.28724e-05 -484 0.000000e+00 5.380166e-16 -485 1.000000e-02 -2.26948e-06 -486 2.000000e-02 -4.38309e-06 -487 3.000000e-02 -6.34429e-06 -488 4.000000e-02 -8.15655e-06 -489 5.000000e-02 -9.82345e-06 -490 6.000000e-02 -1.13487e-05 -491 7.000000e-02 -1.27364e-05 -492 8.000000e-02 -1.39907e-05 -493 9.000000e-02 -1.51166e-05 -494 1.000000e-01 -1.61196e-05 -495 1.100000e-01 -1.70063e-05 -496 1.200000e-01 -1.77843e-05 -497 1.300000e-01 -1.84626e-05 -498 1.400000e-01 -1.90515e-05 -499 1.500000e-01 -1.95622e-05 -500 1.600000e-01 -2.00064e-05 -501 1.700000e-01 -2.03956e-05 -502 1.800000e-01 -2.07403e-05 -503 1.900000e-01 -2.10496e-05 -504 2.000000e-01 -2.13307e-05 -505 2.100000e-01 -2.15898e-05 -506 2.200000e-01 -2.18311e-05 -507 2.300000e-01 -2.20582e-05 -508 2.400000e-01 -2.22737e-05 -509 2.500000e-01 -2.24795e-05 -510 2.600000e-01 -2.26770e-05 -511 2.700000e-01 -2.28676e-05 -512 2.800000e-01 -2.30520e-05 -513 2.900000e-01 -2.32310e-05 -514 3.000000e-01 -2.34052e-05 -515 3.100000e-01 -2.35750e-05 -516 3.200000e-01 -2.37409e-05 -517 3.300000e-01 -2.39032e-05 -518 3.400000e-01 -2.40621e-05 -519 3.500000e-01 -2.42180e-05 -520 3.600000e-01 -2.43711e-05 -521 3.700000e-01 -2.45215e-05 -522 3.800000e-01 -2.46694e-05 -523 3.900000e-01 -2.48149e-05 -524 4.000000e-01 -2.49583e-05 -525 4.100000e-01 -2.50997e-05 -526 4.200000e-01 -2.52391e-05 -527 4.300000e-01 -2.53766e-05 -528 4.400000e-01 -2.55125e-05 -529 4.500000e-01 -2.56466e-05 -530 4.600000e-01 -2.57792e-05 -531 4.700000e-01 -2.59104e-05 -532 4.800000e-01 -2.60401e-05 -533 4.900000e-01 -2.61685e-05 -534 5.000000e-01 -2.62956e-05 -535 5.100000e-01 -2.64214e-05 -536 5.200000e-01 -2.65461e-05 -537 5.300000e-01 -2.66697e-05 -538 5.400000e-01 -2.67922e-05 -539 5.500000e-01 -2.69138e-05 -540 5.600000e-01 -2.70343e-05 -541 5.700000e-01 -2.71539e-05 -542 5.800000e-01 -2.72726e-05 -543 5.900000e-01 -2.73905e-05 -544 6.000000e-01 -2.75075e-05 -545 6.100000e-01 -2.76238e-05 -546 6.200000e-01 -2.77393e-05 -547 6.300000e-01 -2.78540e-05 -548 6.400000e-01 -2.79681e-05 -549 6.500000e-01 -2.80815e-05 -550 6.600000e-01 -2.81943e-05 -551 6.700000e-01 -2.83065e-05 -552 6.800000e-01 -2.84180e-05 -553 6.900000e-01 -2.85290e-05 -554 7.000000e-01 -2.86395e-05 -555 7.100000e-01 -2.87494e-05 -556 7.200000e-01 -2.88588e-05 -557 7.300000e-01 -2.89677e-05 -558 7.400000e-01 -2.90762e-05 -559 7.500000e-01 -2.91842e-05 -560 7.600000e-01 -2.92918e-05 -561 7.700000e-01 -2.93989e-05 -562 7.800000e-01 -2.95057e-05 -563 7.900000e-01 -2.96120e-05 -564 8.000000e-01 -2.97180e-05 -565 8.100000e-01 -2.98236e-05 -566 8.200000e-01 -2.99289e-05 -567 8.300000e-01 -3.00338e-05 -568 8.400000e-01 -3.01384e-05 -569 8.500000e-01 -3.02427e-05 -570 8.600000e-01 -3.03467e-05 -571 8.700000e-01 -3.04504e-05 -572 8.800000e-01 -3.05538e-05 -573 8.900000e-01 -3.06569e-05 -574 9.000000e-01 -3.07598e-05 -575 9.100000e-01 -3.08625e-05 -576 9.200000e-01 -3.09649e-05 -577 9.300000e-01 -3.10670e-05 -578 9.400000e-01 -3.11690e-05 -579 9.500000e-01 -3.12707e-05 -580 9.600000e-01 -3.13722e-05 -581 9.700000e-01 -3.14735e-05 -582 9.800000e-01 -3.15746e-05 -583 9.900000e-01 -3.16755e-05 -584 1.000000e+00 -3.17762e-05 -585 1.010000e+00 -3.18768e-05 -586 1.020000e+00 -3.19772e-05 -587 1.030000e+00 -3.20774e-05 -588 1.040000e+00 -3.21775e-05 -589 1.050000e+00 -3.22774e-05 -590 1.060000e+00 -3.23772e-05 -591 1.070000e+00 -3.24769e-05 -592 1.080000e+00 -3.25764e-05 -593 1.090000e+00 -3.26758e-05 -594 1.100000e+00 -3.27750e-05 -595 1.110000e+00 -3.28742e-05 -596 1.120000e+00 -3.29732e-05 -597 1.130000e+00 -3.30721e-05 -598 1.140000e+00 -3.31709e-05 -599 1.150000e+00 -3.32696e-05 -600 1.160000e+00 -3.33682e-05 -601 1.170000e+00 -3.34668e-05 -602 1.180000e+00 -3.35652e-05 -603 1.190000e+00 -3.36636e-05 -604 1.200000e+00 -3.37618e-05 -605 0.000000e+00 1.193720e-15 -606 1.000000e-02 -3.51153e-06 -607 2.000000e-02 -6.84480e-06 -608 3.000000e-02 -1.00033e-05 -609 4.000000e-02 -1.29907e-05 -610 5.000000e-02 -1.58102e-05 -611 6.000000e-02 -1.84654e-05 -612 7.000000e-02 -2.09596e-05 -613 8.000000e-02 -2.32964e-05 -614 9.000000e-02 -2.54792e-05 -615 1.000000e-01 -2.75116e-05 -616 1.100000e-01 -2.93974e-05 -617 1.200000e-01 -3.11405e-05 -618 1.300000e-01 -3.27453e-05 -619 1.400000e-01 -3.42163e-05 -620 1.500000e-01 -3.55589e-05 -621 1.600000e-01 -3.67790e-05 -622 1.700000e-01 -3.78832e-05 -623 1.800000e-01 -3.88794e-05 -624 1.900000e-01 -3.97760e-05 -625 2.000000e-01 -4.05824e-05 -626 2.100000e-01 -4.13088e-05 -627 2.200000e-01 -4.19651e-05 -628 2.300000e-01 -4.25613e-05 -629 2.400000e-01 -4.31065e-05 -630 2.500000e-01 -4.36089e-05 -631 2.600000e-01 -4.40755e-05 -632 2.700000e-01 -4.45121e-05 -633 2.800000e-01 -4.49235e-05 -634 2.900000e-01 -4.53134e-05 -635 3.000000e-01 -4.56850e-05 -636 3.100000e-01 -4.60408e-05 -637 3.200000e-01 -4.63826e-05 -638 3.300000e-01 -4.67120e-05 -639 3.400000e-01 -4.70305e-05 -640 3.500000e-01 -4.73390e-05 -641 3.600000e-01 -4.76385e-05 -642 3.700000e-01 -4.79297e-05 -643 3.800000e-01 -4.82134e-05 -644 3.900000e-01 -4.84900e-05 -645 4.000000e-01 -4.87600e-05 -646 4.100000e-01 -4.90240e-05 -647 4.200000e-01 -4.92823e-05 -648 4.300000e-01 -4.95352e-05 -649 4.400000e-01 -4.97831e-05 -650 4.500000e-01 -5.00262e-05 -651 4.600000e-01 -5.02649e-05 -652 4.700000e-01 -5.04993e-05 -653 4.800000e-01 -5.07297e-05 -654 4.900000e-01 -5.09562e-05 -655 5.000000e-01 -5.11792e-05 -656 5.100000e-01 -5.13986e-05 -657 5.200000e-01 -5.16148e-05 -658 5.300000e-01 -5.18279e-05 -659 5.400000e-01 -5.20380e-05 -660 5.500000e-01 -5.22452e-05 -661 5.600000e-01 -5.24496e-05 -662 5.700000e-01 -5.26515e-05 -663 5.800000e-01 -5.28508e-05 -664 5.900000e-01 -5.30477e-05 -665 6.000000e-01 -5.32423e-05 -666 6.100000e-01 -5.34347e-05 -667 6.200000e-01 -5.36250e-05 -668 6.300000e-01 -5.38133e-05 -669 6.400000e-01 -5.39996e-05 -670 6.500000e-01 -5.41839e-05 -671 6.600000e-01 -5.43665e-05 -672 6.700000e-01 -5.45474e-05 -673 6.800000e-01 -5.47265e-05 -674 6.900000e-01 -5.49040e-05 -675 7.000000e-01 -5.50800e-05 -676 7.100000e-01 -5.52545e-05 -677 7.200000e-01 -5.54275e-05 -678 7.300000e-01 -5.55991e-05 -679 7.400000e-01 -5.57693e-05 -680 7.500000e-01 -5.59383e-05 -681 7.600000e-01 -5.61059e-05 -682 7.700000e-01 -5.62724e-05 -683 7.800000e-01 -5.64377e-05 -684 7.900000e-01 -5.66018e-05 -685 8.000000e-01 -5.67648e-05 -686 8.100000e-01 -5.69268e-05 -687 8.200000e-01 -5.70877e-05 -688 8.300000e-01 -5.72476e-05 -689 8.400000e-01 -5.74066e-05 -690 8.500000e-01 -5.75646e-05 -691 8.600000e-01 -5.77217e-05 -692 8.700000e-01 -5.78779e-05 -693 8.800000e-01 -5.80333e-05 -694 8.900000e-01 -5.81878e-05 -695 9.000000e-01 -5.83415e-05 -696 9.100000e-01 -5.84945e-05 -697 9.200000e-01 -5.86466e-05 -698 9.300000e-01 -5.87981e-05 -699 9.400000e-01 -5.89488e-05 -700 9.500000e-01 -5.90989e-05 -701 9.600000e-01 -5.92482e-05 -702 9.700000e-01 -5.93970e-05 -703 9.800000e-01 -5.95450e-05 -704 9.900000e-01 -5.96925e-05 -705 1.000000e+00 -5.98394e-05 -706 1.010000e+00 -5.99856e-05 -707 1.020000e+00 -6.01314e-05 -708 1.030000e+00 -6.02765e-05 -709 1.040000e+00 -6.04212e-05 -710 1.050000e+00 -6.05653e-05 -711 1.060000e+00 -6.07089e-05 -712 1.070000e+00 -6.08520e-05 -713 1.080000e+00 -6.09946e-05 -714 1.090000e+00 -6.11368e-05 -715 1.100000e+00 -6.12785e-05 -716 1.110000e+00 -6.14197e-05 -717 1.120000e+00 -6.15606e-05 -718 1.130000e+00 -6.17010e-05 -719 1.140000e+00 -6.18410e-05 -720 1.150000e+00 -6.19806e-05 -721 1.160000e+00 -6.21198e-05 -722 1.170000e+00 -6.22587e-05 -723 1.180000e+00 -6.23972e-05 -724 1.190000e+00 -6.25353e-05 -725 1.200000e+00 -6.26731e-05 -726 0.000000e+00 2.481328e-15 -727 1.000000e-02 -4.67188e-06 -728 2.000000e-02 -9.15181e-06 -729 3.000000e-02 -1.34434e-05 -730 4.000000e-02 -1.75501e-05 -731 5.000000e-02 -2.14755e-05 -732 6.000000e-02 -2.52228e-05 -733 7.000000e-02 -2.87954e-05 -734 8.000000e-02 -3.21967e-05 -735 9.000000e-02 -3.54298e-05 -736 1.000000e-01 -3.84980e-05 -737 1.100000e-01 -4.14046e-05 -738 1.200000e-01 -4.41527e-05 -739 1.300000e-01 -4.67456e-05 -740 1.400000e-01 -4.91868e-05 -741 1.500000e-01 -5.14795e-05 -742 1.600000e-01 -5.36275e-05 -743 1.700000e-01 -5.56345e-05 -744 1.800000e-01 -5.75045e-05 -745 1.900000e-01 -5.92420e-05 -746 2.000000e-01 -6.08519e-05 -747 2.100000e-01 -6.23395e-05 -748 2.200000e-01 -6.37109e-05 -749 2.300000e-01 -6.49727e-05 -750 2.400000e-01 -6.61325e-05 -751 2.500000e-01 -6.71982e-05 -752 2.600000e-01 -6.81783e-05 -753 2.700000e-01 -6.90816e-05 -754 2.800000e-01 -6.99167e-05 -755 2.900000e-01 -7.06920e-05 -756 3.000000e-01 -7.14150e-05 -757 3.100000e-01 -7.20928e-05 -758 3.200000e-01 -7.27313e-05 -759 3.300000e-01 -7.33356e-05 -760 3.400000e-01 -7.39101e-05 -761 3.500000e-01 -7.44583e-05 -762 3.600000e-01 -7.49833e-05 -763 3.700000e-01 -7.54876e-05 -764 3.800000e-01 -7.59733e-05 -765 3.900000e-01 -7.64421e-05 -766 4.000000e-01 -7.68956e-05 -767 4.100000e-01 -7.73350e-05 -768 4.200000e-01 -7.77614e-05 -769 4.300000e-01 -7.81759e-05 -770 4.400000e-01 -7.85791e-05 -771 4.500000e-01 -7.89719e-05 -772 4.600000e-01 -7.93549e-05 -773 4.700000e-01 -7.97288e-05 -774 4.800000e-01 -8.00940e-05 -775 4.900000e-01 -8.04511e-05 -776 5.000000e-01 -8.08005e-05 -777 5.100000e-01 -8.11426e-05 -778 5.200000e-01 -8.14778e-05 -779 5.300000e-01 -8.18065e-05 -780 5.400000e-01 -8.21289e-05 -781 5.500000e-01 -8.24453e-05 -782 5.600000e-01 -8.27561e-05 -783 5.700000e-01 -8.30615e-05 -784 5.800000e-01 -8.33618e-05 -785 5.900000e-01 -8.36571e-05 -786 6.000000e-01 -8.39476e-05 -787 6.100000e-01 -8.42337e-05 -788 6.200000e-01 -8.45155e-05 -789 6.300000e-01 -8.47930e-05 -790 6.400000e-01 -8.50667e-05 -791 6.500000e-01 -8.53364e-05 -792 6.600000e-01 -8.56026e-05 -793 6.700000e-01 -8.58651e-05 -794 6.800000e-01 -8.61243e-05 -795 6.900000e-01 -8.63802e-05 -796 7.000000e-01 -8.66330e-05 -797 7.100000e-01 -8.68828e-05 -798 7.200000e-01 -8.71296e-05 -799 7.300000e-01 -8.73736e-05 -800 7.400000e-01 -8.76149e-05 -801 7.500000e-01 -8.78536e-05 -802 7.600000e-01 -8.80897e-05 -803 7.700000e-01 -8.83234e-05 -804 7.800000e-01 -8.85547e-05 -805 7.900000e-01 -8.87838e-05 -806 8.000000e-01 -8.90106e-05 -807 8.100000e-01 -8.92353e-05 -808 8.200000e-01 -8.94580e-05 -809 8.300000e-01 -8.96786e-05 -810 8.400000e-01 -8.98974e-05 -811 8.500000e-01 -9.01142e-05 -812 8.600000e-01 -9.03292e-05 -813 8.700000e-01 -9.05425e-05 -814 8.800000e-01 -9.07540e-05 -815 8.900000e-01 -9.09639e-05 -816 9.000000e-01 -9.11722e-05 -817 9.100000e-01 -9.13790e-05 -818 9.200000e-01 -9.15842e-05 -819 9.300000e-01 -9.17880e-05 -820 9.400000e-01 -9.19903e-05 -821 9.500000e-01 -9.21912e-05 -822 9.600000e-01 -9.23908e-05 -823 9.700000e-01 -9.25891e-05 -824 9.800000e-01 -9.27862e-05 -825 9.900000e-01 -9.29819e-05 -826 1.000000e+00 -9.31765e-05 -827 1.010000e+00 -9.33700e-05 -828 1.020000e+00 -9.35622e-05 -829 1.030000e+00 -9.37534e-05 -830 1.040000e+00 -9.39435e-05 -831 1.050000e+00 -9.41326e-05 -832 1.060000e+00 -9.43206e-05 -833 1.070000e+00 -9.45076e-05 -834 1.080000e+00 -9.46937e-05 -835 1.090000e+00 -9.48788e-05 -836 1.100000e+00 -9.50631e-05 -837 1.110000e+00 -9.52464e-05 -838 1.120000e+00 -9.54288e-05 -839 1.130000e+00 -9.56104e-05 -840 1.140000e+00 -9.57912e-05 -841 1.150000e+00 -9.59712e-05 -842 1.160000e+00 -9.61503e-05 -843 1.170000e+00 -9.63287e-05 -844 1.180000e+00 -9.65064e-05 -845 1.190000e+00 -9.66833e-05 -846 1.200000e+00 -9.68595e-05 -847 0.000000e+00 4.920616e-15 -848 1.000000e-02 -5.72748e-06 -849 2.000000e-02 -1.12547e-05 -850 3.000000e-02 -1.65852e-05 -851 4.000000e-02 -2.17224e-05 -852 5.000000e-02 -2.66698e-05 -853 6.000000e-02 -3.14307e-05 -854 7.000000e-02 -3.60084e-05 -855 8.000000e-02 -4.04061e-05 -856 9.000000e-02 -4.46269e-05 -857 1.000000e-01 -4.86739e-05 -858 1.100000e-01 -5.25503e-05 -859 1.200000e-01 -5.62590e-05 -860 1.300000e-01 -5.98030e-05 -861 1.400000e-01 -6.31854e-05 -862 1.500000e-01 -6.64090e-05 -863 1.600000e-01 -6.94770e-05 -864 1.700000e-01 -7.23922e-05 -865 1.800000e-01 -7.51578e-05 -866 1.900000e-01 -7.77769e-05 -867 2.000000e-01 -8.02527e-05 -868 2.100000e-01 -8.25886e-05 -869 2.200000e-01 -8.47882e-05 -870 2.300000e-01 -8.68554e-05 -871 2.400000e-01 -8.87942e-05 -872 2.500000e-01 -9.06092e-05 -873 2.600000e-01 -9.23054e-05 -874 2.700000e-01 -9.38882e-05 -875 2.800000e-01 -9.53638e-05 -876 2.900000e-01 -9.67385e-05 -877 3.000000e-01 -9.80195e-05 -878 3.100000e-01 -9.92141e-05 -879 3.200000e-01 -1.00330e-04 -880 3.300000e-01 -1.01374e-04 -881 3.400000e-01 -1.02355e-04 -882 3.500000e-01 -1.03278e-04 -883 3.600000e-01 -1.04150e-04 -884 3.700000e-01 -1.04977e-04 -885 3.800000e-01 -1.05763e-04 -886 3.900000e-01 -1.06514e-04 -887 4.000000e-01 -1.07232e-04 -888 4.100000e-01 -1.07921e-04 -889 4.200000e-01 -1.08584e-04 -890 4.300000e-01 -1.09223e-04 -891 4.400000e-01 -1.09840e-04 -892 4.500000e-01 -1.10436e-04 -893 4.600000e-01 -1.11014e-04 -894 4.700000e-01 -1.11575e-04 -895 4.800000e-01 -1.12119e-04 -896 4.900000e-01 -1.12648e-04 -897 5.000000e-01 -1.13163e-04 -898 5.100000e-01 -1.13665e-04 -899 5.200000e-01 -1.14154e-04 -900 5.300000e-01 -1.14631e-04 -901 5.400000e-01 -1.15097e-04 -902 5.500000e-01 -1.15552e-04 -903 5.600000e-01 -1.15997e-04 -904 5.700000e-01 -1.16433e-04 -905 5.800000e-01 -1.16859e-04 -906 5.900000e-01 -1.17277e-04 -907 6.000000e-01 -1.17686e-04 -908 6.100000e-01 -1.18088e-04 -909 6.200000e-01 -1.18482e-04 -910 6.300000e-01 -1.18869e-04 -911 6.400000e-01 -1.19249e-04 -912 6.500000e-01 -1.19622e-04 -913 6.600000e-01 -1.19989e-04 -914 6.700000e-01 -1.20350e-04 -915 6.800000e-01 -1.20705e-04 -916 6.900000e-01 -1.21054e-04 -917 7.000000e-01 -1.21398e-04 -918 7.100000e-01 -1.21737e-04 -919 7.200000e-01 -1.22071e-04 -920 7.300000e-01 -1.22400e-04 -921 7.400000e-01 -1.22724e-04 -922 7.500000e-01 -1.23044e-04 -923 7.600000e-01 -1.23359e-04 -924 7.700000e-01 -1.23671e-04 -925 7.800000e-01 -1.23978e-04 -926 7.900000e-01 -1.24282e-04 -927 8.000000e-01 -1.24582e-04 -928 8.100000e-01 -1.24878e-04 -929 8.200000e-01 -1.25171e-04 -930 8.300000e-01 -1.25460e-04 -931 8.400000e-01 -1.25746e-04 -932 8.500000e-01 -1.26029e-04 -933 8.600000e-01 -1.26309e-04 -934 8.700000e-01 -1.26586e-04 -935 8.800000e-01 -1.26860e-04 -936 8.900000e-01 -1.27132e-04 -937 9.000000e-01 -1.27401e-04 -938 9.100000e-01 -1.27667e-04 -939 9.200000e-01 -1.27930e-04 -940 9.300000e-01 -1.28191e-04 -941 9.400000e-01 -1.28450e-04 -942 9.500000e-01 -1.28706e-04 -943 9.600000e-01 -1.28961e-04 -944 9.700000e-01 -1.29213e-04 -945 9.800000e-01 -1.29463e-04 -946 9.900000e-01 -1.29710e-04 -947 1.000000e+00 -1.29956e-04 -948 1.010000e+00 -1.30200e-04 -949 1.020000e+00 -1.30442e-04 -950 1.030000e+00 -1.30682e-04 -951 1.040000e+00 -1.30921e-04 -952 1.050000e+00 -1.31157e-04 -953 1.060000e+00 -1.31392e-04 -954 1.070000e+00 -1.31626e-04 -955 1.080000e+00 -1.31857e-04 -956 1.090000e+00 -1.32087e-04 -957 1.100000e+00 -1.32316e-04 -958 1.110000e+00 -1.32543e-04 -959 1.120000e+00 -1.32769e-04 -960 1.130000e+00 -1.32993e-04 -961 1.140000e+00 -1.33216e-04 -962 1.150000e+00 -1.33437e-04 -963 1.160000e+00 -1.33658e-04 -964 1.170000e+00 -1.33877e-04 -965 1.180000e+00 -1.34094e-04 -966 1.190000e+00 -1.34311e-04 -967 1.200000e+00 -1.34526e-04 -968 0.000000e+00 9.422639e-15 -969 1.000000e-02 -6.67563e-06 -970 2.000000e-02 -1.31464e-05 -971 3.000000e-02 -1.94159e-05 -972 4.000000e-02 -2.54874e-05 -973 5.000000e-02 -3.13642e-05 -974 6.000000e-02 -3.70495e-05 -975 7.000000e-02 -4.25467e-05 -976 8.000000e-02 -4.78588e-05 -977 9.000000e-02 -5.29888e-05 -978 1.000000e-01 -5.79397e-05 -979 1.100000e-01 -6.27146e-05 -980 1.200000e-01 -6.73163e-05 -981 1.300000e-01 -7.17477e-05 -982 1.400000e-01 -7.60115e-05 -983 1.500000e-01 -8.01107e-05 -984 1.600000e-01 -8.40478e-05 -985 1.700000e-01 -8.78258e-05 -986 1.800000e-01 -9.14472e-05 -987 1.900000e-01 -9.49149e-05 -988 2.000000e-01 -9.82314e-05 -989 2.100000e-01 -1.01400e-04 -990 2.200000e-01 -1.04422e-04 -991 2.300000e-01 -1.07302e-04 -992 2.400000e-01 -1.10042e-04 -993 2.500000e-01 -1.12646e-04 -994 2.600000e-01 -1.15116e-04 -995 2.700000e-01 -1.17455e-04 -996 2.800000e-01 -1.19668e-04 -997 2.900000e-01 -1.21759e-04 -998 3.000000e-01 -1.23731e-04 -999 3.100000e-01 -1.25589e-04 -1000 3.200000e-01 -1.27338e-04 -1001 3.300000e-01 -1.28984e-04 -1002 3.400000e-01 -1.30532e-04 -1003 3.500000e-01 -1.31989e-04 -1004 3.600000e-01 -1.33361e-04 -1005 3.700000e-01 -1.34655e-04 -1006 3.800000e-01 -1.35877e-04 -1007 3.900000e-01 -1.37033e-04 -1008 4.000000e-01 -1.38130e-04 -1009 4.100000e-01 -1.39173e-04 -1010 4.200000e-01 -1.40167e-04 -1011 4.300000e-01 -1.41117e-04 -1012 4.400000e-01 -1.42027e-04 -1013 4.500000e-01 -1.42900e-04 -1014 4.600000e-01 -1.43740e-04 -1015 4.700000e-01 -1.44549e-04 -1016 4.800000e-01 -1.45330e-04 -1017 4.900000e-01 -1.46084e-04 -1018 5.000000e-01 -1.46814e-04 -1019 5.100000e-01 -1.47522e-04 -1020 5.200000e-01 -1.48209e-04 -1021 5.300000e-01 -1.48875e-04 -1022 5.400000e-01 -1.49523e-04 -1023 5.500000e-01 -1.50154e-04 -1024 5.600000e-01 -1.50768e-04 -1025 5.700000e-01 -1.51366e-04 -1026 5.800000e-01 -1.51950e-04 -1027 5.900000e-01 -1.52520e-04 -1028 6.000000e-01 -1.53076e-04 -1029 6.100000e-01 -1.53619e-04 -1030 6.200000e-01 -1.54151e-04 -1031 6.300000e-01 -1.54671e-04 -1032 6.400000e-01 -1.55180e-04 -1033 6.500000e-01 -1.55678e-04 -1034 6.600000e-01 -1.56167e-04 -1035 6.700000e-01 -1.56646e-04 -1036 6.800000e-01 -1.57116e-04 -1037 6.900000e-01 -1.57576e-04 -1038 7.000000e-01 -1.58029e-04 -1039 7.100000e-01 -1.58473e-04 -1040 7.200000e-01 -1.58910e-04 -1041 7.300000e-01 -1.59339e-04 -1042 7.400000e-01 -1.59761e-04 -1043 7.500000e-01 -1.60176e-04 -1044 7.600000e-01 -1.60585e-04 -1045 7.700000e-01 -1.60987e-04 -1046 7.800000e-01 -1.61382e-04 -1047 7.900000e-01 -1.61772e-04 -1048 8.000000e-01 -1.62156e-04 -1049 8.100000e-01 -1.62535e-04 -1050 8.200000e-01 -1.62908e-04 -1051 8.300000e-01 -1.63276e-04 -1052 8.400000e-01 -1.63640e-04 -1053 8.500000e-01 -1.63998e-04 -1054 8.600000e-01 -1.64352e-04 -1055 8.700000e-01 -1.64701e-04 -1056 8.800000e-01 -1.65046e-04 -1057 8.900000e-01 -1.65386e-04 -1058 9.000000e-01 -1.65723e-04 -1059 9.100000e-01 -1.66055e-04 -1060 9.200000e-01 -1.66384e-04 -1061 9.300000e-01 -1.66709e-04 -1062 9.400000e-01 -1.67031e-04 -1063 9.500000e-01 -1.67349e-04 -1064 9.600000e-01 -1.67663e-04 -1065 9.700000e-01 -1.67975e-04 -1066 9.800000e-01 -1.68283e-04 -1067 9.900000e-01 -1.68588e-04 -1068 1.000000e+00 -1.68890e-04 -1069 1.010000e+00 -1.69189e-04 -1070 1.020000e+00 -1.69485e-04 -1071 1.030000e+00 -1.69778e-04 -1072 1.040000e+00 -1.70069e-04 -1073 1.050000e+00 -1.70357e-04 -1074 1.060000e+00 -1.70643e-04 -1075 1.070000e+00 -1.70926e-04 -1076 1.080000e+00 -1.71207e-04 -1077 1.090000e+00 -1.71485e-04 -1078 1.100000e+00 -1.71762e-04 -1079 1.110000e+00 -1.72036e-04 -1080 1.120000e+00 -1.72307e-04 -1081 1.130000e+00 -1.72577e-04 -1082 1.140000e+00 -1.72845e-04 -1083 1.150000e+00 -1.73110e-04 -1084 1.160000e+00 -1.73374e-04 -1085 1.170000e+00 -1.73636e-04 -1086 1.180000e+00 -1.73896e-04 -1087 1.190000e+00 -1.74154e-04 -1088 1.200000e+00 -1.74410e-04 -1089 0.000000e+00 1.756511e-14 -1090 1.000000e-02 -7.51853e-06 -1091 2.000000e-02 -1.48306e-05 -1092 3.000000e-02 -2.19394e-05 -1093 4.000000e-02 -2.88484e-05 -1094 5.000000e-02 -3.55606e-05 -1095 6.000000e-02 -4.20791e-05 -1096 7.000000e-02 -4.84072e-05 -1097 8.000000e-02 -5.45477e-05 -1098 9.000000e-02 -6.05036e-05 -1099 1.000000e-01 -6.62778e-05 -1100 1.100000e-01 -7.18732e-05 -1101 1.200000e-01 -7.72924e-05 -1102 1.300000e-01 -8.25384e-05 -1103 1.400000e-01 -8.76136e-05 -1104 1.500000e-01 -9.25209e-05 -1105 1.600000e-01 -9.72627e-05 -1106 1.700000e-01 -1.01842e-04 -1107 1.800000e-01 -1.06261e-04 -1108 1.900000e-01 -1.10522e-04 -1109 2.000000e-01 -1.14627e-04 -1110 2.100000e-01 -1.18580e-04 -1111 2.200000e-01 -1.22383e-04 -1112 2.300000e-01 -1.26037e-04 -1113 2.400000e-01 -1.29547e-04 -1114 2.500000e-01 -1.32913e-04 -1115 2.600000e-01 -1.36139e-04 -1116 2.700000e-01 -1.39227e-04 -1117 2.800000e-01 -1.42180e-04 -1118 2.900000e-01 -1.45000e-04 -1119 3.000000e-01 -1.47691e-04 -1120 3.100000e-01 -1.50255e-04 -1121 3.200000e-01 -1.52696e-04 -1122 3.300000e-01 -1.55016e-04 -1123 3.400000e-01 -1.57220e-04 -1124 3.500000e-01 -1.59312e-04 -1125 3.600000e-01 -1.61295e-04 -1126 3.700000e-01 -1.63175e-04 -1127 3.800000e-01 -1.64956e-04 -1128 3.900000e-01 -1.66643e-04 -1129 4.000000e-01 -1.68243e-04 -1130 4.100000e-01 -1.69760e-04 -1131 4.200000e-01 -1.71201e-04 -1132 4.300000e-01 -1.72571e-04 -1133 4.400000e-01 -1.73876e-04 -1134 4.500000e-01 -1.75120e-04 -1135 4.600000e-01 -1.76309e-04 -1136 4.700000e-01 -1.77448e-04 -1137 4.800000e-01 -1.78540e-04 -1138 4.900000e-01 -1.79589e-04 -1139 5.000000e-01 -1.80599e-04 -1140 5.100000e-01 -1.81572e-04 -1141 5.200000e-01 -1.82512e-04 -1142 5.300000e-01 -1.83420e-04 -1143 5.400000e-01 -1.84298e-04 -1144 5.500000e-01 -1.85149e-04 -1145 5.600000e-01 -1.85975e-04 -1146 5.700000e-01 -1.86776e-04 -1147 5.800000e-01 -1.87554e-04 -1148 5.900000e-01 -1.88311e-04 -1149 6.000000e-01 -1.89048e-04 -1150 6.100000e-01 -1.89766e-04 -1151 6.200000e-01 -1.90465e-04 -1152 6.300000e-01 -1.91147e-04 -1153 6.400000e-01 -1.91812e-04 -1154 6.500000e-01 -1.92462e-04 -1155 6.600000e-01 -1.93097e-04 -1156 6.700000e-01 -1.93718e-04 -1157 6.800000e-01 -1.94325e-04 -1158 6.900000e-01 -1.94919e-04 -1159 7.000000e-01 -1.95500e-04 -1160 7.100000e-01 -1.96070e-04 -1161 7.200000e-01 -1.96628e-04 -1162 7.300000e-01 -1.97176e-04 -1163 7.400000e-01 -1.97712e-04 -1164 7.500000e-01 -1.98239e-04 -1165 7.600000e-01 -1.98756e-04 -1166 7.700000e-01 -1.99264e-04 -1167 7.800000e-01 -1.99763e-04 -1168 7.900000e-01 -2.00253e-04 -1169 8.000000e-01 -2.00735e-04 -1170 8.100000e-01 -2.01209e-04 -1171 8.200000e-01 -2.01675e-04 -1172 8.300000e-01 -2.02134e-04 -1173 8.400000e-01 -2.02585e-04 -1174 8.500000e-01 -2.03030e-04 -1175 8.600000e-01 -2.03468e-04 -1176 8.700000e-01 -2.03900e-04 -1177 8.800000e-01 -2.04325e-04 -1178 8.900000e-01 -2.04744e-04 -1179 9.000000e-01 -2.05158e-04 -1180 9.100000e-01 -2.05565e-04 -1181 9.200000e-01 -2.05968e-04 -1182 9.300000e-01 -2.06365e-04 -1183 9.400000e-01 -2.06757e-04 -1184 9.500000e-01 -2.07144e-04 -1185 9.600000e-01 -2.07526e-04 -1186 9.700000e-01 -2.07904e-04 -1187 9.800000e-01 -2.08277e-04 -1188 9.900000e-01 -2.08645e-04 -1189 1.000000e+00 -2.09010e-04 -1190 1.010000e+00 -2.09370e-04 -1191 1.020000e+00 -2.09726e-04 -1192 1.030000e+00 -2.10078e-04 -1193 1.040000e+00 -2.10427e-04 -1194 1.050000e+00 -2.10772e-04 -1195 1.060000e+00 -2.11113e-04 -1196 1.070000e+00 -2.11451e-04 -1197 1.080000e+00 -2.11786e-04 -1198 1.090000e+00 -2.12117e-04 -1199 1.100000e+00 -2.12445e-04 -1200 1.110000e+00 -2.12770e-04 -1201 1.120000e+00 -2.13091e-04 -1202 1.130000e+00 -2.13410e-04 -1203 1.140000e+00 -2.13726e-04 -1204 1.150000e+00 -2.14039e-04 -1205 1.160000e+00 -2.14350e-04 -1206 1.170000e+00 -2.14658e-04 -1207 1.180000e+00 -2.14963e-04 -1208 1.190000e+00 -2.15266e-04 -1209 1.200000e+00 -2.15566e-04 -1210 0.000000e+00 3.205386e-14 -1211 1.000000e-02 -8.26059e-06 -1212 2.000000e-02 -1.63153e-05 -1213 3.000000e-02 -2.41672e-05 -1214 4.000000e-02 -3.18194e-05 -1215 5.000000e-02 -3.92750e-05 -1216 6.000000e-02 -4.65369e-05 -1217 7.000000e-02 -5.36082e-05 -1218 8.000000e-02 -6.04915e-05 -1219 9.000000e-02 -6.71898e-05 -1220 1.000000e-01 -7.37057e-05 -1221 1.100000e-01 -8.00421e-05 -1222 1.200000e-01 -8.62015e-05 -1223 1.300000e-01 -9.21865e-05 -1224 1.400000e-01 -9.79998e-05 -1225 1.500000e-01 -1.03644e-04 -1226 1.600000e-01 -1.09121e-04 -1227 1.700000e-01 -1.14434e-04 -1228 1.800000e-01 -1.19585e-04 -1229 1.900000e-01 -1.24576e-04 -1230 2.000000e-01 -1.29411e-04 -1231 2.100000e-01 -1.34090e-04 -1232 2.200000e-01 -1.38616e-04 -1233 2.300000e-01 -1.42993e-04 -1234 2.400000e-01 -1.47221e-04 -1235 2.500000e-01 -1.51303e-04 -1236 2.600000e-01 -1.55241e-04 -1237 2.700000e-01 -1.59038e-04 -1238 2.800000e-01 -1.62696e-04 -1239 2.900000e-01 -1.66217e-04 -1240 3.000000e-01 -1.69603e-04 -1241 3.100000e-01 -1.72856e-04 -1242 3.200000e-01 -1.75980e-04 -1243 3.300000e-01 -1.78975e-04 -1244 3.400000e-01 -1.81846e-04 -1245 3.500000e-01 -1.84595e-04 -1246 3.600000e-01 -1.87223e-04 -1247 3.700000e-01 -1.89735e-04 -1248 3.800000e-01 -1.92134e-04 -1249 3.900000e-01 -1.94423e-04 -1250 4.000000e-01 -1.96605e-04 -1251 4.100000e-01 -1.98685e-04 -1252 4.200000e-01 -2.00666e-04 -1253 4.300000e-01 -2.02554e-04 -1254 4.400000e-01 -2.04353e-04 -1255 4.500000e-01 -2.06068e-04 -1256 4.600000e-01 -2.07703e-04 -1257 4.700000e-01 -2.09265e-04 -1258 4.800000e-01 -2.10757e-04 -1259 4.900000e-01 -2.12185e-04 -1260 5.000000e-01 -2.13553e-04 -1261 5.100000e-01 -2.14866e-04 -1262 5.200000e-01 -2.16127e-04 -1263 5.300000e-01 -2.17341e-04 -1264 5.400000e-01 -2.18510e-04 -1265 5.500000e-01 -2.19637e-04 -1266 5.600000e-01 -2.20727e-04 -1267 5.700000e-01 -2.21780e-04 -1268 5.800000e-01 -2.22799e-04 -1269 5.900000e-01 -2.23787e-04 -1270 6.000000e-01 -2.24745e-04 -1271 6.100000e-01 -2.25675e-04 -1272 6.200000e-01 -2.26579e-04 -1273 6.300000e-01 -2.27457e-04 -1274 6.400000e-01 -2.28312e-04 -1275 6.500000e-01 -2.29144e-04 -1276 6.600000e-01 -2.29955e-04 -1277 6.700000e-01 -2.30745e-04 -1278 6.800000e-01 -2.31516e-04 -1279 6.900000e-01 -2.32269e-04 -1280 7.000000e-01 -2.33004e-04 -1281 7.100000e-01 -2.33722e-04 -1282 7.200000e-01 -2.34425e-04 -1283 7.300000e-01 -2.35111e-04 -1284 7.400000e-01 -2.35783e-04 -1285 7.500000e-01 -2.36441e-04 -1286 7.600000e-01 -2.37086e-04 -1287 7.700000e-01 -2.37717e-04 -1288 7.800000e-01 -2.38336e-04 -1289 7.900000e-01 -2.38943e-04 -1290 8.000000e-01 -2.39538e-04 -1291 8.100000e-01 -2.40123e-04 -1292 8.200000e-01 -2.40697e-04 -1293 8.300000e-01 -2.41260e-04 -1294 8.400000e-01 -2.41814e-04 -1295 8.500000e-01 -2.42358e-04 -1296 8.600000e-01 -2.42892e-04 -1297 8.700000e-01 -2.43418e-04 -1298 8.800000e-01 -2.43936e-04 -1299 8.900000e-01 -2.44445e-04 -1300 9.000000e-01 -2.44946e-04 -1301 9.100000e-01 -2.45440e-04 -1302 9.200000e-01 -2.45925e-04 -1303 9.300000e-01 -2.46404e-04 -1304 9.400000e-01 -2.46876e-04 -1305 9.500000e-01 -2.47341e-04 -1306 9.600000e-01 -2.47800e-04 -1307 9.700000e-01 -2.48252e-04 -1308 9.800000e-01 -2.48698e-04 -1309 9.900000e-01 -2.49138e-04 -1310 1.000000e+00 -2.49572e-04 -1311 1.010000e+00 -2.50001e-04 -1312 1.020000e+00 -2.50424e-04 -1313 1.030000e+00 -2.50842e-04 -1314 1.040000e+00 -2.51255e-04 -1315 1.050000e+00 -2.51663e-04 -1316 1.060000e+00 -2.52066e-04 -1317 1.070000e+00 -2.52465e-04 -1318 1.080000e+00 -2.52859e-04 -1319 1.090000e+00 -2.53248e-04 -1320 1.100000e+00 -2.53633e-04 -1321 1.110000e+00 -2.54014e-04 -1322 1.120000e+00 -2.54391e-04 -1323 1.130000e+00 -2.54764e-04 -1324 1.140000e+00 -2.55133e-04 -1325 1.150000e+00 -2.55499e-04 -1326 1.160000e+00 -2.55860e-04 -1327 1.170000e+00 -2.56218e-04 -1328 1.180000e+00 -2.56573e-04 -1329 1.190000e+00 -2.56924e-04 -1330 1.200000e+00 -2.57272e-04 +0 0.000000e+00 3.745007e-18 3.745007e-18 +1 1.000000e-02 -1.68741e-09 1.687278e-09 +2 2.000000e-02 -2.91222e-09 2.911978e-09 +3 3.000000e-02 -3.74980e-09 3.749462e-09 +4 4.000000e-02 -4.29876e-09 4.298324e-09 +5 5.000000e-02 -4.65844e-09 4.657925e-09 +6 6.000000e-02 -4.90588e-09 4.905285e-09 +7 7.000000e-02 -5.08987e-09 5.089198e-09 +8 8.000000e-02 -5.23798e-09 5.237238e-09 +9 9.000000e-02 -5.36520e-09 5.364393e-09 +10 1.000000e-01 -5.47974e-09 5.478873e-09 +11 1.100000e-01 -5.58625e-09 5.585320e-09 +12 1.200000e-01 -5.68746e-09 5.686470e-09 +13 1.300000e-01 -5.78506e-09 5.784003e-09 +14 1.400000e-01 -5.88012e-09 5.878999e-09 +15 1.500000e-01 -5.97336e-09 5.972178e-09 +16 1.600000e-01 -6.06528e-09 6.064038e-09 +17 1.700000e-01 -6.15624e-09 6.154937e-09 +18 1.800000e-01 -6.24651e-09 6.245139e-09 +19 1.900000e-01 -6.33628e-09 6.334846e-09 +20 2.000000e-01 -6.42572e-09 6.424216e-09 +21 2.100000e-01 -6.51495e-09 6.513375e-09 +22 2.200000e-01 -6.60407e-09 6.602425e-09 +23 2.300000e-01 -6.69317e-09 6.691454e-09 +24 2.400000e-01 -6.78233e-09 6.780535e-09 +25 2.500000e-01 -6.87161e-09 6.869731e-09 +26 2.600000e-01 -6.96105e-09 6.959098e-09 +27 2.700000e-01 -7.05072e-09 7.048683e-09 +28 2.800000e-01 -7.14066e-09 7.138532e-09 +29 2.900000e-01 -7.23090e-09 7.228683e-09 +30 3.000000e-01 -7.32148e-09 7.319173e-09 +31 3.100000e-01 -7.41244e-09 7.410034e-09 +32 3.200000e-01 -7.50380e-09 7.501298e-09 +33 3.300000e-01 -7.59560e-09 7.592993e-09 +34 3.400000e-01 -7.68786e-09 7.685145e-09 +35 3.500000e-01 -7.78060e-09 7.777780e-09 +36 3.600000e-01 -7.87385e-09 7.870921e-09 +37 3.700000e-01 -7.96764e-09 7.964590e-09 +38 3.800000e-01 -8.06198e-09 8.058809e-09 +39 3.900000e-01 -8.15689e-09 8.153598e-09 +40 4.000000e-01 -8.25240e-09 8.248976e-09 +41 4.100000e-01 -8.34852e-09 8.344963e-09 +42 4.200000e-01 -8.44526e-09 8.441575e-09 +43 4.300000e-01 -8.54266e-09 8.538832e-09 +44 4.400000e-01 -8.64072e-09 8.636748e-09 +45 4.500000e-01 -8.73946e-09 8.735341e-09 +46 4.600000e-01 -8.83890e-09 8.834626e-09 +47 4.700000e-01 -8.93906e-09 8.934619e-09 +48 4.800000e-01 -9.03993e-09 9.035335e-09 +49 4.900000e-01 -9.14156e-09 9.136788e-09 +50 5.000000e-01 -9.24394e-09 9.238993e-09 +51 5.100000e-01 -9.34709e-09 9.341965e-09 +52 5.200000e-01 -9.45102e-09 9.445716e-09 +53 5.300000e-01 -9.55576e-09 9.550260e-09 +54 5.400000e-01 -9.66130e-09 9.655612e-09 +55 5.500000e-01 -9.76768e-09 9.761783e-09 +56 5.600000e-01 -9.87489e-09 9.868788e-09 +57 5.700000e-01 -9.98295e-09 9.976639e-09 +58 5.800000e-01 -1.00919e-08 1.008535e-08 +59 5.900000e-01 -1.02017e-08 1.019493e-08 +60 6.000000e-01 -1.03124e-08 1.030539e-08 +61 6.100000e-01 -1.04240e-08 1.041675e-08 +62 6.200000e-01 -1.05365e-08 1.052902e-08 +63 6.300000e-01 -1.06499e-08 1.064221e-08 +64 6.400000e-01 -1.07643e-08 1.075633e-08 +65 6.500000e-01 -1.08796e-08 1.087140e-08 +66 6.600000e-01 -1.09959e-08 1.098742e-08 +67 6.700000e-01 -1.11132e-08 1.110441e-08 +68 6.800000e-01 -1.12315e-08 1.122238e-08 +69 6.900000e-01 -1.13507e-08 1.134135e-08 +70 7.000000e-01 -1.14710e-08 1.146132e-08 +71 7.100000e-01 -1.15923e-08 1.158230e-08 +72 7.200000e-01 -1.17146e-08 1.170431e-08 +73 7.300000e-01 -1.18380e-08 1.182737e-08 +74 7.400000e-01 -1.19625e-08 1.195147e-08 +75 7.500000e-01 -1.20880e-08 1.207663e-08 +76 7.600000e-01 -1.22146e-08 1.220288e-08 +77 7.700000e-01 -1.23423e-08 1.233020e-08 +78 7.800000e-01 -1.24711e-08 1.245863e-08 +79 7.900000e-01 -1.26010e-08 1.258816e-08 +80 8.000000e-01 -1.27320e-08 1.271882e-08 +81 8.100000e-01 -1.28642e-08 1.285061e-08 +82 8.200000e-01 -1.29976e-08 1.298355e-08 +83 8.300000e-01 -1.31321e-08 1.311765e-08 +84 8.400000e-01 -1.32678e-08 1.325291e-08 +85 8.500000e-01 -1.34047e-08 1.338936e-08 +86 8.600000e-01 -1.35428e-08 1.352700e-08 +87 8.700000e-01 -1.36821e-08 1.366584e-08 +88 8.800000e-01 -1.38226e-08 1.380590e-08 +89 8.900000e-01 -1.39644e-08 1.394719e-08 +90 9.000000e-01 -1.41074e-08 1.408973e-08 +91 9.100000e-01 -1.42517e-08 1.423351e-08 +92 9.200000e-01 -1.43973e-08 1.437857e-08 +93 9.300000e-01 -1.45442e-08 1.452490e-08 +94 9.400000e-01 -1.46924e-08 1.467252e-08 +95 9.500000e-01 -1.48418e-08 1.482145e-08 +96 9.600000e-01 -1.49927e-08 1.497169e-08 +97 9.700000e-01 -1.51448e-08 1.512327e-08 +98 9.800000e-01 -1.52983e-08 1.527618e-08 +99 9.900000e-01 -1.54532e-08 1.543044e-08 +100 1.000000e+00 -1.56095e-08 1.558608e-08 +101 1.010000e+00 -1.57672e-08 1.574309e-08 +102 1.020000e+00 -1.59262e-08 1.590149e-08 +103 1.030000e+00 -1.60867e-08 1.606130e-08 +104 1.040000e+00 -1.62487e-08 1.622253e-08 +105 1.050000e+00 -1.64120e-08 1.638519e-08 +106 1.060000e+00 -1.65769e-08 1.654929e-08 +107 1.070000e+00 -1.67432e-08 1.671486e-08 +108 1.080000e+00 -1.69110e-08 1.688189e-08 +109 1.090000e+00 -1.70803e-08 1.705041e-08 +110 1.100000e+00 -1.72511e-08 1.722042e-08 +111 1.110000e+00 -1.74235e-08 1.739195e-08 +112 1.120000e+00 -1.75974e-08 1.756500e-08 +113 1.130000e+00 -1.77728e-08 1.773959e-08 +114 1.140000e+00 -1.79499e-08 1.791574e-08 +115 1.150000e+00 -1.81285e-08 1.809345e-08 +116 1.160000e+00 -1.83087e-08 1.827275e-08 +117 1.170000e+00 -1.84906e-08 1.845363e-08 +118 1.180000e+00 -1.86741e-08 1.863613e-08 +119 1.190000e+00 -1.88592e-08 1.882025e-08 +120 1.200000e+00 -1.90460e-08 1.900601e-08 +121 0.000000e+00 1.843013e-17 1.843013e-17 +122 1.000000e-02 -2.97240e-08 2.972392e-08 +123 2.000000e-02 -5.16099e-08 5.160965e-08 +124 3.000000e-02 -6.68313e-08 6.683099e-08 +125 4.000000e-02 -7.69513e-08 7.695085e-08 +126 5.000000e-02 -8.36144e-08 8.361386e-08 +127 6.000000e-02 -8.81649e-08 8.816430e-08 +128 7.000000e-02 -9.14956e-08 9.149496e-08 +129 8.000000e-02 -9.41281e-08 9.412736e-08 +130 9.000000e-02 -9.63512e-08 9.635037e-08 +131 1.000000e-01 -9.83245e-08 9.832366e-08 +132 1.100000e-01 -1.00139e-07 1.001377e-07 +133 1.200000e-01 -1.01847e-07 1.018458e-07 +134 1.300000e-01 -1.03482e-07 1.034805e-07 +135 1.400000e-01 -1.05064e-07 1.050628e-07 +136 1.500000e-01 -1.06608e-07 1.066064e-07 +137 1.600000e-01 -1.08122e-07 1.081209e-07 +138 1.700000e-01 -1.09614e-07 1.096131e-07 +139 1.800000e-01 -1.11089e-07 1.110880e-07 +140 1.900000e-01 -1.12551e-07 1.125494e-07 +141 2.000000e-01 -1.14002e-07 1.140003e-07 +142 2.100000e-01 -1.15445e-07 1.154429e-07 +143 2.200000e-01 -1.16881e-07 1.168793e-07 +144 2.300000e-01 -1.18313e-07 1.183109e-07 +145 2.400000e-01 -1.19741e-07 1.197391e-07 +146 2.500000e-01 -1.21167e-07 1.211651e-07 +147 2.600000e-01 -1.22592e-07 1.225898e-07 +148 2.700000e-01 -1.24016e-07 1.240141e-07 +149 2.800000e-01 -1.25441e-07 1.254388e-07 +150 2.900000e-01 -1.26867e-07 1.268645e-07 +151 3.000000e-01 -1.28294e-07 1.282919e-07 +152 3.100000e-01 -1.29724e-07 1.297215e-07 +153 3.200000e-01 -1.31156e-07 1.311539e-07 +154 3.300000e-01 -1.32592e-07 1.325895e-07 +155 3.400000e-01 -1.34032e-07 1.340288e-07 +156 3.500000e-01 -1.35475e-07 1.354722e-07 +157 3.600000e-01 -1.36923e-07 1.369200e-07 +158 3.700000e-01 -1.38376e-07 1.383727e-07 +159 3.800000e-01 -1.39834e-07 1.398305e-07 +160 3.900000e-01 -1.41297e-07 1.412938e-07 +161 4.000000e-01 -1.42766e-07 1.427629e-07 +162 4.100000e-01 -1.44242e-07 1.442380e-07 +163 4.200000e-01 -1.45723e-07 1.457195e-07 +164 4.300000e-01 -1.47211e-07 1.472075e-07 +165 4.400000e-01 -1.48706e-07 1.487024e-07 +166 4.500000e-01 -1.50208e-07 1.502043e-07 +167 4.600000e-01 -1.51718e-07 1.517136e-07 +168 4.700000e-01 -1.53235e-07 1.532304e-07 +169 4.800000e-01 -1.54759e-07 1.547549e-07 +170 4.900000e-01 -1.56292e-07 1.562873e-07 +171 5.000000e-01 -1.57833e-07 1.578278e-07 +172 5.100000e-01 -1.59382e-07 1.593767e-07 +173 5.200000e-01 -1.60939e-07 1.609341e-07 +174 5.300000e-01 -1.62506e-07 1.625002e-07 +175 5.400000e-01 -1.64081e-07 1.640751e-07 +176 5.500000e-01 -1.65665e-07 1.656590e-07 +177 5.600000e-01 -1.67258e-07 1.672522e-07 +178 5.700000e-01 -1.68861e-07 1.688547e-07 +179 5.800000e-01 -1.70473e-07 1.704667e-07 +180 5.900000e-01 -1.72095e-07 1.720884e-07 +181 6.000000e-01 -1.73727e-07 1.737198e-07 +182 6.100000e-01 -1.75369e-07 1.753613e-07 +183 6.200000e-01 -1.77020e-07 1.770129e-07 +184 6.300000e-01 -1.78682e-07 1.786747e-07 +185 6.400000e-01 -1.80355e-07 1.803469e-07 +186 6.500000e-01 -1.82038e-07 1.820297e-07 +187 6.600000e-01 -1.83732e-07 1.837232e-07 +188 6.700000e-01 -1.85436e-07 1.854274e-07 +189 6.800000e-01 -1.87152e-07 1.871426e-07 +190 6.900000e-01 -1.88878e-07 1.888689e-07 +191 7.000000e-01 -1.90616e-07 1.906063e-07 +192 7.100000e-01 -1.92365e-07 1.923551e-07 +193 7.200000e-01 -1.94126e-07 1.941154e-07 +194 7.300000e-01 -1.95898e-07 1.958873e-07 +195 7.400000e-01 -1.97682e-07 1.976708e-07 +196 7.500000e-01 -1.99478e-07 1.994662e-07 +197 7.600000e-01 -2.01285e-07 2.012736e-07 +198 7.700000e-01 -2.03105e-07 2.030930e-07 +199 7.800000e-01 -2.04937e-07 2.049246e-07 +200 7.900000e-01 -2.06782e-07 2.067686e-07 +201 8.000000e-01 -2.08638e-07 2.086250e-07 +202 8.100000e-01 -2.10508e-07 2.104939e-07 +203 8.200000e-01 -2.12390e-07 2.123755e-07 +204 8.300000e-01 -2.14285e-07 2.142699e-07 +205 8.400000e-01 -2.16192e-07 2.161773e-07 +206 8.500000e-01 -2.18113e-07 2.180976e-07 +207 8.600000e-01 -2.20047e-07 2.200311e-07 +208 8.700000e-01 -2.21994e-07 2.219779e-07 +209 8.800000e-01 -2.23955e-07 2.239380e-07 +210 8.900000e-01 -2.25929e-07 2.259117e-07 +211 9.000000e-01 -2.27917e-07 2.278989e-07 +212 9.100000e-01 -2.29919e-07 2.298999e-07 +213 9.200000e-01 -2.31934e-07 2.319147e-07 +214 9.300000e-01 -2.33963e-07 2.339434e-07 +215 9.400000e-01 -2.36007e-07 2.359862e-07 +216 9.500000e-01 -2.38064e-07 2.380432e-07 +217 9.600000e-01 -2.40136e-07 2.401145e-07 +218 9.700000e-01 -2.42223e-07 2.422002e-07 +219 9.800000e-01 -2.44324e-07 2.443004e-07 +220 9.900000e-01 -2.46439e-07 2.464152e-07 +221 1.000000e+00 -2.48570e-07 2.485448e-07 +222 1.010000e+00 -2.50715e-07 2.506893e-07 +223 1.020000e+00 -2.52875e-07 2.528487e-07 +224 1.030000e+00 -2.55051e-07 2.550232e-07 +225 1.040000e+00 -2.57241e-07 2.572130e-07 +226 1.050000e+00 -2.59447e-07 2.594180e-07 +227 1.060000e+00 -2.61669e-07 2.616385e-07 +228 1.070000e+00 -2.63906e-07 2.638746e-07 +229 1.080000e+00 -2.66159e-07 2.661263e-07 +230 1.090000e+00 -2.68427e-07 2.683937e-07 +231 1.100000e+00 -2.70712e-07 2.706771e-07 +232 1.110000e+00 -2.73013e-07 2.729765e-07 +233 1.120000e+00 -2.75329e-07 2.752920e-07 +234 1.130000e+00 -2.77663e-07 2.776238e-07 +235 1.140000e+00 -2.80012e-07 2.799719e-07 +236 1.150000e+00 -2.82378e-07 2.823365e-07 +237 1.160000e+00 -2.84761e-07 2.847176e-07 +238 1.170000e+00 -2.87161e-07 2.871155e-07 +239 1.180000e+00 -2.89577e-07 2.895302e-07 +240 1.190000e+00 -2.92011e-07 2.919619e-07 +241 1.200000e+00 -2.94462e-07 2.944106e-07 +242 0.000000e+00 7.865259e-17 7.865259e-17 +243 1.000000e-02 -2.68927e-07 2.689270e-07 +244 2.000000e-02 -4.85409e-07 4.854086e-07 +245 3.000000e-02 -6.53621e-07 6.536203e-07 +246 4.000000e-02 -7.79471e-07 7.794709e-07 +247 5.000000e-02 -8.70648e-07 8.706471e-07 +248 6.000000e-02 -9.35780e-07 9.357796e-07 +249 7.000000e-02 -9.82949e-07 9.829483e-07 +250 8.000000e-02 -1.01849e-06 1.018494e-06 +251 9.000000e-02 -1.04675e-06 1.046753e-06 +252 1.000000e-01 -1.07045e-06 1.070450e-06 +253 1.100000e-01 -1.09123e-06 1.091234e-06 +254 1.200000e-01 -1.11010e-06 1.110098e-06 +255 1.300000e-01 -1.12765e-06 1.127650e-06 +256 1.400000e-01 -1.14427e-06 1.144272e-06 +257 1.500000e-01 -1.16021e-06 1.160212e-06 +258 1.600000e-01 -1.17564e-06 1.175636e-06 +259 1.700000e-01 -1.19066e-06 1.190659e-06 +260 1.800000e-01 -1.20536e-06 1.205362e-06 +261 1.900000e-01 -1.21981e-06 1.219805e-06 +262 2.000000e-01 -1.23404e-06 1.234034e-06 +263 2.100000e-01 -1.24809e-06 1.248084e-06 +264 2.200000e-01 -1.26198e-06 1.261982e-06 +265 2.300000e-01 -1.27575e-06 1.275752e-06 +266 2.400000e-01 -1.28941e-06 1.289410e-06 +267 2.500000e-01 -1.30298e-06 1.302974e-06 +268 2.600000e-01 -1.31646e-06 1.316456e-06 +269 2.700000e-01 -1.32987e-06 1.329867e-06 +270 2.800000e-01 -1.34322e-06 1.343218e-06 +271 2.900000e-01 -1.35652e-06 1.356516e-06 +272 3.000000e-01 -1.36977e-06 1.369771e-06 +273 3.100000e-01 -1.38299e-06 1.382988e-06 +274 3.200000e-01 -1.39618e-06 1.396174e-06 +275 3.300000e-01 -1.40934e-06 1.409335e-06 +276 3.400000e-01 -1.42248e-06 1.422476e-06 +277 3.500000e-01 -1.43560e-06 1.435601e-06 +278 3.600000e-01 -1.44872e-06 1.448715e-06 +279 3.700000e-01 -1.46183e-06 1.461822e-06 +280 3.800000e-01 -1.47493e-06 1.474926e-06 +281 3.900000e-01 -1.48803e-06 1.488030e-06 +282 4.000000e-01 -1.50114e-06 1.501138e-06 +283 4.100000e-01 -1.51425e-06 1.514251e-06 +284 4.200000e-01 -1.52738e-06 1.527375e-06 +285 4.300000e-01 -1.54051e-06 1.540510e-06 +286 4.400000e-01 -1.55366e-06 1.553660e-06 +287 4.500000e-01 -1.56683e-06 1.566826e-06 +288 4.600000e-01 -1.58002e-06 1.580012e-06 +289 4.700000e-01 -1.59322e-06 1.593219e-06 +290 4.800000e-01 -1.60645e-06 1.606450e-06 +291 4.900000e-01 -1.61971e-06 1.619706e-06 +292 5.000000e-01 -1.63299e-06 1.632989e-06 +293 5.100000e-01 -1.64631e-06 1.646300e-06 +294 5.200000e-01 -1.65965e-06 1.659643e-06 +295 5.300000e-01 -1.67302e-06 1.673017e-06 +296 5.400000e-01 -1.68643e-06 1.686425e-06 +297 5.500000e-01 -1.69987e-06 1.699868e-06 +298 5.600000e-01 -1.71335e-06 1.713348e-06 +299 5.700000e-01 -1.72687e-06 1.726865e-06 +300 5.800000e-01 -1.74043e-06 1.740421e-06 +301 5.900000e-01 -1.75402e-06 1.754018e-06 +302 6.000000e-01 -1.76766e-06 1.767656e-06 +303 6.100000e-01 -1.78134e-06 1.781337e-06 +304 6.200000e-01 -1.79507e-06 1.795062e-06 +305 6.300000e-01 -1.80884e-06 1.808831e-06 +306 6.400000e-01 -1.82265e-06 1.822647e-06 +307 6.500000e-01 -1.83652e-06 1.836509e-06 +308 6.600000e-01 -1.85043e-06 1.850419e-06 +309 6.700000e-01 -1.86439e-06 1.864378e-06 +310 6.800000e-01 -1.87840e-06 1.878386e-06 +311 6.900000e-01 -1.89245e-06 1.892445e-06 +312 7.000000e-01 -1.90657e-06 1.906555e-06 +313 7.100000e-01 -1.92073e-06 1.920718e-06 +314 7.200000e-01 -1.93494e-06 1.934933e-06 +315 7.300000e-01 -1.94921e-06 1.949202e-06 +316 7.400000e-01 -1.96354e-06 1.963526e-06 +317 7.500000e-01 -1.97792e-06 1.977905e-06 +318 7.600000e-01 -1.99235e-06 1.992340e-06 +319 7.700000e-01 -2.00684e-06 2.006832e-06 +320 7.800000e-01 -2.02139e-06 2.021381e-06 +321 7.900000e-01 -2.03600e-06 2.035988e-06 +322 8.000000e-01 -2.05067e-06 2.050654e-06 +323 8.100000e-01 -2.06539e-06 2.065379e-06 +324 8.200000e-01 -2.08018e-06 2.080164e-06 +325 8.300000e-01 -2.09503e-06 2.095009e-06 +326 8.400000e-01 -2.10993e-06 2.109916e-06 +327 8.500000e-01 -2.12490e-06 2.124884e-06 +328 8.600000e-01 -2.13993e-06 2.139915e-06 +329 8.700000e-01 -2.15503e-06 2.155009e-06 +330 8.800000e-01 -2.17018e-06 2.170166e-06 +331 8.900000e-01 -2.18541e-06 2.185387e-06 +332 9.000000e-01 -2.20069e-06 2.200672e-06 +333 9.100000e-01 -2.21604e-06 2.216022e-06 +334 9.200000e-01 -2.23146e-06 2.231438e-06 +335 9.300000e-01 -2.24694e-06 2.246920e-06 +336 9.400000e-01 -2.26249e-06 2.262468e-06 +337 9.500000e-01 -2.27811e-06 2.278083e-06 +338 9.600000e-01 -2.29379e-06 2.293766e-06 +339 9.700000e-01 -2.30954e-06 2.309517e-06 +340 9.800000e-01 -2.32537e-06 2.325336e-06 +341 9.900000e-01 -2.34125e-06 2.341223e-06 +342 1.000000e+00 -2.35721e-06 2.357180e-06 +343 1.010000e+00 -2.37324e-06 2.373207e-06 +344 1.020000e+00 -2.38934e-06 2.389304e-06 +345 1.030000e+00 -2.40551e-06 2.405472e-06 +346 1.040000e+00 -2.42175e-06 2.421710e-06 +347 1.050000e+00 -2.43806e-06 2.438020e-06 +348 1.060000e+00 -2.45445e-06 2.454402e-06 +349 1.070000e+00 -2.47090e-06 2.470856e-06 +350 1.080000e+00 -2.48743e-06 2.487382e-06 +351 1.090000e+00 -2.50404e-06 2.503982e-06 +352 1.100000e+00 -2.52071e-06 2.520655e-06 +353 1.110000e+00 -2.53746e-06 2.537401e-06 +354 1.120000e+00 -2.55429e-06 2.554222e-06 +355 1.130000e+00 -2.57119e-06 2.571118e-06 +356 1.140000e+00 -2.58816e-06 2.588089e-06 +357 1.150000e+00 -2.60521e-06 2.605134e-06 +358 1.160000e+00 -2.62234e-06 2.622256e-06 +359 1.170000e+00 -2.63954e-06 2.639453e-06 +360 1.180000e+00 -2.65682e-06 2.656727e-06 +361 1.190000e+00 -2.67418e-06 2.674078e-06 +362 1.200000e+00 -2.69162e-06 2.691506e-06 +363 0.000000e+00 2.215570e-16 2.215570e-16 +364 1.000000e-02 -1.06854e-06 1.068538e-06 +365 2.000000e-02 -2.02050e-06 2.020497e-06 +366 3.000000e-02 -2.85948e-06 2.859483e-06 +367 4.000000e-02 -3.58967e-06 3.589667e-06 +368 5.000000e-02 -4.21608e-06 4.216075e-06 +369 6.000000e-02 -4.74496e-06 4.744964e-06 +370 7.000000e-02 -5.18421e-06 5.184210e-06 +371 8.000000e-02 -5.54357e-06 5.543566e-06 +372 9.000000e-02 -5.83453e-06 5.834527e-06 +373 1.000000e-01 -6.06961e-06 6.069608e-06 +374 1.100000e-01 -6.26115e-06 6.261149e-06 +375 1.200000e-01 -6.42013e-06 6.420127e-06 +376 1.300000e-01 -6.55542e-06 6.555424e-06 +377 1.400000e-01 -6.67372e-06 6.673719e-06 +378 1.500000e-01 -6.77979e-06 6.779788e-06 +379 1.600000e-01 -6.87696e-06 6.876955e-06 +380 1.700000e-01 -6.96751e-06 6.967506e-06 +381 1.800000e-01 -7.05302e-06 7.053022e-06 +382 1.900000e-01 -7.13461e-06 7.134607e-06 +383 2.000000e-01 -7.21305e-06 7.213048e-06 +384 2.100000e-01 -7.28892e-06 7.288914e-06 +385 2.200000e-01 -7.36263e-06 7.362628e-06 +386 2.300000e-01 -7.43451e-06 7.434510e-06 +387 2.400000e-01 -7.50481e-06 7.504808e-06 +388 2.500000e-01 -7.57372e-06 7.573720e-06 +389 2.600000e-01 -7.64140e-06 7.641402e-06 +390 2.700000e-01 -7.70799e-06 7.707985e-06 +391 2.800000e-01 -7.77358e-06 7.773577e-06 +392 2.900000e-01 -7.83827e-06 7.838271e-06 +393 3.000000e-01 -7.90215e-06 7.902145e-06 +394 3.100000e-01 -7.96527e-06 7.965268e-06 +395 3.200000e-01 -8.02770e-06 8.027699e-06 +396 3.300000e-01 -8.08949e-06 8.089492e-06 +397 3.400000e-01 -8.15070e-06 8.150695e-06 +398 3.500000e-01 -8.21135e-06 8.211349e-06 +399 3.600000e-01 -8.27150e-06 8.271494e-06 +400 3.700000e-01 -8.33117e-06 8.331164e-06 +401 3.800000e-01 -8.39039e-06 8.390392e-06 +402 3.900000e-01 -8.44921e-06 8.449206e-06 +403 4.000000e-01 -8.50764e-06 8.507635e-06 +404 4.100000e-01 -8.56571e-06 8.565703e-06 +405 4.200000e-01 -8.62344e-06 8.623433e-06 +406 4.300000e-01 -8.68085e-06 8.680847e-06 +407 4.400000e-01 -8.73797e-06 8.737965e-06 +408 4.500000e-01 -8.79481e-06 8.794805e-06 +409 4.600000e-01 -8.85139e-06 8.851385e-06 +410 4.700000e-01 -8.90773e-06 8.907722e-06 +411 4.800000e-01 -8.96384e-06 8.963831e-06 +412 4.900000e-01 -9.01973e-06 9.019726e-06 +413 5.000000e-01 -9.07543e-06 9.075422e-06 +414 5.100000e-01 -9.13094e-06 9.130930e-06 +415 5.200000e-01 -9.18627e-06 9.186264e-06 +416 5.300000e-01 -9.24144e-06 9.241435e-06 +417 5.400000e-01 -9.29646e-06 9.296453e-06 +418 5.500000e-01 -9.35134e-06 9.351329e-06 +419 5.600000e-01 -9.40608e-06 9.406073e-06 +420 5.700000e-01 -9.46070e-06 9.460694e-06 +421 5.800000e-01 -9.51521e-06 9.515200e-06 +422 5.900000e-01 -9.56961e-06 9.569601e-06 +423 6.000000e-01 -9.62391e-06 9.623904e-06 +424 6.100000e-01 -9.67812e-06 9.678117e-06 +425 6.200000e-01 -9.73225e-06 9.732246e-06 +426 6.300000e-01 -9.78631e-06 9.786300e-06 +427 6.400000e-01 -9.84029e-06 9.840283e-06 +428 6.500000e-01 -9.89421e-06 9.894204e-06 +429 6.600000e-01 -9.94808e-06 9.948067e-06 +430 6.700000e-01 -1.00019e-05 1.000188e-05 +431 6.800000e-01 -1.00557e-05 1.005564e-05 +432 6.900000e-01 -1.01094e-05 1.010937e-05 +433 7.000000e-01 -1.01631e-05 1.016306e-05 +434 7.100000e-01 -1.02167e-05 1.021672e-05 +435 7.200000e-01 -1.02704e-05 1.027035e-05 +436 7.300000e-01 -1.03240e-05 1.032396e-05 +437 7.400000e-01 -1.03776e-05 1.037755e-05 +438 7.500000e-01 -1.04311e-05 1.043113e-05 +439 7.600000e-01 -1.04847e-05 1.048470e-05 +440 7.700000e-01 -1.05383e-05 1.053826e-05 +441 7.800000e-01 -1.05918e-05 1.059182e-05 +442 7.900000e-01 -1.06454e-05 1.064538e-05 +443 8.000000e-01 -1.06990e-05 1.069895e-05 +444 8.100000e-01 -1.07525e-05 1.075252e-05 +445 8.200000e-01 -1.08061e-05 1.080611e-05 +446 8.300000e-01 -1.08597e-05 1.085971e-05 +447 8.400000e-01 -1.09133e-05 1.091332e-05 +448 8.500000e-01 -1.09670e-05 1.096696e-05 +449 8.600000e-01 -1.10206e-05 1.102061e-05 +450 8.700000e-01 -1.10743e-05 1.107429e-05 +451 8.800000e-01 -1.11280e-05 1.112800e-05 +452 8.900000e-01 -1.11818e-05 1.118174e-05 +453 9.000000e-01 -1.12355e-05 1.123551e-05 +454 9.100000e-01 -1.12893e-05 1.128931e-05 +455 9.200000e-01 -1.13432e-05 1.134315e-05 +456 9.300000e-01 -1.13971e-05 1.139703e-05 +457 9.400000e-01 -1.14510e-05 1.145095e-05 +458 9.500000e-01 -1.15049e-05 1.150491e-05 +459 9.600000e-01 -1.15590e-05 1.155891e-05 +460 9.700000e-01 -1.16130e-05 1.161296e-05 +461 9.800000e-01 -1.16671e-05 1.166706e-05 +462 9.900000e-01 -1.17213e-05 1.172120e-05 +463 1.000000e+00 -1.17755e-05 1.177540e-05 +464 1.010000e+00 -1.18297e-05 1.182965e-05 +465 1.020000e+00 -1.18840e-05 1.188396e-05 +466 1.030000e+00 -1.19384e-05 1.193831e-05 +467 1.040000e+00 -1.19928e-05 1.199273e-05 +468 1.050000e+00 -1.20473e-05 1.204721e-05 +469 1.060000e+00 -1.21018e-05 1.210174e-05 +470 1.070000e+00 -1.21564e-05 1.215634e-05 +471 1.080000e+00 -1.22111e-05 1.221099e-05 +472 1.090000e+00 -1.22658e-05 1.226571e-05 +473 1.100000e+00 -1.23206e-05 1.232050e-05 +474 1.110000e+00 -1.23755e-05 1.237535e-05 +475 1.120000e+00 -1.24304e-05 1.243027e-05 +476 1.130000e+00 -1.24854e-05 1.248526e-05 +477 1.140000e+00 -1.25405e-05 1.254031e-05 +478 1.150000e+00 -1.25956e-05 1.259544e-05 +479 1.160000e+00 -1.26508e-05 1.265063e-05 +480 1.170000e+00 -1.27061e-05 1.270590e-05 +481 1.180000e+00 -1.27615e-05 1.276124e-05 +482 1.190000e+00 -1.28169e-05 1.281666e-05 +483 1.200000e+00 -1.28724e-05 1.287215e-05 +484 0.000000e+00 5.380166e-16 5.380166e-16 +485 1.000000e-02 -2.26948e-06 2.269477e-06 +486 2.000000e-02 -4.38309e-06 4.383091e-06 +487 3.000000e-02 -6.34429e-06 6.344285e-06 +488 4.000000e-02 -8.15655e-06 8.156547e-06 +489 5.000000e-02 -9.82345e-06 9.823453e-06 +490 6.000000e-02 -1.13487e-05 1.134874e-05 +491 7.000000e-02 -1.27364e-05 1.273638e-05 +492 8.000000e-02 -1.39907e-05 1.399071e-05 +493 9.000000e-02 -1.51166e-05 1.511660e-05 +494 1.000000e-01 -1.61196e-05 1.611963e-05 +495 1.100000e-01 -1.70063e-05 1.700631e-05 +496 1.200000e-01 -1.77843e-05 1.778431e-05 +497 1.300000e-01 -1.84626e-05 1.846262e-05 +498 1.400000e-01 -1.90515e-05 1.905149e-05 +499 1.500000e-01 -1.95622e-05 1.956218e-05 +500 1.600000e-01 -2.00064e-05 2.000642e-05 +501 1.700000e-01 -2.03956e-05 2.039564e-05 +502 1.800000e-01 -2.07403e-05 2.074033e-05 +503 1.900000e-01 -2.10496e-05 2.104956e-05 +504 2.000000e-01 -2.13307e-05 2.133075e-05 +505 2.100000e-01 -2.15898e-05 2.158975e-05 +506 2.200000e-01 -2.18311e-05 2.183110e-05 +507 2.300000e-01 -2.20582e-05 2.205821e-05 +508 2.400000e-01 -2.22737e-05 2.227368e-05 +509 2.500000e-01 -2.24795e-05 2.247945e-05 +510 2.600000e-01 -2.26770e-05 2.267703e-05 +511 2.700000e-01 -2.28676e-05 2.286758e-05 +512 2.800000e-01 -2.30520e-05 2.305199e-05 +513 2.900000e-01 -2.32310e-05 2.323099e-05 +514 3.000000e-01 -2.34052e-05 2.340517e-05 +515 3.100000e-01 -2.35750e-05 2.357500e-05 +516 3.200000e-01 -2.37409e-05 2.374089e-05 +517 3.300000e-01 -2.39032e-05 2.390317e-05 +518 3.400000e-01 -2.40621e-05 2.406213e-05 +519 3.500000e-01 -2.42180e-05 2.421802e-05 +520 3.600000e-01 -2.43711e-05 2.437106e-05 +521 3.700000e-01 -2.45215e-05 2.452145e-05 +522 3.800000e-01 -2.46694e-05 2.466936e-05 +523 3.900000e-01 -2.48149e-05 2.481494e-05 +524 4.000000e-01 -2.49583e-05 2.495834e-05 +525 4.100000e-01 -2.50997e-05 2.509968e-05 +526 4.200000e-01 -2.52391e-05 2.523907e-05 +527 4.300000e-01 -2.53766e-05 2.537663e-05 +528 4.400000e-01 -2.55125e-05 2.551245e-05 +529 4.500000e-01 -2.56466e-05 2.564663e-05 +530 4.600000e-01 -2.57792e-05 2.577924e-05 +531 4.700000e-01 -2.59104e-05 2.591037e-05 +532 4.800000e-01 -2.60401e-05 2.604009e-05 +533 4.900000e-01 -2.61685e-05 2.616846e-05 +534 5.000000e-01 -2.62956e-05 2.629555e-05 +535 5.100000e-01 -2.64214e-05 2.642142e-05 +536 5.200000e-01 -2.65461e-05 2.654612e-05 +537 5.300000e-01 -2.66697e-05 2.666971e-05 +538 5.400000e-01 -2.67922e-05 2.679224e-05 +539 5.500000e-01 -2.69138e-05 2.691375e-05 +540 5.600000e-01 -2.70343e-05 2.703428e-05 +541 5.700000e-01 -2.71539e-05 2.715389e-05 +542 5.800000e-01 -2.72726e-05 2.727260e-05 +543 5.900000e-01 -2.73905e-05 2.739046e-05 +544 6.000000e-01 -2.75075e-05 2.750750e-05 +545 6.100000e-01 -2.76238e-05 2.762375e-05 +546 6.200000e-01 -2.77393e-05 2.773925e-05 +547 6.300000e-01 -2.78540e-05 2.785403e-05 +548 6.400000e-01 -2.79681e-05 2.796811e-05 +549 6.500000e-01 -2.80815e-05 2.808153e-05 +550 6.600000e-01 -2.81943e-05 2.819430e-05 +551 6.700000e-01 -2.83065e-05 2.830646e-05 +552 6.800000e-01 -2.84180e-05 2.841803e-05 +553 6.900000e-01 -2.85290e-05 2.852902e-05 +554 7.000000e-01 -2.86395e-05 2.863947e-05 +555 7.100000e-01 -2.87494e-05 2.874939e-05 +556 7.200000e-01 -2.88588e-05 2.885880e-05 +557 7.300000e-01 -2.89677e-05 2.896773e-05 +558 7.400000e-01 -2.90762e-05 2.907619e-05 +559 7.500000e-01 -2.91842e-05 2.918419e-05 +560 7.600000e-01 -2.92918e-05 2.929175e-05 +561 7.700000e-01 -2.93989e-05 2.939890e-05 +562 7.800000e-01 -2.95057e-05 2.950564e-05 +563 7.900000e-01 -2.96120e-05 2.961199e-05 +564 8.000000e-01 -2.97180e-05 2.971797e-05 +565 8.100000e-01 -2.98236e-05 2.982358e-05 +566 8.200000e-01 -2.99289e-05 2.992885e-05 +567 8.300000e-01 -3.00338e-05 3.003378e-05 +568 8.400000e-01 -3.01384e-05 3.013838e-05 +569 8.500000e-01 -3.02427e-05 3.024267e-05 +570 8.600000e-01 -3.03467e-05 3.034666e-05 +571 8.700000e-01 -3.04504e-05 3.045035e-05 +572 8.800000e-01 -3.05538e-05 3.055377e-05 +573 8.900000e-01 -3.06569e-05 3.065692e-05 +574 9.000000e-01 -3.07598e-05 3.075980e-05 +575 9.100000e-01 -3.08625e-05 3.086243e-05 +576 9.200000e-01 -3.09649e-05 3.096482e-05 +577 9.300000e-01 -3.10670e-05 3.106698e-05 +578 9.400000e-01 -3.11690e-05 3.116891e-05 +579 9.500000e-01 -3.12707e-05 3.127062e-05 +580 9.600000e-01 -3.13722e-05 3.137212e-05 +581 9.700000e-01 -3.14735e-05 3.147342e-05 +582 9.800000e-01 -3.15746e-05 3.157452e-05 +583 9.900000e-01 -3.16755e-05 3.167543e-05 +584 1.000000e+00 -3.17762e-05 3.177617e-05 +585 1.010000e+00 -3.18768e-05 3.187672e-05 +586 1.020000e+00 -3.19772e-05 3.197711e-05 +587 1.030000e+00 -3.20774e-05 3.207734e-05 +588 1.040000e+00 -3.21775e-05 3.217741e-05 +589 1.050000e+00 -3.22774e-05 3.227733e-05 +590 1.060000e+00 -3.23772e-05 3.237710e-05 +591 1.070000e+00 -3.24769e-05 3.247673e-05 +592 1.080000e+00 -3.25764e-05 3.257623e-05 +593 1.090000e+00 -3.26758e-05 3.267560e-05 +594 1.100000e+00 -3.27750e-05 3.277484e-05 +595 1.110000e+00 -3.28742e-05 3.287396e-05 +596 1.120000e+00 -3.29732e-05 3.297297e-05 +597 1.130000e+00 -3.30721e-05 3.307187e-05 +598 1.140000e+00 -3.31709e-05 3.317066e-05 +599 1.150000e+00 -3.32696e-05 3.326934e-05 +600 1.160000e+00 -3.33682e-05 3.336793e-05 +601 1.170000e+00 -3.34668e-05 3.346642e-05 +602 1.180000e+00 -3.35652e-05 3.356483e-05 +603 1.190000e+00 -3.36636e-05 3.366314e-05 +604 1.200000e+00 -3.37618e-05 3.376138e-05 +605 0.000000e+00 1.193720e-15 1.193720e-15 +606 1.000000e-02 -3.51153e-06 3.511532e-06 +607 2.000000e-02 -6.84480e-06 6.844800e-06 +608 3.000000e-02 -1.00033e-05 1.000334e-05 +609 4.000000e-02 -1.29907e-05 1.299065e-05 +610 5.000000e-02 -1.58102e-05 1.581018e-05 +611 6.000000e-02 -1.84654e-05 1.846536e-05 +612 7.000000e-02 -2.09596e-05 2.095961e-05 +613 8.000000e-02 -2.32964e-05 2.329638e-05 +614 9.000000e-02 -2.54792e-05 2.547917e-05 +615 1.000000e-01 -2.75116e-05 2.751159e-05 +616 1.100000e-01 -2.93974e-05 2.939738e-05 +617 1.200000e-01 -3.11405e-05 3.114051e-05 +618 1.300000e-01 -3.27453e-05 3.274526e-05 +619 1.400000e-01 -3.42163e-05 3.421631e-05 +620 1.500000e-01 -3.55589e-05 3.555890e-05 +621 1.600000e-01 -3.67790e-05 3.677897e-05 +622 1.700000e-01 -3.78832e-05 3.788324e-05 +623 1.800000e-01 -3.88794e-05 3.887938e-05 +624 1.900000e-01 -3.97760e-05 3.977598e-05 +625 2.000000e-01 -4.05824e-05 4.058245e-05 +626 2.100000e-01 -4.13088e-05 4.130876e-05 +627 2.200000e-01 -4.19651e-05 4.196508e-05 +628 2.300000e-01 -4.25613e-05 4.256126e-05 +629 2.400000e-01 -4.31065e-05 4.310647e-05 +630 2.500000e-01 -4.36089e-05 4.360888e-05 +631 2.600000e-01 -4.40755e-05 4.407548e-05 +632 2.700000e-01 -4.45121e-05 4.451209e-05 +633 2.800000e-01 -4.49235e-05 4.492346e-05 +634 2.900000e-01 -4.53134e-05 4.531343e-05 +635 3.000000e-01 -4.56850e-05 4.568504e-05 +636 3.100000e-01 -4.60408e-05 4.604077e-05 +637 3.200000e-01 -4.63826e-05 4.638257e-05 +638 3.300000e-01 -4.67120e-05 4.671204e-05 +639 3.400000e-01 -4.70305e-05 4.703050e-05 +640 3.500000e-01 -4.73390e-05 4.733902e-05 +641 3.600000e-01 -4.76385e-05 4.763851e-05 +642 3.700000e-01 -4.79297e-05 4.792974e-05 +643 3.800000e-01 -4.82134e-05 4.821337e-05 +644 3.900000e-01 -4.84900e-05 4.848996e-05 +645 4.000000e-01 -4.87600e-05 4.876002e-05 +646 4.100000e-01 -4.90240e-05 4.902399e-05 +647 4.200000e-01 -4.92823e-05 4.928226e-05 +648 4.300000e-01 -4.95352e-05 4.953517e-05 +649 4.400000e-01 -4.97831e-05 4.978306e-05 +650 4.500000e-01 -5.00262e-05 5.002619e-05 +651 4.600000e-01 -5.02649e-05 5.026485e-05 +652 4.700000e-01 -5.04993e-05 5.049926e-05 +653 4.800000e-01 -5.07297e-05 5.072965e-05 +654 4.900000e-01 -5.09562e-05 5.095622e-05 +655 5.000000e-01 -5.11792e-05 5.117916e-05 +656 5.100000e-01 -5.13986e-05 5.139864e-05 +657 5.200000e-01 -5.16148e-05 5.161484e-05 +658 5.300000e-01 -5.18279e-05 5.182789e-05 +659 5.400000e-01 -5.20380e-05 5.203795e-05 +660 5.500000e-01 -5.22452e-05 5.224515e-05 +661 5.600000e-01 -5.24496e-05 5.244961e-05 +662 5.700000e-01 -5.26515e-05 5.265145e-05 +663 5.800000e-01 -5.28508e-05 5.285078e-05 +664 5.900000e-01 -5.30477e-05 5.304771e-05 +665 6.000000e-01 -5.32423e-05 5.324233e-05 +666 6.100000e-01 -5.34347e-05 5.343473e-05 +667 6.200000e-01 -5.36250e-05 5.362502e-05 +668 6.300000e-01 -5.38133e-05 5.381326e-05 +669 6.400000e-01 -5.39996e-05 5.399954e-05 +670 6.500000e-01 -5.41839e-05 5.418394e-05 +671 6.600000e-01 -5.43665e-05 5.436652e-05 +672 6.700000e-01 -5.45474e-05 5.454735e-05 +673 6.800000e-01 -5.47265e-05 5.472650e-05 +674 6.900000e-01 -5.49040e-05 5.490403e-05 +675 7.000000e-01 -5.50800e-05 5.508000e-05 +676 7.100000e-01 -5.52545e-05 5.525445e-05 +677 7.200000e-01 -5.54275e-05 5.542746e-05 +678 7.300000e-01 -5.55991e-05 5.559906e-05 +679 7.400000e-01 -5.57693e-05 5.576931e-05 +680 7.500000e-01 -5.59383e-05 5.593825e-05 +681 7.600000e-01 -5.61059e-05 5.610592e-05 +682 7.700000e-01 -5.62724e-05 5.627237e-05 +683 7.800000e-01 -5.64377e-05 5.643765e-05 +684 7.900000e-01 -5.66018e-05 5.660178e-05 +685 8.000000e-01 -5.67648e-05 5.676480e-05 +686 8.100000e-01 -5.69268e-05 5.692676e-05 +687 8.200000e-01 -5.70877e-05 5.708768e-05 +688 8.300000e-01 -5.72476e-05 5.724760e-05 +689 8.400000e-01 -5.74066e-05 5.740654e-05 +690 8.500000e-01 -5.75646e-05 5.756455e-05 +691 8.600000e-01 -5.77217e-05 5.772165e-05 +692 8.700000e-01 -5.78779e-05 5.787786e-05 +693 8.800000e-01 -5.80333e-05 5.803322e-05 +694 8.900000e-01 -5.81878e-05 5.818775e-05 +695 9.000000e-01 -5.83415e-05 5.834147e-05 +696 9.100000e-01 -5.84945e-05 5.849441e-05 +697 9.200000e-01 -5.86466e-05 5.864660e-05 +698 9.300000e-01 -5.87981e-05 5.879804e-05 +699 9.400000e-01 -5.89488e-05 5.894878e-05 +700 9.500000e-01 -5.90989e-05 5.909881e-05 +701 9.600000e-01 -5.92482e-05 5.924818e-05 +702 9.700000e-01 -5.93970e-05 5.939689e-05 +703 9.800000e-01 -5.95450e-05 5.954497e-05 +704 9.900000e-01 -5.96925e-05 5.969242e-05 +705 1.000000e+00 -5.98394e-05 5.983928e-05 +706 1.010000e+00 -5.99856e-05 5.998555e-05 +707 1.020000e+00 -6.01314e-05 6.013126e-05 +708 1.030000e+00 -6.02765e-05 6.027641e-05 +709 1.040000e+00 -6.04212e-05 6.042103e-05 +710 1.050000e+00 -6.05653e-05 6.056512e-05 +711 1.060000e+00 -6.07089e-05 6.070871e-05 +712 1.070000e+00 -6.08520e-05 6.085180e-05 +713 1.080000e+00 -6.09946e-05 6.099441e-05 +714 1.090000e+00 -6.11368e-05 6.113655e-05 +715 1.100000e+00 -6.12785e-05 6.127824e-05 +716 1.110000e+00 -6.14197e-05 6.141948e-05 +717 1.120000e+00 -6.15606e-05 6.156029e-05 +718 1.130000e+00 -6.17010e-05 6.170068e-05 +719 1.140000e+00 -6.18410e-05 6.184066e-05 +720 1.150000e+00 -6.19806e-05 6.198025e-05 +721 1.160000e+00 -6.21198e-05 6.211944e-05 +722 1.170000e+00 -6.22587e-05 6.225825e-05 +723 1.180000e+00 -6.23972e-05 6.239669e-05 +724 1.190000e+00 -6.25353e-05 6.253478e-05 +725 1.200000e+00 -6.26731e-05 6.267251e-05 +726 0.000000e+00 2.481328e-15 2.481328e-15 +727 1.000000e-02 -4.67188e-06 4.671876e-06 +728 2.000000e-02 -9.15181e-06 9.151814e-06 +729 3.000000e-02 -1.34434e-05 1.344340e-05 +730 4.000000e-02 -1.75501e-05 1.755013e-05 +731 5.000000e-02 -2.14755e-05 2.147547e-05 +732 6.000000e-02 -2.52228e-05 2.522280e-05 +733 7.000000e-02 -2.87954e-05 2.879544e-05 +734 8.000000e-02 -3.21967e-05 3.219670e-05 +735 9.000000e-02 -3.54298e-05 3.542982e-05 +736 1.000000e-01 -3.84980e-05 3.849803e-05 +737 1.100000e-01 -4.14046e-05 4.140458e-05 +738 1.200000e-01 -4.41527e-05 4.415269e-05 +739 1.300000e-01 -4.67456e-05 4.674564e-05 +740 1.400000e-01 -4.91868e-05 4.918678e-05 +741 1.500000e-01 -5.14795e-05 5.147954e-05 +742 1.600000e-01 -5.36275e-05 5.362750e-05 +743 1.700000e-01 -5.56345e-05 5.563447e-05 +744 1.800000e-01 -5.75045e-05 5.750451e-05 +745 1.900000e-01 -5.92420e-05 5.924202e-05 +746 2.000000e-01 -6.08519e-05 6.085188e-05 +747 2.100000e-01 -6.23395e-05 6.233948e-05 +748 2.200000e-01 -6.37109e-05 6.371085e-05 +749 2.300000e-01 -6.49727e-05 6.497271e-05 +750 2.400000e-01 -6.61325e-05 6.613247e-05 +751 2.500000e-01 -6.71982e-05 6.719815e-05 +752 2.600000e-01 -6.81783e-05 6.817827e-05 +753 2.700000e-01 -6.90816e-05 6.908157e-05 +754 2.800000e-01 -6.99167e-05 6.991669e-05 +755 2.900000e-01 -7.06920e-05 7.069196e-05 +756 3.000000e-01 -7.14150e-05 7.141504e-05 +757 3.100000e-01 -7.20928e-05 7.209282e-05 +758 3.200000e-01 -7.27313e-05 7.273129e-05 +759 3.300000e-01 -7.33356e-05 7.333559e-05 +760 3.400000e-01 -7.39101e-05 7.391005e-05 +761 3.500000e-01 -7.44583e-05 7.445828e-05 +762 3.600000e-01 -7.49833e-05 7.498330e-05 +763 3.700000e-01 -7.54876e-05 7.548761e-05 +764 3.800000e-01 -7.59733e-05 7.597330e-05 +765 3.900000e-01 -7.64421e-05 7.644214e-05 +766 4.000000e-01 -7.68956e-05 7.689562e-05 +767 4.100000e-01 -7.73350e-05 7.733502e-05 +768 4.200000e-01 -7.77614e-05 7.776144e-05 +769 4.300000e-01 -7.81759e-05 7.817585e-05 +770 4.400000e-01 -7.85791e-05 7.857907e-05 +771 4.500000e-01 -7.89719e-05 7.897187e-05 +772 4.600000e-01 -7.93549e-05 7.935490e-05 +773 4.700000e-01 -7.97288e-05 7.972877e-05 +774 4.800000e-01 -8.00940e-05 8.009400e-05 +775 4.900000e-01 -8.04511e-05 8.045109e-05 +776 5.000000e-01 -8.08005e-05 8.080049e-05 +777 5.100000e-01 -8.11426e-05 8.114260e-05 +778 5.200000e-01 -8.14778e-05 8.147781e-05 +779 5.300000e-01 -8.18065e-05 8.180645e-05 +780 5.400000e-01 -8.21289e-05 8.212885e-05 +781 5.500000e-01 -8.24453e-05 8.244531e-05 +782 5.600000e-01 -8.27561e-05 8.275611e-05 +783 5.700000e-01 -8.30615e-05 8.306151e-05 +784 5.800000e-01 -8.33618e-05 8.336175e-05 +785 5.900000e-01 -8.36571e-05 8.365705e-05 +786 6.000000e-01 -8.39476e-05 8.394764e-05 +787 6.100000e-01 -8.42337e-05 8.423371e-05 +788 6.200000e-01 -8.45155e-05 8.451545e-05 +789 6.300000e-01 -8.47930e-05 8.479304e-05 +790 6.400000e-01 -8.50667e-05 8.506665e-05 +791 6.500000e-01 -8.53364e-05 8.533643e-05 +792 6.600000e-01 -8.56026e-05 8.560254e-05 +793 6.700000e-01 -8.58651e-05 8.586513e-05 +794 6.800000e-01 -8.61243e-05 8.612431e-05 +795 6.900000e-01 -8.63802e-05 8.638023e-05 +796 7.000000e-01 -8.66330e-05 8.663301e-05 +797 7.100000e-01 -8.68828e-05 8.688275e-05 +798 7.200000e-01 -8.71296e-05 8.712957e-05 +799 7.300000e-01 -8.73736e-05 8.737358e-05 +800 7.400000e-01 -8.76149e-05 8.761487e-05 +801 7.500000e-01 -8.78536e-05 8.785354e-05 +802 7.600000e-01 -8.80897e-05 8.808968e-05 +803 7.700000e-01 -8.83234e-05 8.832338e-05 +804 7.800000e-01 -8.85547e-05 8.855471e-05 +805 7.900000e-01 -8.87838e-05 8.878377e-05 +806 8.000000e-01 -8.90106e-05 8.901061e-05 +807 8.100000e-01 -8.92353e-05 8.923533e-05 +808 8.200000e-01 -8.94580e-05 8.945797e-05 +809 8.300000e-01 -8.96786e-05 8.967862e-05 +810 8.400000e-01 -8.98974e-05 8.989733e-05 +811 8.500000e-01 -9.01142e-05 9.011417e-05 +812 8.600000e-01 -9.03292e-05 9.032919e-05 +813 8.700000e-01 -9.05425e-05 9.054245e-05 +814 8.800000e-01 -9.07540e-05 9.075400e-05 +815 8.900000e-01 -9.09639e-05 9.096390e-05 +816 9.000000e-01 -9.11722e-05 9.117219e-05 +817 9.100000e-01 -9.13790e-05 9.137893e-05 +818 9.200000e-01 -9.15842e-05 9.158415e-05 +819 9.300000e-01 -9.17880e-05 9.178790e-05 +820 9.400000e-01 -9.19903e-05 9.199023e-05 +821 9.500000e-01 -9.21912e-05 9.219117e-05 +822 9.600000e-01 -9.23908e-05 9.239077e-05 +823 9.700000e-01 -9.25891e-05 9.258906e-05 +824 9.800000e-01 -9.27862e-05 9.278608e-05 +825 9.900000e-01 -9.29819e-05 9.298186e-05 +826 1.000000e+00 -9.31765e-05 9.317644e-05 +827 1.010000e+00 -9.33700e-05 9.336985e-05 +828 1.020000e+00 -9.35622e-05 9.356212e-05 +829 1.030000e+00 -9.37534e-05 9.375329e-05 +830 1.040000e+00 -9.39435e-05 9.394338e-05 +831 1.050000e+00 -9.41326e-05 9.413242e-05 +832 1.060000e+00 -9.43206e-05 9.432044e-05 +833 1.070000e+00 -9.45076e-05 9.450746e-05 +834 1.080000e+00 -9.46937e-05 9.469351e-05 +835 1.090000e+00 -9.48788e-05 9.487862e-05 +836 1.100000e+00 -9.50631e-05 9.506281e-05 +837 1.110000e+00 -9.52464e-05 9.524611e-05 +838 1.120000e+00 -9.54288e-05 9.542852e-05 +839 1.130000e+00 -9.56104e-05 9.561009e-05 +840 1.140000e+00 -9.57912e-05 9.579082e-05 +841 1.150000e+00 -9.59712e-05 9.597074e-05 +842 1.160000e+00 -9.61503e-05 9.614987e-05 +843 1.170000e+00 -9.63287e-05 9.632823e-05 +844 1.180000e+00 -9.65064e-05 9.650584e-05 +845 1.190000e+00 -9.66833e-05 9.668271e-05 +846 1.200000e+00 -9.68595e-05 9.685886e-05 +847 0.000000e+00 4.920616e-15 4.920616e-15 +848 1.000000e-02 -5.72748e-06 5.727477e-06 +849 2.000000e-02 -1.12547e-05 1.125468e-05 +850 3.000000e-02 -1.65852e-05 1.658518e-05 +851 4.000000e-02 -2.17224e-05 2.172242e-05 +852 5.000000e-02 -2.66698e-05 2.666983e-05 +853 6.000000e-02 -3.14307e-05 3.143074e-05 +854 7.000000e-02 -3.60084e-05 3.600842e-05 +855 8.000000e-02 -4.04061e-05 4.040608e-05 +856 9.000000e-02 -4.46269e-05 4.462687e-05 +857 1.000000e-01 -4.86739e-05 4.867392e-05 +858 1.100000e-01 -5.25503e-05 5.255028e-05 +859 1.200000e-01 -5.62590e-05 5.625897e-05 +860 1.300000e-01 -5.98030e-05 5.980301e-05 +861 1.400000e-01 -6.31854e-05 6.318537e-05 +862 1.500000e-01 -6.64090e-05 6.640903e-05 +863 1.600000e-01 -6.94770e-05 6.947698e-05 +864 1.700000e-01 -7.23922e-05 7.239222e-05 +865 1.800000e-01 -7.51578e-05 7.515781e-05 +866 1.900000e-01 -7.77769e-05 7.777689e-05 +867 2.000000e-01 -8.02527e-05 8.025269e-05 +868 2.100000e-01 -8.25886e-05 8.258860e-05 +869 2.200000e-01 -8.47882e-05 8.478821e-05 +870 2.300000e-01 -8.68554e-05 8.685535e-05 +871 2.400000e-01 -8.87942e-05 8.879416e-05 +872 2.500000e-01 -9.06092e-05 9.060918e-05 +873 2.600000e-01 -9.23054e-05 9.230538e-05 +874 2.700000e-01 -9.38882e-05 9.388824e-05 +875 2.800000e-01 -9.53638e-05 9.536378e-05 +876 2.900000e-01 -9.67385e-05 9.673853e-05 +877 3.000000e-01 -9.80195e-05 9.801952e-05 +878 3.100000e-01 -9.92141e-05 9.921410e-05 +879 3.200000e-01 -1.00330e-04 1.003298e-04 +880 3.300000e-01 -1.01374e-04 1.013742e-04 +881 3.400000e-01 -1.02355e-04 1.023545e-04 +882 3.500000e-01 -1.03278e-04 1.032776e-04 +883 3.600000e-01 -1.04150e-04 1.041498e-04 +884 3.700000e-01 -1.04977e-04 1.049768e-04 +885 3.800000e-01 -1.05763e-04 1.057634e-04 +886 3.900000e-01 -1.06514e-04 1.065140e-04 +887 4.000000e-01 -1.07232e-04 1.072323e-04 +888 4.100000e-01 -1.07921e-04 1.079214e-04 +889 4.200000e-01 -1.08584e-04 1.085843e-04 +890 4.300000e-01 -1.09223e-04 1.092231e-04 +891 4.400000e-01 -1.09840e-04 1.098399e-04 +892 4.500000e-01 -1.10436e-04 1.104364e-04 +893 4.600000e-01 -1.11014e-04 1.110142e-04 +894 4.700000e-01 -1.11575e-04 1.115747e-04 +895 4.800000e-01 -1.12119e-04 1.121189e-04 +896 4.900000e-01 -1.12648e-04 1.126480e-04 +897 5.000000e-01 -1.13163e-04 1.131629e-04 +898 5.100000e-01 -1.13665e-04 1.136645e-04 +899 5.200000e-01 -1.14154e-04 1.141535e-04 +900 5.300000e-01 -1.14631e-04 1.146307e-04 +901 5.400000e-01 -1.15097e-04 1.150966e-04 +902 5.500000e-01 -1.15552e-04 1.155519e-04 +903 5.600000e-01 -1.15997e-04 1.159970e-04 +904 5.700000e-01 -1.16433e-04 1.164326e-04 +905 5.800000e-01 -1.16859e-04 1.168591e-04 +906 5.900000e-01 -1.17277e-04 1.172769e-04 +907 6.000000e-01 -1.17686e-04 1.176864e-04 +908 6.100000e-01 -1.18088e-04 1.180880e-04 +909 6.200000e-01 -1.18482e-04 1.184820e-04 +910 6.300000e-01 -1.18869e-04 1.188688e-04 +911 6.400000e-01 -1.19249e-04 1.192487e-04 +912 6.500000e-01 -1.19622e-04 1.196219e-04 +913 6.600000e-01 -1.19989e-04 1.199888e-04 +914 6.700000e-01 -1.20350e-04 1.203497e-04 +915 6.800000e-01 -1.20705e-04 1.207046e-04 +916 6.900000e-01 -1.21054e-04 1.210540e-04 +917 7.000000e-01 -1.21398e-04 1.213979e-04 +918 7.100000e-01 -1.21737e-04 1.217367e-04 +919 7.200000e-01 -1.22071e-04 1.220705e-04 +920 7.300000e-01 -1.22400e-04 1.223995e-04 +921 7.400000e-01 -1.22724e-04 1.227238e-04 +922 7.500000e-01 -1.23044e-04 1.230437e-04 +923 7.600000e-01 -1.23359e-04 1.233593e-04 +924 7.700000e-01 -1.23671e-04 1.236708e-04 +925 7.800000e-01 -1.23978e-04 1.239783e-04 +926 7.900000e-01 -1.24282e-04 1.242819e-04 +927 8.000000e-01 -1.24582e-04 1.245817e-04 +928 8.100000e-01 -1.24878e-04 1.248780e-04 +929 8.200000e-01 -1.25171e-04 1.251708e-04 +930 8.300000e-01 -1.25460e-04 1.254602e-04 +931 8.400000e-01 -1.25746e-04 1.257463e-04 +932 8.500000e-01 -1.26029e-04 1.260293e-04 +933 8.600000e-01 -1.26309e-04 1.263093e-04 +934 8.700000e-01 -1.26586e-04 1.265863e-04 +935 8.800000e-01 -1.26860e-04 1.268604e-04 +936 8.900000e-01 -1.27132e-04 1.271318e-04 +937 9.000000e-01 -1.27401e-04 1.274005e-04 +938 9.100000e-01 -1.27667e-04 1.276666e-04 +939 9.200000e-01 -1.27930e-04 1.279301e-04 +940 9.300000e-01 -1.28191e-04 1.281912e-04 +941 9.400000e-01 -1.28450e-04 1.284500e-04 +942 9.500000e-01 -1.28706e-04 1.287064e-04 +943 9.600000e-01 -1.28961e-04 1.289606e-04 +944 9.700000e-01 -1.29213e-04 1.292126e-04 +945 9.800000e-01 -1.29463e-04 1.294624e-04 +946 9.900000e-01 -1.29710e-04 1.297103e-04 +947 1.000000e+00 -1.29956e-04 1.299561e-04 +948 1.010000e+00 -1.30200e-04 1.302000e-04 +949 1.020000e+00 -1.30442e-04 1.304420e-04 +950 1.030000e+00 -1.30682e-04 1.306821e-04 +951 1.040000e+00 -1.30921e-04 1.309205e-04 +952 1.050000e+00 -1.31157e-04 1.311571e-04 +953 1.060000e+00 -1.31392e-04 1.313920e-04 +954 1.070000e+00 -1.31626e-04 1.316253e-04 +955 1.080000e+00 -1.31857e-04 1.318570e-04 +956 1.090000e+00 -1.32087e-04 1.320871e-04 +957 1.100000e+00 -1.32316e-04 1.323157e-04 +958 1.110000e+00 -1.32543e-04 1.325428e-04 +959 1.120000e+00 -1.32769e-04 1.327684e-04 +960 1.130000e+00 -1.32993e-04 1.329927e-04 +961 1.140000e+00 -1.33216e-04 1.332155e-04 +962 1.150000e+00 -1.33437e-04 1.334370e-04 +963 1.160000e+00 -1.33658e-04 1.336572e-04 +964 1.170000e+00 -1.33877e-04 1.338762e-04 +965 1.180000e+00 -1.34094e-04 1.340938e-04 +966 1.190000e+00 -1.34311e-04 1.343103e-04 +967 1.200000e+00 -1.34526e-04 1.345256e-04 +968 0.000000e+00 9.422639e-15 9.422639e-15 +969 1.000000e-02 -6.67563e-06 6.675632e-06 +970 2.000000e-02 -1.31464e-05 1.314644e-05 +971 3.000000e-02 -1.94159e-05 1.941588e-05 +972 4.000000e-02 -2.54874e-05 2.548735e-05 +973 5.000000e-02 -3.13642e-05 3.136416e-05 +974 6.000000e-02 -3.70495e-05 3.704955e-05 +975 7.000000e-02 -4.25467e-05 4.254671e-05 +976 8.000000e-02 -4.78588e-05 4.785876e-05 +977 9.000000e-02 -5.29888e-05 5.298876e-05 +978 1.000000e-01 -5.79397e-05 5.793972e-05 +979 1.100000e-01 -6.27146e-05 6.271460e-05 +980 1.200000e-01 -6.73163e-05 6.731629e-05 +981 1.300000e-01 -7.17477e-05 7.174766e-05 +982 1.400000e-01 -7.60115e-05 7.601152e-05 +983 1.500000e-01 -8.01107e-05 8.011067e-05 +984 1.600000e-01 -8.40478e-05 8.404785e-05 +985 1.700000e-01 -8.78258e-05 8.782580e-05 +986 1.800000e-01 -9.14472e-05 9.144724e-05 +987 1.900000e-01 -9.49149e-05 9.491488e-05 +988 2.000000e-01 -9.82314e-05 9.823144e-05 +989 2.100000e-01 -1.01400e-04 1.013997e-04 +990 2.200000e-01 -1.04422e-04 1.044223e-04 +991 2.300000e-01 -1.07302e-04 1.073023e-04 +992 2.400000e-01 -1.10042e-04 1.100425e-04 +993 2.500000e-01 -1.12646e-04 1.126459e-04 +994 2.600000e-01 -1.15116e-04 1.151157e-04 +995 2.700000e-01 -1.17455e-04 1.174554e-04 +996 2.800000e-01 -1.19668e-04 1.196685e-04 +997 2.900000e-01 -1.21759e-04 1.217588e-04 +998 3.000000e-01 -1.23731e-04 1.237308e-04 +999 3.100000e-01 -1.25589e-04 1.255888e-04 +1000 3.200000e-01 -1.27338e-04 1.273380e-04 +1001 3.300000e-01 -1.28984e-04 1.289839e-04 +1002 3.400000e-01 -1.30532e-04 1.305321e-04 +1003 3.500000e-01 -1.31989e-04 1.319891e-04 +1004 3.600000e-01 -1.33361e-04 1.333611e-04 +1005 3.700000e-01 -1.34655e-04 1.346548e-04 +1006 3.800000e-01 -1.35877e-04 1.358766e-04 +1007 3.900000e-01 -1.37033e-04 1.370330e-04 +1008 4.000000e-01 -1.38130e-04 1.381299e-04 +1009 4.100000e-01 -1.39173e-04 1.391729e-04 +1010 4.200000e-01 -1.40167e-04 1.401671e-04 +1011 4.300000e-01 -1.41117e-04 1.411170e-04 +1012 4.400000e-01 -1.42027e-04 1.420268e-04 +1013 4.500000e-01 -1.42900e-04 1.429000e-04 +1014 4.600000e-01 -1.43740e-04 1.437397e-04 +1015 4.700000e-01 -1.44549e-04 1.445488e-04 +1016 4.800000e-01 -1.45330e-04 1.453295e-04 +1017 4.900000e-01 -1.46084e-04 1.460841e-04 +1018 5.000000e-01 -1.46814e-04 1.468143e-04 +1019 5.100000e-01 -1.47522e-04 1.475220e-04 +1020 5.200000e-01 -1.48209e-04 1.482085e-04 +1021 5.300000e-01 -1.48875e-04 1.488752e-04 +1022 5.400000e-01 -1.49523e-04 1.495233e-04 +1023 5.500000e-01 -1.50154e-04 1.501539e-04 +1024 5.600000e-01 -1.50768e-04 1.507679e-04 +1025 5.700000e-01 -1.51366e-04 1.513664e-04 +1026 5.800000e-01 -1.51950e-04 1.519500e-04 +1027 5.900000e-01 -1.52520e-04 1.525196e-04 +1028 6.000000e-01 -1.53076e-04 1.530758e-04 +1029 6.100000e-01 -1.53619e-04 1.536194e-04 +1030 6.200000e-01 -1.54151e-04 1.541509e-04 +1031 6.300000e-01 -1.54671e-04 1.546709e-04 +1032 6.400000e-01 -1.55180e-04 1.551799e-04 +1033 6.500000e-01 -1.55678e-04 1.556784e-04 +1034 6.600000e-01 -1.56167e-04 1.561669e-04 +1035 6.700000e-01 -1.56646e-04 1.566458e-04 +1036 6.800000e-01 -1.57116e-04 1.571155e-04 +1037 6.900000e-01 -1.57576e-04 1.575765e-04 +1038 7.000000e-01 -1.58029e-04 1.580290e-04 +1039 7.100000e-01 -1.58473e-04 1.584733e-04 +1040 7.200000e-01 -1.58910e-04 1.589100e-04 +1041 7.300000e-01 -1.59339e-04 1.593391e-04 +1042 7.400000e-01 -1.59761e-04 1.597611e-04 +1043 7.500000e-01 -1.60176e-04 1.601761e-04 +1044 7.600000e-01 -1.60585e-04 1.605845e-04 +1045 7.700000e-01 -1.60987e-04 1.609865e-04 +1046 7.800000e-01 -1.61382e-04 1.613824e-04 +1047 7.900000e-01 -1.61772e-04 1.617723e-04 +1048 8.000000e-01 -1.62156e-04 1.621564e-04 +1049 8.100000e-01 -1.62535e-04 1.625350e-04 +1050 8.200000e-01 -1.62908e-04 1.629083e-04 +1051 8.300000e-01 -1.63276e-04 1.632765e-04 +1052 8.400000e-01 -1.63640e-04 1.636396e-04 +1053 8.500000e-01 -1.63998e-04 1.639980e-04 +1054 8.600000e-01 -1.64352e-04 1.643517e-04 +1055 8.700000e-01 -1.64701e-04 1.647008e-04 +1056 8.800000e-01 -1.65046e-04 1.650457e-04 +1057 8.900000e-01 -1.65386e-04 1.653863e-04 +1058 9.000000e-01 -1.65723e-04 1.657228e-04 +1059 9.100000e-01 -1.66055e-04 1.660554e-04 +1060 9.200000e-01 -1.66384e-04 1.663842e-04 +1061 9.300000e-01 -1.66709e-04 1.667092e-04 +1062 9.400000e-01 -1.67031e-04 1.670307e-04 +1063 9.500000e-01 -1.67349e-04 1.673486e-04 +1064 9.600000e-01 -1.67663e-04 1.676632e-04 +1065 9.700000e-01 -1.67975e-04 1.679745e-04 +1066 9.800000e-01 -1.68283e-04 1.682826e-04 +1067 9.900000e-01 -1.68588e-04 1.685876e-04 +1068 1.000000e+00 -1.68890e-04 1.688896e-04 +1069 1.010000e+00 -1.69189e-04 1.691886e-04 +1070 1.020000e+00 -1.69485e-04 1.694849e-04 +1071 1.030000e+00 -1.69778e-04 1.697783e-04 +1072 1.040000e+00 -1.70069e-04 1.700691e-04 +1073 1.050000e+00 -1.70357e-04 1.703573e-04 +1074 1.060000e+00 -1.70643e-04 1.706429e-04 +1075 1.070000e+00 -1.70926e-04 1.709261e-04 +1076 1.080000e+00 -1.71207e-04 1.712068e-04 +1077 1.090000e+00 -1.71485e-04 1.714852e-04 +1078 1.100000e+00 -1.71762e-04 1.717614e-04 +1079 1.110000e+00 -1.72036e-04 1.720353e-04 +1080 1.120000e+00 -1.72307e-04 1.723070e-04 +1081 1.130000e+00 -1.72577e-04 1.725766e-04 +1082 1.140000e+00 -1.72845e-04 1.728442e-04 +1083 1.150000e+00 -1.73110e-04 1.731098e-04 +1084 1.160000e+00 -1.73374e-04 1.733734e-04 +1085 1.170000e+00 -1.73636e-04 1.736351e-04 +1086 1.180000e+00 -1.73896e-04 1.738950e-04 +1087 1.190000e+00 -1.74154e-04 1.741530e-04 +1088 1.200000e+00 -1.74410e-04 1.744093e-04 +1089 0.000000e+00 1.756510e-14 1.756510e-14 +1090 1.000000e-02 -7.51853e-06 7.518533e-06 +1091 2.000000e-02 -1.48306e-05 1.483056e-05 +1092 3.000000e-02 -2.19394e-05 2.193942e-05 +1093 4.000000e-02 -2.88484e-05 2.884835e-05 +1094 5.000000e-02 -3.55606e-05 3.556055e-05 +1095 6.000000e-02 -4.20791e-05 4.207915e-05 +1096 7.000000e-02 -4.84072e-05 4.840720e-05 +1097 8.000000e-02 -5.45477e-05 5.454771e-05 +1098 9.000000e-02 -6.05036e-05 6.050362e-05 +1099 1.000000e-01 -6.62778e-05 6.627783e-05 +1100 1.100000e-01 -7.18732e-05 7.187317e-05 +1101 1.200000e-01 -7.72924e-05 7.729243e-05 +1102 1.300000e-01 -8.25384e-05 8.253835e-05 +1103 1.400000e-01 -8.76136e-05 8.761361e-05 +1104 1.500000e-01 -9.25209e-05 9.252087e-05 +1105 1.600000e-01 -9.72627e-05 9.726274e-05 +1106 1.700000e-01 -1.01842e-04 1.018418e-04 +1107 1.800000e-01 -1.06261e-04 1.062606e-04 +1108 1.900000e-01 -1.10522e-04 1.105216e-04 +1109 2.000000e-01 -1.14627e-04 1.146273e-04 +1110 2.100000e-01 -1.18580e-04 1.185802e-04 +1111 2.200000e-01 -1.22383e-04 1.223828e-04 +1112 2.300000e-01 -1.26037e-04 1.260375e-04 +1113 2.400000e-01 -1.29547e-04 1.295467e-04 +1114 2.500000e-01 -1.32913e-04 1.329131e-04 +1115 2.600000e-01 -1.36139e-04 1.361390e-04 +1116 2.700000e-01 -1.39227e-04 1.392271e-04 +1117 2.800000e-01 -1.42180e-04 1.421800e-04 +1118 2.900000e-01 -1.45000e-04 1.450003e-04 +1119 3.000000e-01 -1.47691e-04 1.476911e-04 +1120 3.100000e-01 -1.50255e-04 1.502551e-04 +1121 3.200000e-01 -1.52696e-04 1.526957e-04 +1122 3.300000e-01 -1.55016e-04 1.550162e-04 +1123 3.400000e-01 -1.57220e-04 1.572202e-04 +1124 3.500000e-01 -1.59312e-04 1.593118e-04 +1125 3.600000e-01 -1.61295e-04 1.612951e-04 +1126 3.700000e-01 -1.63175e-04 1.631748e-04 +1127 3.800000e-01 -1.64956e-04 1.649558e-04 +1128 3.900000e-01 -1.66643e-04 1.666433e-04 +1129 4.000000e-01 -1.68243e-04 1.682429e-04 +1130 4.100000e-01 -1.69760e-04 1.697603e-04 +1131 4.200000e-01 -1.71201e-04 1.712011e-04 +1132 4.300000e-01 -1.72571e-04 1.725710e-04 +1133 4.400000e-01 -1.73876e-04 1.738756e-04 +1134 4.500000e-01 -1.75120e-04 1.751201e-04 +1135 4.600000e-01 -1.76309e-04 1.763094e-04 +1136 4.700000e-01 -1.77448e-04 1.774480e-04 +1137 4.800000e-01 -1.78540e-04 1.785400e-04 +1138 4.900000e-01 -1.79589e-04 1.795893e-04 +1139 5.000000e-01 -1.80599e-04 1.805990e-04 +1140 5.100000e-01 -1.81572e-04 1.815722e-04 +1141 5.200000e-01 -1.82512e-04 1.825116e-04 +1142 5.300000e-01 -1.83420e-04 1.834195e-04 +1143 5.400000e-01 -1.84298e-04 1.842981e-04 +1144 5.500000e-01 -1.85149e-04 1.851492e-04 +1145 5.600000e-01 -1.85975e-04 1.859746e-04 +1146 5.700000e-01 -1.86776e-04 1.867758e-04 +1147 5.800000e-01 -1.87554e-04 1.875543e-04 +1148 5.900000e-01 -1.88311e-04 1.883113e-04 +1149 6.000000e-01 -1.89048e-04 1.890480e-04 +1150 6.100000e-01 -1.89766e-04 1.897655e-04 +1151 6.200000e-01 -1.90465e-04 1.904648e-04 +1152 6.300000e-01 -1.91147e-04 1.911467e-04 +1153 6.400000e-01 -1.91812e-04 1.918122e-04 +1154 6.500000e-01 -1.92462e-04 1.924621e-04 +1155 6.600000e-01 -1.93097e-04 1.930970e-04 +1156 6.700000e-01 -1.93718e-04 1.937176e-04 +1157 6.800000e-01 -1.94325e-04 1.943247e-04 +1158 6.900000e-01 -1.94919e-04 1.949187e-04 +1159 7.000000e-01 -1.95500e-04 1.955003e-04 +1160 7.100000e-01 -1.96070e-04 1.960700e-04 +1161 7.200000e-01 -1.96628e-04 1.966283e-04 +1162 7.300000e-01 -1.97176e-04 1.971756e-04 +1163 7.400000e-01 -1.97712e-04 1.977124e-04 +1164 7.500000e-01 -1.98239e-04 1.982392e-04 +1165 7.600000e-01 -1.98756e-04 1.987562e-04 +1166 7.700000e-01 -1.99264e-04 1.992640e-04 +1167 7.800000e-01 -1.99763e-04 1.997628e-04 +1168 7.900000e-01 -2.00253e-04 2.002530e-04 +1169 8.000000e-01 -2.00735e-04 2.007349e-04 +1170 8.100000e-01 -2.01209e-04 2.012088e-04 +1171 8.200000e-01 -2.01675e-04 2.016750e-04 +1172 8.300000e-01 -2.02134e-04 2.021337e-04 +1173 8.400000e-01 -2.02585e-04 2.025853e-04 +1174 8.500000e-01 -2.03030e-04 2.030300e-04 +1175 8.600000e-01 -2.03468e-04 2.034680e-04 +1176 8.700000e-01 -2.03900e-04 2.038996e-04 +1177 8.800000e-01 -2.04325e-04 2.043249e-04 +1178 8.900000e-01 -2.04744e-04 2.047442e-04 +1179 9.000000e-01 -2.05158e-04 2.051576e-04 +1180 9.100000e-01 -2.05565e-04 2.055654e-04 +1181 9.200000e-01 -2.05968e-04 2.059678e-04 +1182 9.300000e-01 -2.06365e-04 2.063649e-04 +1183 9.400000e-01 -2.06757e-04 2.067568e-04 +1184 9.500000e-01 -2.07144e-04 2.071438e-04 +1185 9.600000e-01 -2.07526e-04 2.075260e-04 +1186 9.700000e-01 -2.07904e-04 2.079036e-04 +1187 9.800000e-01 -2.08277e-04 2.082766e-04 +1188 9.900000e-01 -2.08645e-04 2.086452e-04 +1189 1.000000e+00 -2.09010e-04 2.090096e-04 +1190 1.010000e+00 -2.09370e-04 2.093698e-04 +1191 1.020000e+00 -2.09726e-04 2.097260e-04 +1192 1.030000e+00 -2.10078e-04 2.100784e-04 +1193 1.040000e+00 -2.10427e-04 2.104269e-04 +1194 1.050000e+00 -2.10772e-04 2.107718e-04 +1195 1.060000e+00 -2.11113e-04 2.111131e-04 +1196 1.070000e+00 -2.11451e-04 2.114509e-04 +1197 1.080000e+00 -2.11786e-04 2.117854e-04 +1198 1.090000e+00 -2.12117e-04 2.121165e-04 +1199 1.100000e+00 -2.12445e-04 2.124444e-04 +1200 1.110000e+00 -2.12770e-04 2.127693e-04 +1201 1.120000e+00 -2.13091e-04 2.130911e-04 +1202 1.130000e+00 -2.13410e-04 2.134099e-04 +1203 1.140000e+00 -2.13726e-04 2.137259e-04 +1204 1.150000e+00 -2.14039e-04 2.140391e-04 +1205 1.160000e+00 -2.14350e-04 2.143495e-04 +1206 1.170000e+00 -2.14658e-04 2.146573e-04 +1207 1.180000e+00 -2.14963e-04 2.149624e-04 +1208 1.190000e+00 -2.15266e-04 2.152651e-04 +1209 1.200000e+00 -2.15566e-04 2.155653e-04 +1210 0.000000e+00 3.205386e-14 3.205386e-14 +1211 1.000000e-02 -8.26059e-06 8.260585e-06 +1212 2.000000e-02 -1.63153e-05 1.631525e-05 +1213 3.000000e-02 -2.41672e-05 2.416715e-05 +1214 4.000000e-02 -3.18194e-05 3.181939e-05 +1215 5.000000e-02 -3.92750e-05 3.927499e-05 +1216 6.000000e-02 -4.65369e-05 4.653694e-05 +1217 7.000000e-02 -5.36082e-05 5.360815e-05 +1218 8.000000e-02 -6.04915e-05 6.049148e-05 +1219 9.000000e-02 -6.71898e-05 6.718975e-05 +1220 1.000000e-01 -7.37057e-05 7.370570e-05 +1221 1.100000e-01 -8.00421e-05 8.004205e-05 +1222 1.200000e-01 -8.62015e-05 8.620145e-05 +1223 1.300000e-01 -9.21865e-05 9.218651e-05 +1224 1.400000e-01 -9.79998e-05 9.799979e-05 +1225 1.500000e-01 -1.03644e-04 1.036438e-04 +1226 1.600000e-01 -1.09121e-04 1.091211e-04 +1227 1.700000e-01 -1.14434e-04 1.144340e-04 +1228 1.800000e-01 -1.19585e-04 1.195849e-04 +1229 1.900000e-01 -1.24576e-04 1.245763e-04 +1230 2.000000e-01 -1.29411e-04 1.294105e-04 +1231 2.100000e-01 -1.34090e-04 1.340898e-04 +1232 2.200000e-01 -1.38616e-04 1.386164e-04 +1233 2.300000e-01 -1.42993e-04 1.429926e-04 +1234 2.400000e-01 -1.47221e-04 1.472206e-04 +1235 2.500000e-01 -1.51303e-04 1.513028e-04 +1236 2.600000e-01 -1.55241e-04 1.552412e-04 +1237 2.700000e-01 -1.59038e-04 1.590382e-04 +1238 2.800000e-01 -1.62696e-04 1.626959e-04 +1239 2.900000e-01 -1.66217e-04 1.662166e-04 +1240 3.000000e-01 -1.69603e-04 1.696026e-04 +1241 3.100000e-01 -1.72856e-04 1.728561e-04 +1242 3.200000e-01 -1.75980e-04 1.759796e-04 +1243 3.300000e-01 -1.78975e-04 1.789755e-04 +1244 3.400000e-01 -1.81846e-04 1.818462e-04 +1245 3.500000e-01 -1.84595e-04 1.845946e-04 +1246 3.600000e-01 -1.87223e-04 1.872233e-04 +1247 3.700000e-01 -1.89735e-04 1.897355e-04 +1248 3.800000e-01 -1.92134e-04 1.921341e-04 +1249 3.900000e-01 -1.94423e-04 1.944227e-04 +1250 4.000000e-01 -1.96605e-04 1.966050e-04 +1251 4.100000e-01 -1.98685e-04 1.986848e-04 +1252 4.200000e-01 -2.00666e-04 2.006664e-04 +1253 4.300000e-01 -2.02554e-04 2.025542e-04 +1254 4.400000e-01 -2.04353e-04 2.043531e-04 +1255 4.500000e-01 -2.06068e-04 2.060678e-04 +1256 4.600000e-01 -2.07703e-04 2.077034e-04 +1257 4.700000e-01 -2.09265e-04 2.092649e-04 +1258 4.800000e-01 -2.10757e-04 2.107571e-04 +1259 4.900000e-01 -2.12185e-04 2.121851e-04 +1260 5.000000e-01 -2.13553e-04 2.135532e-04 +1261 5.100000e-01 -2.14866e-04 2.148659e-04 +1262 5.200000e-01 -2.16127e-04 2.161271e-04 +1263 5.300000e-01 -2.17341e-04 2.173406e-04 +1264 5.400000e-01 -2.18510e-04 2.185097e-04 +1265 5.500000e-01 -2.19637e-04 2.196374e-04 +1266 5.600000e-01 -2.20727e-04 2.207267e-04 +1267 5.700000e-01 -2.21780e-04 2.217799e-04 +1268 5.800000e-01 -2.22799e-04 2.227994e-04 +1269 5.900000e-01 -2.23787e-04 2.237872e-04 +1270 6.000000e-01 -2.24745e-04 2.247452e-04 +1271 6.100000e-01 -2.25675e-04 2.256752e-04 +1272 6.200000e-01 -2.26579e-04 2.265787e-04 +1273 6.300000e-01 -2.27457e-04 2.274572e-04 +1274 6.400000e-01 -2.28312e-04 2.283119e-04 +1275 6.500000e-01 -2.29144e-04 2.291441e-04 +1276 6.600000e-01 -2.29955e-04 2.299549e-04 +1277 6.700000e-01 -2.30745e-04 2.307454e-04 +1278 6.800000e-01 -2.31516e-04 2.315165e-04 +1279 6.900000e-01 -2.32269e-04 2.322691e-04 +1280 7.000000e-01 -2.33004e-04 2.330042e-04 +1281 7.100000e-01 -2.33722e-04 2.337224e-04 +1282 7.200000e-01 -2.34425e-04 2.344246e-04 +1283 7.300000e-01 -2.35111e-04 2.351113e-04 +1284 7.400000e-01 -2.35783e-04 2.357834e-04 +1285 7.500000e-01 -2.36441e-04 2.364413e-04 +1286 7.600000e-01 -2.37086e-04 2.370857e-04 +1287 7.700000e-01 -2.37717e-04 2.377171e-04 +1288 7.800000e-01 -2.38336e-04 2.383360e-04 +1289 7.900000e-01 -2.38943e-04 2.389430e-04 +1290 8.000000e-01 -2.39538e-04 2.395384e-04 +1291 8.100000e-01 -2.40123e-04 2.401228e-04 +1292 8.200000e-01 -2.40697e-04 2.406965e-04 +1293 8.300000e-01 -2.41260e-04 2.412599e-04 +1294 8.400000e-01 -2.41814e-04 2.418135e-04 +1295 8.500000e-01 -2.42358e-04 2.423575e-04 +1296 8.600000e-01 -2.42892e-04 2.428923e-04 +1297 8.700000e-01 -2.43418e-04 2.434183e-04 +1298 8.800000e-01 -2.43936e-04 2.439357e-04 +1299 8.900000e-01 -2.44445e-04 2.444449e-04 +1300 9.000000e-01 -2.44946e-04 2.449460e-04 +1301 9.100000e-01 -2.45440e-04 2.454395e-04 +1302 9.200000e-01 -2.45925e-04 2.459255e-04 +1303 9.300000e-01 -2.46404e-04 2.464042e-04 +1304 9.400000e-01 -2.46876e-04 2.468760e-04 +1305 9.500000e-01 -2.47341e-04 2.473411e-04 +1306 9.600000e-01 -2.47800e-04 2.477996e-04 +1307 9.700000e-01 -2.48252e-04 2.482517e-04 +1308 9.800000e-01 -2.48698e-04 2.486978e-04 +1309 9.900000e-01 -2.49138e-04 2.491378e-04 +1310 1.000000e+00 -2.49572e-04 2.495721e-04 +1311 1.010000e+00 -2.50001e-04 2.500008e-04 +1312 1.020000e+00 -2.50424e-04 2.504241e-04 +1313 1.030000e+00 -2.50842e-04 2.508421e-04 +1314 1.040000e+00 -2.51255e-04 2.512551e-04 +1315 1.050000e+00 -2.51663e-04 2.516630e-04 +1316 1.060000e+00 -2.52066e-04 2.520661e-04 +1317 1.070000e+00 -2.52465e-04 2.524645e-04 +1318 1.080000e+00 -2.52859e-04 2.528584e-04 +1319 1.090000e+00 -2.53248e-04 2.532479e-04 +1320 1.100000e+00 -2.53633e-04 2.536330e-04 +1321 1.110000e+00 -2.54014e-04 2.540140e-04 +1322 1.120000e+00 -2.54391e-04 2.543908e-04 +1323 1.130000e+00 -2.54764e-04 2.547638e-04 +1324 1.140000e+00 -2.55133e-04 2.551328e-04 +1325 1.150000e+00 -2.55499e-04 2.554981e-04 +1326 1.160000e+00 -2.55860e-04 2.558598e-04 +1327 1.170000e+00 -2.56218e-04 2.562178e-04 +1328 1.180000e+00 -2.56573e-04 2.565725e-04 +1329 1.190000e+00 -2.56924e-04 2.569237e-04 +1330 1.200000e+00 -2.57272e-04 2.572716e-04 CPU time since last call: 0.160 seconds. diff --git a/tests/bsim3soi/test2.cir b/tests/bsim3soi/test2.cir index ae35c68a5..22eceb880 100644 --- a/tests/bsim3soi/test2.cir +++ b/tests/bsim3soi/test2.cir @@ -14,7 +14,7 @@ vs s 0 0.0 vp p 0 0.0 .dc vd 0 1.2 0.02 vg 0.4 1.2 0.1 -.include ./nmos4p1.mod +.include ./nmos4p3.mod .print dc i(vd) .end diff --git a/tests/bsim3soi/test3.cir b/tests/bsim3soi/test3.cir index b539f7701..06d3f5006 100644 --- a/tests/bsim3soi/test3.cir +++ b/tests/bsim3soi/test3.cir @@ -14,7 +14,7 @@ vs s 0 0.0 vp p 0 0.0 .dc vg 0 1.2 0.02 vd 0.05 1.2 0.5 -.include ./nmos4p1.mod +.include ./nmos4p3.mod .print dc i(vd) .end diff --git a/tests/bsim3soi/test4.cir b/tests/bsim3soi/test4.cir index 0614bb413..fc843da45 100644 --- a/tests/bsim3soi/test4.cir +++ b/tests/bsim3soi/test4.cir @@ -14,7 +14,7 @@ vs s 0 0.0 vp p 0 0.0 .dc vg 0 1.2 0.02 vd 0.05 1.2 0.5 -.include ./nmos4p1.mod +.include ./nmos4p3.mod .print dc i(vd) .end diff --git a/tests/bsim3soi/test5.cir b/tests/bsim3soi/test5.cir index 6aec227ee..89bca3865 100644 --- a/tests/bsim3soi/test5.cir +++ b/tests/bsim3soi/test5.cir @@ -14,7 +14,7 @@ vs s 0 0.0 vp p 0 0.0 .dc vd 0 -1.2 -0.02 vg -0.4 -1.2 -0.1 -.include ./pmos4p1.mod +.include ./pmos4p3.mod .print dc i(vd) .end diff --git a/tests/bsim3soi/test6.cir b/tests/bsim3soi/test6.cir index feeb97e19..bc64837d1 100644 --- a/tests/bsim3soi/test6.cir +++ b/tests/bsim3soi/test6.cir @@ -14,7 +14,7 @@ vs s 0 0.0 vp p 0 0.0 .dc vd 0 -1.2 -0.02 vg -0.4 -1.2 -0.1 -.include ./pmos4p1.mod +.include ./pmos4p3.mod .print dc i(vd) .end diff --git a/tests/bsim3soi/test7.cir b/tests/bsim3soi/test7.cir index 613df8f6b..87cf177f3 100644 --- a/tests/bsim3soi/test7.cir +++ b/tests/bsim3soi/test7.cir @@ -14,7 +14,7 @@ vs s 0 0.0 vp p 0 0.0 .dc vg 0 -1.2 -0.02 vd -0.05 -1.2 -0.5 -.include ./pmos4p1.mod +.include ./pmos4p3.mod .print dc i(vd) .end diff --git a/tests/bsim3soi/test8.cir b/tests/bsim3soi/test8.cir index 6484ef320..ead30d11c 100644 --- a/tests/bsim3soi/test8.cir +++ b/tests/bsim3soi/test8.cir @@ -14,7 +14,7 @@ vs s 0 0.0 vp p 0 0.0 .dc vg 0 -1.2 -0.02 vd -0.05 -1.2 -0.5 -.include ./pmos4p1.mod +.include ./pmos4p3.mod .print dc i(vd) .end