25 changed files with 20972 additions and 19386 deletions
-
70src/spicelib/devices/bsim4/Makefile.am
-
1563src/spicelib/devices/bsim4/b4.c
-
1342src/spicelib/devices/bsim4/b4acld.c
-
623src/spicelib/devices/bsim4/b4ask.c
-
1308src/spicelib/devices/bsim4/b4check.c
-
400src/spicelib/devices/bsim4/b4cvtest.c
-
82src/spicelib/devices/bsim4/b4del.c
-
76src/spicelib/devices/bsim4/b4dest.c
-
774src/spicelib/devices/bsim4/b4geo.c
-
88src/spicelib/devices/bsim4/b4getic.c
-
9228src/spicelib/devices/bsim4/b4ld.c
-
3845src/spicelib/devices/bsim4/b4mask.c
-
94src/spicelib/devices/bsim4/b4mdel.c
-
5333src/spicelib/devices/bsim4/b4mpar.c
-
961src/spicelib/devices/bsim4/b4noi.c
-
309src/spicelib/devices/bsim4/b4par.c
-
1516src/spicelib/devices/bsim4/b4pzld.c
-
3595src/spicelib/devices/bsim4/b4set.c
-
3211src/spicelib/devices/bsim4/b4temp.c
-
118src/spicelib/devices/bsim4/b4trunc.c
-
5580src/spicelib/devices/bsim4/bsim4def.h
-
27src/spicelib/devices/bsim4/bsim4ext.h
-
163src/spicelib/devices/bsim4/bsim4init.c
-
26src/spicelib/devices/bsim4/bsim4init.h
-
26src/spicelib/devices/bsim4/bsim4itf.h
@ -1,35 +1,35 @@ |
|||
## Process this file with automake to produce Makefile.in
|
|||
|
|||
noinst_LIBRARIES = libbsim4.a |
|||
|
|||
libbsim4_a_SOURCES = \
|
|||
b4.c \
|
|||
b4acld.c \
|
|||
b4ask.c \
|
|||
b4check.c \
|
|||
b4cvtest.c \
|
|||
b4del.c \
|
|||
b4dest.c \
|
|||
b4geo.c \
|
|||
b4getic.c \
|
|||
b4ld.c \
|
|||
b4mask.c \
|
|||
b4mdel.c \
|
|||
b4mpar.c \
|
|||
b4noi.c \
|
|||
b4par.c \
|
|||
b4pzld.c \
|
|||
b4set.c \
|
|||
b4temp.c \
|
|||
b4trunc.c \
|
|||
bsim4def.h \
|
|||
bsim4ext.h \
|
|||
bsim4init.c \
|
|||
bsim4init.h \
|
|||
bsim4itf.h |
|||
|
|||
|
|||
|
|||
INCLUDES = -I$(top_srcdir)/src/include |
|||
|
|||
MAINTAINERCLEANFILES = Makefile.in |
|||
## Process this file with automake to produce Makefile.in
|
|||
|
|||
pkglib_LIBRARIES = libbsim4.a |
|||
|
|||
libbsim4_a_SOURCES = \
|
|||
b4.c \
|
|||
b4acld.c \
|
|||
b4ask.c \
|
|||
b4check.c \
|
|||
b4cvtest.c \
|
|||
b4del.c \
|
|||
b4dest.c \
|
|||
b4geo.c \
|
|||
b4getic.c \
|
|||
b4ld.c \
|
|||
b4mask.c \
|
|||
b4mdel.c \
|
|||
b4mpar.c \
|
|||
b4noi.c \
|
|||
b4par.c \
|
|||
b4pzld.c \
|
|||
b4set.c \
|
|||
b4temp.c \
|
|||
b4trunc.c \
|
|||
bsim4def.h \
|
|||
bsim4ext.h \
|
|||
bsim4init.c \
|
|||
bsim4init.h \
|
|||
bsim4itf.h |
|||
|
|||
|
|||
|
|||
INCLUDES = -I$(top_srcdir)/src/include |
|||
|
|||
MAINTAINERCLEANFILES = Makefile.in |
|||
1563
src/spicelib/devices/bsim4/b4.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1342
src/spicelib/devices/bsim4/b4acld.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,300 +1,323 @@ |
|||
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/ |
|||
|
|||
/********** |
|||
* 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 Xuemei Xi, 10/05/2001. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include <stdio.h> |
|||
#include <math.h> |
|||
#include "ifsim.h" |
|||
#include "cktdefs.h" |
|||
#include "devdefs.h" |
|||
#include "bsim4def.h" |
|||
#include "sperror.h" |
|||
|
|||
|
|||
int |
|||
BSIM4ask(ckt,inst,which,value,select) |
|||
CKTcircuit *ckt; |
|||
GENinstance *inst; |
|||
int which; |
|||
IFvalue *value; |
|||
IFvalue *select; |
|||
{ |
|||
BSIM4instance *here = (BSIM4instance*)inst; |
|||
|
|||
switch(which) |
|||
{ case BSIM4_L: |
|||
value->rValue = here->BSIM4l; |
|||
return(OK); |
|||
case BSIM4_W: |
|||
value->rValue = here->BSIM4w; |
|||
return(OK); |
|||
case BSIM4_NF: |
|||
value->rValue = here->BSIM4nf; |
|||
return(OK); |
|||
case BSIM4_MIN: |
|||
value->iValue = here->BSIM4min; |
|||
return(OK); |
|||
case BSIM4_AS: |
|||
value->rValue = here->BSIM4sourceArea; |
|||
return(OK); |
|||
case BSIM4_AD: |
|||
value->rValue = here->BSIM4drainArea; |
|||
return(OK); |
|||
case BSIM4_PS: |
|||
value->rValue = here->BSIM4sourcePerimeter; |
|||
return(OK); |
|||
case BSIM4_PD: |
|||
value->rValue = here->BSIM4drainPerimeter; |
|||
return(OK); |
|||
case BSIM4_NRS: |
|||
value->rValue = here->BSIM4sourceSquares; |
|||
return(OK); |
|||
case BSIM4_NRD: |
|||
value->rValue = here->BSIM4drainSquares; |
|||
return(OK); |
|||
case BSIM4_OFF: |
|||
value->rValue = here->BSIM4off; |
|||
return(OK); |
|||
case BSIM4_RBSB: |
|||
value->rValue = here->BSIM4rbsb; |
|||
return(OK); |
|||
case BSIM4_RBDB: |
|||
value->rValue = here->BSIM4rbdb; |
|||
return(OK); |
|||
case BSIM4_RBPB: |
|||
value->rValue = here->BSIM4rbpb; |
|||
return(OK); |
|||
case BSIM4_RBPS: |
|||
value->rValue = here->BSIM4rbps; |
|||
return(OK); |
|||
case BSIM4_RBPD: |
|||
value->rValue = here->BSIM4rbpd; |
|||
return(OK); |
|||
case BSIM4_TRNQSMOD: |
|||
value->iValue = here->BSIM4trnqsMod; |
|||
return(OK); |
|||
case BSIM4_ACNQSMOD: |
|||
value->iValue = here->BSIM4acnqsMod; |
|||
return(OK); |
|||
case BSIM4_RBODYMOD: |
|||
value->iValue = here->BSIM4rbodyMod; |
|||
return(OK); |
|||
case BSIM4_RGATEMOD: |
|||
value->iValue = here->BSIM4rgateMod; |
|||
return(OK); |
|||
case BSIM4_GEOMOD: |
|||
value->iValue = here->BSIM4geoMod; |
|||
return(OK); |
|||
case BSIM4_RGEOMOD: |
|||
value->iValue = here->BSIM4rgeoMod; |
|||
return(OK); |
|||
case BSIM4_IC_VDS: |
|||
value->rValue = here->BSIM4icVDS; |
|||
return(OK); |
|||
case BSIM4_IC_VGS: |
|||
value->rValue = here->BSIM4icVGS; |
|||
return(OK); |
|||
case BSIM4_IC_VBS: |
|||
value->rValue = here->BSIM4icVBS; |
|||
return(OK); |
|||
case BSIM4_DNODE: |
|||
value->iValue = here->BSIM4dNode; |
|||
return(OK); |
|||
case BSIM4_GNODEEXT: |
|||
value->iValue = here->BSIM4gNodeExt; |
|||
return(OK); |
|||
case BSIM4_SNODE: |
|||
value->iValue = here->BSIM4sNode; |
|||
return(OK); |
|||
case BSIM4_BNODE: |
|||
value->iValue = here->BSIM4bNode; |
|||
return(OK); |
|||
case BSIM4_DNODEPRIME: |
|||
value->iValue = here->BSIM4dNodePrime; |
|||
return(OK); |
|||
case BSIM4_GNODEPRIME: |
|||
value->iValue = here->BSIM4gNodePrime; |
|||
return(OK); |
|||
case BSIM4_GNODEMID: |
|||
value->iValue = here->BSIM4gNodeMid; |
|||
return(OK); |
|||
case BSIM4_SNODEPRIME: |
|||
value->iValue = here->BSIM4sNodePrime; |
|||
return(OK); |
|||
case BSIM4_DBNODE: |
|||
value->iValue = here->BSIM4dbNode; |
|||
return(OK); |
|||
case BSIM4_BNODEPRIME: |
|||
value->iValue = here->BSIM4bNodePrime; |
|||
return(OK); |
|||
case BSIM4_SBNODE: |
|||
value->iValue = here->BSIM4sbNode; |
|||
return(OK); |
|||
case BSIM4_SOURCECONDUCT: |
|||
value->rValue = here->BSIM4sourceConductance; |
|||
return(OK); |
|||
case BSIM4_DRAINCONDUCT: |
|||
value->rValue = here->BSIM4drainConductance; |
|||
return(OK); |
|||
case BSIM4_VBD: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4vbd); |
|||
return(OK); |
|||
case BSIM4_VBS: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4vbs); |
|||
return(OK); |
|||
case BSIM4_VGS: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4vgs); |
|||
return(OK); |
|||
case BSIM4_VDS: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4vds); |
|||
return(OK); |
|||
case BSIM4_CD: |
|||
value->rValue = here->BSIM4cd; |
|||
return(OK); |
|||
case BSIM4_CBS: |
|||
value->rValue = here->BSIM4cbs; |
|||
return(OK); |
|||
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); |
|||
case BSIM4_GDS: |
|||
value->rValue = here->BSIM4gds; |
|||
return(OK); |
|||
case BSIM4_GMBS: |
|||
value->rValue = here->BSIM4gmbs; |
|||
return(OK); |
|||
case BSIM4_GBD: |
|||
value->rValue = here->BSIM4gbd; |
|||
return(OK); |
|||
case BSIM4_GBS: |
|||
value->rValue = here->BSIM4gbs; |
|||
return(OK); |
|||
case BSIM4_QB: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4qb); |
|||
return(OK); |
|||
case BSIM4_CQB: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4cqb); |
|||
return(OK); |
|||
case BSIM4_QG: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4qg); |
|||
return(OK); |
|||
case BSIM4_CQG: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4cqg); |
|||
return(OK); |
|||
case BSIM4_QD: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4qd); |
|||
return(OK); |
|||
case BSIM4_CQD: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4cqd); |
|||
return(OK); |
|||
case BSIM4_QS: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4qs); |
|||
return(OK); |
|||
case BSIM4_CGGB: |
|||
value->rValue = here->BSIM4cggb; |
|||
return(OK); |
|||
case BSIM4_CGDB: |
|||
value->rValue = here->BSIM4cgdb; |
|||
return(OK); |
|||
case BSIM4_CGSB: |
|||
value->rValue = here->BSIM4cgsb; |
|||
return(OK); |
|||
case BSIM4_CDGB: |
|||
value->rValue = here->BSIM4cdgb; |
|||
return(OK); |
|||
case BSIM4_CDDB: |
|||
value->rValue = here->BSIM4cddb; |
|||
return(OK); |
|||
case BSIM4_CDSB: |
|||
value->rValue = here->BSIM4cdsb; |
|||
return(OK); |
|||
case BSIM4_CBGB: |
|||
value->rValue = here->BSIM4cbgb; |
|||
return(OK); |
|||
case BSIM4_CBDB: |
|||
value->rValue = here->BSIM4cbdb; |
|||
return(OK); |
|||
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); |
|||
case BSIM4_CAPBS: |
|||
value->rValue = here->BSIM4capbs; |
|||
return(OK); |
|||
case BSIM4_VON: |
|||
value->rValue = here->BSIM4von; |
|||
return(OK); |
|||
case BSIM4_VDSAT: |
|||
value->rValue = here->BSIM4vdsat; |
|||
return(OK); |
|||
case BSIM4_QBS: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4qbs); |
|||
return(OK); |
|||
case BSIM4_QBD: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4qbd); |
|||
return(OK); |
|||
default: |
|||
return(E_BADPARM); |
|||
} |
|||
/* NOTREACHED */ |
|||
} |
|||
|
|||
/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ |
|||
|
|||
/********** |
|||
* Copyright 2004 Regents of the University of California. All rights reserved. |
|||
* File: b4ask.c of BSIM4.4.0. |
|||
* Author: 2000 Weidong Liu |
|||
* Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. |
|||
* Project Director: Prof. Chenming Hu. |
|||
* Modified by Xuemei Xi, 04/06/2001. |
|||
* Modified by Xuemei Xi, 10/05/2001. |
|||
* Modified by Xuemei Xi, 05/09/2003. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "ifsim.h" |
|||
#include "cktdefs.h" |
|||
#include "devdefs.h" |
|||
#include "bsim4def.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
int |
|||
BSIM4ask(ckt,inst,which,value,select) |
|||
CKTcircuit *ckt; |
|||
GENinstance *inst; |
|||
int which; |
|||
IFvalue *value; |
|||
IFvalue *select; |
|||
{ |
|||
BSIM4instance *here = (BSIM4instance*)inst; |
|||
|
|||
switch(which) |
|||
{ case BSIM4_L: |
|||
value->rValue = here->BSIM4l; |
|||
return(OK); |
|||
case BSIM4_W: |
|||
value->rValue = here->BSIM4w; |
|||
return(OK); |
|||
case BSIM4_M: |
|||
value->rValue = here->BSIM4m; |
|||
return(OK); |
|||
case BSIM4_NF: |
|||
value->rValue = here->BSIM4nf; |
|||
return(OK); |
|||
case BSIM4_MIN: |
|||
value->iValue = here->BSIM4min; |
|||
return(OK); |
|||
case BSIM4_AS: |
|||
value->rValue = here->BSIM4sourceArea; |
|||
return(OK); |
|||
case BSIM4_AD: |
|||
value->rValue = here->BSIM4drainArea; |
|||
return(OK); |
|||
case BSIM4_PS: |
|||
value->rValue = here->BSIM4sourcePerimeter; |
|||
return(OK); |
|||
case BSIM4_PD: |
|||
value->rValue = here->BSIM4drainPerimeter; |
|||
return(OK); |
|||
case BSIM4_NRS: |
|||
value->rValue = here->BSIM4sourceSquares; |
|||
return(OK); |
|||
case BSIM4_NRD: |
|||
value->rValue = here->BSIM4drainSquares; |
|||
return(OK); |
|||
case BSIM4_OFF: |
|||
value->rValue = here->BSIM4off; |
|||
return(OK); |
|||
case BSIM4_SA: |
|||
value->rValue = here->BSIM4sa ; |
|||
return(OK); |
|||
case BSIM4_SB: |
|||
value->rValue = here->BSIM4sb ; |
|||
return(OK); |
|||
case BSIM4_SD: |
|||
value->rValue = here->BSIM4sd ; |
|||
return(OK); |
|||
case BSIM4_RBSB: |
|||
value->rValue = here->BSIM4rbsb; |
|||
return(OK); |
|||
case BSIM4_RBDB: |
|||
value->rValue = here->BSIM4rbdb; |
|||
return(OK); |
|||
case BSIM4_RBPB: |
|||
value->rValue = here->BSIM4rbpb; |
|||
return(OK); |
|||
case BSIM4_RBPS: |
|||
value->rValue = here->BSIM4rbps; |
|||
return(OK); |
|||
case BSIM4_RBPD: |
|||
value->rValue = here->BSIM4rbpd; |
|||
return(OK); |
|||
case BSIM4_TRNQSMOD: |
|||
value->iValue = here->BSIM4trnqsMod; |
|||
return(OK); |
|||
case BSIM4_ACNQSMOD: |
|||
value->iValue = here->BSIM4acnqsMod; |
|||
return(OK); |
|||
case BSIM4_RBODYMOD: |
|||
value->iValue = here->BSIM4rbodyMod; |
|||
return(OK); |
|||
case BSIM4_RGATEMOD: |
|||
value->iValue = here->BSIM4rgateMod; |
|||
return(OK); |
|||
case BSIM4_GEOMOD: |
|||
value->iValue = here->BSIM4geoMod; |
|||
return(OK); |
|||
case BSIM4_RGEOMOD: |
|||
value->iValue = here->BSIM4rgeoMod; |
|||
return(OK); |
|||
case BSIM4_IC_VDS: |
|||
value->rValue = here->BSIM4icVDS; |
|||
return(OK); |
|||
case BSIM4_IC_VGS: |
|||
value->rValue = here->BSIM4icVGS; |
|||
return(OK); |
|||
case BSIM4_IC_VBS: |
|||
value->rValue = here->BSIM4icVBS; |
|||
return(OK); |
|||
case BSIM4_DNODE: |
|||
value->iValue = here->BSIM4dNode; |
|||
return(OK); |
|||
case BSIM4_GNODEEXT: |
|||
value->iValue = here->BSIM4gNodeExt; |
|||
return(OK); |
|||
case BSIM4_SNODE: |
|||
value->iValue = here->BSIM4sNode; |
|||
return(OK); |
|||
case BSIM4_BNODE: |
|||
value->iValue = here->BSIM4bNode; |
|||
return(OK); |
|||
case BSIM4_DNODEPRIME: |
|||
value->iValue = here->BSIM4dNodePrime; |
|||
return(OK); |
|||
case BSIM4_GNODEPRIME: |
|||
value->iValue = here->BSIM4gNodePrime; |
|||
return(OK); |
|||
case BSIM4_GNODEMID: |
|||
value->iValue = here->BSIM4gNodeMid; |
|||
return(OK); |
|||
case BSIM4_SNODEPRIME: |
|||
value->iValue = here->BSIM4sNodePrime; |
|||
return(OK); |
|||
case BSIM4_DBNODE: |
|||
value->iValue = here->BSIM4dbNode; |
|||
return(OK); |
|||
case BSIM4_BNODEPRIME: |
|||
value->iValue = here->BSIM4bNodePrime; |
|||
return(OK); |
|||
case BSIM4_SBNODE: |
|||
value->iValue = here->BSIM4sbNode; |
|||
return(OK); |
|||
case BSIM4_SOURCECONDUCT: |
|||
value->rValue = here->BSIM4sourceConductance; |
|||
return(OK); |
|||
case BSIM4_DRAINCONDUCT: |
|||
value->rValue = here->BSIM4drainConductance; |
|||
return(OK); |
|||
case BSIM4_VBD: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4vbd); |
|||
return(OK); |
|||
case BSIM4_VBS: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4vbs); |
|||
return(OK); |
|||
case BSIM4_VGS: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4vgs); |
|||
return(OK); |
|||
case BSIM4_VDS: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4vds); |
|||
return(OK); |
|||
case BSIM4_CD: |
|||
value->rValue = here->BSIM4cd; |
|||
return(OK); |
|||
case BSIM4_CBS: |
|||
value->rValue = here->BSIM4cbs; |
|||
return(OK); |
|||
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); |
|||
case BSIM4_GDS: |
|||
value->rValue = here->BSIM4gds; |
|||
return(OK); |
|||
case BSIM4_GMBS: |
|||
value->rValue = here->BSIM4gmbs; |
|||
return(OK); |
|||
case BSIM4_GBD: |
|||
value->rValue = here->BSIM4gbd; |
|||
return(OK); |
|||
case BSIM4_GBS: |
|||
value->rValue = here->BSIM4gbs; |
|||
return(OK); |
|||
/* case BSIM4_QB: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4qb); |
|||
return(OK); */ |
|||
case BSIM4_CQB: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4cqb); |
|||
return(OK); |
|||
/* case BSIM4_QG: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4qg); |
|||
return(OK); */ |
|||
case BSIM4_CQG: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4cqg); |
|||
return(OK); |
|||
/* case BSIM4_QD: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4qd); |
|||
return(OK); */ |
|||
case BSIM4_CQD: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4cqd); |
|||
return(OK); |
|||
/* case BSIM4_QS: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4qs); |
|||
return(OK); */ |
|||
case BSIM4_QB: |
|||
value->rValue = here->BSIM4qbulk; |
|||
return(OK); |
|||
case BSIM4_QG: |
|||
value->rValue = here->BSIM4qgate; |
|||
return(OK); |
|||
case BSIM4_QS: |
|||
value->rValue = here->BSIM4qsrc; |
|||
return(OK); |
|||
case BSIM4_QD: |
|||
value->rValue = here->BSIM4qdrn; |
|||
return(OK); |
|||
case BSIM4_CGGB: |
|||
value->rValue = here->BSIM4cggb; |
|||
return(OK); |
|||
case BSIM4_CGDB: |
|||
value->rValue = here->BSIM4cgdb; |
|||
return(OK); |
|||
case BSIM4_CGSB: |
|||
value->rValue = here->BSIM4cgsb; |
|||
return(OK); |
|||
case BSIM4_CDGB: |
|||
value->rValue = here->BSIM4cdgb; |
|||
return(OK); |
|||
case BSIM4_CDDB: |
|||
value->rValue = here->BSIM4cddb; |
|||
return(OK); |
|||
case BSIM4_CDSB: |
|||
value->rValue = here->BSIM4cdsb; |
|||
return(OK); |
|||
case BSIM4_CBGB: |
|||
value->rValue = here->BSIM4cbgb; |
|||
return(OK); |
|||
case BSIM4_CBDB: |
|||
value->rValue = here->BSIM4cbdb; |
|||
return(OK); |
|||
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); |
|||
case BSIM4_CAPBS: |
|||
value->rValue = here->BSIM4capbs; |
|||
return(OK); |
|||
case BSIM4_VON: |
|||
value->rValue = here->BSIM4von; |
|||
return(OK); |
|||
case BSIM4_VDSAT: |
|||
value->rValue = here->BSIM4vdsat; |
|||
return(OK); |
|||
case BSIM4_QBS: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4qbs); |
|||
return(OK); |
|||
case BSIM4_QBD: |
|||
value->rValue = *(ckt->CKTstate0 + here->BSIM4qbd); |
|||
return(OK); |
|||
default: |
|||
return(E_BADPARM); |
|||
} |
|||
/* NOTREACHED */ |
|||
} |
|||
|
|||
1308
src/spicelib/devices/bsim4/b4check.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,201 +1,199 @@ |
|||
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/ |
|||
|
|||
/********** |
|||
* 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" |
|||
#include <stdio.h> |
|||
#include <math.h> |
|||
#include "cktdefs.h" |
|||
#include "bsim4def.h" |
|||
#include "trandefs.h" |
|||
#include "const.h" |
|||
#include "devdefs.h" |
|||
#include "sperror.h" |
|||
|
|||
|
|||
|
|||
int |
|||
BSIM4convTest(inModel,ckt) |
|||
GENmodel *inModel; |
|||
CKTcircuit *ckt; |
|||
{ |
|||
BSIM4model *model = (BSIM4model*)inModel; |
|||
BSIM4instance *here; |
|||
double delvbd, delvbs, delvds, delvgd, delvgs; |
|||
double delvdbd, delvsbs; |
|||
double delvbd_jct, delvbs_jct; |
|||
double vds, vgs, vgd, vgdo, vbs, vbd; |
|||
double vdbd, vdbs, vsbs; |
|||
double cbhat, cdhat, Idtot, Ibtot; |
|||
double vses, vdes, vdedo, delvses, delvded, delvdes; |
|||
double Isestot, cseshat, Idedtot, cdedhat; |
|||
double Igstot, cgshat, Igdtot, cgdhat, Igbtot, cgbhat; |
|||
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 |
|||
* (*(ckt->CKTrhsOld + here->BSIM4dNodePrime) |
|||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); |
|||
vgs = model->BSIM4type |
|||
* (*(ckt->CKTrhsOld + here->BSIM4gNodePrime) |
|||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); |
|||
vbs = model->BSIM4type |
|||
* (*(ckt->CKTrhsOld + here->BSIM4bNodePrime) |
|||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); |
|||
vdbs = model->BSIM4type |
|||
* (*(ckt->CKTrhsOld + here->BSIM4dbNode) |
|||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); |
|||
vsbs = model->BSIM4type |
|||
* (*(ckt->CKTrhsOld + here->BSIM4sbNode) |
|||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); |
|||
vses = model->BSIM4type |
|||
* (*(ckt->CKTrhsOld + here->BSIM4sNode) |
|||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); |
|||
vdes = model->BSIM4type |
|||
* (*(ckt->CKTrhsOld + here->BSIM4dNode) |
|||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); |
|||
|
|||
vgdo = *(ckt->CKTstate0 + here->BSIM4vgs) |
|||
- *(ckt->CKTstate0 + here->BSIM4vds); |
|||
vbd = vbs - vds; |
|||
vdbd = vdbs - vds; |
|||
vgd = vgs - vds; |
|||
|
|||
delvbd = vbd - *(ckt->CKTstate0 + here->BSIM4vbd); |
|||
delvdbd = vdbd - *(ckt->CKTstate0 + here->BSIM4vdbd); |
|||
delvgd = vgd - vgdo; |
|||
|
|||
delvds = vds - *(ckt->CKTstate0 + here->BSIM4vds); |
|||
delvgs = vgs - *(ckt->CKTstate0 + here->BSIM4vgs); |
|||
delvbs = vbs - *(ckt->CKTstate0 + here->BSIM4vbs); |
|||
delvsbs = vsbs - *(ckt->CKTstate0 + here->BSIM4vsbs); |
|||
|
|||
delvses = vses - (*(ckt->CKTstate0 + here->BSIM4vses)); |
|||
vdedo = *(ckt->CKTstate0 + here->BSIM4vdes) |
|||
- *(ckt->CKTstate0 + here->BSIM4vds); |
|||
delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4vdes); |
|||
delvded = vdes - vds - vdedo; |
|||
|
|||
delvbd_jct = (!here->BSIM4rbodyMod) ? delvbd : delvdbd; |
|||
delvbs_jct = (!here->BSIM4rbodyMod) ? delvbs : delvsbs; |
|||
|
|||
if (here->BSIM4mode >= 0) |
|||
{ Idtot = here->BSIM4cd + here->BSIM4csub - here->BSIM4cbd |
|||
+ here->BSIM4Igidl; |
|||
cdhat = Idtot - here->BSIM4gbd * delvbd_jct |
|||
+ (here->BSIM4gmbs + here->BSIM4gbbs + here->BSIM4ggidlb) * delvbs |
|||
+ (here->BSIM4gm + here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs |
|||
+ (here->BSIM4gds + here->BSIM4gbds + here->BSIM4ggidld) * delvds; |
|||
|
|||
Igstot = here->BSIM4Igs + here->BSIM4Igcs; |
|||
cgshat = Igstot + (here->BSIM4gIgsg + here->BSIM4gIgcsg) * delvgs |
|||
+ here->BSIM4gIgcsd * delvds + here->BSIM4gIgcsb * delvbs; |
|||
|
|||
Igdtot = here->BSIM4Igd + here->BSIM4Igcd; |
|||
cgdhat = Igdtot + here->BSIM4gIgdg * delvgd + here->BSIM4gIgcdg * delvgs |
|||
+ here->BSIM4gIgcdd * delvds + here->BSIM4gIgcdb * delvbs; |
|||
|
|||
Igbtot = here->BSIM4Igb; |
|||
cgbhat = here->BSIM4Igb + here->BSIM4gIgbg * delvgs + here->BSIM4gIgbd |
|||
* delvds + here->BSIM4gIgbb * delvbs; |
|||
} |
|||
else |
|||
{ 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 |
|||
- here->BSIM4gIgcdd * delvds + here->BSIM4gIgcdb * delvbd; |
|||
|
|||
Igdtot = here->BSIM4Igd + here->BSIM4Igcs; |
|||
cgdhat = Igdtot + (here->BSIM4gIgdg + here->BSIM4gIgcsg) * delvgd |
|||
- here->BSIM4gIgcsd * delvds + here->BSIM4gIgcsb * delvbd; |
|||
|
|||
Igbtot = here->BSIM4Igb; |
|||
cgbhat = here->BSIM4Igb + here->BSIM4gIgbg * delvgd - here->BSIM4gIgbd |
|||
* delvds + here->BSIM4gIgbb * delvbd; |
|||
} |
|||
|
|||
Isestot = here->BSIM4gstot * (*(ckt->CKTstate0 + here->BSIM4vses)); |
|||
cseshat = Isestot + here->BSIM4gstot * delvses |
|||
+ here->BSIM4gstotd * delvds + here->BSIM4gstotg * delvgs |
|||
+ here->BSIM4gstotb * delvbs; |
|||
|
|||
Idedtot = here->BSIM4gdtot * vdedo; |
|||
cdedhat = Idedtot + here->BSIM4gdtot * delvded |
|||
+ here->BSIM4gdtotd * delvds + here->BSIM4gdtotg * delvgs |
|||
+ here->BSIM4gdtotb * delvbs; |
|||
|
|||
/* |
|||
* Check convergence |
|||
*/ |
|||
|
|||
if ((here->BSIM4off == 0) || (!(ckt->CKTmode & MODEINITFIX))) |
|||
{ 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++; |
|||
return(OK); |
|||
} |
|||
|
|||
if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4) |
|||
|| (fabs(cgbhat - Igbtot) >= tol5)) |
|||
{ ckt->CKTnoncon++; |
|||
return(OK); |
|||
} |
|||
|
|||
Ibtot = here->BSIM4cbs + here->BSIM4cbd |
|||
- 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->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->BSIM4ggislg * delvgs - here->BSIM4ggislb * delvbs + here->BSIM4ggisls * delvds; |
|||
} |
|||
tol6 = ckt->CKTreltol * MAX(fabs(cbhat), |
|||
fabs(Ibtot)) + ckt->CKTabstol; |
|||
if (fabs(cbhat - Ibtot) > tol6) |
|||
{ ckt->CKTnoncon++; |
|||
return(OK); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ |
|||
|
|||
/********** |
|||
* Copyright 2004 Regents of the University of California. All rights reserved. |
|||
* File: b4cvtest.c of BSIM4.4.0. |
|||
* Author: 2000 Weidong Liu |
|||
* Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. |
|||
* Project Director: Prof. Chenming Hu. |
|||
* Modified by Xuemei Xi, 04/06/2001. |
|||
* Modified by Xuemei Xi, 10/05/2001. |
|||
* Modified by Xuemei Xi, 05/09/2003. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "bsim4def.h" |
|||
#include "trandefs.h" |
|||
#include "const.h" |
|||
#include "devdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
int |
|||
BSIM4convTest(inModel,ckt) |
|||
GENmodel *inModel; |
|||
CKTcircuit *ckt; |
|||
{ |
|||
BSIM4model *model = (BSIM4model*)inModel; |
|||
BSIM4instance *here; |
|||
double delvbd, delvbs, delvds, delvgd, delvgs; |
|||
double delvdbd, delvsbs; |
|||
double delvbd_jct, delvbs_jct; |
|||
double vds, vgs, vgd, vgdo, vbs, vbd; |
|||
double vdbd, vdbs, vsbs; |
|||
double cbhat, cdhat, Idtot, Ibtot; |
|||
double vses, vdes, vdedo, delvses, delvded, delvdes; |
|||
double Isestot, cseshat, Idedtot, cdedhat; |
|||
double Igstot, cgshat, Igdtot, cgdhat, Igbtot, cgbhat; |
|||
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 |
|||
* (*(ckt->CKTrhsOld + here->BSIM4dNodePrime) |
|||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); |
|||
vgs = model->BSIM4type |
|||
* (*(ckt->CKTrhsOld + here->BSIM4gNodePrime) |
|||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); |
|||
vbs = model->BSIM4type |
|||
* (*(ckt->CKTrhsOld + here->BSIM4bNodePrime) |
|||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); |
|||
vdbs = model->BSIM4type |
|||
* (*(ckt->CKTrhsOld + here->BSIM4dbNode) |
|||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); |
|||
vsbs = model->BSIM4type |
|||
* (*(ckt->CKTrhsOld + here->BSIM4sbNode) |
|||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); |
|||
vses = model->BSIM4type |
|||
* (*(ckt->CKTrhsOld + here->BSIM4sNode) |
|||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); |
|||
vdes = model->BSIM4type |
|||
* (*(ckt->CKTrhsOld + here->BSIM4dNode) |
|||
- *(ckt->CKTrhsOld + here->BSIM4sNodePrime)); |
|||
|
|||
vgdo = *(ckt->CKTstate0 + here->BSIM4vgs) |
|||
- *(ckt->CKTstate0 + here->BSIM4vds); |
|||
vbd = vbs - vds; |
|||
vdbd = vdbs - vds; |
|||
vgd = vgs - vds; |
|||
|
|||
delvbd = vbd - *(ckt->CKTstate0 + here->BSIM4vbd); |
|||
delvdbd = vdbd - *(ckt->CKTstate0 + here->BSIM4vdbd); |
|||
delvgd = vgd - vgdo; |
|||
|
|||
delvds = vds - *(ckt->CKTstate0 + here->BSIM4vds); |
|||
delvgs = vgs - *(ckt->CKTstate0 + here->BSIM4vgs); |
|||
delvbs = vbs - *(ckt->CKTstate0 + here->BSIM4vbs); |
|||
delvsbs = vsbs - *(ckt->CKTstate0 + here->BSIM4vsbs); |
|||
|
|||
delvses = vses - (*(ckt->CKTstate0 + here->BSIM4vses)); |
|||
vdedo = *(ckt->CKTstate0 + here->BSIM4vdes) |
|||
- *(ckt->CKTstate0 + here->BSIM4vds); |
|||
delvdes = vdes - *(ckt->CKTstate0 + here->BSIM4vdes); |
|||
delvded = vdes - vds - vdedo; |
|||
|
|||
delvbd_jct = (!here->BSIM4rbodyMod) ? delvbd : delvdbd; |
|||
delvbs_jct = (!here->BSIM4rbodyMod) ? delvbs : delvsbs; |
|||
|
|||
if (here->BSIM4mode >= 0) |
|||
{ Idtot = here->BSIM4cd + here->BSIM4csub - here->BSIM4cbd |
|||
+ here->BSIM4Igidl; |
|||
cdhat = Idtot - here->BSIM4gbd * delvbd_jct |
|||
+ (here->BSIM4gmbs + here->BSIM4gbbs + here->BSIM4ggidlb) * delvbs |
|||
+ (here->BSIM4gm + here->BSIM4gbgs + here->BSIM4ggidlg) * delvgs |
|||
+ (here->BSIM4gds + here->BSIM4gbds + here->BSIM4ggidld) * delvds; |
|||
|
|||
Igstot = here->BSIM4Igs + here->BSIM4Igcs; |
|||
cgshat = Igstot + (here->BSIM4gIgsg + here->BSIM4gIgcsg) * delvgs |
|||
+ here->BSIM4gIgcsd * delvds + here->BSIM4gIgcsb * delvbs; |
|||
|
|||
Igdtot = here->BSIM4Igd + here->BSIM4Igcd; |
|||
cgdhat = Igdtot + here->BSIM4gIgdg * delvgd + here->BSIM4gIgcdg * delvgs |
|||
+ here->BSIM4gIgcdd * delvds + here->BSIM4gIgcdb * delvbs; |
|||
|
|||
Igbtot = here->BSIM4Igb; |
|||
cgbhat = here->BSIM4Igb + here->BSIM4gIgbg * delvgs + here->BSIM4gIgbd |
|||
* delvds + here->BSIM4gIgbb * delvbs; |
|||
} |
|||
else |
|||
{ Idtot = here->BSIM4cd + here->BSIM4cbd - here->BSIM4Igidl; /* bugfix */ |
|||
cdhat = Idtot + here->BSIM4gbd * delvbd_jct + here->BSIM4gmbs |
|||
* delvbd + here->BSIM4gm * delvgd |
|||
- (here->BSIM4gds + here->BSIM4ggidls) * delvds |
|||
- here->BSIM4ggidlg * delvgs - here->BSIM4ggidlb * delvbs; |
|||
|
|||
Igstot = here->BSIM4Igs + here->BSIM4Igcd; |
|||
cgshat = Igstot + here->BSIM4gIgsg * delvgs + here->BSIM4gIgcdg * delvgd |
|||
- here->BSIM4gIgcdd * delvds + here->BSIM4gIgcdb * delvbd; |
|||
|
|||
Igdtot = here->BSIM4Igd + here->BSIM4Igcs; |
|||
cgdhat = Igdtot + (here->BSIM4gIgdg + here->BSIM4gIgcsg) * delvgd |
|||
- here->BSIM4gIgcsd * delvds + here->BSIM4gIgcsb * delvbd; |
|||
|
|||
Igbtot = here->BSIM4Igb; |
|||
cgbhat = here->BSIM4Igb + here->BSIM4gIgbg * delvgd - here->BSIM4gIgbd |
|||
* delvds + here->BSIM4gIgbb * delvbd; |
|||
} |
|||
|
|||
Isestot = here->BSIM4gstot * (*(ckt->CKTstate0 + here->BSIM4vses)); |
|||
cseshat = Isestot + here->BSIM4gstot * delvses |
|||
+ here->BSIM4gstotd * delvds + here->BSIM4gstotg * delvgs |
|||
+ here->BSIM4gstotb * delvbs; |
|||
|
|||
Idedtot = here->BSIM4gdtot * vdedo; |
|||
cdedhat = Idedtot + here->BSIM4gdtot * delvded |
|||
+ here->BSIM4gdtotd * delvds + here->BSIM4gdtotg * delvgs |
|||
+ here->BSIM4gdtotb * delvbs; |
|||
|
|||
/* |
|||
* Check convergence |
|||
*/ |
|||
|
|||
if ((here->BSIM4off == 0) || (!(ckt->CKTmode & MODEINITFIX))) |
|||
{ 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++; |
|||
return(OK); |
|||
} |
|||
|
|||
if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4) |
|||
|| (fabs(cgbhat - Igbtot) >= tol5)) |
|||
{ ckt->CKTnoncon++; |
|||
return(OK); |
|||
} |
|||
|
|||
Ibtot = here->BSIM4cbs + here->BSIM4cbd |
|||
- 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->BSIM4ggislg * delvgd - here->BSIM4ggislb* delvbd + here->BSIM4ggisls * delvds ; |
|||
} |
|||
else |
|||
{ cbhat = Ibtot + here->BSIM4gbs * delvbs_jct + here->BSIM4gbd |
|||
* delvbd_jct - (here->BSIM4gbbs + here->BSIM4ggislb) * delvbd |
|||
- (here->BSIM4gbgs + here->BSIM4ggislg) * delvgd |
|||
+ (here->BSIM4gbds + here->BSIM4ggisld - here->BSIM4ggidls) * delvds |
|||
- here->BSIM4ggidlg * delvgs - here->BSIM4ggidlb * delvbs; |
|||
} |
|||
tol6 = ckt->CKTreltol * MAX(fabs(cbhat), |
|||
fabs(Ibtot)) + ckt->CKTabstol; |
|||
if (fabs(cbhat - Ibtot) > tol6) |
|||
{ ckt->CKTnoncon++; |
|||
return(OK); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
@ -1,41 +1,41 @@ |
|||
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/ |
|||
|
|||
/********** |
|||
* 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. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include <stdio.h> |
|||
#include "bsim4def.h" |
|||
#include "sperror.h" |
|||
#include "gendefs.h" |
|||
|
|||
|
|||
int |
|||
BSIM4delete(inModel,name,inInst) |
|||
GENmodel *inModel; |
|||
IFuid name; |
|||
GENinstance **inInst; |
|||
{ |
|||
BSIM4instance **fast = (BSIM4instance**)inInst; |
|||
BSIM4model *model = (BSIM4model*)inModel; |
|||
BSIM4instance **prev = NULL; |
|||
BSIM4instance *here; |
|||
|
|||
for (; model ; model = model->BSIM4nextModel) |
|||
{ prev = &(model->BSIM4instances); |
|||
for (here = *prev; here ; here = *prev) |
|||
{ if (here->BSIM4name == name || (fast && here==*fast)) |
|||
{ *prev= here->BSIM4nextInstance; |
|||
FREE(here); |
|||
return(OK); |
|||
} |
|||
prev = &(here->BSIM4nextInstance); |
|||
} |
|||
} |
|||
return(E_NODEV); |
|||
} |
|||
/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ |
|||
|
|||
/********** |
|||
* Copyright 2004 Regents of the University of California. All rights reserved. |
|||
* File: b4del.c of BSIM4.4.0. |
|||
* Author: 2000 Weidong Liu |
|||
* Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. |
|||
* Project Director: Prof. Chenming Hu. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "bsim4def.h" |
|||
#include "sperror.h" |
|||
#include "gendefs.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
int |
|||
BSIM4delete(inModel,name,inInst) |
|||
GENmodel *inModel; |
|||
IFuid name; |
|||
GENinstance **inInst; |
|||
{ |
|||
BSIM4instance **fast = (BSIM4instance**)inInst; |
|||
BSIM4model *model = (BSIM4model*)inModel; |
|||
BSIM4instance **prev = NULL; |
|||
BSIM4instance *here; |
|||
|
|||
for (; model ; model = model->BSIM4nextModel) |
|||
{ prev = &(model->BSIM4instances); |
|||
for (here = *prev; here ; here = *prev) |
|||
{ if (here->BSIM4name == name || (fast && here==*fast)) |
|||
{ *prev= here->BSIM4nextInstance; |
|||
FREE(here); |
|||
return(OK); |
|||
} |
|||
prev = &(here->BSIM4nextInstance); |
|||
} |
|||
} |
|||
return(E_NODEV); |
|||
} |
|||
@ -1,38 +1,38 @@ |
|||
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/ |
|||
|
|||
/********** |
|||
* 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. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include <stdio.h> |
|||
#include "bsim4def.h" |
|||
|
|||
void |
|||
BSIM4destroy(inModel) |
|||
GENmodel **inModel; |
|||
{ |
|||
BSIM4model **model = (BSIM4model**)inModel; |
|||
BSIM4instance *here; |
|||
BSIM4instance *prev = NULL; |
|||
BSIM4model *mod = *model; |
|||
BSIM4model *oldmod = NULL; |
|||
|
|||
for (; mod ; mod = mod->BSIM4nextModel) |
|||
{ if(oldmod) FREE(oldmod); |
|||
oldmod = mod; |
|||
prev = (BSIM4instance *)NULL; |
|||
for (here = mod->BSIM4instances; here; here = here->BSIM4nextInstance) |
|||
{ if(prev) FREE(prev); |
|||
prev = here; |
|||
} |
|||
if(prev) FREE(prev); |
|||
} |
|||
if(oldmod) FREE(oldmod); |
|||
*model = NULL; |
|||
return; |
|||
} |
|||
/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ |
|||
|
|||
/********** |
|||
* Copyright 2004 Regents of the University of California. All rights reserved. |
|||
* File: b4dest.c of BSIM4.4.0. |
|||
* Author: 2000 Weidong Liu |
|||
* Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. |
|||
* Project Director: Prof. Chenming Hu. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "bsim4def.h" |
|||
#include "suffix.h" |
|||
|
|||
void |
|||
BSIM4destroy(inModel) |
|||
GENmodel **inModel; |
|||
{ |
|||
BSIM4model **model = (BSIM4model**)inModel; |
|||
BSIM4instance *here; |
|||
BSIM4instance *prev = NULL; |
|||
BSIM4model *mod = *model; |
|||
BSIM4model *oldmod = NULL; |
|||
|
|||
for (; mod ; mod = mod->BSIM4nextModel) |
|||
{ if(oldmod) FREE(oldmod); |
|||
oldmod = mod; |
|||
prev = (BSIM4instance *)NULL; |
|||
for (here = mod->BSIM4instances; here; here = here->BSIM4nextInstance) |
|||
{ if(prev) FREE(prev); |
|||
prev = here; |
|||
} |
|||
if(prev) FREE(prev); |
|||
} |
|||
if(oldmod) FREE(oldmod); |
|||
*model = NULL; |
|||
return; |
|||
} |
|||
@ -1,389 +1,385 @@ |
|||
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/ |
|||
|
|||
/********** |
|||
* 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. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include <stdio.h> |
|||
#include <math.h> |
|||
|
|||
int BSIM4RdsEndIso(double Weffcj, double Rsh, double DMCG, double DMCI, |
|||
double DMDG, double nuEnd, int rgeo, int Type, |
|||
double *Rend); |
|||
int BSIM4RdsEndSha(double Weffcj, double Rsh, double DMCG, double DMCI, |
|||
double DMDG, double nuEnd, int rgeo, int Type, |
|||
double *Rend); |
|||
|
|||
/* |
|||
* WDLiu: |
|||
* This subrutine is a special module to process the geometry dependent |
|||
* parasitics for BSIM4, which calculates Ps, Pd, As, Ad, and Rs and Rd |
|||
* for multi-fingers and varous GEO and RGEO options. |
|||
*/ |
|||
|
|||
int |
|||
BSIM4NumFingerDiff(nf, minSD, nuIntD, nuEndD, nuIntS, nuEndS) |
|||
int minSD; |
|||
double nf, *nuIntD, *nuEndD, *nuIntS, *nuEndS; |
|||
{ |
|||
int NF; |
|||
NF = (int)nf; |
|||
if ((NF%2) != 0) |
|||
{ *nuEndD = *nuEndS = 1.0; |
|||
*nuIntD = *nuIntS = 2.0 * MAX((nf - 1.0) / 2.0, 0.0); |
|||
} |
|||
else |
|||
{ if (minSD == 1) /* minimize # of source */ |
|||
{ *nuEndD = 2.0; |
|||
*nuIntD = 2.0 * MAX((nf / 2.0 - 1.0), 0.0); |
|||
*nuEndS = 0.0; |
|||
*nuIntS = nf; |
|||
} |
|||
else |
|||
{ *nuEndD = 0.0; |
|||
*nuIntD = nf; |
|||
*nuEndS = 2.0; |
|||
*nuIntS = 2.0 * MAX((nf / 2.0 - 1.0), 0.0); |
|||
} |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int |
|||
BSIM4PAeffGeo(nf, geo, minSD, Weffcj, DMCG, DMCI, DMDG, Ps, Pd, As, Ad) |
|||
int geo, minSD; |
|||
double Weffcj, DMCG, DMCI, DMDG; |
|||
double nf, *Ps, *Pd, *As, *Ad; |
|||
{ |
|||
double T0, T1, T2; |
|||
double ADiso, ADsha, ADmer, ASiso, ASsha, ASmer; |
|||
double PDiso, PDsha, PDmer, PSiso, PSsha, PSmer; |
|||
double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; |
|||
|
|||
if (geo < 9) /* For geo = 9 and 10, the numbers of S/D diffusions already known */ |
|||
BSIM4NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS); |
|||
|
|||
T0 = DMCG + DMCI; |
|||
T1 = DMCG + DMCG; |
|||
T2 = DMDG + DMDG; |
|||
|
|||
PSiso = PDiso = T0 + T0 + Weffcj; |
|||
PSsha = PDsha = T1; |
|||
PSmer = PDmer = T2; |
|||
|
|||
ASiso = ADiso = T0 * Weffcj; |
|||
ASsha = ADsha = DMCG * Weffcj; |
|||
ASmer = ADmer = DMDG * Weffcj; |
|||
|
|||
switch(geo) |
|||
{ case 0: |
|||
*Ps = nuEndS * PSiso + nuIntS * PSsha; |
|||
*Pd = nuEndD * PDiso + nuIntD * PDsha; |
|||
*As = nuEndS * ASiso + nuIntS * ASsha; |
|||
*Ad = nuEndD * ADiso + nuIntD * ADsha; |
|||
break; |
|||
case 1: |
|||
*Ps = nuEndS * PSiso + nuIntS * PSsha; |
|||
*Pd = (nuEndD + nuIntD) * PDsha; |
|||
*As = nuEndS * ASiso + nuIntS * ASsha; |
|||
*Ad = (nuEndD + nuIntD) * ADsha; |
|||
break; |
|||
case 2: |
|||
*Ps = (nuEndS + nuIntS) * PSsha; |
|||
*Pd = nuEndD * PDiso + nuIntD * PDsha; |
|||
*As = (nuEndS + nuIntS) * ASsha; |
|||
*Ad = nuEndD * ADiso + nuIntD * ADsha; |
|||
break; |
|||
case 3: |
|||
*Ps = (nuEndS + nuIntS) * PSsha; |
|||
*Pd = (nuEndD + nuIntD) * PDsha; |
|||
*As = (nuEndS + nuIntS) * ASsha; |
|||
*Ad = (nuEndD + nuIntD) * ADsha; |
|||
break; |
|||
case 4: |
|||
*Ps = nuEndS * PSiso + nuIntS * PSsha; |
|||
*Pd = nuEndD * PDmer + nuIntD * PDsha; |
|||
*As = nuEndS * ASiso + nuIntS * ASsha; |
|||
*Ad = nuEndD * ADmer + nuIntD * ADsha; |
|||
break; |
|||
case 5: |
|||
*Ps = (nuEndS + nuIntS) * PSsha; |
|||
*Pd = nuEndD * PDmer + nuIntD * PDsha; |
|||
*As = (nuEndS + nuIntS) * ASsha; |
|||
*Ad = nuEndD * ADmer + nuIntD * ADsha; |
|||
break; |
|||
case 6: |
|||
*Ps = nuEndS * PSmer + nuIntS * PSsha; |
|||
*Pd = nuEndD * PDiso + nuIntD * PDsha; |
|||
*As = nuEndS * ASmer + nuIntS * ASsha; |
|||
*Ad = nuEndD * ADiso + nuIntD * ADsha; |
|||
break; |
|||
case 7: |
|||
*Ps = nuEndS * PSmer + nuIntS * PSsha; |
|||
*Pd = (nuEndD + nuIntD) * PDsha; |
|||
*As = nuEndS * ASmer + nuIntS * ASsha; |
|||
*Ad = (nuEndD + nuIntD) * ADsha; |
|||
break; |
|||
case 8: |
|||
*Ps = nuEndS * PSmer + nuIntS * PSsha; |
|||
*Pd = nuEndD * PDmer + nuIntD * PDsha; |
|||
*As = nuEndS * ASmer + nuIntS * ASsha; |
|||
*Ad = nuEndD * ADmer + nuIntD * ADsha; |
|||
break; |
|||
case 9: /* geo = 9 and 10 happen only when nf = even */ |
|||
*Ps = PSiso + (nf - 1.0) * PSsha; |
|||
*Pd = nf * PDsha; |
|||
*As = ASiso + (nf - 1.0) * ASsha; |
|||
*Ad = nf * ADsha; |
|||
break; |
|||
case 10: |
|||
*Ps = nf * PSsha; |
|||
*Pd = PDiso + (nf - 1.0) * PDsha; |
|||
*As = nf * ASsha; |
|||
*Ad = ADiso + (nf - 1.0) * ADsha; |
|||
break; |
|||
default: |
|||
printf("Warning: Specified GEO = %d not matched\n", geo); |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int |
|||
BSIM4RdseffGeo(nf, geo, rgeo, minSD, Weffcj, Rsh, DMCG, DMCI, DMDG, Type, Rtot) |
|||
int geo, rgeo, minSD, Type; |
|||
double nf, Weffcj, Rsh, DMCG, DMCI, DMDG; |
|||
double *Rtot; |
|||
{ |
|||
double Rint = 0.0, Rend = 0.0; |
|||
double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; |
|||
|
|||
if (geo < 9) /* since geo = 9 and 10 only happen when nf = even */ |
|||
{ BSIM4NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS); |
|||
|
|||
/* Internal S/D resistance -- assume shared S or D and all wide contacts */ |
|||
if (Type == 1) |
|||
{ if (nuIntS == 0.0) |
|||
Rint = 0.0; |
|||
else |
|||
Rint = Rsh * DMCG / ( Weffcj * nuIntS); |
|||
} |
|||
else |
|||
{ if (nuIntD == 0.0) |
|||
Rint = 0.0; |
|||
else |
|||
Rint = Rsh * DMCG / ( Weffcj * nuIntD); |
|||
} |
|||
} |
|||
|
|||
/* End S/D resistance -- geo dependent */ |
|||
switch(geo) |
|||
{ case 0: |
|||
if (Type == 1) BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndS, rgeo, 1, &Rend); |
|||
else BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndD, rgeo, 0, &Rend); |
|||
break; |
|||
case 1: |
|||
if (Type == 1) BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndS, rgeo, 1, &Rend); |
|||
else BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndD, rgeo, 0, &Rend); |
|||
break; |
|||
case 2: |
|||
if (Type == 1) BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndS, rgeo, 1, &Rend); |
|||
else BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndD, rgeo, 0, &Rend); |
|||
break; |
|||
case 3: |
|||
if (Type == 1) BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndS, rgeo, 1, &Rend); |
|||
else BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndD, rgeo, 0, &Rend); |
|||
break; |
|||
case 4: |
|||
if (Type == 1) BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndS, rgeo, 1, &Rend); |
|||
else Rend = Rsh * DMDG / Weffcj; |
|||
break; |
|||
case 5: |
|||
if (Type == 1) BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndS, rgeo, 1, &Rend); |
|||
else Rend = Rsh * DMDG / (Weffcj * nuEndD); |
|||
break; |
|||
case 6: |
|||
if (Type == 1) Rend = Rsh * DMDG / Weffcj; |
|||
else BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndD, rgeo, 0, &Rend); |
|||
break; |
|||
case 7: |
|||
if (Type == 1) Rend = Rsh * DMDG / (Weffcj * nuEndS); |
|||
else BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndD, rgeo, 0, &Rend); |
|||
break; |
|||
case 8: |
|||
Rend = Rsh * DMDG / Weffcj; |
|||
break; |
|||
case 9: /* all wide contacts assumed for geo = 9 and 10 */ |
|||
if (Type == 1) |
|||
{ Rend = 0.5 * Rsh * DMCG / Weffcj; |
|||
if (nf == 2.0) |
|||
Rint = 0.0; |
|||
else |
|||
Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); |
|||
} |
|||
else |
|||
{ Rend = 0.0; |
|||
Rint = Rsh * DMCG / (Weffcj * nf); |
|||
} |
|||
break; |
|||
case 10: |
|||
if (Type == 1) |
|||
{ Rend = 0.0; |
|||
Rint = Rsh * DMCG / (Weffcj * nf); |
|||
} |
|||
else |
|||
{ Rend = 0.5 * Rsh * DMCG / Weffcj;; |
|||
if (nf == 2.0) |
|||
Rint = 0.0; |
|||
else |
|||
Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); |
|||
} |
|||
break; |
|||
default: |
|||
printf("Warning: Specified GEO = %d not matched\n", geo); |
|||
} |
|||
|
|||
if (Rint <= 0.0) |
|||
*Rtot = Rend; |
|||
else if (Rend <= 0.0) |
|||
*Rtot = Rint; |
|||
else |
|||
*Rtot = Rint * Rend / (Rint + Rend); |
|||
if(*Rtot==0.0) |
|||
printf("Warning: Zero resistance returned from RdseffGeo\n"); |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int |
|||
BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEnd, rgeo, Type, Rend) |
|||
double Weffcj, Rsh, DMCG, DMCI, DMDG; |
|||
int rgeo, Type; |
|||
double nuEnd, *Rend; |
|||
{ |
|||
if (Type == 1) |
|||
{ switch(rgeo) |
|||
{ case 1: |
|||
case 2: |
|||
case 5: |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * DMCG / (Weffcj * nuEnd); |
|||
break; |
|||
case 3: |
|||
case 4: |
|||
case 6: |
|||
if ((DMCG + DMCI) == 0.0) |
|||
printf("(DMCG + DMCI) can not be equal to zero\n"); |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); |
|||
break; |
|||
default: |
|||
printf("Warning: Specified RGEO = %d not matched\n", rgeo); |
|||
} |
|||
} |
|||
else |
|||
{ switch(rgeo) |
|||
{ case 1: |
|||
case 3: |
|||
case 7: |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * DMCG / (Weffcj * nuEnd); |
|||
break; |
|||
case 2: |
|||
case 4: |
|||
case 8: |
|||
if ((DMCG + DMCI) == 0.0) |
|||
printf("(DMCG + DMCI) can not be equal to zero\n"); |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); |
|||
break; |
|||
default: |
|||
printf("Warning: Specified RGEO = %d not matched\n", rgeo); |
|||
} |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int |
|||
BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEnd, rgeo, Type, Rend) |
|||
double Weffcj, Rsh, DMCG, DMCI, DMDG; |
|||
int rgeo, Type; |
|||
double nuEnd, *Rend; |
|||
{ |
|||
if (Type == 1) |
|||
{ switch(rgeo) |
|||
{ case 1: |
|||
case 2: |
|||
case 5: |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * DMCG / (Weffcj * nuEnd); |
|||
break; |
|||
case 3: |
|||
case 4: |
|||
case 6: |
|||
if (DMCG == 0.0) |
|||
printf("DMCG can not be equal to zero\n"); |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); |
|||
break; |
|||
default: |
|||
printf("Warning: Specified RGEO = %d not matched\n", rgeo); |
|||
} |
|||
} |
|||
else |
|||
{ switch(rgeo) |
|||
{ case 1: |
|||
case 3: |
|||
case 7: |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * DMCG / (Weffcj * nuEnd); |
|||
break; |
|||
case 2: |
|||
case 4: |
|||
case 8: |
|||
if (DMCG == 0.0) |
|||
printf("DMCG can not be equal to zero\n"); |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); |
|||
break; |
|||
default: |
|||
printf("Warning: Specified RGEO = %d not matched\n", rgeo); |
|||
} |
|||
} |
|||
return 0; |
|||
} |
|||
/**** BSIM4.4.0 Released by Xuemei(Jane) Xi 03/04/2004 ****/ |
|||
|
|||
/********** |
|||
* Copyright 2003 Regents of the University of California. All rights reserved. |
|||
* File: b4geo.c of BSIM4.4.0. |
|||
* Author: 2000 Weidong Liu |
|||
* Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. |
|||
* Project Director: Prof. Chenming Hu. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
|
|||
/* |
|||
* WDLiu: |
|||
* This subrutine is a special module to process the geometry dependent |
|||
* parasitics for BSIM4, which calculates Ps, Pd, As, Ad, and Rs and Rd |
|||
* for multi-fingers and varous GEO and RGEO options. |
|||
*/ |
|||
|
|||
int |
|||
BSIM4RdsEndIso(double, double, double, double, double, double, int, int, double *); |
|||
int |
|||
BSIM4RdsEndSha(double, double, double, double, double, double, int, int, double *); |
|||
|
|||
int |
|||
BSIM4NumFingerDiff(nf, minSD, nuIntD, nuEndD, nuIntS, nuEndS) |
|||
int minSD; |
|||
double nf, *nuIntD, *nuEndD, *nuIntS, *nuEndS; |
|||
{ |
|||
int NF; |
|||
NF = (int)nf; |
|||
if ((NF%2) != 0) |
|||
{ *nuEndD = *nuEndS = 1.0; |
|||
*nuIntD = *nuIntS = 2.0 * MAX((nf - 1.0) / 2.0, 0.0); |
|||
} |
|||
else |
|||
{ if (minSD == 1) /* minimize # of source */ |
|||
{ *nuEndD = 2.0; |
|||
*nuIntD = 2.0 * MAX((nf / 2.0 - 1.0), 0.0); |
|||
*nuEndS = 0.0; |
|||
*nuIntS = nf; |
|||
} |
|||
else |
|||
{ *nuEndD = 0.0; |
|||
*nuIntD = nf; |
|||
*nuEndS = 2.0; |
|||
*nuIntS = 2.0 * MAX((nf / 2.0 - 1.0), 0.0); |
|||
} |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int |
|||
BSIM4PAeffGeo(nf, geo, minSD, Weffcj, DMCG, DMCI, DMDG, Ps, Pd, As, Ad) |
|||
int geo, minSD; |
|||
double Weffcj, DMCG, DMCI, DMDG; |
|||
double nf, *Ps, *Pd, *As, *Ad; |
|||
{ |
|||
double T0, T1, T2; |
|||
double ADiso, ADsha, ADmer, ASiso, ASsha, ASmer; |
|||
double PDiso, PDsha, PDmer, PSiso, PSsha, PSmer; |
|||
double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; |
|||
|
|||
if (geo < 9) /* For geo = 9 and 10, the numbers of S/D diffusions already known */ |
|||
BSIM4NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS); |
|||
|
|||
T0 = DMCG + DMCI; |
|||
T1 = DMCG + DMCG; |
|||
T2 = DMDG + DMDG; |
|||
|
|||
PSiso = PDiso = T0 + T0 + Weffcj; |
|||
PSsha = PDsha = T1; |
|||
PSmer = PDmer = T2; |
|||
|
|||
ASiso = ADiso = T0 * Weffcj; |
|||
ASsha = ADsha = DMCG * Weffcj; |
|||
ASmer = ADmer = DMDG * Weffcj; |
|||
|
|||
switch(geo) |
|||
{ case 0: |
|||
*Ps = nuEndS * PSiso + nuIntS * PSsha; |
|||
*Pd = nuEndD * PDiso + nuIntD * PDsha; |
|||
*As = nuEndS * ASiso + nuIntS * ASsha; |
|||
*Ad = nuEndD * ADiso + nuIntD * ADsha; |
|||
break; |
|||
case 1: |
|||
*Ps = nuEndS * PSiso + nuIntS * PSsha; |
|||
*Pd = (nuEndD + nuIntD) * PDsha; |
|||
*As = nuEndS * ASiso + nuIntS * ASsha; |
|||
*Ad = (nuEndD + nuIntD) * ADsha; |
|||
break; |
|||
case 2: |
|||
*Ps = (nuEndS + nuIntS) * PSsha; |
|||
*Pd = nuEndD * PDiso + nuIntD * PDsha; |
|||
*As = (nuEndS + nuIntS) * ASsha; |
|||
*Ad = nuEndD * ADiso + nuIntD * ADsha; |
|||
break; |
|||
case 3: |
|||
*Ps = (nuEndS + nuIntS) * PSsha; |
|||
*Pd = (nuEndD + nuIntD) * PDsha; |
|||
*As = (nuEndS + nuIntS) * ASsha; |
|||
*Ad = (nuEndD + nuIntD) * ADsha; |
|||
break; |
|||
case 4: |
|||
*Ps = nuEndS * PSiso + nuIntS * PSsha; |
|||
*Pd = nuEndD * PDmer + nuIntD * PDsha; |
|||
*As = nuEndS * ASiso + nuIntS * ASsha; |
|||
*Ad = nuEndD * ADmer + nuIntD * ADsha; |
|||
break; |
|||
case 5: |
|||
*Ps = (nuEndS + nuIntS) * PSsha; |
|||
*Pd = nuEndD * PDmer + nuIntD * PDsha; |
|||
*As = (nuEndS + nuIntS) * ASsha; |
|||
*Ad = nuEndD * ADmer + nuIntD * ADsha; |
|||
break; |
|||
case 6: |
|||
*Ps = nuEndS * PSmer + nuIntS * PSsha; |
|||
*Pd = nuEndD * PDiso + nuIntD * PDsha; |
|||
*As = nuEndS * ASmer + nuIntS * ASsha; |
|||
*Ad = nuEndD * ADiso + nuIntD * ADsha; |
|||
break; |
|||
case 7: |
|||
*Ps = nuEndS * PSmer + nuIntS * PSsha; |
|||
*Pd = (nuEndD + nuIntD) * PDsha; |
|||
*As = nuEndS * ASmer + nuIntS * ASsha; |
|||
*Ad = (nuEndD + nuIntD) * ADsha; |
|||
break; |
|||
case 8: |
|||
*Ps = nuEndS * PSmer + nuIntS * PSsha; |
|||
*Pd = nuEndD * PDmer + nuIntD * PDsha; |
|||
*As = nuEndS * ASmer + nuIntS * ASsha; |
|||
*Ad = nuEndD * ADmer + nuIntD * ADsha; |
|||
break; |
|||
case 9: /* geo = 9 and 10 happen only when nf = even */ |
|||
*Ps = PSiso + (nf - 1.0) * PSsha; |
|||
*Pd = nf * PDsha; |
|||
*As = ASiso + (nf - 1.0) * ASsha; |
|||
*Ad = nf * ADsha; |
|||
break; |
|||
case 10: |
|||
*Ps = nf * PSsha; |
|||
*Pd = PDiso + (nf - 1.0) * PDsha; |
|||
*As = nf * ASsha; |
|||
*Ad = ADiso + (nf - 1.0) * ADsha; |
|||
break; |
|||
default: |
|||
printf("Warning: Specified GEO = %d not matched\n", geo); |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int |
|||
BSIM4RdseffGeo(nf, geo, rgeo, minSD, Weffcj, Rsh, DMCG, DMCI, DMDG, Type, Rtot) |
|||
int geo, rgeo, minSD, Type; |
|||
double nf, Weffcj, Rsh, DMCG, DMCI, DMDG; |
|||
double *Rtot; |
|||
{ |
|||
double Rint, Rend = 0.0; |
|||
double nuIntD = 0.0, nuEndD = 0.0, nuIntS = 0.0, nuEndS = 0.0; |
|||
|
|||
if (geo < 9) /* since geo = 9 and 10 only happen when nf = even */ |
|||
{ BSIM4NumFingerDiff(nf, minSD, &nuIntD, &nuEndD, &nuIntS, &nuEndS); |
|||
|
|||
/* Internal S/D resistance -- assume shared S or D and all wide contacts */ |
|||
if (Type == 1) |
|||
{ if (nuIntS == 0.0) |
|||
Rint = 0.0; |
|||
else |
|||
Rint = Rsh * DMCG / ( Weffcj * nuIntS); |
|||
} |
|||
else |
|||
{ if (nuIntD == 0.0) |
|||
Rint = 0.0; |
|||
else |
|||
Rint = Rsh * DMCG / ( Weffcj * nuIntD); |
|||
} |
|||
} |
|||
|
|||
/* End S/D resistance -- geo dependent */ |
|||
switch(geo) |
|||
{ case 0: |
|||
if (Type == 1) BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndS, rgeo, 1, &Rend); |
|||
else BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndD, rgeo, 0, &Rend); |
|||
break; |
|||
case 1: |
|||
if (Type == 1) BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndS, rgeo, 1, &Rend); |
|||
else BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndD, rgeo, 0, &Rend); |
|||
break; |
|||
case 2: |
|||
if (Type == 1) BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndS, rgeo, 1, &Rend); |
|||
else BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndD, rgeo, 0, &Rend); |
|||
break; |
|||
case 3: |
|||
if (Type == 1) BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndS, rgeo, 1, &Rend); |
|||
else BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndD, rgeo, 0, &Rend); |
|||
break; |
|||
case 4: |
|||
if (Type == 1) BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndS, rgeo, 1, &Rend); |
|||
else Rend = Rsh * DMDG / Weffcj; |
|||
break; |
|||
case 5: |
|||
if (Type == 1) BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndS, rgeo, 1, &Rend); |
|||
else Rend = Rsh * DMDG / (Weffcj * nuEndD); |
|||
break; |
|||
case 6: |
|||
if (Type == 1) Rend = Rsh * DMDG / Weffcj; |
|||
else BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndD, rgeo, 0, &Rend); |
|||
break; |
|||
case 7: |
|||
if (Type == 1) Rend = Rsh * DMDG / (Weffcj * nuEndS); |
|||
else BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, |
|||
nuEndD, rgeo, 0, &Rend); |
|||
break; |
|||
case 8: |
|||
Rend = Rsh * DMDG / Weffcj; |
|||
break; |
|||
case 9: /* all wide contacts assumed for geo = 9 and 10 */ |
|||
if (Type == 1) |
|||
{ Rend = 0.5 * Rsh * DMCG / Weffcj; |
|||
if (nf == 2.0) |
|||
Rint = 0.0; |
|||
else |
|||
Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); |
|||
} |
|||
else |
|||
{ Rend = 0.0; |
|||
Rint = Rsh * DMCG / (Weffcj * nf); |
|||
} |
|||
break; |
|||
case 10: |
|||
if (Type == 1) |
|||
{ Rend = 0.0; |
|||
Rint = Rsh * DMCG / (Weffcj * nf); |
|||
} |
|||
else |
|||
{ Rend = 0.5 * Rsh * DMCG / Weffcj;; |
|||
if (nf == 2.0) |
|||
Rint = 0.0; |
|||
else |
|||
Rint = Rsh * DMCG / (Weffcj * (nf - 2.0)); |
|||
} |
|||
break; |
|||
default: |
|||
printf("Warning: Specified GEO = %d not matched\n", geo); |
|||
} |
|||
|
|||
if (Rint <= 0.0) |
|||
*Rtot = Rend; |
|||
else if (Rend <= 0.0) |
|||
*Rtot = Rint; |
|||
else |
|||
*Rtot = Rint * Rend / (Rint + Rend); |
|||
if(*Rtot==0.0) |
|||
printf("Warning: Zero resistance returned from RdseffGeo\n"); |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int |
|||
BSIM4RdsEndIso(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEnd, rgeo, Type, Rend) |
|||
double Weffcj, Rsh, DMCG, DMCI, DMDG; |
|||
int rgeo, Type; |
|||
double nuEnd, *Rend; |
|||
{ |
|||
if (Type == 1) |
|||
{ switch(rgeo) |
|||
{ case 1: |
|||
case 2: |
|||
case 5: |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * DMCG / (Weffcj * nuEnd); |
|||
break; |
|||
case 3: |
|||
case 4: |
|||
case 6: |
|||
if ((DMCG + DMCI) == 0.0) |
|||
printf("(DMCG + DMCI) can not be equal to zero\n"); |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); |
|||
break; |
|||
default: |
|||
printf("Warning: Specified RGEO = %d not matched\n", rgeo); |
|||
} |
|||
} |
|||
else |
|||
{ switch(rgeo) |
|||
{ case 1: |
|||
case 3: |
|||
case 7: |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * DMCG / (Weffcj * nuEnd); |
|||
break; |
|||
case 2: |
|||
case 4: |
|||
case 8: |
|||
if ((DMCG + DMCI) == 0.0) |
|||
printf("(DMCG + DMCI) can not be equal to zero\n"); |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * Weffcj / (3.0 * nuEnd * (DMCG + DMCI)); |
|||
break; |
|||
default: |
|||
printf("Warning: Specified RGEO = %d not matched\n", rgeo); |
|||
} |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
|
|||
int |
|||
BSIM4RdsEndSha(Weffcj, Rsh, DMCG, DMCI, DMDG, nuEnd, rgeo, Type, Rend) |
|||
double Weffcj, Rsh, DMCG, DMCI, DMDG; |
|||
int rgeo, Type; |
|||
double nuEnd, *Rend; |
|||
{ |
|||
if (Type == 1) |
|||
{ switch(rgeo) |
|||
{ case 1: |
|||
case 2: |
|||
case 5: |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * DMCG / (Weffcj * nuEnd); |
|||
break; |
|||
case 3: |
|||
case 4: |
|||
case 6: |
|||
if (DMCG == 0.0) |
|||
printf("DMCG can not be equal to zero\n"); |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); |
|||
break; |
|||
default: |
|||
printf("Warning: Specified RGEO = %d not matched\n", rgeo); |
|||
} |
|||
} |
|||
else |
|||
{ switch(rgeo) |
|||
{ case 1: |
|||
case 3: |
|||
case 7: |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * DMCG / (Weffcj * nuEnd); |
|||
break; |
|||
case 2: |
|||
case 4: |
|||
case 8: |
|||
if (DMCG == 0.0) |
|||
printf("DMCG can not be equal to zero\n"); |
|||
if (nuEnd == 0.0) |
|||
*Rend = 0.0; |
|||
else |
|||
*Rend = Rsh * Weffcj / (6.0 * nuEnd * DMCG); |
|||
break; |
|||
default: |
|||
printf("Warning: Specified RGEO = %d not matched\n", rgeo); |
|||
} |
|||
} |
|||
return 0; |
|||
} |
|||
@ -1,44 +1,44 @@ |
|||
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/ |
|||
|
|||
/********** |
|||
* 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. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include <stdio.h> |
|||
#include "cktdefs.h" |
|||
#include "bsim4def.h" |
|||
#include "sperror.h" |
|||
|
|||
|
|||
int |
|||
BSIM4getic(inModel,ckt) |
|||
GENmodel *inModel; |
|||
CKTcircuit *ckt; |
|||
{ |
|||
BSIM4model *model = (BSIM4model*)inModel; |
|||
BSIM4instance *here; |
|||
|
|||
for (; model ; model = model->BSIM4nextModel) |
|||
{ for (here = model->BSIM4instances; here; here = here->BSIM4nextInstance) |
|||
{ if (here->BSIM4owner != ARCHme) continue; |
|||
if (!here->BSIM4icVDSGiven) |
|||
{ here->BSIM4icVDS = *(ckt->CKTrhs + here->BSIM4dNode) |
|||
- *(ckt->CKTrhs + here->BSIM4sNode); |
|||
} |
|||
if (!here->BSIM4icVGSGiven) |
|||
{ here->BSIM4icVGS = *(ckt->CKTrhs + here->BSIM4gNodeExt) |
|||
- *(ckt->CKTrhs + here->BSIM4sNode); |
|||
} |
|||
if(!here->BSIM4icVBSGiven) |
|||
{ here->BSIM4icVBS = *(ckt->CKTrhs + here->BSIM4bNode) |
|||
- *(ckt->CKTrhs + here->BSIM4sNode); |
|||
} |
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ |
|||
|
|||
/********** |
|||
* Copyright 2004 Regents of the University of California. All rights reserved. |
|||
* File: b4getic.c of BSIM4.4.0. |
|||
* Author: 2000 Weidong Liu |
|||
* Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. |
|||
* Project Director: Prof. Chenming Hu. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "bsim4def.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
int |
|||
BSIM4getic(inModel,ckt) |
|||
GENmodel *inModel; |
|||
CKTcircuit *ckt; |
|||
{ |
|||
BSIM4model *model = (BSIM4model*)inModel; |
|||
BSIM4instance *here; |
|||
|
|||
for (; model ; model = model->BSIM4nextModel) |
|||
{ for (here = model->BSIM4instances; here; here = here->BSIM4nextInstance) |
|||
{ if (here->BSIM4owner != ARCHme) continue; |
|||
if (!here->BSIM4icVDSGiven) |
|||
{ here->BSIM4icVDS = *(ckt->CKTrhs + here->BSIM4dNode) |
|||
- *(ckt->CKTrhs + here->BSIM4sNode); |
|||
} |
|||
if (!here->BSIM4icVGSGiven) |
|||
{ here->BSIM4icVGS = *(ckt->CKTrhs + here->BSIM4gNodeExt) |
|||
- *(ckt->CKTrhs + here->BSIM4sNode); |
|||
} |
|||
if(!here->BSIM4icVBSGiven) |
|||
{ here->BSIM4icVBS = *(ckt->CKTrhs + here->BSIM4bNode) |
|||
- *(ckt->CKTrhs + here->BSIM4sNode); |
|||
} |
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
9228
src/spicelib/devices/bsim4/b4ld.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
3845
src/spicelib/devices/bsim4/b4mask.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,47 +1,47 @@ |
|||
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/ |
|||
|
|||
/********** |
|||
* 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. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include <stdio.h> |
|||
#include "bsim4def.h" |
|||
#include "sperror.h" |
|||
|
|||
|
|||
int |
|||
BSIM4mDelete(inModel,modname,kill) |
|||
GENmodel **inModel; |
|||
IFuid modname; |
|||
GENmodel *kill; |
|||
{ |
|||
BSIM4model **model = (BSIM4model**)inModel; |
|||
BSIM4model *modfast = (BSIM4model*)kill; |
|||
BSIM4instance *here; |
|||
BSIM4instance *prev = NULL; |
|||
BSIM4model **oldmod; |
|||
|
|||
oldmod = model; |
|||
for (; *model ; model = &((*model)->BSIM4nextModel)) |
|||
{ if ((*model)->BSIM4modName == modname || |
|||
(modfast && *model == modfast)) |
|||
goto delgot; |
|||
oldmod = model; |
|||
} |
|||
return(E_NOMOD); |
|||
|
|||
delgot: |
|||
*oldmod = (*model)->BSIM4nextModel; /* cut deleted device out of list */ |
|||
for (here = (*model)->BSIM4instances; here; here = here->BSIM4nextInstance) |
|||
{ if(prev) FREE(prev); |
|||
prev = here; |
|||
} |
|||
if(prev) FREE(prev); |
|||
FREE(*model); |
|||
return(OK); |
|||
} |
|||
/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ |
|||
|
|||
/********** |
|||
* Copyright 2004 Regents of the University of California. All rights reserved. |
|||
* File: b4mdel.c of BSIM4.4.0. |
|||
* Author: 2000 Weidong Liu |
|||
* Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. |
|||
* Project Director: Prof. Chenming Hu. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "bsim4def.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
int |
|||
BSIM4mDelete(inModel,modname,kill) |
|||
GENmodel **inModel; |
|||
IFuid modname; |
|||
GENmodel *kill; |
|||
{ |
|||
BSIM4model **model = (BSIM4model**)inModel; |
|||
BSIM4model *modfast = (BSIM4model*)kill; |
|||
BSIM4instance *here; |
|||
BSIM4instance *prev = NULL; |
|||
BSIM4model **oldmod; |
|||
|
|||
oldmod = model; |
|||
for (; *model ; model = &((*model)->BSIM4nextModel)) |
|||
{ if ((*model)->BSIM4modName == modname || |
|||
(modfast && *model == modfast)) |
|||
goto delgot; |
|||
oldmod = model; |
|||
} |
|||
return(E_NOMOD); |
|||
|
|||
delgot: |
|||
*oldmod = (*model)->BSIM4nextModel; /* cut deleted device out of list */ |
|||
for (here = (*model)->BSIM4instances; here; here = here->BSIM4nextInstance) |
|||
{ if(prev) FREE(prev); |
|||
prev = here; |
|||
} |
|||
if(prev) FREE(prev); |
|||
FREE(*model); |
|||
return(OK); |
|||
} |
|||
5333
src/spicelib/devices/bsim4/b4mpar.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,473 +1,488 @@ |
|||
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/ |
|||
|
|||
/********** |
|||
* 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 Xuemei Xi, 10/05/2001. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include <stdio.h> |
|||
#include <math.h> |
|||
#include "bsim4def.h" |
|||
#include "cktdefs.h" |
|||
#include "iferrmsg.h" |
|||
#include "noisedef.h" |
|||
#include "const.h" |
|||
|
|||
|
|||
extern void NevalSrc(); |
|||
extern double Nintegrate(); |
|||
|
|||
/* |
|||
* WDL: 1/f noise model has been smoothed out and enhanced with |
|||
* bulk charge effect as well as physical N* equ. and necessary |
|||
* conversion into the SI unit system. |
|||
*/ |
|||
|
|||
double |
|||
Eval1ovFNoise(Vds, model, here, freq, temp) |
|||
double Vds, freq, temp; |
|||
BSIM4model *model; |
|||
BSIM4instance *here; |
|||
{ |
|||
struct bsim4SizeDependParam *pParam; |
|||
double cd, esat, DelClm, EffFreq, N0, Nl; |
|||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; |
|||
|
|||
pParam = here->pParam; |
|||
cd = fabs(here->BSIM4cd); |
|||
esat = 2.0 * pParam->BSIM4vsattemp / here->BSIM4ueff; |
|||
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 |
|||
* pParam->BSIM4leff * pParam->BSIM4leff; |
|||
N0 = model->BSIM4coxe * here->BSIM4Vgsteff / CHARGE; |
|||
Nl = model->BSIM4coxe * here->BSIM4Vgsteff |
|||
* (1.0 - here->BSIM4AbovVgst2Vtm * here->BSIM4Vdseff) / CHARGE; |
|||
|
|||
T3 = model->BSIM4oxideTrapDensityA |
|||
* log(MAX(((N0 + here->BSIM4nstar) / (Nl + here->BSIM4nstar)), N_MINLOG)); |
|||
T4 = model->BSIM4oxideTrapDensityB * (N0 - Nl); |
|||
T5 = model->BSIM4oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); |
|||
|
|||
T6 = CONSTboltz * temp * cd * cd; |
|||
T7 = 1.0e10 * EffFreq * pParam->BSIM4leff |
|||
* pParam->BSIM4leff * pParam->BSIM4weff; |
|||
T8 = model->BSIM4oxideTrapDensityA + model->BSIM4oxideTrapDensityB * Nl |
|||
+ model->BSIM4oxideTrapDensityC * Nl * Nl; |
|||
T9 = (Nl + here->BSIM4nstar) * (Nl + here->BSIM4nstar); |
|||
Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; |
|||
return Ssi; |
|||
} |
|||
|
|||
|
|||
int |
|||
BSIM4noise (mode, operation, inModel, ckt, data, OnDens) |
|||
int mode, operation; |
|||
GENmodel *inModel; |
|||
CKTcircuit *ckt; |
|||
Ndata *data; |
|||
double *OnDens; |
|||
{ |
|||
BSIM4model *model = (BSIM4model *)inModel; |
|||
BSIM4instance *here; |
|||
struct bsim4SizeDependParam *pParam; |
|||
char name[N_MXVLNTH]; |
|||
double tempOnoise; |
|||
double tempInoise; |
|||
double noizDens[BSIM4NSRCS]; |
|||
double lnNdens[BSIM4NSRCS]; |
|||
|
|||
double T0, T1, T2, T5, T10, T11; |
|||
double Vds, Ssi, Swi; |
|||
double tmp = 0.0, gdpr, gspr, npart_theta = 0.0, npart_beta = 0.0, igsquare; |
|||
|
|||
int i; |
|||
|
|||
/* define the names of the noise sources */ |
|||
static char *BSIM4nNames[BSIM4NSRCS] = |
|||
{ /* Note that we have to keep the order */ |
|||
".rd", /* noise due to rd */ |
|||
".rs", /* noise due to rs */ |
|||
".rg", /* noise due to rgeltd */ |
|||
".rbps", /* noise due to rbps */ |
|||
".rbpd", /* noise due to rbpd */ |
|||
".rbpb", /* noise due to rbpb */ |
|||
".rbsb", /* noise due to rbsb */ |
|||
".rbdb", /* noise due to rbdb */ |
|||
".id", /* noise due to id */ |
|||
".1overf", /* flicker (1/f) noise */ |
|||
".igs", /* shot noise due to IGS */ |
|||
".igd", /* shot noise due to IGD */ |
|||
".igb", /* shot noise due to IGB */ |
|||
"" /* total transistor noise */ |
|||
}; |
|||
|
|||
for (; model != NULL; model = model->BSIM4nextModel) |
|||
{ for (here = model->BSIM4instances; here != NULL; |
|||
here = here->BSIM4nextInstance) |
|||
{ pParam = here->pParam; |
|||
switch (operation) |
|||
{ case N_OPEN: |
|||
/* see if we have to to produce a summary report */ |
|||
/* if so, name all the noise generators */ |
|||
|
|||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) |
|||
{ switch (mode) |
|||
{ case N_DENS: |
|||
for (i = 0; i < BSIM4NSRCS; i++) |
|||
{ (void) sprintf(name, "onoise.%s%s", |
|||
here->BSIM4name, |
|||
BSIM4nNames[i]); |
|||
data->namelist = (IFuid *) trealloc( |
|||
(char *) data->namelist, |
|||
(data->numPlots + 1) |
|||
* sizeof(IFuid)); |
|||
if (!data->namelist) |
|||
return(E_NOMEM); |
|||
(*(SPfrontEnd->IFnewUid)) (ckt, |
|||
&(data->namelist[data->numPlots++]), |
|||
(IFuid) NULL, name, UID_OTHER, |
|||
(void **) NULL); |
|||
/* we've added one more plot */ |
|||
} |
|||
break; |
|||
case INT_NOIZ: |
|||
for (i = 0; i < BSIM4NSRCS; i++) |
|||
{ (void) sprintf(name, "onoise_total.%s%s", |
|||
here->BSIM4name, |
|||
BSIM4nNames[i]); |
|||
data->namelist = (IFuid *) trealloc( |
|||
(char *) data->namelist, |
|||
(data->numPlots + 1) |
|||
* sizeof(IFuid)); |
|||
if (!data->namelist) |
|||
return(E_NOMEM); |
|||
(*(SPfrontEnd->IFnewUid)) (ckt, |
|||
&(data->namelist[data->numPlots++]), |
|||
(IFuid) NULL, name, UID_OTHER, |
|||
(void **) NULL); |
|||
/* we've added one more plot */ |
|||
|
|||
(void) sprintf(name, "inoise_total.%s%s", |
|||
here->BSIM4name, |
|||
BSIM4nNames[i]); |
|||
data->namelist = (IFuid *) trealloc( |
|||
(char *) data->namelist, |
|||
(data->numPlots + 1) |
|||
* sizeof(IFuid)); |
|||
if (!data->namelist) |
|||
return(E_NOMEM); |
|||
(*(SPfrontEnd->IFnewUid)) (ckt, |
|||
&(data->namelist[data->numPlots++]), |
|||
(IFuid) NULL, name, UID_OTHER, |
|||
(void **)NULL); |
|||
/* we've added one more plot */ |
|||
} |
|||
break; |
|||
} |
|||
} |
|||
break; |
|||
case N_CALC: |
|||
switch (mode) |
|||
{ case N_DENS: |
|||
if (model->BSIM4tnoiMod == 0) |
|||
{ if (model->BSIM4rdsMod == 0) |
|||
{ gspr = here->BSIM4sourceConductance; |
|||
gdpr = here->BSIM4drainConductance; |
|||
if (here->BSIM4grdsw > 0.0) |
|||
tmp = 1.0 / here->BSIM4grdsw; /* tmp used below */ |
|||
else |
|||
tmp = 0.0; |
|||
} |
|||
else |
|||
{ gspr = here->BSIM4gstot; |
|||
gdpr = here->BSIM4gdtot; |
|||
tmp = 0.0; |
|||
} |
|||
} |
|||
else |
|||
{ T5 = here->BSIM4Vgsteff / here->BSIM4EsatL; |
|||
T5 *= T5; |
|||
npart_beta = 0.577 * (1.0 + T5 |
|||
* model->BSIM4tnoia * pParam->BSIM4leff); |
|||
npart_theta = 0.37 * (1.0 + T5 |
|||
* model->BSIM4tnoib * pParam->BSIM4leff); |
|||
|
|||
if (model->BSIM4rdsMod == 0) |
|||
{ gspr = here->BSIM4sourceConductance; |
|||
gdpr = here->BSIM4drainConductance; |
|||
} |
|||
else |
|||
{ gspr = here->BSIM4gstot; |
|||
gdpr = here->BSIM4gdtot; |
|||
} |
|||
|
|||
if ((*(ckt->CKTstates[0] + here->BSIM4vds)) >= 0.0) |
|||
gspr = gspr * (1.0 + npart_theta * npart_theta * gspr |
|||
/ here->BSIM4IdovVds); |
|||
else |
|||
gdpr = gdpr * (1.0 + npart_theta * npart_theta * gdpr |
|||
/ here->BSIM4IdovVds); |
|||
} |
|||
|
|||
NevalSrc(&noizDens[BSIM4RDNOIZ], |
|||
&lnNdens[BSIM4RDNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4dNodePrime, here->BSIM4dNode, |
|||
gdpr); |
|||
|
|||
NevalSrc(&noizDens[BSIM4RSNOIZ], |
|||
&lnNdens[BSIM4RSNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4sNodePrime, here->BSIM4sNode, |
|||
gspr); |
|||
|
|||
|
|||
if ((here->BSIM4rgateMod == 1) || (here->BSIM4rgateMod == 2)) |
|||
{ NevalSrc(&noizDens[BSIM4RGNOIZ], |
|||
&lnNdens[BSIM4RGNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4gNodePrime, here->BSIM4gNodeExt, |
|||
here->BSIM4grgeltd); |
|||
} |
|||
else if (here->BSIM4rgateMod == 3) |
|||
{ NevalSrc(&noizDens[BSIM4RGNOIZ], |
|||
&lnNdens[BSIM4RGNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4gNodeMid, here->BSIM4gNodeExt, |
|||
here->BSIM4grgeltd); |
|||
} |
|||
else |
|||
{ noizDens[BSIM4RGNOIZ] = 0.0; |
|||
lnNdens[BSIM4RGNOIZ] = |
|||
log(MAX(noizDens[BSIM4RGNOIZ], N_MINLOG)); |
|||
} |
|||
|
|||
|
|||
if (here->BSIM4rbodyMod) |
|||
{ NevalSrc(&noizDens[BSIM4RBPSNOIZ], |
|||
&lnNdens[BSIM4RBPSNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4bNodePrime, here->BSIM4sbNode, |
|||
here->BSIM4grbps); |
|||
NevalSrc(&noizDens[BSIM4RBPDNOIZ], |
|||
&lnNdens[BSIM4RBPDNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4bNodePrime, here->BSIM4dbNode, |
|||
here->BSIM4grbpd); |
|||
NevalSrc(&noizDens[BSIM4RBPBNOIZ], |
|||
&lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4bNodePrime, here->BSIM4bNode, |
|||
here->BSIM4grbpb); |
|||
NevalSrc(&noizDens[BSIM4RBSBNOIZ], |
|||
&lnNdens[BSIM4RBSBNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4bNode, here->BSIM4sbNode, |
|||
here->BSIM4grbsb); |
|||
NevalSrc(&noizDens[BSIM4RBDBNOIZ], |
|||
&lnNdens[BSIM4RBDBNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4bNode, here->BSIM4dbNode, |
|||
here->BSIM4grbdb); |
|||
} |
|||
else |
|||
{ noizDens[BSIM4RBPSNOIZ] = noizDens[BSIM4RBPDNOIZ] = 0.0; |
|||
noizDens[BSIM4RBPBNOIZ] = 0.0; |
|||
noizDens[BSIM4RBSBNOIZ] = noizDens[BSIM4RBDBNOIZ] = 0.0; |
|||
lnNdens[BSIM4RBPSNOIZ] = |
|||
log(MAX(noizDens[BSIM4RBPSNOIZ], N_MINLOG)); |
|||
lnNdens[BSIM4RBPDNOIZ] = |
|||
log(MAX(noizDens[BSIM4RBPDNOIZ], N_MINLOG)); |
|||
lnNdens[BSIM4RBPBNOIZ] = |
|||
log(MAX(noizDens[BSIM4RBPBNOIZ], N_MINLOG)); |
|||
lnNdens[BSIM4RBSBNOIZ] = |
|||
log(MAX(noizDens[BSIM4RBSBNOIZ], N_MINLOG)); |
|||
lnNdens[BSIM4RBDBNOIZ] = |
|||
log(MAX(noizDens[BSIM4RBDBNOIZ], N_MINLOG)); |
|||
} |
|||
|
|||
|
|||
switch(model->BSIM4tnoiMod) |
|||
{ case 0: |
|||
T0 = here->BSIM4ueff * fabs(here->BSIM4qinv); |
|||
T1 = T0 * tmp + pParam->BSIM4leff |
|||
* pParam->BSIM4leff; |
|||
NevalSrc(&noizDens[BSIM4IDNOIZ], |
|||
&lnNdens[BSIM4IDNOIZ], ckt, |
|||
THERMNOISE, here->BSIM4dNodePrime, |
|||
here->BSIM4sNodePrime, |
|||
(T0 / T1) * model->BSIM4ntnoi); |
|||
break; |
|||
case 1: |
|||
T0 = here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds; |
|||
T0 *= T0; |
|||
igsquare = npart_theta * npart_theta * T0 / here->BSIM4IdovVds; |
|||
T1 = npart_beta * (here->BSIM4gm |
|||
+ here->BSIM4gmbs) + here->BSIM4gds; |
|||
T2 = T1 * T1 / here->BSIM4IdovVds; |
|||
NevalSrc(&noizDens[BSIM4IDNOIZ], |
|||
&lnNdens[BSIM4IDNOIZ], ckt, |
|||
THERMNOISE, here->BSIM4dNodePrime, |
|||
here->BSIM4sNodePrime, (T2 - igsquare)); |
|||
break; |
|||
} |
|||
|
|||
NevalSrc(&noizDens[BSIM4FLNOIZ], (double*) NULL, |
|||
ckt, N_GAIN, here->BSIM4dNodePrime, |
|||
here->BSIM4sNodePrime, (double) 0.0); |
|||
|
|||
switch(model->BSIM4fnoiMod) |
|||
{ case 0: |
|||
noizDens[BSIM4FLNOIZ] *= model->BSIM4kf |
|||
* exp(model->BSIM4af |
|||
* log(MAX(fabs(here->BSIM4cd), |
|||
N_MINLOG))) |
|||
/ (pow(data->freq, model->BSIM4ef) |
|||
* pParam->BSIM4leff |
|||
* pParam->BSIM4leff |
|||
* model->BSIM4coxe); |
|||
break; |
|||
case 1: |
|||
Vds = *(ckt->CKTstates[0] + here->BSIM4vds); |
|||
if (Vds < 0.0) |
|||
Vds = -Vds; |
|||
|
|||
Ssi = Eval1ovFNoise(Vds, model, here, |
|||
data->freq, ckt->CKTtemp); |
|||
T10 = model->BSIM4oxideTrapDensityA |
|||
* CONSTboltz * ckt->CKTtemp; |
|||
T11 = pParam->BSIM4weff * pParam->BSIM4leff |
|||
* pow(data->freq, model->BSIM4ef) * 1.0e10 |
|||
* here->BSIM4nstar * here->BSIM4nstar; |
|||
Swi = T10 / T11 * here->BSIM4cd |
|||
* here->BSIM4cd; |
|||
T1 = Swi + Ssi; |
|||
if (T1 > 0.0) |
|||
noizDens[BSIM4FLNOIZ] *= (Ssi * Swi) / T1; |
|||
else |
|||
noizDens[BSIM4FLNOIZ] *= 0.0; |
|||
break; |
|||
} |
|||
|
|||
lnNdens[BSIM4FLNOIZ] = |
|||
log(MAX(noizDens[BSIM4FLNOIZ], N_MINLOG)); |
|||
|
|||
|
|||
NevalSrc(&noizDens[BSIM4IGSNOIZ], |
|||
&lnNdens[BSIM4IGSNOIZ], ckt, SHOTNOISE, |
|||
here->BSIM4gNodePrime, here->BSIM4sNodePrime, |
|||
(here->BSIM4Igs + here->BSIM4Igcs)); |
|||
NevalSrc(&noizDens[BSIM4IGDNOIZ], |
|||
&lnNdens[BSIM4IGDNOIZ], ckt, SHOTNOISE, |
|||
here->BSIM4gNodePrime, here->BSIM4dNodePrime, |
|||
(here->BSIM4Igd + here->BSIM4Igcd)); |
|||
|
|||
NevalSrc(&noizDens[BSIM4IGBNOIZ], |
|||
&lnNdens[BSIM4IGBNOIZ], ckt, SHOTNOISE, |
|||
here->BSIM4gNodePrime, here->BSIM4bNodePrime, |
|||
here->BSIM4Igb); |
|||
|
|||
|
|||
noizDens[BSIM4TOTNOIZ] = noizDens[BSIM4RDNOIZ] |
|||
+ noizDens[BSIM4RSNOIZ] + noizDens[BSIM4RGNOIZ] |
|||
+ noizDens[BSIM4RBPSNOIZ] + noizDens[BSIM4RBPDNOIZ] |
|||
+ noizDens[BSIM4RBPBNOIZ] |
|||
+ noizDens[BSIM4RBSBNOIZ] + noizDens[BSIM4RBDBNOIZ] |
|||
+ noizDens[BSIM4IDNOIZ] + noizDens[BSIM4FLNOIZ] |
|||
+ noizDens[BSIM4IGSNOIZ] + noizDens[BSIM4IGDNOIZ] |
|||
+ noizDens[BSIM4IGBNOIZ]; |
|||
lnNdens[BSIM4TOTNOIZ] = |
|||
log(MAX(noizDens[BSIM4TOTNOIZ], N_MINLOG)); |
|||
|
|||
*OnDens += noizDens[BSIM4TOTNOIZ]; |
|||
|
|||
if (data->delFreq == 0.0) |
|||
{ /* if we haven't done any previous |
|||
integration, we need to initialize our |
|||
"history" variables. |
|||
*/ |
|||
|
|||
for (i = 0; i < BSIM4NSRCS; i++) |
|||
{ here->BSIM4nVar[LNLSTDENS][i] = |
|||
lnNdens[i]; |
|||
} |
|||
|
|||
/* clear out our integration variables |
|||
if it's the first pass |
|||
*/ |
|||
if (data->freq == |
|||
((NOISEAN*) ckt->CKTcurJob)->NstartFreq) |
|||
{ for (i = 0; i < BSIM4NSRCS; i++) |
|||
{ here->BSIM4nVar[OUTNOIZ][i] = 0.0; |
|||
here->BSIM4nVar[INNOIZ][i] = 0.0; |
|||
} |
|||
} |
|||
} |
|||
else |
|||
{ /* data->delFreq != 0.0, |
|||
we have to integrate. |
|||
*/ |
|||
for (i = 0; i < BSIM4NSRCS; i++) |
|||
{ if (i != BSIM4TOTNOIZ) |
|||
{ tempOnoise = Nintegrate(noizDens[i], |
|||
lnNdens[i], |
|||
here->BSIM4nVar[LNLSTDENS][i], |
|||
data); |
|||
tempInoise = Nintegrate(noizDens[i] |
|||
* data->GainSqInv, lnNdens[i] |
|||
+ data->lnGainInv, |
|||
here->BSIM4nVar[LNLSTDENS][i] |
|||
+ data->lnGainInv, data); |
|||
here->BSIM4nVar[LNLSTDENS][i] = |
|||
lnNdens[i]; |
|||
data->outNoiz += tempOnoise; |
|||
data->inNoise += tempInoise; |
|||
if (((NOISEAN*) |
|||
ckt->CKTcurJob)->NStpsSm != 0) |
|||
{ here->BSIM4nVar[OUTNOIZ][i] |
|||
+= tempOnoise; |
|||
here->BSIM4nVar[OUTNOIZ][BSIM4TOTNOIZ] |
|||
+= tempOnoise; |
|||
here->BSIM4nVar[INNOIZ][i] |
|||
+= tempInoise; |
|||
here->BSIM4nVar[INNOIZ][BSIM4TOTNOIZ] |
|||
+= tempInoise; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
if (data->prtSummary) |
|||
{ for (i = 0; i < BSIM4NSRCS; i++) |
|||
{ /* print a summary report */ |
|||
data->outpVector[data->outNumber++] |
|||
= noizDens[i]; |
|||
} |
|||
} |
|||
break; |
|||
case INT_NOIZ: |
|||
/* already calculated, just output */ |
|||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) |
|||
{ for (i = 0; i < BSIM4NSRCS; i++) |
|||
{ data->outpVector[data->outNumber++] |
|||
= here->BSIM4nVar[OUTNOIZ][i]; |
|||
data->outpVector[data->outNumber++] |
|||
= here->BSIM4nVar[INNOIZ][i]; |
|||
} |
|||
} |
|||
break; |
|||
} |
|||
break; |
|||
case N_CLOSE: |
|||
/* do nothing, the main calling routine will close */ |
|||
return (OK); |
|||
break; /* the plots */ |
|||
} /* switch (operation) */ |
|||
} /* for here */ |
|||
} /* for model */ |
|||
|
|||
return(OK); |
|||
} |
|||
/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ |
|||
|
|||
/********** |
|||
* Copyright 2004 Regents of the University of California. All rights reserved. |
|||
* File: b4noi.c of BSIM4.4.0. |
|||
* Author: 2000 Weidong Liu |
|||
* Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. |
|||
* Project Director: Prof. Chenming Hu. |
|||
* Modified by Xuemei Xi, 04/06/2001. |
|||
* Modified by Xuemei Xi, 10/05/2001. |
|||
* Modified by Xuemei Xi, 11/15/2002. |
|||
* Modified by Xuemei Xi, 05/09/2003. |
|||
* Modified by Xuemei Xi, 03/04/2004. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "bsim4def.h" |
|||
#include "cktdefs.h" |
|||
#include "iferrmsg.h" |
|||
#include "noisedef.h" |
|||
#include "suffix.h" |
|||
#include "const.h" |
|||
|
|||
|
|||
extern void NevalSrc(); |
|||
extern double Nintegrate(); |
|||
|
|||
/* |
|||
* WDL: 1/f noise model has been smoothed out and enhanced with |
|||
* bulk charge effect as well as physical N* equ. and necessary |
|||
* conversion into the SI unit system. |
|||
*/ |
|||
|
|||
double |
|||
Eval1ovFNoise(Vds, model, here, freq, temp) |
|||
double Vds, freq, temp; |
|||
BSIM4model *model; |
|||
BSIM4instance *here; |
|||
{ |
|||
struct bsim4SizeDependParam *pParam; |
|||
double cd, esat, DelClm, EffFreq, N0, Nl, Leff, Leffsq; |
|||
double T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, Ssi; |
|||
|
|||
pParam = here->pParam; |
|||
cd = fabs(here->BSIM4cd); |
|||
Leff = pParam->BSIM4leff - 2.0 * model->BSIM4lintnoi; |
|||
Leffsq = Leff * Leff; |
|||
esat = 2.0 * here->BSIM4vsattemp / here->BSIM4ueff; |
|||
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 * Leffsq; |
|||
N0 = model->BSIM4coxe * here->BSIM4Vgsteff / CHARGE; |
|||
Nl = model->BSIM4coxe * here->BSIM4Vgsteff |
|||
* (1.0 - here->BSIM4AbovVgst2Vtm * here->BSIM4Vdseff) / CHARGE; |
|||
|
|||
T3 = model->BSIM4oxideTrapDensityA |
|||
* log(MAX(((N0 + here->BSIM4nstar) / (Nl + here->BSIM4nstar)), N_MINLOG)); |
|||
T4 = model->BSIM4oxideTrapDensityB * (N0 - Nl); |
|||
T5 = model->BSIM4oxideTrapDensityC * 0.5 * (N0 * N0 - Nl * Nl); |
|||
|
|||
T6 = CONSTboltz * temp * cd * cd; |
|||
T7 = 1.0e10 * EffFreq * Leffsq * pParam->BSIM4weff; |
|||
T8 = model->BSIM4oxideTrapDensityA + model->BSIM4oxideTrapDensityB * Nl |
|||
+ model->BSIM4oxideTrapDensityC * Nl * Nl; |
|||
T9 = (Nl + here->BSIM4nstar) * (Nl + here->BSIM4nstar); |
|||
Ssi = T1 / T2 * (T3 + T4 + T5) + T6 / T7 * DelClm * T8 / T9; |
|||
return Ssi; |
|||
} |
|||
|
|||
|
|||
int |
|||
BSIM4noise (mode, operation, inModel, ckt, data, OnDens) |
|||
int mode, operation; |
|||
GENmodel *inModel; |
|||
CKTcircuit *ckt; |
|||
Ndata *data; |
|||
double *OnDens; |
|||
{ |
|||
BSIM4model *model = (BSIM4model *)inModel; |
|||
BSIM4instance *here; |
|||
struct bsim4SizeDependParam *pParam; |
|||
char name[N_MXVLNTH]; |
|||
double tempOnoise; |
|||
double tempInoise; |
|||
double noizDens[BSIM4NSRCS]; |
|||
double lnNdens[BSIM4NSRCS]; |
|||
|
|||
double T0, T1, T2, T5, T10, T11; |
|||
double Vds, Ssi, Swi; |
|||
double tmp, gdpr, gspr, npart_theta, npart_beta, igsquare; |
|||
|
|||
double m; |
|||
|
|||
int i; |
|||
|
|||
/* define the names of the noise sources */ |
|||
static char *BSIM4nNames[BSIM4NSRCS] = |
|||
{ /* Note that we have to keep the order */ |
|||
".rd", /* noise due to rd */ |
|||
".rs", /* noise due to rs */ |
|||
".rg", /* noise due to rgeltd */ |
|||
".rbps", /* noise due to rbps */ |
|||
".rbpd", /* noise due to rbpd */ |
|||
".rbpb", /* noise due to rbpb */ |
|||
".rbsb", /* noise due to rbsb */ |
|||
".rbdb", /* noise due to rbdb */ |
|||
".id", /* noise due to id */ |
|||
".1overf", /* flicker (1/f) noise */ |
|||
".igs", /* shot noise due to IGS */ |
|||
".igd", /* shot noise due to IGD */ |
|||
".igb", /* shot noise due to IGB */ |
|||
"" /* total transistor noise */ |
|||
}; |
|||
|
|||
for (; model != NULL; model = model->BSIM4nextModel) |
|||
{ for (here = model->BSIM4instances; here != NULL; |
|||
here = here->BSIM4nextInstance) |
|||
{ pParam = here->pParam; |
|||
switch (operation) |
|||
{ case N_OPEN: |
|||
/* see if we have to to produce a summary report */ |
|||
/* if so, name all the noise generators */ |
|||
|
|||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) |
|||
{ switch (mode) |
|||
{ case N_DENS: |
|||
for (i = 0; i < BSIM4NSRCS; i++) |
|||
{ (void) sprintf(name, "onoise.%s%s", |
|||
here->BSIM4name, |
|||
BSIM4nNames[i]); |
|||
data->namelist = (IFuid *) trealloc( |
|||
(char *) data->namelist, |
|||
(data->numPlots + 1) |
|||
* sizeof(IFuid)); |
|||
if (!data->namelist) |
|||
return(E_NOMEM); |
|||
(*(SPfrontEnd->IFnewUid)) (ckt, |
|||
&(data->namelist[data->numPlots++]), |
|||
(IFuid) NULL, name, UID_OTHER, |
|||
(void **) NULL); |
|||
/* we've added one more plot */ |
|||
} |
|||
break; |
|||
case INT_NOIZ: |
|||
for (i = 0; i < BSIM4NSRCS; i++) |
|||
{ (void) sprintf(name, "onoise_total.%s%s", |
|||
here->BSIM4name, |
|||
BSIM4nNames[i]); |
|||
data->namelist = (IFuid *) trealloc( |
|||
(char *) data->namelist, |
|||
(data->numPlots + 1) |
|||
* sizeof(IFuid)); |
|||
if (!data->namelist) |
|||
return(E_NOMEM); |
|||
(*(SPfrontEnd->IFnewUid)) (ckt, |
|||
&(data->namelist[data->numPlots++]), |
|||
(IFuid) NULL, name, UID_OTHER, |
|||
(void **) NULL); |
|||
/* we've added one more plot */ |
|||
|
|||
(void) sprintf(name, "inoise_total.%s%s", |
|||
here->BSIM4name, |
|||
BSIM4nNames[i]); |
|||
data->namelist = (IFuid *) trealloc( |
|||
(char *) data->namelist, |
|||
(data->numPlots + 1) |
|||
* sizeof(IFuid)); |
|||
if (!data->namelist) |
|||
return(E_NOMEM); |
|||
(*(SPfrontEnd->IFnewUid)) (ckt, |
|||
&(data->namelist[data->numPlots++]), |
|||
(IFuid) NULL, name, UID_OTHER, |
|||
(void **)NULL); |
|||
/* we've added one more plot */ |
|||
} |
|||
break; |
|||
} |
|||
} |
|||
break; |
|||
case N_CALC: |
|||
m = here->BSIM4m; |
|||
switch (mode) |
|||
{ case N_DENS: |
|||
if (model->BSIM4tnoiMod == 0) |
|||
{ if (model->BSIM4rdsMod == 0) |
|||
{ gspr = here->BSIM4sourceConductance; |
|||
gdpr = here->BSIM4drainConductance; |
|||
if (here->BSIM4grdsw > 0.0) |
|||
tmp = 1.0 / here->BSIM4grdsw; /* tmp used below */ |
|||
else |
|||
tmp = 0.0; |
|||
} |
|||
else |
|||
{ gspr = here->BSIM4gstot; |
|||
gdpr = here->BSIM4gdtot; |
|||
tmp = 0.0; |
|||
} |
|||
} |
|||
else |
|||
{ T5 = here->BSIM4Vgsteff / here->BSIM4EsatL; |
|||
T5 *= T5; |
|||
npart_beta = model->BSIM4rnoia * (1.0 + T5 |
|||
* model->BSIM4tnoia * pParam->BSIM4leff); |
|||
npart_theta = model->BSIM4rnoib * (1.0 + T5 |
|||
* model->BSIM4tnoib * pParam->BSIM4leff); |
|||
|
|||
if (model->BSIM4rdsMod == 0) |
|||
{ gspr = here->BSIM4sourceConductance; |
|||
gdpr = here->BSIM4drainConductance; |
|||
} |
|||
else |
|||
{ gspr = here->BSIM4gstot; |
|||
gdpr = here->BSIM4gdtot; |
|||
} |
|||
|
|||
if ((*(ckt->CKTstates[0] + here->BSIM4vds)) >= 0.0) |
|||
gspr = gspr / (1.0 + npart_theta * npart_theta * gspr |
|||
/ here->BSIM4IdovVds); /* bugfix */ |
|||
else |
|||
gdpr = gdpr / (1.0 + npart_theta * npart_theta * gdpr |
|||
/ here->BSIM4IdovVds); |
|||
} |
|||
|
|||
NevalSrc(&noizDens[BSIM4RDNOIZ], |
|||
&lnNdens[BSIM4RDNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4dNodePrime, here->BSIM4dNode, |
|||
gdpr * m); |
|||
|
|||
NevalSrc(&noizDens[BSIM4RSNOIZ], |
|||
&lnNdens[BSIM4RSNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4sNodePrime, here->BSIM4sNode, |
|||
gspr * m); |
|||
|
|||
|
|||
if ((here->BSIM4rgateMod == 1) || (here->BSIM4rgateMod == 2)) |
|||
{ NevalSrc(&noizDens[BSIM4RGNOIZ], |
|||
&lnNdens[BSIM4RGNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4gNodePrime, here->BSIM4gNodeExt, |
|||
here->BSIM4grgeltd * m); |
|||
} |
|||
else if (here->BSIM4rgateMod == 3) |
|||
{ NevalSrc(&noizDens[BSIM4RGNOIZ], |
|||
&lnNdens[BSIM4RGNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4gNodeMid, here->BSIM4gNodeExt, |
|||
here->BSIM4grgeltd * m); |
|||
} |
|||
else |
|||
{ noizDens[BSIM4RGNOIZ] = 0.0; |
|||
lnNdens[BSIM4RGNOIZ] = |
|||
log(MAX(noizDens[BSIM4RGNOIZ], N_MINLOG)); |
|||
} |
|||
|
|||
|
|||
if (here->BSIM4rbodyMod) |
|||
{ NevalSrc(&noizDens[BSIM4RBPSNOIZ], |
|||
&lnNdens[BSIM4RBPSNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4bNodePrime, here->BSIM4sbNode, |
|||
here->BSIM4grbps * m); |
|||
NevalSrc(&noizDens[BSIM4RBPDNOIZ], |
|||
&lnNdens[BSIM4RBPDNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4bNodePrime, here->BSIM4dbNode, |
|||
here->BSIM4grbpd * m); |
|||
NevalSrc(&noizDens[BSIM4RBPBNOIZ], |
|||
&lnNdens[BSIM4RBPBNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4bNodePrime, here->BSIM4bNode, |
|||
here->BSIM4grbpb * m); |
|||
NevalSrc(&noizDens[BSIM4RBSBNOIZ], |
|||
&lnNdens[BSIM4RBSBNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4bNode, here->BSIM4sbNode, |
|||
here->BSIM4grbsb * m); |
|||
NevalSrc(&noizDens[BSIM4RBDBNOIZ], |
|||
&lnNdens[BSIM4RBDBNOIZ], ckt, THERMNOISE, |
|||
here->BSIM4bNode, here->BSIM4dbNode, |
|||
here->BSIM4grbdb * m); |
|||
} |
|||
else |
|||
{ noizDens[BSIM4RBPSNOIZ] = noizDens[BSIM4RBPDNOIZ] = 0.0; |
|||
noizDens[BSIM4RBPBNOIZ] = 0.0; |
|||
noizDens[BSIM4RBSBNOIZ] = noizDens[BSIM4RBDBNOIZ] = 0.0; |
|||
lnNdens[BSIM4RBPSNOIZ] = |
|||
log(MAX(noizDens[BSIM4RBPSNOIZ], N_MINLOG)); |
|||
lnNdens[BSIM4RBPDNOIZ] = |
|||
log(MAX(noizDens[BSIM4RBPDNOIZ], N_MINLOG)); |
|||
lnNdens[BSIM4RBPBNOIZ] = |
|||
log(MAX(noizDens[BSIM4RBPBNOIZ], N_MINLOG)); |
|||
lnNdens[BSIM4RBSBNOIZ] = |
|||
log(MAX(noizDens[BSIM4RBSBNOIZ], N_MINLOG)); |
|||
lnNdens[BSIM4RBDBNOIZ] = |
|||
log(MAX(noizDens[BSIM4RBDBNOIZ], N_MINLOG)); |
|||
} |
|||
|
|||
|
|||
switch(model->BSIM4tnoiMod) |
|||
{ case 0: |
|||
T0 = m * here->BSIM4ueff * fabs(here->BSIM4qinv); |
|||
T1 = T0 * tmp + pParam->BSIM4leff |
|||
* pParam->BSIM4leff; |
|||
NevalSrc(&noizDens[BSIM4IDNOIZ], |
|||
&lnNdens[BSIM4IDNOIZ], ckt, |
|||
THERMNOISE, here->BSIM4dNodePrime, |
|||
here->BSIM4sNodePrime, |
|||
(T0 / T1) * model->BSIM4ntnoi); |
|||
break; |
|||
case 1: |
|||
T0 = m * (here->BSIM4gm + here->BSIM4gmbs + here->BSIM4gds); |
|||
T0 *= T0; |
|||
igsquare = npart_theta * npart_theta * T0 / here->BSIM4IdovVds; |
|||
T1 = npart_beta * (here->BSIM4gm |
|||
+ here->BSIM4gmbs) + here->BSIM4gds; |
|||
T2 = T1 * T1 / here->BSIM4IdovVds; |
|||
NevalSrc(&noizDens[BSIM4IDNOIZ], |
|||
&lnNdens[BSIM4IDNOIZ], ckt, |
|||
THERMNOISE, here->BSIM4dNodePrime, |
|||
here->BSIM4sNodePrime, (T2 - igsquare)); |
|||
break; |
|||
} |
|||
|
|||
NevalSrc(&noizDens[BSIM4FLNOIZ], (double*) NULL, |
|||
ckt, N_GAIN, here->BSIM4dNodePrime, |
|||
here->BSIM4sNodePrime, (double) 0.0); |
|||
|
|||
switch(model->BSIM4fnoiMod) |
|||
{ case 0: |
|||
noizDens[BSIM4FLNOIZ] *= m * model->BSIM4kf |
|||
* exp(model->BSIM4af |
|||
* log(MAX(fabs(here->BSIM4cd), |
|||
N_MINLOG))) |
|||
/ (pow(data->freq, model->BSIM4ef) |
|||
* pParam->BSIM4leff |
|||
* pParam->BSIM4leff |
|||
* model->BSIM4coxe); |
|||
break; |
|||
case 1: |
|||
Vds = *(ckt->CKTstates[0] + here->BSIM4vds); |
|||
if (Vds < 0.0) |
|||
Vds = -Vds; |
|||
|
|||
Ssi = Eval1ovFNoise(Vds, model, here, |
|||
data->freq, ckt->CKTtemp); |
|||
T10 = model->BSIM4oxideTrapDensityA |
|||
* CONSTboltz * ckt->CKTtemp; |
|||
T11 = pParam->BSIM4weff * pParam->BSIM4leff |
|||
* pow(data->freq, model->BSIM4ef) * 1.0e10 |
|||
* here->BSIM4nstar * here->BSIM4nstar; |
|||
Swi = T10 / T11 * here->BSIM4cd |
|||
* here->BSIM4cd; |
|||
T1 = Swi + Ssi; |
|||
if (T1 > 0.0) |
|||
noizDens[BSIM4FLNOIZ] *= m * (Ssi * Swi) / T1; |
|||
else |
|||
noizDens[BSIM4FLNOIZ] *= 0.0; |
|||
break; |
|||
} |
|||
|
|||
lnNdens[BSIM4FLNOIZ] = |
|||
log(MAX(noizDens[BSIM4FLNOIZ], N_MINLOG)); |
|||
|
|||
|
|||
if(here->BSIM4mode >= 0) { /* bugfix */ |
|||
NevalSrc(&noizDens[BSIM4IGSNOIZ], |
|||
&lnNdens[BSIM4IGSNOIZ], ckt, SHOTNOISE, |
|||
here->BSIM4gNodePrime, here->BSIM4sNodePrime, |
|||
m * (here->BSIM4Igs + here->BSIM4Igcs)); |
|||
NevalSrc(&noizDens[BSIM4IGDNOIZ], |
|||
&lnNdens[BSIM4IGDNOIZ], ckt, SHOTNOISE, |
|||
here->BSIM4gNodePrime, here->BSIM4dNodePrime, |
|||
m * (here->BSIM4Igd + here->BSIM4Igcd)); |
|||
} else { |
|||
NevalSrc(&noizDens[BSIM4IGSNOIZ], |
|||
&lnNdens[BSIM4IGSNOIZ], ckt, SHOTNOISE, |
|||
here->BSIM4gNodePrime, here->BSIM4sNodePrime, |
|||
m * (here->BSIM4Igs + here->BSIM4Igcd)); |
|||
NevalSrc(&noizDens[BSIM4IGDNOIZ], |
|||
&lnNdens[BSIM4IGDNOIZ], ckt, SHOTNOISE, |
|||
here->BSIM4gNodePrime, here->BSIM4dNodePrime, |
|||
m * (here->BSIM4Igd + here->BSIM4Igcs)); |
|||
} |
|||
NevalSrc(&noizDens[BSIM4IGBNOIZ], |
|||
&lnNdens[BSIM4IGBNOIZ], ckt, SHOTNOISE, |
|||
here->BSIM4gNodePrime, here->BSIM4bNodePrime, |
|||
m * here->BSIM4Igb); |
|||
|
|||
|
|||
noizDens[BSIM4TOTNOIZ] = noizDens[BSIM4RDNOIZ] |
|||
+ noizDens[BSIM4RSNOIZ] + noizDens[BSIM4RGNOIZ] |
|||
+ noizDens[BSIM4RBPSNOIZ] + noizDens[BSIM4RBPDNOIZ] |
|||
+ noizDens[BSIM4RBPBNOIZ] |
|||
+ noizDens[BSIM4RBSBNOIZ] + noizDens[BSIM4RBDBNOIZ] |
|||
+ noizDens[BSIM4IDNOIZ] + noizDens[BSIM4FLNOIZ] |
|||
+ noizDens[BSIM4IGSNOIZ] + noizDens[BSIM4IGDNOIZ] |
|||
+ noizDens[BSIM4IGBNOIZ]; |
|||
lnNdens[BSIM4TOTNOIZ] = |
|||
log(MAX(noizDens[BSIM4TOTNOIZ], N_MINLOG)); |
|||
|
|||
*OnDens += noizDens[BSIM4TOTNOIZ]; |
|||
|
|||
if (data->delFreq == 0.0) |
|||
{ /* if we haven't done any previous |
|||
integration, we need to initialize our |
|||
"history" variables. |
|||
*/ |
|||
|
|||
for (i = 0; i < BSIM4NSRCS; i++) |
|||
{ here->BSIM4nVar[LNLSTDENS][i] = |
|||
lnNdens[i]; |
|||
} |
|||
|
|||
/* clear out our integration variables |
|||
if it's the first pass |
|||
*/ |
|||
if (data->freq == |
|||
((NOISEAN*) ckt->CKTcurJob)->NstartFreq) |
|||
{ for (i = 0; i < BSIM4NSRCS; i++) |
|||
{ here->BSIM4nVar[OUTNOIZ][i] = 0.0; |
|||
here->BSIM4nVar[INNOIZ][i] = 0.0; |
|||
} |
|||
} |
|||
} |
|||
else |
|||
{ /* data->delFreq != 0.0, |
|||
we have to integrate. |
|||
*/ |
|||
for (i = 0; i < BSIM4NSRCS; i++) |
|||
{ if (i != BSIM4TOTNOIZ) |
|||
{ tempOnoise = Nintegrate(noizDens[i], |
|||
lnNdens[i], |
|||
here->BSIM4nVar[LNLSTDENS][i], |
|||
data); |
|||
tempInoise = Nintegrate(noizDens[i] |
|||
* data->GainSqInv, lnNdens[i] |
|||
+ data->lnGainInv, |
|||
here->BSIM4nVar[LNLSTDENS][i] |
|||
+ data->lnGainInv, data); |
|||
here->BSIM4nVar[LNLSTDENS][i] = |
|||
lnNdens[i]; |
|||
data->outNoiz += tempOnoise; |
|||
data->inNoise += tempInoise; |
|||
if (((NOISEAN*) |
|||
ckt->CKTcurJob)->NStpsSm != 0) |
|||
{ here->BSIM4nVar[OUTNOIZ][i] |
|||
+= tempOnoise; |
|||
here->BSIM4nVar[OUTNOIZ][BSIM4TOTNOIZ] |
|||
+= tempOnoise; |
|||
here->BSIM4nVar[INNOIZ][i] |
|||
+= tempInoise; |
|||
here->BSIM4nVar[INNOIZ][BSIM4TOTNOIZ] |
|||
+= tempInoise; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
if (data->prtSummary) |
|||
{ for (i = 0; i < BSIM4NSRCS; i++) |
|||
{ /* print a summary report */ |
|||
data->outpVector[data->outNumber++] |
|||
= noizDens[i]; |
|||
} |
|||
} |
|||
break; |
|||
case INT_NOIZ: |
|||
/* already calculated, just output */ |
|||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) |
|||
{ for (i = 0; i < BSIM4NSRCS; i++) |
|||
{ data->outpVector[data->outNumber++] |
|||
= here->BSIM4nVar[OUTNOIZ][i]; |
|||
data->outpVector[data->outNumber++] |
|||
= here->BSIM4nVar[INNOIZ][i]; |
|||
} |
|||
} |
|||
break; |
|||
} |
|||
break; |
|||
case N_CLOSE: |
|||
/* do nothing, the main calling routine will close */ |
|||
return (OK); |
|||
break; /* the plots */ |
|||
} /* switch (operation) */ |
|||
} /* for here */ |
|||
} /* for model */ |
|||
|
|||
return(OK); |
|||
} |
|||
@ -1,145 +1,164 @@ |
|||
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/ |
|||
|
|||
/********** |
|||
* 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. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include <stdio.h> |
|||
#include "ifsim.h" |
|||
#include "bsim4def.h" |
|||
#include "sperror.h" |
|||
|
|||
int |
|||
BSIM4param(param,value,inst,select) |
|||
int param; |
|||
IFvalue *value; |
|||
GENinstance *inst; |
|||
IFvalue *select; |
|||
{ |
|||
BSIM4instance *here = (BSIM4instance*)inst; |
|||
switch(param) |
|||
{ case BSIM4_W: |
|||
here->BSIM4w = value->rValue; |
|||
here->BSIM4wGiven = TRUE; |
|||
break; |
|||
case BSIM4_L: |
|||
here->BSIM4l = value->rValue; |
|||
here->BSIM4lGiven = TRUE; |
|||
break; |
|||
case BSIM4_NF: |
|||
here->BSIM4nf = value->rValue; |
|||
here->BSIM4nfGiven = TRUE; |
|||
break; |
|||
case BSIM4_MIN: |
|||
here->BSIM4min = value->iValue; |
|||
here->BSIM4minGiven = TRUE; |
|||
break; |
|||
case BSIM4_AS: |
|||
here->BSIM4sourceArea = value->rValue; |
|||
here->BSIM4sourceAreaGiven = TRUE; |
|||
break; |
|||
case BSIM4_AD: |
|||
here->BSIM4drainArea = value->rValue; |
|||
here->BSIM4drainAreaGiven = TRUE; |
|||
break; |
|||
case BSIM4_PS: |
|||
here->BSIM4sourcePerimeter = value->rValue; |
|||
here->BSIM4sourcePerimeterGiven = TRUE; |
|||
break; |
|||
case BSIM4_PD: |
|||
here->BSIM4drainPerimeter = value->rValue; |
|||
here->BSIM4drainPerimeterGiven = TRUE; |
|||
break; |
|||
case BSIM4_NRS: |
|||
here->BSIM4sourceSquares = value->rValue; |
|||
here->BSIM4sourceSquaresGiven = TRUE; |
|||
break; |
|||
case BSIM4_NRD: |
|||
here->BSIM4drainSquares = value->rValue; |
|||
here->BSIM4drainSquaresGiven = TRUE; |
|||
break; |
|||
case BSIM4_OFF: |
|||
here->BSIM4off = value->iValue; |
|||
break; |
|||
case BSIM4_RBSB: |
|||
here->BSIM4rbsb = value->rValue; |
|||
here->BSIM4rbsbGiven = TRUE; |
|||
break; |
|||
case BSIM4_RBDB: |
|||
here->BSIM4rbdb = value->rValue; |
|||
here->BSIM4rbdbGiven = TRUE; |
|||
break; |
|||
case BSIM4_RBPB: |
|||
here->BSIM4rbpb = value->rValue; |
|||
here->BSIM4rbpbGiven = TRUE; |
|||
break; |
|||
case BSIM4_RBPS: |
|||
here->BSIM4rbps = value->rValue; |
|||
here->BSIM4rbpsGiven = TRUE; |
|||
break; |
|||
case BSIM4_RBPD: |
|||
here->BSIM4rbpd = value->rValue; |
|||
here->BSIM4rbpdGiven = TRUE; |
|||
break; |
|||
case BSIM4_TRNQSMOD: |
|||
here->BSIM4trnqsMod = value->iValue; |
|||
here->BSIM4trnqsModGiven = TRUE; |
|||
break; |
|||
case BSIM4_ACNQSMOD: |
|||
here->BSIM4acnqsMod = value->iValue; |
|||
here->BSIM4acnqsModGiven = TRUE; |
|||
break; |
|||
case BSIM4_RBODYMOD: |
|||
here->BSIM4rbodyMod = value->iValue; |
|||
here->BSIM4rbodyModGiven = TRUE; |
|||
break; |
|||
case BSIM4_RGATEMOD: |
|||
here->BSIM4rgateMod = value->iValue; |
|||
here->BSIM4rgateModGiven = TRUE; |
|||
break; |
|||
case BSIM4_GEOMOD: |
|||
here->BSIM4geoMod = value->iValue; |
|||
here->BSIM4geoModGiven = TRUE; |
|||
break; |
|||
case BSIM4_RGEOMOD: |
|||
here->BSIM4rgeoMod = value->iValue; |
|||
here->BSIM4rgeoModGiven = TRUE; |
|||
break; |
|||
case BSIM4_IC_VDS: |
|||
here->BSIM4icVDS = value->rValue; |
|||
here->BSIM4icVDSGiven = TRUE; |
|||
break; |
|||
case BSIM4_IC_VGS: |
|||
here->BSIM4icVGS = value->rValue; |
|||
here->BSIM4icVGSGiven = TRUE; |
|||
break; |
|||
case BSIM4_IC_VBS: |
|||
here->BSIM4icVBS = value->rValue; |
|||
here->BSIM4icVBSGiven = TRUE; |
|||
break; |
|||
case BSIM4_IC: |
|||
switch(value->v.numValue) |
|||
{ case 3: |
|||
here->BSIM4icVBS = *(value->v.vec.rVec+2); |
|||
here->BSIM4icVBSGiven = TRUE; |
|||
case 2: |
|||
here->BSIM4icVGS = *(value->v.vec.rVec+1); |
|||
here->BSIM4icVGSGiven = TRUE; |
|||
case 1: |
|||
here->BSIM4icVDS = *(value->v.vec.rVec); |
|||
here->BSIM4icVDSGiven = TRUE; |
|||
break; |
|||
default: |
|||
return(E_BADPARM); |
|||
} |
|||
break; |
|||
default: |
|||
return(E_BADPARM); |
|||
} |
|||
return(OK); |
|||
} |
|||
/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ |
|||
|
|||
/********** |
|||
* Copyright 2004 Regents of the University of California. All rights reserved. |
|||
* File: b4par.c of BSIM4.4.0. |
|||
* Author: 2000 Weidong Liu |
|||
* Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. |
|||
* Project Director: Prof. Chenming Hu. |
|||
* Modified by Xuemei Xi, 04/06/2001. |
|||
* Modified by Xuemei Xi, 11/15/2002. |
|||
* Modified by Xuemei Xi, 05/09/2003. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "ifsim.h" |
|||
#include "bsim4def.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
int |
|||
BSIM4param(param,value,inst,select) |
|||
int param; |
|||
IFvalue *value; |
|||
GENinstance *inst; |
|||
IFvalue *select; |
|||
{ |
|||
BSIM4instance *here = (BSIM4instance*)inst; |
|||
switch(param) |
|||
{ case BSIM4_W: |
|||
here->BSIM4w = value->rValue; |
|||
here->BSIM4wGiven = TRUE; |
|||
break; |
|||
case BSIM4_L: |
|||
here->BSIM4l = value->rValue; |
|||
here->BSIM4lGiven = TRUE; |
|||
break; |
|||
case BSIM4_M: |
|||
here->BSIM4m = value->rValue; |
|||
here->BSIM4mGiven = TRUE; |
|||
break; |
|||
case BSIM4_NF: |
|||
here->BSIM4nf = value->rValue; |
|||
here->BSIM4nfGiven = TRUE; |
|||
break; |
|||
case BSIM4_MIN: |
|||
here->BSIM4min = value->iValue; |
|||
here->BSIM4minGiven = TRUE; |
|||
break; |
|||
case BSIM4_AS: |
|||
here->BSIM4sourceArea = value->rValue; |
|||
here->BSIM4sourceAreaGiven = TRUE; |
|||
break; |
|||
case BSIM4_AD: |
|||
here->BSIM4drainArea = value->rValue; |
|||
here->BSIM4drainAreaGiven = TRUE; |
|||
break; |
|||
case BSIM4_PS: |
|||
here->BSIM4sourcePerimeter = value->rValue; |
|||
here->BSIM4sourcePerimeterGiven = TRUE; |
|||
break; |
|||
case BSIM4_PD: |
|||
here->BSIM4drainPerimeter = value->rValue; |
|||
here->BSIM4drainPerimeterGiven = TRUE; |
|||
break; |
|||
case BSIM4_NRS: |
|||
here->BSIM4sourceSquares = value->rValue; |
|||
here->BSIM4sourceSquaresGiven = TRUE; |
|||
break; |
|||
case BSIM4_NRD: |
|||
here->BSIM4drainSquares = value->rValue; |
|||
here->BSIM4drainSquaresGiven = TRUE; |
|||
break; |
|||
case BSIM4_OFF: |
|||
here->BSIM4off = value->iValue; |
|||
break; |
|||
case BSIM4_SA: |
|||
here->BSIM4sa = value->rValue; |
|||
here->BSIM4saGiven = TRUE; |
|||
break; |
|||
case BSIM4_SB: |
|||
here->BSIM4sb = value->rValue; |
|||
here->BSIM4sbGiven = TRUE; |
|||
break; |
|||
case BSIM4_SD: |
|||
here->BSIM4sd = value->rValue; |
|||
here->BSIM4sdGiven = TRUE; |
|||
break; |
|||
case BSIM4_RBSB: |
|||
here->BSIM4rbsb = value->rValue; |
|||
here->BSIM4rbsbGiven = TRUE; |
|||
break; |
|||
case BSIM4_RBDB: |
|||
here->BSIM4rbdb = value->rValue; |
|||
here->BSIM4rbdbGiven = TRUE; |
|||
break; |
|||
case BSIM4_RBPB: |
|||
here->BSIM4rbpb = value->rValue; |
|||
here->BSIM4rbpbGiven = TRUE; |
|||
break; |
|||
case BSIM4_RBPS: |
|||
here->BSIM4rbps = value->rValue; |
|||
here->BSIM4rbpsGiven = TRUE; |
|||
break; |
|||
case BSIM4_RBPD: |
|||
here->BSIM4rbpd = value->rValue; |
|||
here->BSIM4rbpdGiven = TRUE; |
|||
break; |
|||
case BSIM4_TRNQSMOD: |
|||
here->BSIM4trnqsMod = value->iValue; |
|||
here->BSIM4trnqsModGiven = TRUE; |
|||
break; |
|||
case BSIM4_ACNQSMOD: |
|||
here->BSIM4acnqsMod = value->iValue; |
|||
here->BSIM4acnqsModGiven = TRUE; |
|||
break; |
|||
case BSIM4_RBODYMOD: |
|||
here->BSIM4rbodyMod = value->iValue; |
|||
here->BSIM4rbodyModGiven = TRUE; |
|||
break; |
|||
case BSIM4_RGATEMOD: |
|||
here->BSIM4rgateMod = value->iValue; |
|||
here->BSIM4rgateModGiven = TRUE; |
|||
break; |
|||
case BSIM4_GEOMOD: |
|||
here->BSIM4geoMod = value->iValue; |
|||
here->BSIM4geoModGiven = TRUE; |
|||
break; |
|||
case BSIM4_RGEOMOD: |
|||
here->BSIM4rgeoMod = value->iValue; |
|||
here->BSIM4rgeoModGiven = TRUE; |
|||
break; |
|||
case BSIM4_IC_VDS: |
|||
here->BSIM4icVDS = value->rValue; |
|||
here->BSIM4icVDSGiven = TRUE; |
|||
break; |
|||
case BSIM4_IC_VGS: |
|||
here->BSIM4icVGS = value->rValue; |
|||
here->BSIM4icVGSGiven = TRUE; |
|||
break; |
|||
case BSIM4_IC_VBS: |
|||
here->BSIM4icVBS = value->rValue; |
|||
here->BSIM4icVBSGiven = TRUE; |
|||
break; |
|||
case BSIM4_IC: |
|||
switch(value->v.numValue) |
|||
{ case 3: |
|||
here->BSIM4icVBS = *(value->v.vec.rVec+2); |
|||
here->BSIM4icVBSGiven = TRUE; |
|||
case 2: |
|||
here->BSIM4icVGS = *(value->v.vec.rVec+1); |
|||
here->BSIM4icVGSGiven = TRUE; |
|||
case 1: |
|||
here->BSIM4icVDS = *(value->v.vec.rVec); |
|||
here->BSIM4icVDSGiven = TRUE; |
|||
break; |
|||
default: |
|||
return(E_BADPARM); |
|||
} |
|||
break; |
|||
default: |
|||
return(E_BADPARM); |
|||
} |
|||
return(OK); |
|||
} |
|||
1516
src/spicelib/devices/bsim4/b4pzld.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
3595
src/spicelib/devices/bsim4/b4set.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
3211
src/spicelib/devices/bsim4/b4temp.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,60 +1,58 @@ |
|||
/**** BSIM4.2.1, Released by Xuemei Xi 10/05/2001 ****/ |
|||
|
|||
/********** |
|||
* 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. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include <stdio.h> |
|||
#include <math.h> |
|||
#include "cktdefs.h" |
|||
#include "bsim4def.h" |
|||
#include "sperror.h" |
|||
|
|||
|
|||
int |
|||
BSIM4trunc(inModel,ckt,timeStep) |
|||
GENmodel *inModel; |
|||
CKTcircuit *ckt; |
|||
double *timeStep; |
|||
{ |
|||
BSIM4model *model = (BSIM4model*)inModel; |
|||
BSIM4instance *here; |
|||
|
|||
#ifdef STEPDEBUG |
|||
double debugtemp; |
|||
#endif /* STEPDEBUG */ |
|||
|
|||
for (; model != NULL; model = model->BSIM4nextModel) |
|||
{ for (here = model->BSIM4instances; here != NULL; |
|||
here = here->BSIM4nextInstance) |
|||
{ |
|||
if (here->BSIM4owner != ARCHme) continue; |
|||
#ifdef STEPDEBUG |
|||
debugtemp = *timeStep; |
|||
#endif /* STEPDEBUG */ |
|||
CKTterr(here->BSIM4qb,ckt,timeStep); |
|||
CKTterr(here->BSIM4qg,ckt,timeStep); |
|||
CKTterr(here->BSIM4qd,ckt,timeStep); |
|||
if (here->BSIM4trnqsMod) |
|||
CKTterr(here->BSIM4qcdump,ckt,timeStep); |
|||
if (here->BSIM4rbodyMod) |
|||
{ CKTterr(here->BSIM4qbs,ckt,timeStep); |
|||
CKTterr(here->BSIM4qbd,ckt,timeStep); |
|||
} |
|||
if (here->BSIM4rgateMod == 3) |
|||
CKTterr(here->BSIM4qgmid,ckt,timeStep); |
|||
#ifdef STEPDEBUG |
|||
if(debugtemp != *timeStep) |
|||
{ printf("device %s reduces step from %g to %g\n", |
|||
here->BSIM4name,debugtemp,*timeStep); |
|||
} |
|||
#endif /* STEPDEBUG */ |
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
/**** BSIM4.4.0 Released by Xuemei (Jane) Xi 03/04/2004 ****/ |
|||
|
|||
/********** |
|||
* Copyright 2004 Regents of the University of California. All rights reserved. |
|||
* File: b4trunc.c of BSIM4.4.0. |
|||
* Author: 2000 Weidong Liu |
|||
* Authors: 2001- Xuemei Xi, Jin He, Kanyu Cao, Mohan Dunga, Mansun Chan, Ali Niknejad, Chenming Hu. |
|||
* Project Director: Prof. Chenming Hu. |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "bsim4def.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
int |
|||
BSIM4trunc(inModel,ckt,timeStep) |
|||
GENmodel *inModel; |
|||
CKTcircuit *ckt; |
|||
double *timeStep; |
|||
{ |
|||
BSIM4model *model = (BSIM4model*)inModel; |
|||
BSIM4instance *here; |
|||
|
|||
#ifdef STEPDEBUG |
|||
double debugtemp; |
|||
#endif /* STEPDEBUG */ |
|||
|
|||
for (; model != NULL; model = model->BSIM4nextModel) |
|||
{ for (here = model->BSIM4instances; here != NULL; |
|||
here = here->BSIM4nextInstance) |
|||
{ |
|||
if (here->BSIM4owner != ARCHme) continue; |
|||
#ifdef STEPDEBUG |
|||
debugtemp = *timeStep; |
|||
#endif /* STEPDEBUG */ |
|||
CKTterr(here->BSIM4qb,ckt,timeStep); |
|||
CKTterr(here->BSIM4qg,ckt,timeStep); |
|||
CKTterr(here->BSIM4qd,ckt,timeStep); |
|||
if (here->BSIM4trnqsMod) |
|||
CKTterr(here->BSIM4qcdump,ckt,timeStep); |
|||
if (here->BSIM4rbodyMod) |
|||
{ CKTterr(here->BSIM4qbs,ckt,timeStep); |
|||
CKTterr(here->BSIM4qbd,ckt,timeStep); |
|||
} |
|||
if (here->BSIM4rgateMod == 3) |
|||
CKTterr(here->BSIM4qgmid,ckt,timeStep); |
|||
#ifdef STEPDEBUG |
|||
if(debugtemp != *timeStep) |
|||
{ printf("device %s reduces step from %g to %g\n", |
|||
here->BSIM4name,debugtemp,*timeStep); |
|||
} |
|||
#endif /* STEPDEBUG */ |
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
5580
src/spicelib/devices/bsim4/bsim4def.h
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,80 +1,83 @@ |
|||
#include <config.h> |
|||
|
|||
#include <devdefs.h> |
|||
|
|||
#include "bsim4itf.h" |
|||
#include "bsim4ext.h" |
|||
#include "bsim4init.h" |
|||
|
|||
|
|||
SPICEdev BSIM4info = { |
|||
{ |
|||
"BSIM4", |
|||
"Berkeley Short Channel IGFET Model-4", |
|||
|
|||
&BSIM4nSize, |
|||
&BSIM4nSize, |
|||
BSIM4names, |
|||
|
|||
&BSIM4pTSize, |
|||
BSIM4pTable, |
|||
|
|||
&BSIM4mPTSize, |
|||
BSIM4mPTable, |
|||
|
|||
#ifdef XSPICE |
|||
/*---- Fixed by SDB 5.2.2003 to enable XSPICE/tclspice integration -----*/ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
|
|||
0, /* This is a SPICE device, it has no MIF info data */ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
|
|||
0, /* This is a SPICE device, it has no MIF info data */ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
|
|||
0, /* This is a SPICE device, it has no MIF info data */ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
/*--------------------------- End of SDB fix -------------------------*/ |
|||
#endif |
|||
|
|||
DEV_DEFAULT |
|||
}, |
|||
|
|||
DEVparam : BSIM4param, |
|||
DEVmodParam : BSIM4mParam, |
|||
DEVload : BSIM4load, |
|||
DEVsetup : BSIM4setup, |
|||
DEVunsetup : BSIM4unsetup, |
|||
DEVpzSetup : BSIM4setup, |
|||
DEVtemperature: BSIM4temp, |
|||
DEVtrunc : BSIM4trunc, |
|||
DEVfindBranch : NULL, |
|||
DEVacLoad : BSIM4acLoad, |
|||
DEVaccept : NULL, |
|||
DEVdestroy : BSIM4destroy, |
|||
DEVmodDelete : BSIM4mDelete, |
|||
DEVdelete : BSIM4delete, |
|||
DEVsetic : BSIM4getic, |
|||
DEVask : BSIM4ask, |
|||
DEVmodAsk : BSIM4mAsk, |
|||
DEVpzLoad : BSIM4pzLoad, |
|||
DEVconvTest : BSIM4convTest, |
|||
DEVsenSetup : NULL, |
|||
DEVsenLoad : NULL, |
|||
DEVsenUpdate : NULL, |
|||
DEVsenAcLoad : NULL, |
|||
DEVsenPrint : NULL, |
|||
DEVsenTrunc : NULL, |
|||
DEVdisto : NULL, |
|||
DEVnoise : BSIM4noise, |
|||
|
|||
DEVinstSize : &BSIM4iSize, |
|||
DEVmodSize : &BSIM4mSize |
|||
}; |
|||
|
|||
|
|||
SPICEdev * |
|||
get_bsim4_info(void) |
|||
{ |
|||
return &BSIM4info; |
|||
} |
|||
#include "config.h" |
|||
|
|||
#include "devdefs.h" |
|||
|
|||
#include "bsim4itf.h" |
|||
#include "bsim4ext.h" |
|||
#include "bsim4init.h" |
|||
|
|||
|
|||
SPICEdev BSIM4info = { |
|||
{ |
|||
"BSIM4", |
|||
"Berkeley Short Channel IGFET Model-4", |
|||
|
|||
&BSIM4nSize, |
|||
&BSIM4nSize, |
|||
BSIM4names, |
|||
|
|||
&BSIM4pTSize, |
|||
BSIM4pTable, |
|||
|
|||
&BSIM4mPTSize, |
|||
BSIM4mPTable, |
|||
|
|||
#ifdef XSPICE |
|||
/*---- Fixed by SDB 5.2.2003 to enable XSPICE/tclspice integration -----*/ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
|
|||
0, /* This is a SPICE device, it has no MIF info data */ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
|
|||
0, /* This is a SPICE device, it has no MIF info data */ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
|
|||
0, /* This is a SPICE device, it has no MIF info data */ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
/*--------------------------- End of SDB fix -------------------------*/ |
|||
#endif |
|||
|
|||
DEV_DEFAULT |
|||
}, |
|||
|
|||
BSIM4param, /* DEVparam */ |
|||
BSIM4mParam, /* DEVmodParam */ |
|||
BSIM4load, /* DEVload */ |
|||
BSIM4setup, /* DEVsetup */ |
|||
BSIM4unsetup, /* DEVunsetup */ |
|||
BSIM4setup, /* DEVpzSetup */ |
|||
BSIM4temp, /* DEVtemperature */ |
|||
BSIM4trunc, /* DEVtrunc */ |
|||
NULL, /* DEVfindBranch */ |
|||
BSIM4acLoad, /* DEVacLoad */ |
|||
NULL, /* DEVaccept */ |
|||
BSIM4destroy, /* DEVdestroy */ |
|||
BSIM4mDelete, /* DEVmodDelete */ |
|||
BSIM4delete, /* DEVdelete */ |
|||
BSIM4getic, /* DEVsetic */ |
|||
BSIM4ask, /* DEVask */ |
|||
BSIM4mAsk, /* DEVmodAsk */ |
|||
BSIM4pzLoad, /* DEVpzLoad */ |
|||
BSIM4convTest, /* DEVconvTest */ |
|||
NULL, /* DEVsenSetup */ |
|||
NULL, /* DEVsenLoad */ |
|||
NULL, /* DEVsenUpdate */ |
|||
NULL, /* DEVsenAcLoad */ |
|||
NULL, /* DEVsenPrint */ |
|||
NULL, /* DEVsenTrunc */ |
|||
NULL, /* DEVdisto */ |
|||
BSIM4noise, /* DEVnoise */ |
|||
#ifdef CIDER |
|||
NULL, /* DEVdump */ |
|||
NULL, /* DEVacct */ |
|||
#endif |
|||
&BSIM4iSize, /* DEVinstSize */ |
|||
&BSIM4mSize /* DEVmodSize */ |
|||
}; |
|||
|
|||
|
|||
SPICEdev * |
|||
get_bsim4_info(void) |
|||
{ |
|||
return &BSIM4info; |
|||
} |
|||
@ -1,13 +1,13 @@ |
|||
#ifndef _BSIM4INIT_H |
|||
#define _BSIM4INIT_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; |
|||
|
|||
#endif |
|||
#ifndef _BSIM4INIT_H |
|||
#define _BSIM4INIT_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; |
|||
|
|||
#endif |
|||
@ -1,13 +1,13 @@ |
|||
/********** |
|||
Copyright 2001 Regents of the University of California. All rights reserved. |
|||
Author: 2000 Weidong Liu. |
|||
Author: 2001 Xuemei Xi |
|||
File: bsim4itf.h |
|||
**********/ |
|||
|
|||
#ifndef DEV_BSIM4 |
|||
#define DEV_BSIM4 |
|||
|
|||
SPICEdev *get_bsim4_info(void); |
|||
|
|||
#endif |
|||
/********** |
|||
Copyright 2004 Regents of the University of California. All rights reserved. |
|||
Author: 2000 Weidong Liu. |
|||
Author: 2001- Xuemei Xi |
|||
File: bsim4itf.h |
|||
**********/ |
|||
|
|||
#ifndef DEV_BSIM4 |
|||
#define DEV_BSIM4 |
|||
|
|||
SPICEdev *get_bsim4_info(void); |
|||
|
|||
#endif |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue