b3soifdtemp.c
来自「ngspice又一个电子CAD仿真软件代码.功能更全」· C语言 代码 · 共 822 行 · 第 1/3 页
C
822 行
if (pParam->B3SOIFDu0 > 1.0) pParam->B3SOIFDu0 = pParam->B3SOIFDu0 / 1.0e4; pParam->B3SOIFDu0temp = pParam->B3SOIFDu0 * pow(TRatio, pParam->B3SOIFDute); pParam->B3SOIFDvsattemp = pParam->B3SOIFDvsat - pParam->B3SOIFDat * T0; pParam->B3SOIFDrds0 = (pParam->B3SOIFDrdsw + pParam->B3SOIFDprt * T0) / pow(pParam->B3SOIFDweff * 1E6, pParam->B3SOIFDwr); if (B3SOIFDcheckModel(model, here, ckt)) { IFuid namarray[2]; namarray[0] = model->B3SOIFDmodName; namarray[1] = here->B3SOIFDname; (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during B3SOIFDV3 parameter checking for %s in model %s", namarray); return(E_BADPARM); } pParam->B3SOIFDcgdo = (model->B3SOIFDcgdo + pParam->B3SOIFDcf) * pParam->B3SOIFDweffCV; pParam->B3SOIFDcgso = (model->B3SOIFDcgso + pParam->B3SOIFDcf) * pParam->B3SOIFDweffCV; pParam->B3SOIFDcgeo = model->B3SOIFDcgeo * pParam->B3SOIFDleffCV; if (!model->B3SOIFDnpeakGiven && model->B3SOIFDgamma1Given) { T0 = pParam->B3SOIFDgamma1 * model->B3SOIFDcox; pParam->B3SOIFDnpeak = 3.021E22 * T0 * T0; } T0 = pow(TRatio, model->B3SOIFDxbjt / pParam->B3SOIFDndiode); T1 = pow(TRatio, model->B3SOIFDxdif / pParam->B3SOIFDndiode); T2 = pow(TRatio, model->B3SOIFDxrec / pParam->B3SOIFDndiode / 2); T4 = -Eg0 / pParam->B3SOIFDndiode / model->B3SOIFDvtm * (1 - TRatio); T5 = exp(T4); T6 = sqrt(T5); pParam->B3SOIFDjbjt = pParam->B3SOIFDisbjt * T0 * T5; pParam->B3SOIFDjdif = pParam->B3SOIFDisdif * T1 * T5; pParam->B3SOIFDjrec = pParam->B3SOIFDisrec * T2 * T6; T0 = pow(TRatio, model->B3SOIFDxtun / pParam->B3SOIFDntun); pParam->B3SOIFDjtun = pParam->B3SOIFDistun * T0 ; if (pParam->B3SOIFDnsub > 0) pParam->B3SOIFDvfbb = -model->B3SOIFDtype * model->B3SOIFDvtm * log(pParam->B3SOIFDnpeak/ pParam->B3SOIFDnsub); else pParam->B3SOIFDvfbb = -model->B3SOIFDtype * model->B3SOIFDvtm * log(-pParam->B3SOIFDnpeak* pParam->B3SOIFDnsub/ni/ni); if (!model->B3SOIFDvsdfbGiven) { if (pParam->B3SOIFDnsub > 0) pParam->B3SOIFDvsdfb = -model->B3SOIFDtype * (model->B3SOIFDvtm*log(1e20 * pParam->B3SOIFDnsub / ni /ni) - 0.3); else if (pParam->B3SOIFDnsub < 0) pParam->B3SOIFDvsdfb = -model->B3SOIFDtype * (model->B3SOIFDvtm*log(-1e20 / pParam->B3SOIFDnsub) + 0.3); } /* Phi & Gamma */ SDphi = 2.0*model->B3SOIFDvtm*log(fabs(pParam->B3SOIFDnsub) / ni); SDgamma = 5.753e-12 * sqrt(fabs(pParam->B3SOIFDnsub)) / model->B3SOIFDcbox; if (!model->B3SOIFDvsdthGiven) { if ( ((pParam->B3SOIFDnsub > 0) && (model->B3SOIFDtype > 0)) || ((pParam->B3SOIFDnsub < 0) && (model->B3SOIFDtype < 0)) ) pParam->B3SOIFDvsdth = pParam->B3SOIFDvsdfb + SDphi + SDgamma * sqrt(SDphi); else pParam->B3SOIFDvsdth = pParam->B3SOIFDvsdfb - SDphi - SDgamma * sqrt(SDphi); } if (!model->B3SOIFDcsdminGiven) { /* Cdmin */ tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q * fabs(pParam->B3SOIFDnsub) * 1.0e6)); tmp1 = EPSSI / tmp; model->B3SOIFDcsdmin = tmp1 * model->B3SOIFDcbox / (tmp1 + model->B3SOIFDcbox); } T0 = model->B3SOIFDcsdesw * log(1 + model->B3SOIFDtsi / model->B3SOIFDtbox); T1 = here->B3SOIFDsourcePerimeter - pParam->B3SOIFDweff; if (T1 > 0.0) pParam->B3SOIFDcsesw = T0 * T1; else pParam->B3SOIFDcsesw = 0.0; T1 = here->B3SOIFDdrainPerimeter - pParam->B3SOIFDweff; if (T1 > 0.0) pParam->B3SOIFDcdesw = T0 * T1; else pParam->B3SOIFDcdesw = 0.0; pParam->B3SOIFDphi = 2.0 * model->B3SOIFDvtm * log(pParam->B3SOIFDnpeak / ni); pParam->B3SOIFDsqrtPhi = sqrt(pParam->B3SOIFDphi); pParam->B3SOIFDphis3 = pParam->B3SOIFDsqrtPhi * pParam->B3SOIFDphi; pParam->B3SOIFDXdep0 = sqrt(2.0 * EPSSI / (Charge_q * pParam->B3SOIFDnpeak * 1.0e6)) * pParam->B3SOIFDsqrtPhi; pParam->B3SOIFDsqrtXdep0 = sqrt(pParam->B3SOIFDXdep0); pParam->B3SOIFDlitl = sqrt(3.0 * model->B3SOIFDxj * model->B3SOIFDtox); pParam->B3SOIFDvbi = model->B3SOIFDvtm * log(1.0e20 * pParam->B3SOIFDnpeak / (ni * ni)); pParam->B3SOIFDcdep0 = sqrt(Charge_q * EPSSI * pParam->B3SOIFDnpeak * 1.0e6 / 2.0 / pParam->B3SOIFDphi); if (model->B3SOIFDk1Given || model->B3SOIFDk2Given) { if (!model->B3SOIFDk1Given) { fprintf(stdout, "Warning: k1 should be specified with k2.\n"); pParam->B3SOIFDk1 = 0.53; } if (!model->B3SOIFDk2Given) { fprintf(stdout, "Warning: k2 should be specified with k1.\n"); pParam->B3SOIFDk2 = -0.0186; } if (model->B3SOIFDxtGiven) fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n"); if (model->B3SOIFDvbxGiven) fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n"); if (model->B3SOIFDvbmGiven) fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n"); if (model->B3SOIFDgamma1Given) fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n"); if (model->B3SOIFDgamma2Given) fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n"); } else { if (!model->B3SOIFDvbxGiven) pParam->B3SOIFDvbx = pParam->B3SOIFDphi - 7.7348e-4 * pParam->B3SOIFDnpeak * pParam->B3SOIFDxt * pParam->B3SOIFDxt; if (pParam->B3SOIFDvbx > 0.0) pParam->B3SOIFDvbx = -pParam->B3SOIFDvbx; if (pParam->B3SOIFDvbm > 0.0) pParam->B3SOIFDvbm = -pParam->B3SOIFDvbm; if (!model->B3SOIFDgamma1Given) pParam->B3SOIFDgamma1 = 5.753e-12 * sqrt(pParam->B3SOIFDnpeak) / model->B3SOIFDcox; if (!model->B3SOIFDgamma2Given) pParam->B3SOIFDgamma2 = 5.753e-12 * sqrt(pParam->B3SOIFDnsub) / model->B3SOIFDcox; T0 = pParam->B3SOIFDgamma1 - pParam->B3SOIFDgamma2; T1 = sqrt(pParam->B3SOIFDphi - pParam->B3SOIFDvbx) - pParam->B3SOIFDsqrtPhi; T2 = sqrt(pParam->B3SOIFDphi * (pParam->B3SOIFDphi - pParam->B3SOIFDvbm)) - pParam->B3SOIFDphi; pParam->B3SOIFDk2 = T0 * T1 / (2.0 * T2 + pParam->B3SOIFDvbm); pParam->B3SOIFDk1 = pParam->B3SOIFDgamma2 - 2.0 * pParam->B3SOIFDk2 * sqrt(pParam->B3SOIFDphi - pParam->B3SOIFDvbm); } if (pParam->B3SOIFDk2 < 0.0) { T0 = 0.5 * pParam->B3SOIFDk1 / pParam->B3SOIFDk2; pParam->B3SOIFDvbsc = 0.9 * (pParam->B3SOIFDphi - T0 * T0); if (pParam->B3SOIFDvbsc > -3.0) pParam->B3SOIFDvbsc = -3.0; else if (pParam->B3SOIFDvbsc < -30.0) pParam->B3SOIFDvbsc = -30.0; } else { pParam->B3SOIFDvbsc = -30.0; } if (pParam->B3SOIFDvbsc > pParam->B3SOIFDvbm) pParam->B3SOIFDvbsc = pParam->B3SOIFDvbm; if (model->B3SOIFDvth0Given) { pParam->B3SOIFDvfb = model->B3SOIFDtype * pParam->B3SOIFDvth0 - pParam->B3SOIFDphi - pParam->B3SOIFDk1 * pParam->B3SOIFDsqrtPhi; } else { pParam->B3SOIFDvfb = -1.0; pParam->B3SOIFDvth0 = model->B3SOIFDtype * (pParam->B3SOIFDvfb + pParam->B3SOIFDphi + pParam->B3SOIFDk1 * pParam->B3SOIFDsqrtPhi); } T1 = sqrt(EPSSI / EPSOX * model->B3SOIFDtox * pParam->B3SOIFDXdep0); T0 = exp(-0.5 * pParam->B3SOIFDdsub * pParam->B3SOIFDleff / T1); pParam->B3SOIFDtheta0vb0 = (T0 + 2.0 * T0 * T0); T0 = exp(-0.5 * pParam->B3SOIFDdrout * pParam->B3SOIFDleff / T1); T2 = (T0 + 2.0 * T0 * T0); pParam->B3SOIFDthetaRout = pParam->B3SOIFDpdibl1 * T2 + pParam->B3SOIFDpdibl2; here->B3SOIFDminIsub = 5.0e-2 * pParam->B3SOIFDweff * model->B3SOIFDtsi * MAX(pParam->B3SOIFDisdif, pParam->B3SOIFDisrec); } here->B3SOIFDcsbox = model->B3SOIFDcbox*here->B3SOIFDsourceArea; here->B3SOIFDcsmin = model->B3SOIFDcsdmin*here->B3SOIFDsourceArea; here->B3SOIFDcdbox = model->B3SOIFDcbox*here->B3SOIFDdrainArea; here->B3SOIFDcdmin = model->B3SOIFDcsdmin*here->B3SOIFDdrainArea; if ( ((pParam->B3SOIFDnsub > 0) && (model->B3SOIFDtype > 0)) || ((pParam->B3SOIFDnsub < 0) && (model->B3SOIFDtype < 0)) ) { T0 = pParam->B3SOIFDvsdth - pParam->B3SOIFDvsdfb; pParam->B3SOIFDsdt1 = pParam->B3SOIFDvsdfb + model->B3SOIFDasd * T0; T1 = here->B3SOIFDcsbox - here->B3SOIFDcsmin; T2 = T1 / T0 / T0; pParam->B3SOIFDst2 = T2 / model->B3SOIFDasd; pParam->B3SOIFDst3 = T2 /( 1 - model->B3SOIFDasd); here->B3SOIFDst4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3 - here->B3SOIFDcsmin * pParam->B3SOIFDvsdfb; T1 = here->B3SOIFDcdbox - here->B3SOIFDcdmin; T2 = T1 / T0 / T0; pParam->B3SOIFDdt2 = T2 / model->B3SOIFDasd; pParam->B3SOIFDdt3 = T2 /( 1 - model->B3SOIFDasd); here->B3SOIFDdt4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3 - here->B3SOIFDcdmin * pParam->B3SOIFDvsdfb; } else { T0 = pParam->B3SOIFDvsdfb - pParam->B3SOIFDvsdth; pParam->B3SOIFDsdt1 = pParam->B3SOIFDvsdth + model->B3SOIFDasd * T0; T1 = here->B3SOIFDcsmin - here->B3SOIFDcsbox; T2 = T1 / T0 / T0; pParam->B3SOIFDst2 = T2 / model->B3SOIFDasd; pParam->B3SOIFDst3 = T2 /( 1 - model->B3SOIFDasd); here->B3SOIFDst4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3 - here->B3SOIFDcsbox * pParam->B3SOIFDvsdth; T1 = here->B3SOIFDcdmin - here->B3SOIFDcdbox; T2 = T1 / T0 / T0; pParam->B3SOIFDdt2 = T2 / model->B3SOIFDasd; pParam->B3SOIFDdt3 = T2 /( 1 - model->B3SOIFDasd); here->B3SOIFDdt4 = T0 * T1 * (1 + model->B3SOIFDasd) / 3 - here->B3SOIFDcdbox * pParam->B3SOIFDvsdth; } here->B3SOIFDphi = pParam->B3SOIFDphi; /* process source/drain series resistance */ here->B3SOIFDdrainConductance = model->B3SOIFDsheetResistance * here->B3SOIFDdrainSquares; if (here->B3SOIFDdrainConductance > 0.0) here->B3SOIFDdrainConductance = 1.0 / here->B3SOIFDdrainConductance; else here->B3SOIFDdrainConductance = 0.0; here->B3SOIFDsourceConductance = model->B3SOIFDsheetResistance * here->B3SOIFDsourceSquares; if (here->B3SOIFDsourceConductance > 0.0) here->B3SOIFDsourceConductance = 1.0 / here->B3SOIFDsourceConductance; else here->B3SOIFDsourceConductance = 0.0; here->B3SOIFDcgso = pParam->B3SOIFDcgso; here->B3SOIFDcgdo = pParam->B3SOIFDcgdo; } } return(OK);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?