⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 b3soifdld.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 5 页
字号:
                         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 + -