b3soifdtemp.c

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

C
822
字号
/**********Copyright 1999 Regents of the University of California.  All rights reserved.Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen TangFile: b3soifdtemp.c          98/5/01Modified by Pin Su, Wei Jin 99/9/27Modified by Paolo Nenzi 2002**********//* * Revision 2.1  99/9/27 Pin Su  * BSIMFD2.1 release *//* Lmin, Lmax, Wmin, Wmax */#include "ngspice.h"#include "smpdefs.h"#include "cktdefs.h"#include "b3soifddef.h"#include "const.h"#include "sperror.h"#include "suffix.h"#define Kb 1.3806226e-23#define KboQ 8.617087e-5  /* Kb / q  where q = 1.60219e-19 */#define EPSOX 3.453133e-11#define EPSSI 1.03594e-10#define PI 3.141592654#define MAX_EXP 5.834617425e14#define MIN_EXP 1.713908431e-15#define EXP_THRESHOLD 34.0#define Charge_q 1.60219e-19/* ARGSUSED */intB3SOIFDtemp(GENmodel *inModel, CKTcircuit *ckt){B3SOIFDmodel *model = (B3SOIFDmodel*) inModel;B3SOIFDinstance *here;struct b3soifdSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam=NULL;double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, Ldrn, Wdrn;double Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom;double SDphi, SDgamma;int Size_Not_Found;    /*  loop through all the B3SOIFD device models */    for (; model != NULL; model = model->B3SOIFDnextModel)    {    Temp = ckt->CKTtemp;         if (model->B3SOIFDGatesidewallJctPotential < 0.1)             model->B3SOIFDGatesidewallJctPotential = 0.1;         model->pSizeDependParamKnot = NULL;	 pLastKnot = NULL;	 Tnom = model->B3SOIFDtnom;	 TRatio = Temp / Tnom;	 model->B3SOIFDvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14));         model->B3SOIFDfactor1 = sqrt(EPSSI / EPSOX * model->B3SOIFDtox);         Vtm0 = KboQ * Tnom;         Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0);         model->B3SOIFDeg0 = Eg0;          model->B3SOIFDvtm = KboQ * Temp;         Eg = 1.16 - 7.02e-4 * Temp * Temp / (Temp + 1108.0);         /* ni is in cm^-3 */         ni = 1.45e10 * (Temp / 300.15) * sqrt(Temp / 300.15)             * exp(21.5565981 - Eg / (2.0 * model->B3SOIFDvtm));         /* loop through all the instances of the model */	 /* MCJ: Length and Width not initialized */         for (here = model->B3SOIFDinstances; here != NULL;              here = here->B3SOIFDnextInstance) 	 {                  if (here->B3SOIFDowner != ARCHme)                      continue;	      	      here->B3SOIFDrbodyext = here->B3SOIFDbodySquares *                                    model->B3SOIFDrbsh;	      pSizeDependParamKnot = model->pSizeDependParamKnot;              Size_Not_Found = 1;	      while ((pSizeDependParamKnot != NULL) && Size_Not_Found)	      {   if ((here->B3SOIFDl == pSizeDependParamKnot->Length)		      && (here->B3SOIFDw == pSizeDependParamKnot->Width)                      && (here->B3SOIFDrth0 == pSizeDependParamKnot->Rth0)                      && (here->B3SOIFDcth0 == pSizeDependParamKnot->Cth0))                  {   Size_Not_Found = 0;		      here->pParam = pSizeDependParamKnot;		  }		  else		  {   pLastKnot = pSizeDependParamKnot;		      pSizeDependParamKnot = pSizeDependParamKnot->pNext;		  }              }	      if (Size_Not_Found)	      {   pParam = (struct b3soifdSizeDependParam *)tmalloc(	                    sizeof(struct b3soifdSizeDependParam));                  if (pLastKnot == NULL)		      model->pSizeDependParamKnot = pParam;                  else		      pLastKnot->pNext = pParam;                  pParam->pNext = NULL;                  here->pParam = pParam;		  Ldrn = here->B3SOIFDl;		  Wdrn = here->B3SOIFDw;                  pParam->Length = Ldrn;                  pParam->Width = Wdrn;                  pParam->Rth0 = here->B3SOIFDrth0;                  pParam->Cth0 = here->B3SOIFDcth0;		                    T0 = pow(Ldrn, model->B3SOIFDLln);                  T1 = pow(Wdrn, model->B3SOIFDLwn);                  tmp1 = model->B3SOIFDLl / T0 + model->B3SOIFDLw / T1                       + model->B3SOIFDLwl / (T0 * T1);                  pParam->B3SOIFDdl = model->B3SOIFDLint + tmp1;                  pParam->B3SOIFDdlc = model->B3SOIFDdlc + tmp1;                  T2 = pow(Ldrn, model->B3SOIFDWln);                  T3 = pow(Wdrn, model->B3SOIFDWwn);                  tmp2 = model->B3SOIFDWl / T2 + model->B3SOIFDWw / T3                       + model->B3SOIFDWwl / (T2 * T3);                  pParam->B3SOIFDdw = model->B3SOIFDWint + tmp2;                  pParam->B3SOIFDdwc = model->B3SOIFDdwc + tmp2;                  pParam->B3SOIFDleff = here->B3SOIFDl - 2.0 * pParam->B3SOIFDdl;                  if (pParam->B3SOIFDleff <= 0.0)	          {   IFuid namarray[2];                      namarray[0] = model->B3SOIFDmodName;                      namarray[1] = here->B3SOIFDname;                      (*(SPfrontEnd->IFerror))(ERR_FATAL,                      "B3SOIFD: mosfet %s, model %s: Effective channel length <= 0",                       namarray);                      return(E_BADPARM);                  }                  pParam->B3SOIFDweff = here->B3SOIFDw - 2.0 * pParam->B3SOIFDdw;                  if (pParam->B3SOIFDweff <= 0.0)	          {   IFuid namarray[2];                      namarray[0] = model->B3SOIFDmodName;                      namarray[1] = here->B3SOIFDname;                      (*(SPfrontEnd->IFerror))(ERR_FATAL,                      "B3SOIFD: mosfet %s, model %s: Effective channel width <= 0",                       namarray);                      return(E_BADPARM);                  }                  pParam->B3SOIFDleffCV = here->B3SOIFDl - 2.0 * pParam->B3SOIFDdlc;                  if (pParam->B3SOIFDleffCV <= 0.0)	          {   IFuid namarray[2];                      namarray[0] = model->B3SOIFDmodName;                      namarray[1] = here->B3SOIFDname;                      (*(SPfrontEnd->IFerror))(ERR_FATAL,                      "B3SOIFD: mosfet %s, model %s: Effective channel length for C-V <= 0",                       namarray);                      return(E_BADPARM);                  }                  pParam->B3SOIFDweffCV = here->B3SOIFDw - 2.0 * pParam->B3SOIFDdwc;                  if (pParam->B3SOIFDweffCV <= 0.0)	          {   IFuid namarray[2];                      namarray[0] = model->B3SOIFDmodName;                      namarray[1] = here->B3SOIFDname;                      (*(SPfrontEnd->IFerror))(ERR_FATAL,                      "B3SOIFD: mosfet %s, model %s: Effective channel width for C-V <= 0",                       namarray);                      return(E_BADPARM);                  }                  /* Not binned - START */                  pParam->B3SOIFDat = model->B3SOIFDat;                  pParam->B3SOIFDgamma1 = model->B3SOIFDgamma1;                  pParam->B3SOIFDgamma2 = model->B3SOIFDgamma2;                  pParam->B3SOIFDvbx = model->B3SOIFDvbx;                  pParam->B3SOIFDvbm = model->B3SOIFDvbm;                  pParam->B3SOIFDxt = model->B3SOIFDxt;                  pParam->B3SOIFDkt1 = model->B3SOIFDkt1;                  pParam->B3SOIFDkt1l = model->B3SOIFDkt1l;                  pParam->B3SOIFDkt2 = model->B3SOIFDkt2;                  pParam->B3SOIFDua1 = model->B3SOIFDua1;                  pParam->B3SOIFDub1 = model->B3SOIFDub1;                  pParam->B3SOIFDuc1 = model->B3SOIFDuc1;                  pParam->B3SOIFDute = model->B3SOIFDute;                  pParam->B3SOIFDprt = model->B3SOIFDprt;                  /* Not binned - END */		  /* CV model */		  pParam->B3SOIFDcgsl = model->B3SOIFDcgsl;		  pParam->B3SOIFDcgdl = model->B3SOIFDcgdl;		  pParam->B3SOIFDckappa = model->B3SOIFDckappa;		  pParam->B3SOIFDcf = model->B3SOIFDcf;		  pParam->B3SOIFDclc = model->B3SOIFDclc;		  pParam->B3SOIFDcle = model->B3SOIFDcle;                  pParam->B3SOIFDabulkCVfactor = pow(1.0+(pParam->B3SOIFDclc					     / pParam->B3SOIFDleff),					     pParam->B3SOIFDcle);/* Added for binning - START */		  if (model->B3SOIFDbinUnit == 1)		  {   Inv_L = 1.0e-6 / pParam->B3SOIFDleff;		      Inv_W = 1.0e-6 / pParam->B3SOIFDweff;		      Inv_LW = 1.0e-12 / (pParam->B3SOIFDleff			     * pParam->B3SOIFDweff);		  }		  else		  {   Inv_L = 1.0 / pParam->B3SOIFDleff;		      Inv_W = 1.0 / pParam->B3SOIFDweff;		      Inv_LW = 1.0 / (pParam->B3SOIFDleff			     * pParam->B3SOIFDweff);		  }		  pParam->B3SOIFDnpeak = model->B3SOIFDnpeak				     + model->B3SOIFDlnpeak * Inv_L				     + model->B3SOIFDwnpeak * Inv_W				     + model->B3SOIFDpnpeak * Inv_LW;		  pParam->B3SOIFDnsub = model->B3SOIFDnsub				    + model->B3SOIFDlnsub * Inv_L				    + model->B3SOIFDwnsub * Inv_W				    + model->B3SOIFDpnsub * Inv_LW;		  pParam->B3SOIFDngate = model->B3SOIFDngate				     + model->B3SOIFDlngate * Inv_L				     + model->B3SOIFDwngate * Inv_W				     + model->B3SOIFDpngate * Inv_LW;		  pParam->B3SOIFDvth0 = model->B3SOIFDvth0				    + model->B3SOIFDlvth0 * Inv_L				    + model->B3SOIFDwvth0 * Inv_W				    + model->B3SOIFDpvth0 * Inv_LW;		  pParam->B3SOIFDk1 = model->B3SOIFDk1				  + model->B3SOIFDlk1 * Inv_L				  + model->B3SOIFDwk1 * Inv_W				  + model->B3SOIFDpk1 * Inv_LW;		  pParam->B3SOIFDk2 = model->B3SOIFDk2				  + model->B3SOIFDlk2 * Inv_L				  + model->B3SOIFDwk2 * Inv_W				  + model->B3SOIFDpk2 * Inv_LW;		  pParam->B3SOIFDk3 = model->B3SOIFDk3				  + model->B3SOIFDlk3 * Inv_L				  + model->B3SOIFDwk3 * Inv_W				  + model->B3SOIFDpk3 * Inv_LW;		  pParam->B3SOIFDk3b = model->B3SOIFDk3b				   + model->B3SOIFDlk3b * Inv_L				   + model->B3SOIFDwk3b * Inv_W				   + model->B3SOIFDpk3b * Inv_LW;		  pParam->B3SOIFDvbsa = model->B3SOIFDvbsa				   + model->B3SOIFDlvbsa * Inv_L				   + model->B3SOIFDwvbsa * Inv_W				   + model->B3SOIFDpvbsa * Inv_LW;		  pParam->B3SOIFDdelp = model->B3SOIFDdelp				   + model->B3SOIFDldelp * Inv_L				   + model->B3SOIFDwdelp * Inv_W				   + model->B3SOIFDpdelp * Inv_LW;		  pParam->B3SOIFDkb1 = model->B3SOIFDkb1				   + model->B3SOIFDlkb1 * Inv_L				   + model->B3SOIFDwkb1 * Inv_W				   + model->B3SOIFDpkb1 * Inv_LW;		  pParam->B3SOIFDkb3 = model->B3SOIFDkb3				   + model->B3SOIFDlkb3 * Inv_L				   + model->B3SOIFDwkb3 * Inv_W				   + model->B3SOIFDpkb3 * Inv_LW;		  pParam->B3SOIFDdvbd0 = model->B3SOIFDdvbd0				   + model->B3SOIFDldvbd0 * Inv_L				   + model->B3SOIFDwdvbd0 * Inv_W				   + model->B3SOIFDpdvbd0 * Inv_LW;		  pParam->B3SOIFDdvbd1 = model->B3SOIFDdvbd1				   + model->B3SOIFDldvbd1 * Inv_L				   + model->B3SOIFDwdvbd1 * Inv_W				   + model->B3SOIFDpdvbd1 * Inv_LW;		  pParam->B3SOIFDw0 = model->B3SOIFDw0				  + model->B3SOIFDlw0 * Inv_L				  + model->B3SOIFDww0 * Inv_W

⌨️ 快捷键说明

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