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

📄 b3soipdld.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 5 页
字号:
		      dVdsat_dVg = T3 * dT0_dVg + T2 * dEsatL_dVg + EsatL * T0;		      dVdsat_dVd = T3 * dT0_dVd + T2 * dEsatL_dVd;		      dVdsat_dVb = T3 * dT0_dVb + T2 * dEsatL_dVb;                      if (selfheat)		         dVdsat_dT  = T3 * dT0_dT  + T2 * dEsatL_dT				    + EsatL * T0 * dVgst2Vtm_dT;                      else dVdsat_dT  = 0.0;		  }		  else		  {   tmp1 = dLambda_dVg / (Lambda * Lambda);		      T9 = Abulk * WVCoxRds;		      T8 = Abulk * T9;		      T7 = Vgst2Vtm * T9;		      T6 = Vgst2Vtm * WVCoxRds;		      T0 = 2.0 * Abulk * (T9 - 1.0 + 1.0 / Lambda); 		      dT0_dVg = 2.0 * (T8 * tmp2 - Abulk * tmp1			      + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg);/*		      dT0_dVb = 2.0 * (T8 * tmp3  this is equivalent to one below, but simpler			      + (2.0 * T9 + 1.0 / Lambda - 1.0) * dAbulk_dVg);  */		      dT0_dVb = 2.0 * (T8 * (2.0 / Abulk * dAbulk_dVb + tmp3)			      + (1.0 / Lambda - 1.0) * dAbulk_dVb);		      dT0_dVd = 0.0;                       if (selfheat)                      {                         if (Rds!=0.0) 		            tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp;                         else                             tmp4 = dvsattemp_dT / vsattemp;                         dT0_dT = 2.0 * T8 * tmp4;                      } else tmp4 = dT0_dT = 0.0;		      T1 = Vgst2Vtm * (2.0 / Lambda - 1.0) + Abulk * EsatL + 3.0 * T7;		     		      dT1_dVg = (2.0 / Lambda - 1.0) - 2.0 * Vgst2Vtm * tmp1			      + Abulk * dEsatL_dVg + EsatL * dAbulk_dVg + 3.0 * (T9			      + T7 * tmp2 + T6 * dAbulk_dVg);		      dT1_dVb = Abulk * dEsatL_dVb + EsatL * dAbulk_dVb			      + 3.0 * (T6 * dAbulk_dVb + T7 * tmp3);		      dT1_dVd = Abulk * dEsatL_dVd;                      if (selfheat)                      {		         tmp4 += dVgst2Vtm_dT / Vgst2Vtm;		         dT1_dT  = (2.0 / Lambda - 1.0) * dVgst2Vtm_dT				 + Abulk * dEsatL_dT + 3.0 * T7 * tmp4;                      } else dT1_dT = 0.0;		      T2 = Vgst2Vtm * (EsatL + 2.0 * T6);		      dT2_dVg = EsatL + Vgst2Vtm * dEsatL_dVg			      + T6 * (4.0 + 2.0 * Vgst2Vtm * tmp2);		      dT2_dVb = Vgst2Vtm * (dEsatL_dVb + 2.0 * T6 * tmp3);		      dT2_dVd = Vgst2Vtm * dEsatL_dVd;                      if (selfheat)		         dT2_dT  = Vgst2Vtm * dEsatL_dT + EsatL * dVgst2Vtm_dT				 + 2.0 * T6 * (dVgst2Vtm_dT + Vgst2Vtm * tmp4);                      else		         dT2_dT  = 0.0;		      T3 = sqrt(T1 * T1 - 2.0 * T0 * T2);		      Vdsat = (T1 - T3) / T0;		      dVdsat_dVg = (dT1_dVg - (T1 * dT1_dVg - dT0_dVg * T2				 - T0 * dT2_dVg) / T3 - Vdsat * dT0_dVg) / T0;		      dVdsat_dVb = (dT1_dVb - (T1 * dT1_dVb - dT0_dVb * T2				 - T0 * dT2_dVb) / T3 - Vdsat * dT0_dVb) / T0;		      dVdsat_dVd = (dT1_dVd - (T1 * dT1_dVd - T0 * dT2_dVd) / T3) / T0;                      if (selfheat)		         dVdsat_dT  = (dT1_dT - (T1 * dT1_dT - dT0_dT * T2				    - T0 * dT2_dT) / T3 - Vdsat * dT0_dT) / T0;                      else dVdsat_dT  = 0.0;		  }		  here->B3SOIPDvdsat = Vdsat;/* Effective Vds (Vdseff) Calculation */		  T1 = Vdsat - Vds - pParam->B3SOIPDdelta;		  dT1_dVg = dVdsat_dVg;		  dT1_dVd = dVdsat_dVd - 1.0;		  dT1_dVb = dVdsat_dVb;		  dT1_dT  = dVdsat_dT;		  T2 = sqrt(T1 * T1 + 4.0 * pParam->B3SOIPDdelta * Vdsat);		  T0 = T1 / T2;		  T3 = 2.0 * pParam->B3SOIPDdelta / T2;		  dT2_dVg = T0 * dT1_dVg + T3 * dVdsat_dVg;		  dT2_dVd = T0 * dT1_dVd + T3 * dVdsat_dVd;		  dT2_dVb = T0 * dT1_dVb + T3 * dVdsat_dVb;                  if (selfheat)		     dT2_dT  = T0 * dT1_dT  + T3 * dVdsat_dT;                  else dT2_dT  = 0.0;		  Vdseff = Vdsat - 0.5 * (T1 + T2);		  dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); 		  dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); 		  dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb);                   if (selfheat)		     dVdseff_dT  = dVdsat_dT  - 0.5 * (dT1_dT  + dT2_dT);                  else dVdseff_dT  = 0.0;		  if (Vdseff > Vds)		      Vdseff = Vds; /* This code is added to fixed the problem				       caused by computer precision when				       Vds is very close to Vdseff. */		  diffVds = Vds - Vdseff;		  here->B3SOIPDVdseff = Vdseff; /* v2.2.3 bug fix *//* Calculate VAsat */		  tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm;		  T9 = WVCoxRds * Vgsteff;		  T8 = T9 / Vgst2Vtm;		  T0 = EsatL + Vdsat + 2.0 * T9 * tmp4;		 		  T7 = 2.0 * WVCoxRds * tmp4;		  dT0_dVg = dEsatL_dVg + dVdsat_dVg + T7 * (1.0 + tmp2 * Vgsteff)                           - T8 * (Abulk * dVdsat_dVg - Abulk * Vdsat / Vgst2Vtm			  + Vdsat * dAbulk_dVg);   			  		  dT0_dVb = dEsatL_dVb + dVdsat_dVb + T7 * tmp3 * Vgsteff			  - T8 * (dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb);		  dT0_dVd = dEsatL_dVd + dVdsat_dVd - T8 * Abulk * dVdsat_dVd;                  if (selfheat)                  {                     if (Rds!=0.0)		        tmp4 = dRds_dT / Rds + dvsattemp_dT / vsattemp;                     else tmp4 = dvsattemp_dT / vsattemp;       		     dT0_dT  = dEsatL_dT + dVdsat_dT + T7 * tmp4 * Vgsteff			     - T8 * (Abulk * dVdsat_dT - Abulk * Vdsat * dVgst2Vtm_dT			     / Vgst2Vtm);                  } else                     dT0_dT = 0.0;		  T9 = WVCoxRds * Abulk; 		  T1 = 2.0 / Lambda - 1.0 + T9; 		  dT1_dVg = -2.0 * tmp1 +  WVCoxRds * (Abulk * tmp2 + dAbulk_dVg);		  dT1_dVb = dAbulk_dVb * WVCoxRds + T9 * tmp3;                  if (selfheat)		     dT1_dT  = T9 * tmp4;                  else		     dT1_dT  = 0.0;		  Vasat = T0 / T1;		  dVasat_dVg = (dT0_dVg - Vasat * dT1_dVg) / T1;		  dVasat_dVb = (dT0_dVb - Vasat * dT1_dVb) / T1;		  dVasat_dVd = dT0_dVd / T1;                  if (selfheat) dVasat_dT  = (dT0_dT  - Vasat * dT1_dT)  / T1;                  else dVasat_dT  = 0.0;/* Calculate VACLM */		  if ((pParam->B3SOIPDpclm > 0.0) && (diffVds > 1.0e-10))		  {   T0 = 1.0 / (pParam->B3SOIPDpclm * Abulk * pParam->B3SOIPDlitl);		      dT0_dVb = -T0 / Abulk * dAbulk_dVb;		      dT0_dVg = -T0 / Abulk * dAbulk_dVg; 		      		      T2 = Vgsteff / EsatL;		      T1 = Leff * (Abulk + T2); 		      dT1_dVg = Leff * ((1.0 - T2 * dEsatL_dVg) / EsatL + dAbulk_dVg);		      dT1_dVb = Leff * (dAbulk_dVb - T2 * dEsatL_dVb / EsatL);		      dT1_dVd = -T2 * dEsatL_dVd / Esat;                      if (selfheat) dT1_dT  = -T2 * dEsatL_dT / Esat;                      else dT1_dT  = 0.0;		      T9 = T0 * T1;		      VACLM = T9 * diffVds;		      dVACLM_dVg = T0 * dT1_dVg * diffVds - T9 * dVdseff_dVg				 + T1 * diffVds * dT0_dVg;		      dVACLM_dVb = (dT0_dVb * T1 + T0 * dT1_dVb) * diffVds				 - T9 * dVdseff_dVb;		      dVACLM_dVd = T0 * dT1_dVd * diffVds + T9 * (1.0 - dVdseff_dVd);                      if (selfheat)		         dVACLM_dT  = T0 * dT1_dT * diffVds - T9 * dVdseff_dT;                      else dVACLM_dT  = 0.0;		  }		  else		  {   VACLM = MAX_EXPL;		      dVACLM_dVd = dVACLM_dVg = dVACLM_dVb = dVACLM_dT = 0.0;		  }/* Calculate VADIBL */		  if (pParam->B3SOIPDthetaRout > 0.0)		  {   T8 = Abulk * Vdsat;		      T0 = Vgst2Vtm * T8;		      T1 = Vgst2Vtm + T8;		      dT0_dVg = Vgst2Vtm * Abulk * dVdsat_dVg + T8			      + Vgst2Vtm * Vdsat * dAbulk_dVg;		      dT1_dVg = 1.0 + Abulk * dVdsat_dVg + Vdsat * dAbulk_dVg;		      dT1_dVb = dAbulk_dVb * Vdsat + Abulk * dVdsat_dVb;		      dT0_dVb = Vgst2Vtm * dT1_dVb;		      dT1_dVd = Abulk * dVdsat_dVd;		      dT0_dVd = Vgst2Vtm * dT1_dVd;                      if (selfheat)                      {		         dT0_dT  = dVgst2Vtm_dT * T8 + Abulk * Vgst2Vtm * dVdsat_dT;		         dT1_dT  = dVgst2Vtm_dT + Abulk * dVdsat_dT;                      } else                         dT0_dT = dT1_dT = 0.0;		      T9 = T1 * T1;		      T2 = pParam->B3SOIPDthetaRout;		      VADIBL = (Vgst2Vtm - T0 / T1) / T2;		      dVADIBL_dVg = (1.0 - dT0_dVg / T1 + T0 * dT1_dVg / T9) / T2;		      dVADIBL_dVb = (-dT0_dVb / T1 + T0 * dT1_dVb / T9) / T2;		      dVADIBL_dVd = (-dT0_dVd / T1 + T0 * dT1_dVd / T9) / T2;                      if (selfheat)		         dVADIBL_dT = (dVgst2Vtm_dT - dT0_dT/T1 + T0*dT1_dT/T9) / T2;                      else dVADIBL_dT = 0.0;		      T7 = pParam->B3SOIPDpdiblb * Vbseff;		      if (T7 >= -0.9)		      {   T3 = 1.0 / (1.0 + T7);			  VADIBL *= T3;			  dVADIBL_dVg *= T3;			  dVADIBL_dVb = (dVADIBL_dVb - VADIBL * pParam->B3SOIPDpdiblb)				      * T3;			  dVADIBL_dVd *= T3;			  if (selfheat)  dVADIBL_dT  *= T3;			  else  dVADIBL_dT  = 0.0;		      }		      else/* Added to avoid the discontinuity problem caused by pdiblcb */		      {   T4 = 1.0 / (0.8 + T7);			  T3 = (17.0 + 20.0 * T7) * T4;			  dVADIBL_dVg *= T3;			  dVADIBL_dVb = dVADIBL_dVb * T3				      - VADIBL * pParam->B3SOIPDpdiblb * T4 * T4;			  dVADIBL_dVd *= T3;			  if (selfheat)  dVADIBL_dT  *= T3;			  else  dVADIBL_dT  = 0.0;			  VADIBL *= T3;		      }		  }		  else		  {   VADIBL = MAX_EXPL;		      dVADIBL_dVd = dVADIBL_dVg = dVADIBL_dVb = dVADIBL_dT = 0.0;		  }/* Calculate VA */		  		  T8 = pParam->B3SOIPDpvag / EsatL;		  T9 = T8 * Vgsteff;		  if (T9 > -0.9)		  {   T0 = 1.0 + T9;		      dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL);		      dT0_dVb = -T9 * dEsatL_dVb / EsatL;		      dT0_dVd = -T9 * dEsatL_dVd / EsatL;                      if (selfheat)		         dT0_dT  = -T9 * dEsatL_dT / EsatL;                      else		         dT0_dT  = 0.0;		  }		  else /* Added to avoid the discontinuity problems caused by pvag */		  {   T1 = 1.0 / (17.0 + 20.0 * T9);		      T0 = (0.8 + T9) * T1;		      T1 *= T1;		      dT0_dVg = T8 * (1.0 - Vgsteff * dEsatL_dVg / EsatL) * T1;		      T9 *= T1 / EsatL;		      dT0_dVb = -T9 * dEsatL_dVb;		      dT0_dVd = -T9 * dEsatL_dVd;                      if (selfheat)		         dT0_dT  = -T9 * dEsatL_dT;                      else		         dT0_dT  = 0.0;		  }				  tmp1 = VACLM * VACLM;		  tmp2 = VADIBL * VADIBL;		  tmp3 = VACLM + VADIBL;		  T1 = VACLM * VADIBL / tmp3;		  tmp3 *= tmp3;		  dT1_dVg = (tmp1 * dVADIBL_dVg + tmp2 * dVACLM_dVg) / tmp3;		  dT1_dVd = (tmp1 * dVADIBL_dVd + tmp2 * dVACLM_dVd) / tmp3;		  dT1_dVb = (tmp1 * dVADIBL_dVb + tmp2 * dVACLM_dVb) / tmp3;                  if (selfheat)		     dT1_dT  = (tmp1 * dVADIBL_dT  + tmp2 * dVACLM_dT ) / tmp3;                  else dT1_dT  = 0.0;		  Va = Vasat + T0 * T1;		  dVa_dVg = dVasat_dVg + T1 * dT0_dVg + T0 * dT1_dVg;		  dVa_dVd = dVasat_dVd + T1 * dT0_dVd + T0 * dT1_dVd;		  dVa_dVb = dVasat_dVb + T1 * dT0_dVb + T0 * dT1_dVb;                  if (selfheat)		     dVa_dT  = dVasat_dT  + T1 * dT0_dT  + T0 * dT1_dT;                  else dVa_dT  = 0.0;/* Calculate Ids */		  CoxWovL = model->B3SOIPDcox * Weff / Leff;		  beta = ueff * CoxWovL;		  dbeta_dVg = CoxWovL * dueff_dVg + beta * dWeff_dVg / Weff ;		  dbeta_dVd = CoxWovL * dueff_dVd;		  dbeta_dVb = CoxWovL * dueff_dVb + beta * dWeff_dVb / Weff ;		  if (selfheat)  dbeta_dT  = CoxWovL * dueff_dT;		  else  dbeta_dT  = 0.0;		  T0 = 1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm;		  dT0_dVg = -0.5 * (Abulk * dVdseff_dVg 			  - Abulk * Vdseff / Vgst2Vtm + Vdseff * dAbulk_dVg) / Vgst2Vtm;		  dT0_dVd = -0.5 * Abulk * dVdseff_dVd / Vgst2Vtm;		  dT0_dVb = -0.5 * (Abulk * dVdseff_dVb + dAbulk_dVb * Vdseff)			  / Vgst2Vtm;		  if (selfheat)                       dT0_dT  = -0.5 * (Abulk * dVdseff_dT                             - Abulk * Vdseff / Vgst2Vtm * dVgst2Vtm_dT)			     / Vgst2Vtm;		  else dT0_dT = 0.0;		  fgche1 = Vgsteff * T0;		  dfgche1_dVg = Vgsteff * dT0_dVg + T0; 		  dfgche1_dVd = Vgsteff * dT0_dVd;		  dfgche1_dVb = Vgsteff * dT0_dVb;		  if (selfheat)  dfgche1_dT  = Vgsteff * dT0_dT;		  else  dfgche1_dT  = 0.0;		  T9 = Vdseff / EsatL;		  fgche2 = 1.0 + T9;		  dfgche2_dVg = (dVdseff_dVg - T9 * dEsatL_dVg) / EsatL;		  dfgche2_dVd = (dVdseff_dVd - T9 * dEsatL_dVd) / EsatL;		  dfgche2_dVb = (dVdseff_dVb - T9 * dEsatL_dVb) / EsatL;		  if (selfheat)  dfgche2_dT  = (dVdseff_dT  - T9 * dEsatL_dT)  / EsatL;		  else  dfgche2_dT  = 0.0;		  gche = beta * fgche1 / fgche2;		  dgche_dVg = (beta * dfgche1_dVg + fgche1 * dbeta_dVg			    - gche * dfgche2_dVg) / fgche2;		  dgche_dVd = (beta * dfgche1_dVd + fgche1 * dbeta_dVd			    - gche * dfgche2_dVd) / fgche2;		  dgche_dVb = (beta * dfgche1_dVb + fgche1 * dbeta_dVb			    - gche * dfgche2_dVb) / fgche2;		  if (selfheat)		     dgche_dT  = (beta * dfgche1_dT  + fgche1 * dbeta_dT			       - gche * dfgche2_dT)  / fgche2;		  else dgche_dT  = 0.0;		  T0 = 1.0 + gche * Rds;		  T9 = Vdseff / T0;		  Idl = gche * T9;/*  Whoa, these formulas for the derivatives of Idl are convoluted, but I

⌨️ 快捷键说明

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