Browse Source

Added support for bsim3soi fd devices (fully depleted).

pre-master-46
pnenzi 26 years ago
parent
commit
97e77a523e
  1. 12
      DEVICES
  2. 3
      configure.in
  3. 1
      src/Makefile.am
  4. 2
      src/frontend/subckt.c
  5. 4
      src/frontend/variable.c
  6. 2
      src/include/cktdefs.h
  7. 1
      src/spicelib/devices/Makefile.am
  8. 8
      src/spicelib/devices/bsim3soi_pd/b3soipdacld.c
  9. 4
      src/spicelib/devices/bsim3soi_pd/b3soipdcheck.c
  10. 6
      src/spicelib/devices/bsim3soi_pd/b3soipdcvtest.c
  11. 8
      src/spicelib/devices/bsim3soi_pd/b3soipdld.c
  12. 6
      src/spicelib/devices/bsim3soi_pd/b3soipdnoi.c
  13. 8
      src/spicelib/devices/bsim3soi_pd/b3soipdpzld.c
  14. 10
      src/spicelib/devices/bsim3soi_pd/b3soipdset.c
  15. 4
      src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c
  16. 6
      src/spicelib/devices/bsim3soi_pd/b3soipdtrunc.c
  17. 52
      src/spicelib/devices/dev.c
  18. 8
      src/spicelib/parser/inpdomod.c
  19. 2
      tests/Makefile.am
  20. 5
      tests/bsim3soipd/RampVg2.cir
  21. 4
      tests/bsim3soipd/inv2.cir
  22. 7
      tests/bsim3soipd/ring51.cir
  23. 4
      tests/bsim3soipd/t3.cir
  24. 7
      tests/bsim3soipd/t4.cir
  25. 6
      tests/bsim3soipd/t5.cir

12
DEVICES

@ -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

3
configure.in

@ -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
)

1
src/Makefile.am

@ -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 \

2
src/frontend/subckt.c

@ -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);

4
src/frontend/variable.c

@ -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;

2
src/include/cktdefs.h

@ -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 ? */

1
src/spicelib/devices/Makefile.am

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

8
src/spicelib/devices/bsim3soi_pd/b3soipdacld.c

@ -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;

4
src/spicelib/devices/bsim3soi_pd/b3soipdcheck.c

@ -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;

6
src/spicelib/devices/bsim3soi_pd/b3soipdcvtest.c

@ -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;

8
src/spicelib/devices/bsim3soi_pd/b3soipdld.c

@ -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;

6
src/spicelib/devices/bsim3soi_pd/b3soipdnoi.c

@ -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;

8
src/spicelib/devices/bsim3soi_pd/b3soipdpzld.c

@ -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;

10
src/spicelib/devices/bsim3soi_pd/b3soipdset.c

@ -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;

4
src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c

@ -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;

6
src/spicelib/devices/bsim3soi_pd/b3soipdtrunc.c

@ -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;

52
src/spicelib/devices/dev.c

@ -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);
}

8
src/spicelib/parser/inpdomod.c

@ -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) {

2
tests/Makefile.am

@ -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 \

5
tests/bsim3soipd/RampVg2.cir

@ -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

4
tests/bsim3soipd/inv2.cir

@ -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

7
tests/bsim3soipd/ring51.cir

@ -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

4
tests/bsim3soipd/t3.cir

@ -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

7
tests/bsim3soipd/t4.cir

@ -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'.

6
tests/bsim3soipd/t5.cir

@ -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'.
Loading…
Cancel
Save