b3soifdtemp.c

来自「ngspice又一个电子CAD仿真软件代码.功能更全」· C语言 代码 · 共 822 行 · 第 1/3 页

C
822
字号
                  if (pParam->B3SOIFDu0 > 1.0)                       pParam->B3SOIFDu0 = pParam->B3SOIFDu0 / 1.0e4;                  pParam->B3SOIFDu0temp = pParam->B3SOIFDu0				      * pow(TRatio, pParam->B3SOIFDute);                   pParam->B3SOIFDvsattemp = pParam->B3SOIFDvsat - pParam->B3SOIFDat 			                * T0;	          pParam->B3SOIFDrds0 = (pParam->B3SOIFDrdsw + pParam->B3SOIFDprt * T0)                                    / pow(pParam->B3SOIFDweff * 1E6, pParam->B3SOIFDwr);		  if (B3SOIFDcheckModel(model, here, ckt))		  {   IFuid namarray[2];                      namarray[0] = model->B3SOIFDmodName;                      namarray[1] = here->B3SOIFDname;                      (*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during B3SOIFDV3 parameter checking for %s in model %s", namarray);                      return(E_BADPARM);   		  }                  pParam->B3SOIFDcgdo = (model->B3SOIFDcgdo + pParam->B3SOIFDcf)				    * pParam->B3SOIFDweffCV;                  pParam->B3SOIFDcgso = (model->B3SOIFDcgso + pParam->B3SOIFDcf)				    * pParam->B3SOIFDweffCV;                  pParam->B3SOIFDcgeo = model->B3SOIFDcgeo * pParam->B3SOIFDleffCV;                  if (!model->B3SOIFDnpeakGiven && model->B3SOIFDgamma1Given)                  {   T0 = pParam->B3SOIFDgamma1 * model->B3SOIFDcox;                      pParam->B3SOIFDnpeak = 3.021E22 * T0 * T0;                  }                  T0 = pow(TRatio, model->B3SOIFDxbjt / pParam->B3SOIFDndiode);                  T1 = pow(TRatio, model->B3SOIFDxdif / pParam->B3SOIFDndiode);                  T2 = pow(TRatio, model->B3SOIFDxrec / pParam->B3SOIFDndiode / 2);                  T4 = -Eg0 / pParam->B3SOIFDndiode / model->B3SOIFDvtm * (1 - TRatio);                  T5 = exp(T4);                  T6 = sqrt(T5);                  pParam->B3SOIFDjbjt = pParam->B3SOIFDisbjt * T0 * T5;                  pParam->B3SOIFDjdif = pParam->B3SOIFDisdif * T1 * T5;                  pParam->B3SOIFDjrec = pParam->B3SOIFDisrec * T2 * T6;                  T0 = pow(TRatio, model->B3SOIFDxtun / pParam->B3SOIFDntun);                  pParam->B3SOIFDjtun = pParam->B3SOIFDistun * T0 ;                  if (pParam->B3SOIFDnsub > 0)                     pParam->B3SOIFDvfbb = -model->B3SOIFDtype * model->B3SOIFDvtm *                                log(pParam->B3SOIFDnpeak/ pParam->B3SOIFDnsub);                  else                     pParam->B3SOIFDvfbb = -model->B3SOIFDtype * model->B3SOIFDvtm *                                log(-pParam->B3SOIFDnpeak* pParam->B3SOIFDnsub/ni/ni);                  if (!model->B3SOIFDvsdfbGiven)                  {                     if (pParam->B3SOIFDnsub > 0)                        pParam->B3SOIFDvsdfb = -model->B3SOIFDtype * (model->B3SOIFDvtm*log(1e20 *                                            pParam->B3SOIFDnsub / ni /ni) - 0.3);                     else if (pParam->B3SOIFDnsub < 0)                        pParam->B3SOIFDvsdfb = -model->B3SOIFDtype * (model->B3SOIFDvtm*log(-1e20 /                                            pParam->B3SOIFDnsub) + 0.3);                  }                                   /* Phi  & Gamma */                  SDphi = 2.0*model->B3SOIFDvtm*log(fabs(pParam->B3SOIFDnsub) / ni);                  SDgamma = 5.753e-12 * sqrt(fabs(pParam->B3SOIFDnsub)) / model->B3SOIFDcbox;                  if (!model->B3SOIFDvsdthGiven)                  {                     if ( ((pParam->B3SOIFDnsub > 0) && (model->B3SOIFDtype > 0)) ||                          ((pParam->B3SOIFDnsub < 0) && (model->B3SOIFDtype < 0)) )                        pParam->B3SOIFDvsdth = pParam->B3SOIFDvsdfb + SDphi +                                            SDgamma * sqrt(SDphi);                     else                         pParam->B3SOIFDvsdth = pParam->B3SOIFDvsdfb - SDphi -                                            SDgamma * sqrt(SDphi);                  }                  if (!model->B3SOIFDcsdminGiven)                  {                     /* Cdmin */                     tmp = sqrt(2.0 * EPSSI * SDphi / (Charge_q *                                 fabs(pParam->B3SOIFDnsub) * 1.0e6));                     tmp1 = EPSSI / tmp;                     model->B3SOIFDcsdmin = tmp1 * model->B3SOIFDcbox /                                          (tmp1 + model->B3SOIFDcbox);                  }                  T0 = model->B3SOIFDcsdesw * log(1 + model->B3SOIFDtsi /                       model->B3SOIFDtbox);                  T1 = here->B3SOIFDsourcePerimeter - pParam->B3SOIFDweff;                  if (T1 > 0.0)                     pParam->B3SOIFDcsesw = T0 * T1;                   else                     pParam->B3SOIFDcsesw = 0.0;                  T1 = here->B3SOIFDdrainPerimeter - pParam->B3SOIFDweff;                  if (T1 > 0.0)                     pParam->B3SOIFDcdesw = T0 * T1;                  else                     pParam->B3SOIFDcdesw = 0.0;		  pParam->B3SOIFDphi = 2.0 * model->B3SOIFDvtm 			           * log(pParam->B3SOIFDnpeak / ni);	          pParam->B3SOIFDsqrtPhi = sqrt(pParam->B3SOIFDphi);	          pParam->B3SOIFDphis3 = pParam->B3SOIFDsqrtPhi * pParam->B3SOIFDphi;                  pParam->B3SOIFDXdep0 = sqrt(2.0 * EPSSI / (Charge_q				     * pParam->B3SOIFDnpeak * 1.0e6))                                     * pParam->B3SOIFDsqrtPhi;                   pParam->B3SOIFDsqrtXdep0 = sqrt(pParam->B3SOIFDXdep0);                  pParam->B3SOIFDlitl = sqrt(3.0 * model->B3SOIFDxj				    * model->B3SOIFDtox);                  pParam->B3SOIFDvbi = model->B3SOIFDvtm * log(1.0e20			           * pParam->B3SOIFDnpeak / (ni * ni));                  pParam->B3SOIFDcdep0 = sqrt(Charge_q * EPSSI				     * pParam->B3SOIFDnpeak * 1.0e6 / 2.0				     / pParam->B3SOIFDphi);                          if (model->B3SOIFDk1Given || model->B3SOIFDk2Given)	          {   if (!model->B3SOIFDk1Given)	              {   fprintf(stdout, "Warning: k1 should be specified with k2.\n");                          pParam->B3SOIFDk1 = 0.53;                      }                      if (!model->B3SOIFDk2Given)	              {   fprintf(stdout, "Warning: k2 should be specified with k1.\n");                          pParam->B3SOIFDk2 = -0.0186;                      }                      if (model->B3SOIFDxtGiven)                          fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n");                      if (model->B3SOIFDvbxGiven)                          fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n");                      if (model->B3SOIFDvbmGiven)                          fprintf(stdout, "Warning: vbm is ignored because k1 or k2 is given.\n");                      if (model->B3SOIFDgamma1Given)                          fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n");                      if (model->B3SOIFDgamma2Given)                          fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n");                  }                  else	          {   if (!model->B3SOIFDvbxGiven)                          pParam->B3SOIFDvbx = pParam->B3SOIFDphi - 7.7348e-4                                            * pParam->B3SOIFDnpeak					   * pParam->B3SOIFDxt * pParam->B3SOIFDxt;	              if (pParam->B3SOIFDvbx > 0.0)		          pParam->B3SOIFDvbx = -pParam->B3SOIFDvbx;	              if (pParam->B3SOIFDvbm > 0.0)                          pParam->B3SOIFDvbm = -pParam->B3SOIFDvbm;                                 if (!model->B3SOIFDgamma1Given)                          pParam->B3SOIFDgamma1 = 5.753e-12					      * sqrt(pParam->B3SOIFDnpeak)                                              / model->B3SOIFDcox;                      if (!model->B3SOIFDgamma2Given)                          pParam->B3SOIFDgamma2 = 5.753e-12					      * sqrt(pParam->B3SOIFDnsub)                                              / model->B3SOIFDcox;                      T0 = pParam->B3SOIFDgamma1 - pParam->B3SOIFDgamma2;                      T1 = sqrt(pParam->B3SOIFDphi - pParam->B3SOIFDvbx)			 - pParam->B3SOIFDsqrtPhi;                      T2 = sqrt(pParam->B3SOIFDphi * (pParam->B3SOIFDphi			 - pParam->B3SOIFDvbm)) - pParam->B3SOIFDphi;                      pParam->B3SOIFDk2 = T0 * T1 / (2.0 * T2 + pParam->B3SOIFDvbm);                      pParam->B3SOIFDk1 = pParam->B3SOIFDgamma2 - 2.0				      * pParam->B3SOIFDk2 * sqrt(pParam->B3SOIFDphi				      - pParam->B3SOIFDvbm);                  } 		  if (pParam->B3SOIFDk2 < 0.0)		  {   T0 = 0.5 * pParam->B3SOIFDk1 / pParam->B3SOIFDk2;                      pParam->B3SOIFDvbsc = 0.9 * (pParam->B3SOIFDphi - T0 * T0);		      if (pParam->B3SOIFDvbsc > -3.0)		          pParam->B3SOIFDvbsc = -3.0;		      else if (pParam->B3SOIFDvbsc < -30.0)		          pParam->B3SOIFDvbsc = -30.0;		  }		  else		  {   pParam->B3SOIFDvbsc = -30.0;		  }		  if (pParam->B3SOIFDvbsc > pParam->B3SOIFDvbm)		      pParam->B3SOIFDvbsc = pParam->B3SOIFDvbm;	          if (model->B3SOIFDvth0Given)		  {   pParam->B3SOIFDvfb = model->B3SOIFDtype * pParam->B3SOIFDvth0                                        - pParam->B3SOIFDphi - pParam->B3SOIFDk1                                        * pParam->B3SOIFDsqrtPhi;		  }		  else		  {   pParam->B3SOIFDvfb = -1.0;		      pParam->B3SOIFDvth0 = model->B3SOIFDtype * (pParam->B3SOIFDvfb                                        + pParam->B3SOIFDphi + pParam->B3SOIFDk1                                         * pParam->B3SOIFDsqrtPhi);		  }                  T1 = sqrt(EPSSI / EPSOX * model->B3SOIFDtox		     * pParam->B3SOIFDXdep0);                  T0 = exp(-0.5 * pParam->B3SOIFDdsub * pParam->B3SOIFDleff / T1);                  pParam->B3SOIFDtheta0vb0 = (T0 + 2.0 * T0 * T0);                  T0 = exp(-0.5 * pParam->B3SOIFDdrout * pParam->B3SOIFDleff / T1);                  T2 = (T0 + 2.0 * T0 * T0);                  pParam->B3SOIFDthetaRout = pParam->B3SOIFDpdibl1 * T2				         + pParam->B3SOIFDpdibl2;                  here->B3SOIFDminIsub = 5.0e-2 * pParam->B3SOIFDweff * model->B3SOIFDtsi                                     * MAX(pParam->B3SOIFDisdif, pParam->B3SOIFDisrec);	      }              here->B3SOIFDcsbox = model->B3SOIFDcbox*here->B3SOIFDsourceArea;              here->B3SOIFDcsmin = model->B3SOIFDcsdmin*here->B3SOIFDsourceArea;              here->B3SOIFDcdbox = model->B3SOIFDcbox*here->B3SOIFDdrainArea;              here->B3SOIFDcdmin = model->B3SOIFDcsdmin*here->B3SOIFDdrainArea;              if ( ((pParam->B3SOIFDnsub > 0) && (model->B3SOIFDtype > 0)) ||	           ((pParam->B3SOIFDnsub < 0) && (model->B3SOIFDtype < 0)) )              {                 T0 = pParam->B3SOIFDvsdth - pParam->B3SOIFDvsdfb;                 pParam->B3SOIFDsdt1 = pParam->B3SOIFDvsdfb + model->B3SOIFDasd * T0;                 T1 = here->B3SOIFDcsbox - here->B3SOIFDcsmin;                 T2 = T1 / T0 / T0;                 pParam->B3SOIFDst2 = T2 / model->B3SOIFDasd;                 pParam->B3SOIFDst3 = T2 /( 1 - model->B3SOIFDasd);                 here->B3SOIFDst4 =  T0 * T1 * (1 + model->B3SOIFDasd) / 3                                  - here->B3SOIFDcsmin * pParam->B3SOIFDvsdfb;                  T1 = here->B3SOIFDcdbox - here->B3SOIFDcdmin;                 T2 = T1 / T0 / T0;                 pParam->B3SOIFDdt2 = T2 / model->B3SOIFDasd;                 pParam->B3SOIFDdt3 = T2 /( 1 - model->B3SOIFDasd);                 here->B3SOIFDdt4 =  T0 * T1 * (1 + model->B3SOIFDasd) / 3                                  - here->B3SOIFDcdmin * pParam->B3SOIFDvsdfb;	      } else              {                 T0 = pParam->B3SOIFDvsdfb - pParam->B3SOIFDvsdth;                 pParam->B3SOIFDsdt1 = pParam->B3SOIFDvsdth + model->B3SOIFDasd * T0;                 T1 = here->B3SOIFDcsmin - here->B3SOIFDcsbox;                 T2 = T1 / T0 / T0;                 pParam->B3SOIFDst2 = T2 / model->B3SOIFDasd;                 pParam->B3SOIFDst3 = T2 /( 1 - model->B3SOIFDasd);                 here->B3SOIFDst4 =  T0 * T1 * (1 + model->B3SOIFDasd) / 3                                  - here->B3SOIFDcsbox * pParam->B3SOIFDvsdth;                   T1 = here->B3SOIFDcdmin - here->B3SOIFDcdbox;                 T2 = T1 / T0 / T0;                 pParam->B3SOIFDdt2 = T2 / model->B3SOIFDasd;                 pParam->B3SOIFDdt3 = T2 /( 1 - model->B3SOIFDasd);                 here->B3SOIFDdt4 =  T0 * T1 * (1 + model->B3SOIFDasd) / 3                                  - here->B3SOIFDcdbox * pParam->B3SOIFDvsdth;              } 	      here->B3SOIFDphi = pParam->B3SOIFDphi;              /* process source/drain series resistance */              here->B3SOIFDdrainConductance = model->B3SOIFDsheetResistance 		                              * here->B3SOIFDdrainSquares;              if (here->B3SOIFDdrainConductance > 0.0)                  here->B3SOIFDdrainConductance = 1.0					      / here->B3SOIFDdrainConductance;	      else                  here->B3SOIFDdrainConductance = 0.0;                                here->B3SOIFDsourceConductance = model->B3SOIFDsheetResistance 		                           * here->B3SOIFDsourceSquares;              if (here->B3SOIFDsourceConductance > 0.0)                   here->B3SOIFDsourceConductance = 1.0					       / here->B3SOIFDsourceConductance;	      else                  here->B3SOIFDsourceConductance = 0.0;	      here->B3SOIFDcgso = pParam->B3SOIFDcgso;	      here->B3SOIFDcgdo = pParam->B3SOIFDcgdo;         }    }    return(OK);}

⌨️ 快捷键说明

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