b3temp.c

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

C
1,044
字号
                  pParam->BSIM3tconst = pParam->BSIM3u0temp * pParam->BSIM3elm / (model->BSIM3cox                                      * pParam->BSIM3weffCV * pParam->BSIM3leffCV * T0);                  if (!model->BSIM3npeakGiven && model->BSIM3gamma1Given)                  {   T0 = pParam->BSIM3gamma1 * model->BSIM3cox;                      pParam->BSIM3npeak = 3.021E22 * T0 * T0;                  }		  pParam->BSIM3phi = 2.0 * Vtm0 			           * log(pParam->BSIM3npeak / ni);	          pParam->BSIM3sqrtPhi = sqrt(pParam->BSIM3phi);	          pParam->BSIM3phis3 = pParam->BSIM3sqrtPhi * pParam->BSIM3phi;                  pParam->BSIM3Xdep0 = sqrt(2.0 * EPSSI / (Charge_q				     * pParam->BSIM3npeak * 1.0e6))                                     * pParam->BSIM3sqrtPhi;                   pParam->BSIM3sqrtXdep0 = sqrt(pParam->BSIM3Xdep0);                  pParam->BSIM3litl = sqrt(3.0 * pParam->BSIM3xj				    * model->BSIM3tox);                  pParam->BSIM3vbi = Vtm0 * log(1.0e20			           * pParam->BSIM3npeak / (ni * ni));                  pParam->BSIM3cdep0 = sqrt(Charge_q * EPSSI				     * pParam->BSIM3npeak * 1.0e6 / 2.0				     / pParam->BSIM3phi);                  pParam->BSIM3ldeb = sqrt(EPSSI * Vtm0 / (Charge_q                                    * pParam->BSIM3npeak * 1.0e6)) / 3.0;                  pParam->BSIM3acde *= pow((pParam->BSIM3npeak / 2.0e16), -0.25);                  if (model->BSIM3k1Given || model->BSIM3k2Given)	          {   if (!model->BSIM3k1Given)	              {   fprintf(stdout, "Warning: k1 should be specified with k2.\n");                          pParam->BSIM3k1 = 0.53;                      }                      if (!model->BSIM3k2Given)	              {   fprintf(stdout, "Warning: k2 should be specified with k1.\n");                          pParam->BSIM3k2 = -0.0186;                      }                      if (model->BSIM3nsubGiven)                          fprintf(stdout, "Warning: nsub is ignored because k1 or k2 is given.\n");                      if (model->BSIM3xtGiven)                          fprintf(stdout, "Warning: xt is ignored because k1 or k2 is given.\n");                      if (model->BSIM3vbxGiven)                          fprintf(stdout, "Warning: vbx is ignored because k1 or k2 is given.\n");                      if (model->BSIM3gamma1Given)                          fprintf(stdout, "Warning: gamma1 is ignored because k1 or k2 is given.\n");                      if (model->BSIM3gamma2Given)                          fprintf(stdout, "Warning: gamma2 is ignored because k1 or k2 is given.\n");                  }                  else	          {   if (!model->BSIM3vbxGiven)                          pParam->BSIM3vbx = pParam->BSIM3phi - 7.7348e-4                                            * pParam->BSIM3npeak					   * pParam->BSIM3xt * pParam->BSIM3xt;	              if (pParam->BSIM3vbx > 0.0)		          pParam->BSIM3vbx = -pParam->BSIM3vbx;	              if (pParam->BSIM3vbm > 0.0)                          pParam->BSIM3vbm = -pParam->BSIM3vbm;                                 if (!model->BSIM3gamma1Given)                          pParam->BSIM3gamma1 = 5.753e-12					      * sqrt(pParam->BSIM3npeak)                                              / model->BSIM3cox;                      if (!model->BSIM3gamma2Given)                          pParam->BSIM3gamma2 = 5.753e-12					      * sqrt(pParam->BSIM3nsub)                                              / model->BSIM3cox;                      T0 = pParam->BSIM3gamma1 - pParam->BSIM3gamma2;                      T1 = sqrt(pParam->BSIM3phi - pParam->BSIM3vbx)			 - pParam->BSIM3sqrtPhi;                      T2 = sqrt(pParam->BSIM3phi * (pParam->BSIM3phi			 - pParam->BSIM3vbm)) - pParam->BSIM3phi;                      pParam->BSIM3k2 = T0 * T1 / (2.0 * T2 + pParam->BSIM3vbm);                      pParam->BSIM3k1 = pParam->BSIM3gamma2 - 2.0				      * pParam->BSIM3k2 * sqrt(pParam->BSIM3phi				      - pParam->BSIM3vbm);                  } 		  if (pParam->BSIM3k2 < 0.0)		  {   T0 = 0.5 * pParam->BSIM3k1 / pParam->BSIM3k2;                      pParam->BSIM3vbsc = 0.9 * (pParam->BSIM3phi - T0 * T0);		      if (pParam->BSIM3vbsc > -3.0)		          pParam->BSIM3vbsc = -3.0;		      else if (pParam->BSIM3vbsc < -30.0)		          pParam->BSIM3vbsc = -30.0;		  }		  else		  {   pParam->BSIM3vbsc = -30.0;		  }		  if (pParam->BSIM3vbsc > pParam->BSIM3vbm)		      pParam->BSIM3vbsc = pParam->BSIM3vbm;                  if (!model->BSIM3vfbGiven)                  {   if (model->BSIM3vth0Given)                      {   pParam->BSIM3vfb = model->BSIM3type * pParam->BSIM3vth0                                           - pParam->BSIM3phi - pParam->BSIM3k1                                           * pParam->BSIM3sqrtPhi;                      }                      else                      {   pParam->BSIM3vfb = -1.0;                      }                  }                  if (!model->BSIM3vth0Given)                  {   pParam->BSIM3vth0 = model->BSIM3type * (pParam->BSIM3vfb                                        + pParam->BSIM3phi + pParam->BSIM3k1                                        * pParam->BSIM3sqrtPhi);                  }                  pParam->BSIM3k1ox = pParam->BSIM3k1 * model->BSIM3tox                                    / model->BSIM3toxm;                  pParam->BSIM3k2ox = pParam->BSIM3k2 * model->BSIM3tox                                    / model->BSIM3toxm;                  T1 = sqrt(EPSSI / EPSOX * model->BSIM3tox		     * pParam->BSIM3Xdep0);                  T0 = exp(-0.5 * pParam->BSIM3dsub * pParam->BSIM3leff / T1);                  pParam->BSIM3theta0vb0 = (T0 + 2.0 * T0 * T0);                  T0 = exp(-0.5 * pParam->BSIM3drout * pParam->BSIM3leff / T1);                  T2 = (T0 + 2.0 * T0 * T0);                  pParam->BSIM3thetaRout = pParam->BSIM3pdibl1 * T2				         + pParam->BSIM3pdibl2;                  tmp = sqrt(pParam->BSIM3Xdep0);                  tmp1 = pParam->BSIM3vbi - pParam->BSIM3phi;                  tmp2 = model->BSIM3factor1 * tmp;                  T0 = -0.5 * pParam->BSIM3dvt1w * pParam->BSIM3weff                     * pParam->BSIM3leff / tmp2;                  if (T0 > -EXP_THRESHOLD)                  {   T1 = exp(T0);                      T2 = T1 * (1.0 + 2.0 * T1);                  }                  else                  {   T1 = MIN_EXP;                      T2 = T1 * (1.0 + 2.0 * T1);                  }                  T0 = pParam->BSIM3dvt0w * T2;                  T2 = T0 * tmp1;                  T0 = -0.5 * pParam->BSIM3dvt1 * pParam->BSIM3leff / tmp2;                  if (T0 > -EXP_THRESHOLD)                  {   T1 = exp(T0);                      T3 = T1 * (1.0 + 2.0 * T1);                  }                  else                  {   T1 = MIN_EXP;                      T3 = T1 * (1.0 + 2.0 * T1);                  }                  T3 = pParam->BSIM3dvt0 * T3 * tmp1;                  T4 = model->BSIM3tox * pParam->BSIM3phi                     / (pParam->BSIM3weff + pParam->BSIM3w0);                  T0 = sqrt(1.0 + pParam->BSIM3nlx / pParam->BSIM3leff);                  T5 = pParam->BSIM3k1ox * (T0 - 1.0) * pParam->BSIM3sqrtPhi                     + (pParam->BSIM3kt1 + pParam->BSIM3kt1l / pParam->BSIM3leff)                     * (TRatio - 1.0);                  tmp3 = model->BSIM3type * pParam->BSIM3vth0                       - T2 - T3 + pParam->BSIM3k3 * T4 + T5;                  pParam->BSIM3vfbzb = tmp3 - pParam->BSIM3phi - pParam->BSIM3k1                                     * pParam->BSIM3sqrtPhi;                  /* End of vfbzb */              }	      else /* !Size_Not_Found */	      {	          /* va: pParam might be uninitialized, if !Size_Not_Found */	          pParam = here->pParam;	      }              /* process source/drain series resistance */              /* acm model */              if (model->BSIM3acmMod == 0)              {	        here->BSIM3drainConductance = model->BSIM3sheetResistance 			                              * here->BSIM3drainSquares;	        here->BSIM3sourceConductance = model->BSIM3sheetResistance 			                           * here->BSIM3sourceSquares;              }               else               {                if (here->BSIM3drainSquaresGiven)                {                  here->BSIM3drainConductance = (model->BSIM3ld + model->BSIM3ldif)/(here->BSIM3w + model->BSIM3xw)*model->BSIM3rd                                               + model->BSIM3sheetResistance * here->BSIM3drainSquares + model->BSIM3rdc;                }                else                {                  here->BSIM3drainConductance = ((model->BSIM3ld + model->BSIM3ldif)*model->BSIM3rd                                                + model->BSIM3hdif*model->BSIM3sheetResistance)/(here->BSIM3w + model->BSIM3xw) + model->BSIM3rdc;                }                if (here->BSIM3sourceSquaresGiven)                {                  here->BSIM3sourceConductance = (model->BSIM3ld + model->BSIM3ldif)/(here->BSIM3w + model->BSIM3xw)*model->BSIM3rs                                               + model->BSIM3sheetResistance * here->BSIM3sourceSquares + model->BSIM3rsc;                }                else                {                  here->BSIM3sourceConductance = ((model->BSIM3ld + model->BSIM3ldif)*model->BSIM3rs                                                + model->BSIM3hdif*model->BSIM3sheetResistance)/(here->BSIM3w + model->BSIM3xw) + model->BSIM3rsc;                }              }              if (here->BSIM3drainConductance > 0.0)                  here->BSIM3drainConductance = 1.0		  			      / here->BSIM3drainConductance;	      else                  here->BSIM3drainConductance = 0.0;              if (here->BSIM3sourceConductance > 0.0)                   here->BSIM3sourceConductance = 1.0					       / here->BSIM3sourceConductance;	      else                  here->BSIM3sourceConductance = 0.0;	      here->BSIM3cgso = pParam->BSIM3cgso;	      here->BSIM3cgdo = pParam->BSIM3cgdo;              Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff;              if (model->BSIM3acmMod == 0)              {                if ((here->BSIM3sourceArea <= 0.0) &&                    (here->BSIM3sourcePerimeter <= 0.0))                {   SourceSatCurrent = 1.0e-14;                }                else                {   SourceSatCurrent = here->BSIM3sourceArea                                     * model->BSIM3jctTempSatCurDensity                                     + here->BSIM3sourcePerimeter                                     * model->BSIM3jctSidewallTempSatCurDensity;                }                if ((SourceSatCurrent > 0.0) && (model->BSIM3ijth > 0.0))                {   here->BSIM3vjsm = Nvtm * log(model->BSIM3ijth                                    / SourceSatCurrent + 1.0);  			/* Added revision dependent code */  			switch (model->BSIM3intVersion) {  			case BSIM3V324:  			case BSIM3V323:  			case BSIM3V322:  				here->BSIM3IsEvjsm =  					SourceSatCurrent * exp(here->BSIM3vjsm / Nvtm);  				break;  			case BSIM3V32:  			default:  				/* Do nothing */  				break;  			}                }                  if ((here->BSIM3drainArea <= 0.0) &&                    (here->BSIM3drainPerimeter <= 0.0))                {   DrainSatCurrent = 1.0e-14;                }                else                {   DrainSatCurrent = here->BSIM3drainArea                                    * model->BSIM3jctTempSatCurDensity                                    + here->BSIM3drainPerimeter                                    * model->BSIM3jctSidewallTempSatCurDensity;                }                if ((DrainSatCurrent > 0.0) && (model->BSIM3ijth > 0.0))                {   here->BSIM3vjdm = Nvtm * log(model->BSIM3ijth                                    / DrainSatCurrent + 1.0);  			/* Added revision dependent code */  			switch (model->BSIM3intVersion) {  			case BSIM3V324:  			case BSIM3V323:  			case BSIM3V322:  				here->BSIM3IsEvjdm =   					DrainSatCurrent * exp(here->BSIM3vjdm / Nvtm);  				break;  			case BSIM3V32:  			default:  				/* Do nothing */  				break;  			}                }              }              else              {                SourceSatCurrent = 0.0;                if (!here->BSIM3sourceAreaGiven)                {                     here->BSIM3sourceArea = 2.0 * model->BSIM3hdif * pParam->BSIM3weff;                }                SourceSatCurrent = here->BSIM3sourceArea * model->BSIM3jctTempSatCurDensity;                if (!here->BSIM3sourcePerimeterGiven)                {                     here->BSIM3sourcePerimeter = 4.0 * model->BSIM3hdif + 2.0 * pParam->BSIM3weff;                }                SourceSatCurrent = SourceSatCurrent + here->BSIM3sourcePerimeter * model->BSIM3jctSidewallTempSatCurDensity;                if (SourceSatCurrent <= 0.0) SourceSatCurrent = 1.0e-14;                if ((SourceSatCurrent > 0.0) && (model->BSIM3ijth > 0.0))                {   here->BSIM3vjsm = Nvtm * log(model->BSIM3ijth                                    / SourceSatCurrent + 1.0);  		    /* Added revision dependent code */  		    switch (model->BSIM3intVersion) {  		    case BSIM3V324:  		    case BSIM3V323:  		    case BSIM3V322:  		    	here->BSIM3IsEvjsm =  		    		SourceSatCurrent * exp(here->BSIM3vjsm / Nvtm);  		    	break;  		    case BSIM3V32:  		    default:  		    	/* Do nothing */  			break;  		    }                }                DrainSatCurrent = 0.0;                if (!here->BSIM3drainAreaGiven)                {                     here->BSIM3drainArea = 2.0 * model->BSIM3hdif * pParam->BSIM3weff;                }                DrainSatCurrent = here->BSIM3drainArea * model->BSIM3jctTempSatCurDensity;                if (!here->BSIM3drainPerimeterGiven)                {                     here->BSIM3drainPerimeter = 4.0 * model->BSIM3hdif + 2.0 * pParam->BSIM3weff;                }                DrainSatCurrent = DrainSatCurrent + here->BSIM3drainPerimeter * model->BSIM3jctSidewallTempSatCurDensity;                if (DrainSatCurrent <= 0.0) DrainSatCurrent = 1.0e-14;                if ((DrainSatCurrent > 0.0) && (model->BSIM3ijth > 0.0))                {   here->BSIM3vjdm = Nvtm * log(model->BSIM3ijth                                    / DrainSatCurrent + 1.0);  		    /* Added revision dependent code */  		    switch (model->BSIM3intVersion) {  		    case BSIM3V324:  		    case BSIM3V323:  		    case BSIM3V322:  		    	here->BSIM3IsEvjdm =   		    		DrainSatCurrent * exp(here->BSIM3vjdm / Nvtm);  		    	break;  		    case BSIM3V32:  		    default:  		    	/* Do nothing */  			break;  		    }                }              }         }    }    return(OK);}

⌨️ 快捷键说明

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