b3set.c

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

C
1,097
字号
/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****//********** * Copyright 2001 Regents of the University of California. All rights reserved. * File: b3set.c of BSIM3v3.2.4 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001  Xuemei Xi **********/#include "ngspice.h"#include "smpdefs.h"#include "cktdefs.h"#include "bsim3def.h"#include "const.h"#include "sperror.h"#include "suffix.h"#define MAX_EXP 5.834617425e14#define MIN_EXP 1.713908431e-15#define EXP_THRESHOLD 34.0#define SMOOTHFACTOR 0.1#define EPSOX 3.453133e-11#define EPSSI 1.03594e-10#define PI 3.141592654#define Charge_q 1.60219e-19#define Meter2Micron 1.0e6intBSIM3setup (SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,            int *states){BSIM3model *model = (BSIM3model*)inModel;BSIM3instance *here;int error;CKTnode *tmp; CKTnode *tmpNode;IFuid tmpName;    /*  loop through all the BSIM3 device models */    for( ; model != NULL; model = model->BSIM3nextModel )    {/* Default value Processing for BSIM3 MOSFET Models */        if (!model->BSIM3typeGiven)            model->BSIM3type = NMOS;             if (!model->BSIM3mobModGiven)             model->BSIM3mobMod = 1;        if (!model->BSIM3binUnitGiven)             model->BSIM3binUnit = 1;        if (!model->BSIM3paramChkGiven)             model->BSIM3paramChk = 0;        if (!model->BSIM3capModGiven)             model->BSIM3capMod = 3;        if (!model->BSIM3acmModGiven)            model->BSIM3acmMod = 0;        if (!model->BSIM3noiModGiven)             model->BSIM3noiMod = 1;        /* If the user does not provide the model revision,         * we always choose the most recent.         */        if (!model->BSIM3versionGiven)                model->BSIM3version = "3.2.4";        /* I have added below the code that translate model string         * into an integer. This trick is meant to speed up the          * revision testing instruction, since comparing integer         * is faster than comparing strings.         * Paolo Nenzi 2002         */        if (!strcmp (model->BSIM3version, "3.2.4"))                model->BSIM3intVersion = BSIM3V324;        else if (!strcmp (model->BSIM3version, "3.2.3"))                model->BSIM3intVersion = BSIM3V323;        else if (!strcmp (model->BSIM3version, "3.2.2"))                model->BSIM3intVersion = BSIM3V322;        else if (!strcmp (model->BSIM3version, "3.2"))                model->BSIM3intVersion = BSIM3V32;        else                model->BSIM3intVersion = BSIM3V3OLD;        /* BSIM3V3OLD is a placeholder for pre 3.2 revision          * This model should not be used for pre 3.2 models.          */        if (!model->BSIM3toxGiven)            model->BSIM3tox = 150.0e-10;        model->BSIM3cox = 3.453133e-11 / model->BSIM3tox;        if (!model->BSIM3toxmGiven)            model->BSIM3toxm = model->BSIM3tox;        if (!model->BSIM3cdscGiven)            model->BSIM3cdsc = 2.4e-4;   /* unit Q/V/m^2  */        if (!model->BSIM3cdscbGiven)            model->BSIM3cdscb = 0.0;   /* unit Q/V/m^2  */                if (!model->BSIM3cdscdGiven)            model->BSIM3cdscd = 0.0;   /* unit Q/V/m^2  */        if (!model->BSIM3citGiven)            model->BSIM3cit = 0.0;   /* unit Q/V/m^2  */        if (!model->BSIM3nfactorGiven)            model->BSIM3nfactor = 1;        if (!model->BSIM3xjGiven)            model->BSIM3xj = .15e-6;        if (!model->BSIM3vsatGiven)            model->BSIM3vsat = 8.0e4;    /* unit m/s */         if (!model->BSIM3atGiven)            model->BSIM3at = 3.3e4;    /* unit m/s */         if (!model->BSIM3a0Given)            model->BSIM3a0 = 1.0;          if (!model->BSIM3agsGiven)            model->BSIM3ags = 0.0;        if (!model->BSIM3a1Given)            model->BSIM3a1 = 0.0;        if (!model->BSIM3a2Given)            model->BSIM3a2 = 1.0;        if (!model->BSIM3ketaGiven)            model->BSIM3keta = -0.047;    /* unit  / V */        if (!model->BSIM3nsubGiven)            model->BSIM3nsub = 6.0e16;   /* unit 1/cm3 */        if (!model->BSIM3npeakGiven)            model->BSIM3npeak = 1.7e17;   /* unit 1/cm3 */        if (!model->BSIM3ngateGiven)            model->BSIM3ngate = 0;   /* unit 1/cm3 */        if (!model->BSIM3vbmGiven)            model->BSIM3vbm = -3.0;        if (!model->BSIM3xtGiven)            model->BSIM3xt = 1.55e-7;        if (!model->BSIM3kt1Given)            model->BSIM3kt1 = -0.11;      /* unit V */        if (!model->BSIM3kt1lGiven)            model->BSIM3kt1l = 0.0;      /* unit V*m */        if (!model->BSIM3kt2Given)            model->BSIM3kt2 = 0.022;      /* No unit */        if (!model->BSIM3k3Given)            model->BSIM3k3 = 80.0;              if (!model->BSIM3k3bGiven)            model->BSIM3k3b = 0.0;              if (!model->BSIM3w0Given)            model->BSIM3w0 = 2.5e-6;            if (!model->BSIM3nlxGiven)            model->BSIM3nlx = 1.74e-7;             if (!model->BSIM3dvt0Given)            model->BSIM3dvt0 = 2.2;            if (!model->BSIM3dvt1Given)            model->BSIM3dvt1 = 0.53;              if (!model->BSIM3dvt2Given)            model->BSIM3dvt2 = -0.032;   /* unit 1 / V */             if (!model->BSIM3dvt0wGiven)            model->BSIM3dvt0w = 0.0;            if (!model->BSIM3dvt1wGiven)            model->BSIM3dvt1w = 5.3e6;            if (!model->BSIM3dvt2wGiven)            model->BSIM3dvt2w = -0.032;           if (!model->BSIM3droutGiven)            model->BSIM3drout = 0.56;             if (!model->BSIM3dsubGiven)            model->BSIM3dsub = model->BSIM3drout;             if (!model->BSIM3vth0Given)            model->BSIM3vth0 = (model->BSIM3type == NMOS) ? 0.7 : -0.7;        if (!model->BSIM3uaGiven)            model->BSIM3ua = 2.25e-9;      /* unit m/V */        if (!model->BSIM3ua1Given)            model->BSIM3ua1 = 4.31e-9;      /* unit m/V */        if (!model->BSIM3ubGiven)            model->BSIM3ub = 5.87e-19;     /* unit (m/V)**2 */        if (!model->BSIM3ub1Given)            model->BSIM3ub1 = -7.61e-18;     /* unit (m/V)**2 */        if (!model->BSIM3ucGiven)            model->BSIM3uc = (model->BSIM3mobMod == 3) ? -0.0465 : -0.0465e-9;           if (!model->BSIM3uc1Given)            model->BSIM3uc1 = (model->BSIM3mobMod == 3) ? -0.056 : -0.056e-9;           if (!model->BSIM3u0Given)            model->BSIM3u0 = (model->BSIM3type == NMOS) ? 0.067 : 0.025;        if (!model->BSIM3uteGiven)            model->BSIM3ute = -1.5;            if (!model->BSIM3voffGiven)            model->BSIM3voff = -0.08;        if (!model->BSIM3deltaGiven)             model->BSIM3delta = 0.01;        if (!model->BSIM3rdswGiven)            model->BSIM3rdsw = 0;              if (!model->BSIM3prwgGiven)            model->BSIM3prwg = 0.0;      /* unit 1/V */        if (!model->BSIM3prwbGiven)            model->BSIM3prwb = 0.0;              if (!model->BSIM3prtGiven)        if (!model->BSIM3prtGiven)            model->BSIM3prt = 0.0;              if (!model->BSIM3eta0Given)            model->BSIM3eta0 = 0.08;      /* no unit  */         if (!model->BSIM3etabGiven)            model->BSIM3etab = -0.07;      /* unit  1/V */         if (!model->BSIM3pclmGiven)            model->BSIM3pclm = 1.3;      /* no unit  */         if (!model->BSIM3pdibl1Given)            model->BSIM3pdibl1 = .39;    /* no unit  */        if (!model->BSIM3pdibl2Given)            model->BSIM3pdibl2 = 0.0086;    /* no unit  */         if (!model->BSIM3pdiblbGiven)            model->BSIM3pdiblb = 0.0;    /* 1/V  */         if (!model->BSIM3pscbe1Given)            model->BSIM3pscbe1 = 4.24e8;             if (!model->BSIM3pscbe2Given)            model->BSIM3pscbe2 = 1.0e-5;            if (!model->BSIM3pvagGiven)            model->BSIM3pvag = 0.0;             if (!model->BSIM3wrGiven)              model->BSIM3wr = 1.0;        if (!model->BSIM3dwgGiven)              model->BSIM3dwg = 0.0;        if (!model->BSIM3dwbGiven)              model->BSIM3dwb = 0.0;        if (!model->BSIM3b0Given)            model->BSIM3b0 = 0.0;        if (!model->BSIM3b1Given)              model->BSIM3b1 = 0.0;        if (!model->BSIM3alpha0Given)              model->BSIM3alpha0 = 0.0;        if (!model->BSIM3alpha1Given)            model->BSIM3alpha1 = 0.0;        if (!model->BSIM3beta0Given)              model->BSIM3beta0 = 30.0;        if (!model->BSIM3ijthGiven)            model->BSIM3ijth = 0.1; /* unit A */        if (!model->BSIM3elmGiven)              model->BSIM3elm = 5.0;        if (!model->BSIM3cgslGiven)              model->BSIM3cgsl = 0.0;        if (!model->BSIM3cgdlGiven)              model->BSIM3cgdl = 0.0;        if (!model->BSIM3ckappaGiven)              model->BSIM3ckappa = 0.6;        if (!model->BSIM3clcGiven)              model->BSIM3clc = 0.1e-6;        if (!model->BSIM3cleGiven)              model->BSIM3cle = 0.6;        if (!model->BSIM3vfbcvGiven)              model->BSIM3vfbcv = -1.0;        if (!model->BSIM3acdeGiven)            model->BSIM3acde = 1.0;        if (!model->BSIM3moinGiven)            model->BSIM3moin = 15.0;        if (!model->BSIM3noffGiven)            model->BSIM3noff = 1.0;        if (!model->BSIM3voffcvGiven)            model->BSIM3voffcv = 0.0;        if (!model->BSIM3tcjGiven)            model->BSIM3tcj = 0.0;        if (!model->BSIM3tpbGiven)            model->BSIM3tpb = 0.0;        if (!model->BSIM3tcjswGiven)            model->BSIM3tcjsw = 0.0;        if (!model->BSIM3tpbswGiven)            model->BSIM3tpbsw = 0.0;        if (!model->BSIM3tcjswgGiven)            model->BSIM3tcjswg = 0.0;        if (!model->BSIM3tpbswgGiven)            model->BSIM3tpbswg = 0.0;        /* acm model */        if (!model->BSIM3hdifGiven)          model->BSIM3hdif = 0.0;        if (!model->BSIM3ldifGiven)          model->BSIM3ldif = 0.0;        if (!model->BSIM3ldGiven)          model->BSIM3ld = 0.0;        if (!model->BSIM3rdGiven)          model->BSIM3rd = 0.0;        if (!model->BSIM3rsGiven)          model->BSIM3rs = 0.0;        if (!model->BSIM3rdcGiven)          model->BSIM3rdc = 0.0;        if (!model->BSIM3rscGiven)          model->BSIM3rsc = 0.0;        /* Length dependence */        if (!model->BSIM3lcdscGiven)            model->BSIM3lcdsc = 0.0;        if (!model->BSIM3lcdscbGiven)            model->BSIM3lcdscb = 0.0;            if (!model->BSIM3lcdscdGiven)             model->BSIM3lcdscd = 0.0;        if (!model->BSIM3lcitGiven)            model->BSIM3lcit = 0.0;        if (!model->BSIM3lnfactorGiven)            model->BSIM3lnfactor = 0.0;        if (!model->BSIM3lxjGiven)            model->BSIM3lxj = 0.0;        if (!model->BSIM3lvsatGiven)            model->BSIM3lvsat = 0.0;        if (!model->BSIM3latGiven)            model->BSIM3lat = 0.0;        if (!model->BSIM3la0Given)            model->BSIM3la0 = 0.0;         if (!model->BSIM3lagsGiven)            model->BSIM3lags = 0.0;        if (!model->BSIM3la1Given)            model->BSIM3la1 = 0.0;        if (!model->BSIM3la2Given)            model->BSIM3la2 = 0.0;        if (!model->BSIM3lketaGiven)            model->BSIM3lketa = 0.0;        if (!model->BSIM3lnsubGiven)            model->BSIM3lnsub = 0.0;        if (!model->BSIM3lnpeakGiven)            model->BSIM3lnpeak = 0.0;        if (!model->BSIM3lngateGiven)            model->BSIM3lngate = 0.0;        if (!model->BSIM3lvbmGiven)            model->BSIM3lvbm = 0.0;        if (!model->BSIM3lxtGiven)            model->BSIM3lxt = 0.0;        if (!model->BSIM3lkt1Given)            model->BSIM3lkt1 = 0.0;         if (!model->BSIM3lkt1lGiven)            model->BSIM3lkt1l = 0.0;        if (!model->BSIM3lkt2Given)            model->BSIM3lkt2 = 0.0;        if (!model->BSIM3lk3Given)            model->BSIM3lk3 = 0.0;              if (!model->BSIM3lk3bGiven)            model->BSIM3lk3b = 0.0;              if (!model->BSIM3lw0Given)            model->BSIM3lw0 = 0.0;            if (!model->BSIM3lnlxGiven)            model->BSIM3lnlx = 0.0;             if (!model->BSIM3ldvt0Given)            model->BSIM3ldvt0 = 0.0;            if (!model->BSIM3ldvt1Given)            model->BSIM3ldvt1 = 0.0;              if (!model->BSIM3ldvt2Given)            model->BSIM3ldvt2 = 0.0;        if (!model->BSIM3ldvt0wGiven)            model->BSIM3ldvt0w = 0.0;            if (!model->BSIM3ldvt1wGiven)            model->BSIM3ldvt1w = 0.0;              if (!model->BSIM3ldvt2wGiven)            model->BSIM3ldvt2w = 0.0;        if (!model->BSIM3ldroutGiven)            model->BSIM3ldrout = 0.0;             if (!model->BSIM3ldsubGiven)            model->BSIM3ldsub = 0.0;        if (!model->BSIM3lvth0Given)           model->BSIM3lvth0 = 0.0;        if (!model->BSIM3luaGiven)            model->BSIM3lua = 0.0;        if (!model->BSIM3lua1Given)            model->BSIM3lua1 = 0.0;        if (!model->BSIM3lubGiven)            model->BSIM3lub = 0.0;        if (!model->BSIM3lub1Given)            model->BSIM3lub1 = 0.0;        if (!model->BSIM3lucGiven)            model->BSIM3luc = 0.0;        if (!model->BSIM3luc1Given)            model->BSIM3luc1 = 0.0;        if (!model->BSIM3lu0Given)            model->BSIM3lu0 = 0.0;        if (!model->BSIM3luteGiven)            model->BSIM3lute = 0.0;            if (!model->BSIM3lvoffGiven)            model->BSIM3lvoff = 0.0;        if (!model->BSIM3ldeltaGiven)  

⌨️ 快捷键说明

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