📄 b3soifdld.c
字号:
dVthfd_dVd = -dDIBL_Sft_dVd; T7 = pParam->B3SOIFDk1 * dsqrtPhis_dVb - dDelt_vth_dVb - dDeltVthw_dVb + T6 - dDIBL_Sft_dVb; dVthfd_dVe = T7 * dVbs0mos_dVe; if (selfheat) dVthfd_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT + T7 * dVbs0mos_dT; else dVthfd_dT = 0.0;/* Effective Vbs0 and Vbs0t for all Vgs */ T1 = Vthfd - Vgs_eff - DELT_Vbs0eff; T2 = sqrt(T1 * T1 + DELT_Vbs0eff * DELT_Vbs0eff ); Vbs0teff = Vbs0t - 0.5 * (T1 + T2); dVbs0teff_dVg = 0.5 * (1 + T1/T2) * dVgs_eff_dVg; dVbs0teff_dVd = - 0.5 * (1 + T1 / T2) * dVthfd_dVd; dVbs0teff_dVe = - 0.5 * (1 + T1 / T2) * dVthfd_dVe; if (selfheat) dVbs0teff_dT = dVbs0t_dT - 0.5 * (1 + T1 / T2) * dVthfd_dT; else dVbs0teff_dT = 0.0; /* Calculate nfb */ T3 = 1 / (K1 * K1); T4 = pParam->B3SOIFDkb3 * Cbox / model->B3SOIFDcox; T8 = sqrt(phi - Vbs0mos); T5 = sqrt(1 + 4 * T3 * (phi + K1 * T8 - Vbs0mos)); T6 = 1 + T4 * T5; Nfb = model->B3SOIFDnfb = 1 / T6; T7 = 2 * T3 * T4 * Nfb * Nfb / T5 * (0.5 * K1 / T8 + 1); Vbs0eff = Vbs0 - Nfb * 0.5 * (T1 + T2); dVbs0eff_dVg = Nfb * 0.5 * (1 + T1/T2) * dVgs_eff_dVg; dVbs0eff_dVd = - Nfb * 0.5 * (1 + T1 / T2) * dVthfd_dVd; dVbs0eff_dVe = dVbs0_dVe - Nfb * 0.5 * (1 + T1 / T2) * dVthfd_dVe - T7 * 0.5 * (T1 + T2) * dVbs0mos_dVe; if (selfheat) dVbs0eff_dT = dVbs0_dT - Nfb * 0.5 * (1 + T1 / T2) * dVthfd_dT - T7 * 0.5 * (T1 + T2) * dVbs0mos_dT; else dVbs0eff_dT = 0.0;/* Simple check of Vbs *//* Prepare Vbsdio */ Vbs = Vbsdio = Vbs0eff; dVbsdio_dVg = dVbs0eff_dVg; dVbsdio_dVd = dVbs0eff_dVd; dVbsdio_dVe = dVbs0eff_dVe; dVbsdio_dT = dVbs0eff_dT; dVbsdio_dVb = 0.0;/* Prepare Vbseff */ T1 = Vbs0teff - Vbsdio - DELT_Vbsmos; T2 = sqrt(T1 * T1 + DELT_Vbsmos * DELT_Vbsmos); T3 = 0.5 * (T1 + T2); T5 = 0.5 * (1 + T1/T2); dT3_dVg = T5 * (dVbs0teff_dVg - dVbsdio_dVg); dT3_dVd = T5 * (dVbs0teff_dVd - dVbsdio_dVd); dT3_dVb = - T5 * dVbsdio_dVb; dT3_dVe = T5 * (dVbs0teff_dVe - dVbsdio_dVe); if (selfheat) dT3_dT = T5 * (dVbs0teff_dT - dVbsdio_dT); else dT3_dT = 0.0; T4 = T3 * model->B3SOIFDcsieff / model->B3SOIFDqsieff; Vbsmos = Vbsdio - 0.5 * T3 * T4; dVbsmos_dVg = dVbsdio_dVg - T4 * dT3_dVg; dVbsmos_dVd = dVbsdio_dVd - T4 * dT3_dVd; dVbsmos_dVb = dVbsdio_dVb - T4 * dT3_dVb; dVbsmos_dVe = dVbsdio_dVe - T4 * dT3_dVe; if (selfheat) dVbsmos_dT = dVbsdio_dT - T4 * dT3_dT; else dVbsmos_dT = 0.0;/* Prepare Vcs */ Vcs = Vbsdio - Vbs0eff; dVcs_dVb = dVbsdio_dVb; dVcs_dVg = dVbsdio_dVg - dVbs0eff_dVg; dVcs_dVd = dVbsdio_dVd - dVbs0eff_dVd; dVcs_dVe = dVbsdio_dVe - dVbs0eff_dVe; dVcs_dT = dVbsdio_dT - dVbs0eff_dT;/* Check Vps */ /* Note : if Vps is less Vbs0eff => non-physical */ T1 = Vps - Vbs0eff + DELT_Vbs0dio; T2 = sqrt(T1 * T1 + DELT_Vbs0dio * DELT_Vbs0dio); T3 = 0.5 * (1 + T1/T2); Vpsdio = Vbs0eff + 0.5 * (T1 + T2); dVpsdio_dVg = (1 - T3) * dVbs0eff_dVg; dVpsdio_dVd = (1 - T3) * dVbs0eff_dVd; dVpsdio_dVe = (1 - T3) * dVbs0eff_dVe; if (selfheat) dVpsdio_dT = (1 - T3) * dVbs0eff_dT; else dVpsdio_dT = 0.0; dVpsdio_dVp = T3; Vbp = Vbsdio - Vpsdio; dVbp_dVb = dVbsdio_dVb; dVbp_dVg = dVbsdio_dVg - dVpsdio_dVg; dVbp_dVd = dVbsdio_dVd - dVpsdio_dVd; dVbp_dVe = dVbsdio_dVe - dVpsdio_dVe; dVbp_dT = dVbsdio_dT - dVpsdio_dT; dVbp_dVp = - dVpsdio_dVp; here->B3SOIFDvbsdio = Vbsdio; here->B3SOIFDvbs0eff = Vbs0eff; T1 = phi - pParam->B3SOIFDdelp; T2 = T1 - Vbsmos - DELT_Vbseff; T3 = sqrt(T2 * T2 + 4.0 * DELT_Vbseff * T1); Vbseff = T1 - 0.5 * (T2 + T3); T4 = 0.5 * (1 + T2/T3); dVbseff_dVg = T4 * dVbsmos_dVg; dVbseff_dVd = T4 * dVbsmos_dVd; dVbseff_dVb = T4 * dVbsmos_dVb; dVbseff_dVe = T4 * dVbsmos_dVe; if (selfheat) dVbseff_dT = T4 * dVbsmos_dT; else dVbseff_dT = 0.0; here->B3SOIFDvbseff = Vbseff; Phis = phi - Vbseff; dPhis_dVb = -1; sqrtPhis = sqrt(Phis); dsqrtPhis_dVb = -0.5 / sqrtPhis ; Xdep = Xdep0 * sqrtPhis / sqrtPhi; dXdep_dVb = (Xdep0 / sqrtPhi) * dsqrtPhis_dVb;/* Vth Calculation */ T3 = sqrt(Xdep); T0 = pParam->B3SOIFDdvt2 * Vbseff; 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 * T3 * T1; dlt1_dVb =model->B3SOIFDfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2); T0 = pParam->B3SOIFDdvt2w * Vbseff; 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 * T3 * T1; dltw_dVb=model->B3SOIFDfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2); T0 = -0.5 * pParam->B3SOIFDdvt1 * Leff / lt1; if (T0 > -EXP_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_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 * Vbseff); 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 * 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->B3SOIFDetab; dT3_dVb = T4 ; } else { dT3_dVb = pParam->B3SOIFDetab ; } DIBL_Sft = T3 * pParam->B3SOIFDtheta0vb0 * Vds; dDIBL_Sft_dVd = pParam->B3SOIFDtheta0vb0 * T3; dDIBL_Sft_dVb = pParam->B3SOIFDtheta0vb0 * Vds * dT3_dVb; Vth = model->B3SOIFDtype * pParam->B3SOIFDvth0 + pParam->B3SOIFDk1 * (sqrtPhis - sqrtPhi) - pParam->B3SOIFDk2 * Vbseff- Delt_vth - DeltVthw +(pParam->B3SOIFDk3 + pParam->B3SOIFDk3b * Vbseff) * tmp2 + DeltVthtemp - DIBL_Sft; here->B3SOIFDvon = Vth; T6 = pParam->B3SOIFDk3b * tmp2 - pParam->B3SOIFDk2 + pParam->B3SOIFDkt2 * TempRatio; dVth_dVb = pParam->B3SOIFDk1 * dsqrtPhis_dVb - dDelt_vth_dVb - dDeltVthw_dVb + T6 - dDIBL_Sft_dVb; /* this is actually dVth_dVbseff */ dVth_dVd = -dDIBL_Sft_dVd; if (selfheat) dVth_dT = dDeltVthtemp_dT - dDelt_vth_dT - dDeltVthw_dT; else dVth_dT = 0.0;/* Calculate n */ T2 = pParam->B3SOIFDnfactor * EPSSI / Xdep; dT2_dVb = - T2 / Xdep * dXdep_dVb; T3 = pParam->B3SOIFDcdsc + pParam->B3SOIFDcdscb * Vbseff + pParam->B3SOIFDcdscd * Vds; dT3_dVb = pParam->B3SOIFDcdscb; dT3_dVd = pParam->B3SOIFDcdscd; T4 = (T2 + T3 * Theta0 + pParam->B3SOIFDcit) / model->B3SOIFDcox; dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb + dTheta0_dVb * T3) / model->B3SOIFDcox; dT4_dVd = Theta0 * dT3_dVd / model->B3SOIFDcox; 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; }/* Effective Vgst (Vgsteff) Calculation */ Vgst = Vgs_eff - Vth; T10 = 2.0 * n * Vtm; VgstNVt = Vgst / T10; ExpArg = (2.0 * pParam->B3SOIFDvoff - Vgst) / T10; /* MCJ: Very small Vgst */ if (VgstNVt > EXP_THRESHOLD) { Vgsteff = Vgst; /* 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 > EXP_THRESHOLD) { T0 = (Vgst - pParam->B3SOIFDvoff) / (n * Vtm); ExpVgst = exp(T0); Vgsteff = Vtm * pParam->B3SOIFDcdep0 / model->B3SOIFDcox * 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; dVgsteff_dVd = -T3 * (dVth_dVd + T0 * Vtm * dn_dVd) + T1 * dVbseff_dVd; dVgsteff_dVe = T1 * dVbseff_dVe; dVgsteff_dVb = T1 * dVbseff_dVb; if (selfheat) dVgsteff_dT = -T3 * (dVth_dT + T0 * dVtm_dT * n) + 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); 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->B3SOIFDcox / (Vtm * pParam->B3SOIFDcdep0) * exp(ExpArg); T2 = 1.0 - T10 * dT2_dVg; dT2_dVd = -dT2_dVg * (dVth_dVd - 2.0 * Vtm * ExpArg * dn_dVd) + (T2 - 1.0) / n * dn_dVd; dT2_dVb = -dT2_dVg * (dVth_dVb - 2.0 * Vtm * ExpArg * dn_dVb) + (T2 - 1.0) / n * dn_dVb; if (selfheat) dT2_dT = -dT2_dVg * (dVth_dT - ExpArg * T10 * T3); 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; } Vgst2Vtm = Vgsteff + 2.0 * Vtm; if (selfheat) dVgst2Vtm_dT = 2.0 * dVtm_dT; else dVgst2Vtm_dT = 0.0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -