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

📄 b3soiddtemp.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 3 页
字号:
/**********Copyright 1999 Regents of the University of California.  All rights reserved.Author: Weidong Liu and Pin Su         Feb 1999Author: 1998 Samuel Fung, Dennis Sinitsky and Stephen TangModified by Pin Su, Wei Jin 99/9/27File: b3soiddtemp.c          98/5/01Modified by Paolo Nenzi 2002**********//*  * Revision 2.1  99/9/27 Pin Su  * BSIMDD2.1 release *//* Lmin, Lmax, Wmin, Wmax */#include "ngspice.h"#include "smpdefs.h"#include "cktdefs.h"#include "b3soidddef.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 */intB3SOIDDtemp(GENmodel *inModel, CKTcircuit *ckt){B3SOIDDmodel *model = (B3SOIDDmodel*) inModel;B3SOIDDinstance *here;struct b3soiddSizeDependParam *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 B3SOIDD device models */    for (; model != NULL; model = model->B3SOIDDnextModel)    {    Temp = ckt->CKTtemp;         if (model->B3SOIDDGatesidewallJctPotential < 0.1)             model->B3SOIDDGatesidewallJctPotential = 0.1;         model->pSizeDependParamKnot = NULL;	 pLastKnot = NULL;	 Tnom = model->B3SOIDDtnom;	 TRatio = Temp / Tnom;	 model->B3SOIDDvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14));         model->B3SOIDDfactor1 = sqrt(EPSSI / EPSOX * model->B3SOIDDtox);         Vtm0 = KboQ * Tnom;         Eg0 = 1.16 - 7.02e-4 * Tnom * Tnom / (Tnom + 1108.0);         model->B3SOIDDeg0 = Eg0;          model->B3SOIDDvtm = 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->B3SOIDDvtm));         /* loop through all the instances of the model */	 /* MCJ: Length and Width not initialized */         for (here = model->B3SOIDDinstances; here != NULL;              here = here->B3SOIDDnextInstance) 	 {                  	      if (here->B3SOIDDowner != ARCHme)                      continue;	      	      here->B3SOIDDrbodyext = here->B3SOIDDbodySquares *                                    model->B3SOIDDrbsh;	      pSizeDependParamKnot = model->pSizeDependParamKnot;              Size_Not_Found = 1;	      while ((pSizeDependParamKnot != NULL) && Size_Not_Found)	      {   if ((here->B3SOIDDl == pSizeDependParamKnot->Length)		      && (here->B3SOIDDw == pSizeDependParamKnot->Width)                      && (here->B3SOIDDrth0 == pSizeDependParamKnot->Rth0)                      && (here->B3SOIDDcth0 == pSizeDependParamKnot->Cth0))                  {   Size_Not_Found = 0;		      here->pParam = pSizeDependParamKnot;		  }		  else		  {   pLastKnot = pSizeDependParamKnot;		      pSizeDependParamKnot = pSizeDependParamKnot->pNext;		  }              }	      if (Size_Not_Found)	      {   pParam = (struct b3soiddSizeDependParam *)tmalloc(	                    sizeof(struct b3soiddSizeDependParam));                  if (pLastKnot == NULL)		      model->pSizeDependParamKnot = pParam;                  else		      pLastKnot->pNext = pParam;                  pParam->pNext = NULL;                  here->pParam = pParam;		  Ldrn = here->B3SOIDDl;		  Wdrn = here->B3SOIDDw;                  pParam->Length = Ldrn;                  pParam->Width = Wdrn;                  pParam->Rth0 = here->B3SOIDDrth0;                  pParam->Cth0 = here->B3SOIDDcth0;		                    T0 = pow(Ldrn, model->B3SOIDDLln);                  T1 = pow(Wdrn, model->B3SOIDDLwn);                  tmp1 = model->B3SOIDDLl / T0 + model->B3SOIDDLw / T1                       + model->B3SOIDDLwl / (T0 * T1);                  pParam->B3SOIDDdl = model->B3SOIDDLint + tmp1;                  pParam->B3SOIDDdlc = model->B3SOIDDdlc + tmp1;                  T2 = pow(Ldrn, model->B3SOIDDWln);                  T3 = pow(Wdrn, model->B3SOIDDWwn);                  tmp2 = model->B3SOIDDWl / T2 + model->B3SOIDDWw / T3                       + model->B3SOIDDWwl / (T2 * T3);                  pParam->B3SOIDDdw = model->B3SOIDDWint + tmp2;                  pParam->B3SOIDDdwc = model->B3SOIDDdwc + tmp2;                  pParam->B3SOIDDleff = here->B3SOIDDl - 2.0 * pParam->B3SOIDDdl;                  if (pParam->B3SOIDDleff <= 0.0)	          {   IFuid namarray[2];                      namarray[0] = model->B3SOIDDmodName;                      namarray[1] = here->B3SOIDDname;                      (*(SPfrontEnd->IFerror))(ERR_FATAL,                      "B3SOIDD: mosfet %s, model %s: Effective channel length <= 0",                       namarray);                      return(E_BADPARM);                  }                  pParam->B3SOIDDweff = here->B3SOIDDw - 2.0 * pParam->B3SOIDDdw;                  if (pParam->B3SOIDDweff <= 0.0)	          {   IFuid namarray[2];                      namarray[0] = model->B3SOIDDmodName;                      namarray[1] = here->B3SOIDDname;                      (*(SPfrontEnd->IFerror))(ERR_FATAL,                      "B3SOIDD: mosfet %s, model %s: Effective channel width <= 0",                       namarray);                      return(E_BADPARM);                  }                  pParam->B3SOIDDleffCV = here->B3SOIDDl - 2.0 * pParam->B3SOIDDdlc;                  if (pParam->B3SOIDDleffCV <= 0.0)	          {   IFuid namarray[2];                      namarray[0] = model->B3SOIDDmodName;                      namarray[1] = here->B3SOIDDname;                      (*(SPfrontEnd->IFerror))(ERR_FATAL,                      "B3SOIDD: mosfet %s, model %s: Effective channel length for C-V <= 0",                       namarray);                      return(E_BADPARM);                  }                  pParam->B3SOIDDweffCV = here->B3SOIDDw - 2.0 * pParam->B3SOIDDdwc;                  if (pParam->B3SOIDDweffCV <= 0.0)	          {   IFuid namarray[2];                      namarray[0] = model->B3SOIDDmodName;                      namarray[1] = here->B3SOIDDname;                      (*(SPfrontEnd->IFerror))(ERR_FATAL,                      "B3SOIDD: mosfet %s, model %s: Effective channel width for C-V <= 0",                       namarray);                      return(E_BADPARM);                  }                  /* Not binned - START */                  pParam->B3SOIDDat = model->B3SOIDDat;                  pParam->B3SOIDDgamma1 = model->B3SOIDDgamma1;                  pParam->B3SOIDDgamma2 = model->B3SOIDDgamma2;                  pParam->B3SOIDDvbx = model->B3SOIDDvbx;                  pParam->B3SOIDDvbm = model->B3SOIDDvbm;                  pParam->B3SOIDDxt = model->B3SOIDDxt;                  pParam->B3SOIDDkt1 = model->B3SOIDDkt1;                  pParam->B3SOIDDkt1l = model->B3SOIDDkt1l;                  pParam->B3SOIDDkt2 = model->B3SOIDDkt2;                  pParam->B3SOIDDua1 = model->B3SOIDDua1;                  pParam->B3SOIDDub1 = model->B3SOIDDub1;                  pParam->B3SOIDDuc1 = model->B3SOIDDuc1;                  pParam->B3SOIDDute = model->B3SOIDDute;                  pParam->B3SOIDDprt = model->B3SOIDDprt;                  /* Not binned - END */		  /* CV model */		  pParam->B3SOIDDcgsl = model->B3SOIDDcgsl;		  pParam->B3SOIDDcgdl = model->B3SOIDDcgdl;		  pParam->B3SOIDDckappa = model->B3SOIDDckappa;		  pParam->B3SOIDDcf = model->B3SOIDDcf;		  pParam->B3SOIDDclc = model->B3SOIDDclc;		  pParam->B3SOIDDcle = model->B3SOIDDcle;                  pParam->B3SOIDDabulkCVfactor = pow(1.0+(pParam->B3SOIDDclc					     / pParam->B3SOIDDleff),					     pParam->B3SOIDDcle);/* Added for binning - START */		  if (model->B3SOIDDbinUnit == 1)		  {   Inv_L = 1.0e-6 / pParam->B3SOIDDleff;		      Inv_W = 1.0e-6 / pParam->B3SOIDDweff;		      Inv_LW = 1.0e-12 / (pParam->B3SOIDDleff			     * pParam->B3SOIDDweff);		  }		  else		  {   Inv_L = 1.0 / pParam->B3SOIDDleff;		      Inv_W = 1.0 / pParam->B3SOIDDweff;		      Inv_LW = 1.0 / (pParam->B3SOIDDleff			     * pParam->B3SOIDDweff);		  }		  pParam->B3SOIDDnpeak = model->B3SOIDDnpeak				     + model->B3SOIDDlnpeak * Inv_L				     + model->B3SOIDDwnpeak * Inv_W				     + model->B3SOIDDpnpeak * Inv_LW;		  pParam->B3SOIDDnsub = model->B3SOIDDnsub				    + model->B3SOIDDlnsub * Inv_L				    + model->B3SOIDDwnsub * Inv_W				    + model->B3SOIDDpnsub * Inv_LW;		  pParam->B3SOIDDngate = model->B3SOIDDngate				     + model->B3SOIDDlngate * Inv_L				     + model->B3SOIDDwngate * Inv_W				     + model->B3SOIDDpngate * Inv_LW;		  pParam->B3SOIDDvth0 = model->B3SOIDDvth0				    + model->B3SOIDDlvth0 * Inv_L				    + model->B3SOIDDwvth0 * Inv_W				    + model->B3SOIDDpvth0 * Inv_LW;		  pParam->B3SOIDDk1 = model->B3SOIDDk1				  + model->B3SOIDDlk1 * Inv_L				  + model->B3SOIDDwk1 * Inv_W				  + model->B3SOIDDpk1 * Inv_LW;		  pParam->B3SOIDDk2 = model->B3SOIDDk2				  + model->B3SOIDDlk2 * Inv_L				  + model->B3SOIDDwk2 * Inv_W				  + model->B3SOIDDpk2 * Inv_LW;		  pParam->B3SOIDDk3 = model->B3SOIDDk3				  + model->B3SOIDDlk3 * Inv_L				  + model->B3SOIDDwk3 * Inv_W				  + model->B3SOIDDpk3 * Inv_LW;		  pParam->B3SOIDDk3b = model->B3SOIDDk3b				   + model->B3SOIDDlk3b * Inv_L				   + model->B3SOIDDwk3b * Inv_W				   + model->B3SOIDDpk3b * Inv_LW;		  pParam->B3SOIDDvbsa = model->B3SOIDDvbsa				   + model->B3SOIDDlvbsa * Inv_L				   + model->B3SOIDDwvbsa * Inv_W				   + model->B3SOIDDpvbsa * Inv_LW;		  pParam->B3SOIDDdelp = model->B3SOIDDdelp				   + model->B3SOIDDldelp * Inv_L				   + model->B3SOIDDwdelp * Inv_W				   + model->B3SOIDDpdelp * Inv_LW;		  pParam->B3SOIDDkb1 = model->B3SOIDDkb1				   + model->B3SOIDDlkb1 * Inv_L				   + model->B3SOIDDwkb1 * Inv_W				   + model->B3SOIDDpkb1 * Inv_LW;		  pParam->B3SOIDDkb3 = model->B3SOIDDkb3				   + model->B3SOIDDlkb3 * Inv_L				   + model->B3SOIDDwkb3 * Inv_W				   + model->B3SOIDDpkb3 * Inv_LW;		  pParam->B3SOIDDdvbd0 = model->B3SOIDDdvbd0				   + model->B3SOIDDldvbd0 * Inv_L				   + model->B3SOIDDwdvbd0 * Inv_W				   + model->B3SOIDDpdvbd0 * Inv_LW;		  pParam->B3SOIDDdvbd1 = model->B3SOIDDdvbd1				   + model->B3SOIDDldvbd1 * Inv_L				   + model->B3SOIDDwdvbd1 * Inv_W				   + model->B3SOIDDpdvbd1 * Inv_LW;		  pParam->B3SOIDDw0 = model->B3SOIDDw0				  + model->B3SOIDDlw0 * Inv_L				  + model->B3SOIDDww0 * Inv_W

⌨️ 快捷键说明

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