From 68b8614a35063f67653ecae23d5e74629ca5f13f Mon Sep 17 00:00:00 2001 From: rlar Date: Fri, 26 May 2017 20:26:14 +0200 Subject: [PATCH] bsim6.va, macro for lln, to avoid derivatives of this function --- .../devices/adms/bsim6/admsva/bsim6.va | 61 +++++++++---------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/src/spicelib/devices/adms/bsim6/admsva/bsim6.va b/src/spicelib/devices/adms/bsim6/admsva/bsim6.va index 57ea2eceb..5e17ac52e 100755 --- a/src/spicelib/devices/adms/bsim6/admsva/bsim6.va +++ b/src/spicelib/devices/adms/bsim6/admsva/bsim6.va @@ -629,13 +629,8 @@ electrical d, g, s, b; (((x) < -`EXPL_THRESHOLD) ? (`MIN_EXPL) : exp(x))) // Clamped log function -analog function real lln; - input x; - real x; - begin - lln = ln(max(x , `N_MINLOG)); - end -endfunction +`define lln(x) \ + ln(max((x) , `N_MINLOG)) // Hyperbolic smoothing function `define hypsmooth(x,c) \ @@ -2740,26 +2735,26 @@ DevTemp = $temperature + DTEMP; ni = NI0SUB * T1y * `lexp(Eg / (2.0 * Vtm0) - Eg / (2.0 * Vtm)); `ifdef __SHMOD__ if ((SHMOD != 0) && (RTH0 > 0)) begin - T0 = lln(NDEP_i/ni); + T0 = `lln(NDEP_i/ni); phib = sqrt(T0 * T0 + 1.0E-6); end else begin - phib = lln(NDEP_i/ni); + phib = `lln(NDEP_i/ni); end `else - phib = lln(NDEP_i/ni); + phib = `lln(NDEP_i/ni); `endif `ifdef __SHMOD__ if ((SHMOD != 0) && (RTH0 > 0)) begin - T0 = lln(NDEP_i*NSD/ni*ni); + T0 = `lln(NDEP_i*NSD/ni*ni); Vbi = sqrt(T0 * T0 + 1.0E-6); end else begin - Vbi = lln(NDEP_i*NSD/ni*ni); + Vbi = `lln(NDEP_i*NSD/ni*ni); end `else - Vbi = lln(NDEP_i*NSD/ni*ni); + Vbi = `lln(NDEP_i*NSD/ni*ni); `endif if(NGATE_i > 0) - Vfbsdr = -devsign * Vt * lln(NGATE_i/NSD_i) + VFBSDOFF; + Vfbsdr = -devsign * Vt * `lln(NGATE_i/NSD_i) + VFBSDOFF; else Vfbsdr = 0.0; @@ -2822,7 +2817,7 @@ DevTemp = $temperature + DTEMP; BETA0_t = BETA0_i * pow(TRatio, IIT_i); BGIDL_t = BGIDL_i * `hypsmooth(1.0 + TGIDL_i * delTemp - 1.0E-6, 1.0E-3); BGISL_t = BGISL_i * `hypsmooth(1.0 + TGIDL_i * delTemp - 1.0E-6, 1.0E-3); - igtemp = `lexp(IGT_i * lln(TRatio)); //pow(TRatio, IGT_i); + igtemp = `lexp(IGT_i * `lln(TRatio)); //pow(TRatio, IGT_i); //***Diode Model temperature Code Start***// CJS_t = CJS * `hypsmooth(1.0 + TCJ * delTemp - 1.0E-6, 1.0E-3); @@ -2839,7 +2834,7 @@ DevTemp = $temperature + DTEMP; PBSWGD_t = `hypsmooth(PBSWGD - TPBSWG * delTemp - 0.01, 1.0E-3) + 0.01; T0y = Eg0 / Vtm0 - Eg / Vtm; - T1y = lln(TRatio); + T1y = `lln(TRatio); T3y = `lexp((T0y + XTIS * T1y) / NJS); JSS_t = JSS * T3y; JSWS_t = JSWS * T3y; @@ -2918,12 +2913,12 @@ DevTemp = $temperature + DTEMP; XExpBVS = `lexp(-BVS / Nvtms) * XJBVS; T2y = max(IJTHSFWD / Isbs, 10.0); Tb = 1.0 + T2y - XExpBVS; - VjsmFwd = Nvtms * lln(0.5 * (Tb + sqrt(Tb * Tb + 4 * XExpBVS))); + VjsmFwd = Nvtms * `lln(0.5 * (Tb + sqrt(Tb * Tb + 4 * XExpBVS))); T0y = `lexp(VjsmFwd / Nvtms); IVjsmFwd = Isbs * (T0y - XExpBVS / T0y + XExpBVS - 1.0); SslpFwd = Isbs * (T0y + XExpBVS / T0y) / Nvtms; T2y = `hypsmooth(IJTHSREV / Isbs - 10.0, 1.0E-3) + 10.0; - VjsmRev = -BVS - Nvtms * lln((T2y - 1.0) / XJBVS); + VjsmRev = -BVS - Nvtms * `lln((T2y - 1.0) / XJBVS); T1y = XJBVS * `lexp(-(BVS + VjsmRev) / Nvtms); IVjsmRev = Isbs * (1.0 + T1y); SslpRev = -Isbs * T1y / Nvtms; @@ -2945,12 +2940,12 @@ DevTemp = $temperature + DTEMP; XExpBVD = `lexp(-BVD / Nvtmd) * XJBVD; T2y = max(IJTHDFWD / Isbd, 10.0); Tb = 1.0 + T2y - XExpBVD; - VjdmFwd = Nvtmd * lln(0.5 * (Tb + sqrt(Tb * Tb + 4 * XExpBVD))); + VjdmFwd = Nvtmd * `lln(0.5 * (Tb + sqrt(Tb * Tb + 4 * XExpBVD))); T0y = `lexp(VjdmFwd / Nvtmd); IVjdmFwd = Isbd * (T0y - XExpBVD / T0y + XExpBVD - 1.0); DslpFwd = Isbd * (T0y + XExpBVD / T0y) / Nvtmd; T2y = `hypsmooth(IJTHDREV / Isbd - 10.0, 1.0E-3) + 10.0; - VjdmRev = -BVD - Nvtmd * lln((T2y - 1.0) / XJBVD); + VjdmRev = -BVD - Nvtmd * `lln((T2y - 1.0) / XJBVD); T1y = XJBVD * `lexp(-(BVD + VjdmRev) / Nvtmd); IVjdmRev = Isbd * (1.0 + T1y); DslpRev = -Isbd * T1y / Nvtmd; @@ -3163,7 +3158,7 @@ DevTemp = $temperature + DTEMP; else T2 = exp(T0); T3 = Leff + DVTP0_i * (1.0 + T2); - dVth_ldop = -nVt * lln(Leff / T3); + dVth_ldop = -nVt * `lln(Leff / T3); end else dVth_ldop = 0; @@ -3407,7 +3402,7 @@ DevTemp = $temperature + DTEMP; T1 = PCLM_a / (1.0 - PCLMG * qia / EsatL)/Fp; else T1 = PCLM_a * (1.0 + PCLMG * qia / EsatL)/Fp; - MdL = 1.0 + T1 * lln(1.0 + diffVds / T1 / Vasat); + MdL = 1.0 + T1 * `lln(1.0 + diffVds / T1 / Vasat); end else MdL = 1.0; Moc = Moc * MdL; @@ -3577,7 +3572,7 @@ DevTemp = $temperature + DTEMP; // Igbinv if (IGBMOD != 0) begin T1 = Voxmacc / NIGBACC_i / Vt; //representative of Qb in acc - Vaux_Igbacc = NIGBACC_i * Vt * lln(1 + `lexp(-T1)); + Vaux_Igbacc = NIGBACC_i * Vt * `lln(1 + `lexp(-T1)); T2 = AIGBACC_i - BIGBACC_i * Voxmacc; T3 = 1.0 + CIGBACC_i * Voxmacc; T4 = -7.45669e11 * TOXE * T2 * T3; @@ -3587,7 +3582,7 @@ DevTemp = $temperature + DTEMP; igbacc = igbacc * igtemp; T1 = (Voxminv - EIGBINV_i) / NIGBINV_i / Vt; - Vaux_Igbinv = NIGBINV_i * Vt * lln(1.0 + `lexp(T1)); + Vaux_Igbinv = NIGBINV_i * Vt * `lln(1.0 + `lexp(T1)); T2 = AIGBINV_i - BIGBINV_i * Voxminv; T3 = 1.0 + CIGBINV_i * Voxminv; T4 = -9.82222e11 * TOXE * T2 * T3; @@ -3806,7 +3801,7 @@ DevTemp = $temperature + DTEMP; if (T1<0.9) begin arg = 1.0 - T1; if (MJS == 0.5) sarg = 1.0 / sqrt(arg); - else sarg = `lexp(-MJS * lln(arg)); + else sarg = `lexp(-MJS * `lln(arg)); Qbs = PBS_t * Czbs * (1.0 - arg * sarg) / (1.0 - MJS); end else begin T2 = pow(0.1,-MJS); @@ -3824,7 +3819,7 @@ DevTemp = $temperature + DTEMP; if (T1<0.9) begin arg = 1.0 - T1; if (MJSWS == 0.5) sarg = 1.0 / sqrt(arg); - else sarg = `lexp(-MJSWS * lln(arg)); + else sarg = `lexp(-MJSWS * `lln(arg)); Qbs = Qbs + PBSWS_t * Czbssw * (1.0 - arg * sarg) / (1.0 - MJSWS); end else begin T2 = pow(0.1,-MJSWS); @@ -3840,7 +3835,7 @@ DevTemp = $temperature + DTEMP; if (T1<0.9) begin arg = 1.0 - T1; if (MJSWGS == 0.5) sarg = 1.0 / sqrt(arg); - else sarg = `lexp(-MJSWGS * lln(arg)); + else sarg = `lexp(-MJSWGS * `lln(arg)); Qbs = Qbs + PBSWGS_t * Czbsswg * (1.0 - arg * sarg) / (1.0 - MJSWGS); end else begin T2 = pow(0.1,-MJSWGS); @@ -3857,7 +3852,7 @@ DevTemp = $temperature + DTEMP; if (T1<0.9) begin arg = 1.0 - T1; if (MJD == 0.5) sarg = 1.0 / sqrt(arg); - else sarg = `lexp(-MJD * lln(arg)); + else sarg = `lexp(-MJD * `lln(arg)); Qbd = PBD_t * Czbd * (1.0 - arg * sarg) / (1.0 - MJD); end else begin T2 = pow(0.1,-MJD); @@ -3875,7 +3870,7 @@ DevTemp = $temperature + DTEMP; if (T1<0.9) begin arg = 1.0 - T1; if (MJSWD == 0.5) sarg = 1.0 / sqrt(arg); - else sarg = `lexp(-MJSWD * lln(arg)); + else sarg = `lexp(-MJSWD * `lln(arg)); Qbd = Qbd + PBSWD_t * Czbdsw * (1.0 - arg * sarg) / (1.0 - MJSWD); end else begin T2 = pow(0.1,-MJSWD); @@ -3891,7 +3886,7 @@ DevTemp = $temperature + DTEMP; if (T1<0.9) begin arg = 1.0 - T1; if (MJSWGD == 0.5) sarg = 1.0 / sqrt(arg); - else sarg = `lexp(-MJSWGD * lln(arg)); + else sarg = `lexp(-MJSWGD * `lln(arg)); Qbd = Qbd + PBSWGD_t * Czbdswg * (1.0 - arg * sarg) / (1.0 - MJSWGD); end else begin T2 = pow(0.1,-MJSWGD); @@ -3922,7 +3917,7 @@ DevTemp = $temperature + DTEMP; DelClm = 0.0; else begin T0 = (diffVds / litl + EM) / Esatnoi; - DelClm = litl * lln(T0); + DelClm = litl * `lln(T0); if (DelClm < 0.0) DelClm = 0.0; end T1 = `q * `q * `q * Vt * abs(ids) * ueff; @@ -3930,7 +3925,7 @@ DevTemp = $temperature + DTEMP; N0 = 2.0 * nq * Cox * Vt * qs / `q; Nl = 2.0 * nq * Cox * Vt * qdeff / `q; Nstar = Vt / `q * (Cox + Cdep + CIT); - T3 = NOIA * lln((N0 + Nstar) / (Nl + Nstar)); + T3 = NOIA * `lln((N0 + Nstar) / (Nl + Nstar)); T4 = NOIB * (N0 - Nl); T5 = 0.5 * NOIC * (N0 * N0 - Nl * Nl); T6 = `q * Vt * ids * ids; @@ -4124,7 +4119,7 @@ if (CVMOD==1) begin end if(PCLMCV_i != 0) begin - MdL = 1.0 + PCLMCV_i * lln(1.0 + diffVds / PCLMCV_i / Vasat); + MdL = 1.0 + PCLMCV_i * `lln(1.0 + diffVds / PCLMCV_i / Vasat); end else MdL = 1.0;