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

📄 b4ld.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 5 页
字号:
/**** BSIM4.4.0  Released by Xuemei (Jane) Xi 03/04/2004 $Id: b4ld.c,v 1.13 2005/05/21 13:35:23 sjborley Exp $****//********** * Copyright 2004 Regents of the University of California. All rights reserved. * File: b4ld.c of BSIM4.4.0. * Author: 2000 Weidong Liu * Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. * Project Director: Prof. Chenming Hu. * Modified by Xuemei Xi, 04/06/2001. * Modified by Xuemei Xi, 10/05/2001. * Modified by Xuemei Xi, 11/15/2002. * Modified by Xuemei Xi, 05/09/2003. * Modified by Xuemei Xi, 03/04/2004. **********/#include "ngspice.h"#include "cktdefs.h"#include "bsim4def.h"#include "trandefs.h"#include "const.h"#include "sperror.h"#include "devdefs.h"#include "suffix.h"#define MAX_EXP 5.834617425e14#define MIN_EXP 1.713908431e-15#define EXP_THRESHOLD 34.0#define EPSSI 1.03594e-10#define Charge_q 1.60219e-19#define DELTA_1 0.02#define DELTA_2 0.02#define DELTA_3 0.02#define DELTA_4 0.02#define MM  3  /* smooth coeff */#define DEXP(A,B,C) {                                                         \        if (A > EXP_THRESHOLD) {                                              \            B = MAX_EXP*(1.0+(A)-EXP_THRESHOLD);                              \            C = MAX_EXP;                                                      \        } else if (A < -EXP_THRESHOLD)  {                                     \            B = MIN_EXP;                                                      \            C = 0;                                                            \        } else   {                                                            \            B = exp(A);                                                       \            C = B;                                                            \        }                                                                     \    }int BSIM4polyDepletion(double phi, double ngate,double coxe, double Vgs, double *Vgs_eff, double *dVgs_eff_dVg);intBSIM4load(inModel,ckt)GENmodel *inModel;CKTcircuit *ckt;{BSIM4model *model = (BSIM4model*)inModel;BSIM4instance *here;double ceqgstot, dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb;double ceqgdtot, dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb;double gstot, gstotd, gstotg, gstots, gstotb, gspr, Rs, Rd;double gdtot, gdtotd, gdtotg, gdtots, gdtotb, gdpr;double vgs_eff, vgd_eff, dvgs_eff_dvg, dvgd_eff_dvg;double dRs_dvg, dRd_dvg, dRs_dvb, dRd_dvb;double dT0_dvg, dT1_dvb, dT3_dvg, dT3_dvb;double vses, vdes, vdedo, delvses, delvded, delvdes;double Isestot=0.0, cseshat=0.0, Idedtot=0.0, cdedhat=0.0;//#ifndef NEWCONV//double tol0, tol1, tol2, tol3, tol4, tol5, tol6;//#endifdouble geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg;double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd;double delvges, delvgms, vgmb;double gcgmgmb=0.0, gcgmdb=0.0, gcgmsb=0.0, gcdgmb, gcsgmb;double gcgmbb=0.0, gcbgmb, qgmb, qgmid=0.0, ceqqgmid;double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact;double vdbs, vdbd, vsbs, vsbdo, vsbd;double delvdbs, delvdbd, delvsbs;double delvbd_jct, delvbs_jct, vbs_jct, vbd_jct;double SourceSatCurrent, DrainSatCurrent;double ag0, qgb, von, cbhat=0.0, VgstNVt, ExpVgst;double ceqqb, ceqqd, ceqqg, ceqqjd=0.0, ceqqjs=0.0, ceq, geq;double cdrain, cdhat=0.0, ceqdrn, ceqbd, ceqbs, ceqjd, ceqjs, gjbd, gjbs;double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg;double delvbd, delvbs, delvds, delvgd, delvgs;double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4;double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb;double gcgbb, gcdbb, gcsbb, gcbbb;double gcdbdb, gcsbsb;double gcsgb, gcssb, MJD, MJSWD, MJSWGD, MJS, MJSWS, MJSWGS;double qgate=0.0, qbulk=0.0, qdrn=0.0, qsrc, cqgate, cqbody, cqdrn;double Vdb, Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum;double Igidl, Ggidld, Ggidlg, Ggidlb;double Voxacc=0.0, dVoxacc_dVg=0.0, dVoxacc_dVb=0.0;double Voxdepinv=0.0, dVoxdepinv_dVg=0.0, dVoxdepinv_dVd=0.0, dVoxdepinv_dVb=0.0;double VxNVt, ExpVxNVt, Vaux, dVaux_dVg, dVaux_dVd, dVaux_dVb;double Igc, dIgc_dVg, dIgc_dVd, dIgc_dVb;double Igcs, dIgcs_dVg, dIgcs_dVd, dIgcs_dVb;double Igcd, dIgcd_dVg, dIgcd_dVd, dIgcd_dVb;double Igs, dIgs_dVg, dIgs_dVs, Igd, dIgd_dVg, dIgd_dVd;double Igbacc, dIgbacc_dVg, dIgbacc_dVb;double Igbinv, dIgbinv_dVg, dIgbinv_dVd, dIgbinv_dVb;double Pigcd, dPigcd_dVg, dPigcd_dVd, dPigcd_dVb;double Istoteq, gIstotg, gIstotd, gIstots, gIstotb;double Idtoteq, gIdtotg, gIdtotd, gIdtots, gIdtotb;double Ibtoteq, gIbtotg, gIbtotd, gIbtots, gIbtotb;double Igtoteq, gIgtotg, gIgtotd, gIgtots, gIgtotb;double Igstot=0.0, cgshat=0.0, Igdtot=0.0, cgdhat=0.0, Igbtot=0.0, cgbhat=0.0;double Vgs_eff, Vfb=0.0, Vth_NarrowW;double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd;double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtms, Nvtmd;double Vtm;double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb;double V0, CoxWLcen, QovCox, LINK;double DeltaPhi, dDeltaPhi_dVg;double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb;double Ccen, Coxeff, dCoxeff_dVd, dCoxeff_dVg, dCoxeff_dVb;double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb;double ueff, dueff_dVg, dueff_dVd, dueff_dVb; double Esat, Vdsat;double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb;double dVdsat_dVg, dVdsat_dVb, dVdsat_dVd, Vasat, dAlphaz_dVg, dAlphaz_dVb; double dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, dVa_dVd, dVa_dVg, dVa_dVb; double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; double T0=0.0, dT0_dVg, dT0_dVd, dT0_dVb;double T1, dT1_dVg, dT1_dVd, dT1_dVb;double T2, dT2_dVg, dT2_dVd, dT2_dVb;double T3, dT3_dVg, dT3_dVd, dT3_dVb;double T4, dT4_dVd, dT4_dVb;double T5, dT5_dVg, dT5_dVd, dT5_dVb;double T6=0.0, dT6_dVg, dT6_dVd, dT6_dVb;double T7, dT7_dVg, dT7_dVd, dT7_dVb;double T8, dT8_dVg, dT8_dVd, dT8_dVb;double T9, dT9_dVg, dT9_dVd, dT9_dVb;double T10, dT10_dVg, dT10_dVb, dT10_dVd; double T11, T12, T13, T14;double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb;double Cclm, dCclm_dVg, dCclm_dVd, dCclm_dVb;double FP, dFP_dVg, PvagTerm, dPvagTerm_dVg, dPvagTerm_dVd, dPvagTerm_dVb;double VADITS, dVADITS_dVg, dVADITS_dVd;double Lpe_Vb, dDITS_Sft_dVb, dDITS_Sft_dVd;double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb;double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb;double Xdep, dXdep_dVb, lt1, dlt1_dVb, ltw, dltw_dVb, Delt_vth, dDelt_vth_dVb;double Theta0, dTheta0_dVb;double TempRatio, tmp1, tmp2, tmp3, tmp4;double DIBL_Sft, dDIBL_Sft_dVd, Lambda, dLambda_dVg;double Idtot, Ibtot, a1, ScalingFactor;double Vgsteff, dVgsteff_dVg, dVgsteff_dVd, dVgsteff_dVb; double Vdseff, dVdseff_dVg, dVdseff_dVd, dVdseff_dVb; double VdseffCV, dVdseffCV_dVg, dVdseffCV_dVd, dVdseffCV_dVb; double diffVds, dAbulk_dVg;double beta, dbeta_dVg, dbeta_dVd, dbeta_dVb;double gche, dgche_dVg, dgche_dVd, dgche_dVb;double fgche1, dfgche1_dVg, dfgche1_dVd, dfgche1_dVb;double fgche2, dfgche2_dVg, dfgche2_dVd, dfgche2_dVb;double Idl, dIdl_dVg, dIdl_dVd, dIdl_dVb;double Idsa, dIdsa_dVg, dIdsa_dVd, dIdsa_dVb;double Ids, Gm, Gds, Gmb, devbs_dvb, devbd_dvb;double Isub, Gbd, Gbg, Gbb;double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb;double CoxeffWovL;double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds;double Vgst2Vtm, VdsatCV;double Leff, Weff, dWeff_dVg, dWeff_dVb;double AbulkCV, dAbulkCV_dVb;double qcheq=0.0, qdef, gqdef=0.0, cqdef=0.0, cqcheq=0.0;double gcqdb=0.0, gcqsb=0.0, gcqgb=0.0, gcqbb=0.0;double dxpart, sxpart, ggtg, ggtd, ggts, ggtb;double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs;double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs;double gbspsp, gbbdp, gbbsp, gbspg, gbspb, gbspdp; double gbdpdp, gbdpg, gbdpb, gbdpsp; double qgdo, qgso, cgdo, cgso;double Cgg, Cgd, Cgb, Cdg, Cdd, Cds;double Csg, Csd, Css, Csb, Cbg, Cbd, Cbb;double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Qac0, Qsub0;double dQac0_dVg, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb;double ggidld, ggidlg, ggidlb, ggislg, ggislb, ggisls;double Igisl, Ggislg, Ggislb, Ggisls;double Nvtmrs, Nvtmrssw, Nvtmrsswg;double vs, Fsevl, dvs_dVg, dvs_dVd, dvs_dVb, dFsevl_dVg, dFsevl_dVd, dFsevl_dVb;double vgdx, vgsx;struct bsim4SizeDependParam *pParam;int ByPass, ChargeComputationNeeded, error, Check, Check1, Check2;double m;ScalingFactor = 1.0e-9;ChargeComputationNeeded =                   ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) ||                 ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)))                 ? 1 : 0;for (; model != NULL; model = model->BSIM4nextModel){    for (here = model->BSIM4instances; here != NULL;           here = here->BSIM4nextInstance)     {    if (here->BSIM4owner != ARCHme) continue;           Check = Check1 = Check2 = 1;          ByPass = 0;	  pParam = here->pParam;          if ((ckt->CKTmode & MODEINITSMSIG))	  {   vds = *(ckt->CKTstate0 + here->BSIM4vds);              vgs = *(ckt->CKTstate0 + here->BSIM4vgs);              vbs = *(ckt->CKTstate0 + here->BSIM4vbs);              vges = *(ckt->CKTstate0 + here->BSIM4vges);              vgms = *(ckt->CKTstate0 + here->BSIM4vgms);              vdbs = *(ckt->CKTstate0 + here->BSIM4vdbs);              vsbs = *(ckt->CKTstate0 + here->BSIM4vsbs);              vses = *(ckt->CKTstate0 + here->BSIM4vses);              vdes = *(ckt->CKTstate0 + here->BSIM4vdes);              qdef = *(ckt->CKTstate0 + here->BSIM4qdef);          }	  else if ((ckt->CKTmode & MODEINITTRAN))	  {   vds = *(ckt->CKTstate1 + here->BSIM4vds);              vgs = *(ckt->CKTstate1 + here->BSIM4vgs);              vbs = *(ckt->CKTstate1 + here->BSIM4vbs);              vges = *(ckt->CKTstate1 + here->BSIM4vges);              vgms = *(ckt->CKTstate1 + here->BSIM4vgms);              vdbs = *(ckt->CKTstate1 + here->BSIM4vdbs);              vsbs = *(ckt->CKTstate1 + here->BSIM4vsbs);              vses = *(ckt->CKTstate1 + here->BSIM4vses);              vdes = *(ckt->CKTstate1 + here->BSIM4vdes);              qdef = *(ckt->CKTstate1 + here->BSIM4qdef);          }	  else if ((ckt->CKTmode & MODEINITJCT) && !here->BSIM4off)	  {   vds = model->BSIM4type * here->BSIM4icVDS;              vgs = vges = vgms = model->BSIM4type * here->BSIM4icVGS;              vbs = vdbs = vsbs = model->BSIM4type * here->BSIM4icVBS;	      if (vds > 0.0)	      {   vdes = vds + 0.01;		  vses = -0.01;	      }	      else if (vds < 0.0)              {   vdes = vds - 0.01;                  vses = 0.01;              }	      else	          vdes = vses = 0.0;              qdef = 0.0;              if ((vds == 0.0) && (vgs == 0.0) && (vbs == 0.0) &&                  ((ckt->CKTmode & (MODETRAN | MODEAC|MODEDCOP |                   MODEDCTRANCURVE)) || (!(ckt->CKTmode & MODEUIC))))	      {   vds = 0.1;		  vdes = 0.11;	  	  vses = -0.01;                  vgs = vges = vgms = model->BSIM4type                                     * here->BSIM4vth0 + 0.1;                  vbs = vdbs = vsbs = 0.0;              }          }	  else if ((ckt->CKTmode & (MODEINITJCT | MODEINITFIX)) &&                   (here->BSIM4off))           {   vds = vgs = vbs = vges = vgms = 0.0;              vdbs = vsbs = vdes = vses = qdef = 0.0;	  }          else	  {#ifndef PREDICTOR               if ((ckt->CKTmode & MODEINITPRED))	       {   xfact = ckt->CKTdelta / ckt->CKTdeltaOld[1];                   *(ckt->CKTstate0 + here->BSIM4vds) =                          *(ckt->CKTstate1 + here->BSIM4vds);                   vds = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vds))                         - (xfact * (*(ckt->CKTstate2 + here->BSIM4vds)));                   *(ckt->CKTstate0 + here->BSIM4vgs) =                          *(ckt->CKTstate1 + here->BSIM4vgs);                   vgs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vgs))                         - (xfact * (*(ckt->CKTstate2 + here->BSIM4vgs)));                   *(ckt->CKTstate0 + here->BSIM4vges) =                         *(ckt->CKTstate1 + here->BSIM4vges);                   vges = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vges))                         - (xfact * (*(ckt->CKTstate2 + here->BSIM4vges)));                   *(ckt->CKTstate0 + here->BSIM4vgms) =                         *(ckt->CKTstate1 + here->BSIM4vgms);                   vgms = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vgms))                         - (xfact * (*(ckt->CKTstate2 + here->BSIM4vgms)));                   *(ckt->CKTstate0 + here->BSIM4vbs) =                          *(ckt->CKTstate1 + here->BSIM4vbs);                   vbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vbs))                         - (xfact * (*(ckt->CKTstate2 + here->BSIM4vbs)));                   *(ckt->CKTstate0 + here->BSIM4vbd) =                          *(ckt->CKTstate0 + here->BSIM4vbs)                         - *(ckt->CKTstate0 + here->BSIM4vds);                   *(ckt->CKTstate0 + here->BSIM4vdbs) =                         *(ckt->CKTstate1 + here->BSIM4vdbs);                   vdbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vdbs))                         - (xfact * (*(ckt->CKTstate2 + here->BSIM4vdbs)));                   *(ckt->CKTstate0 + here->BSIM4vdbd) =                         *(ckt->CKTstate0 + here->BSIM4vdbs)                         - *(ckt->CKTstate0 + here->BSIM4vds);                   *(ckt->CKTstate0 + here->BSIM4vsbs) =                         *(ckt->CKTstate1 + here->BSIM4vsbs);                   vsbs = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vsbs))                         - (xfact * (*(ckt->CKTstate2 + here->BSIM4vsbs)));                   *(ckt->CKTstate0 + here->BSIM4vses) =                         *(ckt->CKTstate1 + here->BSIM4vses);                   vses = (1.0 + xfact)* (*(ckt->CKTstate1 + here->BSIM4vses))                         - (xfact * (*(ckt->CKTstate2 + here->BSIM4vses)));                   *(ckt->CKTstate0 + here->BSIM4vdes) =

⌨️ 快捷键说明

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