📄 b2eval.c
字号:
T5 = MIN(T5, 30.0); T6 = exp(-T5); FR = 1.0 + Ai * T6; T7 = T5 / (Vds - Vdsat); T8 = (1.0 - FR) * T7; dFR_dVd = T8 * (dVdsat_dVd - 1.0); dFR_dVg = T8 * dVdsat_dVg; dFR_dVb = T8 * dVdsat_dVb + T6 * (here->pParam->B2aiB - Ai * here->pParam->B2biB / (Vds - Vdsat)); *gds = (T0 * (dBeta_dVd - Betaeff * dUvert_dVd) + T1 * dVgeff_dVd - T2 * dVc_dVd) * FR + *Ids * dFR_dVd; *gm = (T0 * (dBeta_dVg - Betaeff * dUvert_dVg) + T1 * dVgeff_dVg - T2 * dVc_dVg) * FR + *Ids * dFR_dVg; *gmb = (T0 * (dBeta_dVb - Betaeff * dUvert_dVb) + T1 * dVgeff_dVb - T2 * dVc_dVb - *Ids * Inv_Aa * dAa_dVb) * FR + *Ids * dFR_dVb; *Ids *= FR; } else { *gds = T0 * (dBeta_dVd - Betaeff * dUvert_dVd) + T1 * dVgeff_dVd - T2 * dVc_dVd; *gm = T0 * (dBeta_dVg - Betaeff * dUvert_dVg) + T1 * dVgeff_dVg - T2 * dVc_dVg; *gmb = T0 * (dBeta_dVb - Betaeff * dUvert_dVb) + T1 * dVgeff_dVb - T2 * dVc_dVb - *Ids * Inv_Aa * dAa_dVb; } } /* end of Saturation */ } else { T0 = Exp0 * Exp0; T1 = Exp1; *Ids = Beta * model->B2Vtm * model->B2Vtm * T0 * (1.0 - T1); T2 = *Ids / Beta; T4 = n * model->B2Vtm; T3 = *Ids / T4; if ((Vds > Vdsat) && here->pParam->B2ai0 != 0.0) { Ai = here->pParam->B2ai0 + here->pParam->B2aiB * Vbs; Bi = here->pParam->B2bi0 + here->pParam->B2biB * Vbs; T5 = Bi / (Vds - Vdsat); T5 = MIN(T5, 30.0); T6 = exp(-T5); FR = 1.0 + Ai * T6; T7 = T5 / (Vds - Vdsat); T8 = (1.0 - FR) * T7; dFR_dVd = T8 * (dVdsat_dVd - 1.0); dFR_dVg = T8 * dVdsat_dVg; dFR_dVb = T8 * dVdsat_dVb + T6 * (here->pParam->B2aiB - Ai * here->pParam->B2biB / (Vds - Vdsat)); } else { FR = 1.0; dFR_dVd = 0.0; dFR_dVg = 0.0; dFR_dVb = 0.0; } *gds = (T2 * dBeta_dVd + T3 * (here->pParam->B2vofD * T4 - dVth_dVd - here->pParam->B2nD * Vgst / n) + Beta * model->B2Vtm * T0 * T1) * FR + *Ids * dFR_dVd; *gm = (T2 * dBeta_dVg + T3) * FR + *Ids * dFR_dVg; *gmb = (T2 * dBeta_dVb + T3 * (here->pParam->B2vofB * T4 - dVth_dVb + here->pParam->B2nB * Vgst / (n * T1s * T1s) * dT1s_dVb)) * FR + *Ids * dFR_dVb; *Ids *= FR; } } else { *Ids = 0.0; *gm = 0.0; *gds = 0.0; *gmb = 0.0; }ChargeComputation: /* Some Limiting of DC Parameters */ *gds = MAX(*gds,1.0e-20); if ((model->B2channelChargePartitionFlag > 1) || ((!ChargeComputationNeeded) && (model->B2channelChargePartitionFlag > -5))) { *qg = 0.0; *qd = 0.0; *qb = 0.0; *cgg = 0.0; *cgs = 0.0; *cgd = 0.0; *cdg = 0.0; *cds = 0.0; *cdd = 0.0; *cbg = 0.0; *cbs = 0.0; *cbd = 0.0; goto finished; } else { if (Vbs < 0.0) { Vbseff = Vbs; dVbseff_dVb = 1.0; } else { Vbseff = here->pParam->B2phi - Phisb; dVbseff_dVb = -dPhisb_dVb; } Arg1 = Vgs - Vbseff - here->pParam->B2vfb; Arg2 = Arg1 - Vgst; Qbulk = here->pParam->One_Third_CoxWL * Arg2; dQbulk_dVb = here->pParam->One_Third_CoxWL * (dVth_dVb - dVbseff_dVb); dQbulk_dVd = here->pParam->One_Third_CoxWL * dVth_dVd; if (Arg1 <= 0.0) { *qg = here->pParam->CoxWL * Arg1; *qb = -(*qg); *qd = 0.0; *cgg = here->pParam->CoxWL; *cgd = 0.0; *cgs = -*cgg * (1.0 - dVbseff_dVb); *cdg = 0.0; *cdd = 0.0; *cds = 0.0; *cbg = -here->pParam->CoxWL; *cbd = 0.0; *cbs = -*cgs; } else if (Vgst <= 0.0) { T2 = Arg1 / Arg2; T3 = T2 * T2 * (here->pParam->CoxWL - here->pParam->Two_Third_CoxWL * T2); *qg = here->pParam->CoxWL * Arg1 * (1.0 - T2 * (1.0 - T2 / 3.0)); *qb = -(*qg); *qd = 0.0; *cgg = here->pParam->CoxWL * (1.0 - T2 * (2.0 - T2)); tmp = T3 * dVth_dVb - (*cgg + T3) * dVbseff_dVb; *cgd = T3 * dVth_dVd; *cgs = -(*cgg + *cgd + tmp); *cdg = 0.0; *cdd = 0.0; *cds = 0.0; *cbg = -*cgg; *cbd = -*cgd; *cbs = -*cgs; } else { if (Vgst < here->pParam->B2vghigh) { Uvert = 1.0 + Vgst * (Ua + Vgst * Ub); Uvert = MAX(Uvert, 0.2); Inv_Uvert = 1.0 / Uvert; dUvert_dVg = Ua + 2.0 * Ub * Vgst; dUvert_dVd = -dUvert_dVg * dVth_dVd; dUvert_dVb = -dUvert_dVg * dVth_dVb + Vgst * (here->pParam->B2uaB + Vgst * here->pParam->B2ubB); T8 = U1s * Inv_Aa * Inv_Uvert; Vc = T8 * Vgst; T9 = Vc * Inv_Uvert; dVc_dVg = T8 - T9 * dUvert_dVg; dVc_dVd = -T8 * dVth_dVd - T9 * dUvert_dVd; dVc_dVb = -T8 * dVth_dVb + here->pParam->B2u1B * Vgst * Inv_Aa * Inv_Uvert - Vc * Inv_Aa * dAa_dVb - T9 * dUvert_dVb; tmp2 = sqrt(1.0 + 2.0 * Vc); Kk = 0.5 * (1.0 + Vc + tmp2); Inv_Kk = 1.0 / Kk; dKk_dVc = 0.5 + 0.5 / tmp2; SqrtKk = sqrt(Kk); T8 = Inv_Aa / SqrtKk; Vdsat = Vgst * T8; T9 = 0.5 * Vdsat * Inv_Kk * dKk_dVc; dVdsat_dVd = -T8 * dVth_dVd - T9 * dVc_dVd; dVdsat_dVg = T8 - T9 * dVc_dVg; dVdsat_dVb = -T8 * dVth_dVb - T9 * dVc_dVb - Vdsat* Inv_Aa * dAa_dVb; } if (Vds >= Vdsat) { /* saturation region */ *cgg = here->pParam->Two_Third_CoxWL; *cgd = -*cgg * dVth_dVd + dQbulk_dVd; tmp = -*cgg * dVth_dVb + dQbulk_dVb; *cgs = -(*cgg + *cgd + tmp); *cbg = 0.0; *cbd = -dQbulk_dVd; *cbs = dQbulk_dVd + dQbulk_dVb; *cdg = -0.4 * *cgg; tmp = -*cdg * dVth_dVb; *cdd = -*cdg * dVth_dVd; *cds = -(*cdg + *cdd + tmp); *qb = -Qbulk; *qg = here->pParam->Two_Third_CoxWL * Vgst + Qbulk; *qd = *cdg * Vgst; } else { /* linear region */ T7 = Vds / Vdsat; T8 = Vgst / Vdsat; T6 = T7 * T8; T9 = 1.0 - T7; Vgdt = Vgst * T9; T0 = Vgst / (Vgst + Vgdt); T1 = Vgdt / (Vgst + Vgdt); T5 = T0 * T1; T2 = 1.0 - T1 + T5; T3 = 1.0 - T0 + T5; dVgdt_dVg = T9 + T6 * dVdsat_dVg; dVgdt_dVd = T6 * dVdsat_dVd - T8 -T9 * dVth_dVd; dVgdt_dVb = T6 * dVdsat_dVb -T9 * dVth_dVb; *qg = here->pParam->Two_Third_CoxWL * (Vgst + Vgdt - Vgdt * T0) + Qbulk; *qb = -Qbulk; *qd = -here->pParam->One_Third_CoxWL * (0.2 * Vgdt + 0.8 * Vgst + Vgdt * T1 + 0.2 * T5 * (Vgdt - Vgst)); *cgg = here->pParam->Two_Third_CoxWL * (T2 + T3 * dVgdt_dVg); tmp = dQbulk_dVb + here->pParam->Two_Third_CoxWL * (T3 * dVgdt_dVb - T2 * dVth_dVb); *cgd = here->pParam->Two_Third_CoxWL * (T3 * dVgdt_dVd - T2 * dVth_dVd) + dQbulk_dVd; *cgs = -(*cgg + *cgd + tmp); T2 = 0.8 - 0.4 * T1 * (2.0 * T1 + T0 + T0 * (T1 - T0)); T3 = 0.2 + T1 + T0 * (1.0 - 0.4 * T0 * (T1 + 3.0 * T0)); *cdg = -here->pParam->One_Third_CoxWL * (T2 + T3 * dVgdt_dVg); tmp = here->pParam->One_Third_CoxWL * (T2 * dVth_dVb - T3 * dVgdt_dVb); *cdd = here->pParam->One_Third_CoxWL * (T2 * dVth_dVd - T3 * dVgdt_dVd); *cds = -(*cdg + tmp + *cdd); *cbg = 0.0; *cbd = -dQbulk_dVd; *cbs = dQbulk_dVd + dQbulk_dVb; } } }finished: /* returning Values to Calling Routine */ valuetypeflag = (int) model->B2channelChargePartitionFlag; switch (valuetypeflag) { case 0: *Ids = MAX(*Ids,1e-50); break; case -1: *Ids = MAX(*Ids,1e-50); break; case -2: *Ids = *gm; break; case -3: *Ids = *gds; break; case -4: *Ids = 1.0 / *gds; break; case -5: *Ids = *gmb; break; case -6: *Ids = *qg / 1.0e-12; break; case -7: *Ids = *qb / 1.0e-12; break; case -8: *Ids = *qd / 1.0e-12; break; case -9: *Ids = -(*qb + *qg + *qd) / 1.0e-12; break; case -10: *Ids = *cgg / 1.0e-12; break; case -11: *Ids = *cgd / 1.0e-12; break; case -12: *Ids = *cgs / 1.0e-12; break; case -13: *Ids = -(*cgg + *cgd + *cgs) / 1.0e-12; break; case -14: *Ids = *cbg / 1.0e-12; break; case -15: *Ids = *cbd / 1.0e-12; break; case -16: *Ids = *cbs / 1.0e-12; break; case -17: *Ids = -(*cbg + *cbd + *cbs) / 1.0e-12; break; case -18: *Ids = *cdg / 1.0e-12; break; case -19: *Ids = *cdd / 1.0e-12; break; case -20: *Ids = *cds / 1.0e-12; break; case -21: *Ids = -(*cdg + *cdd + *cds) / 1.0e-12; break; case -22: *Ids = -(*cgg + *cdg + *cbg) / 1.0e-12; break; case -23: *Ids = -(*cgd + *cdd + *cbd) / 1.0e-12; break; case -24: *Ids = -(*cgs + *cds + *cbs) / 1.0e-12; break; default: *Ids = MAX(*Ids, 1.0e-50); break; } *von = Vth; *vdsat = Vdsat;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -