diff --git a/DEVICES b/DEVICES index e2256a7bd..c39f4090c 100644 --- a/DEVICES +++ b/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 diff --git a/configure.in b/configure.in index f2643ab2b..58bb761c7 100644 --- a/configure.in +++ b/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 ) diff --git a/src/Makefile.am b/src/Makefile.am index 14f94b7b5..c3d5f46e7 100644 --- a/src/Makefile.am +++ b/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 \ diff --git a/src/frontend/subckt.c b/src/frontend/subckt.c index a4c7d6b7d..a0c28970f 100644 --- a/src/frontend/subckt.c +++ b/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); diff --git a/src/frontend/variable.c b/src/frontend/variable.c index 5ccb7325e..3304e9f57 100644 --- a/src/frontend/variable.c +++ b/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; diff --git a/src/include/cktdefs.h b/src/include/cktdefs.h index b38ff46d6..900efa400 100644 --- a/src/include/cktdefs.h +++ b/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 ? */ diff --git a/src/spicelib/devices/Makefile.am b/src/spicelib/devices/Makefile.am index 29aa0b6cb..578366ac8 100644 --- a/src/spicelib/devices/Makefile.am +++ b/src/spicelib/devices/Makefile.am @@ -10,6 +10,7 @@ SUBDIRS = \ bsim3v1 \ bsim3v2 \ bsim3soi_pd \ + bsim3soi_fd \ cap \ cccs \ ccvs \ diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdacld.c b/src/spicelib/devices/bsim3soi_pd/b3soipdacld.c index 8e5a62b28..35c78ab62 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdacld.c +++ b/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; diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdcheck.c b/src/spicelib/devices/bsim3soi_pd/b3soipdcheck.c index 2af4f1879..2681ad40a 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdcheck.c +++ b/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; diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdcvtest.c b/src/spicelib/devices/bsim3soi_pd/b3soipdcvtest.c index ebac25f76..c07ea73f0 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdcvtest.c +++ b/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; diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdld.c b/src/spicelib/devices/bsim3soi_pd/b3soipdld.c index b0fe76304..bf5652ca2 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdld.c +++ b/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; diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdnoi.c b/src/spicelib/devices/bsim3soi_pd/b3soipdnoi.c index e67d3b37c..244550a03 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdnoi.c +++ b/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; diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdpzld.c b/src/spicelib/devices/bsim3soi_pd/b3soipdpzld.c index a7c473401..0ad2c329d 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdpzld.c +++ b/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; diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdset.c b/src/spicelib/devices/bsim3soi_pd/b3soipdset.c index f538f3f57..53ef0802e 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdset.c +++ b/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; diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c b/src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c index 2b51a1879..3ee2bdab9 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdtemp.c +++ b/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; diff --git a/src/spicelib/devices/bsim3soi_pd/b3soipdtrunc.c b/src/spicelib/devices/bsim3soi_pd/b3soipdtrunc.c index 2524326e4..3cb66d5da 100644 --- a/src/spicelib/devices/bsim3soi_pd/b3soipdtrunc.c +++ b/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; diff --git a/src/spicelib/devices/dev.c b/src/spicelib/devices/dev.c index 1423a8ffe..53a985589 100644 --- a/src/spicelib/devices/dev.c +++ b/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); } diff --git a/src/spicelib/parser/inpdomod.c b/src/spicelib/parser/inpdomod.c index ae6973817..931ac20d4 100644 --- a/src/spicelib/parser/inpdomod.c +++ b/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) { diff --git a/tests/Makefile.am b/tests/Makefile.am index 9c3afcd0d..1ac75ce86 100644 --- a/tests/Makefile.am +++ b/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 \ diff --git a/tests/bsim3soipd/RampVg2.cir b/tests/bsim3soipd/RampVg2.cir index 7d918c4ff..7af951932 100644 --- a/tests/bsim3soipd/RampVg2.cir +++ b/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 diff --git a/tests/bsim3soipd/inv2.cir b/tests/bsim3soipd/inv2.cir index 5da309d8e..484ed49c1 100644 --- a/tests/bsim3soipd/inv2.cir +++ b/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 diff --git a/tests/bsim3soipd/ring51.cir b/tests/bsim3soipd/ring51.cir index 81d3cb2f0..f24654b1a 100644 --- a/tests/bsim3soipd/ring51.cir +++ b/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 diff --git a/tests/bsim3soipd/t3.cir b/tests/bsim3soipd/t3.cir index b12f78ce6..a591061a9 100644 --- a/tests/bsim3soipd/t3.cir +++ b/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 diff --git a/tests/bsim3soipd/t4.cir b/tests/bsim3soipd/t4.cir index 42bb202f5..e7b3fabe0 100644 --- a/tests/bsim3soipd/t4.cir +++ b/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'. diff --git a/tests/bsim3soipd/t5.cir b/tests/bsim3soipd/t5.cir index eb7dbe929..ead629c77 100644 --- a/tests/bsim3soipd/t5.cir +++ b/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'.