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. NOT YET IMPLEMENTED.
BSIM3SOI_FD - SOI model (fully depleted devices) 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) 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 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: web site at:
http://www-device.eecs.berkeley.edu/~bsimsoi 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/bsim4/Makefile \
src/spicelib/devices/bsim3v2/Makefile \ src/spicelib/devices/bsim3v2/Makefile \
src/spicelib/devices/bsim3soi_pd/Makefile \ src/spicelib/devices/bsim3soi_pd/Makefile \
src/spicelib/devices/bsim3soi_fd/Makefile \
src/spicelib/devices/cap/Makefile \ src/spicelib/devices/cap/Makefile \
src/spicelib/devices/cccs/Makefile \ src/spicelib/devices/cccs/Makefile \
src/spicelib/devices/ccvs/Makefile \ src/spicelib/devices/ccvs/Makefile \
@ -254,4 +255,6 @@ tests/Makefile \
tests/filters/Makefile \ tests/filters/Makefile \
tests/polezero/Makefile \ tests/polezero/Makefile \
tests/resistance/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/bsim4/libbsim4.la \
spicelib/devices/cap/libcap.la \ spicelib/devices/cap/libcap.la \
spicelib/devices/bsim3soi_pd/libbsim3soipd.la \ spicelib/devices/bsim3soi_pd/libbsim3soipd.la \
spicelib/devices/bsim3soi_fd/libbsim3soifd.la \
spicelib/devices/cccs/libcccs.la \ spicelib/devices/cccs/libcccs.la \
spicelib/devices/ccvs/libccvs.la \ spicelib/devices/ccvs/libccvs.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 'j': return (3);
case 'k': return (0); case 'k': return (0);
case 'l': return (2); case 'l': return (2);
case 'm': return (4); case 'm': return (7);
case 'o': return (4); case 'o': return (4);
case 'q': return (4); case 'q': return (4);
case 'r': return (2); case 'r': return (2);

View File

@ -307,7 +307,7 @@ cp_setparse(wordlist *wl)
} }
vv = alloc(struct variable); vv = alloc(struct variable);
vv->va_next = NULL; vv->va_next = NULL;
ss = cp_unquote(wl->wl_word); copyval = ss = cp_unquote(wl->wl_word);
td = ft_numparse(&ss, FALSE); td = ft_numparse(&ss, FALSE);
if (td) { if (td) {
vv->va_type = VT_REAL; vv->va_type = VT_REAL;
@ -316,7 +316,7 @@ cp_setparse(wordlist *wl)
vv->va_type = VT_STRING; vv->va_type = VT_STRING;
vv->va_string = copy(ss); 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) { if (listv) {
lv->va_next = vv; lv->va_next = vv;
lv = vv; lv = vv;

View File

@ -6,7 +6,7 @@
#ifndef CKT #ifndef CKT
#define CKT "CKTdefs.h $Revision$ on $Date$ " #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 */ extern int DEVmaxnum; /* Not sure if still used */
#define MAXNUMDEVNODES 4 /* Max No. of nodes per device */ #define MAXNUMDEVNODES 4 /* Max No. of nodes per device */
/* Need to change for SOI devs ? */ /* Need to change for SOI devs ? */

View File

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

View File

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

View File

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

View File

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

View File

@ -94,11 +94,11 @@ B3SOIPDlimit (vnew, vold, limit, check)
int int
B3SOIPDload (inModel, ckt) B3SOIPDload (inModel, ckt)
GENmodel *inModel; GENmodel *inModel;
register CKTcircuit *ckt; CKTcircuit *ckt;
{ {
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel; B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
register B3SOIPDinstance *here; B3SOIPDinstance *here;
register int selfheat; int selfheat;
double SourceSatCurrent, DrainSatCurrent, Gmin; double SourceSatCurrent, DrainSatCurrent, Gmin;
double ag0, qgd, qgs, qgb, von, cbhat, VgstNVt, ExpVgst; 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; int mode, operation;
GENmodel *inModel; GENmodel *inModel;
CKTcircuit *ckt; CKTcircuit *ckt;
register Ndata *data; Ndata *data;
double *OnDens; double *OnDens;
{ {
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel; B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
register B3SOIPDinstance *here; B3SOIPDinstance *here;
struct b3soipdSizeDependParam *pParam; struct b3soipdSizeDependParam *pParam;
char name[N_MXVLNTH]; char name[N_MXVLNTH];
double tempOnoise; double tempOnoise;

View File

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

View File

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

View File

@ -47,8 +47,8 @@ B3SOIPDtemp (inModel, ckt)
GENmodel *inModel; GENmodel *inModel;
CKTcircuit *ckt; CKTcircuit *ckt;
{ {
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel; B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
register B3SOIPDinstance *here; B3SOIPDinstance *here;
struct b3soipdSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam; struct b3soipdSizeDependParam *pSizeDependParamKnot, *pLastKnot, *pParam;
double tmp, tmp1, tmp2, Eg, Eg0, ni, T0, T1, T2, T3, T4, T5, T6, Ldrn, Wdrn; 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; 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 int
B3SOIPDtrunc (inModel, ckt, timeStep) B3SOIPDtrunc (inModel, ckt, timeStep)
GENmodel *inModel; GENmodel *inModel;
register CKTcircuit *ckt; CKTcircuit *ckt;
double *timeStep; double *timeStep;
{ {
register B3SOIPDmodel *model = (B3SOIPDmodel *) inModel; B3SOIPDmodel *model = (B3SOIPDmodel *) inModel;
register B3SOIPDinstance *here; B3SOIPDinstance *here;
#ifdef STEPDEBUG #ifdef STEPDEBUG
double debugtemp; double debugtemp;

View File

@ -35,7 +35,7 @@
#include "dev.h" #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 * Analyses
@ -62,6 +62,7 @@
#include "bsim3v2/bsim3v2itf.h" #include "bsim3v2/bsim3v2itf.h"
#include "bsim4/bsim4itf.h" #include "bsim4/bsim4itf.h"
#include "bsim3soi_pd/b3soipditf.h" #include "bsim3soi_pd/b3soipditf.h"
#include "bsim3soi_fd/b3soifditf.h"
#include "cap/capitf.h" #include "cap/capitf.h"
#include "cccs/cccsitf.h" #include "cccs/cccsitf.h"
#include "ccvs/ccvsitf.h" #include "ccvs/ccvsitf.h"
@ -86,7 +87,7 @@
#include "vsrc/vsrcitf.h" #include "vsrc/vsrcitf.h"
#define DEVNUM 32 #define DEVNUM 33
SPICEdev *DEVices[DEVNUM]; SPICEdev *DEVices[DEVNUM];
@ -105,29 +106,30 @@ spice_init_devices(void)
DEVices[ 7] = get_bsim3v2_info(); DEVices[ 7] = get_bsim3v2_info();
DEVices[ 8] = get_bsim4_info(); DEVices[ 8] = get_bsim4_info();
DEVices[ 9] = get_b3soipd_info(); DEVices[ 9] = get_b3soipd_info();
DEVices[10] = get_cap_info(); DEVices[10] = get_b3soifd_info();
DEVices[11] = get_cccs_info(); DEVices[11] = get_cap_info();
DEVices[12] = get_ccvs_info(); DEVices[12] = get_cccs_info();
DEVices[13] = get_csw_info(); DEVices[13] = get_ccvs_info();
DEVices[14] = get_dio_info(); DEVices[14] = get_csw_info();
DEVices[15] = get_ind_info(); DEVices[15] = get_dio_info();
DEVices[16] = get_mut_info(); DEVices[16] = get_ind_info();
DEVices[17] = get_isrc_info(); DEVices[17] = get_mut_info();
DEVices[18] = get_jfet_info(); DEVices[18] = get_isrc_info();
DEVices[19] = get_jfet2_info(); DEVices[19] = get_jfet_info();
DEVices[20] = get_ltra_info(); DEVices[20] = get_jfet2_info();
DEVices[21] = get_mes_info(); DEVices[21] = get_ltra_info();
DEVices[22] = get_mos1_info(); DEVices[22] = get_mes_info();
DEVices[23] = get_mos2_info(); DEVices[23] = get_mos1_info();
DEVices[24] = get_mos3_info(); DEVices[24] = get_mos2_info();
DEVices[25] = get_mos6_info(); DEVices[25] = get_mos3_info();
DEVices[26] = get_res_info(); DEVices[26] = get_mos6_info();
DEVices[27] = get_sw_info(); DEVices[27] = get_res_info();
DEVices[28] = get_tra_info(); DEVices[28] = get_sw_info();
DEVices[29] = get_vccs_info(); DEVices[29] = get_tra_info();
DEVices[30] = get_vcvs_info(); DEVices[30] = get_vccs_info();
DEVices[31] = get_vsrc_info(); DEVices[31] = get_vcvs_info();
assert(32 == DEVNUM); 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"); ("Device type B3SOIPD not available in this binary\n");
} }
break; break;
case 10:
type = INPtypelook("B3SOIFD");
if (type < 0) {
err =
INPmkTemp
("Device type B3SOIFD not available in this binary\n");
}
break;
case 14: case 14:
type = INPtypelook("BSIM4"); type = INPtypelook("BSIM4");
if (type < 0) { if (type < 0) {

View File

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

View File

@ -1,4 +1,4 @@
* BSIMSOI example * BSIMSOI (PD) example
* *
* SOI, Ramp Vg * 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 .option gmin=1e-20 itl1=200 itl2=200 abstol=1e-9
.tran 1p 1.0ns .tran 1p 1.0ns
.print m1#Vbs, V(g)/10 .save @m1[Vbs], V(g)/10
.print tran v(g)/10
.include nmospd.mod .include nmospd.mod
.end .end

View File

@ -1,4 +1,4 @@
* model = BSIMSOI * model = BSIMSOI (PD)
* *
* *
* SOI Inverter - floating body * 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 .option itl1=500 gmin=1e-25
.dc vin 0 2.5 0.01 .dc vin 0 2.5 0.01
.print v(in), v(out) .print dc v(in), v(out)
.include nmospd.mod .include nmospd.mod
.include pmospd.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 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 vdd dd 0 dc 0 pulse 0 2 0 1n 1 1 1
@ -14,9 +14,12 @@ cout buf ss 1pF
xdum ss dum xdum ss dum
.option itl1=500 gmin=1e-15 itl4=10 .option itl1=500 gmin=1e-15 itl4=10
*.dc vdd 0 2 0.01 .dc vdd 0 2 0.01
.tran 0.2n 50n .tran 0.2n 50n
.print dc v(out)
.print tran v(out)
.include nmospd.mod .include nmospd.mod
.include pmospd.mod .include pmospd.mod
.include lib.h .include lib.h

View File

@ -1,4 +1,4 @@
*model = BSIMSOI *model = BSIMSOI (PD)
*Berkeley Spice Compatibility *Berkeley Spice Compatibility
* *
* SOI NMOSFET, floating body simulation * 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 .option gmin=1e-25 itl1=500
.dc vd 0 3 0.01 vg 0.5 3 0.5 .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 .include nmospd.mod

View File

@ -1,4 +1,4 @@
*model = BSIMSOI *model = BSIMSOI (PD)
*Berkeley Spice Compatibility *Berkeley Spice Compatibility
* *
* SOI NMOSFET, tied body simulation * 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 .option gmin=1e-25 itl1=500
.dc vg 0 1.5 0.01 vb -0.3 0.5 0.1 .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 *Berkeley Spice Compatibility
* *
* SOI NMOSFET, floating body simulation * 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 .option gmin=1e-25 itl1=500
.dc vg 0 1.5 0.01 ve -4 4 1 .dc vg 0 1.5 0.01 ve -4 4 1
.print dc i(vs)
.include nmospd.mod .include nmospd.mod
* For PD, the command '.include nmosfd.mod ' should
* be replaced with '.include nmospd.mod'.