Updated BSIM4 model to latest version (BSIM4.2.1)

This commit is contained in:
rouat 2001-11-25 17:56:26 +00:00
parent fc8956b08c
commit 84c3d3fbc0
29 changed files with 1133 additions and 589 deletions

View File

@ -1,3 +1,7 @@
2001-11-25 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr>
* circuits.h: transfered definition of sstructire 'circ' to ftedefs.h
2001-02-07 Paolo Nenzi <p.nenzi@ieee.org>
* outitf.c: From a message Alan sento to the mailing list:

View File

@ -6,30 +6,7 @@
#ifndef CIRCUITS_H_INCLUDED
#define CIRCUITS_H_INCLUDED
/* The curcuits that are currently available to the user. */
struct circ {
char *ci_name; /* What the circuit can be called. */
char *ci_ckt; /* The CKTcircuit structure. */
INPtables *ci_symtab; /* The INP symbol table. */
struct line *ci_deck; /* The input deck. */
struct line *ci_origdeck;/* The input deck, before subckt expansion. */
struct line *ci_options;/* The .option cards from the deck... */
struct variable *ci_vars; /* ... and the parsed versions. */
bool ci_inprogress; /* We are in a break now. */
bool ci_runonce; /* So com_run can to a reset if necessary... */
wordlist *ci_commands; /* Things to do when this circuit is done. */
struct circ *ci_next; /* The next in the list. */
char *ci_nodes; /* ccom structs for the nodes... */
char *ci_devices; /* and devices in the circuit. */
char *ci_filename; /* Where this circuit came from. */
char *ci_defTask; /* the default task for this circuit */
char *ci_specTask; /* the special task for command line jobs */
char *ci_curTask; /* the most recent task for this circuit */
char *ci_defOpt; /* the default options anal. for this circuit */
char *ci_specOpt; /* the special options anal. for command line jobs */
char *ci_curOpt; /* the most recent options anal. for the circuit */
} ;
struct subcirc {
char *sc_name; /* Whatever... */

View File

@ -2,6 +2,7 @@
#include <ngspice.h>
#include <bool.h>
#include <wordlist.h>
#include <ftedefs.h>
#include <inpdefs.h>
#include "circuits.h"

View File

@ -1,3 +1,7 @@
2001-11-25 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr>
* ftedefs.h: added definition of structure circ (taken from circuits.h)
2000-09-09 Arno W. Peters <A.W.Peters@ieee.org>
* fteext.h: Removed prototype for com_fourier(). Use

View File

@ -22,6 +22,32 @@ struct save_info {
int used;
};
/* The curcuits that are currently available to the user. */
struct circ {
char *ci_name; /* What the circuit can be called. */
char *ci_ckt; /* The CKTcircuit structure. */
INPtables *ci_symtab; /* The INP symbol table. */
struct line *ci_deck; /* The input deck. */
struct line *ci_origdeck;/* The input deck, before subckt expansion. */
struct line *ci_options;/* The .option cards from the deck... */
struct variable *ci_vars; /* ... and the parsed versions. */
bool ci_inprogress; /* We are in a break now. */
bool ci_runonce; /* So com_run can to a reset if necessary... */
wordlist *ci_commands; /* Things to do when this circuit is done. */
struct circ *ci_next; /* The next in the list. */
char *ci_nodes; /* ccom structs for the nodes... */
char *ci_devices; /* and devices in the circuit. */
char *ci_filename; /* Where this circuit came from. */
char *ci_defTask; /* the default task for this circuit */
char *ci_specTask; /* the special task for command line jobs */
char *ci_curTask; /* the most recent task for this circuit */
char *ci_defOpt; /* the default options anal. for this circuit */
char *ci_specOpt; /* the special options anal. for command line jobs */
char *ci_curOpt; /* the most recent options anal. for the circuit */
} ;
#define mylog10(xx) (((xx) > 0.0) ? log10(xx) : (- log10(HUGE)))
#include "fteext.h"

Binary file not shown.

View File

@ -1,3 +1,7 @@
2001-11-25 Emmanuel Rouat <emmanuel.rouat@wanadoo.fr>
* *.c *.h: Updated to version BSIM4.2.1
2000-04-04 Paolo Nenzi <p.nenzi@ieee.org>
* *.c, *.h: Initial bsim4 support. Modified all files to conform

View File

@ -1,18 +1,20 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4.c of BSIM4.1.0.
* Authors: Weidong Liu, Kanyu M. Cao, Xiaodong Jin, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
* Modified by Xuemei Xi, 10/05/2001.
**********/
#include "ngspice.h"
#include <stdio.h>
#include "devdefs.h"
#include "bsim4def.h"
#include "suffix.h"
IFparm BSIM4pTable[] = { /* parameters */
IOP( "l", BSIM4_L, IF_REAL , "Length"),
@ -45,9 +47,42 @@ OP( "gds", BSIM4_GDS, IF_REAL, "Gds"),
OP( "vdsat", BSIM4_VDSAT, IF_REAL, "Vdsat"),
OP( "vth", BSIM4_VON, IF_REAL, "Vth"),
OP( "id", BSIM4_CD, IF_REAL, "Ids"),
OP( "ibd", BSIM4_CBD, IF_REAL, "Ibd"),
OP( "ibs", BSIM4_CBS, IF_REAL, "Ibs"),
OP( "isub", BSIM4_CSUB, IF_REAL, "Isub"),
OP( "igidl", BSIM4_IGIDL, IF_REAL, "Igidl"),
OP( "igisl", BSIM4_IGISL, IF_REAL, "Igisl"),
OP( "igs", BSIM4_IGS, IF_REAL, "Igs"),
OP( "igd", BSIM4_IGD, IF_REAL, "Igd"),
OP( "igb", BSIM4_IGB, IF_REAL, "Igb"),
OP( "igcs", BSIM4_IGCS, IF_REAL, "Igcs"),
OP( "igcd", BSIM4_IGCD, IF_REAL, "Igcd"),
OP( "vbs", BSIM4_VBS, IF_REAL, "Vbs"),
OP( "vgs", BSIM4_VGS, IF_REAL, "Vgs"),
OP( "vds", BSIM4_VDS, IF_REAL, "Vds"),
OP( "cgg", BSIM4_CGGB, IF_REAL, "Cggb"),
OP( "cgs", BSIM4_CGSB, IF_REAL, "Cgsb"),
OP( "cgd", BSIM4_CGDB, IF_REAL, "Cgdb"),
OP( "cbg", BSIM4_CBGB, IF_REAL, "Cbgb"),
OP( "cbd", BSIM4_CBDB, IF_REAL, "Cbdb"),
OP( "cbs", BSIM4_CBSB, IF_REAL, "Cbsb"),
OP( "cdg", BSIM4_CDGB, IF_REAL, "Cdgb"),
OP( "cdd", BSIM4_CDDB, IF_REAL, "Cddb"),
OP( "cds", BSIM4_CDSB, IF_REAL, "Cdsb"),
OP( "csg", BSIM4_CSGB, IF_REAL, "Csgb"),
OP( "csd", BSIM4_CSDB, IF_REAL, "Csdb"),
OP( "css", BSIM4_CSSB, IF_REAL, "Cssb"),
OP( "cgb", BSIM4_CGBB, IF_REAL, "Cgbb"),
OP( "cdb", BSIM4_CDBB, IF_REAL, "Cdbb"),
OP( "csb", BSIM4_CSBB, IF_REAL, "Csbb"),
OP( "cbb", BSIM4_CBBB, IF_REAL, "Cbbb"),
OP( "capbd", BSIM4_CAPBD, IF_REAL, "Capbd"),
OP( "capbs", BSIM4_CAPBS, IF_REAL, "Capbs"),
OP( "qg", BSIM4_QG, IF_REAL, "Qgate"),
OP( "qb", BSIM4_QB, IF_REAL, "Qbulk"),
OP( "qd", BSIM4_QD, IF_REAL, "Qdrain"),
OP( "qs", BSIM4_QS, IF_REAL, "Qsource"),
OP( "qinv", BSIM4_QINV, IF_REAL, "Qinversion"),
};
IFparm BSIM4mPTable[] = { /* model parameters */
@ -256,6 +291,8 @@ IOP( "clc", BSIM4_MOD_CLC, IF_REAL, "Vdsat parameter for C-V model"),
IOP( "cle", BSIM4_MOD_CLE, IF_REAL, "Vdsat parameter for C-V model"),
IOP( "dwc", BSIM4_MOD_DWC, IF_REAL, "Delta W for C-V model"),
IOP( "dlc", BSIM4_MOD_DLC, IF_REAL, "Delta L for C-V model"),
IOP( "xw", BSIM4_MOD_XW, IF_REAL, "W offset for channel width due to mask/etch effect"),
IOP( "xl", BSIM4_MOD_XL, IF_REAL, "L offset for channel length due to mask/etch effect"),
IOP( "dlcig", BSIM4_MOD_DLCIG, IF_REAL, "Delta L for Ig model"),
IOP( "dwj", BSIM4_MOD_DWJ, IF_REAL, "Delta W for S/D junctions"),

View File

@ -1,12 +1,13 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4acld.c of BSIM4.1.0.
* Authors: Weidong Liu, Xiaodong Jin, Kanyu M. Cao, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4acld.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
* Modified by Xuemei Xi 10/05/2001
**********/
#include "ngspice.h"
@ -14,15 +15,16 @@
#include "cktdefs.h"
#include "bsim4def.h"
#include "sperror.h"
#include "suffix.h"
int
BSIM4acLoad(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
register CKTcircuit *ckt;
{
BSIM4model *model = (BSIM4model*)inModel;
BSIM4instance *here;
register BSIM4model *model = (BSIM4model*)inModel;
register BSIM4instance *here;
double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb;
double xcbgb, xcbdb, xcbsb, xcbbb;
@ -50,13 +52,13 @@ double gmr, gmi, gmbsr, gmbsi, gdsr, gdsi;
double FwdSumr, RevSumr, Gmr, Gmbsr, Gdsr;
double FwdSumi, RevSumi, Gmi, Gmbsi, Gdsi;
struct bsim4SizeDependParam *pParam;
double ggidld, ggidlg, ggidlb,ggisld, ggislg, ggislb, ggisls;
omega = ckt->CKTomega;
for (; model != NULL; model = model->BSIM4nextModel)
{ for (here = model->BSIM4instances; here!= NULL;
here = here->BSIM4nextInstance)
{ if (here->BSIM4owner != ARCHme) continue;
pParam = here->pParam;
{ pParam = here->pParam;
capbd = here->BSIM4capbd;
capbs = here->BSIM4capbs;
cgso = here->BSIM4cgso;
@ -148,13 +150,12 @@ struct bsim4SizeDependParam *pParam;
FwdSumi = Gmi + Gmbsi;
RevSumi = 0.0;
gbbdp = -(here->BSIM4gbds + here->BSIM4ggidld);
gbbsp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs
- here->BSIM4ggidls;
gbdpg = here->BSIM4gbgs + here->BSIM4ggidlg;
gbdpdp = here->BSIM4gbds + here->BSIM4ggidld;
gbdpb = here->BSIM4gbbs + here->BSIM4ggidlb;
gbdpsp = -(gbdpg + gbdpdp + gbdpb) + here->BSIM4ggidls;
gbbdp = -(here->BSIM4gbds);
gbbsp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs;
gbdpg = here->BSIM4gbgs;
gbdpdp = here->BSIM4gbds;
gbdpb = here->BSIM4gbbs;
gbdpsp = -(gbdpg + gbdpdp + gbdpb);
gbspdp = 0.0;
gbspg = 0.0;
@ -292,19 +293,18 @@ struct bsim4SizeDependParam *pParam;
FwdSumi = 0.0;
RevSumi = -(Gmi + Gmbsi);
gbbsp = -(here->BSIM4gbds + here->BSIM4ggidld);
gbbdp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs
- here->BSIM4ggidls;
gbbsp = -(here->BSIM4gbds);
gbbdp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs;
gbdpg = 0.0;
gbdpsp = 0.0;
gbdpb = 0.0;
gbdpdp = 0.0;
gbspg = here->BSIM4gbgs + here->BSIM4ggidlg;
gbspsp = here->BSIM4gbds + here->BSIM4ggidld;
gbspb = here->BSIM4gbbs + here->BSIM4ggidlb;
gbspdp = -(gbspg + gbspsp + gbspb) + here->BSIM4ggidls;
gbspg = here->BSIM4gbgs;
gbspsp = here->BSIM4gbds;
gbspb = here->BSIM4gbbs;
gbspdp = -(gbspg + gbspsp + gbspb);
if (model->BSIM4igcMod)
{ gIstotg = here->BSIM4gIgsg + here->BSIM4gIgcdg;
@ -577,12 +577,37 @@ struct bsim4SizeDependParam *pParam;
*(here->BSIM4BPdpPtr +1) += xcbdb;
*(here->BSIM4BPdpPtr) -= gjbd - gbbdp + gIbtotd;
*(here->BSIM4BPgpPtr +1) += xcbgb;
*(here->BSIM4BPgpPtr) -= here->BSIM4gbgs + here->BSIM4ggidlg + gIbtotg;
*(here->BSIM4BPgpPtr) -= here->BSIM4gbgs + gIbtotg;
*(here->BSIM4BPspPtr +1) += xcbsb;
*(here->BSIM4BPspPtr) -= gjbs - gbbsp + gIbtots;
*(here->BSIM4BPbpPtr +1) += xcbbb;
*(here->BSIM4BPbpPtr) += gjbd + gjbs - here->BSIM4gbbs
- here->BSIM4ggidlb - gIbtotb;
- gIbtotb;
ggidld = here->BSIM4ggidld;
ggidlg = here->BSIM4ggidlg;
ggidlb = here->BSIM4ggidlb;
ggislg = here->BSIM4ggislg;
ggisls = here->BSIM4ggisls;
ggislb = here->BSIM4ggislb;
/* stamp gidl */
(*(here->BSIM4DPdpPtr) += ggidld);
(*(here->BSIM4DPgpPtr) += ggidlg);
(*(here->BSIM4DPspPtr) -= (ggidlg + ggidld) + ggidlb);
(*(here->BSIM4DPbpPtr) += ggidlb);
(*(here->BSIM4BPdpPtr) -= ggidld);
(*(here->BSIM4BPgpPtr) -= ggidlg);
(*(here->BSIM4BPspPtr) += (ggidlg + ggidld) + ggidlb);
(*(here->BSIM4BPbpPtr) -= ggidlb);
/* stamp gisl */
(*(here->BSIM4SPdpPtr) -= (ggisls + ggislg) + ggislb);
(*(here->BSIM4SPgpPtr) += ggislg);
(*(here->BSIM4SPspPtr) += ggisls);
(*(here->BSIM4SPbpPtr) += ggislb);
(*(here->BSIM4BPdpPtr) += (ggislg + ggisls) + ggislb);
(*(here->BSIM4BPgpPtr) -= ggislg);
(*(here->BSIM4BPspPtr) -= ggisls);
(*(here->BSIM4BPbpPtr) -= ggislb);
if (here->BSIM4rbodyMod)
{ (*(here->BSIM4DPdbPtr +1) += xcdbdb);

View File

@ -1,12 +1,13 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4ask.c of BSIM4.1.0.
* Authors: Weidong Liu, Kanyu M. Cao, Xiaodong Jin, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4ask.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
* Modified by Xuemei Xi, 10/05/2001.
**********/
#include "ngspice.h"
@ -17,6 +18,7 @@
#include "devdefs.h"
#include "bsim4def.h"
#include "sperror.h"
#include "suffix.h"
int
BSIM4ask(ckt,inst,which,value,select)
@ -164,6 +166,30 @@ BSIM4instance *here = (BSIM4instance*)inst;
case BSIM4_CBD:
value->rValue = here->BSIM4cbd;
return(OK);
case BSIM4_CSUB:
value->rValue = here->BSIM4csub;
return(OK);
case BSIM4_IGIDL:
value->rValue = here->BSIM4Igidl;
return(OK);
case BSIM4_IGISL:
value->rValue = here->BSIM4Igisl;
return(OK);
case BSIM4_IGS:
value->rValue = here->BSIM4Igs;
return(OK);
case BSIM4_IGD:
value->rValue = here->BSIM4Igd;
return(OK);
case BSIM4_IGB:
value->rValue = here->BSIM4Igb;
return(OK);
case BSIM4_IGCS:
value->rValue = here->BSIM4Igcs;
return(OK);
case BSIM4_IGCD:
value->rValue = here->BSIM4Igcd;
return(OK);
case BSIM4_GM:
value->rValue = here->BSIM4gm;
return(OK);
@ -181,7 +207,7 @@ BSIM4instance *here = (BSIM4instance*)inst;
return(OK);
case BSIM4_QB:
value->rValue = *(ckt->CKTstate0 + here->BSIM4qb);
return(OK);
return(OK);
case BSIM4_CQB:
value->rValue = *(ckt->CKTstate0 + here->BSIM4cqb);
return(OK);
@ -193,29 +219,32 @@ BSIM4instance *here = (BSIM4instance*)inst;
return(OK);
case BSIM4_QD:
value->rValue = *(ckt->CKTstate0 + here->BSIM4qd);
return(OK);
return(OK);
case BSIM4_CQD:
value->rValue = *(ckt->CKTstate0 + here->BSIM4cqd);
return(OK);
case BSIM4_CGG:
case BSIM4_QS:
value->rValue = *(ckt->CKTstate0 + here->BSIM4qs);
return(OK);
case BSIM4_CGGB:
value->rValue = here->BSIM4cggb;
return(OK);
case BSIM4_CGD:
case BSIM4_CGDB:
value->rValue = here->BSIM4cgdb;
return(OK);
case BSIM4_CGS:
case BSIM4_CGSB:
value->rValue = here->BSIM4cgsb;
return(OK);
case BSIM4_CDG:
case BSIM4_CDGB:
value->rValue = here->BSIM4cdgb;
return(OK);
case BSIM4_CDD:
case BSIM4_CDDB:
value->rValue = here->BSIM4cddb;
return(OK);
case BSIM4_CDS:
case BSIM4_CDSB:
value->rValue = here->BSIM4cdsb;
return(OK);
case BSIM4_CBG:
case BSIM4_CBGB:
value->rValue = here->BSIM4cbgb;
return(OK);
case BSIM4_CBDB:
@ -224,6 +253,27 @@ BSIM4instance *here = (BSIM4instance*)inst;
case BSIM4_CBSB:
value->rValue = here->BSIM4cbsb;
return(OK);
case BSIM4_CSGB:
value->rValue = here->BSIM4csgb;
return(OK);
case BSIM4_CSDB:
value->rValue = here->BSIM4csdb;
return(OK);
case BSIM4_CSSB:
value->rValue = here->BSIM4cssb;
return(OK);
case BSIM4_CGBB:
value->rValue = here->BSIM4cgbb;
return(OK);
case BSIM4_CDBB:
value->rValue = here->BSIM4cdbb;
return(OK);
case BSIM4_CSBB:
value->rValue = here->BSIM4csbb;
return(OK);
case BSIM4_CBBB:
value->rValue = here->BSIM4cbbb;
return(OK);
case BSIM4_CAPBD:
value->rValue = here->BSIM4capbd;
return(OK);

View File

@ -1,12 +1,13 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4check.c of BSIM4.1.0.
* Authors: Weidong Liu, Kanyu M. Cao, Xiaodong Jin, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4check.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
* Modified by Xuemei Xi, 04/06/2001.
* Modified by Xuemei Xi, 10/05/2001.
**********/
#include "ngspice.h"
@ -18,12 +19,12 @@
#include "const.h"
#include "sperror.h"
#include "devdefs.h"
#include "suffix.h"
int
BSIM4checkModel(model, here, ckt)
BSIM4model *model;
BSIM4instance *here;
register BSIM4model *model;
register BSIM4instance *here;
CKTcircuit *ckt;
{
struct bsim4SizeDependParam *pParam;
@ -33,22 +34,22 @@ FILE *fplog;
if ((fplog = fopen("bsim4.out", "w")) != NULL)
{ pParam = here->pParam;
fprintf(fplog, "BSIM4: Berkeley Short Channel IGFET Model-4\n");
fprintf(fplog, "Developed by Dr. Weidong Liu, Xiaodong Jin, Kanyu M. Cao and Prof. Chenming Hu in 2000.\n");
fprintf(fplog, "Developed by Weidong Liu, Xuemei Xi , Xiaodong Jin, Kanyu M. Cao and Prof. Chenming Hu in 2001.\n");
fprintf(fplog, "\n");
fprintf(fplog, "++++++++++ BSIM4 PARAMETER CHECKING BELOW ++++++++++\n");
if (strcmp(model->BSIM4version, "4.1.0") != 0)
{ fprintf(fplog, "Warning: This model is BSIM4.1.0; you specified a wrong version number.\n");
printf("Warning: This model is BSIM4.1.0; you specified a wrong version number.\n");
if (strcmp(model->BSIM4version, "4.2.1") != 0)
{ fprintf(fplog, "Warning: This model is BSIM4.2.1; you specified a wrong version number.\n");
printf("Warning: This model is BSIM4.2.1; you specified a wrong version number.\n");
}
fprintf(fplog, "Model = %s\n", model->BSIM4modName);
if ((here->BSIM4rgateMod == 2) || (here->BSIM4rgateMod == 3))
{ if ((here->BSIM4trnqsMod == 1) || (here->BSIM4acnqsMod == 1))
{ fprintf(fplog, "Warning: You've selected both Rg and charge deficit NQS; select one only.\n");
printf("Warning: You've selected both Rg and charge deficit NQS; select one only.\n");
}
{ fprintf(fplog, "Warning: You've selected both Rg and charge deficit NQS; select one only.\n");
printf("Warning: You've selected both Rg and charge deficit NQS; select one only.\n");
}
}
@ -210,11 +211,10 @@ FILE *fplog;
printf("Fatal: Number of finger = %g is smaller than one.\n", here->BSIM4nf);
Fatal_Flag = 1;
}
if (here->BSIM4l <= model->BSIM4xgl)
{ fprintf(fplog, "Fatal: The parameter xgl must be smaller than Ldrawn.\n");
printf("Fatal: The parameter xgl must be smaller than Ldrawn.\n");
if ((here->BSIM4l + model->BSIM4xl) <= model->BSIM4xgl)
{ fprintf(fplog, "Fatal: The parameter xgl must be smaller than Ldrawn+XL.\n");
printf("Fatal: The parameter xgl must be smaller than Ldrawn+XL.\n");
Fatal_Flag = 1;
}
if (model->BSIM4ngcon < 1.0)
@ -273,64 +273,65 @@ FILE *fplog;
pParam->BSIM4moin);
printf("Warning: Moin = %g is too large.\n", pParam->BSIM4moin);
}
if (pParam->BSIM4acde < 0.4)
{ fprintf(fplog, "Warning: Acde = %g is too small.\n",
pParam->BSIM4acde);
printf("Warning: Acde = %g is too small.\n", pParam->BSIM4acde);
}
if (pParam->BSIM4acde > 1.6)
{ fprintf(fplog, "Warning: Acde = %g is too large.\n",
pParam->BSIM4acde);
printf("Warning: Acde = %g is too large.\n", pParam->BSIM4acde);
}
if(model->BSIM4capMod ==2) {
if (pParam->BSIM4acde < 0.4)
{ fprintf(fplog, "Warning: Acde = %g is too small.\n",
pParam->BSIM4acde);
printf("Warning: Acde = %g is too small.\n", pParam->BSIM4acde);
}
if (pParam->BSIM4acde > 1.6)
{ fprintf(fplog, "Warning: Acde = %g is too large.\n",
pParam->BSIM4acde);
printf("Warning: Acde = %g is too large.\n", pParam->BSIM4acde);
}
}
if (model->BSIM4paramChk ==1)
{
/* Check L and W parameters */
if (pParam->BSIM4leff <= 5.0e-8)
{ fprintf(fplog, "Warning: Leff = %g may be too small.\n",
pParam->BSIM4leff);
printf("Warning: Leff = %g may be too small.\n",
if (pParam->BSIM4leff <= 1.0e-9)
{ fprintf(fplog, "Warning: Leff = %g <= 1.0e-9. Recommended Leff >= 1e-8 \n",
pParam->BSIM4leff);
printf("Warning: Leff = %g <= 1.0e-9. Recommended Leff >= 1e-8 \n",
pParam->BSIM4leff);
}
if (pParam->BSIM4leffCV <= 5.0e-8)
{ fprintf(fplog, "Warning: Leff for CV = %g may be too small.\n",
if (pParam->BSIM4leffCV <= 1.0e-9)
{ fprintf(fplog, "Warning: Leff for CV = %g <= 1.0e-9. Recommended LeffCV >=1e-8 \n",
pParam->BSIM4leffCV);
printf("Warning: Leff for CV = %g <= 1.0e-9. Recommended LeffCV >=1e-8 \n",
pParam->BSIM4leffCV);
printf("Warning: Leff for CV = %g may be too small.\n",
pParam->BSIM4leffCV);
}
if (pParam->BSIM4weff <= 1.0e-7)
{ fprintf(fplog, "Warning: Weff = %g may be too small.\n",
if (pParam->BSIM4weff <= 1.0e-9)
{ fprintf(fplog, "Warning: Weff = %g <= 1.0e-9. Recommended Weff >=1e-7 \n",
pParam->BSIM4weff);
printf("Warning: Weff = %g may be too small.\n",
printf("Warning: Weff = %g <= 1.0e-9. Recommended Weff >=1e-7 \n",
pParam->BSIM4weff);
}
if (pParam->BSIM4weffCV <= 1.0e-7)
{ fprintf(fplog, "Warning: Weff for CV = %g may be too small.\n",
if (pParam->BSIM4weffCV <= 1.0e-9)
{ fprintf(fplog, "Warning: Weff for CV = %g <= 1.0e-9. Recommended WeffCV >= 1e-7 \n",
pParam->BSIM4weffCV);
printf("Warning: Weff for CV = %g <= 1.0e-9. Recommended WeffCV >= 1e-7 \n",
pParam->BSIM4weffCV);
printf("Warning: Weff for CV = %g may be too small.\n",
pParam->BSIM4weffCV);
}
/* Check threshold voltage parameters */
if (model->BSIM4toxe < 1.0e-9)
{ fprintf(fplog, "Warning: Toxe = %g is less than 10A.\n",
if (model->BSIM4toxe < 1.0e-10)
{ fprintf(fplog, "Warning: Toxe = %g is less than 1A. Recommended Toxe >= 5A\n",
model->BSIM4toxe);
printf("Warning: Toxe = %g is less than 10A.\n", model->BSIM4toxe);
printf("Warning: Toxe = %g is less than 1A. Recommended Toxe >= 5A\n", model->BSIM4toxe);
}
if (model->BSIM4toxp < 1.0e-9)
{ fprintf(fplog, "Warning: Toxp = %g is less than 10A.\n",
if (model->BSIM4toxp < 1.0e-10)
{ fprintf(fplog, "Warning: Toxp = %g is less than 1A. Recommended Toxp >= 5A\n",
model->BSIM4toxp);
printf("Warning: Toxp = %g is less than 10A.\n", model->BSIM4toxp);
printf("Warning: Toxp = %g is less than 1A. Recommended Toxp >= 5A\n", model->BSIM4toxp);
}
if (model->BSIM4toxm < 1.0e-9)
{ fprintf(fplog, "Warning: Toxm = %g is less than 10A.\n",
if (model->BSIM4toxm < 1.0e-10)
{ fprintf(fplog, "Warning: Toxm = %g is less than 1A. Recommended Toxm >= 5A\n",
model->BSIM4toxm);
printf("Warning: Toxm = %g is less than 10A.\n", model->BSIM4toxm);
printf("Warning: Toxm = %g is less than 1A. Recommended Toxm >= 5A\n", model->BSIM4toxm);
}
if (pParam->BSIM4ndep <= 1.0e12)

View File

@ -1,10 +1,13 @@
/**** BSIM4.0.0, Released by Weidong Liu 3/24/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4cvtest.c of BSIM4.0.0.
* Authors: Weidong Liu, Kanyu M. Cao, Xiaodong Jin, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4cvtest.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Xuemei Xi, 10/05/2001.
**********/
#include "ngspice.h"
@ -16,15 +19,16 @@
#include "const.h"
#include "devdefs.h"
#include "sperror.h"
#include "suffix.h"
int
BSIM4convTest(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
register CKTcircuit *ckt;
{
BSIM4model *model = (BSIM4model*)inModel;
BSIM4instance *here;
register BSIM4model *model = (BSIM4model*)inModel;
register BSIM4instance *here;
double delvbd, delvbs, delvds, delvgd, delvgs;
double delvdbd, delvsbs;
double delvbd_jct, delvbs_jct;
@ -39,9 +43,7 @@ double tol0, tol1, tol2, tol3, tol4, tol5, tol6;
for (; model != NULL; model = model->BSIM4nextModel)
{ for (here = model->BSIM4instances; here != NULL ;
here=here->BSIM4nextInstance)
{
if (here->BSIM4owner != ARCHme) continue;
vds = model->BSIM4type
{ vds = model->BSIM4type
* (*(ckt->CKTrhsOld + here->BSIM4dNodePrime)
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime));
vgs = model->BSIM4type
@ -108,10 +110,11 @@ double tol0, tol1, tol2, tol3, tol4, tol5, tol6;
* delvds + here->BSIM4gIgbb * delvbs;
}
else
{ Idtot = here->BSIM4cd + here->BSIM4cbd;
cdhat = Idtot + here->BSIM4gbd * delvbd_jct + here->BSIM4gmbs
* delvbd + here->BSIM4gm * delvgd
- here->BSIM4gds * delvds;
{ Idtot = here->BSIM4cd + here->BSIM4cbd - here->BSIM4Igisl;
cdhat = Idtot + here->BSIM4gbd * delvbd_jct + here->BSIM4gmbs
* delvbd + here->BSIM4gm * delvgd
- here->BSIM4gds * delvds - here->BSIM4ggislg * vgd
- here->BSIM4ggislb * vbd + here->BSIM4ggisls * vds;
Igstot = here->BSIM4Igs + here->BSIM4Igcd;
cgshat = Igstot + here->BSIM4gIgsg * delvgs + here->BSIM4gIgcdg * delvgd
@ -167,18 +170,20 @@ double tol0, tol1, tol2, tol3, tol4, tol5, tol6;
}
Ibtot = here->BSIM4cbs + here->BSIM4cbd
- here->BSIM4Igidl - here->BSIM4csub;
- here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub;
if (here->BSIM4mode >= 0)
{ cbhat = Ibtot + here->BSIM4gbd * delvbd_jct
+ here->BSIM4gbs * delvbs_jct - (here->BSIM4gbbs + here->BSIM4ggidlb)
* delvbs - (here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs
- (here->BSIM4gbds + here->BSIM4ggidld) * delvds;
- (here->BSIM4gbds + here->BSIM4ggidld) * delvds
- here->BSIM4ggislg * delvgd - here->BSIM4ggislb* delvbd + here->BSIM4ggisls * delvds ;
}
else
{ cbhat = Ibtot + here->BSIM4gbs * delvbs_jct + here->BSIM4gbd
* delvbd_jct - (here->BSIM4gbbs + here->BSIM4ggidlb) * delvbd
- (here->BSIM4gbgs + here->BSIM4ggidlg) * delvgd
+ (here->BSIM4gbds + here->BSIM4ggidld) * delvds;
+ (here->BSIM4gbds + here->BSIM4ggidld) * delvds
- here->BSIM4ggislg * delvgs - here->BSIM4ggislb * delvbs + here->BSIM4ggisls * delvds;
}
tol6 = ckt->CKTreltol * MAX(fabs(cbhat),
fabs(Ibtot)) + ckt->CKTabstol;

View File

@ -1,12 +1,11 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/1/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4del.c of BSIM4.1.0.
* Authors: Weidong Liu, Kanyu M. Cao, Xiaodong Jin, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4del.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
**********/
#include "ngspice.h"
@ -14,6 +13,7 @@
#include "bsim4def.h"
#include "sperror.h"
#include "gendefs.h"
#include "suffix.h"
int

View File

@ -1,17 +1,17 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4dest.c of BSIM4.1.0.
* Authors: Weidong Liu, Kanyu M. Cao, Xiaodong Jin, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4dest.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
**********/
#include "ngspice.h"
#include <stdio.h>
#include "bsim4def.h"
#include "suffix.h"
void
BSIM4destroy(inModel)

View File

@ -1,12 +1,11 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4geo.c of BSIM4.1.0.
* Authors: Weidong Liu, Kanyu M. Cao, Xiaodong Jin, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4geo.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
**********/
#include "ngspice.h"
@ -261,7 +260,8 @@ double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0;
*Rtot = Rint;
else
*Rtot = Rint * Rend / (Rint + Rend);
if(*Rtot==0.0)
printf("Warning: Zero resistance returned from RdseffGeo\n");
return 0;
}

View File

@ -1,12 +1,11 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4getic.c of BSIM4.1.0.
* Authors: Weidong Liu, Kanyu M. Cao, Xiaodong Jin, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4getic.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
**********/
#include "ngspice.h"
@ -14,7 +13,7 @@
#include "cktdefs.h"
#include "bsim4def.h"
#include "sperror.h"
#include "suffix.h"
int
@ -27,8 +26,7 @@ BSIM4instance *here;
for (; model ; model = model->BSIM4nextModel)
{ for (here = model->BSIM4instances; here; here = here->BSIM4nextInstance)
{ if (here->BSIM4owner != ARCHme) continue;
if (!here->BSIM4icVDSGiven)
{ if (!here->BSIM4icVDSGiven)
{ here->BSIM4icVDS = *(ckt->CKTrhs + here->BSIM4dNode)
- *(ckt->CKTrhs + here->BSIM4sNode);
}

View File

@ -1,13 +1,14 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4ld.c of BSIM4.1.0.
* Author: Weidong Liu, Kanyu M. Cao, Xiaodong Jin, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4ld.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
******/
* Modified by Xuemei Xi, 10/05/2001.
**********/
#include "ngspice.h"
#include <stdio.h>
@ -18,7 +19,7 @@
#include "const.h"
#include "sperror.h"
#include "devdefs.h"
#include "suffix.h"
#define MAX_EXP 5.834617425e14
#define MIN_EXP 1.713908431e-15
@ -30,14 +31,15 @@
#define DELTA_3 0.02
#define DELTA_4 0.02
int BSIM4polyDepletion(double phi, double ngate,double coxe, double Vgs, double *Vgs_eff, double *dVgs_eff_dVg);
int
BSIM4load(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
register CKTcircuit *ckt;
{
BSIM4model *model = (BSIM4model*)inModel;
BSIM4instance *here;
register BSIM4model *model = (BSIM4model*)inModel;
register BSIM4instance *here;
double ceqgstot, dgstot_dvd, dgstot_dvg, dgstot_dvs, dgstot_dvb;
double ceqgdtot, dgdtot_dvd, dgdtot_dvg, dgdtot_dvs, dgdtot_dvb;
@ -94,7 +96,7 @@ double Igstot, cgshat, Igdtot, cgdhat, Igbtot, cgbhat;
double Vgs_eff, Vfb, dVbs_dVb, Vth_NarrowW;
double Phis, dPhis_dVb, sqrtPhis, dsqrtPhis_dVb, Vth, dVth_dVb, dVth_dVd;
double Vgst, dVgst_dVg, dVgst_dVb, dVgs_eff_dVg, Nvtms, Nvtmd;
double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3,Vtm;
double Vgdt, Vgsaddvth, Vgsaddvth2, Vgsaddvth1o3, Vtm;
double n, dn_dVb, dn_dVd, voffcv, noff, dnoff_dVd, dnoff_dVb;
double ExpArg, ExpArg1, V0, CoxWLcen, QovCox, LINK;
double DeltaPhi, dDeltaPhi_dVg;
@ -164,6 +166,10 @@ 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 ggidld, ggidlg, ggidlb,ggisld, ggislg, ggislb, ggisls;
double Igisl, Ggisld, Ggislg, Ggislb, Ggisls;
struct bsim4SizeDependParam *pParam;
int ByPass, ChargeComputationNeeded, error, Check, Check1, Check2;
@ -178,9 +184,7 @@ ChargeComputationNeeded =
for (; model != NULL; model = model->BSIM4nextModel)
{ for (here = model->BSIM4instances; here != NULL;
here = here->BSIM4nextInstance)
{
if (here->BSIM4owner != ARCHme) continue;
Check = Check1 = Check2 = 1;
{ Check = Check1 = Check2 = 1;
ByPass = 0;
pParam = here->pParam;
@ -375,11 +379,12 @@ for (; model != NULL; model = model->BSIM4nextModel)
+ (here->BSIM4gm + here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs
+ (here->BSIM4gds + here->BSIM4gbds + here->BSIM4ggidld) * delvds;
Ibtot = here->BSIM4cbs + here->BSIM4cbd
- here->BSIM4Igidl - here->BSIM4csub;
- here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub;
cbhat = Ibtot + here->BSIM4gbd * delvbd_jct
+ here->BSIM4gbs * delvbs_jct - (here->BSIM4gbbs + here->BSIM4ggidlb)
* delvbs - (here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs
- (here->BSIM4gbds + here->BSIM4ggidld) * delvds;
- (here->BSIM4gbds + here->BSIM4ggidld) * delvds
- here->BSIM4ggislg * delvgd - here->BSIM4ggislb* delvbd + here->BSIM4ggisls * delvds ;
Igstot = here->BSIM4Igs + here->BSIM4Igcs;
cgshat = Igstot + (here->BSIM4gIgsg + here->BSIM4gIgcsg) * delvgs
@ -394,16 +399,18 @@ for (; model != NULL; model = model->BSIM4nextModel)
* delvds + here->BSIM4gIgbb * delvbs;
}
else
{ Idtot = here->BSIM4cd + here->BSIM4cbd;
{ Idtot = here->BSIM4cd + here->BSIM4cbd - here->BSIM4Igisl;
cdhat = Idtot + here->BSIM4gbd * delvbd_jct + here->BSIM4gmbs
* delvbd + here->BSIM4gm * delvgd
- here->BSIM4gds * delvds;
- here->BSIM4gds * delvds - here->BSIM4ggislg * vgd
- here->BSIM4ggislb * vbd + here->BSIM4ggisls * vds;
Ibtot = here->BSIM4cbs + here->BSIM4cbd
- here->BSIM4Igidl - here->BSIM4csub;
- here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub;
cbhat = Ibtot + here->BSIM4gbs * delvbs_jct + here->BSIM4gbd
* delvbd_jct - (here->BSIM4gbbs + here->BSIM4ggidlb) * delvbd
- (here->BSIM4gbgs + here->BSIM4ggidlg) * delvgd
+ (here->BSIM4gbds + here->BSIM4ggidld) * delvds;
+ (here->BSIM4gbds + here->BSIM4ggidld) * delvds
- here->BSIM4ggislg * delvgs - here->BSIM4ggislb * delvbs + here->BSIM4ggisls * delvds;
Igstot = here->BSIM4Igs + here->BSIM4Igcd;
cgshat = Igstot + here->BSIM4gIgsg * delvgs + here->BSIM4gIgcdg * delvgd
@ -428,6 +435,7 @@ for (; model != NULL; model = model->BSIM4nextModel)
+ here->BSIM4gdtotd * delvds + here->BSIM4gdtotg * delvgs
+ here->BSIM4gdtotb * delvbs;
#ifndef NOBYPASS
/* Following should be one IF statement, but some C compilers
* can't handle that all at once, so we split it into several
@ -521,6 +529,7 @@ for (; model != NULL; model = model->BSIM4nextModel)
goto line850;
}
#endif /*NOBYPASS*/
von = here->BSIM4von;
if (*(ckt->CKTstate0 + here->BSIM4vds) >= 0.0)
{ vgs = DEVfetlim(vgs, *(ckt->CKTstate0 + here->BSIM4vgs), von);
@ -918,7 +927,7 @@ for (; model != NULL; model = model->BSIM4nextModel)
T3 = T2 * T2;
T4 = T3 + 2.0 * T1 * MIN_EXP;
T5 = T1 / T4;
dT1_dVb = -T0 * T1 * dlt1_dVb / lt1;
dT1_dVb = -T0 * T1 * dltw_dVb / ltw; /* bugfix -JX */
dT5_dVb = dT1_dVb * (T4 - 2.0 * T1 * (T2 + MIN_EXP)) / T4 / T4;
}
else
@ -1015,24 +1024,24 @@ for (; model != NULL; model = model->BSIM4nextModel)
/* Poly Gate Si Depletion Effect */
T0 = pParam->BSIM4vfb + pParam->BSIM4phi;
if ((pParam->BSIM4ngate > 1.0e18)
&& (pParam->BSIM4ngate < 1.0e25) && (Vgs > T0))
{ T1 = 1.0e6 * Charge_q * EPSSI * pParam->BSIM4ngate
/ (model->BSIM4coxe * model->BSIM4coxe);
T8 = Vgs - T0;
T4 = sqrt(1.0 + 2.0 * T8 / T1);
T2 = 2.0 * T8 / (T4 + 1.0);
T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */
T7 = 1.12 - T3 - 0.05;
T6 = sqrt(T7 * T7 + 0.224);
T5 = 1.12 - 0.5 * (T7 + T6);
Vgs_eff = Vgs - T5;
dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6);
}
else
{ Vgs_eff = Vgs;
dVgs_eff_dVg = 1.0;
}
BSIM4polyDepletion(T0, pParam->BSIM4ngate, model->BSIM4coxe, vgs, &vgs_eff, &dvgs_eff_dvg);
BSIM4polyDepletion(T0, pParam->BSIM4ngate, model->BSIM4coxe, vgd, &vgd_eff, &dvgd_eff_dvg);
if(here->BSIM4mode>0) {
Vgs_eff = vgs_eff;
dVgs_eff_dVg = dvgs_eff_dvg;
} else {
Vgs_eff = vgd_eff;
dVgs_eff_dVg = dvgd_eff_dvg;
}
here->BSIM4vgs_eff = vgs_eff;
here->BSIM4vgd_eff = vgd_eff;
here->BSIM4dvgs_eff_dvg = dvgs_eff_dvg;
here->BSIM4dvgd_eff_dvg = dvgd_eff_dvg;
Vgst = Vgs_eff - Vth;
/* Calculate Vgsteff */
@ -1852,14 +1861,17 @@ for (; model != NULL; model = model->BSIM4nextModel)
}
/* Calculate GIDL current */
vgs_eff = here->BSIM4vgs_eff;
dvgs_eff_dvg = here->BSIM4dvgs_eff_dvg;
T0 = 3.0 * model->BSIM4toxe;
T1 = (Vds - Vgs_eff - pParam->BSIM4egidl) / T0;
if ((pParam->BSIM4agidl <= 0.0) || (pParam->BSIM4bgidl <= 0.0) || (T1 < 0.0)
|| (pParam->BSIM4cgidl <= 0.0) || (Vdb < 0.0))
T1 = (vds - vgs_eff - pParam->BSIM4egidl ) / T0;
if ((pParam->BSIM4agidl <= 0.0) || (pParam->BSIM4bgidl <= 0.0)
|| (T1 <= 0.0) || (pParam->BSIM4cgidl <= 0.0) || (vbd > 0.0))
Igidl = Ggidld = Ggidlg = Ggidlb = 0.0;
else
{ dT1_dVd = 1.0 / T0;
dT1_dVg = -dVgs_eff_dVg * dT1_dVd;
else {
dT1_dVd = 1.0 / T0;
dT1_dVg = -dvgs_eff_dvg * dT1_dVd;
T2 = pParam->BSIM4bgidl / T1;
if (T2 < 100.0)
{ Igidl = pParam->BSIM4agidl * pParam->BSIM4weffCJ * T1 * exp(-T2);
@ -1867,28 +1879,69 @@ for (; model != NULL; model = model->BSIM4nextModel)
Ggidld = T3 * dT1_dVd;
Ggidlg = T3 * dT1_dVg;
}
else
else
{ Igidl = pParam->BSIM4agidl * pParam->BSIM4weffCJ * 3.720075976e-44;
Ggidld = Igidl * dT1_dVd;
Ggidlg = Igidl * dT1_dVg;
Igidl *= T1;
}
T4 = Vdb * Vdb;
T5 = Vdb * T4;
T4 = vbd * vbd;
T5 = -vbd * T4;
T6 = pParam->BSIM4cgidl + T5;
T7 = T5 / T6;
T8 = 3.0 * pParam->BSIM4cgidl * T4 / T6 / T6;
Ggidld = Ggidld * T7 + Igidl * T8;
Ggidlg = Ggidlg * T7;
Ggidlb = -Igidl * T8;
Igidl *= T7;
T7 = T5 / T6;
T8 = 3.0 * pParam->BSIM4cgidl * T4 / T6 / T6;
Ggidld = Ggidld * T7 + Igidl * T8;
Ggidlg = Ggidlg * T7;
Ggidlb = -Igidl * T8;
Igidl *= T7;
}
here->BSIM4Igidl = Igidl;
here->BSIM4ggidld = Ggidld;
here->BSIM4ggidld = Ggidld;
here->BSIM4ggidlg = Ggidlg;
here->BSIM4ggidlb = Ggidlb;
/* Calculate GISL current: bugfix recommended by TI -JX */
vgd_eff = here->BSIM4vgd_eff;
dvgd_eff_dvg = here->BSIM4dvgd_eff_dvg;
T1 = (-vds - vgd_eff - pParam->BSIM4egidl ) / T0;
if ((pParam->BSIM4agidl <= 0.0) || (pParam->BSIM4bgidl <= 0.0)
|| (T1 <= 0.0) || (pParam->BSIM4cgidl <= 0.0) || (vbs > 0.0))
Igisl = Ggisls = Ggislg = Ggislb = 0.0;
else {
dT1_dVd = 1.0 / T0;
dT1_dVg = -dvgd_eff_dvg * dT1_dVd;
T2 = pParam->BSIM4bgidl / T1;
if (T2 < 100.0)
{ Igisl = pParam->BSIM4agidl * pParam->BSIM4weffCJ * T1 * exp(-T2);
T3 = Igisl * (1.0 + T2) / T1;
Ggisls = T3 * dT1_dVd;
Ggislg = T3 * dT1_dVg;
}
else
{ Igisl = pParam->BSIM4agidl * pParam->BSIM4weffCJ * 3.720075976e-44;
Ggisls = Igisl * dT1_dVd;
Ggislg = Igisl * dT1_dVg;
Igisl *= T1;
}
T4 = vbs * vbs;
T5 = -vbs * T4;
T6 = pParam->BSIM4cgidl + T5;
T7 = T5 / T6;
T8 = 3.0 * pParam->BSIM4cgidl * T4 / T6 / T6;
Ggisls = Ggisls * T7 + Igisl * T8;
Ggislg = Ggislg * T7;
Ggislb = -Igisl * T8;
Igisl *= T7;
}
here->BSIM4Igisl = Igisl;
here->BSIM4ggisls = Ggisls;
here->BSIM4ggislg = Ggislg;
here->BSIM4ggislb = Ggislb;
/* Calculate gate tunneling current */
if ((model->BSIM4igcMod != 0) || (model->BSIM4igbMod != 0))
@ -1993,75 +2046,74 @@ for (; model != NULL; model = model->BSIM4nextModel)
dIgc_dVd = T11 * (T2 * dT6_dVd + T6 * dT2_dVd);
dIgc_dVb = T11 * (T2 * dT6_dVb + T6 * dT2_dVb);
if (model->BSIM4pigcdGiven)
{ Pigcd = pParam->BSIM4pigcd;
dPigcd_dVg = dPigcd_dVd = dPigcd_dVb = 0.0;
}
else
{ T11 = pParam->BSIM4Bechvb * model->BSIM4toxe;
T12 = Vgsteff + 1.0e-20;
T13 = T11 / T12 / T12;
T14 = -T13 / T12;
Pigcd = T13 * (1.0 - 0.5 * Vdseff / T12);
dPigcd_dVg = T14 * (2.0 + 0.5 * (dVdseff_dVg
* Vgsteff - 3.0 * Vdseff) / T12);
dPigcd_dVd = 0.5 * T14 * dVdseff_dVd
+ dPigcd_dVg * dVgsteff_dVd;
dPigcd_dVb = 0.5 * T14 * dVdseff_dVb
+ dPigcd_dVg * dVgsteff_dVb;
dPigcd_dVg *= dVgsteff_dVg;
}
T7 = -Pigcd * Vds;
dT7_dVg = -Vds * dPigcd_dVg;
dT7_dVd = -Pigcd - Vds * dPigcd_dVd;
dT7_dVb = -Vds * dPigcd_dVb;
T8 = T7 * T7 + 2.0e-4;
dT8_dVg = 2.0 * T7;
dT8_dVd = dT8_dVg * dT7_dVd;
dT8_dVb = dT8_dVg * dT7_dVb;
dT8_dVg *= dT7_dVg;
if (T7 > EXP_THRESHOLD)
{ T9 = MAX_EXP;
dT9_dVg = dT9_dVd = dT9_dVb = 0.0;
}
else if (T7 < -EXP_THRESHOLD)
{ T9 = MIN_EXP;
dT9_dVg = dT9_dVd = dT9_dVb = 0.0;
}
else
{ T9 = exp(T7);
dT9_dVg = T9 * dT7_dVg;
dT9_dVd = T9 * dT7_dVd;
dT9_dVb = T9 * dT7_dVb;
}
T0 = T8 * T8;
T1 = T9 - 1.0 + 1.0e-4;
T10 = (T1 - T7) / T8;
dT10_dVg = (dT9_dVg - dT7_dVg - T10 * dT8_dVg) / T8;
dT10_dVd = (dT9_dVd - dT7_dVd - T10 * dT8_dVd) / T8;
dT10_dVb = (dT9_dVb - dT7_dVb - T10 * dT8_dVb) / T8;
Igcs = Igc * T10;
dIgcs_dVg = dIgc_dVg * T10 + Igc * dT10_dVg;
dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
dIgcs_dVb = dIgc_dVb * T10 + Igc * dT10_dVb;
T1 = T9 - 1.0 - 1.0e-4;
T10 = (T7 * T9 - T1) / T8;
dT10_dVg = (dT7_dVg * T9 + (T7 - 1.0) * dT9_dVg
- T10 * dT8_dVg) / T8;
dT10_dVd = (dT7_dVd * T9 + (T7 - 1.0) * dT9_dVd
- T10 * dT8_dVd) / T8;
dT10_dVb = (dT7_dVb * T9 + (T7 - 1.0) * dT9_dVb
- T10 * dT8_dVb) / T8;
Igcd = Igc * T10;
dIgcd_dVg = dIgc_dVg * T10 + Igc * dT10_dVg;
dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
dIgcd_dVb = dIgc_dVb * T10 + Igc * dT10_dVb;
if (model->BSIM4pigcdGiven)
{ Pigcd = pParam->BSIM4pigcd;
dPigcd_dVg = dPigcd_dVd = dPigcd_dVb = 0.0;
}
else
{ T11 = pParam->BSIM4Bechvb * model->BSIM4toxe;
T12 = Vgsteff + 1.0e-20;
T13 = T11 / T12 / T12;
T14 = -T13 / T12;
Pigcd = T13 * (1.0 - 0.5 * Vdseff / T12);
dPigcd_dVg = T14 * (2.0 + 0.5 * (dVdseff_dVg
* Vgsteff - 3.0 * Vdseff) / T12);
dPigcd_dVd = 0.5 * T14 * dVdseff_dVd
+ dPigcd_dVg * dVgsteff_dVd;
dPigcd_dVb = 0.5 * T14 * dVdseff_dVb
+ dPigcd_dVg * dVgsteff_dVb;
dPigcd_dVg *= dVgsteff_dVg;
}
T7 = -Pigcd * Vds;
dT7_dVg = -Vds * dPigcd_dVg;
dT7_dVd = -Pigcd - Vds * dPigcd_dVd;
dT7_dVb = -Vds * dPigcd_dVb;
T8 = T7 * T7 + 2.0e-4;
dT8_dVg = 2.0 * T7;
dT8_dVd = dT8_dVg * dT7_dVd;
dT8_dVb = dT8_dVg * dT7_dVb;
dT8_dVg *= dT7_dVg;
if (T7 > EXP_THRESHOLD)
{ T9 = MAX_EXP;
dT9_dVg = dT9_dVd = dT9_dVb = 0.0;
}
else if (T7 < -EXP_THRESHOLD)
{ T9 = MIN_EXP;
dT9_dVg = dT9_dVd = dT9_dVb = 0.0;
}
else
{ T9 = exp(T7);
dT9_dVg = T9 * dT7_dVg;
dT9_dVd = T9 * dT7_dVd;
dT9_dVb = T9 * dT7_dVb;
}
T0 = T8 * T8;
T1 = T9 - 1.0 + 1.0e-4;
T10 = (T1 - T7) / T8;
dT10_dVg = (dT9_dVg - dT7_dVg - T10 * dT8_dVg) / T8;
dT10_dVd = (dT9_dVd - dT7_dVd - T10 * dT8_dVd) / T8;
dT10_dVb = (dT9_dVb - dT7_dVb - T10 * dT8_dVb) / T8;
Igcs = Igc * T10;
dIgcs_dVg = dIgc_dVg * T10 + Igc * dT10_dVg;
dIgcs_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
dIgcs_dVb = dIgc_dVb * T10 + Igc * dT10_dVb;
T1 = T9 - 1.0 - 1.0e-4;
T10 = (T7 * T9 - T1) / T8;
dT10_dVg = (dT7_dVg * T9 + (T7 - 1.0) * dT9_dVg
- T10 * dT8_dVg) / T8;
dT10_dVd = (dT7_dVd * T9 + (T7 - 1.0) * dT9_dVd
- T10 * dT8_dVd) / T8;
dT10_dVb = (dT7_dVb * T9 + (T7 - 1.0) * dT9_dVb
- T10 * dT8_dVb) / T8;
Igcd = Igc * T10;
dIgcd_dVg = dIgc_dVg * T10 + Igc * dT10_dVg;
dIgcd_dVd = dIgc_dVd * T10 + Igc * dT10_dVd;
dIgcd_dVb = dIgc_dVb * T10 + Igc * dT10_dVb;
here->BSIM4Igcs = Igcs;
here->BSIM4gIgcsg = dIgcs_dVg;
@ -2072,7 +2124,6 @@ for (; model != NULL; model = model->BSIM4nextModel)
here->BSIM4gIgcdd = dIgcd_dVd;
here->BSIM4gIgcdb = dIgcd_dVb * dVbseff_dVb;
T0 = vgs - pParam->BSIM4vfbsd;
vgs_eff = sqrt(T0 * T0 + 1.0e-4);
dvgs_eff_dvg = T0 / vgs_eff;
@ -2280,6 +2331,11 @@ for (; model != NULL; model = model->BSIM4nextModel)
here->BSIM4ggidld *= here->BSIM4nf;
here->BSIM4ggidlg *= here->BSIM4nf;
here->BSIM4ggidlb *= here->BSIM4nf;
here->BSIM4Igisl *= here->BSIM4nf;
here->BSIM4ggisls *= here->BSIM4nf;
here->BSIM4ggislg *= here->BSIM4nf;
here->BSIM4ggislb *= here->BSIM4nf;
here->BSIM4Igcs *= here->BSIM4nf;
here->BSIM4gIgcsg *= here->BSIM4nf;
@ -2305,6 +2361,8 @@ for (; model != NULL; model = model->BSIM4nextModel)
here->BSIM4ggidls = -(here->BSIM4ggidld + here->BSIM4ggidlg
+ here->BSIM4ggidlb);
here->BSIM4ggisld = -(here->BSIM4ggisls + here->BSIM4ggislg
+ here->BSIM4ggislb);
here->BSIM4gIgbs = -(here->BSIM4gIgbg + here->BSIM4gIgbd
+ here->BSIM4gIgbb);
here->BSIM4gIgcss = -(here->BSIM4gIgcsg + here->BSIM4gIgcsd
@ -2314,40 +2372,42 @@ for (; model != NULL; model = model->BSIM4nextModel)
here->BSIM4cd = cdrain;
if (model->BSIM4tnoiMod == 0)
{ Abulk = Abulk0 * pParam->BSIM4abulkCVfactor;
Vdsat = Vgsteff / Abulk;
T0 = Vdsat - Vds - DELTA_4;
T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * Vdsat);
if (T0 >= 0.0)
Vdseff = Vdsat - 0.5 * (T0 + T1);
else
{ T3 = (DELTA_4 + DELTA_4) / (T1 - T0);
T4 = 1.0 - T3;
T5 = Vdsat * T3 / (T1 - T0);
Vdseff = Vdsat * T4;
}
if (Vds == 0.0)
Vdseff = 0.0;
T0 = Abulk * Vdseff;
T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20);
T2 = Vdseff / T1;
T3 = T0 * T2;
here->BSIM4qinv = Coxeff * pParam->BSIM4weffCV * here->BSIM4nf
* pParam->BSIM4leffCV
* (Vgsteff - 0.5 * T0 + Abulk * T3);
}
if (model->BSIM4tnoiMod == 0)
{ Abulk = Abulk0 * pParam->BSIM4abulkCVfactor;
Vdsat = Vgsteff / Abulk;
T0 = Vdsat - Vds - DELTA_4;
T1 = sqrt(T0 * T0 + 4.0 * DELTA_4 * Vdsat);
if (T0 >= 0.0)
Vdseff = Vdsat - 0.5 * (T0 + T1);
else
{ T3 = (DELTA_4 + DELTA_4) / (T1 - T0);
T4 = 1.0 - T3;
T5 = Vdsat * T3 / (T1 - T0);
Vdseff = Vdsat * T4;
}
if (Vds == 0.0)
Vdseff = 0.0;
T0 = Abulk * Vdseff;
T1 = 12.0 * (Vgsteff - 0.5 * T0 + 1.0e-20);
T2 = Vdseff / T1;
T3 = T0 * T2;
here->BSIM4qinv = Coxeff * pParam->BSIM4weffCV * here->BSIM4nf
* pParam->BSIM4leffCV
* (Vgsteff - 0.5 * T0 + Abulk * T3);
}
/*
* BSIM4 C-V begins
*/
if ((model->BSIM4xpart < 0) || (!ChargeComputationNeeded))
if ((model->BSIM4xpart < 0) || (!ChargeComputationNeeded))
{ qgate = qdrn = qsrc = qbulk = 0.0;
here->BSIM4cggb = here->BSIM4cgsb = here->BSIM4cgdb = 0.0;
here->BSIM4cdgb = here->BSIM4cdsb = here->BSIM4cddb = 0.0;
here->BSIM4cbgb = here->BSIM4cbsb = here->BSIM4cbdb = 0.0;
here->BSIM4csgb = here->BSIM4cssb = here->BSIM4csdb = 0.0;
here->BSIM4cgbb = here->BSIM4csbb = here->BSIM4cdbb = here->BSIM4cbbb = 0.0;
here->BSIM4cqdb = here->BSIM4cqsb = here->BSIM4cqgb
= here->BSIM4cqbb = 0.0;
here->BSIM4gtau = 0.0;
@ -2585,7 +2645,7 @@ for (; model != NULL; model = model->BSIM4nextModel)
here->BSIM4cbgb = -(here->BSIM4cggb
+ here->BSIM4cdgb + T12);
here->BSIM4cbdb = -(here->BSIM4cgdb
+ here->BSIM4cddb + T11);
+ here->BSIM4cddb + T10); /* bug fix */
here->BSIM4cbsb = -(here->BSIM4cgsb
+ here->BSIM4cdsb + tmp);
}
@ -3146,9 +3206,17 @@ for (; model != NULL; model = model->BSIM4nextModel)
} /* End of CTM */
}
here->BSIM4csgb = - here->BSIM4cggb - here->BSIM4cdgb - here->BSIM4cbgb;
here->BSIM4csdb = - here->BSIM4cgdb - here->BSIM4cddb - here->BSIM4cbdb;
here->BSIM4cssb = - here->BSIM4cgsb - here->BSIM4cdsb - here->BSIM4cbsb;
here->BSIM4cgbb = - here->BSIM4cgdb - here->BSIM4cggb - here->BSIM4cgsb;
here->BSIM4cdbb = - here->BSIM4cddb - here->BSIM4cdgb - here->BSIM4cdsb;
here->BSIM4cbbb = - here->BSIM4cbgb - here->BSIM4cbdb - here->BSIM4cbsb;
here->BSIM4csbb = - here->BSIM4cgbb - here->BSIM4cdbb - here->BSIM4cbbb;
here->BSIM4qgate = qgate;
here->BSIM4qbulk = qbulk;
here->BSIM4qdrn = qdrn;
here->BSIM4qsrc = -(qgate + qbulk + qdrn);
/* NQS begins */
if ((here->BSIM4trnqsMod) || (here->BSIM4acnqsMod))
@ -3183,13 +3251,13 @@ finished:
/* Calculate junction C-V */
if (ChargeComputationNeeded)
{ czbd = model->BSIM4DunitAreaJctCap * here->BSIM4Adeff;
czbs = model->BSIM4SunitAreaJctCap * here->BSIM4Aseff;
czbdsw = model->BSIM4DunitLengthSidewallJctCap * here->BSIM4Pdeff;
czbdswg = model->BSIM4DunitLengthGateSidewallJctCap
{ czbd = model->BSIM4DunitAreaTempJctCap * here->BSIM4Adeff; /* bug fix */
czbs = model->BSIM4SunitAreaTempJctCap * here->BSIM4Aseff;
czbdsw = model->BSIM4DunitLengthSidewallTempJctCap * here->BSIM4Pdeff;
czbdswg = model->BSIM4DunitLengthGateSidewallTempJctCap
* pParam->BSIM4weffCJ * here->BSIM4nf;
czbssw = model->BSIM4SunitLengthSidewallJctCap * here->BSIM4Pseff;
czbsswg = model->BSIM4SunitLengthGateSidewallJctCap
czbssw = model->BSIM4SunitLengthSidewallTempJctCap * here->BSIM4Pseff;
czbsswg = model->BSIM4SunitLengthGateSidewallTempJctCap
* pParam->BSIM4weffCJ * here->BSIM4nf;
MJS = model->BSIM4SbulkJctBotGradingCoeff;
@ -3308,6 +3376,46 @@ finished:
if ((here->BSIM4off == 0) || (!(ckt->CKTmode & MODEINITFIX)))
{ if (Check == 1)
{ ckt->CKTnoncon++;
#ifndef NEWCONV
}
else
{ if (here->BSIM4mode >= 0)
{ Idtot = here->BSIM4cd + here->BSIM4csub
+ here->BSIM4Igidl - here->BSIM4cbd;
}
else
{ Idtot = here->BSIM4cd + here->BSIM4cbd;
}
tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot))
+ ckt->CKTabstol;
tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot))
+ ckt->CKTabstol;
tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot))
+ ckt->CKTabstol;
tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot))
+ ckt->CKTabstol;
tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot))
+ ckt->CKTabstol;
tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot))
+ ckt->CKTabstol;
if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1)
|| (fabs(cdedhat - Idedtot) >= tol2))
{ ckt->CKTnoncon++;
}
else if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4)
|| (fabs(cgbhat - Igbtot) >= tol5))
{ ckt->CKTnoncon++;
}
else
{ Ibtot = here->BSIM4cbs + here->BSIM4cbd
- here->BSIM4Igidl - here->BSIM4Igisl - here->BSIM4csub;
tol6 = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot))
+ ckt->CKTabstol;
if (fabs(cbhat - Ibtot) > tol6)
{ ckt->CKTnoncon++;
}
}
#endif /* NEWCONV */
}
}
*(ckt->CKTstate0 + here->BSIM4vds) = vds;
@ -3327,24 +3435,12 @@ finished:
if (!ChargeComputationNeeded)
goto line850;
if (model->BSIM4capMod == 0)
{ if (vgd < 0.0)
{ cgdo = pParam->BSIM4cgdo;
if (model->BSIM4capMod == 0) /* code merge -JX */
{
cgdo = pParam->BSIM4cgdo;
qgdo = pParam->BSIM4cgdo * vgd;
}
else
{ cgdo = pParam->BSIM4cgdo;
qgdo = pParam->BSIM4cgdo * vgd;
}
if (vgs < 0.0)
{ cgso = pParam->BSIM4cgso;
cgso = pParam->BSIM4cgso;
qgso = pParam->BSIM4cgso * vgs;
}
else
{ cgso = pParam->BSIM4cgso;
qgso = pParam->BSIM4cgso * vgs;
}
}
else /* For both capMod == 1 and 2 */
{ T0 = vgd + DELTA_1;
@ -3781,6 +3877,8 @@ line755:
*(ckt->CKTstate0 + here->BSIM4qg) = qgate;
*(ckt->CKTstate0 + here->BSIM4qd) = qdrn
- *(ckt->CKTstate0 + here->BSIM4qbd);
*(ckt->CKTstate0 + here->BSIM4qs) = qsrc
- *(ckt->CKTstate0 + here->BSIM4qbs);
if (here->BSIM4rgateMod == 3)
*(ckt->CKTstate0 + here->BSIM4qgmid) = qgmid;
@ -3953,16 +4051,16 @@ line900:
- (here->BSIM4gbds + here->BSIM4ggidld) * vds
- (here->BSIM4gbgs + here->BSIM4ggidlg) * vgs
- (here->BSIM4gbbs + here->BSIM4ggidlb) * vbs);
ceqbs = 0.0;
ceqbs = model->BSIM4type * (here->BSIM4Igisl + here->BSIM4ggisls * vds
- here->BSIM4ggislg * vgd - here->BSIM4ggislb * vbd);
gbbdp = -(here->BSIM4gbds + here->BSIM4ggidld);
gbbsp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs
- here->BSIM4ggidls;
gbdpg = here->BSIM4gbgs + here->BSIM4ggidlg;
gbdpdp = here->BSIM4gbds + here->BSIM4ggidld;
gbdpb = here->BSIM4gbbs + here->BSIM4ggidlb;
gbdpsp = -(gbdpg + gbdpdp + gbdpb) + here->BSIM4ggidls;
gbbdp = -(here->BSIM4gbds);
gbbsp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs;
gbdpg = here->BSIM4gbgs;
gbdpdp = here->BSIM4gbds;
gbdpb = here->BSIM4gbbs;
gbdpsp = -(gbdpg + gbdpdp + gbdpb);
gbspg = 0.0;
gbspdp = 0.0;
@ -4040,25 +4138,25 @@ line900:
ceqdrn = -model->BSIM4type * (cdrain + here->BSIM4gds * vds
+ Gm * vgd + Gmbs * vbd);
ceqbs = model->BSIM4type * (here->BSIM4csub + here->BSIM4Igidl
+ (here->BSIM4gbds + here->BSIM4ggidld) * vds
- (here->BSIM4gbgs + here->BSIM4ggidlg) * vgd
- (here->BSIM4gbbs + here->BSIM4ggidlb) * vbd);
ceqbd = 0.0;
ceqbs = model->BSIM4type * (here->BSIM4csub + here->BSIM4Igisl
+ (here->BSIM4gbds + here->BSIM4ggisls) * vds
- (here->BSIM4gbgs + here->BSIM4ggislg) * vgd
- (here->BSIM4gbbs + here->BSIM4ggislb) * vbd);
ceqbd = model->BSIM4type * (here->BSIM4Igidl - here->BSIM4ggidld * vds
- here->BSIM4ggidlg * vgs - here->BSIM4ggidlb * vbs);
gbbsp = -(here->BSIM4gbds + here->BSIM4ggidld);
gbbdp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs
- here->BSIM4ggidls;
gbbsp = -(here->BSIM4gbds);
gbbdp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs;
gbdpg = 0.0;
gbdpsp = 0.0;
gbdpb = 0.0;
gbdpdp = 0.0;
gbspg = here->BSIM4gbgs + here->BSIM4ggidlg;
gbspsp = here->BSIM4gbds + here->BSIM4ggidld;
gbspb = here->BSIM4gbbs + here->BSIM4ggidlb;
gbspdp = -(gbspg + gbspsp + gbspb) + here->BSIM4ggidls;
gbspg = here->BSIM4gbgs;
gbspsp = here->BSIM4gbds;
gbspb = here->BSIM4gbbs;
gbspdp = -(gbspg + gbspsp + gbspb);
if (model->BSIM4igcMod)
{ gIstotg = here->BSIM4gIgsg + here->BSIM4gIgcdg;
@ -4319,10 +4417,37 @@ line900:
(*(here->BSIM4SsPtr) += gspr + gstot);
(*(here->BSIM4BPdpPtr) += gcbdb - gjbd + gbbdp - gIbtotd);
(*(here->BSIM4BPgpPtr) += gcbgb - here->BSIM4gbgs - here->BSIM4ggidlg - gIbtotg);
(*(here->BSIM4BPgpPtr) += gcbgb - here->BSIM4gbgs - gIbtotg);
(*(here->BSIM4BPspPtr) += gcbsb - gjbs + gbbsp - gIbtots);
(*(here->BSIM4BPbpPtr) += gjbd + gjbs + gcbbb - here->BSIM4gbbs
- here->BSIM4ggidlb - gIbtotb);
- gIbtotb);
ggidld = here->BSIM4ggidld;
ggidlg = here->BSIM4ggidlg;
ggidlb = here->BSIM4ggidlb;
ggislg = here->BSIM4ggislg;
ggisls = here->BSIM4ggisls;
ggislb = here->BSIM4ggislb;
/* stamp gidl */
(*(here->BSIM4DPdpPtr) += ggidld);
(*(here->BSIM4DPgpPtr) += ggidlg);
(*(here->BSIM4DPspPtr) -= (ggidlg + ggidld + ggidlb));
(*(here->BSIM4DPbpPtr) += ggidlb);
(*(here->BSIM4BPdpPtr) -= ggidld);
(*(here->BSIM4BPgpPtr) -= ggidlg);
(*(here->BSIM4BPspPtr) += (ggidlg + ggidld + ggidlb));
(*(here->BSIM4BPbpPtr) -= ggidlb);
/* stamp gisl */
(*(here->BSIM4SPdpPtr) -= (ggisls + ggislg + ggislb));
(*(here->BSIM4SPgpPtr) += ggislg);
(*(here->BSIM4SPspPtr) += ggisls);
(*(here->BSIM4SPbpPtr) += ggislb);
(*(here->BSIM4BPdpPtr) += (ggislg + ggisls + ggislb));
(*(here->BSIM4BPgpPtr) -= ggislg);
(*(here->BSIM4BPspPtr) -= ggisls);
(*(here->BSIM4BPbpPtr) -= ggislb);
if (here->BSIM4rbodyMod)
{ (*(here->BSIM4DPdbPtr) += gcdbdb - here->BSIM4gbd);
@ -4373,3 +4498,35 @@ line1000: ;
return(OK);
}
/* function to compute poly depletion effect */
int BSIM4polyDepletion(
double phi,
double ngate,
double coxe,
double Vgs,
double *Vgs_eff,
double *dVgs_eff_dVg)
{
double T1, T2, T3, T4, T5, T6, T7, T8;
/* Poly Gate Si Depletion Effect */
if ((ngate > 1.0e18) &&
(ngate < 1.0e25) && (Vgs > phi)) {
T1 = 1.0e6 * CHARGE * EPSSI * ngate / (coxe * coxe);
T8 = Vgs - phi;
T4 = sqrt(1.0 + 2.0 * T8 / T1);
T2 = 2.0 * T8 / (T4 + 1.0);
T3 = 0.5 * T2 * T2 / T1; /* T3 = Vpoly */
T7 = 1.12 - T3 - 0.05;
T6 = sqrt(T7 * T7 + 0.224);
T5 = 1.12 - 0.5 * (T7 + T6);
*Vgs_eff = Vgs - T5;
*dVgs_eff_dVg = 1.0 - (0.5 - 0.5 / T4) * (1.0 + T7 / T6);
}
else {
*Vgs_eff = Vgs;
*dVgs_eff_dVg = 1.0;
}
return(0);
}

View File

@ -1,14 +1,14 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4mask.c of BSIM4.1.0.
* Authors: Weidong Liu, Xiaodong Jin, Kanyu M. Cao, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4mask.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
**********/
#include "ngspice.h"
#include <stdio.h>
#include "ifsim.h"
@ -16,7 +16,7 @@
#include "devdefs.h"
#include "bsim4def.h"
#include "sperror.h"
#include "suffix.h"
int
BSIM4mAsk(ckt,inst,which,value)
@ -519,6 +519,12 @@ IFvalue *value;
case BSIM4_MOD_DLC:
value->rValue = model->BSIM4dlc;
return(OK);
case BSIM4_MOD_XW:
value->rValue = model->BSIM4xw;
return(OK);
case BSIM4_MOD_XL:
value->rValue = model->BSIM4xl;
return(OK);
case BSIM4_MOD_DLCIG:
value->rValue = model->BSIM4dlcig;
return(OK);

View File

@ -1,18 +1,18 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4mdel.c of BSIM4.1.0.
* Authors: Weidong Liu, Kanyu M. Cao, Xiaodong Jin, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4mdel.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
**********/
#include "ngspice.h"
#include <stdio.h>
#include "bsim4def.h"
#include "sperror.h"
#include "suffix.h"
int
BSIM4mDelete(inModel,modname,kill)

View File

@ -1,12 +1,13 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4mpar.c of BSIM4.1.0.
* Authors: Weidong Liu, Kanyu M. Cao, Xiaodong Jin, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4mpar.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
* Modified by Xuemei Xi 04/06/2001
**********/
#include "ngspice.h"
@ -14,6 +15,7 @@
#include "bsim4def.h"
#include "ifsim.h"
#include "sperror.h"
#include "suffix.h"
#include "const.h"
int
@ -685,6 +687,14 @@ GENmodel *inMod;
mod->BSIM4dlc = value->rValue;
mod->BSIM4dlcGiven = TRUE;
break;
case BSIM4_MOD_XW :
mod->BSIM4xw = value->rValue;
mod->BSIM4xwGiven = TRUE;
break;
case BSIM4_MOD_XL :
mod->BSIM4xl = value->rValue;
mod->BSIM4xlGiven = TRUE;
break;
case BSIM4_MOD_DLCIG :
mod->BSIM4dlcig = value->rValue;
mod->BSIM4dlcigGiven = TRUE;

View File

@ -1,12 +1,13 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4noi.c of BSIM4.1.0.
* Authors: Weidong Liu, Xiaodong Jin, Kanyu M. Cao, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4noi.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
* Modified by Xuemei Xi, 10/05/2001.
**********/
#include "ngspice.h"
@ -16,6 +17,7 @@
#include "cktdefs.h"
#include "iferrmsg.h"
#include "noisedef.h"
#include "suffix.h"
#include "const.h"
@ -41,9 +43,12 @@ double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, Ssi;
pParam = here->pParam;
cd = fabs(here->BSIM4cd);
esat = 2.0 * pParam->BSIM4vsattemp / here->BSIM4ueff;
T0 = ((((Vds - here->BSIM4Vdseff) / pParam->BSIM4litl)
+ model->BSIM4em) / esat);
DelClm = pParam->BSIM4litl * log (MAX(T0, N_MINLOG));
if(model->BSIM4em<=0.0) DelClm = 0.0; /* flicker noise modified -JX */
else {
T0 = ((((Vds - here->BSIM4Vdseff) / pParam->BSIM4litl)
+ model->BSIM4em) / esat);
DelClm = pParam->BSIM4litl * log (MAX(T0, N_MINLOG));
}
EffFreq = pow(freq, model->BSIM4ef);
T1 = CHARGE * CHARGE * CONSTboltz * cd * temp * here->BSIM4ueff;
T2 = 1.0e10 * EffFreq * here->BSIM4Abulk * model->BSIM4coxe
@ -73,11 +78,11 @@ BSIM4noise (mode, operation, inModel, ckt, data, OnDens)
int mode, operation;
GENmodel *inModel;
CKTcircuit *ckt;
Ndata *data;
register Ndata *data;
double *OnDens;
{
BSIM4model *model = (BSIM4model *)inModel;
BSIM4instance *here;
register BSIM4model *model = (BSIM4model *)inModel;
register BSIM4instance *here;
struct bsim4SizeDependParam *pParam;
char name[N_MXVLNTH];
double tempOnoise;
@ -86,7 +91,7 @@ double noizDens[BSIM4NSRCS];
double lnNdens[BSIM4NSRCS];
double N0, Nl;
double T0, T1, T2, T5, T10, T11;
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13;
double Vds, n, ExpArg, Ssi, Swi;
double tmp, gdpr, gspr, npart_theta, npart_beta, igsquare;

View File

@ -1,12 +1,11 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4par.c of BSIM4.1.0.
* Authors: Weidong Liu, Kanyu M. Cao, Xiaodong Jin, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4par.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
**********/
#include "ngspice.h"
@ -14,7 +13,7 @@
#include "ifsim.h"
#include "bsim4def.h"
#include "sperror.h"
#include "suffix.h"
int
BSIM4param(param,value,inst,select)

View File

@ -1,12 +1,13 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4pzld.c of BSIM4.1.0.
* Authors: Weidong Liu, Kanyu M. Cao, Xiaodong Jin, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4pzld.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
* Modified by Xuemei Xi, 10/05/2001.
**********/
#include "ngspice.h"
@ -15,16 +16,16 @@
#include "complex.h"
#include "sperror.h"
#include "bsim4def.h"
#include "suffix.h"
int
BSIM4pzLoad(inModel,ckt,s)
GENmodel *inModel;
CKTcircuit *ckt;
SPcomplex *s;
register CKTcircuit *ckt;
register SPcomplex *s;
{
BSIM4model *model = (BSIM4model*)inModel;
BSIM4instance *here;
register BSIM4model *model = (BSIM4model*)inModel;
register BSIM4instance *here;
double gjbd, gjbs, geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb;
double xcggb, xcgdb, xcgsb, xcgbb, xcbgb, xcbdb, xcbsb, xcbbb;
@ -47,12 +48,13 @@ double dsxpart_dVd, dsxpart_dVg, dsxpart_dVb, dsxpart_dVs;
double T0, T1, CoxWL, qcheq, Cdg, Cdd, Cds, Cdb, Csg, Csd, Css, Csb;
double ScalingFactor = 1.0e-9;
struct bsim4SizeDependParam *pParam;
double ggidld, ggidlg, ggidlb,ggisld, ggislg, ggislb, ggisls;
for (; model != NULL; model = model->BSIM4nextModel)
{ for (here = model->BSIM4instances; here!= NULL;
here = here->BSIM4nextInstance)
{ if (here->BSIM4owner != ARCHme) continue;
pParam = here->pParam;
{ pParam = here->pParam;
capbd = here->BSIM4capbd;
capbs = here->BSIM4capbs;
cgso = here->BSIM4cgso;
@ -65,13 +67,12 @@ struct bsim4SizeDependParam *pParam;
FwdSum = Gm + Gmbs;
RevSum = 0.0;
gbbdp = -(here->BSIM4gbds + here->BSIM4ggidld);
gbbsp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs
- here->BSIM4ggidls;
gbdpg = here->BSIM4gbgs + here->BSIM4ggidlg;
gbdpdp = here->BSIM4gbds + here->BSIM4ggidld;
gbdpb = here->BSIM4gbbs + here->BSIM4ggidlb;
gbdpsp = -(gbdpg + gbdpdp + gbdpb) + here->BSIM4ggidls;
gbbdp = -(here->BSIM4gbds);
gbbsp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs;
gbdpg = here->BSIM4gbgs;
gbdpdp = here->BSIM4gbds;
gbdpb = here->BSIM4gbbs;
gbdpsp = -(gbdpg + gbdpdp + gbdpb);
gbspdp = 0.0;
gbspg = 0.0;
@ -264,19 +265,18 @@ struct bsim4SizeDependParam *pParam;
FwdSum = 0.0;
RevSum = -(Gm + Gmbs);
gbbsp = -(here->BSIM4gbds + here->BSIM4ggidld);
gbbdp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs
- here->BSIM4ggidls;
gbbsp = -(here->BSIM4gbds);
gbbdp = here->BSIM4gbds + here->BSIM4gbgs + here->BSIM4gbbs;
gbdpg = 0.0;
gbdpsp = 0.0;
gbdpb = 0.0;
gbdpdp = 0.0;
gbspg = here->BSIM4gbgs + here->BSIM4ggidlg;
gbspsp = here->BSIM4gbds + here->BSIM4ggidld;
gbspb = here->BSIM4gbbs + here->BSIM4ggidlb;
gbspdp = -(gbspg + gbspsp + gbspb) + here->BSIM4ggidls;
gbspg = here->BSIM4gbgs;
gbspsp = here->BSIM4gbds;
gbspb = here->BSIM4gbbs;
gbspdp = -(gbspg + gbspsp + gbspb);
if (model->BSIM4igcMod)
{ gIstotg = here->BSIM4gIgsg + here->BSIM4gIgcdg;
@ -652,14 +652,39 @@ struct bsim4SizeDependParam *pParam;
*(here->BSIM4BPdpPtr) -= gjbd - gbbdp + gIbtotd;
*(here->BSIM4BPgpPtr ) += xcbgb * s->real;
*(here->BSIM4BPgpPtr +1) += xcbgb * s->imag;
*(here->BSIM4BPgpPtr) -= here->BSIM4gbgs + here->BSIM4ggidlg + gIbtotg;
*(here->BSIM4BPgpPtr) -= here->BSIM4gbgs + gIbtotg;
*(here->BSIM4BPspPtr ) += xcbsb * s->real;
*(here->BSIM4BPspPtr +1) += xcbsb * s->imag;
*(here->BSIM4BPspPtr) -= gjbs - gbbsp + gIbtots;
*(here->BSIM4BPbpPtr ) += xcbbb * s->real;
*(here->BSIM4BPbpPtr +1) += xcbbb * s->imag;
*(here->BSIM4BPbpPtr) += gjbd + gjbs - here->BSIM4gbbs
- gIbtotb - here->BSIM4ggidlb;
- gIbtotb;
ggidld = here->BSIM4ggidld;
ggidlg = here->BSIM4ggidlg;
ggidlb = here->BSIM4ggidlb;
ggislg = here->BSIM4ggislg;
ggisls = here->BSIM4ggisls;
ggislb = here->BSIM4ggislb;
/* stamp gidl */
(*(here->BSIM4DPdpPtr) += ggidld);
(*(here->BSIM4DPgpPtr) += ggidlg);
(*(here->BSIM4DPspPtr) -= (ggidlg + ggidld) + ggidlb);
(*(here->BSIM4DPbpPtr) += ggidlb);
(*(here->BSIM4BPdpPtr) -= ggidld);
(*(here->BSIM4BPgpPtr) -= ggidlg);
(*(here->BSIM4BPspPtr) += (ggidlg + ggidld) + ggidlb);
(*(here->BSIM4BPbpPtr) -= ggidlb);
/* stamp gisl */
(*(here->BSIM4SPdpPtr) -= (ggisls + ggislg) + ggislb);
(*(here->BSIM4SPgpPtr) += ggislg);
(*(here->BSIM4SPspPtr) += ggisls);
(*(here->BSIM4SPbpPtr) += ggislb);
(*(here->BSIM4BPdpPtr) += (ggislg + ggisls) + ggislb);
(*(here->BSIM4BPgpPtr) -= ggislg);
(*(here->BSIM4BPspPtr) -= ggisls);
(*(here->BSIM4BPbpPtr) -= ggislb);
if (here->BSIM4rbodyMod)
{ (*(here->BSIM4DPdbPtr ) += xcdbdb * s->real);

View File

@ -1,23 +1,26 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4set.c of BSIM4.1.0.
* Authors: Weidong Liu, Xiaodong Jin, Kanyu M. Cao, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4set.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
* Modified by Xuemei Xi, 04/06/2001.
* Modified by Xuemei Xi, 10/05/2001.
**********/
#include "ngspice.h"
#include <stdio.h>
#include <math.h>
#include "jobdefs.h"
#include "ftedefs.h"
#include "smpdefs.h"
#include "cktdefs.h"
#include "bsim4def.h"
#include "const.h"
#include "sperror.h"
#include "suffix.h"
#define MAX_EXP 5.834617425e14
#define MIN_EXP 1.713908431e-15
@ -29,17 +32,27 @@
int
BSIM4setup(matrix,inModel,ckt,states)
SMPmatrix *matrix;
GENmodel *inModel;
CKTcircuit *ckt;
register SMPmatrix *matrix;
register GENmodel *inModel;
register CKTcircuit *ckt;
int *states;
{
BSIM4model *model = (BSIM4model*)inModel;
BSIM4instance *here;
register BSIM4model *model = (BSIM4model*)inModel;
register BSIM4instance *here;
int error;
CKTnode *tmp;
double tmp1, tmp2;
int noiseAnalGiven = 0, createNode; /* Criteria for new node creation */
double Rtot, DMCGeff, DMCIeff, DMDGeff;
JOB *job;
/* Search for a noise analysis request */
for (job = ((TSKtask *)(ft_curckt->ci_curTask))->jobs;job;job = job->JOBnextJob) {
if(strcmp(job->JOBname,"Noise Analysis")==0) {
noiseAnalGiven = 1;
break;
}
}
/* loop through all the BSIM4 device models */
for( ; model != NULL; model = model->BSIM4nextModel )
@ -147,7 +160,7 @@ double tmp1, tmp2;
}
if (!model->BSIM4versionGiven)
model->BSIM4version = "4.1.0";
model->BSIM4version = "4.2.1";
if (!model->BSIM4toxrefGiven)
model->BSIM4toxref = 30.0e-10;
if (!model->BSIM4toxeGiven)
@ -1216,6 +1229,10 @@ double tmp1, tmp2;
model->BSIM4dwc = model->BSIM4Wint;
if (!model->BSIM4dlcGiven)
model->BSIM4dlc = model->BSIM4Lint;
if (!model->BSIM4xlGiven)
model->BSIM4xl = 0.0;
if (!model->BSIM4xwGiven)
model->BSIM4xw = 0.0;
if (!model->BSIM4dlcigGiven)
model->BSIM4dlcig = model->BSIM4Lint;
if (!model->BSIM4dwjGiven)
@ -1308,6 +1325,9 @@ double tmp1, tmp2;
model->BSIM4af = 1.0;
if (!model->BSIM4kfGiven)
model->BSIM4kf = 0.0;
DMCGeff = model->BSIM4dmcg - model->BSIM4dmcgt;
DMCIeff = model->BSIM4dmci;
DMDGeff = model->BSIM4dmdg - model->BSIM4dmcgt;
/*
* End processing models and begin to loop
@ -1316,13 +1336,10 @@ double tmp1, tmp2;
for (here = model->BSIM4instances; here != NULL ;
here=here->BSIM4nextInstance)
{
if (here->BSIM4owner == ARCHme) {
/* allocate a chunk of the state vector */
{ /* allocate a chunk of the state vector */
here->BSIM4states = *states;
*states += BSIM4numStates;
}
/* perform the parameter defaulting */
/* perform the parameter defaulting */
if (!here->BSIM4lGiven)
here->BSIM4l = 5.0e-6;
if (!here->BSIM4wGiven)
@ -1403,8 +1420,29 @@ double tmp1, tmp2;
}
/* process drain series resistance */
if (((here->BSIM4rgeoMod != 0) || (model->BSIM4rdsMod != 0)
|| (model->BSIM4tnoiMod != 0)) && (here->BSIM4dNodePrime == 0))
createNode = 0;
if ( (model->BSIM4rdsMod != 0)
|| (model->BSIM4tnoiMod != 0 && noiseAnalGiven))
{
createNode = 1;
} else if (model->BSIM4sheetResistance > 0)
{
if (here->BSIM4drainSquaresGiven
&& here->BSIM4drainSquares > 0)
{
createNode = 1;
} else if (!here->BSIM4drainSquaresGiven
&& (here->BSIM4rgeoMod != 0))
{
BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod,
here->BSIM4rgeoMod, here->BSIM4min,
here->BSIM4w, model->BSIM4sheetResistance,
DMCGeff, DMCIeff, DMDGeff, 0, &Rtot);
if(Rtot > 0)
createNode = 1;
}
}
if ( createNode != 0 && (here->BSIM4dNodePrime == 0))
{ error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"drain");
if(error) return(error);
here->BSIM4dNodePrime = tmp->number;
@ -1412,16 +1450,37 @@ double tmp1, tmp2;
else
{ here->BSIM4dNodePrime = here->BSIM4dNode;
}
/* process source series resistance */
if (((here->BSIM4rgeoMod != 0) || (model->BSIM4rdsMod != 0)
|| (model->BSIM4tnoiMod != 0)) && (here->BSIM4sNodePrime == 0))
createNode = 0;
if ( (model->BSIM4rdsMod != 0)
|| (model->BSIM4tnoiMod != 0 && noiseAnalGiven))
{
createNode = 1;
} else if (model->BSIM4sheetResistance > 0)
{
if (here->BSIM4sourceSquaresGiven
&& here->BSIM4sourceSquares > 0)
{
createNode = 1;
} else if (!here->BSIM4sourceSquaresGiven
&& (here->BSIM4rgeoMod != 0))
{
BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod,
here->BSIM4rgeoMod, here->BSIM4min,
here->BSIM4w, model->BSIM4sheetResistance,
DMCGeff, DMCIeff, DMDGeff, 1, &Rtot);
if(Rtot > 0)
createNode = 1;
}
}
if ( createNode != 0 && here->BSIM4sNodePrime == 0)
{ error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"source");
if(error) return(error);
here->BSIM4sNodePrime = tmp->number;
}
else
here->BSIM4sNodePrime = here->BSIM4sNode;
if ((here->BSIM4rgateMod > 0) && (here->BSIM4gNodePrime == 0))
{ error = CKTmkVolt(ckt,&tmp,here->BSIM4name,"gate");
@ -1589,6 +1648,7 @@ BSIM4unsetup(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
{
#ifndef HAS_BATCHSIM
BSIM4model *model;
BSIM4instance *here;
@ -1612,5 +1672,6 @@ BSIM4unsetup(inModel,ckt)
}
}
}
#endif
return OK;
}

View File

@ -1,12 +1,13 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4temp.c of BSIM4.1.0.
* Authors: Weidong Liu, Xiaodong Jin, Kanyu M. Cao, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4temp.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
* Modified by Xuemei Xi, 04/06/2001.
* Modified by Xuemei Xi, 10/05/2001.
**********/
#include "ngspice.h"
@ -17,6 +18,7 @@
#include "bsim4def.h"
#include "const.h"
#include "sperror.h"
#include "suffix.h"
#define Kb 1.3806226e-23
#define KboQ 8.617087e-5
@ -49,11 +51,11 @@ BSIM4temp(inModel,ckt)
GENmodel *inModel;
CKTcircuit *ckt;
{
BSIM4model *model = (BSIM4model*) inModel;
BSIM4instance *here;
register BSIM4model *model = (BSIM4model*) inModel;
register BSIM4instance *here;
struct bsim4SizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam;
double tmp, tmp1, tmp2, tmp3, Eg, Eg0, ni;
double T0, T1, T2, T3, T4, T5, T8, T9, Ldrn, Wdrn;
double T0, T1, T2, T3, T4, T5, T8, T9, Lnew, Wnew;
double delTemp, Temp, TRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom;
double dumPs, dumPd, dumAs, dumAd, PowWeffWr;
double DMCGeff, DMCIeff, DMDGeff;
@ -186,46 +188,46 @@ int Size_Not_Found;
delTemp = ckt->CKTtemp - model->BSIM4tnom;
T0 = model->BSIM4tcj * delTemp;
if (T0 >= -1.0)
{ model->BSIM4SunitAreaJctCap *= 1.0 + T0;
model->BSIM4DunitAreaJctCap *= 1.0 + T0;
{ model->BSIM4SunitAreaTempJctCap = model->BSIM4SunitAreaJctCap *(1.0 + T0); /*bug_fix -JX */
model->BSIM4DunitAreaTempJctCap = model->BSIM4DunitAreaJctCap *(1.0 + T0);
}
else
{ if (model->BSIM4SunitAreaJctCap > 0.0)
{ model->BSIM4SunitAreaJctCap = 0.0;
{ model->BSIM4SunitAreaTempJctCap = 0.0;
fprintf(stderr, "Temperature effect has caused cjs to be negative. Cjs is clamped to zero.\n");
}
if (model->BSIM4DunitAreaJctCap > 0.0)
{ model->BSIM4DunitAreaJctCap = 0.0;
{ model->BSIM4DunitAreaTempJctCap = 0.0;
fprintf(stderr, "Temperature effect has caused cjd to be negative. Cjd is clamped to zero.\n");
}
}
T0 = model->BSIM4tcjsw * delTemp;
if (T0 >= -1.0)
{ model->BSIM4SunitLengthSidewallJctCap *= 1.0 + T0;
model->BSIM4DunitLengthSidewallJctCap *= 1.0 + T0;
{ model->BSIM4SunitLengthSidewallTempJctCap = model->BSIM4SunitLengthSidewallJctCap *(1.0 + T0);
model->BSIM4DunitLengthSidewallTempJctCap = model->BSIM4DunitLengthSidewallJctCap *(1.0 + T0);
}
else
{ if (model->BSIM4SunitLengthSidewallJctCap > 0.0)
{ model->BSIM4SunitLengthSidewallJctCap = 0.0;
{ model->BSIM4SunitLengthSidewallTempJctCap = 0.0;
fprintf(stderr, "Temperature effect has caused cjsws to be negative. Cjsws is clamped to zero.\n");
}
if (model->BSIM4DunitLengthSidewallJctCap > 0.0)
{ model->BSIM4DunitLengthSidewallJctCap = 0.0;
{ model->BSIM4DunitLengthSidewallTempJctCap = 0.0;
fprintf(stderr, "Temperature effect has caused cjswd to be negative. Cjswd is clamped to zero.\n");
}
}
T0 = model->BSIM4tcjswg * delTemp;
if (T0 >= -1.0)
{ model->BSIM4SunitLengthGateSidewallJctCap *= 1.0 + T0;
model->BSIM4DunitLengthGateSidewallJctCap *= 1.0 + T0;
{ model->BSIM4SunitLengthGateSidewallTempJctCap = model->BSIM4SunitLengthGateSidewallJctCap *(1.0 + T0);
model->BSIM4DunitLengthGateSidewallTempJctCap = model->BSIM4DunitLengthGateSidewallJctCap *(1.0 + T0);
}
else
{ if (model->BSIM4SunitLengthGateSidewallJctCap > 0.0)
{ model->BSIM4SunitLengthGateSidewallJctCap = 0.0;
{ model->BSIM4SunitLengthGateSidewallTempJctCap = 0.0;
fprintf(stderr, "Temperature effect has caused cjswgs to be negative. Cjswgs is clamped to zero.\n");
}
if (model->BSIM4DunitLengthGateSidewallJctCap > 0.0)
{ model->BSIM4DunitLengthGateSidewallJctCap = 0.0;
{ model->BSIM4DunitLengthGateSidewallTempJctCap = 0.0;
fprintf(stderr, "Temperature effect has caused cjswgd to be negative. Cjswgd is clamped to zero.\n");
}
}
@ -319,8 +321,7 @@ int Size_Not_Found;
/* loop through all the instances of the model */
for (here = model->BSIM4instances; here != NULL;
here = here->BSIM4nextInstance)
{ if (here->BSIM4owner != ARCHme) continue;
pSizeDependParamKnot = model->pSizeDependParamKnot;
{ pSizeDependParamKnot = model->pSizeDependParamKnot;
Size_Not_Found = 1;
while ((pSizeDependParamKnot != NULL) && Size_Not_Found)
{ if ((here->BSIM4l == pSizeDependParamKnot->Length)
@ -328,6 +329,7 @@ int Size_Not_Found;
&& (here->BSIM4nf == pSizeDependParamKnot->NFinger))
{ Size_Not_Found = 0;
here->pParam = pSizeDependParamKnot;
pParam = here->pParam; /*bug-fix */
}
else
{ pLastKnot = pSizeDependParamKnot;
@ -336,7 +338,7 @@ int Size_Not_Found;
}
if (Size_Not_Found)
{ pParam = (struct bsim4SizeDependParam *)tmalloc(
{ pParam = (struct bsim4SizeDependParam *)malloc(
sizeof(struct bsim4SizeDependParam));
if (pLastKnot == NULL)
model->pSizeDependParamKnot = pParam;
@ -348,11 +350,11 @@ int Size_Not_Found;
pParam->Length = here->BSIM4l;
pParam->Width = here->BSIM4w;
pParam->NFinger = here->BSIM4nf;
Ldrn = here->BSIM4l;
Wdrn = here->BSIM4w / here->BSIM4nf;
Lnew = here->BSIM4l + model->BSIM4xl ;
Wnew = here->BSIM4w / here->BSIM4nf + model->BSIM4xw;
T0 = pow(Ldrn, model->BSIM4Lln);
T1 = pow(Wdrn, model->BSIM4Lwn);
T0 = pow(Lnew, model->BSIM4Lln);
T1 = pow(Wnew, model->BSIM4Lwn);
tmp1 = model->BSIM4Ll / T0 + model->BSIM4Lw / T1
+ model->BSIM4Lwl / (T0 * T1);
pParam->BSIM4dl = model->BSIM4Lint + tmp1;
@ -361,17 +363,17 @@ int Size_Not_Found;
pParam->BSIM4dlc = model->BSIM4dlc + tmp2;
pParam->BSIM4dlcig = model->BSIM4dlcig + tmp2;
T2 = pow(Ldrn, model->BSIM4Wln);
T3 = pow(Wdrn, model->BSIM4Wwn);
T2 = pow(Lnew, model->BSIM4Wln);
T3 = pow(Wnew, model->BSIM4Wwn);
tmp1 = model->BSIM4Wl / T2 + model->BSIM4Ww / T3
+ model->BSIM4Wwl / (T2 * T3);
pParam->BSIM4dw = model->BSIM4Wint + tmp1;
tmp2 = model->BSIM4Wlc / T2 + model->BSIM4Wwc / T3
+ model->BSIM4Wwlc / (T2 * T3);
+ model->BSIM4Wwlc / (T2 * T3);
pParam->BSIM4dwc = model->BSIM4dwc + tmp2;
pParam->BSIM4dwj = model->BSIM4dwj + tmp2;
pParam->BSIM4leff = here->BSIM4l - 2.0 * pParam->BSIM4dl;
pParam->BSIM4leff = Lnew - 2.0 * pParam->BSIM4dl;
if (pParam->BSIM4leff <= 0.0)
{ IFuid namarray[2];
namarray[0] = model->BSIM4modName;
@ -382,8 +384,7 @@ int Size_Not_Found;
return(E_BADPARM);
}
pParam->BSIM4weff = here->BSIM4w / here->BSIM4nf
- 2.0 * pParam->BSIM4dw;
pParam->BSIM4weff = Wnew - 2.0 * pParam->BSIM4dw;
if (pParam->BSIM4weff <= 0.0)
{ IFuid namarray[2];
namarray[0] = model->BSIM4modName;
@ -394,7 +395,7 @@ int Size_Not_Found;
return(E_BADPARM);
}
pParam->BSIM4leffCV = here->BSIM4l - 2.0 * pParam->BSIM4dlc;
pParam->BSIM4leffCV = Lnew - 2.0 * pParam->BSIM4dlc;
if (pParam->BSIM4leffCV <= 0.0)
{ IFuid namarray[2];
namarray[0] = model->BSIM4modName;
@ -405,8 +406,7 @@ int Size_Not_Found;
return(E_BADPARM);
}
pParam->BSIM4weffCV = here->BSIM4w / here->BSIM4nf
- 2.0 * pParam->BSIM4dwc;
pParam->BSIM4weffCV = Wnew - 2.0 * pParam->BSIM4dwc;
if (pParam->BSIM4weffCV <= 0.0)
{ IFuid namarray[2];
namarray[0] = model->BSIM4modName;
@ -417,8 +417,7 @@ int Size_Not_Found;
return(E_BADPARM);
}
pParam->BSIM4weffCJ = here->BSIM4w / here->BSIM4nf
- 2.0 * pParam->BSIM4dwj;
pParam->BSIM4weffCJ = Wnew - 2.0 * pParam->BSIM4dwj;
if (pParam->BSIM4weffCJ <= 0.0)
{ IFuid namarray[2];
namarray[0] = model->BSIM4modName;
@ -1250,7 +1249,7 @@ int Size_Not_Found;
here->BSIM4grgeltd = model->BSIM4rshg * (model->BSIM4xgw
+ pParam->BSIM4weffCJ / 3.0 / model->BSIM4ngcon) /
(model->BSIM4ngcon * here->BSIM4nf *
(here->BSIM4l - model->BSIM4xgl));
(Lnew - model->BSIM4xgl));
if (here->BSIM4grgeltd > 0.0)
here->BSIM4grgeltd = 1.0 / here->BSIM4grgeltd;
else
@ -1302,47 +1301,69 @@ int Size_Not_Found;
&dumPs, &dumPd, &dumAs, &(here->BSIM4Adeff));
/* Processing S/D resistance and conductance below */
if (here->BSIM4rgeoMod == 0)
here->BSIM4sourceConductance = 0.0;
else if (here->BSIM4sourceSquaresGiven)
here->BSIM4sourceConductance = model->BSIM4sheetResistance
if(here->BSIM4sNodePrime != here->BSIM4sNode)
{
here->BSIM4sourceConductance = 0.0;
if(here->BSIM4sourceSquaresGiven)
{
here->BSIM4sourceConductance = model->BSIM4sheetResistance
* here->BSIM4sourceSquares;
else
BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4rgeoMod, here->BSIM4min,
pParam->BSIM4weffCJ, model->BSIM4sheetResistance,
DMCGeff, DMCIeff, DMDGeff, 1, &(here->BSIM4sourceConductance));
} else if (here->BSIM4rgeoMod > 0)
{
BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod,
here->BSIM4rgeoMod, here->BSIM4min,
pParam->BSIM4weffCJ, model->BSIM4sheetResistance,
DMCGeff, DMCIeff, DMDGeff, 1, &(here->BSIM4sourceConductance));
} else
{
here->BSIM4sourceConductance = 0.0;
}
if (here->BSIM4rgeoMod == 0)
here->BSIM4drainConductance = 0.0;
else if (here->BSIM4drainSquaresGiven)
here->BSIM4drainConductance = model->BSIM4sheetResistance
* here->BSIM4drainSquares;
else
BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod, here->BSIM4rgeoMod, here->BSIM4min,
pParam->BSIM4weffCJ, model->BSIM4sheetResistance,
DMCGeff, DMCIeff, DMDGeff, 0, &(here->BSIM4drainConductance));
if (here->BSIM4drainConductance > 0.0)
here->BSIM4drainConductance = 1.0 / here->BSIM4drainConductance;
else
here->BSIM4drainConductance = 0.0;
if (here->BSIM4sourceConductance > 0.0)
here->BSIM4sourceConductance = 1.0 / here->BSIM4sourceConductance;
else
if (here->BSIM4sourceConductance > 0.0)
here->BSIM4sourceConductance = 1.0
/ here->BSIM4sourceConductance;
else
{
here->BSIM4sourceConductance = 1.0e3; /* mho */
printf ("Warning: Source conductance reset to 1.0e3 mho.\n");
}
} else
{
here->BSIM4sourceConductance = 0.0;
}
if(here->BSIM4dNodePrime != here->BSIM4dNode)
{
here->BSIM4drainConductance = 0.0;
if(here->BSIM4drainSquaresGiven)
{
here->BSIM4drainConductance = model->BSIM4sheetResistance
* here->BSIM4drainSquares;
} else if (here->BSIM4rgeoMod > 0)
{
BSIM4RdseffGeo(here->BSIM4nf, here->BSIM4geoMod,
here->BSIM4rgeoMod, here->BSIM4min,
pParam->BSIM4weffCJ, model->BSIM4sheetResistance,
DMCGeff, DMCIeff, DMDGeff, 0, &(here->BSIM4drainConductance));
} else
{
here->BSIM4drainConductance = 0.0;
}
if (((here->BSIM4rgeoMod != 0) || (model->BSIM4rdsMod != 0)
|| (model->BSIM4tnoiMod != 0)) && (here->BSIM4sourceConductance == 0.0))
{ here->BSIM4sourceConductance = 1.0e3; /* mho */
printf("Warning: Source conductance reset to 1.0e3 mho.\n");
}
if (((here->BSIM4rgeoMod != 0) || (model->BSIM4rdsMod != 0)
|| (model->BSIM4tnoiMod != 0)) && (here->BSIM4drainConductance == 0.0))
{ here->BSIM4drainConductance = 1.0e3; /* mho */
printf("Warning: Drain conductance reset to 1.0e3 mho.\n");
} /* End of Rsd processing */
if (here->BSIM4drainConductance > 0.0)
here->BSIM4drainConductance = 1.0
/ here->BSIM4drainConductance;
else
{
here->BSIM4drainConductance = 1.0e3; /* mho */
printf ("Warning: Drain conductance reset to 1.0e3 mho.\n");
}
} else
{
here->BSIM4drainConductance = 0.0;
}
/* End of Rsd processing */
Nvtms = model->BSIM4vtm * model->BSIM4SjctEmissionCoeff;
@ -1467,7 +1488,7 @@ int Size_Not_Found;
{ IFuid namarray[2];
namarray[0] = model->BSIM4modName;
namarray[1] = here->BSIM4name;
(*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during BSIM4.1.0 parameter checking for %s in model %s", namarray);
(*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during BSIM4.2.1 parameter checking for %s in model %s", namarray);
return(E_BADPARM);
}
} /* End instance */

View File

@ -1,12 +1,11 @@
/**** BSIM4.1.0, Released by Weidong Liu 10/11/2000 ****/
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/
/**********
* Copyright 2000 Regents of the University of California. All rights reserved.
* File: b4trunc.c of BSIM4.1.0.
* Authors: Weidong Liu, Kanyu M. Cao, Xiaodong Jin, Chenming Hu.
* Copyright 2001 Regents of the University of California. All rights reserved.
* File: b4trunc.c of BSIM4.2.1.
* Author: 2000 Weidong Liu
* Authors: Xuemei Xi, Kanyu M. Cao, Hui Wan, Mansun Chan, Chenming Hu.
* Project Director: Prof. Chenming Hu.
*
* Modified by Weidong Liu, 10/11/2000.
**********/
#include "ngspice.h"
@ -15,16 +14,17 @@
#include "cktdefs.h"
#include "bsim4def.h"
#include "sperror.h"
#include "suffix.h"
int
BSIM4trunc(inModel,ckt,timeStep)
GENmodel *inModel;
CKTcircuit *ckt;
register CKTcircuit *ckt;
double *timeStep;
{
BSIM4model *model = (BSIM4model*)inModel;
BSIM4instance *here;
register BSIM4model *model = (BSIM4model*)inModel;
register BSIM4instance *here;
#ifdef STEPDEBUG
double debugtemp;
@ -34,7 +34,6 @@ BSIM4instance *here;
{ for (here = model->BSIM4instances; here != NULL;
here = here->BSIM4nextInstance)
{
if (here->BSIM4owner != ARCHme) continue;
#ifdef STEPDEBUG
debugtemp = *timeStep;
#endif /* STEPDEBUG */

View File

@ -1,6 +1,7 @@
/**********
Copyright 2000 Regents of the University of California. All rights reserved.
Copyright 2001 Regents of the University of California. All rights reserved.
Author: 2000 Weidong Liu.
Modified by Xuemei Xi October 2001
File: bsim4def.h
**********/
@ -18,7 +19,6 @@ typedef struct sBSIM4instance
struct sBSIM4model *BSIM4modPtr;
struct sBSIM4instance *BSIM4nextInstance;
IFuid BSIM4name;
int BSIM4owner; /* Number of owner process */
int BSIM4states; /* index into state table for this device */
int BSIM4dNode;
int BSIM4gNodeExt;
@ -100,6 +100,10 @@ typedef struct sBSIM4instance
/* OP point */
double BSIM4Vgsteff;
double BSIM4vgs_eff;
double BSIM4vgd_eff;
double BSIM4dvgs_eff_dvg;
double BSIM4dvgd_eff_dvg;
double BSIM4Vdseff;
double BSIM4nstar;
double BSIM4Abulk;
@ -111,6 +115,7 @@ typedef struct sBSIM4instance
double BSIM4cbd;
double BSIM4csub;
double BSIM4Igidl;
double BSIM4Igisl;
double BSIM4gm;
double BSIM4gds;
double BSIM4gmbs;
@ -124,6 +129,10 @@ typedef struct sBSIM4instance
double BSIM4ggidlg;
double BSIM4ggidls;
double BSIM4ggidlb;
double BSIM4ggisld;
double BSIM4ggislg;
double BSIM4ggisls;
double BSIM4ggislb;
double BSIM4Igcs;
double BSIM4gIgcsg;
@ -178,6 +187,13 @@ typedef struct sBSIM4instance
double BSIM4cdgb;
double BSIM4cddb;
double BSIM4cdsb;
double BSIM4csgb;
double BSIM4csdb;
double BSIM4cssb;
double BSIM4cgbb;
double BSIM4cdbb;
double BSIM4csbb;
double BSIM4cbbb;
double BSIM4capbd;
double BSIM4capbs;
@ -189,6 +205,7 @@ typedef struct sBSIM4instance
double BSIM4qgate;
double BSIM4qbulk;
double BSIM4qdrn;
double BSIM4qsrc;
double BSIM4qchqs;
double BSIM4taunet;
@ -308,6 +325,7 @@ typedef struct sBSIM4instance
double *BSIM4GPqPtr;
double *BSIM4SPqPtr;
#define BSIM4vbd BSIM4states+ 0
#define BSIM4vbs BSIM4states+ 1
#define BSIM4vgs BSIM4states+ 2
@ -339,8 +357,9 @@ typedef struct sBSIM4instance
#define BSIM4qcdump BSIM4states+ 25
#define BSIM4cqcdump BSIM4states+ 26
#define BSIM4qdef BSIM4states+ 27
#define BSIM4qs BSIM4states+ 28
#define BSIM4numStates 28
#define BSIM4numStates 29
/* indices to the array of BSIM4 NOISE SOURCES */
@ -741,6 +760,8 @@ typedef struct sBSIM4model
double BSIM4cle;
double BSIM4dwc;
double BSIM4dlc;
double BSIM4xw;
double BSIM4xl;
double BSIM4dlcig;
double BSIM4dwj;
double BSIM4noff;
@ -1220,6 +1241,12 @@ typedef struct sBSIM4model
double BSIM4DjctTempSatCurDensity;
double BSIM4DjctSidewallTempSatCurDensity;
double BSIM4DjctGateSidewallTempSatCurDensity;
double BSIM4SunitAreaTempJctCap;
double BSIM4DunitAreaTempJctCap;
double BSIM4SunitLengthSidewallTempJctCap;
double BSIM4DunitLengthSidewallTempJctCap;
double BSIM4SunitLengthGateSidewallTempJctCap;
double BSIM4DunitLengthGateSidewallTempJctCap;
double BSIM4oxideTrapDensityA;
double BSIM4oxideTrapDensityB;
@ -1398,6 +1425,8 @@ typedef struct sBSIM4model
unsigned BSIM4cleGiven :1;
unsigned BSIM4dwcGiven :1;
unsigned BSIM4dlcGiven :1;
unsigned BSIM4xwGiven :1;
unsigned BSIM4xlGiven :1;
unsigned BSIM4dlcigGiven :1;
unsigned BSIM4dwjGiven :1;
unsigned BSIM4noffGiven :1;
@ -2511,37 +2540,39 @@ typedef struct sBSIM4model
#define BSIM4_MOD_WMAX 864
#define BSIM4_MOD_DWC 865
#define BSIM4_MOD_DLC 866
#define BSIM4_MOD_EM 867
#define BSIM4_MOD_EF 868
#define BSIM4_MOD_AF 869
#define BSIM4_MOD_KF 870
#define BSIM4_MOD_NJS 871
#define BSIM4_MOD_XTIS 872
#define BSIM4_MOD_PBSWGS 873
#define BSIM4_MOD_MJSWGS 874
#define BSIM4_MOD_CJSWGS 875
#define BSIM4_MOD_JSWS 876
#define BSIM4_MOD_LLC 877
#define BSIM4_MOD_LWC 878
#define BSIM4_MOD_LWLC 879
#define BSIM4_MOD_WLC 880
#define BSIM4_MOD_WWC 881
#define BSIM4_MOD_WWLC 882
#define BSIM4_MOD_DWJ 883
#define BSIM4_MOD_JSD 884
#define BSIM4_MOD_PBD 885
#define BSIM4_MOD_MJD 886
#define BSIM4_MOD_PBSWD 887
#define BSIM4_MOD_MJSWD 888
#define BSIM4_MOD_CJD 889
#define BSIM4_MOD_CJSWD 890
#define BSIM4_MOD_NJD 891
#define BSIM4_MOD_XTID 892
#define BSIM4_MOD_PBSWGD 893
#define BSIM4_MOD_MJSWGD 894
#define BSIM4_MOD_CJSWGD 895
#define BSIM4_MOD_JSWD 896
#define BSIM4_MOD_DLCIG 897
#define BSIM4_MOD_XL 867
#define BSIM4_MOD_XW 868
#define BSIM4_MOD_EM 869
#define BSIM4_MOD_EF 870
#define BSIM4_MOD_AF 871
#define BSIM4_MOD_KF 872
#define BSIM4_MOD_NJS 873
#define BSIM4_MOD_XTIS 874
#define BSIM4_MOD_PBSWGS 875
#define BSIM4_MOD_MJSWGS 876
#define BSIM4_MOD_CJSWGS 877
#define BSIM4_MOD_JSWS 878
#define BSIM4_MOD_LLC 879
#define BSIM4_MOD_LWC 880
#define BSIM4_MOD_LWLC 881
#define BSIM4_MOD_WLC 882
#define BSIM4_MOD_WWC 883
#define BSIM4_MOD_WWLC 884
#define BSIM4_MOD_DWJ 885
#define BSIM4_MOD_JSD 886
#define BSIM4_MOD_PBD 887
#define BSIM4_MOD_MJD 888
#define BSIM4_MOD_PBSWD 889
#define BSIM4_MOD_MJSWD 890
#define BSIM4_MOD_CJD 891
#define BSIM4_MOD_CJSWD 892
#define BSIM4_MOD_NJD 893
#define BSIM4_MOD_XTID 894
#define BSIM4_MOD_PBSWGD 895
#define BSIM4_MOD_MJSWGD 896
#define BSIM4_MOD_CJSWGD 897
#define BSIM4_MOD_JSWD 898
#define BSIM4_MOD_DLCIG 899
/* device questions */
#define BSIM4_DNODE 945
@ -2574,17 +2605,17 @@ typedef struct sBSIM4model
#define BSIM4_CQG 972
#define BSIM4_QD 973
#define BSIM4_CQD 974
#define BSIM4_CGG 975
#define BSIM4_CGD 976
#define BSIM4_CGS 977
#define BSIM4_CBG 978
#define BSIM4_CGGB 975
#define BSIM4_CGDB 976
#define BSIM4_CGSB 977
#define BSIM4_CBGB 978
#define BSIM4_CAPBD 979
#define BSIM4_CQBD 980
#define BSIM4_CAPBS 981
#define BSIM4_CQBS 982
#define BSIM4_CDG 983
#define BSIM4_CDD 984
#define BSIM4_CDS 985
#define BSIM4_CDGB 983
#define BSIM4_CDDB 984
#define BSIM4_CDSB 985
#define BSIM4_VON 986
#define BSIM4_VDSAT 987
#define BSIM4_QBS 988
@ -2593,7 +2624,26 @@ typedef struct sBSIM4model
#define BSIM4_DRAINCONDUCT 991
#define BSIM4_CBDB 992
#define BSIM4_CBSB 993
#define BSIM4_CSUB 994
#define BSIM4_QINV 995
#define BSIM4_IGIDL 996
#define BSIM4_CSGB 997
#define BSIM4_CSDB 998
#define BSIM4_CSSB 999
#define BSIM4_CGBB 1000
#define BSIM4_CDBB 1001
#define BSIM4_CSBB 1002
#define BSIM4_CBBB 1003
#define BSIM4_QS 1004
#define BSIM4_IGISL 1005
#define BSIM4_IGS 1006
#define BSIM4_IGD 1007
#define BSIM4_IGB 1008
#define BSIM4_IGCS 1009
#define BSIM4_IGCD 1010
#
#include "bsim4ext.h"
#ifdef __STDC__

View File

@ -1,6 +1,7 @@
/**********
Copyright 2000 Regents of the University of California. All rights reserved.
Author: 2000 Weidong Liu.
Copyright 2001 Regents of the University of California. All rights reserved.
Author: 2000 Weidong Liu
Author: 2001 Xuemei Xi
File: bsim4ext.h
**********/

View File

@ -1,11 +1,89 @@
/**********
Copyright 2000 Regents of the University of California. All rights reserved.
Copyright 2001 Regents of the University of California. All rights reserved.
Author: 2000 Weidong Liu.
Author: 2001 Xuemei Xi
File: bsim4itf.h
**********/
#ifdef DEV_bsim4
#ifndef DEV_BSIM4
#define DEV_BSIM4
SPICEdev *get_bsim4_info(void);
#include "bsim4ext.h"
extern IFparm BSIM4pTable[ ];
extern IFparm BSIM4mPTable[ ];
extern char *BSIM4names[ ];
extern int BSIM4pTSize;
extern int BSIM4mPTSize;
extern int BSIM4nSize;
extern int BSIM4iSize;
extern int BSIM4mSize;
SPICEdev B4info = {
{ "BSIM4",
"Berkeley Short Channel IGFET Model-4",
&BSIM4nSize,
&BSIM4nSize,
BSIM4names,
&BSIM4pTSize,
BSIM4pTable,
&BSIM4mPTSize,
BSIM4mPTable,
DEV_DEFAULT
},
BSIM4param,
BSIM4mParam,
BSIM4load,
BSIM4setup,
BSIM4unsetup,
BSIM4setup,
BSIM4temp,
BSIM4trunc,
NULL,
BSIM4acLoad,
NULL,
BSIM4destroy,
#ifdef DELETES
BSIM4mDelete,
BSIM4delete,
#else /* DELETES */
NULL,
NULL,
#endif /* DELETES */
BSIM4getic,
BSIM4ask,
BSIM4mAsk,
#ifdef AN_pz
BSIM4pzLoad,
#else /* AN_pz */
NULL,
#endif /* AN_pz */
#ifdef NEWCONV
BSIM4convTest,
#else /* NEWCONV */
NULL,
#endif /* NEWCONV */
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
#ifdef AN_noise
BSIM4noise,
#else /* AN_noise */
NULL,
#endif /* AN_noise */
&BSIM4iSize,
&BSIM4mSize
};
#endif
#endif