📄 b4ld.c
字号:
/**** 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 + -