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

📄 b3soifdld.c

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