bsimcmg, adms workaround, transform hypsmooth to a .va macro
This commit is contained in:
parent
ecd8a1d019
commit
2230fb7d45
|
|
@ -41,16 +41,6 @@
|
||||||
// ___Professor in Graduate School _______
|
// ___Professor in Graduate School _______
|
||||||
// ********************************************************
|
// ********************************************************
|
||||||
|
|
||||||
// Hyperbolic Smoothing Function
|
|
||||||
analog function real hypsmooth;
|
|
||||||
input x, c;
|
|
||||||
real x, c;
|
|
||||||
|
|
||||||
begin
|
|
||||||
hypsmooth = 0.5 * (x + sqrt(x * x + 4.0 * c * c));
|
|
||||||
end
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
// Hyperbolic Smoothing max Function
|
// Hyperbolic Smoothing max Function
|
||||||
analog function real hypmax;
|
analog function real hypmax;
|
||||||
input x, xmin, c;
|
input x, xmin, c;
|
||||||
|
|
@ -70,7 +60,7 @@ analog function real Tempdep;
|
||||||
if (TEMPMOD != 0) begin
|
if (TEMPMOD != 0) begin
|
||||||
Tempdep = PARAML + hypmax(PARAMT * DELTEMP, -PARAML, 1.0e-6);
|
Tempdep = PARAML + hypmax(PARAMT * DELTEMP, -PARAML, 1.0e-6);
|
||||||
end else begin
|
end else begin
|
||||||
Tempdep = PARAML * hypsmooth(1.0 + PARAMT * DELTEMP - 1.0e-6, 1.0e-3);
|
Tempdep = PARAML * `hypsmooth(1.0 + PARAMT * DELTEMP - 1.0e-6, 1.0e-3);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
endfunction
|
endfunction
|
||||||
|
|
@ -2399,7 +2389,7 @@ analog begin
|
||||||
T1 = (DevTemp / 300.15) * sqrt(DevTemp / 300.15);
|
T1 = (DevTemp / 300.15) * sqrt(DevTemp / 300.15);
|
||||||
ni = NI0SUB * T1 * `lexp(BG0SUB / (2.0 * `KboQ * 300.15) - Eg / (2.0 * Vtm));
|
ni = NI0SUB * T1 * `lexp(BG0SUB / (2.0 * `KboQ * 300.15) - Eg / (2.0 * Vtm));
|
||||||
Nc = NC0SUB * T1;
|
Nc = NC0SUB * T1;
|
||||||
ThetaSS = hypsmooth(1.0 + TSS_i * delTemp - 1.0e-6, 1.0e-3);
|
ThetaSS = `hypsmooth(1.0 + TSS_i * delTemp - 1.0e-6, 1.0e-3);
|
||||||
|
|
||||||
// Quantum Mechanical Vth Correction (Ref: Trivedi et al., EDL 2005)
|
// Quantum Mechanical Vth Correction (Ref: Trivedi et al., EDL 2005)
|
||||||
kT = Vtm * `q;
|
kT = Vtm * `q;
|
||||||
|
|
@ -2453,7 +2443,7 @@ analog begin
|
||||||
|
|
||||||
UCS_t = UCS_i * pow(TRatio, UCSTE_i);
|
UCS_t = UCS_i * pow(TRatio, UCSTE_i);
|
||||||
|
|
||||||
rdstemp = hypsmooth(1.0 + PRT_i * delTemp - 1.0e-6, 1.0e-3);
|
rdstemp = `hypsmooth(1.0 + PRT_i * delTemp - 1.0e-6, 1.0e-3);
|
||||||
RSDR_t = Tempdep(RSDR, TRSDR, delTemp, TEMPMOD);
|
RSDR_t = Tempdep(RSDR, TRSDR, delTemp, TEMPMOD);
|
||||||
if (ASYMMOD != 0) begin
|
if (ASYMMOD != 0) begin
|
||||||
RSDRR_t = Tempdep(RSDRR, TRSDR, delTemp, TEMPMOD);
|
RSDRR_t = Tempdep(RSDRR, TRSDR, delTemp, TEMPMOD);
|
||||||
|
|
@ -2498,9 +2488,9 @@ analog begin
|
||||||
VSATCV_t = 1000;
|
VSATCV_t = 1000;
|
||||||
end
|
end
|
||||||
|
|
||||||
MEXP_t = hypsmooth(MEXP_i * (1.0 + TMEXP * delTemp) - 2.0, 1.0e-3) + 2.0;
|
MEXP_t = `hypsmooth(MEXP_i * (1.0 + TMEXP * delTemp) - 2.0, 1.0e-3) + 2.0;
|
||||||
if (ASYMMOD != 0) begin
|
if (ASYMMOD != 0) begin
|
||||||
MEXPR_t = hypsmooth(MEXPR_i * (1.0 + TMEXPR * delTemp) - 2.0, 1.0e-3) + 2.0;
|
MEXPR_t = `hypsmooth(MEXPR_i * (1.0 + TMEXPR * delTemp) - 2.0, 1.0e-3) + 2.0;
|
||||||
end
|
end
|
||||||
|
|
||||||
PTWG_t = Tempdep(PTWG_i, -PTWGT_i, delTemp, TEMPMOD);
|
PTWG_t = Tempdep(PTWG_i, -PTWGT_i, delTemp, TEMPMOD);
|
||||||
|
|
@ -2510,7 +2500,7 @@ analog begin
|
||||||
|
|
||||||
dvth_temp = (KT1_i + KT1L / Leff) * (TRatio - 1.0);
|
dvth_temp = (KT1_i + KT1L / Leff) * (TRatio - 1.0);
|
||||||
BETA0_t = BETA0_i * pow(TRatio, IIT_i);
|
BETA0_t = BETA0_i * pow(TRatio, IIT_i);
|
||||||
SII0_t = SII0_i * (hypsmooth(1.0 + TII_i * (TRatio - 1.0) - 0.01, 1.0e-3) + 0.01);
|
SII0_t = SII0_i * (`hypsmooth(1.0 + TII_i * (TRatio - 1.0) - 0.01, 1.0e-3) + 0.01);
|
||||||
|
|
||||||
K0_t = K0_i + K01_i * delTemp;
|
K0_t = K0_i + K01_i * delTemp;
|
||||||
K0SI_t = K0SI_i + hypmax(K0SI1_i * delTemp, -K0SI_i, 1.0e-6);
|
K0SI_t = K0SI_i + hypmax(K0SI1_i * delTemp, -K0SI_i, 1.0e-6);
|
||||||
|
|
@ -2527,8 +2517,8 @@ analog begin
|
||||||
AIGC_t = AIGC_i + hypmax(AIGC1_i * delTemp, -AIGC_i, 1.0e-6);
|
AIGC_t = AIGC_i + hypmax(AIGC1_i * delTemp, -AIGC_i, 1.0e-6);
|
||||||
AIGS_t = AIGS_i + hypmax(AIGS1_i * delTemp, -AIGS_i, 1.0e-6);
|
AIGS_t = AIGS_i + hypmax(AIGS1_i * delTemp, -AIGS_i, 1.0e-6);
|
||||||
AIGD_t = AIGD_i + hypmax(AIGD1_i * delTemp, -AIGD_i, 1.0e-6);
|
AIGD_t = AIGD_i + hypmax(AIGD1_i * delTemp, -AIGD_i, 1.0e-6);
|
||||||
BGIDL_t = BGIDL_i * hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3);
|
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);
|
BGISL_t = BGISL_i * `hypsmooth(1.0 + TGIDL_i * delTemp - 1.0e-6, 1.0e-3);
|
||||||
ALPHA0_t = ALPHA0_i + hypmax(ALPHA01 * delTemp, -ALPHA0_i, 1.0e-6);
|
ALPHA0_t = ALPHA0_i + hypmax(ALPHA01 * delTemp, -ALPHA0_i, 1.0e-6);
|
||||||
ALPHA1_t = ALPHA1_i + hypmax(ALPHA11 * delTemp, -ALPHA1_i, 1.0e-6);
|
ALPHA1_t = ALPHA1_i + hypmax(ALPHA11 * delTemp, -ALPHA1_i, 1.0e-6);
|
||||||
ALPHAII0_t = ALPHAII0_i + hypmax(ALPHAII01 * delTemp, -ALPHAII0_i, 1.0e-25);
|
ALPHAII0_t = ALPHAII0_i + hypmax(ALPHAII01 * delTemp, -ALPHAII0_i, 1.0e-25);
|
||||||
|
|
@ -2544,12 +2534,12 @@ analog begin
|
||||||
CJSWGS_t = Tempdep(CJSWGS, TCJSWG, delTemp, TEMPMOD);
|
CJSWGS_t = Tempdep(CJSWGS, TCJSWG, delTemp, TEMPMOD);
|
||||||
CJSWGD_t = Tempdep(CJSWGD, TCJSWG, delTemp, TEMPMOD);
|
CJSWGD_t = Tempdep(CJSWGD, TCJSWG, delTemp, TEMPMOD);
|
||||||
|
|
||||||
PBS_t = hypsmooth(PBS - TPB * delTemp - 0.01, 1.0e-3) + 0.01;
|
PBS_t = `hypsmooth(PBS - TPB * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||||
PBD_t = hypsmooth(PBD - TPB * delTemp - 0.01, 1.0e-3) + 0.01;
|
PBD_t = `hypsmooth(PBD - TPB * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||||
PBSWS_t = hypsmooth(PBSWS - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01;
|
PBSWS_t = `hypsmooth(PBSWS - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||||
PBSWD_t = hypsmooth(PBSWD - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01;
|
PBSWD_t = `hypsmooth(PBSWD - TPBSW * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||||
PBSWGS_t = hypsmooth(PBSWGS - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01;
|
PBSWGS_t = `hypsmooth(PBSWGS - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||||
PBSWGD_t = hypsmooth(PBSWGD - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01;
|
PBSWGD_t = `hypsmooth(PBSWGD - TPBSWG * delTemp - 0.01, 1.0e-3) + 0.01;
|
||||||
|
|
||||||
T0 = Eg0 / Vtm0 - Eg / Vtm;
|
T0 = Eg0 / Vtm0 - Eg / Vtm;
|
||||||
T1 = `lln(TRatio);
|
T1 = `lln(TRatio);
|
||||||
|
|
@ -2571,19 +2561,19 @@ analog begin
|
||||||
JTSSWGD_t = JTSSWGD * (sqrt(JTWEFF / Weff0) + 1.0) * `lexp(Eg0 * XTSSWGD * (TRatio - 1.0) / Vtm);
|
JTSSWGD_t = JTSSWGD * (sqrt(JTWEFF / Weff0) + 1.0) * `lexp(Eg0 * XTSSWGD * (TRatio - 1.0) / Vtm);
|
||||||
|
|
||||||
// All NJT's Smoothed to 0.01 to Prevent Divide-by-zero / Negative Values
|
// All NJT's Smoothed to 0.01 to Prevent Divide-by-zero / Negative Values
|
||||||
NJTS_t = hypsmooth(NJTS * (1.0 + TNJTS * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
NJTS_t = `hypsmooth(NJTS * (1.0 + TNJTS * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||||
NJTSD_t = hypsmooth(NJTSD * (1.0 + TNJTSD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
NJTSD_t = `hypsmooth(NJTSD * (1.0 + TNJTSD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||||
NJTSSW_t = hypsmooth(NJTSSW * (1.0 + TNJTSSW * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
NJTSSW_t = `hypsmooth(NJTSSW * (1.0 + TNJTSSW * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||||
NJTSSWD_t = hypsmooth(NJTSSWD * (1.0 + TNJTSSWD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
NJTSSWD_t = `hypsmooth(NJTSSWD * (1.0 + TNJTSSWD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||||
NJTSSWG_t = hypsmooth(NJTSSWG * (1.0 + TNJTSSWG * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
NJTSSWG_t = `hypsmooth(NJTSSWG * (1.0 + TNJTSSWG * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||||
NJTSSWGD_t = hypsmooth(NJTSSWGD * (1.0 + TNJTSSWGD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
NJTSSWGD_t = `hypsmooth(NJTSSWGD * (1.0 + TNJTSSWGD * (TRatio-1.0)) - 0.01, 1.0e-3) + 0.01;
|
||||||
end
|
end
|
||||||
|
|
||||||
if (!$param_given(VFBSD)) begin
|
if (!$param_given(VFBSD)) begin
|
||||||
if (NGATE > 0.0) begin
|
if (NGATE > 0.0) begin
|
||||||
vfbsd = devsign * (hypsmooth(0.5 * Eg - Vtm * `lln(NGATE / ni), 1.0e-4) - (0.5 * Eg - devsign * (0.5 * Eg - hypsmooth(0.5 * Eg - Vtm * `lln(NSD / ni), 1.0e-4))));
|
vfbsd = devsign * (`hypsmooth(0.5 * Eg - Vtm * `lln(NGATE / ni), 1.0e-4) - (0.5 * Eg - devsign * (0.5 * Eg - `hypsmooth(0.5 * Eg - Vtm * `lln(NSD / ni), 1.0e-4))));
|
||||||
end else begin
|
end else begin
|
||||||
vfbsd = devsign * (PHIG_i - (EASUB + 0.5 * Eg - devsign * (0.5 * Eg - hypsmooth(0.5 * Eg - Vtm * `lln(NSD / ni), 1.0e-4))));
|
vfbsd = devsign * (PHIG_i - (EASUB + 0.5 * Eg - devsign * (0.5 * Eg - `hypsmooth(0.5 * Eg - Vtm * `lln(NSD / ni), 1.0e-4))));
|
||||||
end
|
end
|
||||||
end else begin
|
end else begin
|
||||||
vfbsd = VFBSD;
|
vfbsd = VFBSD;
|
||||||
|
|
@ -2642,7 +2632,7 @@ analog begin
|
||||||
T0 = `lexp(VjsmFwd / Nvtms);
|
T0 = `lexp(VjsmFwd / Nvtms);
|
||||||
IVjsmFwd = Isbs * (T0 - XExpBVS / T0 + XExpBVS - 1.0);
|
IVjsmFwd = Isbs * (T0 - XExpBVS / T0 + XExpBVS - 1.0);
|
||||||
SslpFwd = Isbs * (T0 + XExpBVS / T0) / Nvtms;
|
SslpFwd = Isbs * (T0 + XExpBVS / T0) / Nvtms;
|
||||||
T2 = hypsmooth(IJTHSREV / Isbs - 10.0, 1.0e-3) + 10.0;
|
T2 = `hypsmooth(IJTHSREV / Isbs - 10.0, 1.0e-3) + 10.0;
|
||||||
VjsmRev = -BVS - Nvtms * `lln((T2 - 1.0) / XJBVS);
|
VjsmRev = -BVS - Nvtms * `lln((T2 - 1.0) / XJBVS);
|
||||||
T1 = XJBVS * `lexp(-(BVS + VjsmRev) / Nvtms);
|
T1 = XJBVS * `lexp(-(BVS + VjsmRev) / Nvtms);
|
||||||
IVjsmRev = Isbs * (1.0 + T1);
|
IVjsmRev = Isbs * (1.0 + T1);
|
||||||
|
|
@ -2660,7 +2650,7 @@ analog begin
|
||||||
T0 = `lexp(VjdmFwd / Nvtmd);
|
T0 = `lexp(VjdmFwd / Nvtmd);
|
||||||
IVjdmFwd = Isbd * (T0 - XExpBVD / T0 + XExpBVD - 1.0);
|
IVjdmFwd = Isbd * (T0 - XExpBVD / T0 + XExpBVD - 1.0);
|
||||||
DslpFwd = Isbd * (T0 + XExpBVD / T0) / Nvtmd;
|
DslpFwd = Isbd * (T0 + XExpBVD / T0) / Nvtmd;
|
||||||
T2 = hypsmooth(IJTHDREV / Isbd - 10.0, 1.0e-3) + 10.0;
|
T2 = `hypsmooth(IJTHDREV / Isbd - 10.0, 1.0e-3) + 10.0;
|
||||||
VjdmRev = -BVD - Nvtmd * `lln((T2 - 1.0) / XJBVD);
|
VjdmRev = -BVD - Nvtmd * `lln((T2 - 1.0) / XJBVD);
|
||||||
T1 = XJBVD * `lexp(-(BVD + VjdmRev) / Nvtmd);
|
T1 = XJBVD * `lexp(-(BVD + VjdmRev) / Nvtmd);
|
||||||
IVjdmRev = Isbd * (1.0 + T1);
|
IVjdmRev = Isbd * (1.0 + T1);
|
||||||
|
|
@ -2807,13 +2797,13 @@ analog begin
|
||||||
beta0 = u0_a * cox * Weff0 / Leff;
|
beta0 = u0_a * cox * Weff0 / Leff;
|
||||||
T0 = -(dvch_qm + nVtm * `lln(2.0 * cox * Imin / (beta0 * nVtm * `q * Nc * TFIN)));
|
T0 = -(dvch_qm + nVtm * `lln(2.0 * cox * Imin / (beta0 * nVtm * `q * Nc * TFIN)));
|
||||||
T1 = vgsfb + T0 + DELVTRAND;
|
T1 = vgsfb + T0 + DELVTRAND;
|
||||||
vgsfbeff = hypsmooth(T1 , 1.0e-4) - T0;
|
vgsfbeff = `hypsmooth(T1 , 1.0e-4) - T0;
|
||||||
|
|
||||||
// Core Model Calculation at Source Side
|
// Core Model Calculation at Source Side
|
||||||
vch = 0.0 + dvch_qm;
|
vch = 0.0 + dvch_qm;
|
||||||
|
|
||||||
if (BULKMOD != 0) begin
|
if (BULKMOD != 0) begin
|
||||||
T1 = hypsmooth(2.0 * phib + vch - ves, 0.1);
|
T1 = `hypsmooth(2.0 * phib + vch - ves, 0.1);
|
||||||
T3 = (-K1_t / (2.0 * nVtm)) * (sqrt(T1) - sqrt(2.0 * phib));
|
T3 = (-K1_t / (2.0 * nVtm)) * (sqrt(T1) - sqrt(2.0 * phib));
|
||||||
T0 = -qdep - T3 + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0/3.0);
|
T0 = -qdep - T3 + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0/3.0);
|
||||||
T1 = -qdep - T3 + vth_fixed_factor_SI;
|
T1 = -qdep - T3 + vth_fixed_factor_SI;
|
||||||
|
|
@ -2887,7 +2877,7 @@ analog begin
|
||||||
Tc = T6 * (EsatL + 2.0 * T6 * T0);
|
Tc = T6 * (EsatL + 2.0 * T6 * T0);
|
||||||
Vdsat = (Tb - sqrt(Tb * Tb - 2.0 * Ta * Tc)) / Ta;
|
Vdsat = (Tb - sqrt(Tb * Tb - 2.0 * Ta * Tc)) / Ta;
|
||||||
end
|
end
|
||||||
Vdsat = hypsmooth(Vdsat - 1.0e-3, 1.0e-5) + 1.0e-3;
|
Vdsat = `hypsmooth(Vdsat - 1.0e-3, 1.0e-5) + 1.0e-3;
|
||||||
T7 = pow(vds / Vdsat , MEXP_a);
|
T7 = pow(vds / Vdsat , MEXP_a);
|
||||||
T8 = pow(1.0 + T7, inv_MEXP);
|
T8 = pow(1.0 + T7, inv_MEXP);
|
||||||
Vdseff = vds / T8;
|
Vdseff = vds / T8;
|
||||||
|
|
@ -2900,7 +2890,7 @@ analog begin
|
||||||
vch = Vdseff + dvch_qm;
|
vch = Vdseff + dvch_qm;
|
||||||
|
|
||||||
if (BULKMOD != 0) begin
|
if (BULKMOD != 0) begin
|
||||||
T1 = hypsmooth(2.0 * phib + vch - ves, 0.1);
|
T1 = `hypsmooth(2.0 * phib + vch - ves, 0.1);
|
||||||
T3 = (-K1_t / (2.0 * nVtm)) * (sqrt(T1) - sqrt(2.0 * phib));
|
T3 = (-K1_t / (2.0 * nVtm)) * (sqrt(T1) - sqrt(2.0 * phib));
|
||||||
T0 = -qdep - T3 + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0 / 3.0);
|
T0 = -qdep - T3 + vth_fixed_factor_Sub + QMFACTORCVfinal * pow(-qdep, 2.0 / 3.0);
|
||||||
T1 = -qdep - T3 + vth_fixed_factor_SI;
|
T1 = -qdep - T3 + vth_fixed_factor_SI;
|
||||||
|
|
@ -3103,7 +3093,7 @@ analog begin
|
||||||
|
|
||||||
// Body-Effect Factor for BULKMOD = 2
|
// Body-Effect Factor for BULKMOD = 2
|
||||||
if (BULKMOD == 2) begin
|
if (BULKMOD == 2) begin
|
||||||
T0 = hypsmooth((K2_t + K2SAT_t * vdsx), 1.0e-6);
|
T0 = `hypsmooth((K2_t + K2SAT_t * vdsx), 1.0e-6);
|
||||||
T1 = T0 / (max(0, K2SI_t + K2SISAT_t * dqi * dqi) * qia + 2.0 * nVtm);
|
T1 = T0 / (max(0, K2SI_t + K2SISAT_t * dqi * dqi) * qia + 2.0 * nVtm);
|
||||||
T3 = sqrt(PHIBE_i - veseff) - sqrt(PHIBE_i);
|
T3 = sqrt(PHIBE_i - veseff) - sqrt(PHIBE_i);
|
||||||
Mob = `lexp(- T1 * T3);
|
Mob = `lexp(- T1 * T3);
|
||||||
|
|
@ -3212,9 +3202,9 @@ analog begin
|
||||||
end else begin
|
end else begin
|
||||||
T0 = ESATII_i * Leff;
|
T0 = ESATII_i * Leff;
|
||||||
T1 = SII0_t * T0 / (1.0 + T0);
|
T1 = SII0_t * T0 / (1.0 + T0);
|
||||||
T0 = 1.0 / (1.0 + hypsmooth(SII1_i * vgsfbeff, IIMOD2CLAMP1)); // T0 = 1 / (1 + SII1_i * vgsfbeff)
|
T0 = 1.0 / (1.0 + `hypsmooth(SII1_i * vgsfbeff, IIMOD2CLAMP1)); // T0 = 1 / (1 + SII1_i * vgsfbeff)
|
||||||
T3 = T0 + SII2_i;
|
T3 = T0 + SII2_i;
|
||||||
T2 = hypsmooth(vgsfbeff * T3, IIMOD2CLAMP2); // T2 = vgsfbeff * T3
|
T2 = `hypsmooth(vgsfbeff * T3, IIMOD2CLAMP2); // T2 = vgsfbeff * T3
|
||||||
T3 = 1.0 / (1.0 + SIID_i * vds);
|
T3 = 1.0 / (1.0 + SIID_i * vds);
|
||||||
VgsStep = T1 * T2 * T3;
|
VgsStep = T1 * T2 * T3;
|
||||||
Vdsatii = VgsStep * (1.0 - LII_i / Leff);
|
Vdsatii = VgsStep * (1.0 - LII_i / Leff);
|
||||||
|
|
@ -3293,7 +3283,7 @@ analog begin
|
||||||
T0 = vgs_noswap - vfbsd;
|
T0 = vgs_noswap - vfbsd;
|
||||||
vgs_eff = sqrt(T0 * T0 + 1.0e-4);
|
vgs_eff = sqrt(T0 * T0 + 1.0e-4);
|
||||||
if (IGCLAMP == 1) begin
|
if (IGCLAMP == 1) begin
|
||||||
T1 = hypsmooth((AIGS_t - BIGS_i * vgs_eff), 1.0e-6);
|
T1 = `hypsmooth((AIGS_t - BIGS_i * vgs_eff), 1.0e-6);
|
||||||
if (CIGS_i < 0.01) begin
|
if (CIGS_i < 0.01) begin
|
||||||
CIGS_i = 0.01;
|
CIGS_i = 0.01;
|
||||||
end
|
end
|
||||||
|
|
@ -3313,7 +3303,7 @@ analog begin
|
||||||
T0 = vgd_noswap - vfbsd;
|
T0 = vgd_noswap - vfbsd;
|
||||||
vgd_eff = sqrt(T0 * T0 + 1.0e-4);
|
vgd_eff = sqrt(T0 * T0 + 1.0e-4);
|
||||||
if (IGCLAMP == 1) begin
|
if (IGCLAMP == 1) begin
|
||||||
T1 = hypsmooth((AIGD_t - BIGD_i * vgd_eff), 1.0e-6);
|
T1 = `hypsmooth((AIGD_t - BIGD_i * vgd_eff), 1.0e-6);
|
||||||
if (CIGD_i < 0.01) begin
|
if (CIGD_i < 0.01) begin
|
||||||
CIGD_i = 0.01;
|
CIGD_i = 0.01;
|
||||||
end
|
end
|
||||||
|
|
@ -3342,13 +3332,13 @@ analog begin
|
||||||
T6 = 0.0;
|
T6 = 0.0;
|
||||||
end else begin
|
end else begin
|
||||||
T1 = (-vgd_noswap - EGIDL_i + vfbsd) / T0;
|
T1 = (-vgd_noswap - EGIDL_i + vfbsd) / T0;
|
||||||
T1 = hypsmooth(T1, 1.0e-2);
|
T1 = `hypsmooth(T1, 1.0e-2);
|
||||||
T2 = BGIDL_t / (T1 + 1.0e-3);
|
T2 = BGIDL_t / (T1 + 1.0e-3);
|
||||||
T3 = `lexp(PGIDL_i * `lln(T1));
|
T3 = `lexp(PGIDL_i * `lln(T1));
|
||||||
if (BULKMOD != 0) begin
|
if (BULKMOD != 0) begin
|
||||||
T4 = -ved_jct*ved_jct*ved_jct;
|
T4 = -ved_jct*ved_jct*ved_jct;
|
||||||
T4a = CGIDL_i + abs(T4) + 1.0e-5;
|
T4a = CGIDL_i + abs(T4) + 1.0e-5;
|
||||||
T5 = hypsmooth(T4/T4a, 1.0e-6) - 1.0e-6;
|
T5 = `hypsmooth(T4/T4a, 1.0e-6) - 1.0e-6;
|
||||||
T6 = AGIDL_i * Weff0 * T3 * `lexp(-T2) * T5;
|
T6 = AGIDL_i * Weff0 * T3 * `lexp(-T2) * T5;
|
||||||
end else begin
|
end else begin
|
||||||
T6 = AGIDL_i * Weff0 * T3 * `lexp(-T2) * vds_noswap;
|
T6 = AGIDL_i * Weff0 * T3 * `lexp(-T2) * vds_noswap;
|
||||||
|
|
@ -3366,13 +3356,13 @@ analog begin
|
||||||
T6 = 0.0;
|
T6 = 0.0;
|
||||||
end else begin
|
end else begin
|
||||||
T1 = (-vgs_noswap - EGISL_i + vfbsd) / T0;
|
T1 = (-vgs_noswap - EGISL_i + vfbsd) / T0;
|
||||||
T1 = hypsmooth(T1, 1.0e-2);
|
T1 = `hypsmooth(T1, 1.0e-2);
|
||||||
T2 = BGISL_t / (T1 + 1.0e-3);
|
T2 = BGISL_t / (T1 + 1.0e-3);
|
||||||
T3 = `lexp(PGISL_i * `lln(T1));
|
T3 = `lexp(PGISL_i * `lln(T1));
|
||||||
if (BULKMOD != 0) begin
|
if (BULKMOD != 0) begin
|
||||||
T4 = -ves_jct * ves_jct * ves_jct;
|
T4 = -ves_jct * ves_jct * ves_jct;
|
||||||
T4a = CGISL_i + abs(T4) + 1.0e-5;
|
T4a = CGISL_i + abs(T4) + 1.0e-5;
|
||||||
T5 = hypsmooth(T4/T4a, 1.0e-6) - 1.0e-6;
|
T5 = `hypsmooth(T4/T4a, 1.0e-6) - 1.0e-6;
|
||||||
T6 = AGISL_i * Weff0 * T3 * `lexp(-T2) * T5;
|
T6 = AGISL_i * Weff0 * T3 * `lexp(-T2) * T5;
|
||||||
end else
|
end else
|
||||||
T6 = AGISL_i * Weff0 * T3 * `lexp(-T2) * (-vds_noswap);
|
T6 = AGISL_i * Weff0 * T3 * `lexp(-T2) * (-vds_noswap);
|
||||||
|
|
|
||||||
|
|
@ -72,6 +72,10 @@
|
||||||
`define lln(x) \
|
`define lln(x) \
|
||||||
ln(max((x) , `N_MINLOG))
|
ln(max((x) , `N_MINLOG))
|
||||||
|
|
||||||
|
// Hyperbolic Smoothing Function
|
||||||
|
`define hypsmooth(x,c) \
|
||||||
|
(0.5 * ((x) + sqrt((x)*(x) + 4.0*(c)*(c))))
|
||||||
|
|
||||||
// Mathematical functions
|
// Mathematical functions
|
||||||
//`define SINH(x) (0.5 * (`lexp(x) - `lexp(-(x))))
|
//`define SINH(x) (0.5 * (`lexp(x) - `lexp(-(x))))
|
||||||
`define COSH(x) (0.5 * (`lexp(x) + `lexp(-(x))))
|
`define COSH(x) (0.5 * (`lexp(x) + `lexp(-(x))))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue