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

📄 b3v1ald.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 5 页
字号:
                                      Vdseff=Vds;                                      } /* added to avoid the hardwrae problem                                           when Vds=0 */	      if ((diffVds != 0.0) && ((T0 = -pParam->BSIM3v1Abeta0 / diffVds)		  > -EXP_THRESHOLD))	      {   T1 = T2 * diffVds * exp(T0);                  dT1_dVg = T1 / diffVds * (T0 - 1.0) * dVdseff_dVg;                  dT1_dVd = T1 / diffVds * (1.0 - T0) * (1.0 - dVdseff_dVd);                  dT1_dVb = T1 / diffVds * (T0 - 1.0) * dVdseff_dVb;              }	      else	      {   T1 = T2 * diffVds * MIN_EXP;                  dT1_dVg = -T2 * MIN_EXP * dVdseff_dVg;                  dT1_dVd = T2 * MIN_EXP * (1.0 - dVdseff_dVd);                  dT1_dVb = -T2 * MIN_EXP * dVdseff_dVb;              }              Isub = T1 * Idsa;              Gbg = T1 * dIdsa_dVg + Idsa * dT1_dVg;              Gbd = T1 * dIdsa_dVd + Idsa * dT1_dVd;              Gbb = T1 * dIdsa_dVb + Idsa * dT1_dVb;              Gbd += Gbg * dVgsteff_dVd;	      Gbb += Gbg * dVgsteff_dVb;	      Gbg *= dVgsteff_dVg;	      Gbg *= dVbseff_dVb;          }                   cdrain = Ids;          here->BSIM3v1Agds = Gds;          here->BSIM3v1Agm = Gm;          here->BSIM3v1Agmbs = Gmb;                             here->BSIM3v1Agbbs = Gbb;          here->BSIM3v1Agbgs = Gbg;          here->BSIM3v1Agbds = Gbd;          here->BSIM3v1Acsub = Isub - (Gbb * Vbseff + Gbd * Vds + Gbg * Vgs);/* Calculate Qinv for Noise analysis */          T1 = Vgsteff * (1.0 - 0.5 * Abulk * Vdseff / Vgst2Vtm);          here->BSIM3v1Aqinv = -model->BSIM3v1Acox * Weff * Leff * T1;          if ((model->BSIM3v1Axpart < 0) || (!ChargeComputationNeeded))	  {   qgate  = qdrn = qsrc = qbulk = 0.0;              here->BSIM3v1Acggb = here->BSIM3v1Acgsb = here->BSIM3v1Acgdb = 0.0;              here->BSIM3v1Acdgb = here->BSIM3v1Acdsb = here->BSIM3v1Acddb = 0.0;              here->BSIM3v1Acbgb = here->BSIM3v1Acbsb = here->BSIM3v1Acbdb = 0.0;              here->BSIM3v1Acqdb = here->BSIM3v1Acqsb = here->BSIM3v1Acqgb                           = here->BSIM3v1Acqbb = 0.0;              here->BSIM3v1Agtau = 0.0;              goto finished;          }	  else	  {   if (Vbseff < 0.0)	      {   VbseffCV = Vbseff;                  dVbseffCV_dVb = 1.0;              }	      else	      {   VbseffCV = pParam->BSIM3v1Aphi - Phis;                  dVbseffCV_dVb = -dPhis_dVb;              }              CoxWL = model->BSIM3v1Acox * pParam->BSIM3v1AweffCV		    * pParam->BSIM3v1AleffCV;	      Vfb = Vth - pParam->BSIM3v1Aphi - pParam->BSIM3v1Ak1 * sqrtPhis;	      dVfb_dVb = dVth_dVb - pParam->BSIM3v1Ak1 * dsqrtPhis_dVb;              dVfb_dVd = dVth_dVd;              if ((VgstNVt > -EXP_THRESHOLD) && (VgstNVt < EXP_THRESHOLD))	      {   ExpVgst *= ExpVgst;                  Vgsteff = n * Vtm * log(1.0 + ExpVgst);                  dVgsteff_dVg = ExpVgst / (1.0 + ExpVgst);                  dVgsteff_dVd = -dVgsteff_dVg * (dVth_dVd + (Vgs_eff - Vth)			       / n * dn_dVd) + Vgsteff / n * dn_dVd;                  dVgsteff_dVb = -dVgsteff_dVg * (dVth_dVb + (Vgs_eff - Vth)			       / n * dn_dVb) + Vgsteff / n * dn_dVb;	          dVgsteff_dVg *= dVgs_eff_dVg;              }	      if (model->BSIM3v1AcapMod == 1)	      {   Arg1 = Vgs_eff - VbseffCV - Vfb;                  if (Arg1 <= 0.0)	          {   qgate = CoxWL * (Arg1 - Vgsteff);                      Cgg = CoxWL * (dVgs_eff_dVg - dVgsteff_dVg);                      Cgd = -CoxWL * (dVfb_dVd + dVgsteff_dVd);                      Cgb = -CoxWL * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb);                  }	          else	          {   T0 = 0.5 * pParam->BSIM3v1Ak1;                      T1 = sqrt(T0 * T0 + Arg1 - Vgsteff);                      qgate = CoxWL * pParam->BSIM3v1Ak1 * (T1 - T0);                      T2 = CoxWL * T0 / T1;                      Cgg = T2 * (dVgs_eff_dVg - dVgsteff_dVg);                      Cgd = -T2 * (dVfb_dVd + dVgsteff_dVd);                      Cgb = -T2 * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb);                  }	          qbulk = -qgate;	          Cbg = -Cgg;	          Cbd = -Cgd;	          Cbb = -Cgb;                  One_Third_CoxWL = CoxWL / 3.0;                  Two_Third_CoxWL = 2.0 * One_Third_CoxWL;                  AbulkCV = Abulk0 * pParam->BSIM3v1AabulkCVfactor;                  dAbulkCV_dVb = pParam->BSIM3v1AabulkCVfactor * dAbulk0_dVb;	          VdsatCV = Vgsteff / AbulkCV;                  if (VdsatCV <= Vds)	          {   dVdsatCV_dVg = 1.0 / AbulkCV;	              dVdsatCV_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV;		      T0 = Vgsteff - VdsatCV / 3.0;                      dT0_dVg = 1.0 - dVdsatCV_dVg / 3.0;                      dT0_dVb = -dVdsatCV_dVb / 3.0;                      qgate += CoxWL * T0;                      Cgg1 = CoxWL * dT0_dVg;                       Cgb1 = CoxWL * dT0_dVb + Cgg1 * dVgsteff_dVb;                      Cgd1 = Cgg1 * dVgsteff_dVd;		      Cgg1 *= dVgsteff_dVg;		      Cgg += Cgg1;		      Cgb += Cgb1;		      Cgd += Cgd1;		      T0 = VdsatCV - Vgsteff;		      dT0_dVg = dVdsatCV_dVg - 1.0;		      dT0_dVb = dVdsatCV_dVb;                      qbulk += One_Third_CoxWL * T0;                      Cbg1 = One_Third_CoxWL * dT0_dVg;		      Cbb1 = One_Third_CoxWL * dT0_dVb + Cbg1 * dVgsteff_dVb;		      Cbd1 = Cbg1 * dVgsteff_dVd;		      Cbg1 *= dVgsteff_dVg;		      Cbg += Cbg1;		      Cbb += Cbb1;                      Cbd += Cbd1;                      if (model->BSIM3v1Axpart > 0.5)		          T0 = -Two_Third_CoxWL;                      else if (model->BSIM3v1Axpart < 0.5)		          T0 = -0.4 * CoxWL;                      else		          T0 = -One_Third_CoxWL;                      qsrc = T0 * Vgsteff;                      Csg = T0 * dVgsteff_dVg;                      Csb = T0 * dVgsteff_dVb;                      Csd = T0 * dVgsteff_dVd;		      Cgb *= dVbseff_dVb;		      Cbb *= dVbseff_dVb;		      Csb *= dVbseff_dVb;                  }	          else	          {   T0 = AbulkCV * Vds;                      T1 = 12.0 * (Vgsteff - 0.5 * T0);		      T2 = Vds / T1;		      T3 = T0 * T2;                      dT3_dVg = -12.0 * T2 * T2 * AbulkCV;                      dT3_dVd = 6.0 * T0 * (4.0 * Vgsteff - T0) / T1 / T1 - 0.5;                      dT3_dVb = 12.0 * T2 * T2 * dAbulkCV_dVb * Vgsteff;                      qgate += CoxWL * (Vgsteff - 0.5 * Vds + T3);                      Cgg1 = CoxWL * (1.0 + dT3_dVg);                      Cgb1 = CoxWL * dT3_dVb + Cgg1 * dVgsteff_dVb;                      Cgd1 = CoxWL * dT3_dVd + Cgg1 * dVgsteff_dVd;		      Cgg1 *= dVgsteff_dVg;		      Cgg += Cgg1;		      Cgb += Cgb1;		      Cgd += Cgd1;                      qbulk += CoxWL * (1.0 - AbulkCV) * (0.5 * Vds - T3);		      Cbg1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVg);		      Cbb1 = -CoxWL * ((1.0 - AbulkCV) * dT3_dVb		           + (0.5 * Vds - T3) * dAbulkCV_dVb)		           + Cbg1 * dVgsteff_dVb;		      Cbd1 = -CoxWL * (1.0 - AbulkCV) * dT3_dVd		           + Cbg1 * dVgsteff_dVd;		      Cbg1 *= dVgsteff_dVg;		      Cbg += Cbg1;		      Cbb += Cbb1;		      Cbd += Cbd1;                      if (model->BSIM3v1Axpart > 0.5)		      {   /* 0/100 Charge petition model */		          T1 = T1 + T1;                          qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0			       - T0 * T0 / T1);		          Csg = -CoxWL * (0.5 + 24.0 * T0 * Vds / T1 / T1			      * AbulkCV);                          Csb = -CoxWL * (0.25 * Vds * dAbulkCV_dVb			      - 12.0 * T0 * Vds / T1 / T1 * (4.0 * Vgsteff - T0)			      * dAbulkCV_dVb) + Csg * dVgsteff_dVb;		          Csd = -CoxWL * (0.25 * AbulkCV - 12.0 * AbulkCV * T0			      / T1 / T1 * (4.0 * Vgsteff - T0))			      + Csg * dVgsteff_dVd;		          Csg *= dVgsteff_dVg;                      }		      else if (model->BSIM3v1Axpart < 0.5)		      {   /* 40/60 Charge petition model */		          T1 = T1 / 12.0;		          T2 = 0.5 * CoxWL / (T1 * T1);		          T3 = Vgsteff * (2.0 * T0 * T0 / 3.0 + Vgsteff			     * (Vgsteff - 4.0 * T0 / 3.0))			     - 2.0 * T0 * T0 * T0 / 15.0;		          qsrc = -T2 * T3;		          T4 = 4.0 / 3.0 * Vgsteff * (Vgsteff - T0)			     + 0.4 * T0 * T0;		          Csg = -2.0 * qsrc / T1 - T2 * (Vgsteff * (3.0			      * Vgsteff - 8.0 * T0 / 3.0)			      + 2.0 * T0 * T0 / 3.0);		          Csb = (qsrc / T1 * Vds + T2 * T4 * Vds) * dAbulkCV_dVb		              + Csg * dVgsteff_dVb;		          Csd = (qsrc / T1 + T2 * T4) * AbulkCV			      + Csg * dVgsteff_dVd;		          Csg *= dVgsteff_dVg;                      }		      else		      {   /* 50/50 Charge petition model */                          qsrc = -0.5 * (qgate + qbulk);                          Csg = -0.5 * (Cgg1 + Cbg1);                          Csb = -0.5 * (Cgb1 + Cbb1);                           Csd = -0.5 * (Cgd1 + Cbd1);                       }		      Cgb *= dVbseff_dVb;		      Cbb *= dVbseff_dVb;		      Csb *= dVbseff_dVb;                  }                  qdrn = -(qgate + qbulk + qsrc);                  here->BSIM3v1Acggb = Cgg;	          here->BSIM3v1Acgsb = -(Cgg + Cgd + Cgb);	          here->BSIM3v1Acgdb = Cgd;                  here->BSIM3v1Acdgb = -(Cgg + Cbg + Csg);	          here->BSIM3v1Acdsb = (Cgg + Cgd + Cgb + Cbg + Cbd + Cbb			          + Csg + Csd + Csb);	          here->BSIM3v1Acddb = -(Cgd + Cbd + Csd);                  here->BSIM3v1Acbgb = Cbg;	          here->BSIM3v1Acbsb = -(Cbg + Cbd + Cbb);	          here->BSIM3v1Acbdb = Cbd;	      }	      else	      {   V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3;		  if (Vfb <= 0.0)		  {   T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb);		      T2 = -DELTA_3 / T0;		  }		  else		  {   T0 = sqrt(V3 * V3 + 4.0 * DELTA_3 * Vfb);		      T2 = DELTA_3 / T0;		  }		  T1 = 0.5 * (1.0 + V3 / T0);		  Vfbeff = Vfb - 0.5 * (V3 + T0);		  dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd;		  dVfbeff_dVg = T1 * dVgs_eff_dVg;		  dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb			          - T1 * dVbseffCV_dVb;		  Qac0 = CoxWL * (Vfbeff - Vfb);		  dQac0_dVg = CoxWL * dVfbeff_dVg;		  dQac0_dVd = CoxWL * (dVfbeff_dVd - dVfb_dVd);		  dQac0_dVb = CoxWL * (dVfbeff_dVb - dVfb_dVb);                  T0 = 0.5 * pParam->BSIM3v1Ak1;		  T1 = sqrt(T0 * T0 + Vgs_eff - Vfbeff - VbseffCV - Vgsteff);		  Qsub0 = CoxWL * pParam->BSIM3v1Ak1 * (T1 - T0);                  T2 = CoxWL * T0 / T1;                  dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg);                  dQsub0_dVd = -T2 * (dVfbeff_dVd + dVgsteff_dVd);                  dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb                                + dVgsteff_dVb);                  One_Third_CoxWL = CoxWL / 3.0;                  Two_Third_CoxWL = 2.0 * One_Third_CoxWL;                  AbulkCV = Abulk0 * pParam->BSIM3v1AabulkCVfactor;                  dAbulkCV_dVb = pParam->BSIM3v1AabulkCVfactor * dAbulk0_dVb;	          VdsatCV = Vgsteff / AbulkCV;		  V4 = VdsatCV - Vds - DELTA_4;		  T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV);		  VdseffCV = VdsatCV - 0.5 * (V4 + T0);		  T1 = 0.5 * (1.0 + V4 / T0);		  T2 = DELTA_4 / T0;		  T3 = (1.0 - T1 - T2) / AbulkCV;		  dVdseffCV_dVg = T3;		  dVdseffCV_dVd = T1;		  dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb;	          T0 = AbulkCV * VdseffCV;                  T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20);		  T2 = VdseffCV / T1;		  T3 = T0 * T2;                  T4 = (1.0 - 12.0 * T2 * T2 * AbulkCV);                  T5 = (6.0 * T0 * (4.0 * Vgsteff - T0) / (T1 * T1) - 0.5);                  T6 = 12.0 * T2 * T2 * Vgsteff;                  qgate = CoxWL * (Vgsteff - 0.5 * VdseffCV + T3);                  Cgg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg);                  Cgd1 = CoxWL * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd;                  Cgb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)		       + Cgg1 * dVgsteff_dVb;		  Cgg1 *= dVgsteff_dVg;		  T7 = 1.0 - AbulkCV;                  qbulk = CoxWL * T7 * (0.5 * VdseffCV - T3);		  T4 = -T7 * (T4 - 1.0);		  T5 = -T7 * T5;		  T6 = -(T7 * T6 + (0.5 * VdseffCV - T3));                  Cbg1 = CoxWL * (T4 + T5 * dVdseffCV_dVg);                  Cbd1 = CoxWL * T5 * dVdseffCV_dVd + Cbg1 * dVgsteff_dVd;                  Cbb1 = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)		       + Cbg1 * dVgsteff_dVb;		  Cbg1 *= dVgsteff_dVg;                  if (model->BSIM3v1Axpart > 0.5)		  {   /* 0/100 Charge petition model */		      T1 = T1 + T1;                      qsrc = -CoxWL * (0.5 * Vgsteff + 0.25 * T0			   - T0 * T0 / T1);		      T7 = (4.0 * Vgsteff - T0) / (T1 * T1);		      T4 = -(0.5 + 24.0 * T0 * T0 / (T1 * T1));		      T5 = -(0.25 * AbulkCV - 12.0 * AbulkCV * T0 * T7);                      T6 = -(0.25 * VdseffCV - 12.0 * T0 * VdseffCV * T7);                      Csg = CoxWL * (T4 + T5 * dVdseffCV_dVg);                      Csd = CoxWL * T5 * dVdseffCV_dVd + Csg * dVgsteff_dVd;                      Csb = CoxWL * (T5 * dVdseffCV_dVb + T6 * dAbulkCV_dVb)			  + Csg * dVgsteff_dVb;		      Csg *= dVgsteff_dVg;                  }

⌨️ 快捷键说明

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