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

📄 b2eval.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	          T5 = MIN(T5, 30.0);	          T6 = exp(-T5);	          FR = 1.0 + Ai * T6;	          T7 = T5 / (Vds - Vdsat);	          T8 = (1.0 - FR) * T7;	          dFR_dVd = T8 * (dVdsat_dVd - 1.0);	          dFR_dVg = T8 * dVdsat_dVg;	          dFR_dVb = T8 * dVdsat_dVb + T6 * (here->pParam->B2aiB - Ai		          * here->pParam->B2biB / (Vds - Vdsat));	          *gds = (T0 * (dBeta_dVd - Betaeff * dUvert_dVd) + T1 		       * dVgeff_dVd - T2 * dVc_dVd) * FR + *Ids * dFR_dVd;	          *gm = (T0 * (dBeta_dVg - Betaeff * dUvert_dVg) 		      + T1 * dVgeff_dVg - T2 * dVc_dVg) * FR + *Ids * dFR_dVg;	          *gmb = (T0 * (dBeta_dVb - Betaeff * dUvert_dVb) + T1 		       * dVgeff_dVb - T2 * dVc_dVb - *Ids * Inv_Aa * dAa_dVb) 		       * FR + *Ids * dFR_dVb;	          *Ids *= FR;	       }	       else	       {  *gds = T0 * (dBeta_dVd - Betaeff * dUvert_dVd) + T1 		       * dVgeff_dVd - T2 * dVc_dVd;	          *gm = T0 * (dBeta_dVg - Betaeff * dUvert_dVg) + T1 * dVgeff_dVg		      - T2 * dVc_dVg;	          *gmb = T0 * (dBeta_dVb - Betaeff * dUvert_dVb) + T1 		       * dVgeff_dVb - T2 * dVc_dVb - *Ids * Inv_Aa * dAa_dVb;	       }           } /* end of Saturation */       }       else       {   T0 = Exp0 * Exp0;           T1 = Exp1;           *Ids = Beta * model->B2Vtm * model->B2Vtm * T0 * (1.0 - T1);           T2 = *Ids / Beta;           T4 = n * model->B2Vtm;           T3 = *Ids / T4;           if ((Vds > Vdsat) && here->pParam->B2ai0 != 0.0)           {   Ai = here->pParam->B2ai0 + here->pParam->B2aiB * Vbs;               Bi = here->pParam->B2bi0 + here->pParam->B2biB * Vbs;               T5 = Bi / (Vds - Vdsat);               T5 = MIN(T5, 30.0);               T6 = exp(-T5);               FR = 1.0 + Ai * T6;               T7 = T5 / (Vds - Vdsat);               T8 = (1.0 - FR) * T7;               dFR_dVd = T8 * (dVdsat_dVd - 1.0);               dFR_dVg = T8 * dVdsat_dVg;               dFR_dVb = T8 * dVdsat_dVb + T6 * (here->pParam->B2aiB - Ai	               * here->pParam->B2biB / (Vds - Vdsat));           }           else           {   FR = 1.0;	       dFR_dVd = 0.0;	       dFR_dVg = 0.0;	       dFR_dVb = 0.0;           }           *gds = (T2 * dBeta_dVd + T3 * (here->pParam->B2vofD * T4 - dVth_dVd	        - here->pParam->B2nD * Vgst / n) + Beta * model->B2Vtm 		* T0 * T1) * FR + *Ids * dFR_dVd;           *gm = (T2 * dBeta_dVg + T3) * FR + *Ids * dFR_dVg;           *gmb = (T2 * dBeta_dVb + T3 * (here->pParam->B2vofB * T4 - dVth_dVb 	        + here->pParam->B2nB * Vgst / (n * T1s * T1s) * dT1s_dVb)) * FR	        + *Ids * dFR_dVb;           *Ids *= FR;       }   }   else   {   *Ids = 0.0;       *gm = 0.0;       *gds = 0.0;       *gmb = 0.0;   }ChargeComputation:    /* Some Limiting of DC Parameters */    *gds = MAX(*gds,1.0e-20);    if ((model->B2channelChargePartitionFlag > 1)	 || ((!ChargeComputationNeeded) &&	 (model->B2channelChargePartitionFlag > -5)))    {          *qg  = 0.0;        *qd = 0.0;        *qb = 0.0;        *cgg = 0.0;        *cgs = 0.0;        *cgd = 0.0;        *cdg = 0.0;        *cds = 0.0;        *cdd = 0.0;        *cbg = 0.0;        *cbs = 0.0;        *cbd = 0.0;        goto finished;    }    else    {       if (Vbs < 0.0)       {   Vbseff = Vbs;	   dVbseff_dVb = 1.0;       }       else       {   Vbseff = here->pParam->B2phi - Phisb;	   dVbseff_dVb = -dPhisb_dVb;       }       Arg1 = Vgs - Vbseff - here->pParam->B2vfb;       Arg2 = Arg1 - Vgst;       Qbulk = here->pParam->One_Third_CoxWL * Arg2;       dQbulk_dVb = here->pParam->One_Third_CoxWL * (dVth_dVb - dVbseff_dVb);       dQbulk_dVd = here->pParam->One_Third_CoxWL * dVth_dVd;       if (Arg1 <= 0.0)       {          *qg = here->pParam->CoxWL * Arg1;          *qb = -(*qg);          *qd = 0.0;	  *cgg = here->pParam->CoxWL;	  *cgd = 0.0;	  *cgs = -*cgg * (1.0 - dVbseff_dVb);	  *cdg = 0.0;	  *cdd = 0.0;	  *cds = 0.0;	  *cbg = -here->pParam->CoxWL;	  *cbd = 0.0;	  *cbs = -*cgs;       }       else if (Vgst <= 0.0)       {  T2 = Arg1 / Arg2;          T3 = T2 * T2 * (here->pParam->CoxWL - here->pParam->Two_Third_CoxWL	     * T2);	  *qg = here->pParam->CoxWL * Arg1 * (1.0 - T2 * (1.0 - T2 / 3.0));          *qb = -(*qg);          *qd = 0.0;	  *cgg = here->pParam->CoxWL * (1.0 - T2 * (2.0 - T2));	  tmp = T3 * dVth_dVb - (*cgg + T3) * dVbseff_dVb;	  *cgd = T3 * dVth_dVd;	  *cgs = -(*cgg + *cgd + tmp);	  *cdg = 0.0;	  *cdd = 0.0;	  *cds = 0.0;	  *cbg = -*cgg;	  *cbd = -*cgd;	  *cbs = -*cgs;       }       else       {  if (Vgst < here->pParam->B2vghigh)	  {    Uvert = 1.0 + Vgst * (Ua + Vgst * Ub);               Uvert = MAX(Uvert, 0.2);               Inv_Uvert = 1.0 / Uvert;               dUvert_dVg = Ua + 2.0 * Ub * Vgst;               dUvert_dVd = -dUvert_dVg * dVth_dVd;               dUvert_dVb = -dUvert_dVg * dVth_dVb + Vgst 		    * (here->pParam->B2uaB + Vgst * here->pParam->B2ubB);               T8 = U1s * Inv_Aa * Inv_Uvert;               Vc = T8 * Vgst;               T9 = Vc * Inv_Uvert;               dVc_dVg = T8 - T9 * dUvert_dVg;               dVc_dVd = -T8 * dVth_dVd - T9 * dUvert_dVd;               dVc_dVb = -T8 * dVth_dVb + here->pParam->B2u1B * Vgst * Inv_Aa 	               * Inv_Uvert - Vc * Inv_Aa * dAa_dVb - T9 * dUvert_dVb;               tmp2 = sqrt(1.0 + 2.0 * Vc);               Kk = 0.5 * (1.0 + Vc + tmp2);               Inv_Kk = 1.0 / Kk;               dKk_dVc = 0.5  + 0.5 / tmp2;               SqrtKk = sqrt(Kk);               T8 = Inv_Aa / SqrtKk;               Vdsat = Vgst * T8;               T9 = 0.5 * Vdsat * Inv_Kk * dKk_dVc;               dVdsat_dVd = -T8 * dVth_dVd - T9 * dVc_dVd;               dVdsat_dVg = T8 - T9 * dVc_dVg;               dVdsat_dVb = -T8 * dVth_dVb - T9 * dVc_dVb 			  - Vdsat* Inv_Aa * dAa_dVb;          }          if (Vds >= Vdsat)          {       /* saturation region */	      *cgg = here->pParam->Two_Third_CoxWL;	      *cgd = -*cgg * dVth_dVd + dQbulk_dVd;	      tmp = -*cgg * dVth_dVb + dQbulk_dVb;	      *cgs = -(*cgg + *cgd + tmp);	      *cbg = 0.0;	      *cbd = -dQbulk_dVd;	      *cbs = dQbulk_dVd + dQbulk_dVb;	      *cdg = -0.4 * *cgg;	      tmp = -*cdg * dVth_dVb;	      *cdd = -*cdg * dVth_dVd;	      *cds = -(*cdg + *cdd + tmp);	      *qb = -Qbulk;	      *qg = here->pParam->Two_Third_CoxWL * Vgst + Qbulk;	      *qd = *cdg * Vgst;           }           else           {       /* linear region  */	      T7 = Vds / Vdsat;	      T8 = Vgst / Vdsat;	      T6 = T7 * T8;	      T9 = 1.0 - T7;              Vgdt = Vgst * T9;	      T0 = Vgst / (Vgst + Vgdt);	      T1 = Vgdt / (Vgst + Vgdt);	      T5 = T0 * T1;	      T2 = 1.0 -  T1 + T5;	      T3 = 1.0 -  T0 + T5;	      dVgdt_dVg = T9 + T6 * dVdsat_dVg;	      dVgdt_dVd = T6 * dVdsat_dVd - T8 -T9 * dVth_dVd;	      dVgdt_dVb = T6 * dVdsat_dVb -T9 * dVth_dVb;	      *qg = here->pParam->Two_Third_CoxWL * (Vgst + Vgdt 	         - Vgdt * T0) + Qbulk;	      *qb = -Qbulk;	      *qd = -here->pParam->One_Third_CoxWL * (0.2 * Vgdt 		 + 0.8 * Vgst + Vgdt * T1 		 + 0.2 * T5 * (Vgdt - Vgst));	      *cgg = here->pParam->Two_Third_CoxWL * (T2 + T3 * dVgdt_dVg);	      tmp = dQbulk_dVb + here->pParam->Two_Third_CoxWL * (T3 * dVgdt_dVb 	          - T2 * dVth_dVb);	      *cgd = here->pParam->Two_Third_CoxWL * (T3 * dVgdt_dVd 		   - T2 * dVth_dVd) + dQbulk_dVd;	      *cgs = -(*cgg + *cgd + tmp);	      T2 = 0.8 - 0.4 * T1 * (2.0 * T1 + T0 + T0 * (T1 - T0));	      T3 = 0.2 + T1 + T0 * (1.0 - 0.4 * T0 * (T1 + 3.0 * T0));	      *cdg = -here->pParam->One_Third_CoxWL * (T2 + T3 * dVgdt_dVg);	      tmp = here->pParam->One_Third_CoxWL * (T2 * dVth_dVb 		  - T3 * dVgdt_dVb);	      *cdd = here->pParam->One_Third_CoxWL * (T2 * dVth_dVd 		   - T3 * dVgdt_dVd);	      *cds = -(*cdg + tmp + *cdd);	      *cbg = 0.0;	      *cbd = -dQbulk_dVd;	      *cbs = dQbulk_dVd + dQbulk_dVb;           }       }    }finished:       /* returning Values to Calling Routine */    valuetypeflag = (int) model->B2channelChargePartitionFlag;    switch (valuetypeflag)     {      case 0: *Ids = MAX(*Ids,1e-50);              break;      case -1: *Ids = MAX(*Ids,1e-50);              break;      case -2: *Ids = *gm;              break;      case -3: *Ids = *gds;              break;      case -4: *Ids = 1.0 / *gds;              break;      case -5: *Ids = *gmb;              break;      case -6: *Ids = *qg / 1.0e-12;              break;      case -7: *Ids = *qb / 1.0e-12;              break;      case -8: *Ids = *qd / 1.0e-12;              break;      case -9: *Ids = -(*qb + *qg + *qd) / 1.0e-12;              break;      case -10: *Ids = *cgg / 1.0e-12;              break;      case -11: *Ids = *cgd / 1.0e-12;              break;      case -12: *Ids = *cgs / 1.0e-12;              break;      case -13: *Ids = -(*cgg + *cgd + *cgs) / 1.0e-12;              break;      case -14: *Ids = *cbg / 1.0e-12;              break;      case -15: *Ids = *cbd / 1.0e-12;              break;      case -16: *Ids = *cbs / 1.0e-12;              break;      case -17: *Ids = -(*cbg + *cbd + *cbs) / 1.0e-12;              break;      case -18: *Ids = *cdg / 1.0e-12;              break;      case -19: *Ids = *cdd / 1.0e-12;              break;      case -20: *Ids = *cds / 1.0e-12;              break;      case -21: *Ids = -(*cdg + *cdd + *cds) / 1.0e-12;              break;      case -22: *Ids = -(*cgg + *cdg + *cbg) / 1.0e-12;              break;      case -23: *Ids = -(*cgd + *cdd + *cbd) / 1.0e-12;              break;      case -24: *Ids = -(*cgs + *cds + *cbs) / 1.0e-12;              break;      default: *Ids = MAX(*Ids, 1.0e-50);	      break;     }    *von = Vth;    *vdsat = Vdsat;}   

⌨️ 快捷键说明

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