📄 b3soifdld.c
字号:
T0 = log(pParam->B3SOIFDnpeak / pParam->B3SOIFDnsub); vfbb = -model->B3SOIFDtype * Vtm*T0; dvfbb_dT = -model->B3SOIFDtype * KboQ*T0; } else { T0 = log(-pParam->B3SOIFDnpeak*pParam->B3SOIFDnsub/ni/ni); vfbb = -model->B3SOIFDtype * Vtm*T0; dvfbb_dT = -model->B3SOIFDtype * (KboQ * T0 + Vtm * 2.0 * dni_dT / ni); }/* phi = 2.0 * Vtm * log(pParam->B3SOIFDnpeak / ni); */ phi = here->B3SOIFDphi; sqrtPhi = sqrt(phi); Xdep0 = sqrt(2.0 * EPSSI / (Charge_q * pParam->B3SOIFDnpeak * 1.0e6)) * sqrtPhi; /* Save the values below for phi calculation in B3SOIFDaccept() */ here->B3SOIFDvtm = Vtm; here->B3SOIFDni = ni; /* Use dTx_dVe variables to act as dTx_dT variables */ T8 = 1 / model->B3SOIFDtnom; T7 = model->B3SOIFDxbjt / pParam->B3SOIFDndiode; T0 = pow(TempRatio, T7); dT0_dVe = T7 * pow(TempRatio, T7 - 1.0) * T8; T7 = model->B3SOIFDxdif / pParam->B3SOIFDndiode; T1 = pow(TempRatio, T7); dT1_dVe = T7 * pow(TempRatio, T7 - 1.0) * T8; T7 = model->B3SOIFDxrec / pParam->B3SOIFDndiode / 2.0; T2 = pow(TempRatio, T7); dT2_dVe = T7 * pow(TempRatio, T7 - 1.0) * T8; T3 = TempRatio - 1.0; T4 = Eg300 / pParam->B3SOIFDndiode / Vtm * T3; dT4_dVe = Eg300 / pParam->B3SOIFDndiode / Vtm / Vtm * (Vtm * T8 - T3 * KboQ); T5 = exp(T4); dT5_dVe = dT4_dVe * T5; T6 = sqrt(T5); dT6_dVe = 0.5 / T6 * dT5_dVe; jbjt = pParam->B3SOIFDisbjt * T0 * T5; jdif = pParam->B3SOIFDisdif * T1 * T5; jrec = pParam->B3SOIFDisrec * T2 * T6; djbjt_dT = pParam->B3SOIFDisbjt * (T0 * dT5_dVe + T5 * dT0_dVe); djdif_dT = pParam->B3SOIFDisdif * (T1 * dT5_dVe + T5 * dT1_dVe); djrec_dT = pParam->B3SOIFDisrec * (T2 * dT6_dVe + T6 * dT2_dVe); T7 = model->B3SOIFDxtun / pParam->B3SOIFDntun; T0 = pow(TempRatio, T7); jtun = pParam->B3SOIFDistun * T0; djtun_dT = pParam->B3SOIFDistun * T7 * pow(TempRatio, T7 - 1.0) * T8; u0temp = pParam->B3SOIFDu0 * pow(TempRatio, pParam->B3SOIFDute); du0temp_dT = pParam->B3SOIFDu0 * pParam->B3SOIFDute * pow(TempRatio, pParam->B3SOIFDute - 1.0) * T8; vsattemp = pParam->B3SOIFDvsat - pParam->B3SOIFDat * T3; dvsattemp_dT = -pParam->B3SOIFDat * T8; rds0 = (pParam->B3SOIFDrdsw + pParam->B3SOIFDprt * T3) / pParam->B3SOIFDrds0denom; drds0_dT = pParam->B3SOIFDprt / pParam->B3SOIFDrds0denom * T8; ua = pParam->B3SOIFDuatemp + pParam->B3SOIFDua1 * T3; ub = pParam->B3SOIFDubtemp + pParam->B3SOIFDub1 * T3; uc = pParam->B3SOIFDuctemp + pParam->B3SOIFDuc1 * T3; dua_dT = pParam->B3SOIFDua1 * T8; dub_dT = pParam->B3SOIFDub1 * T8; duc_dT = pParam->B3SOIFDuc1 * T8; } else { vbi = pParam->B3SOIFDvbi; vfbb = pParam->B3SOIFDvfbb; phi = pParam->B3SOIFDphi; sqrtPhi = pParam->B3SOIFDsqrtPhi; Xdep0 = pParam->B3SOIFDXdep0; jbjt = pParam->B3SOIFDjbjt; jdif = pParam->B3SOIFDjdif; jrec = pParam->B3SOIFDjrec; jtun = pParam->B3SOIFDjtun; u0temp = pParam->B3SOIFDu0temp; vsattemp = pParam->B3SOIFDvsattemp; rds0 = pParam->B3SOIFDrds0; ua = pParam->B3SOIFDua; ub = pParam->B3SOIFDub; uc = pParam->B3SOIFDuc; dni_dT = dvbi_dT = dvfbb_dT = djbjt_dT = djdif_dT = 0.0; djrec_dT = djtun_dT = du0temp_dT = dvsattemp_dT = 0.0; drds0_dT = dua_dT = dub_dT = duc_dT = 0.0; } /* TempRatio used for Vth and mobility */ if (selfheat) { TempRatio = Temp / model->B3SOIFDtnom - 1.0; } else { TempRatio = ckt->CKTtemp / model->B3SOIFDtnom - 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; if (vds >= 0.0) { /* normal mode */ here->B3SOIFDmode = 1; Vds = vds; Vgs = vgs; Vbs = vbs; Vbd = vbd; Ves = ves; Vps = vps; } else { /* inverse mode */ here->B3SOIFDmode = -1; Vds = -vds; Vgs = vgd; Vbs = vbd; Vbd = vbs; Ves = ved; Vps = vpd; } if (here->B3SOIFDdebugMod > 2) { fprintf(fpdebug, "Vgs=%.4f, Vds=%.4f, Vbs=%.4f, ", Vgs, Vds, Vbs); fprintf(fpdebug, "Ves=%.4f, Vps=%.4f, Temp=%.1f\n", Ves, Vps, Temp); } Vesfb = Ves - vfbb; Cbox = model->B3SOIFDcbox; K1 = pParam->B3SOIFDk1; ChargeComputationNeeded = ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) ? 1 : 0; if (here->B3SOIFDdebugMod == -1) ChargeComputationNeeded = 1; /* Poly Gate Si Depletion Effect */ T0 = pParam->B3SOIFDvfb + phi; if ((pParam->B3SOIFDngate > 1.e18) && (pParam->B3SOIFDngate < 1.e25) && (Vgs > T0)) /* added to avoid the problem caused by ngate */ { T1 = 1.0e6 * Charge_q * EPSSI * pParam->B3SOIFDngate / (model->B3SOIFDcox * model->B3SOIFDcox); 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; } Leff = pParam->B3SOIFDleff; if (selfheat) { Vtm = KboQ * Temp; dVtm_dT = KboQ; } else { Vtm = model->B3SOIFDvtm; dVtm_dT = 0.0; } V0 = vbi - phi;/* Prepare Vbs0t */ T0 = -pParam->B3SOIFDdvbd1 * pParam->B3SOIFDleff / pParam->B3SOIFDlitl; T1 = pParam->B3SOIFDdvbd0 * (exp(0.5*T0) + 2*exp(T0)); T2 = T1 * (vbi - phi); T3 = 0.5 * model->B3SOIFDqsi / model->B3SOIFDcsi; Vbs0t = phi - T3 + pParam->B3SOIFDvbsa + T2; if (selfheat) dVbs0t_dT = T1 * dvbi_dT; else dVbs0t_dT = 0.0;/* Prepare Vbs0 */ T0 = 1 + model->B3SOIFDcsieff / Cbox; T1 = pParam->B3SOIFDkb1 / T0; T2 = T1 * (Vbs0t - Vesfb); /* T6 is Vbs0 before limiting */ T6 = Vbs0t - T2; dT6_dVe = T1; if (selfheat) dT6_dT = dVbs0t_dT - T1 * (dVbs0t_dT + dvfbb_dT); else dT6_dT = 0.0; /* limit Vbs0 to below phi */ T1 = phi - pParam->B3SOIFDdelp; T2 = T1 - T6 - DELT_Vbseff; T3 = sqrt(T2 * T2 + 4.0 * DELT_Vbseff); Vbs0 = T1 - 0.5 * (T2 + T3); T4 = 0.5 * (1 + T2/T3); dVbs0_dVe = T4 * dT6_dVe; if (selfheat) dVbs0_dT = T4 * dT6_dT; else dVbs0_dT = 0.0; T1 = Vbs0t - Vbs0 - DELT_Vbsmos; T2 = sqrt(T1 * T1 + DELT_Vbsmos * DELT_Vbsmos); T3 = 0.5 * (T1 + T2); T4 = T3 * model->B3SOIFDcsieff / model->B3SOIFDqsieff; Vbs0mos = Vbs0 - 0.5 * T3 * T4; T5 = 0.5 * T4 * (1 + T1 / T2); dVbs0mos_dVe = dVbs0_dVe * (1 + T5); if (selfheat) dVbs0mos_dT = dVbs0_dT - (dVbs0t_dT - dVbs0_dT) * T5; else dVbs0mos_dT = 0.0;/* Prepare Vthfd - treat Vbs0mos as if it were independent variable Vb */ Phis = phi - Vbs0mos; dPhis_dVb = -1; sqrtPhis = sqrt(Phis); dsqrtPhis_dVb = -0.5 / sqrtPhis; Xdep = Xdep0 * sqrtPhis / sqrtPhi; dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb; sqrtXdep = sqrt(Xdep); T0 = pParam->B3SOIFDdvt2 * Vbs0mos; if (T0 >= - 0.5) { T1 = 1.0 + T0; T2 = pParam->B3SOIFDdvt2; } 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->B3SOIFDdvt2 * T4 * T4; } lt1 = model->B3SOIFDfactor1 * sqrtXdep * T1; dlt1_dVb = model->B3SOIFDfactor1 * (0.5 / sqrtXdep * T1 * dXdep_dVb + sqrtXdep * T2); T0 = pParam->B3SOIFDdvt2w * Vbs0mos; if (T0 >= - 0.5) { T1 = 1.0 + T0; T2 = pParam->B3SOIFDdvt2w; } 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->B3SOIFDdvt2w * T4 * T4; } ltw= model->B3SOIFDfactor1 * sqrtXdep * T1; dltw_dVb = model->B3SOIFDfactor1 * (0.5 / sqrtXdep * T1 * dXdep_dVb + sqrtXdep * T2); T0 = -0.5 * pParam->B3SOIFDdvt1 * Leff / lt1; if (T0 > -EXP_THRESHOLD) { T1 = exp(T0); dT1_dVb = -T0 / lt1 * T1 * dlt1_dVb; Theta0 = T1 * (1.0 + 2.0 * T1); dTheta0_dVb = (1.0 + 4.0 * T1) * dT1_dVb; } else { T1 = MIN_EXP; Theta0 = T1 * (1.0 + 2.0 * T1); dTheta0_dVb = 0.0; } here->B3SOIFDthetavth = pParam->B3SOIFDdvt0 * Theta0; Delt_vth = here->B3SOIFDthetavth * V0; dDelt_vth_dVb = pParam->B3SOIFDdvt0 * dTheta0_dVb * V0; if (selfheat) dDelt_vth_dT = here->B3SOIFDthetavth * dvbi_dT; else dDelt_vth_dT = 0.0; T0 = -0.5*pParam->B3SOIFDdvt1w * pParam->B3SOIFDweff*Leff/ltw; if (T0 > -EXP_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_EXP; T2 = T1 * (1.0 + 2.0 * T1); dT2_dVb = 0.0; } T0 = pParam->B3SOIFDdvt0w * T2; DeltVthw = T0 * V0; dDeltVthw_dVb = pParam->B3SOIFDdvt0w * dT2_dVb * V0; if (selfheat) dDeltVthw_dT = T0 * dvbi_dT; else dDeltVthw_dT = 0.0; T0 = sqrt(1.0 + pParam->B3SOIFDnlx / Leff); T1 = (pParam->B3SOIFDkt1 + pParam->B3SOIFDkt1l / Leff + pParam->B3SOIFDkt2 * Vbs0mos); DeltVthtemp = pParam->B3SOIFDk1 * (T0 - 1.0) * sqrtPhi + T1 * TempRatio; if (selfheat) dDeltVthtemp_dT = T1 / model->B3SOIFDtnom; else dDeltVthtemp_dT = 0.0; tmp2 = model->B3SOIFDtox * phi / (pParam->B3SOIFDweff + pParam->B3SOIFDw0); T3 = pParam->B3SOIFDeta0 + pParam->B3SOIFDetab * Vbs0mos; 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->B3SOIFDetab; dT3_dVb = T4; } else { dT3_dVb = pParam->B3SOIFDetab; } DIBL_Sft = T3 * pParam->B3SOIFDtheta0vb0 * Vds; dDIBL_Sft_dVd = T3 * pParam->B3SOIFDtheta0vb0; dDIBL_Sft_dVb = pParam->B3SOIFDtheta0vb0 * Vds * dT3_dVb; Vthfd = model->B3SOIFDtype * pParam->B3SOIFDvth0 + pParam->B3SOIFDk1 * (sqrtPhis - sqrtPhi) - pParam->B3SOIFDk2 * Vbs0mos-Delt_vth-DeltVthw +(pParam->B3SOIFDk3 +pParam->B3SOIFDk3b * Vbs0mos) * tmp2 + DeltVthtemp - DIBL_Sft; T6 = pParam->B3SOIFDk3b * tmp2 - pParam->B3SOIFDk2 + pParam->B3SOIFDkt2 * TempRatio;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -