Added support for bsim3soi fd devices (fully depleted).

This commit is contained in:
pnenzi 2000-12-08 16:58:47 +00:00
parent 6f1f43a242
commit 97e77a523e
25 changed files with 101 additions and 79 deletions

12
DEVICES
View File

@ -165,12 +165,18 @@ BSIM3SOI_DD - SOI model (dynamic depletion)
NOT YET IMPLEMENTED.
BSIM3SOI_FD - SOI model (fully depleted devices)
NOT YET IMPLEMENTED.
Initial Release Ver: 2.1. TO BE TESTED.
FD model has been integrated as Level = 10
There is a bsim3soifd directory under the test
hierarchy. Test circuits come from the bsim3soi
web site at:
http://www-device.eecs.berkeley.edu/~bsimsoi
BSIM3SOI_PD - SOI model (partially depleted devices)
Initial Release Ver: 2.2.1. TO BE TESTED
Initial Release Ver: 2.2.1. TO BE TESTED.
PD model has been integrated as Level = 9
There is a bsim3soipd directory under the test
hierarchy. The tests come from the bsim3soi
hierarchy. Test circuits come from the bsim3soi
web site at:
http://www-device.eecs.berkeley.edu/~bsimsoi

View File

@ -215,6 +215,7 @@ src/spicelib/devices/bsim3/Makefile \
src/spicelib/devices/bsim4/Makefile \
src/spicelib/devices/bsim3v2/Makefile \
src/spicelib/devices/bsim3soi_pd/Makefile \
src/spicelib/devices/bsim3soi_fd/Makefile \
src/spicelib/devices/cap/Makefile \
src/spicelib/devices/cccs/Makefile \
src/spicelib/devices/ccvs/Makefile \
@ -254,4 +255,6 @@ tests/Makefile \
tests/filters/Makefile \
tests/polezero/Makefile \
tests/resistance/Makefile \
tests/bsim3soipd/Makefile \
tests/bsim3soifd/Makefile
)

View File

@ -23,6 +23,7 @@ DYNAMIC_DEVICELIBS = \
spicelib/devices/bsim4/libbsim4.la \
spicelib/devices/cap/libcap.la \
spicelib/devices/bsim3soi_pd/libbsim3soipd.la \
spicelib/devices/bsim3soi_fd/libbsim3soifd.la \
spicelib/devices/cccs/libcccs.la \
spicelib/devices/ccvs/libccvs.la \
spicelib/devices/ccvs/libccvs.la \

View File

@ -931,7 +931,7 @@ inp_numnodes(char c)
case 'j': return (3);
case 'k': return (0);
case 'l': return (2);
case 'm': return (4);
case 'm': return (7);
case 'o': return (4);
case 'q': return (4);
case 'r': return (2);

View File

@ -307,7 +307,7 @@ cp_setparse(wordlist *wl)
}
vv = alloc(struct variable);
vv->va_next = NULL;
ss = cp_unquote(wl->wl_word);
copyval = ss = cp_unquote(wl->wl_word);
td = ft_numparse(&ss, FALSE);
if (td) {
vv->va_type = VT_REAL;
@ -316,7 +316,7 @@ cp_setparse(wordlist *wl)
vv->va_type = VT_STRING;
vv->va_string = copy(ss);
}
tfree(ss);/*DG: must free ss any way to avoid cp_unquote memory leak*/
tfree(copyval);/*DG: must free ss any way to avoid cp_unquote memory leak*/
if (listv) {
lv->va_next = vv;
lv = vv;

View File

@ -6,7 +6,7 @@
#ifndef CKT
#define CKT "CKTdefs.h $Revision$ on $Date$ "
#define MAXNUMDEVS 32 /* Max number of possible devices; */
#define MAXNUMDEVS 33 /* Max number of possible devices; */
extern int DEVmaxnum; /* Not sure if still used */
#define MAXNUMDEVNODES 4 /* Max No. of nodes per device */
/* Need to change for SOI devs ? */

View File

@ -10,6 +10,7 @@ SUBDIRS = \
bsim3v1 \
bsim3v2 \
bsim3soi_pd \
bsim3soi_fd \
cap \
cccs \
ccvs \

View File

@ -17,11 +17,11 @@ Modified by Pin Su 99/9/27
int
B3SOIPDacLoad (inModel, ckt)
GENmodel *inModel;
register CKTcircuit *ckt;
CKTcircuit *ckt;
{
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
register B3SOIPDinstance *here;
register int selfheat;
B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
B3SOIPDinstance *here;
int selfheat;
double xcggb, xcgdb, xcgsb, xcgeb, xcgT;
double xcdgb, xcddb, xcdsb, xcdeb, xcdT;
double xcsgb, xcsdb, xcssb, xcseb, xcsT;

View File

@ -21,8 +21,8 @@ Modified by Pin Su 00/3/1
int
B3SOIPDcheckModel (model, here, ckt)
register B3SOIPDmodel *model;
register B3SOIPDinstance *here;
B3SOIPDmodel *model;
B3SOIPDinstance *here;
CKTcircuit *ckt;
{
struct b3soipdSizeDependParam *pParam;

View File

@ -20,10 +20,10 @@ File: b3soipdcvtest.c 98/5/01
int
B3SOIPDconvTest (inModel, ckt)
GENmodel *inModel;
register CKTcircuit *ckt;
CKTcircuit *ckt;
{
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
register B3SOIPDinstance *here;
B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
B3SOIPDinstance *here;
double delvbd, delvbs, delvds, delvgd, delvgs, vbd, vbs, vds;
double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs;

View File

@ -94,11 +94,11 @@ B3SOIPDlimit (vnew, vold, limit, check)
int
B3SOIPDload (inModel, ckt)
GENmodel *inModel;
register CKTcircuit *ckt;
CKTcircuit *ckt;
{
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
register B3SOIPDinstance *here;
register int selfheat;
B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
B3SOIPDinstance *here;
int selfheat;
double SourceSatCurrent, DrainSatCurrent, Gmin;
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst;

View File

@ -101,11 +101,11 @@ B3SOIPDnoise (mode, operation, inModel, ckt, data, OnDens)
int mode, operation;
GENmodel *inModel;
CKTcircuit *ckt;
register Ndata *data;
Ndata *data;
double *OnDens;
{
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
register B3SOIPDinstance *here;
B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
B3SOIPDinstance *here;
struct b3soipdSizeDependParam *pParam;
char name[N_MXVLNTH];
double tempOnoise;

View File

@ -16,11 +16,11 @@ File: b3soipzld.c 98/5/01
int
B3SOIPDpzLoad (inModel, ckt, s)
GENmodel *inModel;
register CKTcircuit *ckt;
register SPcomplex *s;
CKTcircuit *ckt;
SPcomplex *s;
{
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
register B3SOIPDinstance *here;
B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
B3SOIPDinstance *here;
double xcggb, xcgdb, xcgsb, xcbgb, xcbdb, xcbsb, xcddb, xcssb, xcdgb;
double gdpr, gspr, gds, gbd, gbs, capbd, capbs, xcsgb, xcdsb, xcsdb;
double cggb, cgdb, cgsb, cbgb, cbdb, cbsb, cddb, cdgb, cdsb;

View File

@ -28,13 +28,13 @@ Modified by Pin Su 00/3/1
int
B3SOIPDsetup (matrix, inModel, ckt, states)
register SMPmatrix *matrix;
register GENmodel *inModel;
register CKTcircuit *ckt;
SMPmatrix *matrix;
GENmodel *inModel;
CKTcircuit *ckt;
int *states;
{
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
register B3SOIPDinstance *here;
B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
B3SOIPDinstance *here;
int error;
CKTnode *tmp;

View File

@ -47,8 +47,8 @@ B3SOIPDtemp (inModel, ckt)
GENmodel *inModel;
CKTcircuit *ckt;
{
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
register B3SOIPDinstance *here;
B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
B3SOIPDinstance *here;
struct b3soipdSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam;
double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, Ldrn, Wdrn;
double Temp, TempRatio, Inv_L, Inv_W, Inv_LW, Dw, Dl, Vtm0, Tnom;

View File

@ -17,11 +17,11 @@ File: b3soipdtrunc.c 98/5/01
int
B3SOIPDtrunc (inModel, ckt, timeStep)
GENmodel *inModel;
register CKTcircuit *ckt;
CKTcircuit *ckt;
double *timeStep;
{
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
register B3SOIPDinstance *here;
B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
B3SOIPDinstance *here;
#ifdef STEPDEBUG
double debugtemp;

View File

@ -35,7 +35,7 @@
#include "dev.h"
#define DEVICES_USED "asrc bjt bsim1 bsim2 bsim3 bsim3v2 bsim3v1 bsim4 bsim3soipd cap cccs ccvs csw dio ind isrc jfet ltra mes mos1 mos2 mos3 mos6 res sw tra urc vccs vcvs vsrc"
#define DEVICES_USED "asrc bjt bsim1 bsim2 bsim3 bsim3v2 bsim3v1 bsim4 bsim3soipd bsim3soifd cap cccs ccvs csw dio ind isrc jfet ltra mes mos1 mos2 mos3 mos6 res sw tra urc vccs vcvs vsrc"
/*
* Analyses
@ -62,6 +62,7 @@
#include "bsim3v2/bsim3v2itf.h"
#include "bsim4/bsim4itf.h"
#include "bsim3soi_pd/b3soipditf.h"
#include "bsim3soi_fd/b3soifditf.h"
#include "cap/capitf.h"
#include "cccs/cccsitf.h"
#include "ccvs/ccvsitf.h"
@ -86,7 +87,7 @@
#include "vsrc/vsrcitf.h"
#define DEVNUM 32
#define DEVNUM 33
SPICEdev *DEVices[DEVNUM];
@ -105,29 +106,30 @@ spice_init_devices(void)
DEVices[ 7] = get_bsim3v2_info();
DEVices[ 8] = get_bsim4_info();
DEVices[ 9] = get_b3soipd_info();
DEVices[10] = get_cap_info();
DEVices[11] = get_cccs_info();
DEVices[12] = get_ccvs_info();
DEVices[13] = get_csw_info();
DEVices[14] = get_dio_info();
DEVices[15] = get_ind_info();
DEVices[16] = get_mut_info();
DEVices[17] = get_isrc_info();
DEVices[18] = get_jfet_info();
DEVices[19] = get_jfet2_info();
DEVices[20] = get_ltra_info();
DEVices[21] = get_mes_info();
DEVices[22] = get_mos1_info();
DEVices[23] = get_mos2_info();
DEVices[24] = get_mos3_info();
DEVices[25] = get_mos6_info();
DEVices[26] = get_res_info();
DEVices[27] = get_sw_info();
DEVices[28] = get_tra_info();
DEVices[29] = get_vccs_info();
DEVices[30] = get_vcvs_info();
DEVices[31] = get_vsrc_info();
assert(32 == DEVNUM);
DEVices[10] = get_b3soifd_info();
DEVices[11] = get_cap_info();
DEVices[12] = get_cccs_info();
DEVices[13] = get_ccvs_info();
DEVices[14] = get_csw_info();
DEVices[15] = get_dio_info();
DEVices[16] = get_ind_info();
DEVices[17] = get_mut_info();
DEVices[18] = get_isrc_info();
DEVices[19] = get_jfet_info();
DEVices[20] = get_jfet2_info();
DEVices[21] = get_ltra_info();
DEVices[22] = get_mes_info();
DEVices[23] = get_mos1_info();
DEVices[24] = get_mos2_info();
DEVices[25] = get_mos3_info();
DEVices[26] = get_mos6_info();
DEVices[27] = get_res_info();
DEVices[28] = get_sw_info();
DEVices[29] = get_tra_info();
DEVices[30] = get_vccs_info();
DEVices[31] = get_vcvs_info();
DEVices[32] = get_vsrc_info();
assert(33 == DEVNUM);
}

View File

@ -163,6 +163,14 @@ char *INPdomodel(void *ckt, card * image, INPtables * tab)
("Device type B3SOIPD not available in this binary\n");
}
break;
case 10:
type = INPtypelook("B3SOIFD");
if (type < 0) {
err =
INPmkTemp
("Device type B3SOIFD not available in this binary\n");
}
break;
case 14:
type = INPtypelook("BSIM4");
if (type < 0) {

View File

@ -1,6 +1,6 @@
## Process this file with automake to produce Makefile.in
SUBDIRS = resistance filters polezero bsim3soipd
SUBDIRS = resistance filters polezero bsim3soipd bsim3soifd
TESTS = \
diffpair.cir \

View File

@ -1,4 +1,4 @@
* BSIMSOI example
* BSIMSOI (PD) example
*
* SOI, Ramp Vg
@ -12,7 +12,8 @@ m1 d g s e n1 w=10u l=0.25u debug=-1
.option gmin=1e-20 itl1=200 itl2=200 abstol=1e-9
.tran 1p 1.0ns
.print m1#Vbs, V(g)/10
.save @m1[Vbs], V(g)/10
.print tran v(g)/10
.include nmospd.mod
.end

View File

@ -1,4 +1,4 @@
* model = BSIMSOI
* model = BSIMSOI (PD)
*
*
* SOI Inverter - floating body
@ -12,6 +12,6 @@ m2 out in ss e n1 w=10u l=0.25u
.option itl1=500 gmin=1e-25
.dc vin 0 2.5 0.01
.print v(in), v(out)
.print dc v(in), v(out)
.include nmospd.mod
.include pmospd.mod

View File

@ -1,4 +1,4 @@
* 51 stage Ring-Osc.
* 51 stage Ring-Osc. (PD)
vin in out 2 pulse 2 0 0.1n 5n 1 1 1
vdd dd 0 dc 0 pulse 0 2 0 1n 1 1 1
@ -14,9 +14,12 @@ cout buf ss 1pF
xdum ss dum
.option itl1=500 gmin=1e-15 itl4=10
*.dc vdd 0 2 0.01
.dc vdd 0 2 0.01
.tran 0.2n 50n
.print dc v(out)
.print tran v(out)
.include nmospd.mod
.include pmospd.mod
.include lib.h

View File

@ -1,4 +1,4 @@
*model = BSIMSOI
*model = BSIMSOI (PD)
*Berkeley Spice Compatibility
*
* SOI NMOSFET, floating body simulation
@ -13,6 +13,6 @@ m1 d g s e n1 w=10u l=0.25u
.option gmin=1e-25 itl1=500
.dc vd 0 3 0.01 vg 0.5 3 0.5
.print v(g), i(vs)
.print dc v(g), i(vs)
.include nmospd.mod

View File

@ -1,4 +1,4 @@
*model = BSIMSOI
*model = BSIMSOI (PD)
*Berkeley Spice Compatibility
*
* SOI NMOSFET, tied body simulation
@ -13,7 +13,6 @@ m1 d g s e b n1 w=10u l=0.25u
.option gmin=1e-25 itl1=500
.dc vg 0 1.5 0.01 vb -0.3 0.5 0.1
.include nmosfd.mod
.print dc i(vs)
.include nmospd.mod
* For PD, the command '.include nmosfd.mod ' should
* be replaced with '.include nmospd.mod'.

View File

@ -1,4 +1,4 @@
*model = BSIMSOI
*model = BSIMSOI (PD)
*Berkeley Spice Compatibility
*
* SOI NMOSFET, floating body simulation
@ -12,7 +12,5 @@ m1 d g s e n1 w=10u l=0.25u
.option gmin=1e-25 itl1=500
.dc vg 0 1.5 0.01 ve -4 4 1
.print dc i(vs)
.include nmospd.mod
* For PD, the command '.include nmosfd.mod ' should
* be replaced with '.include nmospd.mod'.