From 8be6630ccdddbce757e97cf5ef76c15c4a03ad78 Mon Sep 17 00:00:00 2001 From: dwarning Date: Sat, 24 Nov 2007 11:53:21 +0000 Subject: [PATCH] BSIM3v3.3.0 added --- src/spicelib/devices/bsim3/b3.c | 23 +- src/spicelib/devices/bsim3/b3acld.c | 339 ++++++---- src/spicelib/devices/bsim3/b3ask.c | 24 +- src/spicelib/devices/bsim3/b3check.c | 110 ++-- src/spicelib/devices/bsim3/b3cvtest.c | 14 +- src/spicelib/devices/bsim3/b3del.c | 14 +- src/spicelib/devices/bsim3/b3dest.c | 13 +- src/spicelib/devices/bsim3/b3getic.c | 16 +- src/spicelib/devices/bsim3/b3ld.c | 860 ++++++++----------------- src/spicelib/devices/bsim3/b3mask.c | 54 +- src/spicelib/devices/bsim3/b3mdel.c | 12 +- src/spicelib/devices/bsim3/b3mpar.c | 67 +- src/spicelib/devices/bsim3/b3noi.c | 258 +++----- src/spicelib/devices/bsim3/b3par.c | 17 +- src/spicelib/devices/bsim3/b3pzld.c | 71 +- src/spicelib/devices/bsim3/b3set.c | 307 ++++----- src/spicelib/devices/bsim3/b3temp.c | 303 ++------- src/spicelib/devices/bsim3/b3trunc.c | 15 +- src/spicelib/devices/bsim3/bsim3def.h | 74 +-- src/spicelib/devices/bsim3/bsim3ext.h | 27 +- src/spicelib/devices/bsim3/bsim3init.c | 2 + src/spicelib/devices/bsim3/bsim3itf.h | 1 - 22 files changed, 983 insertions(+), 1638 deletions(-) diff --git a/src/spicelib/devices/bsim3/b3.c b/src/spicelib/devices/bsim3/b3.c index ac3a20508..b4b3bc57b 100644 --- a/src/spicelib/devices/bsim3/b3.c +++ b/src/spicelib/devices/bsim3/b3.c @@ -1,12 +1,11 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ +/**** BSIM3v3.3.0 beta, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ #include "ngspice.h" @@ -26,6 +25,7 @@ IOP( "nrd", BSIM3_NRD, IF_REAL , "Number of squares in drain"), IOP( "nrs", BSIM3_NRS, IF_REAL , "Number of squares in source"), IOP( "off", BSIM3_OFF, IF_FLAG , "Device is initially off"), IOP( "nqsmod", BSIM3_NQSMOD, IF_INTEGER, "Non-quasi-static model selector"), +IOP( "acnqsmod", BSIM3_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), IP( "ic", BSIM3_IC, IF_REALVEC , "Vector of DS,GS,BS initial voltages"), OP( "gmbs", BSIM3_GMBS, IF_REAL, "Gmb"), OP( "gm", BSIM3_GM, IF_REAL, "Gm"), @@ -42,7 +42,7 @@ IFparm BSIM3mPTable[] = { /* model parameters */ IOP( "capmod", BSIM3_MOD_CAPMOD, IF_INTEGER, "Capacitance model selector"), IOP( "mobmod", BSIM3_MOD_MOBMOD, IF_INTEGER, "Mobility model selector"), IOP( "noimod", BSIM3_MOD_NOIMOD, IF_INTEGER, "Noise model selector"), -IOP( "acm", BSIM3_MOD_ACMMOD, IF_INTEGER, "Area calculation method selector"), +IOP( "acnqsmod", BSIM3_MOD_ACNQSMOD, IF_INTEGER, "AC NQS model selector"), IOP( "paramchk", BSIM3_MOD_PARAMCHK, IF_INTEGER, "Model parameter checking selector"), IOP( "binunit", BSIM3_MOD_BINUNIT, IF_INTEGER, "Bin unit selector"), IOP( "version", BSIM3_MOD_VERSION, IF_STRING, " parameter for model version"), @@ -147,6 +147,7 @@ IOP( "acde", BSIM3_MOD_ACDE, IF_REAL, "Exponential coefficient for finite charge IOP( "moin", BSIM3_MOD_MOIN, IF_REAL, "Coefficient for gate-bias dependent surface potential"), IOP( "noff", BSIM3_MOD_NOFF, IF_REAL, "C-V turn-on/off parameter"), IOP( "voffcv", BSIM3_MOD_VOFFCV, IF_REAL, "C-V lateral-shift parameter"), +IOP( "lintnoi", BSIM3_MOD_LINTNOI, IF_REAL, "lint offset for noise calculation"), IOP( "lint", BSIM3_MOD_LINT, IF_REAL, "Length reduction parameter"), IOP( "ll", BSIM3_MOD_LL, IF_REAL, "Length reduction parameter"), IOP( "llc", BSIM3_MOD_LLC, IF_REAL, "Length reduction parameter for CV"), @@ -158,10 +159,6 @@ IOP( "lwl", BSIM3_MOD_LWL, IF_REAL, "Length reduction parameter"), IOP( "lwlc", BSIM3_MOD_LWLC, IF_REAL, "Length reduction parameter for CV"), IOP( "lmin", BSIM3_MOD_LMIN, IF_REAL, "Minimum length for the model"), IOP( "lmax", BSIM3_MOD_LMAX, IF_REAL, "Maximum length for the model"), - -IOP( "xl", BSIM3_MOD_XL, IF_REAL, "Length correction parameter"), -IOP( "xw", BSIM3_MOD_XW, IF_REAL, "Width correction parameter"), - IOP( "wr", BSIM3_MOD_WR, IF_REAL, "Width dependence of rds"), IOP( "wint", BSIM3_MOD_WINT, IF_REAL, "Width reduction parameter"), IOP( "dwg", BSIM3_MOD_DWG, IF_REAL, "Width reduction parameter"), @@ -190,14 +187,6 @@ IOP( "cle", BSIM3_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"), IOP( "dwc", BSIM3_MOD_DWC, IF_REAL, "Delta W for C-V model"), IOP( "dlc", BSIM3_MOD_DLC, IF_REAL, "Delta L for C-V model"), -IOP( "hdif", BSIM3_MOD_HDIF, IF_REAL, "ACM Parameter: Distance Gate - contact"), -IOP( "ldif", BSIM3_MOD_LDIF, IF_REAL, "ACM Parameter: Length of LDD Gate-Source/Drain"), -IOP( "ld", BSIM3_MOD_LD, IF_REAL, "ACM Parameter: Length of LDD under Gate"), -IOP( "rd", BSIM3_MOD_RD, IF_REAL, "ACM Parameter: Resistance of LDD drain side"), -IOP( "rs", BSIM3_MOD_RS, IF_REAL, "ACM Parameter: Resistance of LDD source side"), -IOP( "rdc", BSIM3_MOD_RS, IF_REAL, "ACM Parameter: Resistance contact drain side"), -IOP( "rsc", BSIM3_MOD_RS, IF_REAL, "ACM Parameter: Resistance contact source side"), - IOP( "alpha0", BSIM3_MOD_ALPHA0, IF_REAL, "substrate current model parameter"), IOP( "alpha1", BSIM3_MOD_ALPHA1, IF_REAL, "substrate current model parameter"), IOP( "beta0", BSIM3_MOD_BETA0, IF_REAL, "substrate current model parameter"), diff --git a/src/spicelib/devices/bsim3/b3acld.c b/src/spicelib/devices/bsim3/b3acld.c index 6cbd9a105..d9fe1d95e 100644 --- a/src/spicelib/devices/bsim3/b3acld.c +++ b/src/spicelib/devices/bsim3/b3acld.c @@ -1,12 +1,11 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ +/**** BSIM3v3.3.0 beta, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3acld.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3acld.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ #include "ngspice.h" @@ -17,7 +16,9 @@ int -BSIM3acLoad (GENmodel *inModel, CKTcircuit *ckt) +BSIM3acLoad(inModel,ckt) +GENmodel *inModel; +CKTcircuit *ckt; { BSIM3model *model = (BSIM3model*)inModel; BSIM3instance *here; @@ -25,29 +26,106 @@ double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb; double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb; double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb, omega; double GSoverlapCap, GDoverlapCap, GBoverlapCap, FwdSum, RevSum, Gm, Gmbs; -double dxpart, sxpart, xgtg, xgtd, xgts, xgtb; -double xcqgb = 0.0, xcqdb = 0.0, xcqsb = 0.0, xcqbb = 0.0; +double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb, xcqdb, xcqsb, xcqbb; double gbspsp, gbbdp, gbbsp, gbspg, gbspb; double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; +double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Cdb, Csg, Csd, Css, Csb; double ScalingFactor = 1.0e-9; +/* For ACNQSMOD */ +double T0, T2, T3, gmr, gmbsr, gdsr, gmi, gmbsi, gdsi; +double Cddr, Cdgr, Cdsr, Csdr, Csgr, Cssr, Cgdr, Cggr, Cgsr; +double Cddi, Cdgi, Cdsi, Cdbi, Csdi, Csgi, Cssi, Csbi; +double Cgdi, Cggi, Cgsi, Cgbi, Gmi, Gmbsi, FwdSumi, RevSumi; +double xcdgbi, xcsgbi, xcddbi, xcdsbi, xcsdbi, xcssbi, xcdbbi; +double xcsbbi, xcggbi, xcgdbi, xcgsbi, xcgbbi; double m; omega = ckt->CKTomega; for (; model != NULL; model = model->BSIM3nextModel) { for (here = model->BSIM3instances; here!= NULL; here = here->BSIM3nextInstance) - { + { if (here->BSIM3owner != ARCHme) continue; - if (here->BSIM3mode >= 0) - { Gm = here->BSIM3gm; - Gmbs = here->BSIM3gmbs; + Csd = -(here->BSIM3cddb + here->BSIM3cgdb + here->BSIM3cbdb); + Csg = -(here->BSIM3cdgb + here->BSIM3cggb + here->BSIM3cbgb); + Css = -(here->BSIM3cdsb + here->BSIM3cgsb + here->BSIM3cbsb); + + if (here->BSIM3acnqsMod) + { T0 = omega * here->BSIM3taunet; + T1 = T0 * T0; + T2 = 1.0 / (1.0 + T1); + T3 = T0 * T2; + + gmr = here->BSIM3gm * T2; + gmbsr = here->BSIM3gmbs * T2; + gds = here->BSIM3gds * T2; + + gmi = -here->BSIM3gm * T3; + gmbsi = -here->BSIM3gmbs * T3; + gdsi = -here->BSIM3gds * T3; + + Cddr = here->BSIM3cddb * T2; + Cdgr = here->BSIM3cdgb * T2; + Cdsr = here->BSIM3cdsb * T2; + + Cddi = here->BSIM3cddb * T3 * omega; + Cdgi = here->BSIM3cdgb * T3 * omega; + Cdsi = here->BSIM3cdsb * T3 * omega; + Cdbi = -(Cddi + Cdgi + Cdsi); + + Csdr = Csd * T2; + Csgr = Csg * T2; + Cssr = Css * T2; + + Csdi = Csd * T3 * omega; + Csgi = Csg * T3 * omega; + Cssi = Css * T3 * omega; + Csbi = -(Csdi + Csgi + Cssi); + + Cgdr = -(Cddr + Csdr + here->BSIM3cbdb); + Cggr = -(Cdgr + Csgr + here->BSIM3cbgb); + Cgsr = -(Cdsr + Cssr + here->BSIM3cbsb); + + Cgdi = -(Cddi + Csdi); + Cggi = -(Cdgi + Csgi); + Cgsi = -(Cdsi + Cssi); + Cgbi = -(Cgdi + Cggi + Cgsi); + } + else /* QS */ + { gmr = here->BSIM3gm; + gmbsr = here->BSIM3gmbs; + gds = here->BSIM3gds; + gmi = gmbsi = gdsi = 0.0; + + Cddr = here->BSIM3cddb; + Cdgr = here->BSIM3cdgb; + Cdsr = here->BSIM3cdsb; + Cddi = Cdgi = Cdsi = Cdbi = 0.0; + + Csdr = Csd; + Csgr = Csg; + Cssr = Css; + Csdi = Csgi = Cssi = Csbi = 0.0; + + Cgdr = here->BSIM3cgdb; + Cggr = here->BSIM3cggb; + Cgsr = here->BSIM3cgsb; + Cgdi = Cggi = Cgsi = Cgbi = 0.0; + } + + if (here->BSIM3mode >= 0) + { Gm = gmr; + Gmbs = gmbsr; FwdSum = Gm + Gmbs; RevSum = 0.0; + Gmi = gmi; + Gmbsi = gmbsi; + FwdSumi = Gmi + Gmbsi; + RevSumi = 0.0; gbbdp = -here->BSIM3gbds; gbbsp = here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs; @@ -62,18 +140,18 @@ double m; gbspb = 0.0; gbspsp = 0.0; - if (here->BSIM3nqsMod == 0) - { cggb = here->BSIM3cggb; - cgsb = here->BSIM3cgsb; - cgdb = here->BSIM3cgdb; + if (here->BSIM3nqsMod == 0 || here->BSIM3acnqsMod == 1) + { cggb = Cggr; + cgsb = Cgsr; + cgdb = Cgdr; cbgb = here->BSIM3cbgb; cbsb = here->BSIM3cbsb; cbdb = here->BSIM3cbdb; - cdgb = here->BSIM3cdgb; - cdsb = here->BSIM3cdsb; - cddb = here->BSIM3cddb; + cdgb = Cdgr; + cdsb = Cdsr; + cddb = Cddr; xgtg = xgtd = xgts = xgtb = 0.0; sxpart = 0.6; @@ -139,12 +217,28 @@ double m; dsxpart_dVs = -ddxpart_dVs; dsxpart_dVb = -(dsxpart_dVd + dsxpart_dVg + dsxpart_dVs); } + xcdgbi = Cdgi; + xcsgbi = Csgi; + xcddbi = Cddi; + xcdsbi = Cdsi; + xcsdbi = Csdi; + xcssbi = Cssi; + xcdbbi = Cdbi; + xcsbbi = Csbi; + xcggbi = Cggi; + xcgdbi = Cgdi; + xcgsbi = Cgsi; + xcgbbi = Cgbi; } else - { Gm = -here->BSIM3gm; - Gmbs = -here->BSIM3gmbs; + { Gm = -gmr; + Gmbs = -gmbsr; FwdSum = 0.0; RevSum = -(Gm + Gmbs); + Gmi = -gmi; + Gmbsi = -gmbsi; + FwdSumi = 0.0; + RevSumi = -(Gmi + Gmbsi); gbbsp = -here->BSIM3gbds; gbbdp = here->BSIM3gbds + here->BSIM3gbgs + here->BSIM3gbbs; @@ -159,18 +253,18 @@ double m; gbspb = here->BSIM3gbbs; gbspdp = -(gbspg + gbspsp + gbspb); - if (here->BSIM3nqsMod == 0) - { cggb = here->BSIM3cggb; - cgsb = here->BSIM3cgdb; - cgdb = here->BSIM3cgsb; + if (here->BSIM3nqsMod == 0 || here->BSIM3acnqsMod == 1) + { cggb = Cggr; + cgsb = Cgdr; + cgdb = Cgsr; cbgb = here->BSIM3cbgb; cbsb = here->BSIM3cbdb; cbdb = here->BSIM3cbsb; - cdgb = -(here->BSIM3cdgb + cggb + cbgb); - cdsb = -(here->BSIM3cddb + cgsb + cbsb); - cddb = -(here->BSIM3cdsb + cgdb + cbdb); + cdgb = -(Cdgr + cggb + cbgb); + cdsb = -(Cddr + cgsb + cbsb); + cddb = -(Cdsr + cgdb + cbdb); xgtg = xgtd = xgts = xgtb = 0.0; sxpart = 0.4; @@ -236,12 +330,23 @@ double m; ddxpart_dVs = -dsxpart_dVs; ddxpart_dVb = -(ddxpart_dVd + ddxpart_dVg + ddxpart_dVs); } + xcdgbi = Csgi; + xcsgbi = Cdgi; + xcddbi = Cssi; + xcdsbi = Csdi; + xcsdbi = Cdsi; + xcssbi = Cddi; + xcdbbi = Csbi; + xcsbbi = Cdbi; + xcggbi = Cggi; + xcgdbi = Cgsi; + xcgsbi = Cgdi; + xcgbbi = Cgbi; } T1 = *(ckt->CKTstate0 + here->BSIM3qdef) * here->BSIM3gtau; gdpr = here->BSIM3drainConductance; gspr = here->BSIM3sourceConductance; - gds = here->BSIM3gds; gbd = here->BSIM3gbd; gbs = here->BSIM3gbs; capbd = here->BSIM3capbd; @@ -267,97 +372,91 @@ double m; m = here->BSIM3m; - *(here->BSIM3GgPtr + 1) += m * xcggb; - *(here->BSIM3BbPtr + 1) -= - m * (xcbgb + xcbdb + xcbsb); - *(here->BSIM3DPdpPtr + 1) += m * xcddb; - *(here->BSIM3SPspPtr + 1) += m * xcssb; - *(here->BSIM3GbPtr + 1) -= - m * (xcggb + xcgdb + xcgsb); - *(here->BSIM3GdpPtr + 1) += m * xcgdb; - *(here->BSIM3GspPtr + 1) += m * xcgsb; - *(here->BSIM3BgPtr + 1) += m * xcbgb; - *(here->BSIM3BdpPtr + 1) += m * xcbdb; - *(here->BSIM3BspPtr + 1) += m * xcbsb; - *(here->BSIM3DPgPtr + 1) += m * xcdgb; - *(here->BSIM3DPbPtr + 1) -= - m * (xcdgb + xcddb + xcdsb); - *(here->BSIM3DPspPtr + 1) += m * xcdsb; - *(here->BSIM3SPgPtr + 1) += m * xcsgb; - *(here->BSIM3SPbPtr + 1) -= - m * (xcsgb + xcsdb + xcssb); - *(here->BSIM3SPdpPtr + 1) += m * xcsdb; - - *(here->BSIM3DdPtr) += m * gdpr; - *(here->BSIM3SsPtr) += m * gspr; - *(here->BSIM3BbPtr) += - m * (gbd + gbs - here->BSIM3gbbs); - *(here->BSIM3DPdpPtr) += - m * (gdpr + gds + gbd + RevSum + - dxpart * xgtd + T1 * ddxpart_dVd + - gbdpdp); - *(here->BSIM3SPspPtr) += - m * (gspr + gds + gbs + FwdSum + - sxpart * xgts + T1 * dsxpart_dVs + - gbspsp); - - *(here->BSIM3DdpPtr) -= m * gdpr; - *(here->BSIM3SspPtr) -= m * gspr; - - *(here->BSIM3BgPtr) -= m * here->BSIM3gbgs; - *(here->BSIM3BdpPtr) -= m * (gbd - gbbdp); - *(here->BSIM3BspPtr) -= m * (gbs - gbbsp); - - *(here->BSIM3DPdPtr) -= m * gdpr; - *(here->BSIM3DPgPtr) += - m * (Gm + dxpart * xgtg + T1 * ddxpart_dVg + - gbdpg); - *(here->BSIM3DPbPtr) -= - m * (gbd - Gmbs - dxpart * xgtb - - T1 * ddxpart_dVb - gbdpb); - *(here->BSIM3DPspPtr) -= - m * (gds + FwdSum - dxpart * xgts - - T1 * ddxpart_dVs - gbdpsp); - - *(here->BSIM3SPgPtr) -= - m * (Gm - sxpart * xgtg - T1 * dsxpart_dVg - - gbspg); - *(here->BSIM3SPsPtr) -= m * gspr; - *(here->BSIM3SPbPtr) -= - m * (gbs + Gmbs - sxpart * xgtb - - T1 * dsxpart_dVb - gbspb); - *(here->BSIM3SPdpPtr) -= - m * (gds + RevSum - sxpart * xgtd - - T1 * dsxpart_dVd - gbspdp); - - *(here->BSIM3GgPtr) -= m * xgtg; - *(here->BSIM3GbPtr) -= m * xgtb; - *(here->BSIM3GdpPtr) -= m * xgtd; - *(here->BSIM3GspPtr) -= m * xgts; - - if (here->BSIM3nqsMod) - { - *(here->BSIM3QqPtr + 1) += - m * omega * ScalingFactor; - *(here->BSIM3QgPtr + 1) -= m * xcqgb; - *(here->BSIM3QdpPtr + 1) -= m * xcqdb; - *(here->BSIM3QspPtr + 1) -= m * xcqsb; - *(here->BSIM3QbPtr + 1) -= m * xcqbb; - - *(here->BSIM3QqPtr) += m * here->BSIM3gtau; - - *(here->BSIM3DPqPtr) += - m * (dxpart * here->BSIM3gtau); - *(here->BSIM3SPqPtr) += - m * (sxpart * here->BSIM3gtau); - *(here->BSIM3GqPtr) -= m * here->BSIM3gtau; - - *(here->BSIM3QgPtr) += m * xgtg; - *(here->BSIM3QdpPtr) += m * xgtd; - *(here->BSIM3QspPtr) += m * xgts; - *(here->BSIM3QbPtr) += m * xgtb; - } - } + *(here->BSIM3GgPtr +1) += m * xcggb; + *(here->BSIM3BbPtr +1) -= m * (xcbgb + xcbdb + xcbsb); + *(here->BSIM3DPdpPtr +1) += m * (xcddb + gdsi + RevSumi); + *(here->BSIM3SPspPtr +1) += m * (xcssb + gdsi + FwdSumi); + *(here->BSIM3GbPtr +1) -= m * (xcggb + xcgdb + xcgsb); + *(here->BSIM3GdpPtr +1) += m * xcgdb; + *(here->BSIM3GspPtr +1) += m * xcgsb; + *(here->BSIM3BgPtr +1) += m * xcbgb; + *(here->BSIM3BdpPtr +1) += m * xcbdb; + *(here->BSIM3BspPtr +1) += m * xcbsb; + *(here->BSIM3DPgPtr +1) += m * (xcdgb + Gmi); + *(here->BSIM3DPbPtr +1) -= m * (xcdgb + xcddb + xcdsb + Gmbsi); + *(here->BSIM3DPspPtr +1) += m * (xcdsb - gdsi - FwdSumi); + *(here->BSIM3SPgPtr +1) += m * (xcsgb - Gmi); + *(here->BSIM3SPbPtr +1) -= m * (xcsgb + xcsdb + xcssb - Gmbsi); + *(here->BSIM3SPdpPtr +1) += m * (xcsdb - gdsi - RevSumi); + + *(here->BSIM3DdPtr) += m * gdpr; + *(here->BSIM3SsPtr) += m * gspr; + *(here->BSIM3BbPtr) += m * (gbd + gbs - here->BSIM3gbbs); + *(here->BSIM3DPdpPtr) += m * (gdpr + gds + gbd + RevSum + xcddbi + + dxpart * xgtd + T1 * ddxpart_dVd + gbdpdp); + *(here->BSIM3SPspPtr) += m * (gspr + gds + gbs + FwdSum + xcssbi + + sxpart * xgts + T1 * dsxpart_dVs + gbspsp); + + *(here->BSIM3DdpPtr) -= m * gdpr; + *(here->BSIM3SspPtr) -= m * gspr; + + *(here->BSIM3BgPtr) -= m * here->BSIM3gbgs; + *(here->BSIM3BdpPtr) -= m * (gbd - gbbdp); + *(here->BSIM3BspPtr) -= m * (gbs - gbbsp); + + *(here->BSIM3DPdPtr) -= m * gdpr; + *(here->BSIM3DPgPtr) += m * (Gm + dxpart * xgtg + T1 * ddxpart_dVg + + gbdpg + xcdgbi); + *(here->BSIM3DPbPtr) -= m * (gbd - Gmbs - dxpart * xgtb + - T1 * ddxpart_dVb - gbdpb - xcdbbi); + *(here->BSIM3DPspPtr) -= m * (gds + FwdSum - dxpart * xgts + - T1 * ddxpart_dVs - gbdpsp - xcdsbi); + + *(here->BSIM3SPgPtr) -= m * (Gm - sxpart * xgtg - T1 * dsxpart_dVg + - gbspg - xcsgbi); + *(here->BSIM3SPsPtr) -= m * gspr; + *(here->BSIM3SPbPtr) -= m * (gbs + Gmbs - sxpart * xgtb + - T1 * dsxpart_dVb - gbspb - xcsbbi); + *(here->BSIM3SPdpPtr) -= m * (gds + RevSum - sxpart * xgtd + - T1 * dsxpart_dVd - gbspdp - xcsdbi); + + *(here->BSIM3GgPtr) -= m * (xgtg - xcggbi); + *(here->BSIM3GbPtr) -= m * (xgtb - xcgbbi); + *(here->BSIM3GdpPtr) -= m * (xgtd - xcgdbi); + *(here->BSIM3GspPtr) -= m * (xgts - xcgsbi); + + if (here->BSIM3nqsMod) + { if (here->BSIM3acnqsMod) + { (*(here->BSIM3QqPtr) += m * 1.0); + (*(here->BSIM3QgPtr) += 0.0); + (*(here->BSIM3QdpPtr) += 0.0); + (*(here->BSIM3QspPtr) += 0.0); + (*(here->BSIM3QbPtr) += 0.0); + + (*(here->BSIM3DPqPtr) += 0.0); + (*(here->BSIM3SPqPtr) += 0.0); + (*(here->BSIM3GqPtr) += 0.0); + + } else { + *(here->BSIM3QqPtr +1) += m * omega * ScalingFactor; + *(here->BSIM3QgPtr +1) -= m * xcqgb; + *(here->BSIM3QdpPtr +1) -= m * xcqdb; + *(here->BSIM3QspPtr +1) -= m * xcqsb; + *(here->BSIM3QbPtr +1) -= m * xcqbb; + + *(here->BSIM3QqPtr) += m * here->BSIM3gtau; + + *(here->BSIM3DPqPtr) += m * dxpart * here->BSIM3gtau; + *(here->BSIM3SPqPtr) += m * sxpart * here->BSIM3gtau; + *(here->BSIM3GqPtr) -= m * here->BSIM3gtau; + + *(here->BSIM3QgPtr) += m * xgtg; + *(here->BSIM3QdpPtr) += m * xgtd; + *(here->BSIM3QspPtr) += m * xgts; + *(here->BSIM3QbPtr) += m * xgtb; + } + } + } } return(OK); } diff --git a/src/spicelib/devices/bsim3/b3ask.c b/src/spicelib/devices/bsim3/b3ask.c index 1470a33e5..df01a3449 100644 --- a/src/spicelib/devices/bsim3/b3ask.c +++ b/src/spicelib/devices/bsim3/b3ask.c @@ -1,12 +1,11 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3ask.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3ask.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified bt Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ #include "ngspice.h" @@ -18,8 +17,12 @@ #include "suffix.h" int -BSIM3ask (CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, - IFvalue *select) +BSIM3ask(ckt,inst,which,value,select) +CKTcircuit *ckt; +GENinstance *inst; +int which; +IFvalue *value; +IFvalue *select; { BSIM3instance *here = (BSIM3instance*)inst; @@ -30,9 +33,9 @@ BSIM3instance *here = (BSIM3instance*)inst; case BSIM3_W: value->rValue = here->BSIM3w; return(OK); - case BSIM3_M: - value->rValue = here->BSIM3m; - return (OK); + case BSIM3_M: + value->rValue = here->BSIM3m; + return(OK); case BSIM3_AS: value->rValue = here->BSIM3sourceArea; return(OK); @@ -57,6 +60,9 @@ BSIM3instance *here = (BSIM3instance*)inst; case BSIM3_NQSMOD: value->iValue = here->BSIM3nqsMod; return(OK); + case BSIM3_ACNQSMOD: + value->iValue = here->BSIM3acnqsMod; + return(OK); case BSIM3_IC_VBS: value->rValue = here->BSIM3icVBS; return(OK); diff --git a/src/spicelib/devices/bsim3/b3check.c b/src/spicelib/devices/bsim3/b3check.c index 2faededff..d07574cc4 100644 --- a/src/spicelib/devices/bsim3/b3check.c +++ b/src/spicelib/devices/bsim3/b3check.c @@ -1,13 +1,13 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3check.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3check.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng * Author: 1997-1999 Weidong Liu. - * Author: 2001 Xuemei Xi + * Author: 2001 Xuemei Xi. * Modified by Xuemei Xi, 10/05, 12/14, 2001. - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 + * Modified by Xuemei Xi, 07/29/2005. **********/ #include "ngspice.h" @@ -20,7 +20,10 @@ #include "suffix.h" int -BSIM3checkModel (BSIM3model *model, BSIM3instance *here, CKTcircuit *ckt) +BSIM3checkModel(model, here, ckt) +BSIM3model *model; +BSIM3instance *here; +CKTcircuit *ckt; { struct bsim3SizeDependParam *pParam; int Fatal_Flag = 0; @@ -28,34 +31,20 @@ FILE *fplog; if ((fplog = fopen("b3v3check.log", "w")) != NULL) { pParam = here->pParam; + fprintf(fplog, "BSIM3v3.3.0 Parameter Checking.\n"); + if (strcmp(model->BSIM3version, "3.3.0")) + { fprintf(fplog, "Warning: This model is BSIM3v3.3.0; you specified a wrong version number.\n"); + printf("Warning: This model is BSIM3v3.3.0; you specified a wrong version number.\n"); + } + fprintf(fplog, "Model = %s\n", model->BSIM3modName); - fprintf (fplog, - "BSIM3 Model (Supports: v3.2, v3.2.2, v3.2.3, v3.2.4)\n"); - fprintf (fplog, "Parameter Checking.\n"); - fprintf (fplog, "Model = %s\n", model->BSIM3modName); - fprintf (fplog, "W = %g, L = %g, M = %g\n", here->BSIM3w, - here->BSIM3l, here->BSIM3m); - - if ((strcmp(model->BSIM3version, "3.2.4")) && (strcmp(model->BSIM3version, "3.24")) - && (strcmp(model->BSIM3version, "3.2.3")) && (strcmp(model->BSIM3version, "3.23")) - && (strcmp(model->BSIM3version, "3.2.2")) && (strcmp(model->BSIM3version, "3.22")) - && (strcmp(model->BSIM3version, "3.2")) && (strcmp(model->BSIM3version, "3.20"))) - { - fprintf (fplog, - "Warning: This model supports BSIM3v3.2, BSIM3v3.2.2, BSIM3v3.2.3, BSIM3v3.2.4\n"); - fprintf (fplog, - "You specified a wrong version number. Working now with BSIM3v3.2.4.\n"); - printf ("Warning: This model supports BSIM3v3.2, BSIM3v3.2.2, BSIM3v3.2.3, BSIM3v3.2.4\n"); - printf ("You specified a wrong version number. Working now with BSIM3v3.2.4.\n"); - } - - if (pParam->BSIM3nlx < -pParam->BSIM3leff) - { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", + if (pParam->BSIM3nlx < -pParam->BSIM3leff) + { fprintf(fplog, "Fatal: Nlx = %g is less than -Leff.\n", pParam->BSIM3nlx); - printf("Fatal: Nlx = %g is less than -Leff.\n", + printf("Fatal: Nlx = %g is less than -Leff.\n", pParam->BSIM3nlx); - Fatal_Flag = 1; - } + Fatal_Flag = 1; + } if (model->BSIM3tox <= 0.0) { fprintf(fplog, "Fatal: Tox = %g is not positive.\n", @@ -71,6 +60,14 @@ FILE *fplog; Fatal_Flag = 1; } + if (model->BSIM3lintnoi > pParam->BSIM3leff/2) + { fprintf(fplog, "Fatal: Lintnoi = %g is too large - Leff for noise is negative.\n", + model->BSIM3lintnoi); + printf("Fatal: Lintnoi = %g is too large - Leff for noise is negative.\n", + model->BSIM3lintnoi); + Fatal_Flag = 1; + } + if (pParam->BSIM3npeak <= 0.0) { fprintf(fplog, "Fatal: Nch = %g is not positive.\n", pParam->BSIM3npeak); @@ -176,25 +173,22 @@ FILE *fplog; printf("Warning: Pscbe2 = %g is not positive.\n", pParam->BSIM3pscbe2); } - /* acm model */ - if (model->BSIM3acmMod == 0) { - if (model->BSIM3unitLengthSidewallJctCap > 0.0 || - model->BSIM3unitLengthGateSidewallJctCap > 0.0) - { - if (here->BSIM3drainPerimeter < pParam->BSIM3weff) - { fprintf(fplog, "Warning: Pd = %g is less than W.\n", - here->BSIM3drainPerimeter); - printf("Warning: Pd = %g is less than W.\n", - here->BSIM3drainPerimeter); - } - if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) - { fprintf(fplog, "Warning: Ps = %g is less than W.\n", - here->BSIM3sourcePerimeter); - printf("Warning: Ps = %g is less than W.\n", - here->BSIM3sourcePerimeter); - } - } - } + if (model->BSIM3unitLengthSidewallJctCap > 0.0 || + model->BSIM3unitLengthGateSidewallJctCap > 0.0) + { + if (here->BSIM3drainPerimeter < pParam->BSIM3weff) + { fprintf(fplog, "Warning: Pd = %g is less than W.\n", + here->BSIM3drainPerimeter); + printf("Warning: Pd = %g is less than W.\n", + here->BSIM3drainPerimeter); + } + if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) + { fprintf(fplog, "Warning: Ps = %g is less than W.\n", + here->BSIM3sourcePerimeter); + printf("Warning: Ps = %g is less than W.\n", + here->BSIM3sourcePerimeter); + } + } if (pParam->BSIM3noff < 0.1) { fprintf(fplog, "Warning: Noff = %g is too small.\n", @@ -387,7 +381,6 @@ FILE *fplog; pParam->BSIM3a2); pParam->BSIM3a2 = 1.0; pParam->BSIM3a1 = 0.0; - } if (pParam->BSIM3rdsw < 0.0) @@ -398,13 +391,14 @@ FILE *fplog; pParam->BSIM3rdsw = 0.0; pParam->BSIM3rds0 = 0.0; } - else if ((pParam->BSIM3rds0 > 0.0) && (pParam->BSIM3rds0 < 0.001)) - { fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->BSIM3rds0); - printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n", - pParam->BSIM3rds0); - pParam->BSIM3rds0 = 0.0; - } + if (pParam->BSIM3rds0 < 0.0) + { fprintf(fplog, "Warning: Rds at current temperature = %g is negative. Set to zero.\n", + pParam->BSIM3rds0); + printf("Warning: Rds at current temperature = %g is negative. Set to zero.\n", + pParam->BSIM3rds0); + pParam->BSIM3rds0 = 0.0; + } + if (pParam->BSIM3vsattemp < 1.0e3) { fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->BSIM3vsattemp); diff --git a/src/spicelib/devices/bsim3/b3cvtest.c b/src/spicelib/devices/bsim3/b3cvtest.c index db2b7542c..a5500b14e 100644 --- a/src/spicelib/devices/bsim3/b3cvtest.c +++ b/src/spicelib/devices/bsim3/b3cvtest.c @@ -1,12 +1,11 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3cvtest.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3cvtest.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 **********/ #include "ngspice.h" @@ -20,7 +19,9 @@ int -BSIM3convTest (GENmodel *inModel, CKTcircuit *ckt) +BSIM3convTest(inModel,ckt) +GENmodel *inModel; +CKTcircuit *ckt; { BSIM3model *model = (BSIM3model*)inModel; BSIM3instance *here; @@ -33,11 +34,10 @@ double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs; for (here = model->BSIM3instances; here != NULL ; here=here->BSIM3nextInstance) { - if (here->BSIM3owner != ARCHme) continue; - vbs = model->BSIM3type + vbs = model->BSIM3type * (*(ckt->CKTrhsOld+here->BSIM3bNode) - *(ckt->CKTrhsOld+here->BSIM3sNodePrime)); vgs = model->BSIM3type diff --git a/src/spicelib/devices/bsim3/b3del.c b/src/spicelib/devices/bsim3/b3del.c index 3881752d6..718c75569 100644 --- a/src/spicelib/devices/bsim3/b3del.c +++ b/src/spicelib/devices/bsim3/b3del.c @@ -1,13 +1,12 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3del.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3del.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi * Modified by Xuemei Xi, 10/05, 12/14, 2001. - * Modified by Paolo Nenzi 2002 **********/ #include "ngspice.h" @@ -18,7 +17,10 @@ int -BSIM3delete (GENmodel *inModel, IFuid name, GENinstance **inInst) +BSIM3delete(inModel,name,inInst) +GENmodel *inModel; +IFuid name; +GENinstance **inInst; { BSIM3instance **fast = (BSIM3instance**)inInst; BSIM3model *model = (BSIM3model*)inModel; @@ -38,3 +40,5 @@ BSIM3instance *here; } return(E_NODEV); } + + diff --git a/src/spicelib/devices/bsim3/b3dest.c b/src/spicelib/devices/bsim3/b3dest.c index 9a9079a81..b14d1eab6 100644 --- a/src/spicelib/devices/bsim3/b3dest.c +++ b/src/spicelib/devices/bsim3/b3dest.c @@ -1,12 +1,11 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3dest.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3dest.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 **********/ #include "ngspice.h" @@ -14,7 +13,8 @@ #include "suffix.h" void -BSIM3destroy (GENmodel **inModel) +BSIM3destroy(inModel) +GENmodel **inModel; { BSIM3model **model = (BSIM3model**)inModel; BSIM3instance *here; @@ -36,3 +36,6 @@ BSIM3model *oldmod = NULL; *model = NULL; return; } + + + diff --git a/src/spicelib/devices/bsim3/b3getic.c b/src/spicelib/devices/bsim3/b3getic.c index a3a2715dc..76108e7c8 100644 --- a/src/spicelib/devices/bsim3/b3getic.c +++ b/src/spicelib/devices/bsim3/b3getic.c @@ -1,8 +1,8 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/14/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3getic.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3getic.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi @@ -16,18 +16,20 @@ int -BSIM3getic (GENmodel *inModel, CKTcircuit *ckt) +BSIM3getic(inModel,ckt) +GENmodel *inModel; +CKTcircuit *ckt; { BSIM3model *model = (BSIM3model*)inModel; BSIM3instance *here; for (; model ; model = model->BSIM3nextModel) { for (here = model->BSIM3instances; here; here = here->BSIM3nextInstance) - { - if (here->BSIM3owner != ARCHme) + { + if (here->BSIM3owner != ARCHme) continue; - if (!here->BSIM3icVBSGiven) + if (!here->BSIM3icVBSGiven) { here->BSIM3icVBS = *(ckt->CKTrhs + here->BSIM3bNode) - *(ckt->CKTrhs + here->BSIM3sNode); } diff --git a/src/spicelib/devices/bsim3/b3ld.c b/src/spicelib/devices/bsim3/b3ld.c index 3d5fa5c55..b1cf65fd9 100644 --- a/src/spicelib/devices/bsim3/b3ld.c +++ b/src/spicelib/devices/bsim3/b3ld.c @@ -1,14 +1,14 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3ld.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3ld.c of BSIM3v3.3.0 * Author: 1991 JianHui Huang and Min-Chie Jeng. * Modified by Mansun Chan (1995). * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi * Modified by Xuemei Xi, 10/05, 12/21, 2001. - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 + * Modified by Xuemei Xi, 07/29/2005. **********/ #include "ngspice.h" @@ -33,7 +33,9 @@ int -BSIM3load (GENmodel *inModel, CKTcircuit *ckt) +BSIM3load(inModel,ckt) +GENmodel *inModel; +CKTcircuit *ckt; { BSIM3model *model = (BSIM3model*)inModel; BSIM3instance *here; @@ -42,56 +44,60 @@ double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; double cdrain, cdhat, cdreq, ceqbd, ceqbs, ceqqb, ceqqd, ceqqg, ceq, geq; double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg; double delvbd, delvbs, delvds, delvgd, delvgs; -double Vfbeff, dVfbeff_dVg, dVfbeff_dVd = 0.0, dVfbeff_dVb, V3, V4; +double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4; double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb; -double gcsgb, gcssb, MJ, MJSW, MJSWG; +double gcsgb, gcssb, tol, MJ, MJSW, MJSWG; double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact; -double qgate = 0.0, qbulk = 0.0, qdrn = 0.0, qsrc; -double qinoi, cqgate, cqbulk, cqdrn; +double qgate, qbulk, qdrn, qsrc, qinoi, cqgate, cqbulk, cqdrn; double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum; -double Vgs_eff, Vfb, dVfb_dVb = 0.0, dVfb_dVd = 0.0; +double Vgs_eff, Vfb, dVbs_dVb; double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd; double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtm; -double Vtm; +double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3, Vtm; double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb; -double ExpArg, V0, CoxWLcen, QovCox, LINK; -double DeltaPhi, dDeltaPhi_dVg, dDeltaPhi_dVd, dDeltaPhi_dVb; +double ExpArg, ExpArg1, V0, CoxWLcen, QovCox, LINK; +double DeltaPhi, dDeltaPhi_dVg, VgDP, dVgDP_dVg; double Cox, Tox, Tcen, dTcen_dVg, dTcen_dVd, dTcen_dVb; double Ccen, Coxeff, dCoxeff_dVg, dCoxeff_dVd, dCoxeff_dVb; double Denomi, dDenomi_dVg, dDenomi_dVd, dDenomi_dVb; double ueff, dueff_dVg, dueff_dVd, dueff_dVb; -double Esat, Vdsat; +double Esat, dEsat_dVg, dEsat_dVd, dEsat_dVb, Vdsat, Vdsat0; double EsatL, dEsatL_dVg, dEsatL_dVd, dEsatL_dVb; +double Ilimit, Iexp, dIexp_dVg, dIexp_dVd, dIexp_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 dVasat_dVg, dVasat_dVb, dVasat_dVd, Va, Va2, dVa_dVd, dVa_dVg, dVa_dVb; double Vbseff, dVbseff_dVb, VbseffCV, dVbseffCV_dVb; -double Arg1, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; +double Arg1, Arg2, One_Third_CoxWL, Two_Third_CoxWL, Alphaz, CoxWL; +double dqbulk_dVb, dVgdt_dVg, dVgdt_dVd, dVgdt_dVb; double T0, 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; -double T5; -double T6; -double T7; -double T8; -double T9; -double T10; +double T4, dT4_dVg, dT4_dVd, dT4_dVb; +double T5, dT5_dVg, dT5_dVd, dT5_dVb; +double T6, 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; double tmp, Abulk, dAbulk_dVb, Abulk0, dAbulk0_dVb; +double T100, T101; double VACLM, dVACLM_dVg, dVACLM_dVd, dVACLM_dVb; double VADIBL, dVADIBL_dVg, dVADIBL_dVd, dVADIBL_dVb; +double VAHCE, dVAHCE_dVg, dVAHCE_dVd, dVAHCE_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; +double Theta0, dTheta0_dVb, Theta1, dTheta1_dVb; +double Thetarout, dThetarout_dVb, TempRatio, tmp1, tmp2, tmp3, tmp4; +double DIBL_Sft, dDIBL_Sft_dVd, DIBL_fact, Lambda, dLambda_dVg; +double Rout_Vgs_factor, dRout_Vgs_factor_dVg, dRout_Vgs_factor_dVb; +double dRout_Vgs_factor_dVd, Idtot, Ibtot; double tempv, 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 diffVds, diffVdsCV, 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; @@ -99,46 +105,47 @@ 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; -double Isub, Gbd, Gbg, Gbb; +double Isub, Isubd, Isubs, Gbd, Gbg, Gbb; double VASCBE, dVASCBE_dVg, dVASCBE_dVd, dVASCBE_dVb; double CoxWovL; double Rds, dRds_dVg, dRds_dVb, WVCox, WVCoxRds; -double Vgst2Vtm, VdsatCV, dVdsatCV_dVg, dVdsatCV_dVb; +double Vgst2Vtm, VdsatCV, dVdsatCV_dVd, dVdsatCV_dVg, dVdsatCV_dVb; double Leff, Weff, dWeff_dVg, dWeff_dVb; double AbulkCV, dAbulkCV_dVb; double qgdo, qgso, cgdo, cgso; -double qcheq = 0.0, qdef, gqdef = 0.0, cqdef, cqcheq, gtau_diff, gtau_drift; -double gcqdb = 0.0,gcqsb = 0.0, gcqgb = 0.0,gcqbb = 0.0; +double qcheq, qdef, gqdef, cqdef, cqcheq, gtau_diff, gtau_drift, csreq; +double gcqdb,gcqsb,gcqgb,gcqbb,vss; 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 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_dVd = 0.0, dQac0_dVb, dQsub0_dVg; -double dQsub0_dVd, dQsub0_dVb; +double Cgg, Cgd, Cgs, Cgb, Cdg, Cdd, Cds, Cdb, Qg, Qd; +double Csg, Csd, Css, Csb, Cbg, Cbd, Cbs, Cbb, Qs, Qb; +double Cgg1, Cgb1, Cgd1, Cbg1, Cbb1, Cbd1, Csg1, Csd1, Csb1, Qac0, Qsub0; +double dQac0_dVg, dQac0_dVb, dQsub0_dVg, dQsub0_dVd, dQsub0_dVb; double m; struct bsim3SizeDependParam *pParam; -int ByPass, Check, ChargeComputationNeeded, error; +int ByPass, Check, ChargeComputationNeeded, J, error, I; +double junk[50]; ScalingFactor = 1.0e-9; ChargeComputationNeeded = ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) || ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC))) ? 1 : 0; + for (; model != NULL; model = model->BSIM3nextModel) { for (here = model->BSIM3instances; here != NULL; here = here->BSIM3nextInstance) { if (here->BSIM3owner != ARCHme) continue; - Check = 1; + Check = 1; ByPass = 0; pParam = here->pParam; if ((ckt->CKTmode & MODEINITSMSIG)) @@ -329,37 +336,15 @@ for (; model != NULL; model = model->BSIM3nextModel) /* Source/drain junction diode DC model begins */ Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; - /* acm model */ - if (model->BSIM3acmMod == 0) - { - if ((here->BSIM3sourceArea <= 0.0) - && (here->BSIM3sourcePerimeter <= 0.0)) - { - SourceSatCurrent = 1.0e-14; - } - else - { - SourceSatCurrent = here->BSIM3sourceArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3sourcePerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } + if ((here->BSIM3sourceArea <= 0.0) && (here->BSIM3sourcePerimeter <= 0.0)) + { SourceSatCurrent = 1.0e-14; + } + else + { SourceSatCurrent = here->BSIM3sourceArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3sourcePerimeter + * model->BSIM3jctSidewallTempSatCurDensity; } - else - { - SourceSatCurrent = 0.0; - if (!here->BSIM3sourceAreaGiven) - { - here->BSIM3sourceArea = 2.0 * model->BSIM3hdif * pParam->BSIM3weff; - } - SourceSatCurrent = here->BSIM3sourceArea * model->BSIM3jctTempSatCurDensity; - if (!here->BSIM3sourcePerimeterGiven) - { - here->BSIM3sourcePerimeter = 4.0 * model->BSIM3hdif + 2.0 * pParam->BSIM3weff; - } - SourceSatCurrent = SourceSatCurrent + here->BSIM3sourcePerimeter * model->BSIM3jctSidewallTempSatCurDensity; - if (SourceSatCurrent <= 0.0) SourceSatCurrent = 1.0e-14; - } if (SourceSatCurrent <= 0.0) { here->BSIM3gbs = ckt->CKTgmin; here->BSIM3cbs = here->BSIM3gbs * vbs; @@ -379,56 +364,24 @@ for (; model != NULL; model = model->BSIM3nextModel) + ckt->CKTgmin * vbs; } else - { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - T0 = here->BSIM3IsEvjsm / Nvtm; - here->BSIM3gbs = T0 + (ckt->CKTgmin); - here->BSIM3cbs = here->BSIM3IsEvjsm - SourceSatCurrent - + T0 * (vbs - here->BSIM3vjsm) + (ckt->CKTgmin) * vbs; - break; - case BSIM3V32: - default: - T0 = (SourceSatCurrent + model->BSIM3ijth) / Nvtm; - here->BSIM3gbs = T0 + (ckt->CKTgmin); - here->BSIM3cbs = model->BSIM3ijth + (ckt->CKTgmin) * vbs - + T0 * (vbs - here->BSIM3vjsm); - } + { T0 = here->BSIM3IsEvjsm / Nvtm; + here->BSIM3gbs = T0 + ckt->CKTgmin; + here->BSIM3cbs = here->BSIM3IsEvjsm - SourceSatCurrent + + T0 * (vbs - here->BSIM3vjsm) + + ckt->CKTgmin * vbs; } } } - /* acm model */ - if (model->BSIM3acmMod == 0) - { - if ((here->BSIM3drainArea <= 0.0) && (here->BSIM3drainPerimeter <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM3drainArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3drainPerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } - } - else - { - DrainSatCurrent = 0.0; - if (!here->BSIM3drainAreaGiven) - { - here->BSIM3drainArea = 2.0 * model->BSIM3hdif * pParam->BSIM3weff; - } - DrainSatCurrent = here->BSIM3drainArea * model->BSIM3jctTempSatCurDensity; - if (!here->BSIM3drainPerimeterGiven) - { - here->BSIM3drainPerimeter = 4.0 * model->BSIM3hdif + 2.0 * pParam->BSIM3weff; - } - DrainSatCurrent = DrainSatCurrent + here->BSIM3drainPerimeter * model->BSIM3jctSidewallTempSatCurDensity; - if (DrainSatCurrent <= 0.0) DrainSatCurrent = 1.0e-14; - } + if ((here->BSIM3drainArea <= 0.0) && (here->BSIM3drainPerimeter <= 0.0)) + { DrainSatCurrent = 1.0e-14; + } + else + { DrainSatCurrent = here->BSIM3drainArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3drainPerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } if (DrainSatCurrent <= 0.0) { here->BSIM3gbd = ckt->CKTgmin; here->BSIM3cbd = here->BSIM3gbd * vbd; @@ -448,24 +401,11 @@ for (; model != NULL; model = model->BSIM3nextModel) + ckt->CKTgmin * vbd; } else - { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - T0 = here->BSIM3IsEvjdm / Nvtm; - here->BSIM3gbd = T0 + (ckt->CKTgmin); - here->BSIM3cbd = here->BSIM3IsEvjdm - DrainSatCurrent - + T0 * (vbd - here->BSIM3vjdm) + (ckt->CKTgmin) * vbd; - break; - case BSIM3V32: - default: - T0 = (DrainSatCurrent + model->BSIM3ijth) / Nvtm; - here->BSIM3gbd = T0 + (ckt->CKTgmin); - here->BSIM3cbd = model->BSIM3ijth + (ckt->CKTgmin) * vbd - + T0 * (vbd - here->BSIM3vjdm); - } + { T0 = here->BSIM3IsEvjdm / Nvtm; + here->BSIM3gbd = T0 + ckt->CKTgmin; + here->BSIM3cbd = here->BSIM3IsEvjdm - DrainSatCurrent + + T0 * (vbd - here->BSIM3vjdm) + + ckt->CKTgmin * vbd; } } } @@ -698,10 +638,7 @@ for (; model != NULL; model = model->BSIM3nextModel) dVgsteff_dVd = (T2 * dT1_dVd - T1 * dT2_dVd) / T3; dVgsteff_dVb = (T2 * dT1_dVb - T1 * dT2_dVb) / T3; } - /* Added revision dependent code */ - if (model->BSIM3intVersion > BSIM3V323) { - here->BSIM3Vgsteff = Vgsteff; - } + here->BSIM3Vgsteff = Vgsteff; /* Calculate Effective Channel Geometry */ T9 = sqrtPhis - pParam->BSIM3sqrtPhi; @@ -733,10 +670,7 @@ for (; model != NULL; model = model->BSIM3nextModel) dRds_dVb = pParam->BSIM3rds0 * pParam->BSIM3prwb * dsqrtPhis_dVb * T1; } - /* Added revision dependent code */ - if (model->BSIM3intVersion > BSIM3V323) { - here->BSIM3rds = Rds; /* Noise Bugfix */ - } + here->BSIM3rds = Rds; /* Noise Bugfix */ /* Calculate Abulk */ T1 = 0.5 * pParam->BSIM3k1ox / sqrtPhis; @@ -772,19 +706,11 @@ for (; model != NULL; model = model->BSIM3nextModel) /* added to avoid the problems caused by Abulk */ { T9 = 1.0 / (3.0 - 20.0 * Abulk); Abulk = (0.2 - Abulk) * T9; - /* Added revision dependent code */ - if (model->BSIM3intVersion > BSIM3V32) { - T10 = T9 * T9; - dAbulk_dVb *= T10; - dAbulk_dVg *= T10; - } else { - dAbulk_dVb *= T9 * T9; - } + T10 = T9 * T9; + dAbulk_dVb *= T10; + dAbulk_dVg *= T10; } - /* Added revision dependent code */ - if (model->BSIM3intVersion > BSIM3V323) { - here->BSIM3Abulk = Abulk; - } + here->BSIM3Abulk = Abulk; T2 = pParam->BSIM3keta * Vbseff; if (T2 >= -0.9) @@ -888,10 +814,7 @@ for (; model != NULL; model = model->BSIM3nextModel) } Vgst2Vtm = Vgsteff + 2.0 * Vtm; - /* Added revision dependent code */ - if (model->BSIM3intVersion > BSIM3V323) { - here->BSIM3AbovVgst2Vtm = Abulk / Vgst2Vtm; - } + here->BSIM3AbovVgst2Vtm = Abulk / Vgst2Vtm; if (Rds > 0) { tmp2 = dRds_dVg / Rds + dWeff_dVg / Weff; @@ -980,24 +903,12 @@ for (; model != NULL; model = model->BSIM3nextModel) dVdseff_dVg = dVdsat_dVg - 0.5 * (dT1_dVg + dT2_dVg); dVdseff_dVd = dVdsat_dVd - 0.5 * (dT1_dVd + dT2_dVd); dVdseff_dVb = dVdsat_dVb - 0.5 * (dT1_dVb + dT2_dVb); - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - /* Added to eliminate non-zero Vdseff at Vds=0.0 */ - if (Vds == 0.0) - { - Vdseff = 0.0; - dVdseff_dVg = 0.0; - dVdseff_dVb = 0.0; - } - break; - case BSIM3V32: - default: - /* Do nothing */ - break; - } + /* Added to eliminate non-zero Vdseff at Vds=0.0 */ + if (Vds == 0.0) + { Vdseff = 0.0; + dVdseff_dVg = 0.0; + dVdseff_dVb = 0.0; + } /* Calculate VAsat */ tmp4 = 1.0 - 0.5 * Abulk * Vdsat / Vgst2Vtm; @@ -1027,10 +938,7 @@ for (; model != NULL; model = model->BSIM3nextModel) if (Vdseff > Vds) Vdseff = Vds; diffVds = Vds - Vdseff; - /* Added revision dependent code */ - if (model->BSIM3intVersion > BSIM3V323) { - here->BSIM3Vdseff = Vdseff; - } + here->BSIM3Vdseff = Vdseff; /* Calculate VACLM */ if ((pParam->BSIM3pclm > 0.0) && (diffVds > 1.0e-10)) @@ -1649,42 +1557,14 @@ for (; model != NULL; model = model->BSIM3nextModel) } /* End of VgsteffCV */ if (model->BSIM3capMod == 1) - { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - Vfb = pParam->BSIM3vfbzb; - break; - case BSIM3V32: - Vfb = pParam->BSIM3vfbzb; - dVfb_dVb = dVfb_dVd = 0.0; - break; - default: - Vfb = Vth - pParam->BSIM3phi - pParam->BSIM3k1ox * sqrtPhis; - dVfb_dVb = dVth_dVb - pParam->BSIM3k1ox * dsqrtPhis_dVb; - dVfb_dVd = dVth_dVd; - } - + { Vfb = pParam->BSIM3vfbzb; Arg1 = Vgs_eff - VbseffCV - Vfb - Vgsteff; if (Arg1 <= 0.0) { qgate = CoxWL * Arg1; Cgg = CoxWL * (dVgs_eff_dVg - dVgsteff_dVg); - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - Cgd = -CoxWL * dVgsteff_dVd; - Cgb = -CoxWL * (dVbseffCV_dVb + dVgsteff_dVb); - break; - case BSIM3V32: - default: - Cgd = -CoxWL * (dVfb_dVd + dVgsteff_dVd); - Cgb = -CoxWL * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); - } + Cgd = -CoxWL * dVgsteff_dVd; + Cgb = -CoxWL * (dVbseffCV_dVb + dVgsteff_dVb); } else { T0 = 0.5 * pParam->BSIM3k1ox; @@ -1694,19 +1574,8 @@ for (; model != NULL; model = model->BSIM3nextModel) qgate = CoxWL * pParam->BSIM3k1ox * (T1 - T0); Cgg = T2 * (dVgs_eff_dVg - dVgsteff_dVg); - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - Cgd = -T2 * dVgsteff_dVd; - Cgb = -T2 * (dVbseffCV_dVb + dVgsteff_dVb); - break; - case BSIM3V32: - default: - Cgd = -T2 * (dVfb_dVd + dVgsteff_dVd); - Cgb = -T2 * (dVfb_dVb + dVbseffCV_dVb + dVgsteff_dVb); - } + Cgd = -T2 * dVgsteff_dVd; + Cgb = -T2 * (dVbseffCV_dVb + dVgsteff_dVb); } qbulk = -qgate; Cbg = -Cgg; @@ -1850,24 +1719,7 @@ for (; model != NULL; model = model->BSIM3nextModel) } else if (model->BSIM3capMod == 2) - { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - Vfb = pParam->BSIM3vfbzb; - break; - case BSIM3V32: - Vfb = pParam->BSIM3vfbzb; - dVfb_dVb = dVfb_dVd = 0.0; - break; - default: /* old code prior to v3.2 */ - Vfb = Vth - pParam->BSIM3phi - pParam->BSIM3k1ox * sqrtPhis; - dVfb_dVb = dVth_dVb - pParam->BSIM3k1ox * dsqrtPhis_dVb; - dVfb_dVd = dVth_dVd; - } - + { Vfb = pParam->BSIM3vfbzb; V3 = Vfb - Vgs_eff + VbseffCV - DELTA_3; if (Vfb <= 0.0) { T0 = sqrt(V3 * V3 - 4.0 * DELTA_3 * Vfb); @@ -1880,53 +1732,11 @@ for (; model != NULL; model = model->BSIM3nextModel) T1 = 0.5 * (1.0 + V3 / T0); Vfbeff = Vfb - 0.5 * (V3 + T0); - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - /* Do nothing */ - break; - case BSIM3V32: - default: - dVfbeff_dVd = (1.0 - T1 - T2) * dVfb_dVd; - } dVfbeff_dVg = T1 * dVgs_eff_dVg; - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - dVfbeff_dVb = -T1 * dVbseffCV_dVb; - break; - case BSIM3V32: - default: - dVfbeff_dVb = (1.0 - T1 - T2) * dVfb_dVb - T1 * dVbseffCV_dVb; - } + dVfbeff_dVb = -T1 * dVbseffCV_dVb; Qac0 = CoxWL * (Vfbeff - Vfb); dQac0_dVg = CoxWL * dVfbeff_dVg; - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - /* Do nothing */ - break; - case BSIM3V32: - default: - dQac0_dVd = CoxWL * (dVfbeff_dVd - dVfb_dVd); - } - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - dQac0_dVb = CoxWL * dVfbeff_dVb; - break; - case BSIM3V32: - default: - dQac0_dVb = CoxWL * (dVfbeff_dVb - dVfb_dVb); - } + dQac0_dVb = CoxWL * dVfbeff_dVb; T0 = 0.5 * pParam->BSIM3k1ox; T3 = Vgs_eff - Vfbeff - VbseffCV - Vgsteff; @@ -1946,17 +1756,7 @@ for (; model != NULL; model = model->BSIM3nextModel) Qsub0 = CoxWL * pParam->BSIM3k1ox * (T1 - T0); dQsub0_dVg = T2 * (dVgs_eff_dVg - dVfbeff_dVg - dVgsteff_dVg); - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - dQsub0_dVd = -T2 * dVgsteff_dVd; - break; - case BSIM3V32: - default: - dQsub0_dVd = -T2 * (dVfbeff_dVd + dVgsteff_dVd); - } + dQsub0_dVd = -T2 * dVgsteff_dVd; dQsub0_dVb = -T2 * (dVfbeff_dVb + dVbseffCV_dVb + dVgsteff_dVb); @@ -1973,24 +1773,12 @@ for (; model != NULL; model = model->BSIM3nextModel) dVdseffCV_dVg = T3; dVdseffCV_dVd = T1; dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ - if (Vds == 0.0) - { - VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - break; - case BSIM3V32: - default: - /* Do nothing */ - break; - } + /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ + if (Vds == 0.0) + { VdseffCV = 0.0; + dVdseffCV_dVg = 0.0; + dVdseffCV_dVb = 0.0; + } T0 = AbulkCV * VdseffCV; T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1e-20); @@ -2069,31 +1857,11 @@ for (; model != NULL; model = model->BSIM3nextModel) qdrn = -(qgate + qbulk + qsrc); Cgg = dQac0_dVg + dQsub0_dVg + Cgg1; - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - Cgd = dQsub0_dVd + Cgd1; - break; - case BSIM3V32: - default: - Cgd = dQac0_dVd + dQsub0_dVd + Cgd1; - } + Cgd = dQsub0_dVd + Cgd1; Cgb = dQac0_dVb + dQsub0_dVb + Cgb1; Cbg = Cbg1 - dQac0_dVg - dQsub0_dVg; - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - Cbd = Cbd1 - dQsub0_dVd; - break; - case BSIM3V32: - default: - Cbd = Cbd1 - dQac0_dVd - dQsub0_dVd; - } + Cbd = Cbd1 - dQsub0_dVd; Cbb = Cbb1 - dQac0_dVb - dQsub0_dVb; Cgb *= dVbseff_dVb; @@ -2213,63 +1981,35 @@ for (; model != NULL; model = model->BSIM3nextModel) DeltaPhi = Vtm * log(1.0 + T1 * Vgsteff / Denomi); dDeltaPhi_dVg = 2.0 * Vtm * (T1 -T0) / (Denomi + T1 * Vgsteff); - dDeltaPhi_dVd = dDeltaPhi_dVg * dVgsteff_dVd; - dDeltaPhi_dVb = dDeltaPhi_dVg * dVgsteff_dVb; /* End of delta Phis */ + /* VgDP = Vgsteff - DeltaPhi */ + T0 = Vgsteff - DeltaPhi - 0.001; + dT0_dVg = 1.0 - dDeltaPhi_dVg; + T1 = sqrt(T0 * T0 + Vgsteff * 0.004); + VgDP = 0.5 * (T0 + T1); + dVgDP_dVg = 0.5 * (dT0_dVg + (T0 * dT0_dVg + 0.002) / T1); + T3 = 4.0 * (Vth - pParam->BSIM3vfbzb - pParam->BSIM3phi); Tox += Tox; if (T3 >= 0.0) - { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - T0 = (Vgsteff + T3) / Tox; - dT0_dVd = (dVgsteff_dVd + 4.0 * dVth_dVd) / Tox; - dT0_dVb = (dVgsteff_dVb + 4.0 * dVth_dVb) / Tox; - break; - case BSIM3V32: - default: - T0 = (Vgsteff + T3) / Tox; - } + { T0 = (Vgsteff + T3) / Tox; + dT0_dVd = (dVgsteff_dVd + 4.0 * dVth_dVd) / Tox; + dT0_dVb = (dVgsteff_dVb + 4.0 * dVth_dVb) / Tox; } else - { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - T0 = (Vgsteff + 1.0e-20) / Tox; - dT0_dVd = dVgsteff_dVd / Tox; - dT0_dVb = dVgsteff_dVb / Tox; - break; - case BSIM3V32: - default: - T0 = (Vgsteff + 1.0e-20) / Tox; - } + { T0 = (Vgsteff + 1.0e-20) / Tox; + dT0_dVd = dVgsteff_dVd / Tox; + dT0_dVb = dVgsteff_dVb / Tox; } tmp = exp(0.7 * log(T0)); T1 = 1.0 + tmp; T2 = 0.7 * tmp / (T0 * Tox); Tcen = 1.9e-9 / T1; dTcen_dVg = -1.9e-9 * T2 / T1 /T1; - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - dTcen_dVd = Tox * dTcen_dVg; - dTcen_dVb = dTcen_dVd * dT0_dVb; - dTcen_dVd *= dT0_dVd; - break; - case BSIM3V32: - default: - dTcen_dVd = dTcen_dVg * (4.0 * dVth_dVd + dVgsteff_dVd); - dTcen_dVb = dTcen_dVg * (4.0 * dVth_dVb + dVgsteff_dVb); - } + dTcen_dVd = Tox * dTcen_dVg; + dTcen_dVb = dTcen_dVd * dT0_dVb; + dTcen_dVd *= dT0_dVd; dTcen_dVg *= dVgsteff_dVg; Ccen = EPSSI / Tcen; @@ -2284,38 +2024,40 @@ for (; model != NULL; model = model->BSIM3nextModel) AbulkCV = Abulk0 * pParam->BSIM3abulkCVfactor; dAbulkCV_dVb = pParam->BSIM3abulkCVfactor * dAbulk0_dVb; - VdsatCV = (Vgsteff - DeltaPhi) / AbulkCV; - V4 = VdsatCV - Vds - DELTA_4; - T0 = sqrt(V4 * V4 + 4.0 * DELTA_4 * VdsatCV); - VdseffCV = VdsatCV - 0.5 * (V4 + T0); - T1 = 0.5 * (1.0 + V4 / T0); - T2 = DELTA_4 / T0; - T3 = (1.0 - T1 - T2) / AbulkCV; - T4 = T3 * ( 1.0 - dDeltaPhi_dVg); - dVdseffCV_dVg = T4; - dVdseffCV_dVd = T1; - dVdseffCV_dVb = -T3 * VdsatCV * dAbulkCV_dVb; - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ - if (Vds == 0.0) - { - VdseffCV = 0.0; - dVdseffCV_dVg = 0.0; - dVdseffCV_dVb = 0.0; - } - break; - case BSIM3V32: - default: - /* Do nothing */ - break; - } + VdsatCV = VgDP / AbulkCV; + T0 = VdsatCV - Vds - DELTA_4; + dT0_dVg = dVgDP_dVg / AbulkCV; + dT0_dVb = -VdsatCV * dAbulkCV_dVb / AbulkCV; + T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * VdsatCV); + dT1_dVg = (T0 + DELTA_4 + DELTA_4) / T1; + dT1_dVd = -T0 / T1; + dT1_dVb = dT1_dVg * dT0_dVb; + dT1_dVg *= dT0_dVg; + if (T0 >= 0.0) + { VdseffCV = VdsatCV - 0.5 * (T0 + T1); + dVdseffCV_dVg = 0.5 * (dT0_dVg - dT1_dVg); + dVdseffCV_dVd = 0.5 * (1.0 - dT1_dVd); + dVdseffCV_dVb = 0.5 * (dT0_dVb - dT1_dVb); + } + else + { T3 = (DELTA_4 + DELTA_4) / (T1 - T0); + T4 = 1.0 - T3; + T5 = VdsatCV * T3 / (T1 - T0); + VdseffCV = VdsatCV * T4; + dVdseffCV_dVg = dT0_dVg * T4 + T5 * (dT1_dVg - dT0_dVg); + dVdseffCV_dVd = T5 * (dT1_dVd + 1.0); + dVdseffCV_dVb = dT0_dVb * (1.0 - T5) + T5 * dT1_dVb; + } + + /* Added to eliminate non-zero VdseffCV at Vds=0.0 */ + if (Vds == 0.0) + { VdseffCV = 0.0; + dVdseffCV_dVg = 0.0; + dVdseffCV_dVb = 0.0; + } T0 = AbulkCV * VdseffCV; - T1 = Vgsteff - DeltaPhi; + T1 = VgDP; T2 = 12.0 * (T1 - 0.5 * T0 + 1.0e-20); T3 = T0 / T2; T4 = 1.0 - 12.0 * T3 * T3; @@ -2324,7 +2066,7 @@ for (; model != NULL; model = model->BSIM3nextModel) qgate = qinoi = CoxWLcen * (T1 - T0 * (0.5 - T3)); QovCox = qgate / Coxeff; - Cgg1 = CoxWLcen * (T4 * (1.0 - dDeltaPhi_dVg) + Cgg1 = CoxWLcen * (T4 * dVgDP_dVg + T5 * dVdseffCV_dVg); Cgd1 = CoxWLcen * T5 * dVdseffCV_dVd + Cgg1 * dVgsteff_dVd + QovCox * dCoxeff_dVd; @@ -2336,7 +2078,7 @@ for (; model != NULL; model = model->BSIM3nextModel) T7 = 1.0 - AbulkCV; T8 = T2 * T2; T9 = 12.0 * T7 * T0 * T0 / (T8 * AbulkCV); - T10 = T9 * (1.0 - dDeltaPhi_dVg); + T10 = T9 * dVgDP_dVg; T11 = -T7 * T5 / AbulkCV; T12 = -(T9 * T1 / AbulkCV + VdseffCV * (0.5 - T0 / T2)); @@ -2357,7 +2099,7 @@ for (; model != NULL; model = model->BSIM3nextModel) T2 += T2; T3 = T2 * T2; T7 = -(0.25 - 12.0 * T0 * (4.0 * T1 - T0) / T3); - T4 = -(0.5 + 24.0 * T0 * T0 / T3) * (1.0 - dDeltaPhi_dVg); + T4 = -(0.5 + 24.0 * T0 * T0 / T3) * dVgDP_dVg; T5 = T7 * AbulkCV; T6 = T7 * VdseffCV; @@ -2382,7 +2124,7 @@ for (; model != NULL; model = model->BSIM3nextModel) T6 = AbulkCV * (qsrc / T2 + T3 * T8); T7 = T6 * VdseffCV / AbulkCV; - Csg = T5 * (1.0 - dDeltaPhi_dVg) + T6 * dVdseffCV_dVg; + Csg = T5 * dVgDP_dVg + T6 * dVdseffCV_dVg; Csd = Csg * dVgsteff_dVd + T6 * dVdseffCV_dVd + QovCox * dCoxeff_dVd; Csb = Csg * dVgsteff_dVb + T6 * dVdseffCV_dVb @@ -2453,35 +2195,12 @@ finished: along gate side */ - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - czbd = model->BSIM3unitAreaTempJctCap * here->BSIM3drainArea; /*bug fix */ - czbs = model->BSIM3unitAreaTempJctCap * here->BSIM3sourceArea; - break; - case BSIM3V322: - case BSIM3V32: - default: - czbd = model->BSIM3unitAreaJctCap * here->BSIM3drainArea; - czbs = model->BSIM3unitAreaJctCap * here->BSIM3sourceArea; - } - + czbd = model->BSIM3unitAreaTempJctCap * here->BSIM3drainArea; /*bug fix */ + czbs = model->BSIM3unitAreaTempJctCap * here->BSIM3sourceArea; if (here->BSIM3drainPerimeter < pParam->BSIM3weff) { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap - * here->BSIM3drainPerimeter; - break; - case BSIM3V322: - case BSIM3V32: - default: - czbdswg = model->BSIM3unitLengthGateSidewallJctCap - * here->BSIM3drainPerimeter; - } + czbdswg = model->BSIM3unitLengthGateSidewallTempJctCap + * here->BSIM3drainPerimeter; czbdsw = 0.0; } else @@ -2494,39 +2213,15 @@ finished: if (here->BSIM3sourcePerimeter < pParam->BSIM3weff) { czbssw = 0.0; - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap - * here->BSIM3sourcePerimeter; - break; - case BSIM3V322: - case BSIM3V32: - default: - czbsswg = model->BSIM3unitLengthGateSidewallJctCap - * here->BSIM3sourcePerimeter; - } + czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap + * here->BSIM3sourcePerimeter; } else { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - czbssw = model->BSIM3unitLengthSidewallTempJctCap - * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); - czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap - * pParam->BSIM3weff; - break; - case BSIM3V322: - case BSIM3V32: - default: - czbssw = model->BSIM3unitLengthSidewallJctCap - * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); - czbsswg = model->BSIM3unitLengthGateSidewallJctCap - * pParam->BSIM3weff; - } + czbssw = model->BSIM3unitLengthSidewallTempJctCap + * (here->BSIM3sourcePerimeter - pParam->BSIM3weff); + czbsswg = model->BSIM3unitLengthGateSidewallTempJctCap + * pParam->BSIM3weff; } MJ = model->BSIM3bulkJctBotGradingCoeff; @@ -2639,29 +2334,29 @@ finished: if ((here->BSIM3off == 0) || (!(ckt->CKTmode & MODEINITFIX))) { if (Check == 1) { ckt->CKTnoncon++; -//#ifndef NEWCONV -// } -// else -// { if (here->BSIM3mode >= 0) -// { Idtot = here->BSIM3cd + here->BSIM3csub - here->BSIM3cbd; -// } -// else -// { Idtot = here->BSIM3cd - here->BSIM3cbd; -// } -// tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) -// + ckt->CKTabstol; -// if (fabs(cdhat - Idtot) >= tol) -// { ckt->CKTnoncon++; -// } -// else -// { Ibtot = here->BSIM3cbs + here->BSIM3cbd - here->BSIM3csub; -// tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) -// + ckt->CKTabstol; -// if (fabs(cbhat - Ibtot) > tol) -// { ckt->CKTnoncon++; -// } -// } -//#endif /* NEWCONV */ +#ifndef NEWCONV + } + else + { if (here->BSIM3mode >= 0) + { Idtot = here->BSIM3cd + here->BSIM3csub - here->BSIM3cbd; + } + else + { Idtot = here->BSIM3cd - here->BSIM3cbd; + } + tol = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot)) + + ckt->CKTabstol; + if (fabs(cdhat - Idtot) >= tol) + { ckt->CKTnoncon++; + } + else + { Ibtot = here->BSIM3cbs + here->BSIM3cbd - here->BSIM3csub; + tol = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot)) + + ckt->CKTabstol; + if (fabs(cbhat - Ibtot) > tol) + { ckt->CKTnoncon++; + } + } +#endif /* NEWCONV */ } } *(ckt->CKTstate0 + here->BSIM3vbs) = vbs; @@ -2677,7 +2372,7 @@ finished: line755: /* NQS begins */ - if (here->BSIM3nqsMod) + if ((here->BSIM3nqsMod) || (here->BSIM3acnqsMod)) { qcheq = -(qbulk + qgate); here->BSIM3cqgb = -(here->BSIM3cggb + here->BSIM3cbgb); @@ -2691,45 +2386,17 @@ line755: gtau_diff = 16.0 * pParam->BSIM3u0temp * model->BSIM3vtm / T0 * ScalingFactor; here->BSIM3gtau = gtau_drift + gtau_diff; + if (here->BSIM3acnqsMod) + here->BSIM3taunet = ScalingFactor / here->BSIM3gtau; + } - if (model->BSIM3capMod == 0) + if (model->BSIM3capMod == 0) /* code merge -JX */ { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - /* code merge -JX */ - cgdo = pParam->BSIM3cgdo; - qgdo = pParam->BSIM3cgdo * vgd; - cgso = pParam->BSIM3cgso; - qgso = pParam->BSIM3cgso * vgs; - break; - case BSIM3V322: - case BSIM3V32: - default: - if (vgd < 0.0) - { - cgdo = pParam->BSIM3cgdo; - qgdo = pParam->BSIM3cgdo * vgd; - } - else - { - cgdo = pParam->BSIM3cgdo; - qgdo = pParam->BSIM3cgdo * vgd; - } - - if (vgs < 0.0) - { - cgso = pParam->BSIM3cgso; - qgso = pParam->BSIM3cgso * vgs; - } - else - { - cgso = pParam->BSIM3cgso; - qgso = pParam->BSIM3cgso * vgs; - } - } + cgdo = pParam->BSIM3cgdo; + qgdo = pParam->BSIM3cgdo * vgd; + cgso = pParam->BSIM3cgso; + qgso = pParam->BSIM3cgso * vgs; } else if (model->BSIM3capMod == 1) { if (vgd < 0.0) @@ -3219,72 +2886,71 @@ line900: cqcheq = -cqcheq; } - m = here->BSIM3m; - - (*(ckt->CKTrhs + here->BSIM3gNode) -= m * ceqqg); - (*(ckt->CKTrhs + here->BSIM3bNode) -= m * (ceqbs + ceqbd + ceqqb)); - (*(ckt->CKTrhs + here->BSIM3dNodePrime) += m * (ceqbd - cdreq - ceqqd)); - (*(ckt->CKTrhs + here->BSIM3sNodePrime) += m * (cdreq + ceqbs + ceqqg - + ceqqb + ceqqd)); - if (here->BSIM3nqsMod) - *(ckt->CKTrhs + here->BSIM3qNode) += m * (cqcheq - cqdef); - - /* - * load y matrix - */ - - T1 = qdef * here->BSIM3gtau; - (*(here->BSIM3DdPtr) += m * here->BSIM3drainConductance); - (*(here->BSIM3GgPtr) += m * (gcggb - ggtg)); - (*(here->BSIM3SsPtr) += m * here->BSIM3sourceConductance); - (*(here->BSIM3BbPtr) += m * (here->BSIM3gbd + here->BSIM3gbs - - gcbgb - gcbdb - gcbsb - here->BSIM3gbbs)); - (*(here->BSIM3DPdpPtr) += m * (here->BSIM3drainConductance - + here->BSIM3gds + here->BSIM3gbd - + RevSum + gcddb + dxpart * ggtd - + T1 * ddxpart_dVd + gbdpdp)); - (*(here->BSIM3SPspPtr) += m * (here->BSIM3sourceConductance - + here->BSIM3gds + here->BSIM3gbs - + FwdSum + gcssb + sxpart * ggts - + T1 * dsxpart_dVs + gbspsp)); - (*(here->BSIM3DdpPtr) -= m * here->BSIM3drainConductance); - (*(here->BSIM3GbPtr) -= m * (gcggb + gcgdb + gcgsb + ggtb)); - (*(here->BSIM3GdpPtr) += m * (gcgdb - ggtd)); - (*(here->BSIM3GspPtr) += m * (gcgsb - ggts)); - (*(here->BSIM3SspPtr) -= m * here->BSIM3sourceConductance); - (*(here->BSIM3BgPtr) += m * (gcbgb - here->BSIM3gbgs)); - (*(here->BSIM3BdpPtr) += m * (gcbdb - here->BSIM3gbd + gbbdp)); - (*(here->BSIM3BspPtr) += m * (gcbsb - here->BSIM3gbs + gbbsp)); - (*(here->BSIM3DPdPtr) -= m * here->BSIM3drainConductance); - (*(here->BSIM3DPgPtr) += m * (Gm + gcdgb + dxpart * ggtg - + T1 * ddxpart_dVg + gbdpg)); - (*(here->BSIM3DPbPtr) -= m * (here->BSIM3gbd - Gmbs + gcdgb + gcddb - + gcdsb - dxpart * ggtb - - T1 * ddxpart_dVb - gbdpb)); - (*(here->BSIM3DPspPtr) -= m * (here->BSIM3gds + FwdSum - gcdsb - - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp)); - (*(here->BSIM3SPgPtr) += m * (gcsgb - Gm + sxpart * ggtg - + T1 * dsxpart_dVg + gbspg)); - (*(here->BSIM3SPsPtr) -= m * here->BSIM3sourceConductance); - (*(here->BSIM3SPbPtr) -= m * (here->BSIM3gbs + Gmbs + gcsgb + gcsdb - + gcssb - sxpart * ggtb - - T1 * dsxpart_dVb - gbspb)); - (*(here->BSIM3SPdpPtr) -= m * (here->BSIM3gds + RevSum - gcsdb - - sxpart * ggtd - T1 * dsxpart_dVd - gbspdp)); - - if (here->BSIM3nqsMod) - { - *(here->BSIM3QqPtr) += m * (gqdef + here->BSIM3gtau); - - *(here->BSIM3DPqPtr) += m * (dxpart * here->BSIM3gtau); - *(here->BSIM3SPqPtr) += m * (sxpart * here->BSIM3gtau); - *(here->BSIM3GqPtr) -= m * here->BSIM3gtau; - - *(here->BSIM3QgPtr) += m * (ggtg - gcqgb); - *(here->BSIM3QdpPtr) += m * (ggtd - gcqdb); - *(here->BSIM3QspPtr) += m * (ggts - gcqsb); - *(here->BSIM3QbPtr) += m * (ggtb - gcqbb); - } + m = here->BSIM3m; + + (*(ckt->CKTrhs + here->BSIM3gNode) -= m * ceqqg); + (*(ckt->CKTrhs + here->BSIM3bNode) -= m * (ceqbs + ceqbd + ceqqb)); + (*(ckt->CKTrhs + here->BSIM3dNodePrime) += m * (ceqbd - cdreq - ceqqd)); + (*(ckt->CKTrhs + here->BSIM3sNodePrime) += m * (cdreq + ceqbs + ceqqg + + ceqqb + ceqqd)); + if (here->BSIM3nqsMod) + *(ckt->CKTrhs + here->BSIM3qNode) += m * (cqcheq - cqdef); + + /* + * load y matrix + */ + + T1 = qdef * here->BSIM3gtau; + (*(here->BSIM3DdPtr) += m * here->BSIM3drainConductance); + (*(here->BSIM3GgPtr) += m * (gcggb - ggtg)); + (*(here->BSIM3SsPtr) += m * here->BSIM3sourceConductance); + (*(here->BSIM3BbPtr) += m * (here->BSIM3gbd + here->BSIM3gbs + - gcbgb - gcbdb - gcbsb - here->BSIM3gbbs)); + (*(here->BSIM3DPdpPtr) += m * (here->BSIM3drainConductance + + here->BSIM3gds + here->BSIM3gbd + + RevSum + gcddb + dxpart * ggtd + + T1 * ddxpart_dVd + gbdpdp)); + (*(here->BSIM3SPspPtr) += m * (here->BSIM3sourceConductance + + here->BSIM3gds + here->BSIM3gbs + + FwdSum + gcssb + sxpart * ggts + + T1 * dsxpart_dVs + gbspsp)); + (*(here->BSIM3DdpPtr) -= m * here->BSIM3drainConductance); + (*(here->BSIM3GbPtr) -= m * (gcggb + gcgdb + gcgsb + ggtb)); + (*(here->BSIM3GdpPtr) += m * (gcgdb - ggtd)); + (*(here->BSIM3GspPtr) += m * (gcgsb - ggts)); + (*(here->BSIM3SspPtr) -= m * here->BSIM3sourceConductance); + (*(here->BSIM3BgPtr) += m * (gcbgb - here->BSIM3gbgs)); + (*(here->BSIM3BdpPtr) += m * (gcbdb - here->BSIM3gbd + gbbdp)); + (*(here->BSIM3BspPtr) += m * (gcbsb - here->BSIM3gbs + gbbsp)); + (*(here->BSIM3DPdPtr) -= m * here->BSIM3drainConductance); + (*(here->BSIM3DPgPtr) += m * (Gm + gcdgb + dxpart * ggtg + + T1 * ddxpart_dVg + gbdpg)); + (*(here->BSIM3DPbPtr) -= m * (here->BSIM3gbd - Gmbs + gcdgb + gcddb + + gcdsb - dxpart * ggtb + - T1 * ddxpart_dVb - gbdpb)); + (*(here->BSIM3DPspPtr) -= m * (here->BSIM3gds + FwdSum - gcdsb + - dxpart * ggts - T1 * ddxpart_dVs - gbdpsp)); + (*(here->BSIM3SPgPtr) += m * (gcsgb - Gm + sxpart * ggtg + + T1 * dsxpart_dVg + gbspg)); + (*(here->BSIM3SPsPtr) -= m * here->BSIM3sourceConductance); + (*(here->BSIM3SPbPtr) -= m * (here->BSIM3gbs + Gmbs + gcsgb + gcsdb + + gcssb - sxpart * ggtb + - T1 * dsxpart_dVb - gbspb)); + (*(here->BSIM3SPdpPtr) -= m * (here->BSIM3gds + RevSum - gcsdb + - sxpart * ggtd - T1 * dsxpart_dVd - gbspdp)); + + if (here->BSIM3nqsMod) + { *(here->BSIM3QqPtr) += m * (gqdef + here->BSIM3gtau); + + *(here->BSIM3DPqPtr) += m * (dxpart * here->BSIM3gtau); + *(here->BSIM3SPqPtr) += m * (sxpart * here->BSIM3gtau); + *(here->BSIM3GqPtr) -= m * here->BSIM3gtau; + + *(here->BSIM3QgPtr) += m * (ggtg - gcqgb); + *(here->BSIM3QdpPtr) += m * (ggtd - gcqdb); + *(here->BSIM3QspPtr) += m * (ggts - gcqsb); + *(here->BSIM3QbPtr) += m * (ggtb - gcqbb); + } line1000: ; diff --git a/src/spicelib/devices/bsim3/b3mask.c b/src/spicelib/devices/bsim3/b3mask.c index 1d0f0c23e..e8a96485c 100644 --- a/src/spicelib/devices/bsim3/b3mask.c +++ b/src/spicelib/devices/bsim3/b3mask.c @@ -1,12 +1,11 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3mask.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3mask.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ #include "ngspice.h" @@ -18,7 +17,11 @@ #include "suffix.h" int -BSIM3mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) +BSIM3mAsk(ckt,inst,which,value) +CKTcircuit *ckt; +GENmodel *inst; +int which; +IFvalue *value; { BSIM3model *model = (BSIM3model *)inst; switch(which) @@ -37,8 +40,8 @@ BSIM3mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case BSIM3_MOD_NOIMOD: value->iValue = model->BSIM3noiMod; return(OK); - case BSIM3_MOD_ACMMOD: - value->iValue = model->BSIM3acmMod; + case BSIM3_MOD_ACNQSMOD: + value->iValue = model->BSIM3acnqsMod; return(OK); case BSIM3_MOD_VERSION : value->sValue = model->BSIM3version; @@ -331,29 +334,6 @@ BSIM3mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) value->rValue = model->BSIM3tpbswg; return(OK); - /* acm model */ - case BSIM3_MOD_HDIF: - value->rValue = model->BSIM3hdif; - return(OK); - case BSIM3_MOD_LDIF: - value->rValue = model->BSIM3ldif; - return(OK); - case BSIM3_MOD_LD: - value->rValue = model->BSIM3ld; - return(OK); - case BSIM3_MOD_RD: - value->rValue = model->BSIM3rd; - return(OK); - case BSIM3_MOD_RS: - value->rValue = model->BSIM3rs; - return(OK); - case BSIM3_MOD_RDC: - value->rValue = model->BSIM3rdc; - return(OK); - case BSIM3_MOD_RSC: - value->rValue = model->BSIM3rsc; - return(OK); - /* Length dependence */ case BSIM3_MOD_LCDSC : value->rValue = model->BSIM3lcdsc; @@ -1167,6 +1147,9 @@ BSIM3mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case BSIM3_MOD_XTI: value->rValue = model->BSIM3jctTempExponent; return(OK); + case BSIM3_MOD_LINTNOI: + value->rValue = model->BSIM3lintnoi; + return(OK); case BSIM3_MOD_LINT: value->rValue = model->BSIM3Lint; return(OK); @@ -1233,14 +1216,6 @@ BSIM3mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) case BSIM3_MOD_WMAX: value->rValue = model->BSIM3Wmax; return(OK); - - case BSIM3_MOD_XL: - value->rValue = model->BSIM3xl; - return(OK); - case BSIM3_MOD_XW: - value->rValue = model->BSIM3xw; - return(OK); - case BSIM3_MOD_NOIA: value->rValue = model->BSIM3oxideTrapDensityA; return(OK); @@ -1267,3 +1242,6 @@ BSIM3mAsk (CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value) } /* NOTREACHED */ } + + + diff --git a/src/spicelib/devices/bsim3/b3mdel.c b/src/spicelib/devices/bsim3/b3mdel.c index 51dcd0229..0523f8a69 100644 --- a/src/spicelib/devices/bsim3/b3mdel.c +++ b/src/spicelib/devices/bsim3/b3mdel.c @@ -1,12 +1,11 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3mdel.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3mdel.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 **********/ #include "ngspice.h" @@ -15,7 +14,10 @@ #include "suffix.h" int -BSIM3mDelete (GENmodel **inModel, IFuid modname, GENmodel *kill) +BSIM3mDelete(inModel,modname,kill) +GENmodel **inModel; +IFuid modname; +GENmodel *kill; { BSIM3model **model = (BSIM3model**)inModel; BSIM3model *modfast = (BSIM3model*)kill; diff --git a/src/spicelib/devices/bsim3/b3mpar.c b/src/spicelib/devices/bsim3/b3mpar.c index 94ec9a2dd..8526317c0 100644 --- a/src/spicelib/devices/bsim3/b3mpar.c +++ b/src/spicelib/devices/bsim3/b3mpar.c @@ -1,12 +1,11 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3mpar.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3mpar.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ #include "ngspice.h" @@ -17,7 +16,10 @@ int -BSIM3mParam(int param, IFvalue *value, GENmodel *inMod) +BSIM3mParam(param,value,inMod) +int param; +IFvalue *value; +GENmodel *inMod; { BSIM3model *mod = (BSIM3model*)inMod; switch(param) @@ -37,15 +39,15 @@ BSIM3mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3capMod = value->iValue; mod->BSIM3capModGiven = TRUE; break; - case BSIM3_MOD_ACMMOD: - mod->BSIM3acmMod = value->iValue; - mod->BSIM3acmModGiven = TRUE; - break; case BSIM3_MOD_NOIMOD : mod->BSIM3noiMod = value->iValue; mod->BSIM3noiModGiven = TRUE; break; - case BSIM3_MOD_VERSION : + case BSIM3_MOD_ACNQSMOD : + mod->BSIM3acnqsMod = value->iValue; + mod->BSIM3acnqsModGiven = TRUE; + break; + case BSIM3_MOD_VERSION : mod->BSIM3version = value->sValue; mod->BSIM3versionGiven = TRUE; break; @@ -436,36 +438,6 @@ BSIM3mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3tpbswgGiven = TRUE; break; - /* acm model */ - case BSIM3_MOD_HDIF: - mod->BSIM3hdif = value->rValue; - mod->BSIM3hdifGiven = TRUE; - break; - case BSIM3_MOD_LDIF: - mod->BSIM3ldif = value->rValue; - mod->BSIM3ldifGiven = TRUE; - break; - case BSIM3_MOD_LD: - mod->BSIM3ld = value->rValue; - mod->BSIM3ldGiven = TRUE; - break; - case BSIM3_MOD_RD: - mod->BSIM3rd = value->rValue; - mod->BSIM3rdGiven = TRUE; - break; - case BSIM3_MOD_RS: - mod->BSIM3rs = value->rValue; - mod->BSIM3rsGiven = TRUE; - break; - case BSIM3_MOD_RDC: - mod->BSIM3rdc = value->rValue; - mod->BSIM3rdcGiven = TRUE; - break; - case BSIM3_MOD_RSC: - mod->BSIM3rsc = value->rValue; - mod->BSIM3rscGiven = TRUE; - break; - /* Length dependence */ case BSIM3_MOD_LCDSC : mod->BSIM3lcdsc = value->rValue; @@ -1496,7 +1468,7 @@ BSIM3mParam(int param, IFvalue *value, GENmodel *inMod) break; case BSIM3_MOD_TNOM : - mod->BSIM3tnom = value->rValue + CONSTCtoK; + mod->BSIM3tnom = value->rValue; mod->BSIM3tnomGiven = TRUE; break; case BSIM3_MOD_CGSO : @@ -1571,6 +1543,10 @@ BSIM3mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3jctTempExponent = value->rValue; mod->BSIM3jctTempExponentGiven = TRUE; break; + case BSIM3_MOD_LINTNOI: + mod->BSIM3lintnoi = value->rValue; + mod->BSIM3lintnoiGiven = TRUE; + break; case BSIM3_MOD_LINT : mod->BSIM3Lint = value->rValue; mod->BSIM3LintGiven = TRUE; @@ -1660,15 +1636,6 @@ BSIM3mParam(int param, IFvalue *value, GENmodel *inMod) mod->BSIM3WmaxGiven = TRUE; break; - case BSIM3_MOD_XL: - mod->BSIM3xl = value->rValue; - mod->BSIM3xlGiven = TRUE; - break; - case BSIM3_MOD_XW: - mod->BSIM3xw = value->rValue; - mod->BSIM3xwGiven = TRUE; - break; - case BSIM3_MOD_NOIA : mod->BSIM3oxideTrapDensityA = value->rValue; mod->BSIM3oxideTrapDensityAGiven = TRUE; diff --git a/src/spicelib/devices/bsim3/b3noi.c b/src/spicelib/devices/bsim3/b3noi.c index 12e3afc6a..b39c602b9 100644 --- a/src/spicelib/devices/bsim3/b3noi.c +++ b/src/spicelib/devices/bsim3/b3noi.c @@ -1,13 +1,12 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3noi.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3noi.c of BSIM3v3.3.0 * Author: 1995 Gary W. Ng and Min-Chie Jeng. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Xuemei Xi, 10/05, 12/21, 2001. - * Modified bt Paolo Nenzi 2002 and Dietmar Warning 2003 + * Modified by Xuemei Xi, 10/05/2001. **********/ #include "ngspice.h" @@ -42,48 +41,47 @@ If model->BSIM3noiMod = 4, Channel thermal noise = BSIM3 model Flicker noise = SPICE2 model + If model->BSIM3noiMod = 5, + Channel thermal noise = SPICE2 model with linear/sat fix + Flicker noise = SPICE2 model + If model->BSIM3noiMod = 6, + Channel thermal noise = SPICE2 model with linear/sat fix + Flicker noise = BSIM3 model */ extern void NevalSrc(); extern double Nintegrate(); -/* - * The StrongInversionNoiseEval function has been modified in - * the release 3.2.4 of BSIM3 model. To accomodate both the old - * and the new code, I have renamed according to the following: - * - * - * BSIM3v3.2.4 -> StrongInversionNoiseEvalNew - * Previous -> StrongInversionNoiseEvalOld - * - * 2002 Paolo Nenzi - */ - /* * JX: 1/f noise model is smoothed out 12/18/01. */ + double -StrongInversionNoiseEvalNew(double Vds, BSIM3model *model, - BSIM3instance *here, double freq, double temp) +StrongInversionNoiseEval(Vds, model, here, freq, temp) +double Vds, freq, temp; +BSIM3model *model; +BSIM3instance *here; { struct bsim3SizeDependParam *pParam; -double cd, esat, DelClm, EffFreq, N0, Nl; -double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; +double cd, esat, DelClm, EffFreq, N0, Nl, Vgst, Leff, Leffsq; +double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi; pParam = here->pParam; cd = fabs(here->BSIM3cd); + Leff = pParam->BSIM3leff - 2.0 * model->BSIM3lintnoi; + Leffsq = Leff * Leff; esat = 2.0 * pParam->BSIM3vsattemp / here->BSIM3ueff; if(model->BSIM3em<=0.0) DelClm = 0.0; else { T0 = ((((Vds - here->BSIM3Vdseff) / pParam->BSIM3litl) + model->BSIM3em) / esat); DelClm = pParam->BSIM3litl * log (MAX(T0, N_MINLOG)); + if (DelClm < 0.0) DelClm = 0.0; /* bugfix */ } EffFreq = pow(freq, model->BSIM3ef); T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->BSIM3ueff; - T2 = 1.0e8 * EffFreq * here->BSIM3Abulk * model->BSIM3cox - * pParam->BSIM3leff * pParam->BSIM3leff; + T2 = 1.0e8 * EffFreq * here->BSIM3Abulk * model->BSIM3cox * Leffsq; N0 = model->BSIM3cox * here->BSIM3Vgsteff / CHARGE; Nl = model->BSIM3cox * here->BSIM3Vgsteff * (1.0 - here->BSIM3AbovVgst2Vtm * here->BSIM3Vdseff) / CHARGE; @@ -94,8 +92,7 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; T5 = model->BSIM3oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); T6 = 8.62e-5 * temp * cd * cd; - T7 = 1.0e8 * EffFreq * pParam->BSIM3leff - * pParam->BSIM3leff * pParam->BSIM3weff; + T7 = 1.0e8 * EffFreq * Leffsq * pParam->BSIM3weff; T8 = model->BSIM3oxideTrapDensityA + model->BSIM3oxideTrapDensityB * Nl + model->BSIM3oxideTrapDensityC * Nl * Nl; T9 = (Nl + 2.0e14) * (Nl + 2.0e14); @@ -104,81 +101,13 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; return Ssi; } -/* - * The code for releases: BSIM3V32, BSIM3V322, BSIM3V323 - * follows - */ - -double -StrongInversionNoiseEvalOld(double vgs, double vds, BSIM3model *model, - BSIM3instance *here, double freq, double temp) -{ - struct bsim3SizeDependParam *pParam; - double cd, esat, DelClm, EffFreq, N0, Nl, Vgst; - double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; - - pParam = here->pParam; - cd = fabs (here->BSIM3cd); - /* Added revision dependent code */ - if (model->BSIM3intVersion < BSIM3V323) - { - if (vds > here->BSIM3vdsat) - { - esat = 2.0 * pParam->BSIM3vsattemp / here->BSIM3ueff; - T0 = ((((vds - here->BSIM3vdsat) / pParam->BSIM3litl) + - model->BSIM3em) / esat); - DelClm = pParam->BSIM3litl * log (MAX (T0, N_MINLOG)); - } - else - DelClm = 0.0; - } - else - { - if (model->BSIM3em <= 0.0) /* flicker noise modified -JX */ - DelClm = 0.0; - else if (vds > here->BSIM3vdsat) - { - esat = 2.0 * pParam->BSIM3vsattemp / here->BSIM3ueff; - T0 = ((((vds - here->BSIM3vdsat) / pParam->BSIM3litl) + - model->BSIM3em) / esat); - DelClm = pParam->BSIM3litl * log (MAX (T0, N_MINLOG)); - } - else - DelClm = 0.0; - } - EffFreq = pow (freq, model->BSIM3ef); - T1 = CHARGE * CHARGE * 8.62e-5 * cd * temp * here->BSIM3ueff; - T2 = 1.0e8 * EffFreq * model->BSIM3cox - * pParam->BSIM3leff * pParam->BSIM3leff; - Vgst = vgs - here->BSIM3von; - N0 = model->BSIM3cox * Vgst / CHARGE; - if (N0 < 0.0) - N0 = 0.0; - Nl = model->BSIM3cox * (Vgst - MIN (vds, here->BSIM3vdsat)) / CHARGE; - if (Nl < 0.0) - Nl = 0.0; - - T3 = model->BSIM3oxideTrapDensityA - * log (MAX (((N0 + 2.0e14) / (Nl + 2.0e14)), N_MINLOG)); - T4 = model->BSIM3oxideTrapDensityB * (N0 - Nl); - T5 = model->BSIM3oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); - - T6 = 8.62e-5 * temp * cd * cd; - T7 = 1.0e8 * EffFreq * pParam->BSIM3leff - * pParam->BSIM3leff * pParam->BSIM3weff; - T8 = model->BSIM3oxideTrapDensityA + model->BSIM3oxideTrapDensityB * Nl - + model->BSIM3oxideTrapDensityC * Nl * Nl; - T9 = (Nl + 2.0e14) * (Nl + 2.0e14); - - Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; - return Ssi; -} - - - int -BSIM3noise (int mode, int operation, GENmodel *inModel, CKTcircuit *ckt, - Ndata *data, double *OnDens) +BSIM3noise (mode, operation, inModel, ckt, data, OnDens) +int mode, operation; +GENmodel *inModel; +CKTcircuit *ckt; +Ndata *data; +double *OnDens; { BSIM3model *model = (BSIM3model *)inModel; BSIM3instance *here; @@ -190,8 +119,9 @@ double noizDens[BSIM3NSRCS]; double lnNdens[BSIM3NSRCS]; double vgs, vds, Slimit; -double T1, T10, T11; -double Ssi, Swi; +double N0, Nl; +double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13; +double n, ExpArg, Ssi, Swi; double m; @@ -291,40 +221,39 @@ int i; switch( model->BSIM3noiMod ) { case 1: case 3: - NevalSrc(&noizDens[BSIM3IDNOIZ], - &lnNdens[BSIM3IDNOIZ], ckt, - THERMNOISE, here->BSIM3dNodePrime, - here->BSIM3sNodePrime, - (2.0 / 3.0 * fabs(here->BSIM3gm - + here->BSIM3gds - + here->BSIM3gmbs)) * m); + NevalSrc(&noizDens[BSIM3IDNOIZ], + &lnNdens[BSIM3IDNOIZ], ckt, + THERMNOISE, here->BSIM3dNodePrime, + here->BSIM3sNodePrime, + 2.0 * fabs(here->BSIM3gm + + here->BSIM3gds + + here->BSIM3gmbs) / 3.0 * m); + + break; + case 5: + case 6: + vds = MIN(*(ckt->CKTstates[0] + here->BSIM3vds), here->BSIM3vdsat); + NevalSrc(&noizDens[BSIM3IDNOIZ], + &lnNdens[BSIM3IDNOIZ], ckt, + THERMNOISE, here->BSIM3dNodePrime, + here->BSIM3sNodePrime, + (3.0 - vds / here->BSIM3vdsat) + * fabs(here->BSIM3gm + + here->BSIM3gds + + here->BSIM3gmbs) / 3.0 * m); + break; case 2: case 4: - /* Added revision dependent code */ - if (model->BSIM3intVersion == BSIM3V324) - { - NevalSrc(&noizDens[BSIM3IDNOIZ], + NevalSrc(&noizDens[BSIM3IDNOIZ], &lnNdens[BSIM3IDNOIZ], ckt, THERMNOISE, here->BSIM3dNodePrime, here->BSIM3sNodePrime, (m * here->BSIM3ueff * fabs(here->BSIM3qinv) - / (pParam->BSIM3leff * pParam->BSIM3leff - + here->BSIM3ueff * fabs(here->BSIM3qinv) + / (pParam->BSIM3leff * pParam->BSIM3leff + + here->BSIM3ueff *fabs(here->BSIM3qinv) * here->BSIM3rds))); /* bugfix */ - } - else - { /* for all versions lower then 3.2.4 */ - NevalSrc(&noizDens[BSIM3IDNOIZ], - &lnNdens[BSIM3IDNOIZ], ckt, - THERMNOISE, here->BSIM3dNodePrime, - here->BSIM3sNodePrime, - (m * here->BSIM3ueff - * fabs(here->BSIM3qinv - / (pParam->BSIM3leff - * pParam->BSIM3leff)))); - } break; } NevalSrc(&noizDens[BSIM3FLNOIZ], (double*) NULL, @@ -334,6 +263,7 @@ int i; switch( model->BSIM3noiMod ) { case 1: case 4: + case 5: noizDens[BSIM3FLNOIZ] *= m * model->BSIM3kf * exp(model->BSIM3af * log(MAX(fabs(here->BSIM3cd), @@ -345,66 +275,32 @@ int i; break; case 2: case 3: - vgs = *(ckt->CKTstates[0] + here->BSIM3vgs); - vds = *(ckt->CKTstates[0] + here->BSIM3vds); + case 6: + vds = *(ckt->CKTstates[0] + here->BSIM3vds); if (vds < 0.0) { vds = -vds; - vgs = vgs + vds; } - /* Added revision dependent code */ - if (model->BSIM3intVersion == BSIM3V324) - { - Ssi = StrongInversionNoiseEvalNew(vds, model, + Ssi = StrongInversionNoiseEval(vds, model, here, data->freq, ckt->CKTtemp); - T10 = model->BSIM3oxideTrapDensityA - * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->BSIM3weff - * pParam->BSIM3leff - * pow(data->freq, model->BSIM3ef) - * 4.0e36; - Swi = T10 / T11 * here->BSIM3cd - * here->BSIM3cd; - T1 = Swi + Ssi; - if (T1 > 0.0) - noizDens[BSIM3FLNOIZ] *= m * (Ssi * Swi) / T1; - else - noizDens[BSIM3FLNOIZ] *= 0.0; - } - else - { /* for all versions lower then 3.2.4 */ - if (vgs >= here->BSIM3von + 0.1) - { - Ssi = StrongInversionNoiseEvalOld(vgs, vds, model, - here, data->freq, ckt->CKTtemp); - noizDens[BSIM3FLNOIZ] *= m * Ssi; - } - else - { - pParam = here->pParam; - T10 = model->BSIM3oxideTrapDensityA - * 8.62e-5 * ckt->CKTtemp; - T11 = pParam->BSIM3weff - * pParam-> BSIM3leff - * pow (data->freq, model->BSIM3ef) - * 4.0e36; - Swi = T10 / T11 * here->BSIM3cd * here->BSIM3cd; - - Slimit = StrongInversionNoiseEvalOld( - here->BSIM3von + 0.1, vds, model, - here, data->freq, ckt->CKTtemp); - T1 = Swi + Slimit; - if (T1 > 0.0) - noizDens[BSIM3FLNOIZ] *= m * (Slimit * Swi) / T1; - else - noizDens[BSIM3FLNOIZ] *= 0.0; - } - } - break; - } - + T10 = model->BSIM3oxideTrapDensityA + * 8.62e-5 * ckt->CKTtemp; + T11 = pParam->BSIM3weff + * pParam->BSIM3leff + * pow(data->freq, model->BSIM3ef) + * 4.0e36; + Swi = T10 / T11 * here->BSIM3cd + * here->BSIM3cd; + T1 = Swi + Ssi; + if (T1 > 0.0) + noizDens[BSIM3FLNOIZ] *= m * (Ssi * Swi) / T1; + else + noizDens[BSIM3FLNOIZ] *= 0.0; + break; + } + lnNdens[BSIM3FLNOIZ] = - log(MAX(noizDens[BSIM3FLNOIZ], N_MINLOG)); - + log(MAX(noizDens[BSIM3FLNOIZ], N_MINLOG)); + noizDens[BSIM3TOTNOIZ] = noizDens[BSIM3RDNOIZ] + noizDens[BSIM3RSNOIZ] + noizDens[BSIM3IDNOIZ] diff --git a/src/spicelib/devices/bsim3/b3par.c b/src/spicelib/devices/bsim3/b3par.c index fd6edcb7d..edfbf53a6 100644 --- a/src/spicelib/devices/bsim3/b3par.c +++ b/src/spicelib/devices/bsim3/b3par.c @@ -1,12 +1,11 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3par.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3par.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ #include "ngspice.h" @@ -17,7 +16,11 @@ #include "fteext.h" int -BSIM3param (int param, IFvalue *value, GENinstance *inst, IFvalue *select) +BSIM3param(param,value,inst,select) +int param; +IFvalue *value; +GENinstance *inst; +IFvalue *select; { double scale; @@ -80,6 +83,10 @@ BSIM3param (int param, IFvalue *value, GENinstance *inst, IFvalue *select) here->BSIM3nqsMod = value->iValue; here->BSIM3nqsModGiven = TRUE; break; + case BSIM3_ACNQSMOD: + here->BSIM3acnqsMod = value->iValue; + here->BSIM3acnqsModGiven = TRUE; + break; case BSIM3_IC: switch(value->v.numValue){ case 3: diff --git a/src/spicelib/devices/bsim3/b3pzld.c b/src/spicelib/devices/bsim3/b3pzld.c index 5a4e169a2..63d3fb22e 100644 --- a/src/spicelib/devices/bsim3/b3pzld.c +++ b/src/spicelib/devices/bsim3/b3pzld.c @@ -1,12 +1,11 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3pzld.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3pzld.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 **********/ #include "ngspice.h" @@ -17,7 +16,10 @@ #include "suffix.h" int -BSIM3pzLoad (GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s) +BSIM3pzLoad(inModel,ckt,s) +GENmodel *inModel; +CKTcircuit *ckt; +SPcomplex *s; { BSIM3model *model = (BSIM3model*)inModel; BSIM3instance *here; @@ -26,13 +28,12 @@ double xcdgb, xcddb, xcdsb, xcdbb, xcsgb, xcsdb, xcssb, xcsbb; double gdpr, gspr, gds, gbd, gbs, capbd, capbs, FwdSum, RevSum, Gm, Gmbs; double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb; double GSoverlapCap, GDoverlapCap, GBoverlapCap; -double dxpart, sxpart, xgtg, xgtd, xgts, xgtb; -double xcqgb = 0.0, xcqdb = 0.0, xcqsb = 0.0, xcqbb = 0.0; +double dxpart, sxpart, xgtg, xgtd, xgts, xgtb, xcqgb, xcqdb, xcqsb, xcqbb; double gbspsp, gbbdp, gbbsp, gbspg, gbspb; double gbspdp, gbdpdp, gbdpg, gbdpb, gbdpsp; double ddxpart_dVd, ddxpart_dVg, ddxpart_dVb, ddxpart_dVs; double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs; -double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Csg, Csd, Css; +double T1, CoxWL, qcheq, Cdg, Cdd, Cds, Cdb, Csg, Csd, Css, Csb; double ScalingFactor = 1.0e-9; double m; @@ -61,7 +62,7 @@ double m; gbspb = 0.0; gbspsp = 0.0; - if (here->BSIM3nqsMod == 0) + if (here->BSIM3nqsMod == 0 && here->BSIM3acnqsMod == 0) { cggb = here->BSIM3cggb; cgsb = here->BSIM3cgsb; cgdb = here->BSIM3cgdb; @@ -158,7 +159,7 @@ double m; gbspb = here->BSIM3gbbs; gbspdp = -(gbspg + gbspsp + gbspb); - if (here->BSIM3nqsMod == 0) + if (here->BSIM3nqsMod == 0 && here->BSIM3acnqsMod == 0) { cggb = here->BSIM3cggb; cgsb = here->BSIM3cgdb; cgdb = here->BSIM3cgsb; @@ -320,30 +321,30 @@ double m; *(here->BSIM3BdpPtr) -= m * (gbd - gbbdp); *(here->BSIM3BspPtr) -= m * (gbs - gbbsp); - *(here->BSIM3DPgPtr) += Gm + dxpart * xgtg - + T1 * ddxpart_dVg + gbdpg; - *(here->BSIM3DPdpPtr) += gdpr + gds + gbd + RevSum - + dxpart * xgtd + T1 * ddxpart_dVd + gbdpdp; - *(here->BSIM3DPspPtr) -= gds + FwdSum - dxpart * xgts - - T1 * ddxpart_dVs - gbdpsp; - *(here->BSIM3DPbPtr) -= gbd - Gmbs - dxpart * xgtb - - T1 * ddxpart_dVb - gbdpb; - - *(here->BSIM3SPgPtr) -= Gm - sxpart * xgtg - - T1 * dsxpart_dVg - gbspg; - *(here->BSIM3SPspPtr) += gspr + gds + gbs + FwdSum - + sxpart * xgts + T1 * dsxpart_dVs + gbspsp; - *(here->BSIM3SPbPtr) -= gbs + Gmbs - sxpart * xgtb - - T1 * dsxpart_dVb - gbspb; - *(here->BSIM3SPdpPtr) -= gds + RevSum - sxpart * xgtd - - T1 * dsxpart_dVd - gbspdp; - - *(here->BSIM3GgPtr) -= xgtg; - *(here->BSIM3GbPtr) -= xgtb; - *(here->BSIM3GdpPtr) -= xgtd; - *(here->BSIM3GspPtr) -= xgts; - - if (here->BSIM3nqsMod) + *(here->BSIM3DPgPtr) += m * (Gm + dxpart * xgtg + + T1 * ddxpart_dVg + gbdpg); + *(here->BSIM3DPdpPtr) += m * (gdpr + gds + gbd + RevSum + + dxpart * xgtd + T1 * ddxpart_dVd + gbdpdp); + *(here->BSIM3DPspPtr) -= m * (gds + FwdSum - dxpart * xgts + - T1 * ddxpart_dVs - gbdpsp); + *(here->BSIM3DPbPtr) -= m * (gbd - Gmbs - dxpart * xgtb + - T1 * ddxpart_dVb - gbdpb); + + *(here->BSIM3SPgPtr) -= m * (Gm - sxpart * xgtg + - T1 * dsxpart_dVg - gbspg); + *(here->BSIM3SPspPtr) += m * (gspr + gds + gbs + FwdSum + + sxpart * xgts + T1 * dsxpart_dVs + gbspsp); + *(here->BSIM3SPbPtr) -= m * (gbs + Gmbs - sxpart * xgtb + - T1 * dsxpart_dVb - gbspb); + *(here->BSIM3SPdpPtr) -= m * (gds + RevSum - sxpart * xgtd + - T1 * dsxpart_dVd - gbspdp); + + *(here->BSIM3GgPtr) -= m * xgtg; + *(here->BSIM3GbPtr) -= m * xgtb; + *(here->BSIM3GdpPtr) -= m * xgtd; + *(here->BSIM3GspPtr) -= m * xgts; + + if (here->BSIM3nqsMod || here->BSIM3acnqsMod) { *(here->BSIM3QqPtr ) += m * (s->real * ScalingFactor); *(here->BSIM3QqPtr +1) += m * (s->imag * ScalingFactor); *(here->BSIM3QgPtr ) -= m * (xcqgb * s->real); @@ -353,7 +354,7 @@ double m; *(here->BSIM3QbPtr ) -= m * (xcqbb * s->real); *(here->BSIM3QbPtr +1) -= m * (xcqbb * s->imag); *(here->BSIM3QspPtr ) -= m * (xcqsb * s->real); - *(here->BSIM3QspPtr +1) -= xcqsb * s->imag; + *(here->BSIM3QspPtr +1) -= m * (xcqsb * s->imag); *(here->BSIM3GqPtr) -= m * (here->BSIM3gtau); *(here->BSIM3DPqPtr) += m * (dxpart * here->BSIM3gtau); diff --git a/src/spicelib/devices/bsim3/b3set.c b/src/spicelib/devices/bsim3/b3set.c index 853a3e6d9..3761b0c20 100644 --- a/src/spicelib/devices/bsim3/b3set.c +++ b/src/spicelib/devices/bsim3/b3set.c @@ -1,8 +1,8 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3set.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3set.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi @@ -27,16 +27,18 @@ #define Meter2Micron 1.0e6 int -BSIM3setup (SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, - int *states) +BSIM3setup(matrix,inModel,ckt,states) +SMPmatrix *matrix; +GENmodel *inModel; +CKTcircuit *ckt; +int *states; { BSIM3model *model = (BSIM3model*)inModel; BSIM3instance *here; int error; CKTnode *tmp; - -CKTnode *tmpNode; -IFuid tmpName; + +double tmp1, tmp2; /* loop through all the BSIM3 device models */ for( ; model != NULL; model = model->BSIM3nextModel ) @@ -52,37 +54,16 @@ IFuid tmpName; 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"))||(!strcmp(model->BSIM3version, "3.24"))) - model->BSIM3intVersion = BSIM3V324; - else if ((!strcmp(model->BSIM3version, "3.2.3"))||(!strcmp(model->BSIM3version, "3.23"))) - model->BSIM3intVersion = BSIM3V323; - else if ((!strcmp(model->BSIM3version, "3.2.2"))||(!strcmp(model->BSIM3version, "3.22"))) - model->BSIM3intVersion = BSIM3V322; - else if ((!strcmp(model->BSIM3version, "3.2"))||(!strcmp(model->BSIM3version, "3.20"))) - 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->BSIM3acnqsModGiven) + model->BSIM3acnqsMod = 0; + else if ((model->BSIM3acnqsMod != 0) && (model->BSIM3acnqsMod != 1)) + { model->BSIM3acnqsMod = 0; + printf("Warning: acnqsMod has been set to its default value: 0.\n"); + } + if (!model->BSIM3versionGiven) + model->BSIM3version = "3.3.0"; if (!model->BSIM3toxGiven) model->BSIM3tox = 150.0e-10; model->BSIM3cox = 3.453133e-11 / model->BSIM3tox; @@ -90,15 +71,15 @@ IFuid tmpName; model->BSIM3toxm = model->BSIM3tox; if (!model->BSIM3cdscGiven) - model->BSIM3cdsc = 2.4e-4; /* unit Q/V/m^2 */ + 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 */ + 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 */ + model->BSIM3cit = 0.0; /* unit Q/V/m^2 */ if (!model->BSIM3nfactorGiven) - model->BSIM3nfactor = 1; + model->BSIM3nfactor = 1; if (!model->BSIM3xjGiven) model->BSIM3xj = .15e-6; if (!model->BSIM3vsatGiven) @@ -122,9 +103,9 @@ IFuid tmpName; if (!model->BSIM3ngateGiven) model->BSIM3ngate = 0; /* unit 1/cm3 */ if (!model->BSIM3vbmGiven) - model->BSIM3vbm = -3.0; + model->BSIM3vbm = -3.0; if (!model->BSIM3xtGiven) - model->BSIM3xt = 1.55e-7; + model->BSIM3xt = 1.55e-7; if (!model->BSIM3kt1Given) model->BSIM3kt1 = -0.11; /* unit V */ if (!model->BSIM3kt1lGiven) @@ -174,9 +155,9 @@ IFuid tmpName; if (!model->BSIM3u0Given) model->BSIM3u0 = (model->BSIM3type == NMOS) ? 0.067 : 0.025; if (!model->BSIM3uteGiven) - model->BSIM3ute = -1.5; + model->BSIM3ute = -1.5; if (!model->BSIM3voffGiven) - model->BSIM3voff = -0.08; + model->BSIM3voff = -0.08; if (!model->BSIM3deltaGiven) model->BSIM3delta = 0.01; if (!model->BSIM3rdswGiven) @@ -260,33 +241,17 @@ IFuid tmpName; 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 */ + /* Length dependence */ if (!model->BSIM3lcdscGiven) - model->BSIM3lcdsc = 0.0; + model->BSIM3lcdsc = 0.0; if (!model->BSIM3lcdscbGiven) - model->BSIM3lcdscb = 0.0; - if (!model->BSIM3lcdscdGiven) - model->BSIM3lcdscd = 0.0; + model->BSIM3lcdscb = 0.0; + if (!model->BSIM3lcdscdGiven) + model->BSIM3lcdscd = 0.0; if (!model->BSIM3lcitGiven) - model->BSIM3lcit = 0.0; + model->BSIM3lcit = 0.0; if (!model->BSIM3lnfactorGiven) - model->BSIM3lnfactor = 0.0; + model->BSIM3lnfactor = 0.0; if (!model->BSIM3lxjGiven) model->BSIM3lxj = 0.0; if (!model->BSIM3lvsatGiven) @@ -310,9 +275,9 @@ IFuid tmpName; if (!model->BSIM3lngateGiven) model->BSIM3lngate = 0.0; if (!model->BSIM3lvbmGiven) - model->BSIM3lvbm = 0.0; + model->BSIM3lvbm = 0.0; if (!model->BSIM3lxtGiven) - model->BSIM3lxt = 0.0; + model->BSIM3lxt = 0.0; if (!model->BSIM3lkt1Given) model->BSIM3lkt1 = 0.0; if (!model->BSIM3lkt1lGiven) @@ -360,9 +325,9 @@ IFuid tmpName; if (!model->BSIM3lu0Given) model->BSIM3lu0 = 0.0; if (!model->BSIM3luteGiven) - model->BSIM3lute = 0.0; + model->BSIM3lute = 0.0; if (!model->BSIM3lvoffGiven) - model->BSIM3lvoff = 0.0; + model->BSIM3lvoff = 0.0; if (!model->BSIM3ldeltaGiven) model->BSIM3ldelta = 0.0; if (!model->BSIM3lrdswGiven) @@ -435,17 +400,17 @@ IFuid tmpName; if (!model->BSIM3lvoffcvGiven) model->BSIM3lvoffcv = 0.0; - /* Width dependence */ + /* Width dependence */ if (!model->BSIM3wcdscGiven) - model->BSIM3wcdsc = 0.0; + model->BSIM3wcdsc = 0.0; if (!model->BSIM3wcdscbGiven) - model->BSIM3wcdscb = 0.0; - if (!model->BSIM3wcdscdGiven) - model->BSIM3wcdscd = 0.0; + model->BSIM3wcdscb = 0.0; + if (!model->BSIM3wcdscdGiven) + model->BSIM3wcdscd = 0.0; if (!model->BSIM3wcitGiven) - model->BSIM3wcit = 0.0; + model->BSIM3wcit = 0.0; if (!model->BSIM3wnfactorGiven) - model->BSIM3wnfactor = 0.0; + model->BSIM3wnfactor = 0.0; if (!model->BSIM3wxjGiven) model->BSIM3wxj = 0.0; if (!model->BSIM3wvsatGiven) @@ -469,9 +434,9 @@ IFuid tmpName; if (!model->BSIM3wngateGiven) model->BSIM3wngate = 0.0; if (!model->BSIM3wvbmGiven) - model->BSIM3wvbm = 0.0; + model->BSIM3wvbm = 0.0; if (!model->BSIM3wxtGiven) - model->BSIM3wxt = 0.0; + model->BSIM3wxt = 0.0; if (!model->BSIM3wkt1Given) model->BSIM3wkt1 = 0.0; if (!model->BSIM3wkt1lGiven) @@ -519,9 +484,9 @@ IFuid tmpName; if (!model->BSIM3wu0Given) model->BSIM3wu0 = 0.0; if (!model->BSIM3wuteGiven) - model->BSIM3wute = 0.0; + model->BSIM3wute = 0.0; if (!model->BSIM3wvoffGiven) - model->BSIM3wvoff = 0.0; + model->BSIM3wvoff = 0.0; if (!model->BSIM3wdeltaGiven) model->BSIM3wdelta = 0.0; if (!model->BSIM3wrdswGiven) @@ -594,17 +559,17 @@ IFuid tmpName; if (!model->BSIM3wvoffcvGiven) model->BSIM3wvoffcv = 0.0; - /* Cross-term dependence */ + /* Cross-term dependence */ if (!model->BSIM3pcdscGiven) - model->BSIM3pcdsc = 0.0; + model->BSIM3pcdsc = 0.0; if (!model->BSIM3pcdscbGiven) - model->BSIM3pcdscb = 0.0; - if (!model->BSIM3pcdscdGiven) - model->BSIM3pcdscd = 0.0; + model->BSIM3pcdscb = 0.0; + if (!model->BSIM3pcdscdGiven) + model->BSIM3pcdscd = 0.0; if (!model->BSIM3pcitGiven) - model->BSIM3pcit = 0.0; + model->BSIM3pcit = 0.0; if (!model->BSIM3pnfactorGiven) - model->BSIM3pnfactor = 0.0; + model->BSIM3pnfactor = 0.0; if (!model->BSIM3pxjGiven) model->BSIM3pxj = 0.0; if (!model->BSIM3pvsatGiven) @@ -629,9 +594,9 @@ IFuid tmpName; if (!model->BSIM3pngateGiven) model->BSIM3pngate = 0.0; if (!model->BSIM3pvbmGiven) - model->BSIM3pvbm = 0.0; + model->BSIM3pvbm = 0.0; if (!model->BSIM3pxtGiven) - model->BSIM3pxt = 0.0; + model->BSIM3pxt = 0.0; if (!model->BSIM3pkt1Given) model->BSIM3pkt1 = 0.0; if (!model->BSIM3pkt1lGiven) @@ -679,9 +644,9 @@ IFuid tmpName; if (!model->BSIM3pu0Given) model->BSIM3pu0 = 0.0; if (!model->BSIM3puteGiven) - model->BSIM3pute = 0.0; + model->BSIM3pute = 0.0; if (!model->BSIM3pvoffGiven) - model->BSIM3pvoff = 0.0; + model->BSIM3pvoff = 0.0; if (!model->BSIM3pdeltaGiven) model->BSIM3pdelta = 0.0; if (!model->BSIM3prdswGiven) @@ -756,9 +721,11 @@ IFuid tmpName; /* unit degree celcius */ if (!model->BSIM3tnomGiven) - model->BSIM3tnom = ckt->CKTnomTemp; -/* else - model->BSIM3tnom = model->BSIM3tnom + 273.15; */ + model->BSIM3tnom = ckt->CKTnomTemp; + else + model->BSIM3tnom = model->BSIM3tnom + 273.15; + if (!model->BSIM3lintnoiGiven) + model->BSIM3lintnoi = 0.0; /* unit m */ if (!model->BSIM3LintGiven) model->BSIM3Lint = 0.0; if (!model->BSIM3LlGiven) @@ -807,35 +774,29 @@ IFuid tmpName; model->BSIM3dwc = model->BSIM3Wint; if (!model->BSIM3dlcGiven) model->BSIM3dlc = model->BSIM3Lint; - - if (!model->BSIM3xlGiven) - model->BSIM3xl = 0.0; - if (!model->BSIM3xwGiven) - model->BSIM3xw = 0.0; - - if (!model->BSIM3cfGiven) + if (!model->BSIM3cfGiven) model->BSIM3cf = 2.0 * EPSOX / PI - * log(1.0 + 0.4e-6 / model->BSIM3tox); + * log(1.0 + 0.4e-6 / model->BSIM3tox); if (!model->BSIM3cgdoGiven) - { if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) - { model->BSIM3cgdo = model->BSIM3dlc * model->BSIM3cox - - model->BSIM3cgdl ; - } - else - model->BSIM3cgdo = 0.6 * model->BSIM3xj * model->BSIM3cox; - } + { if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) + { model->BSIM3cgdo = model->BSIM3dlc * model->BSIM3cox + - model->BSIM3cgdl ; + } + else + model->BSIM3cgdo = 0.6 * model->BSIM3xj * model->BSIM3cox; + } if (!model->BSIM3cgsoGiven) - { if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) - { model->BSIM3cgso = model->BSIM3dlc * model->BSIM3cox - - model->BSIM3cgsl ; - } - else - model->BSIM3cgso = 0.6 * model->BSIM3xj * model->BSIM3cox; - } + { if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) + { model->BSIM3cgso = model->BSIM3dlc * model->BSIM3cox + - model->BSIM3cgsl ; + } + else + model->BSIM3cgso = 0.6 * model->BSIM3xj * model->BSIM3cox; + } if (!model->BSIM3cgboGiven) - { model->BSIM3cgbo = 2.0 * model->BSIM3dwc * model->BSIM3cox; - } + { model->BSIM3cgbo = 2.0 * model->BSIM3dwc * model->BSIM3cox; + } if (!model->BSIM3xpartGiven) model->BSIM3xpart = 0.0; if (!model->BSIM3sheetResistanceGiven) @@ -867,24 +828,24 @@ IFuid tmpName; if (!model->BSIM3jctTempExponentGiven) model->BSIM3jctTempExponent = 3.0; if (!model->BSIM3oxideTrapDensityAGiven) - { if (model->BSIM3type == NMOS) + { if (model->BSIM3type == NMOS) model->BSIM3oxideTrapDensityA = 1e20; else model->BSIM3oxideTrapDensityA=9.9e18; - } + } if (!model->BSIM3oxideTrapDensityBGiven) - { if (model->BSIM3type == NMOS) + { if (model->BSIM3type == NMOS) model->BSIM3oxideTrapDensityB = 5e4; else model->BSIM3oxideTrapDensityB = 2.4e3; - } + } if (!model->BSIM3oxideTrapDensityCGiven) - { if (model->BSIM3type == NMOS) + { if (model->BSIM3type == NMOS) model->BSIM3oxideTrapDensityC = -1.4e-12; else model->BSIM3oxideTrapDensityC = 1.4e-12; - } + } if (!model->BSIM3emGiven) model->BSIM3em = 4.1e7; /* V/m */ if (!model->BSIM3efGiven) @@ -896,26 +857,20 @@ IFuid tmpName; /* loop through all the instances of the model */ for (here = model->BSIM3instances; here != NULL ; here=here->BSIM3nextInstance) - { + { if (here->BSIM3owner == ARCHme) { /* allocate a chunk of the state vector */ here->BSIM3states = *states; *states += BSIM3numStates; } - /* perform the parameter defaulting */ if (!here->BSIM3drainAreaGiven) here->BSIM3drainArea = 0.0; if (!here->BSIM3drainPerimeterGiven) here->BSIM3drainPerimeter = 0.0; if (!here->BSIM3drainSquaresGiven) - { - if (model->BSIM3acmMod == 0) - here->BSIM3drainSquares = 1.0; - else - here->BSIM3drainSquares = 0.0; - } + here->BSIM3drainSquares = 1.0; if (!here->BSIM3icVBSGiven) here->BSIM3icVBS = 0.0; if (!here->BSIM3icVDSGiven) @@ -929,86 +884,56 @@ IFuid tmpName; if (!here->BSIM3sourcePerimeterGiven) here->BSIM3sourcePerimeter = 0.0; if (!here->BSIM3sourceSquaresGiven) - { - if (model->BSIM3acmMod == 0) - here->BSIM3sourceSquares = 1.0; - else - here->BSIM3sourceSquares = 0.0; - } + here->BSIM3sourceSquares = 1.0; if (!here->BSIM3wGiven) here->BSIM3w = 5.0e-6; if (!here->BSIM3nqsModGiven) here->BSIM3nqsMod = 0; + if (!here->BSIM3acnqsModGiven) + here->BSIM3acnqsMod = model->BSIM3acnqsMod; + else if ((here->BSIM3acnqsMod != 0) && (here->BSIM3acnqsMod != 1)) + { here->BSIM3acnqsMod = model->BSIM3acnqsMod; + printf("Warning: acnqsMod has been set to its global value %d.\n", + model->BSIM3acnqsMod); + } + if (!here->BSIM3mGiven) here->BSIM3m = 1; /* process drain series resistance */ - if ( ((model->BSIM3sheetResistance > 0.0) && - (here->BSIM3drainSquares > 0.0) && (here->BSIM3dNodePrime == 0)) - ||((model->BSIM3sheetResistance > 0.0) && - (model->BSIM3hdif > 0.0) && (here->BSIM3dNodePrime == 0)) - ||((model->BSIM3rd > 0.0) && - (model->BSIM3ldif > 0.0) && (here->BSIM3dNodePrime == 0)) - ||((model->BSIM3rd > 0.0) && - (model->BSIM3ld > 0.0) && (here->BSIM3dNodePrime == 0)) - ||((model->BSIM3rsc > 0.0) && (here->BSIM3dNodePrime == 0)) - ) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"drain"); + if ((model->BSIM3sheetResistance > 0.0) && + (here->BSIM3drainSquares > 0.0 ) && + (here->BSIM3dNodePrime == 0)) + { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"drain"); if(error) return(error); here->BSIM3dNodePrime = tmp->number; - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - else - { here->BSIM3dNodePrime = here->BSIM3dNode; + else + { here->BSIM3dNodePrime = here->BSIM3dNode; } /* process source series resistance */ - if ( ((model->BSIM3sheetResistance > 0.0) && - (here->BSIM3sourceSquares > 0.0) && (here->BSIM3sNodePrime == 0)) - ||((model->BSIM3sheetResistance > 0.0) && - (model->BSIM3hdif > 0.0) && (here->BSIM3sNodePrime == 0)) - ||((model->BSIM3rs > 0.0) && - (model->BSIM3ldif > 0.0) && (here->BSIM3sNodePrime == 0)) - ||((model->BSIM3rs > 0.0) && - (model->BSIM3ld > 0.0) && (here->BSIM3sNodePrime == 0)) - ||((model->BSIM3rsc > 0.0) && (here->BSIM3sNodePrime == 0)) - ) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"source"); + if ((model->BSIM3sheetResistance > 0.0) && + (here->BSIM3sourceSquares > 0.0 ) && + (here->BSIM3sNodePrime == 0)) + { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"source"); if(error) return(error); here->BSIM3sNodePrime = tmp->number; - - if (ckt->CKTcopyNodesets) { - if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { - if (tmpNode->nsGiven) { - tmp->nodeset=tmpNode->nodeset; - tmp->nsGiven=tmpNode->nsGiven; - } - } - } - } - else - { here->BSIM3sNodePrime = here->BSIM3sNode; + else + { here->BSIM3sNodePrime = here->BSIM3sNode; } /* internal charge node */ if ((here->BSIM3nqsMod) && (here->BSIM3qNode == 0)) - { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"charge"); + { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"charge"); if(error) return(error); here->BSIM3qNode = tmp->number; } - else - { here->BSIM3qNode = 0; + else + { here->BSIM3qNode = 0; } /* set Sparse Matrix Pointers */ diff --git a/src/spicelib/devices/bsim3/b3temp.c b/src/spicelib/devices/bsim3/b3temp.c index 776952edd..a50d7b09b 100644 --- a/src/spicelib/devices/bsim3/b3temp.c +++ b/src/spicelib/devices/bsim3/b3temp.c @@ -1,14 +1,15 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3temp.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3temp.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 **********/ +/* Lmin, Lmax, Wmin, Wmax */ + #include "ngspice.h" #include "smpdefs.h" #include "cktdefs.h" @@ -30,13 +31,15 @@ /* ARGSUSED */ int -BSIM3temp (GENmodel *inModel, CKTcircuit *ckt) +BSIM3temp(inModel,ckt) +GENmodel *inModel; +CKTcircuit *ckt; { BSIM3model *model = (BSIM3model*) inModel; BSIM3instance *here; struct bsim3SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam; double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, Ldrn, Wdrn; -double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Vtm0, Tnom; +double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom; double Nvtm, SourceSatCurrent, DrainSatCurrent; int Size_Not_Found; @@ -55,8 +58,6 @@ int Size_Not_Found; { model->BSIM3GatesidewallJctPotential = 0.1; fprintf(stderr, "Given pbswg is less than 0.1. Pbswg is set to 0.1.\n"); } - /* va: was memory leakage - free old node, (or better use again?) */ - FREE(model->pSizeDependParamKnot); model->pSizeDependParamKnot = NULL; pLastKnot = NULL; @@ -97,95 +98,26 @@ int Size_Not_Found; delTemp = ckt->CKTtemp - model->BSIM3tnom; T0 = model->BSIM3tcj * delTemp; if (T0 >= -1.0) - { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - model->BSIM3unitAreaTempJctCap = - model->BSIM3unitAreaJctCap * (1.0 + T0); - break; - case BSIM3V322: - case BSIM3V32: - default: - model->BSIM3unitAreaJctCap *= 1.0 + T0; - } + { model->BSIM3unitAreaTempJctCap = model->BSIM3unitAreaJctCap * (1.0 + T0); } else if (model->BSIM3unitAreaJctCap > 0.0) - { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - model->BSIM3unitAreaTempJctCap = 0.0; - break; - case BSIM3V322: - case BSIM3V32: - default: - model->BSIM3unitAreaJctCap = 0.0; - } + { model->BSIM3unitAreaTempJctCap = 0.0; fprintf(stderr, "Temperature effect has caused cj to be negative. Cj is clamped to zero.\n"); } T0 = model->BSIM3tcjsw * delTemp; if (T0 >= -1.0) - { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - model->BSIM3unitLengthSidewallTempJctCap = - model->BSIM3unitLengthSidewallJctCap * (1.0 + T0); - break; - case BSIM3V322: - case BSIM3V32: - default: - model->BSIM3unitLengthSidewallJctCap *= 1.0 + T0; - } + { model->BSIM3unitLengthSidewallTempJctCap = model->BSIM3unitLengthSidewallJctCap * (1.0 + T0); } else if (model->BSIM3unitLengthSidewallJctCap > 0.0) - { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - model->BSIM3unitLengthSidewallTempJctCap = 0.0; - break; - case BSIM3V322: - case BSIM3V32: - default: - model->BSIM3unitLengthSidewallJctCap = 0.0; - } + { model->BSIM3unitLengthSidewallTempJctCap = 0.0; fprintf(stderr, "Temperature effect has caused cjsw to be negative. Cjsw is clamped to zero.\n"); } T0 = model->BSIM3tcjswg * delTemp; if (T0 >= -1.0) - { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - model->BSIM3unitLengthGateSidewallTempJctCap = - model->BSIM3unitLengthGateSidewallJctCap * (1.0 + T0); - break; - case BSIM3V322: - case BSIM3V32: - default: - model->BSIM3unitLengthGateSidewallJctCap *= 1.0 + T0; - } + { model->BSIM3unitLengthGateSidewallTempJctCap = model->BSIM3unitLengthGateSidewallJctCap * (1.0 + T0); } else if (model->BSIM3unitLengthGateSidewallJctCap > 0.0) - { - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - model->BSIM3unitLengthGateSidewallTempJctCap = 0.0; - break; - case BSIM3V322: - case BSIM3V32: - default: - model->BSIM3unitLengthGateSidewallJctCap = 0.0; - } + { model->BSIM3unitLengthGateSidewallTempJctCap = 0.0; fprintf(stderr, "Temperature effect has caused cjswg to be negative. Cjswg is clamped to zero.\n"); } @@ -215,17 +147,14 @@ int Size_Not_Found; here = here->BSIM3nextInstance) { if (here->BSIM3owner != ARCHme) continue; - pSizeDependParamKnot = model->pSizeDependParamKnot; + pSizeDependParamKnot = model->pSizeDependParamKnot; Size_Not_Found = 1; while ((pSizeDependParamKnot != NULL) && Size_Not_Found) { if ((here->BSIM3l == pSizeDependParamKnot->Length) && (here->BSIM3w == pSizeDependParamKnot->Width)) { Size_Not_Found = 0; here->pParam = pSizeDependParamKnot; - if (model->BSIM3intVersion > BSIM3V322) - { - pParam = here->pParam; /*bug-fix */ - } + pParam = here->pParam; /*bug-fix */ } else { pLastKnot = pSizeDependParamKnot; @@ -266,7 +195,7 @@ int Size_Not_Found; + model->BSIM3Wwlc / (T2 * T3); pParam->BSIM3dwc = model->BSIM3dwc + tmp2; - pParam->BSIM3leff = here->BSIM3l + model->BSIM3xl - 2.0 * pParam->BSIM3dl; + pParam->BSIM3leff = here->BSIM3l - 2.0 * pParam->BSIM3dl; if (pParam->BSIM3leff <= 0.0) { IFuid namarray[2]; namarray[0] = model->BSIM3modName; @@ -277,7 +206,7 @@ int Size_Not_Found; return(E_BADPARM); } - pParam->BSIM3weff = here->BSIM3w + model->BSIM3xw - 2.0 * pParam->BSIM3dw; + pParam->BSIM3weff = here->BSIM3w - 2.0 * pParam->BSIM3dw; if (pParam->BSIM3weff <= 0.0) { IFuid namarray[2]; namarray[0] = model->BSIM3modName; @@ -288,7 +217,7 @@ int Size_Not_Found; return(E_BADPARM); } - pParam->BSIM3leffCV = here->BSIM3l + model->BSIM3xl - 2.0 * pParam->BSIM3dlc; + pParam->BSIM3leffCV = here->BSIM3l - 2.0 * pParam->BSIM3dlc; if (pParam->BSIM3leffCV <= 0.0) { IFuid namarray[2]; namarray[0] = model->BSIM3modName; @@ -299,7 +228,7 @@ int Size_Not_Found; return(E_BADPARM); } - pParam->BSIM3weffCV = here->BSIM3w + model->BSIM3xw - 2.0 * pParam->BSIM3dwc; + pParam->BSIM3weffCV = here->BSIM3w - 2.0 * pParam->BSIM3dwc; if (pParam->BSIM3weffCV <= 0.0) { IFuid namarray[2]; namarray[0] = model->BSIM3modName; @@ -862,179 +791,59 @@ int Size_Not_Found; * pParam->BSIM3sqrtPhi; /* End of vfbzb */ } - else /* !Size_Not_Found */ - { - /* va: pParam might be uninitialized, if !Size_Not_Found */ - pParam = here->pParam; - } /* process source/drain series resistance */ - /* acm model */ - if (model->BSIM3acmMod == 0) - { - here->BSIM3drainConductance = model->BSIM3sheetResistance - * here->BSIM3drainSquares; - here->BSIM3sourceConductance = model->BSIM3sheetResistance - * here->BSIM3sourceSquares; - } - else - { - if (here->BSIM3drainSquaresGiven) - { - here->BSIM3drainConductance = (model->BSIM3ld + model->BSIM3ldif)/(here->BSIM3w + model->BSIM3xw)*model->BSIM3rd - + model->BSIM3sheetResistance * here->BSIM3drainSquares + model->BSIM3rdc; - } - else - { - here->BSIM3drainConductance = ((model->BSIM3ld + model->BSIM3ldif)*model->BSIM3rd - + model->BSIM3hdif*model->BSIM3sheetResistance)/(here->BSIM3w + model->BSIM3xw) + model->BSIM3rdc; - } - if (here->BSIM3sourceSquaresGiven) - { - here->BSIM3sourceConductance = (model->BSIM3ld + model->BSIM3ldif)/(here->BSIM3w + model->BSIM3xw)*model->BSIM3rs - + model->BSIM3sheetResistance * here->BSIM3sourceSquares + model->BSIM3rsc; - } - else - { - here->BSIM3sourceConductance = ((model->BSIM3ld + model->BSIM3ldif)*model->BSIM3rs - + model->BSIM3hdif*model->BSIM3sheetResistance)/(here->BSIM3w + model->BSIM3xw) + model->BSIM3rsc; - } - } + here->BSIM3drainConductance = model->BSIM3sheetResistance + * here->BSIM3drainSquares; if (here->BSIM3drainConductance > 0.0) here->BSIM3drainConductance = 1.0 - / here->BSIM3drainConductance; + / here->BSIM3drainConductance; else here->BSIM3drainConductance = 0.0; - + + here->BSIM3sourceConductance = model->BSIM3sheetResistance + * here->BSIM3sourceSquares; if (here->BSIM3sourceConductance > 0.0) here->BSIM3sourceConductance = 1.0 / here->BSIM3sourceConductance; else here->BSIM3sourceConductance = 0.0; - here->BSIM3cgso = pParam->BSIM3cgso; here->BSIM3cgdo = pParam->BSIM3cgdo; Nvtm = model->BSIM3vtm * model->BSIM3jctEmissionCoeff; - if (model->BSIM3acmMod == 0) - { - if ((here->BSIM3sourceArea <= 0.0) && - (here->BSIM3sourcePerimeter <= 0.0)) - { SourceSatCurrent = 1.0e-14; - } - else - { SourceSatCurrent = here->BSIM3sourceArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3sourcePerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } - if ((SourceSatCurrent > 0.0) && (model->BSIM3ijth > 0.0)) - { here->BSIM3vjsm = Nvtm * log(model->BSIM3ijth - / SourceSatCurrent + 1.0); - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - here->BSIM3IsEvjsm = - SourceSatCurrent * exp(here->BSIM3vjsm / Nvtm); - break; - case BSIM3V32: - default: - /* Do nothing */ - break; - } - } - - if ((here->BSIM3drainArea <= 0.0) && - (here->BSIM3drainPerimeter <= 0.0)) - { DrainSatCurrent = 1.0e-14; - } - else - { DrainSatCurrent = here->BSIM3drainArea - * model->BSIM3jctTempSatCurDensity - + here->BSIM3drainPerimeter - * model->BSIM3jctSidewallTempSatCurDensity; - } - if ((DrainSatCurrent > 0.0) && (model->BSIM3ijth > 0.0)) - { here->BSIM3vjdm = Nvtm * log(model->BSIM3ijth - / DrainSatCurrent + 1.0); - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - here->BSIM3IsEvjdm = - DrainSatCurrent * exp(here->BSIM3vjdm / Nvtm); - break; - case BSIM3V32: - default: - /* Do nothing */ - break; - } - } + if ((here->BSIM3sourceArea <= 0.0) && + (here->BSIM3sourcePerimeter <= 0.0)) + { SourceSatCurrent = 1.0e-14; } else - { - SourceSatCurrent = 0.0; - if (!here->BSIM3sourceAreaGiven) - { - here->BSIM3sourceArea = 2.0 * model->BSIM3hdif * pParam->BSIM3weff; - } - SourceSatCurrent = here->BSIM3sourceArea * model->BSIM3jctTempSatCurDensity; - if (!here->BSIM3sourcePerimeterGiven) - { - here->BSIM3sourcePerimeter = 4.0 * model->BSIM3hdif + 2.0 * pParam->BSIM3weff; - } - SourceSatCurrent = SourceSatCurrent + here->BSIM3sourcePerimeter * model->BSIM3jctSidewallTempSatCurDensity; - if (SourceSatCurrent <= 0.0) SourceSatCurrent = 1.0e-14; - if ((SourceSatCurrent > 0.0) && (model->BSIM3ijth > 0.0)) - { here->BSIM3vjsm = Nvtm * log(model->BSIM3ijth - / SourceSatCurrent + 1.0); - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - here->BSIM3IsEvjsm = - SourceSatCurrent * exp(here->BSIM3vjsm / Nvtm); - break; - case BSIM3V32: - default: - /* Do nothing */ - break; - } - } + { SourceSatCurrent = here->BSIM3sourceArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3sourcePerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } + if ((SourceSatCurrent > 0.0) && (model->BSIM3ijth > 0.0)) + { here->BSIM3vjsm = Nvtm * log(model->BSIM3ijth + / SourceSatCurrent + 1.0); + here->BSIM3IsEvjsm = SourceSatCurrent * exp(here->BSIM3vjsm + / Nvtm); + } - DrainSatCurrent = 0.0; - if (!here->BSIM3drainAreaGiven) - { - here->BSIM3drainArea = 2.0 * model->BSIM3hdif * pParam->BSIM3weff; - } - DrainSatCurrent = here->BSIM3drainArea * model->BSIM3jctTempSatCurDensity; - if (!here->BSIM3drainPerimeterGiven) - { - here->BSIM3drainPerimeter = 4.0 * model->BSIM3hdif + 2.0 * pParam->BSIM3weff; - } - DrainSatCurrent = DrainSatCurrent + here->BSIM3drainPerimeter * model->BSIM3jctSidewallTempSatCurDensity; - if (DrainSatCurrent <= 0.0) DrainSatCurrent = 1.0e-14; - if ((DrainSatCurrent > 0.0) && (model->BSIM3ijth > 0.0)) - { here->BSIM3vjdm = Nvtm * log(model->BSIM3ijth - / DrainSatCurrent + 1.0); - /* Added revision dependent code */ - switch (model->BSIM3intVersion) { - case BSIM3V324: - case BSIM3V323: - case BSIM3V322: - here->BSIM3IsEvjdm = - DrainSatCurrent * exp(here->BSIM3vjdm / Nvtm); - break; - case BSIM3V32: - default: - /* Do nothing */ - break; - } - } + if ((here->BSIM3drainArea <= 0.0) && + (here->BSIM3drainPerimeter <= 0.0)) + { DrainSatCurrent = 1.0e-14; + } + else + { DrainSatCurrent = here->BSIM3drainArea + * model->BSIM3jctTempSatCurDensity + + here->BSIM3drainPerimeter + * model->BSIM3jctSidewallTempSatCurDensity; + } + if ((DrainSatCurrent > 0.0) && (model->BSIM3ijth > 0.0)) + { here->BSIM3vjdm = Nvtm * log(model->BSIM3ijth + / DrainSatCurrent + 1.0); + here->BSIM3IsEvjdm = DrainSatCurrent * exp(here->BSIM3vjdm + / Nvtm); } } } diff --git a/src/spicelib/devices/bsim3/b3trunc.c b/src/spicelib/devices/bsim3/b3trunc.c index 6ec71d0f2..5fc0054bf 100644 --- a/src/spicelib/devices/bsim3/b3trunc.c +++ b/src/spicelib/devices/bsim3/b3trunc.c @@ -1,12 +1,11 @@ -/**** BSIM3v3.2.4, Released by Xuemei Xi 12/21/2001 ****/ +/**** BSIM3v3.3.0, Released by Xuemei Xi 07/29/2005 ****/ /********** - * Copyright 2001 Regents of the University of California. All rights reserved. - * File: b3trunc.c of BSIM3v3.2.4 + * Copyright 2004 Regents of the University of California. All rights reserved. + * File: b3trunc.c of BSIM3v3.3.0 * Author: 1995 Min-Chie Jeng and Mansun Chan. * Author: 1997-1999 Weidong Liu. * Author: 2001 Xuemei Xi - * Modified by Poalo Nenzi 2002 **********/ #include "ngspice.h" @@ -17,7 +16,10 @@ int -BSIM3trunc (GENmodel *inModel, CKTcircuit *ckt, double *timeStep) +BSIM3trunc(inModel,ckt,timeStep) +GENmodel *inModel; +CKTcircuit *ckt; +double *timeStep; { BSIM3model *model = (BSIM3model*)inModel; BSIM3instance *here; @@ -48,3 +50,6 @@ BSIM3instance *here; } return(OK); } + + + diff --git a/src/spicelib/devices/bsim3/bsim3def.h b/src/spicelib/devices/bsim3/bsim3def.h index 6a14a9985..bb20275e2 100644 --- a/src/spicelib/devices/bsim3/bsim3def.h +++ b/src/spicelib/devices/bsim3/bsim3def.h @@ -1,9 +1,8 @@ /********** -Copyright 2001 Regents of the University of California. All rights reserved. +Copyright 2004 Regents of the University of California. All rights reserved. Author: 1995 Min-Chie Jeng and Mansun Chan. Author: 1997-1999 Weidong Liu. -Author: 2001 Xuemei Xi -Modified by Paolo Nenzi 2002 and Dietmar Warning 2003 +Author: 2001- Xuemei Xi File: bsim3def.h **********/ @@ -21,7 +20,7 @@ typedef struct sBSIM3instance struct sBSIM3model *BSIM3modPtr; struct sBSIM3instance *BSIM3nextInstance; IFuid BSIM3name; - int BSIM3owner; /* number of owner process */ + int BSIM3owner; /* number of owner process */ int BSIM3states; /* index into state table for this device */ int BSIM3dNode; int BSIM3gNode; @@ -61,6 +60,7 @@ typedef struct sBSIM3instance int BSIM3off; int BSIM3mode; int BSIM3nqsMod; + int BSIM3acnqsMod; /* OP point */ double BSIM3qinv; @@ -109,6 +109,7 @@ typedef struct sBSIM3instance double BSIM3Vdseff; double BSIM3Abulk; double BSIM3AbovVgst2Vtm; + double BSIM3taunet; struct bsim3SizeDependParam *pParam; @@ -127,6 +128,7 @@ typedef struct sBSIM3instance unsigned BSIM3icVDSGiven :1; unsigned BSIM3icVGSGiven :1; unsigned BSIM3nqsModGiven :1; + unsigned BSIM3acnqsModGiven :1; double *BSIM3DdPtr; double *BSIM3GgPtr; @@ -352,20 +354,11 @@ typedef struct sBSIM3model int BSIM3mobMod; int BSIM3capMod; - int BSIM3acmMod; int BSIM3noiMod; + int BSIM3acnqsMod; int BSIM3binUnit; int BSIM3paramChk; char *BSIM3version; - /* The following field is an integer coding - * of BSIM3version. - */ - int BSIM3intVersion; -#define BSIM3V324 324 /* BSIM3 V3.2.4 */ -#define BSIM3V323 323 /* BSIM3 V3.2.3 */ -#define BSIM3V322 322 /* BSIM3 V3.2.2 */ -#define BSIM3V32 32 /* BSIM3 V3.2 */ -#define BSIM3V3OLD 0 /* Old model */ double BSIM3tox; double BSIM3toxm; double BSIM3cdsc; @@ -463,15 +456,6 @@ typedef struct sBSIM3model double BSIM3tpbsw; double BSIM3tpbswg; - /* acm model */ - double BSIM3hdif; - double BSIM3ldif; - double BSIM3ld; - double BSIM3rd; - double BSIM3rs; - double BSIM3rdc; - double BSIM3rsc; - /* Length Dependence */ double BSIM3lcdsc; double BSIM3lcdscb; @@ -780,9 +764,6 @@ typedef struct sBSIM3model double BSIM3Wmin; double BSIM3Wmax; - /* acm model */ - double BSIM3xl; - double BSIM3xw; /* Pre-calculated constants */ /* MCJ: move to size-dependent param. */ @@ -810,6 +791,7 @@ typedef struct sBSIM3model double BSIM3ef; double BSIM3af; double BSIM3kf; + double BSIM3lintnoi; /* lint offset for noise calculation */ struct bsim3SizeDependParam *pSizeDependParamKnot; @@ -817,9 +799,9 @@ typedef struct sBSIM3model unsigned BSIM3mobModGiven :1; unsigned BSIM3binUnitGiven :1; unsigned BSIM3capModGiven :1; - unsigned BSIM3acmModGiven :1; unsigned BSIM3paramChkGiven :1; unsigned BSIM3noiModGiven :1; + unsigned BSIM3acnqsModGiven :1; unsigned BSIM3typeGiven :1; unsigned BSIM3toxGiven :1; unsigned BSIM3versionGiven :1; @@ -919,14 +901,6 @@ typedef struct sBSIM3model unsigned BSIM3tpbswGiven :1; unsigned BSIM3tpbswgGiven :1; - /* acm model */ - unsigned BSIM3hdifGiven :1; - unsigned BSIM3ldifGiven :1; - unsigned BSIM3ldGiven :1; - unsigned BSIM3rdGiven :1; - unsigned BSIM3rsGiven :1; - unsigned BSIM3rdcGiven :1; - unsigned BSIM3rscGiven :1; /* Length dependence */ unsigned BSIM3lcdscGiven :1; @@ -1218,6 +1192,7 @@ typedef struct sBSIM3model unsigned BSIM3efGiven :1; unsigned BSIM3afGiven :1; unsigned BSIM3kfGiven :1; + unsigned BSIM3lintnoiGiven :1; unsigned BSIM3LintGiven :1; unsigned BSIM3LlGiven :1; @@ -1243,10 +1218,6 @@ typedef struct sBSIM3model unsigned BSIM3WminGiven :1; unsigned BSIM3WmaxGiven :1; - /* acm model */ - unsigned BSIM3xlGiven :1; - unsigned BSIM3xwGiven :1; - } BSIM3model; @@ -1259,7 +1230,7 @@ typedef struct sBSIM3model /* device parameters */ #define BSIM3_W 1 #define BSIM3_L 2 -#define BSIM3_M 15 +#define BSIM3_M 16 #define BSIM3_AS 3 #define BSIM3_AD 4 #define BSIM3_PS 5 @@ -1272,10 +1243,10 @@ typedef struct sBSIM3model #define BSIM3_IC_VGS 12 #define BSIM3_IC 13 #define BSIM3_NQSMOD 14 +#define BSIM3_ACNQSMOD 15 /* model parameters */ #define BSIM3_MOD_CAPMOD 101 -#define BSIM3_MOD_ACMMOD 102 #define BSIM3_MOD_MOBMOD 103 #define BSIM3_MOD_NOIMOD 104 @@ -1386,6 +1357,8 @@ typedef struct sBSIM3model #define BSIM3_MOD_TPBSW 206 #define BSIM3_MOD_TPBSWG 207 #define BSIM3_MOD_VOFFCV 208 +#define BSIM3_MOD_LINTNOI 209 +#define BSIM3_MOD_ACNQSMOD 210 /* Length dependence */ #define BSIM3_MOD_LCDSC 251 @@ -1740,18 +1713,6 @@ typedef struct sBSIM3model #define BSIM3_MOD_WWC 701 #define BSIM3_MOD_WWLC 702 -/* acm parameters */ -#define BSIM3_MOD_XL 703 -#define BSIM3_MOD_XW 704 - -#define BSIM3_MOD_HDIF 711 -#define BSIM3_MOD_LDIF 712 -#define BSIM3_MOD_LD 713 -#define BSIM3_MOD_RD 714 -#define BSIM3_MOD_RS 715 -#define BSIM3_MOD_RDC 716 -#define BSIM3_MOD_RSC 717 - /* device questions */ #define BSIM3_DNODE 751 #define BSIM3_GNODE 752 @@ -1800,11 +1761,18 @@ typedef struct sBSIM3model #include "bsim3ext.h" +#ifdef __STDC__ extern void BSIM3evaluate(double,double,double,BSIM3instance*,BSIM3model*, double*,double*,double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, CKTcircuit*); extern int BSIM3debug(BSIM3model*, BSIM3instance*, CKTcircuit*, int); extern int BSIM3checkModel(BSIM3model*, BSIM3instance*, CKTcircuit*); +#else /* stdc */ +extern void BSIM3evaluate(); +extern int BSIM3debug(); +extern int BSIM3checkModel(); +#endif /* stdc */ #endif /*BSIM3*/ + diff --git a/src/spicelib/devices/bsim3/bsim3ext.h b/src/spicelib/devices/bsim3/bsim3ext.h index 276129b44..7dfb5bdf3 100644 --- a/src/spicelib/devices/bsim3/bsim3ext.h +++ b/src/spicelib/devices/bsim3/bsim3ext.h @@ -1,11 +1,11 @@ /********** -Copyright 1999 Regents of the University of California. All rights reserved. +Copyright 1990 Regents of the University of California. All rights reserved. Author: 1991 JianHui Huang and Min-Chie Jeng. Modified by Yuhua Cheng to use BSIM3v3 in Spice3f5 (Jan. 1997) -Modified by Paolo Nenzi 2002 File: bsim3ext.h **********/ +#ifdef __STDC__ extern int BSIM3acLoad(GENmodel *,CKTcircuit*); extern int BSIM3ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*); extern int BSIM3convTest(GENmodel *,CKTcircuit*); @@ -29,3 +29,26 @@ extern int BSIM3temp(GENmodel*,CKTcircuit*); extern int BSIM3trunc(GENmodel*,CKTcircuit*,double*); extern int BSIM3noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*); extern int BSIM3unsetup(GENmodel*,CKTcircuit*); + +#else /* stdc */ +extern int BSIM3acLoad(); +extern int BSIM3delete(); +extern void BSIM3destroy(); +extern int BSIM3getic(); +extern int BSIM3load(); +extern int BSIM3mDelete(); +extern int BSIM3ask(); +extern int BSIM3mAsk(); +extern int BSIM3convTest(); +extern int BSIM3temp(); +extern int BSIM3mParam(); +extern void BSIM3mosCap(); +extern int BSIM3param(); +extern int BSIM3pzLoad(); +extern int BSIM3setup(); +extern int BSIM3trunc(); +extern int BSIM3noise(); +extern int BSIM3unsetup(); + +#endif /* stdc */ + diff --git a/src/spicelib/devices/bsim3/bsim3init.c b/src/spicelib/devices/bsim3/bsim3init.c index 92a940e05..32a074888 100644 --- a/src/spicelib/devices/bsim3/bsim3init.c +++ b/src/spicelib/devices/bsim3/bsim3init.c @@ -81,3 +81,5 @@ get_bsim3_info(void) { return &BSIM3info; } + + diff --git a/src/spicelib/devices/bsim3/bsim3itf.h b/src/spicelib/devices/bsim3/bsim3itf.h index 514289b76..fb53c25b3 100644 --- a/src/spicelib/devices/bsim3/bsim3itf.h +++ b/src/spicelib/devices/bsim3/bsim3itf.h @@ -1,7 +1,6 @@ /********** Copyright 1999 Regents of the University of California. All rights reserved. Author: 1991 JianHui Huang and Min-Chie Jeng. -Modified by Paolo Nenzi 2002 File: bsim3itf.h **********/