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

📄 b3soiddld.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 5 页
字号:
			 T2 = T1 * (1.0 + 2.0 * T1);			 dT2_dVb = 0.0;		     }		     T0 = pParam->B3SOIDDdvt0w * T2;		     DeltVthw = T0 * V0;		     dDeltVthw_dVb = pParam->B3SOIDDdvt0w * dT2_dVb * V0;                     if (selfheat)  dDeltVthw_dT = T0 * dvbi_dT;                     else  dDeltVthw_dT = 0.0;		     T0 = sqrt(1.0 + pParam->B3SOIDDnlx / Leff);                     T1 = (pParam->B3SOIDDkt1 + pParam->B3SOIDDkt1l / Leff                           + pParam->B3SOIDDkt2 * Vbs0mos);		     DeltVthtemp = pParam->B3SOIDDk1 * (T0 - 1.0) * sqrtPhi + T1 * TempRatio;                     if (selfheat)   dDeltVthtemp_dT = T1 / model->B3SOIDDtnom;                     else   dDeltVthtemp_dT = 0.0;		     tmp2 = model->B3SOIDDtox * phi			  / (pParam->B3SOIDDweff + pParam->B3SOIDDw0);		     T3 = pParam->B3SOIDDeta0 + pParam->B3SOIDDetab * 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->B3SOIDDetab;			 dT3_dVb = T4;		     }		     else		     {			 dT3_dVb = pParam->B3SOIDDetab;		     }		     DIBL_Sft = T3 * pParam->B3SOIDDtheta0vb0 * Vds;		     dDIBL_Sft_dVd = T3 * pParam->B3SOIDDtheta0vb0;		     dDIBL_Sft_dVb = pParam->B3SOIDDtheta0vb0 * Vds * dT3_dVb;		     Vthfd = model->B3SOIDDtype * pParam->B3SOIDDvth0 + pParam->B3SOIDDk1			 * (sqrtPhis - sqrtPhi) - pParam->B3SOIDDk2			 * Vbs0mos-Delt_vth-DeltVthw +(pParam->B3SOIDDk3 +pParam->B3SOIDDk3b			 * Vbs0mos) * tmp2 + DeltVthtemp - DIBL_Sft;		     T6 = pParam->B3SOIDDk3b * tmp2 - pParam->B3SOIDDk2 +			  pParam->B3SOIDDkt2 * TempRatio;		     dVthfd_dVd = -dDIBL_Sft_dVd;		     T7 = pParam->B3SOIDDk1 * 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->B3SOIDDkb3 * Cbox / model->B3SOIDDcox;			T8 = sqrt(phi - Vbs0mos);			T5 = sqrt(1 + 4 * T3 * (phi + K1 * T8 - Vbs0mos));			T6 = 1 + T4 * T5;			Nfb = model->B3SOIDDnfb = 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 */                        T1 =  Vbs - (Vbs0eff + OFF_Vbsdio) - DELT_Vbsdio;                        T2 = sqrt(T1*T1 + DELT_Vbsdio * DELT_Vbsdio);                        T3 = 0.5 * (1 + T1/T2);                         Vbsdio = Vbs0eff + OFF_Vbsdio + 0.5 * (T1 + T2);                        dVbsdio_dVg = (1 - T3) * dVbs0eff_dVg;                        dVbsdio_dVd = (1 - T3) * dVbs0eff_dVd;                        dVbsdio_dVe = (1 - T3) * dVbs0eff_dVe;                        if (selfheat)  dVbsdio_dT = (1 - T3) * dVbs0eff_dT;                        else  dVbsdio_dT = 0.0;                        dVbsdio_dVb = T3;/* 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->B3SOIDDcsieff / model->B3SOIDDqsieff;	   			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->B3SOIDDvbsdio = Vbsdio;                  here->B3SOIDDvbs0eff = Vbs0eff;		  T1 = phi - pParam->B3SOIDDdelp;		  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->B3SOIDDvbseff = 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->B3SOIDDdvt2 * Vbseff;		  if (T0 >= - 0.5)		  {   T1 = 1.0 + T0;		      T2 = pParam->B3SOIDDdvt2 ;		  }		  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->B3SOIDDdvt2 * T4 * T4 ;		  }		  lt1 = model->B3SOIDDfactor1 * T3 * T1;		  dlt1_dVb =model->B3SOIDDfactor1 * (0.5 / T3 * T1 * dXdep_dVb + T3 * T2);		  T0 = pParam->B3SOIDDdvt2w * Vbseff;		  if (T0 >= - 0.5)		  {   T1 = 1.0 + T0;		      T2 = pParam->B3SOIDDdvt2w ;		  }		  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->B3SOIDDdvt2w * T4 * T4 ;		  }		  ltw= model->B3SOIDDfactor1 * T3 * T1;		  dltw_dVb=model->B3SOIDDfactor1*(0.5 / T3 * T1 * dXdep_dVb + T3 * T2);		  T0 = -0.5 * pParam->B3SOIDDdvt1 * 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->B3SOIDDthetavth = pParam->B3SOIDDdvt0 * Theta0;		  Delt_vth = here->B3SOIDDthetavth * V0;		  dDelt_vth_dVb = pParam->B3SOIDDdvt0 * dTheta0_dVb * V0;                  if (selfheat)  dDelt_vth_dT = here->B3SOIDDthetavth * dvbi_dT;                  else  dDelt_vth_dT = 0.0;		  T0 = -0.5 * pParam->B3SOIDDdvt1w * pParam->B3SOIDDweff * 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->B3SOIDDdvt0w * T2;		  DeltVthw = T0 * V0;		  dDeltVthw_dVb = pParam->B3SOIDDdvt0w * dT2_dVb * V0;                  if (selfheat)   dDeltVthw_dT = T0 * dvbi_dT;                  else   dDeltVthw_dT = 0.0;		  T0 = sqrt(1.0 + pParam->B3SOIDDnlx / Leff);                  T1 = (pParam->B3SOIDDkt1 + pParam->B3SOIDDkt1l / Leff                        + pParam->B3SOIDDkt2 * Vbseff);		  DeltVthtemp = pParam->B3SOIDDk1 * (T0 - 1.0) * sqrtPhi + T1 * TempRatio;                  if (selfheat)                     dDeltVthtemp_dT = T1 / model->B3SOIDDtnom;                  else                     dDeltVthtemp_dT = 0.0;		  tmp2 = model->B3SOIDDtox * phi		       / (pParam->B3SOIDDweff + pParam->B3SOIDDw0);		  T3 = pParam->B3SOIDDeta0 + pParam->B3SOIDDetab * 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->B3SOIDDetab;		      dT3_dVb = T4 ;		  }		  else		  {   		      dT3_dVb = pParam->B3SOIDDetab ;		  }		  DIBL_Sft = T3 * pParam->B3SOIDDtheta0vb0 * Vds;		  dDIBL_Sft_dVd = pParam->B3SOIDDtheta0vb0 * T3;		  dDIBL_Sft_dVb = pParam->B3SOIDDtheta0vb0 * Vds * dT3_dVb;		  Vth = model->B3SOIDDtype * pParam->B3SOIDDvth0 + pParam->B3SOIDDk1 		      * (sqrtPhis - sqrtPhi) - pParam->B3SOIDDk2 		      * Vbseff- Delt_vth - DeltVthw +(pParam->B3SOIDDk3 + pParam->B3SOIDDk3b		      * Vbseff) * tmp2 + DeltVthtemp - DIBL_Sft;		  here->B3SOIDDvon = Vth; 		  T6 = pParam->B3SOIDDk3b * tmp2 - pParam->B3SOIDDk2 		       + pParam->B3SOIDDkt2 * TempRatio;          		  dVth_dVb = pParam->B3SOIDDk1 * 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->B3SOIDDnfactor * EPSSI / Xdep;		  dT2_dVb = - T2 / Xdep * dXdep_dVb;		  T3 = pParam->B3SOIDDcdsc + pParam->B3SOIDDcdscb * Vbseff		       + pParam->B3SOIDDcdscd * Vds;		  dT3_dVb = pParam->B3SOIDDcdscb;		  dT3_dVd = pParam->B3SOIDDcdscd;		  T4 = (T2 + T3 * Theta0 + pParam->B3SOIDDcit) / model->B3SOIDDcox;		  dT4_dVb = (dT2_dVb + Theta0 * dT3_dVb + dTheta0_dVb * T3)                            / model->B3SOIDDcox;		  dT4_dVd = Theta0 * dT3_dVd / model->B3SOIDDcox;		  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->B3SOIDDvoff - 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->B3SOIDDvoff) / (n * Vtm);		      ExpVgst = exp(T0);		      Vgsteff = Vtm * pParam->B3SOIDDcdep0 / model->B3SOIDDcox * 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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -